{
  "openapi": "3.1.1",
  "info": {
    "title": "Rapportly productie-API, bouwcheckpoint",
    "version": "0.45.0-concept.20261004",
    "description": "Broncontract van expliciete routes; catalogusbron 66d3dcaf. Niet getest of gepubliceerd; geen volledige pariteitclaim. Uitgewerkte routes en beperkte invoersubsets zijn per operation gelabeld. Zie inventaris voor open contracten. Sleutelbeheer gebruikt gebruikers-JWT buiten /v1; productieroutes gebruiken API-sleutels. Simulator staat in eigen specificatie."
  },
  "servers": [
    {
      "url": "https://api.rapportly.invalid/api/rapportly",
      "description": "Veilige importstandaard: gereserveerd ongeldig domein. Vervang bewust door vrijgegeven API-basis."
    }
  ],
  "jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
  "security": [
    {
      "ApiSleutel": []
    }
  ],
  "paths": {
    "/v1/ping": {
      "get": {
        "operationId": "sleutel_controleren",
        "summary": "sleutel controleren",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    },
                    "versie": {
                      "const": "v1"
                    },
                    "rechten": {
                      "type": "array",
                      "items": {
                        "const": "resultaten:lezen"
                      }
                    }
                  },
                  "required": [
                    "ok",
                    "versie",
                    "rechten"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_koppeling_api.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/dossiers/{id}": {
      "put": {
        "operationId": "dossier_aanmaken",
        "summary": "dossier aanmaken",
        "description": "Create-only PUT. De UUID vormt de herhalingsgrens. Alleen identieke naam/eigenaar wordt herhaald; geen Idempotency-Key nodig.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dossier"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "201": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dossier"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "dossiers:beheren"
        ],
        "x-bronnen": [
          "server/lib/rapportlyApiGeneratie.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DossierNieuw"
              }
            }
          }
        }
      },
      "get": {
        "operationId": "dossier_lezen",
        "summary": "dossier lezen",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dossier"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/rapportlyApiGeneratie.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/rapporten": {
      "post": {
        "operationId": "rapporten_starten",
        "summary": "rapporten starten",
        "description": "Betaalde duurzame start. Bewaar versie_id en volg GET /v1/rapporten/{id}. Gebruik exact dezelfde body en Idempotency-Key na antwoordverlies. Pakket-, prijs-, privacy-, runtime- en bronpoorten blijven vereist. Actuele startantwoordbron cfe078af: HTTP 200, ook bij duurzame herhaling; geen algemene 202-, job_id- of terminale resultaatvorm afleiden. Huidige rechten en kostenmodus blijven vereist. Houd dezelfde logische opdrachtcode bij verloren antwoord; bron-/stijl-/taalwijzigingen kunnen bij herhaalde voorbereiding alsnog conflict geven. Een herhaalde start is geen opdracht om een mislukte terminale worker opnieuw uit te voeren. Lees de bronstatus en afzonderlijke taalstatus. voorbeeldprofiel-IDs kunnen null zijn bij neutrale productie. De standaardvariantlijsten in ontvangst zijn leeg; ze vervangen geen latere taalhistorie. De actuele dagcapbron c00e325b bindt de private uploadaanbieding vóór queue. Alleen een expliciete databaseweigering bewijst rollback van de betreffende enqueue; een timeout of onbekend antwoord is geen bewijs. Bevestigde dagweigering wordt vastgelegd en privé-input gaat via de bestaande gecontroleerde opruiming. Herhaling van die geweigerde versie blijft geweigerd; geen impliciete retry na middernacht. Er is geen nieuw publiek dagcap-statusendpoint beschreven.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Duurzame ontvangst/herhaling, geen afgeronde inhoud of terminale jobstatus.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentStartOntvangstActueel"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "Idempotency-Replayed": {
                "schema": {
                  "const": "true"
                },
                "description": "Optioneel bij vastgestelde herhaalde documentstart of opgeslagen offerteclaim."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After. gratis_daglimiet: bestaande gratislimiet van twee topniveau-rapportstarts per organisatie per UTC-dag. Een bulk-ouderrij en haar rapportkind worden niet dubbel geteld. Geen vast Retry-After beloofd door deze domeinfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar. rapport_dagcap_schema_onbeschikbaar, rapport_dagcap_invoer_onzeker of andere rapport_dagcap-controlefout: niet omzeilen met nieuwe startcode.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/rapportlyApiGeneratie.js",
          "server/rapportly_api.js",
          "server/lib/rapportlyOfferteInvoer.js",
          "server/lib/voorbeeldProfielSelectie.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/lib/stijlenV2/routes.js",
          "server/lib/universele-documentarchetypen/index.js",
          "server/index.js",
          "server/lib/rapportlyPrijs.js",
          "server/lib/offertenummerIdempotentie.js",
          "server/lib/stijllozeRapportuitvoering.js",
          "server/jobs/startIdempotency.js"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke nested invoer beschreven; volledige legacy-normalisatie en alle historisch opgeslagen antwoordvarianten zijn nog geen universeel acceptatieschema."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RapportStart"
              }
            }
          }
        },
        "x-bronref": "cfe078af",
        "x-aanvullende-bronnen": [
          {
            "bronref": "c00e325b",
            "bestand": "server/lib/rapportDagcap.js"
          },
          {
            "bronref": "c00e325b",
            "bestand": "server/lib/rapportDagcapOnderhoud.js"
          },
          {
            "bronref": "c00e325b",
            "bestand": "server/index.js"
          },
          {
            "bronref": "c00e325b",
            "bestand": "server/migrations/359_rapportly_api_beleid_en_budget.sql"
          }
        ]
      },
      "get": {
        "operationId": "rapporten_zoeken",
        "summary": "rapporten zoeken",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "limiet",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 30
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000,
              "default": 0
            }
          },
          {
            "name": "dossierId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/rapporten"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_koppeling_api.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/offertes": {
      "post": {
        "operationId": "offertes_starten",
        "summary": "offertes starten",
        "description": "Betaalde duurzame start. Bewaar versie_id en volg GET /v1/rapporten/{id}. Gebruik exact dezelfde body en Idempotency-Key na antwoordverlies. Pakket-, prijs-, privacy-, runtime- en bronpoorten blijven vereist. Actuele startantwoordbron cfe078af: HTTP 200, ook bij duurzame herhaling; geen algemene 202-, job_id- of terminale resultaatvorm afleiden. Huidige rechten en kostenmodus blijven vereist. Houd dezelfde logische opdrachtcode bij verloren antwoord; bron-/stijl-/taalwijzigingen kunnen bij herhaalde voorbereiding alsnog conflict geven. Een herhaalde start is geen opdracht om een mislukte terminale worker opnieuw uit te voeren. Lees de bronstatus en afzonderlijke taalstatus. voorbeeldprofiel-IDs kunnen null zijn bij neutrale productie. De standaardvariantlijsten in ontvangst zijn leeg; ze vervangen geen latere taalhistorie. Een voltooide exacte offerteclaim wordt na de algemene publieke poorten maar vóór veranderlijke profiel/catalogus/tokenpoorten gelezen. Tussentijdse startbezetting geeft 409 met Retry-After:2. Als de kern is gestart maar snapshot of ontvangstregistratie nog niet veilig is afgerond kan 503 versie_id en eventueel offerte_snapshot bevatten; gebruik dezelfde opdrachtcode en start geen tweede offerte. De actuele dagcapbron c00e325b bindt de private uploadaanbieding vóór queue. Alleen een expliciete databaseweigering bewijst rollback van de betreffende enqueue; een timeout of onbekend antwoord is geen bewijs. Bevestigde dagweigering wordt vastgelegd en privé-input gaat via de bestaande gecontroleerde opruiming. Herhaling van die geweigerde versie blijft geweigerd; geen impliciete retry na middernacht. Er is geen nieuw publiek dagcap-statusendpoint beschreven.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Duurzame ontvangst/herhaling, geen afgeronde inhoud of terminale jobstatus.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OfferteStartOntvangstActueel"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "Idempotency-Replayed": {
                "schema": {
                  "const": "true"
                },
                "description": "Optioneel bij vastgestelde herhaalde documentstart of opgeslagen offerteclaim."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After. gratis_daglimiet: bestaande gratislimiet van twee topniveau-rapportstarts per organisatie per UTC-dag. Een bulk-ouderrij en haar rapportkind worden niet dubbel geteld. Geen vast Retry-After beloofd door deze domeinfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar. rapport_dagcap_schema_onbeschikbaar, rapport_dagcap_invoer_onzeker of andere rapport_dagcap-controlefout: niet omzeilen met nieuwe startcode.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/rapportlyApiGeneratie.js",
          "server/rapportly_api.js",
          "server/lib/rapportlyOfferteInvoer.js",
          "server/lib/voorbeeldProfielSelectie.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/lib/stijlenV2/routes.js",
          "server/lib/universele-documentarchetypen/index.js",
          "server/index.js",
          "server/lib/rapportlyPrijs.js",
          "server/lib/offertenummerIdempotentie.js",
          "server/lib/stijllozeRapportuitvoering.js",
          "server/jobs/startIdempotency.js"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke nested invoer beschreven; volledige legacy-normalisatie en alle historisch opgeslagen antwoordvarianten zijn nog geen universeel acceptatieschema.",
          "Een voltooide offertenummerclaim bewaart historisch 2xx-status/body en replayt die als object zonder volledige DTO-normalisatie. Het concrete schema beschrijft de huidige producent; oude opgeslagen bodies/statussen blijven apart open."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OfferteStart"
              }
            }
          }
        },
        "x-bronref": "cfe078af",
        "x-aanvullende-bronnen": [
          {
            "bronref": "c00e325b",
            "bestand": "server/lib/rapportDagcap.js"
          },
          {
            "bronref": "c00e325b",
            "bestand": "server/lib/rapportDagcapOnderhoud.js"
          },
          {
            "bronref": "c00e325b",
            "bestand": "server/index.js"
          },
          {
            "bronref": "c00e325b",
            "bestand": "server/migrations/359_rapportly_api_beleid_en_budget.sql"
          }
        ]
      }
    },
    "/v1/presentaties": {
      "post": {
        "operationId": "presentaties_starten",
        "summary": "presentaties starten",
        "description": "Betaalde duurzame start. Bewaar versie_id en volg GET /v1/rapporten/{id}. Gebruik exact dezelfde body en Idempotency-Key na antwoordverlies. Pakket-, prijs-, privacy-, runtime- en bronpoorten blijven vereist. Actuele startantwoordbron cfe078af: HTTP 200, ook bij duurzame herhaling; geen algemene 202-, job_id- of terminale resultaatvorm afleiden. Huidige rechten en kostenmodus blijven vereist. Houd dezelfde logische opdrachtcode bij verloren antwoord; bron-/stijl-/taalwijzigingen kunnen bij herhaalde voorbereiding alsnog conflict geven. Een herhaalde start is geen opdracht om een mislukte terminale worker opnieuw uit te voeren. Lees de bronstatus en afzonderlijke taalstatus. voorbeeldprofiel-IDs kunnen null zijn bij neutrale productie. De standaardvariantlijsten in ontvangst zijn leeg; ze vervangen geen latere taalhistorie. De actuele dagcapbron c00e325b bindt de private uploadaanbieding vóór queue. Alleen een expliciete databaseweigering bewijst rollback van de betreffende enqueue; een timeout of onbekend antwoord is geen bewijs. Bevestigde dagweigering wordt vastgelegd en privé-input gaat via de bestaande gecontroleerde opruiming. Herhaling van die geweigerde versie blijft geweigerd; geen impliciete retry na middernacht. Er is geen nieuw publiek dagcap-statusendpoint beschreven.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Duurzame ontvangst/herhaling, geen afgeronde inhoud of terminale jobstatus.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentStartOntvangstActueel"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "Idempotency-Replayed": {
                "schema": {
                  "const": "true"
                },
                "description": "Optioneel bij vastgestelde herhaalde documentstart of opgeslagen offerteclaim."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After. gratis_daglimiet: bestaande gratislimiet van twee topniveau-rapportstarts per organisatie per UTC-dag. Een bulk-ouderrij en haar rapportkind worden niet dubbel geteld. Geen vast Retry-After beloofd door deze domeinfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar. rapport_dagcap_schema_onbeschikbaar, rapport_dagcap_invoer_onzeker of andere rapport_dagcap-controlefout: niet omzeilen met nieuwe startcode.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/rapportlyApiGeneratie.js",
          "server/rapportly_api.js",
          "server/lib/rapportlyOfferteInvoer.js",
          "server/lib/voorbeeldProfielSelectie.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/lib/stijlenV2/routes.js",
          "server/lib/universele-documentarchetypen/index.js",
          "server/index.js",
          "server/lib/rapportlyPrijs.js",
          "server/lib/offertenummerIdempotentie.js",
          "server/lib/stijllozeRapportuitvoering.js",
          "server/jobs/startIdempotency.js"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke nested invoer beschreven; volledige legacy-normalisatie en alle historisch opgeslagen antwoordvarianten zijn nog geen universeel acceptatieschema."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PresentatieStart"
              }
            }
          }
        },
        "x-bronref": "cfe078af",
        "x-aanvullende-bronnen": [
          {
            "bronref": "c00e325b",
            "bestand": "server/lib/rapportDagcap.js"
          },
          {
            "bronref": "c00e325b",
            "bestand": "server/lib/rapportDagcapOnderhoud.js"
          },
          {
            "bronref": "c00e325b",
            "bestand": "server/index.js"
          },
          {
            "bronref": "c00e325b",
            "bestand": "server/migrations/359_rapportly_api_beleid_en_budget.sql"
          }
        ]
      }
    },
    "/v1/gesprekken": {
      "post": {
        "operationId": "gesprek_starten",
        "summary": "gesprek starten",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs. Actuele startantwoordbron cfe078af: HTTP 200, ook bij duurzame herhaling; geen algemene 202-, job_id- of terminale resultaatvorm afleiden. Huidige rechten en kostenmodus blijven vereist. Houd dezelfde logische opdrachtcode bij verloren antwoord; bron-/stijl-/taalwijzigingen kunnen bij herhaalde voorbereiding alsnog conflict geven. Een herhaalde start is geen opdracht om een mislukte terminale worker opnieuw uit te voeren. Lees de bronstatus en afzonderlijke taalstatus.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Duurzame ontvangst/herhaling, geen afgeronde inhoud of terminale jobstatus.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GesprekStartOntvangstActueel"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/rapportlyApiGeneratie.js",
          "server/rapportly_api.js",
          "server/index.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/lib/rapportlyPrijs.js",
          "server/lib/offertenummerIdempotentie.js",
          "server/lib/stijllozeRapportuitvoering.js",
          "server/jobs/startIdempotency.js"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke nested invoer beschreven; volledige legacy-normalisatie en alle historisch opgeslagen antwoordvarianten zijn nog geen universeel acceptatieschema."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GesprekStartBasis"
              }
            }
          }
        },
        "x-bronref": "cfe078af"
      },
      "get": {
        "operationId": "gesprekken_zoeken",
        "summary": "gesprekken zoeken",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "limiet",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 30
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000,
              "default": 0
            }
          },
          {
            "name": "zoek",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/gesprekken"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_koppeling_api.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/gesprekken/{id}": {
      "get": {
        "operationId": "gesprekken_status",
        "summary": "gesprekken status",
        "description": "Rapportresultaat geldt ook voor offertes/presentaties. export_url/docx/pptx zijn null of 15 minuten geldige download-URLs; vraag status opnieuw op om te vernieuwen. Stuur geen API-sleutel naar een signed download-URL.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/gesprekkenStatus"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_koppeling_api.js",
          "server/lib/rapportlyWebhooks.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/rapporten/{id}": {
      "get": {
        "operationId": "rapporten_status",
        "summary": "rapporten status",
        "description": "Rapportresultaat geldt ook voor offertes/presentaties. export_url/docx/pptx zijn null of 15 minuten geldige download-URLs; vraag status opnieuw op om te vernieuwen. Stuur geen API-sleutel naar een signed download-URL.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/rapportenStatus"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_koppeling_api.js",
          "server/lib/rapportlyWebhooks.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/klanten": {
      "get": {
        "operationId": "klanten_zoeken",
        "summary": "klanten zoeken",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "limiet",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 30
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000,
              "default": 0
            }
          },
          {
            "name": "zoek",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 100
            }
          },
          {
            "name": "gearchiveerd",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "true",
                "false"
              ]
            }
          },
          {
            "name": "externe_referentie",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/klanten"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_koppeling_api.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/dossiers/{id}/bestanden": {
      "get": {
        "operationId": "dossier_bestanden",
        "summary": "dossier bestanden",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "limiet",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 30
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/items"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_api_bronnen.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/dossiers/{id}/bestanden/{bestandId}": {
      "put": {
        "operationId": "bestand_uploaden",
        "summary": "bestand uploaden",
        "description": "Eén bestand, geen tekstvelden, maximaal 20 MiB. PDF/DOCX/DOC/TXT/MD/PNG/JPG/JPEG. Naam 1-200 tekens zonder pad/controltekens. Bytes en extensie worden gecontroleerd. Create-only UUID: identieke bytes/naam/type herhaalbaar, andere inhoud 409.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "bestandId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "naam": {
                      "type": "string"
                    },
                    "grootte_bytes": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "sha256": {
                      "type": "string",
                      "pattern": "^[a-f0-9]{64}$"
                    },
                    "herhaald": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "id",
                    "naam",
                    "grootte_bytes",
                    "sha256",
                    "herhaald"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "201": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "naam": {
                      "type": "string"
                    },
                    "grootte_bytes": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "sha256": {
                      "type": "string",
                      "pattern": "^[a-f0-9]{64}$"
                    },
                    "herhaald": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "id",
                    "naam",
                    "grootte_bytes",
                    "sha256",
                    "herhaald"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "bronnen:uploaden"
        ],
        "x-bronnen": [
          "server/rapportly_api_bronnen.js",
          "server/ingest/api_document.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "bestand": {
                    "type": "string",
                    "format": "binary"
                  }
                },
                "required": [
                  "bestand"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/opnames": {
      "post": {
        "operationId": "audio_bewaren",
        "summary": "audio bewaren",
        "description": "Audio bewaren zonder transcriptiestart. Eén audiobestand maximaal 100 MiB; audio-opslag moet actief zijn. Maximaal drie tekstvelden. Opslagquotum geldt. Bestandsinhoud moet bij toegestane audio-extensie passen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "opname": {
                      "$ref": "#/components/schemas/Opname"
                    }
                  },
                  "required": [
                    "opname"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "bronnen:uploaden"
        ],
        "x-bronnen": [
          "server/rapportly_api_bronnen.js",
          "server/lib/opnames/opslag.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "audio": {
                    "type": "string",
                    "format": "binary"
                  },
                  "titel": {
                    "type": "string",
                    "maxLength": 200
                  },
                  "klant_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "duur_seconden": {
                    "type": "string",
                    "pattern": "^\\d{1,5}$",
                    "description": "Geheel aantal seconden als multiparttekst, 0 t/m 86400."
                  }
                },
                "required": [
                  "audio"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      },
      "get": {
        "operationId": "opnames_lijst",
        "summary": "opnames lijst",
        "description": "Maximaal 200 zichtbare opnames. onverwerkt=1 beperkt tot eigen bewaarde/lopende/mislukte opnames met behouden audio. Geen onbeperkte paginering.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "klant_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "gesprek_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "bewaard"
              ]
            }
          },
          {
            "name": "onverwerkt",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "opnames": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Opname"
                      },
                      "maxItems": 200
                    }
                  },
                  "required": [
                    "opnames"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_opname_api.js",
          "server/lib/opnames/opslag.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/opnames/{id}": {
      "get": {
        "operationId": "opname_lezen",
        "summary": "opname lezen",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "opname": {
                      "$ref": "#/components/schemas/Opname"
                    }
                  },
                  "required": [
                    "opname"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_api_bronnen.js",
          "server/lib/opnames/opslag.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "patch": {
        "operationId": "opname_wijzigen",
        "summary": "opname wijzigen",
        "description": "Canonieke invoer. Titel wordt getrimd/afgekapt op 200, lege titel wordt null. Sprekerslijst wordt genormaliseerd naar maximaal 50 met label16/naam80. Geen idempotentiesleutel of versievoorwaarde; lees na antwoordverlies terug. Transcriptcorrectie gebruikt de aparte PUT met basis.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Opname"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "opnames:wijzigen"
        ],
        "x-bronnen": [
          "server/rapportly_opname_api.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "titel": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 200
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "klant_id": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "sprekers": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "label": {
                          "type": "string",
                          "maxLength": 16
                        },
                        "naam": {
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 80
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "label"
                      ],
                      "additionalProperties": false
                    },
                    "maxItems": 50
                  }
                },
                "required": [],
                "additionalProperties": false,
                "minProperties": 1
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "opname_verwijderen",
        "summary": "opname verwijderen",
        "description": "Zonder alles alleen audio verwijderen. alles=1/true/ja verwijdert ook de transcripttekst en maakt de opname onzichtbaar. Geen voorbeeldverzoek in de importcollectie; beoordeel verwijdering expliciet.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "alles",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "1",
                "true",
                "ja"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    },
                    "alles": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "ok",
                    "alles"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "opnames:verwijderen"
        ],
        "x-bronnen": [
          "server/rapportly_opname_api.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/opnames/{id}/transcriptie": {
      "post": {
        "operationId": "bewaarde_audio_transcriberen",
        "summary": "bewaarde audio transcriberen",
        "description": "Start voor een eigen toegankelijke bewaarde opname; bij bestaande afgeronde transcriptie volgt bestaand id. Persoonlijke audio-kostenmodus en duurzame queue vereist.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TranscriptieOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "transcripties:starten"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/transcriptie.js",
          "server/rapportly_transcriptie_api.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TranscriptieStart"
              }
            }
          }
        }
      }
    },
    "/v1/transcriptie": {
      "post": {
        "operationId": "audio_upload_transcriberen",
        "summary": "audio upload transcriberen",
        "description": "Eén audio tot 100 MiB; extensies m4a,mp3,wav,ogg,webm,mp4. Inhoudssignatuur moet kloppen. Taal leeg/null/auto of genormaliseerde ISO-code van 2–3 letters, eventueel landcode. Model melia-1 standaard, enhanced expliciet; actuele beschikbaarheid uit transcriptie/status. Alleen dezelfde bytes, model en metadata met dezelfde idempotentiesleutel herhalen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TranscriptieOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "transcripties:starten"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/transcriptie.js",
          "server/rapportly_transcriptie_api.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "audio": {
                    "type": "string",
                    "format": "binary"
                  },
                  "model_id": {
                    "type": "string",
                    "enum": [
                      "melia-1",
                      "enhanced"
                    ]
                  },
                  "taal": {
                    "anyOf": [
                      {
                        "type": "string",
                        "pattern": "^(?:auto|[a-z]{2,3}(?:-[a-z]{2})?)?$",
                        "description": "Leeg/null wordt servervoorkeur; kleine letters als canonieke vorm."
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "titel": {
                    "type": "string",
                    "maxLength": 200,
                    "description": "De server trimt en kapt langere titels af op 200."
                  },
                  "klant_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  }
                },
                "required": [
                  "audio"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/transcriptie/{id}": {
      "get": {
        "operationId": "transcriptie_status",
        "summary": "transcriptie status",
        "description": "Duurzame route. HTTP200 kan bezig/mislukt zijn. Transcript wordt pas vrijgegeven na definitieve creditboeking. Segmenten/sprekers staan op /opnames/{id}/inhoud. Bij gratis kredietgrens volgen detail, advies_pakket en overschrijdingslimiet_credits; overige mislukking geeft foutcode transcriptie_mislukt.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TranscriptieStatus"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_transcriptie_api.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/gebruik": {
      "get": {
        "operationId": "gebruik_lezen",
        "summary": "gebruik lezen",
        "description": "UTC-maandbudget van deze sleutel. Open reserveringen uit eerdere maanden tellen mee. Werkelijk verbruik hoort bij de reserveringsmaand. null budget betekent geen sleutelplafond; accountcredits/pakketlimieten blijven gelden. Geen queryparameters.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Gebruik"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "gebruik:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/gebruik.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/verzoeken": {
      "get": {
        "operationId": "verzoeken_lezen",
        "summary": "verzoeken lezen",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "limiet",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 30
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VerzoekenLijst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "gebruik:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/domeinen.js",
          "server/lib/publiekeApi/verzoeken.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/acties": {
      "get": {
        "operationId": "acties_lezen",
        "summary": "acties lezen",
        "description": "Actueel aangesloten catalogus met rechtenplafond. toegestaan_door_sleutel vervangt geen object-/pakket-/featurecontrole.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "acties": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Actie"
                      }
                    },
                    "objectrechten_worden_per_verzoek_gecontroleerd": {
                      "const": true
                    }
                  },
                  "required": [
                    "acties",
                    "objectrechten_worden_per_verzoek_gecontroleerd"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "gebruik:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/domeinen.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/koppelingen/actierechten": {
      "get": {
        "operationId": "beheer_actierechten",
        "summary": "beheer actierechten",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "Gebruikerssessie": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "rechten": {
                      "$ref": "#/components/schemas/Actierechten"
                    }
                  },
                  "required": [
                    "rechten"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [],
        "x-bronnen": [
          "server/lib/publiekeApi/sleutelbeheer.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/koppelingen/sleutels/{id}/beleid": {
      "get": {
        "operationId": "sleutelbeleid_lezen",
        "summary": "sleutelbeleid lezen",
        "description": "JWT van beheerder of eigenaar, geen API-sleutel. Teamlid kan alleen binnen plafond en toegekend wijzigrecht aanscherpen. Omgeving wisselt nooit; vervaldatum moet in de toekomst liggen. Lees huidige ETag, PATCH met If-Match; 409 vraagt herlezen.",
        "security": [
          {
            "Gebruikerssessie": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Sleutelbeleid"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string"
                },
                "description": "Gequote beleid_versie; letterlijk als If-Match meesturen."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [],
        "x-bronnen": [
          "server/lib/publiekeApi/sleutelbeheer.js",
          "server/lib/publiekeApi/sleutelbeleid.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "patch": {
        "operationId": "sleutelbeleid_wijzigen",
        "summary": "sleutelbeleid wijzigen",
        "description": "JWT van beheerder of eigenaar, geen API-sleutel. Teamlid kan alleen binnen plafond en toegekend wijzigrecht aanscherpen. Omgeving wisselt nooit; vervaldatum moet in de toekomst liggen. Lees huidige ETag, PATCH met If-Match; 409 vraagt herlezen.",
        "security": [
          {
            "Gebruikerssessie": []
          }
        ],
        "parameters": [
          {
            "name": "If-Match",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^\"[1-9][0-9]{0,12}\"$"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Sleutelbeleid"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string"
                },
                "description": "Gequote beleid_versie; letterlijk als If-Match meesturen."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [],
        "x-bronnen": [
          "server/lib/publiekeApi/sleutelbeheer.js",
          "server/lib/publiekeApi/sleutelbeleid.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SleutelbeleidWijziging"
              }
            }
          }
        }
      }
    },
    "/koppelingen/sleutels/{id}/gebruik": {
      "get": {
        "operationId": "beheer_sleutelgebruik",
        "summary": "beheer sleutelgebruik",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "Gebruikerssessie": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Gebruik"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [],
        "x-bronnen": [
          "server/lib/publiekeApi/sleutelbeheer.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/koppelingen/sleutels/{id}/verzoeken": {
      "get": {
        "operationId": "beheer_sleutelverzoeken",
        "summary": "beheer sleutelverzoeken",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "Gebruikerssessie": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "limiet",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 30
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VerzoekenLijst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [],
        "x-bronnen": [
          "server/lib/publiekeApi/sleutelbeheer.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/koppelingen/sleutels/{id}/vervangen": {
      "post": {
        "operationId": "sleutelgeheim_vervangen",
        "summary": "sleutelgeheim vervangen",
        "description": "Alleen de eigenaar van een geactiveerde sleutel. Vervangt direct het oude geheim. Niet blind herhalen na verloren antwoord; huidige toestand opnieuw lezen.",
        "security": [
          {
            "Gebruikerssessie": []
          }
        ],
        "parameters": [
          {
            "name": "If-Match",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^\"[1-9][0-9]{0,12}\"$"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "key_prefix": {
                      "type": "string"
                    },
                    "beleid_versie": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "sleutel": {
                      "type": "string",
                      "writeOnly": false,
                      "description": "Eenmalig geheim. Meteen veilig bewaren; nooit loggen."
                    }
                  },
                  "required": [
                    "id",
                    "key_prefix",
                    "beleid_versie",
                    "sleutel"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [],
        "x-bronnen": [
          "server/lib/publiekeApi/sleutelbeheer.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LegeBody"
              }
            }
          }
        }
      }
    },
    "/v1/generatieplan": {
      "post": {
        "operationId": "generatie_ramen",
        "summary": "generatie ramen",
        "description": "Geen verwerking/reservering/afboeking. Alleen metadata, geen queryparameters. Ontbrekende legacy-bedragen betekenen niet gratis. Onzekerheden tonen; geen gegarandeerd maximum. Een stijlversieconflict geeft 409.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Generatieplan"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "gebruik:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/generatieplan.js",
          "server/lib/slimGenereren/planService.js",
          "server/lib/slimGenereren/raming.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneratieplanInvoer"
              }
            }
          }
        }
      }
    },
    "/v1/verbindingen/{soort}/{provider}": {
      "get": {
        "operationId": "verbinding_lezen",
        "summary": "verbinding lezen",
        "description": "Agenda: google/m365; mailbox: gmail/m365. Ongeldige combinaties 400. Bewaar basis exact. Geen queryparameters of providergeheimen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "soort",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "agenda",
                "mailbox"
              ]
            }
          },
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "google",
                "gmail",
                "m365"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Verbinding"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "verbindingen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/verbindingen.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "delete": {
        "operationId": "verbinding_ontkoppelen",
        "summary": "verbinding ontkoppelen",
        "description": "Actuele basis verplicht. Oude replay verwijdert geen nieuwe verbinding. Verwijdert lokale toegang, niet algemene providerconsent; reeds aangeboden verzending kan doorgaan.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "soort",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "agenda",
                "mailbox"
              ]
            }
          },
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "google",
                "gmail",
                "m365"
              ]
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "status": {
                      "const": "ontkoppeld"
                    },
                    "herhaald": {
                      "type": "boolean"
                    },
                    "afgerond_op": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "provider_toestemming_ingetrokken": {
                      "const": false
                    }
                  },
                  "required": [
                    "id",
                    "status",
                    "herhaald",
                    "afgerond_op",
                    "provider_toestemming_ingetrokken"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "verbindingen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/verbindingen.js",
          "server/lib/publiekeApi/autorisatie.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis": {
                    "oneOf": [
                      {
                        "const": "geen"
                      },
                      {
                        "type": "string",
                        "pattern": "^[a-f0-9]{64}$"
                      }
                    ]
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "basis",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/autorisaties": {
      "post": {
        "operationId": "provider_toestemming_starten",
        "summary": "provider toestemming starten",
        "description": "Gebruiker geeft zelf toestemming bij provider. Mailbox scope_versie 2 vraagt ook berichten:verzenden. Maximaal 5 open aanvragen per sleutel, geldig 15 minuten. Alleen open aanvraag bevat url; afgeronde replay opent geen tweede flow.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "wacht_op_toestemming",
                        "verwerken",
                        "gekoppeld",
                        "mislukt",
                        "verlopen",
                        "onzeker"
                      ]
                    },
                    "verloopt_op": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "menselijke_toestemming_verplicht": {
                      "const": true
                    }
                  },
                  "required": [
                    "id",
                    "status",
                    "verloopt_op",
                    "menselijke_toestemming_verplicht"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "wacht_op_toestemming",
                        "verwerken",
                        "gekoppeld",
                        "mislukt",
                        "verlopen",
                        "onzeker"
                      ]
                    },
                    "verloopt_op": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "menselijke_toestemming_verplicht": {
                      "const": true
                    }
                  },
                  "required": [
                    "id",
                    "status",
                    "verloopt_op",
                    "menselijke_toestemming_verplicht"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "verbindingen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/verbindingen.js",
          "server/lib/publiekeApi/autorisatie.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AutorisatieInvoer"
              }
            }
          }
        }
      }
    },
    "/v1/autorisaties/{id}": {
      "get": {
        "operationId": "provider_toestemming_status",
        "summary": "provider toestemming status",
        "description": "Historisch aanvraagresultaat, lees verbinding opnieuw voor actuele toestand. Scope 2 controleert ook verzendrecht. Geen queryparameters.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "soort": {
                      "type": "string",
                      "enum": [
                        "agenda",
                        "mailbox"
                      ]
                    },
                    "provider": {
                      "type": "string",
                      "enum": [
                        "google",
                        "gmail",
                        "m365"
                      ]
                    },
                    "scope_versie": {
                      "type": "integer",
                      "enum": [
                        1,
                        2
                      ]
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "wacht_op_toestemming",
                        "verwerken",
                        "gekoppeld",
                        "mislukt",
                        "verlopen",
                        "onzeker"
                      ]
                    },
                    "verloopt_op": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "afgerond_op": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "id",
                    "soort",
                    "provider",
                    "scope_versie",
                    "status",
                    "verloopt_op",
                    "afgerond_op"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "verbindingen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/verbindingen.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/mailboxvoorkeur": {
      "get": {
        "operationId": "mailboxvoorkeur_lezen",
        "summary": "mailboxvoorkeur lezen",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Mailboxvoorkeur"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "verbindingen:beheren"
        ],
        "x-bronnen": [
          "server/lib/mailVoorkeurBeheer.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "put": {
        "operationId": "mailboxvoorkeur_kiezen",
        "summary": "mailboxvoorkeur kiezen",
        "description": "Kies een verzendbare mailbox uit GET. basis hoort bij voorkeur, verbinding_basis bij providerverbinding. Conflicten vragen herlezen en bewuste nieuwe keuze. Herhaling retourneert historische ontvangst plus huidige toestand. Verstuurt niets; bestaande outbox houdt provider.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ontvangst": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "provider": {
                          "type": "string",
                          "enum": [
                            "gmail",
                            "m365"
                          ]
                        },
                        "herhaald": {
                          "type": "boolean"
                        },
                        "afgerond_op": {
                          "type": "string",
                          "format": "date-time"
                        }
                      },
                      "required": [
                        "id",
                        "provider",
                        "herhaald",
                        "afgerond_op"
                      ],
                      "additionalProperties": false
                    },
                    "huidig": {
                      "$ref": "#/components/schemas/Mailboxvoorkeur"
                    }
                  },
                  "required": [
                    "ontvangst",
                    "huidig"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "verbindingen:beheren",
          "berichten:verzenden"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/poorten.js",
          "server/lib/mailVoorkeurBeheer.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "provider": {
                    "type": "string",
                    "enum": [
                      "gmail",
                      "m365"
                    ]
                  },
                  "basis": {
                    "oneOf": [
                      {
                        "const": "geen"
                      },
                      {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      }
                    ]
                  },
                  "verbinding_basis": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "provider",
                  "basis",
                  "verbinding_basis",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/webhooks": {
      "get": {
        "operationId": "webhooks_lezen",
        "summary": "webhooks lezen",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "webhooks": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Webhook"
                      },
                      "maxItems": 20
                    }
                  },
                  "required": [
                    "webhooks"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "webhooks:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/webhooks.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/ingest/resend_events.js",
          "server/lib/publiekeApi/webhookTransport.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "3897cbd9"
      },
      "post": {
        "operationId": "webhook_registreren",
        "summary": "webhook registreren",
        "description": "Publiek HTTPS-doel zonder credentials of fragment; DNS/IP/redirectbeperkingen gelden. Maximaal 20 actief. Gebruik dezelfde sleutel voor starts en abonnement; identieke replay geeft dezelfde signing_secret terug. Kies één tot zes unieke events. Mail hoort bij de oorspronkelijke API-goedgekeurde outbox en sleutel. Een nieuw abonnement ontvangt geen oudere events.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "events": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "enum": [
                          "verwerking.gereed",
                          "verwerking.mislukt",
                          "mail.geaccepteerd",
                          "mail.onzeker",
                          "mail.mislukt",
                          "mail.afgeleverd"
                        ]
                      },
                      "minItems": 1,
                      "maxItems": 6,
                      "uniqueItems": true
                    },
                    "actief": {
                      "type": "boolean"
                    },
                    "aangemaakt_op": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "signing_secret": {
                      "type": "string",
                      "pattern": "^[a-f0-9]{64}$",
                      "description": "Alleen serverzijde bewaren; nooit loggen."
                    },
                    "herhaald": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "id",
                    "url",
                    "events",
                    "actief",
                    "aangemaakt_op",
                    "signing_secret",
                    "herhaald"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "201": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "events": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "enum": [
                          "verwerking.gereed",
                          "verwerking.mislukt",
                          "mail.geaccepteerd",
                          "mail.onzeker",
                          "mail.mislukt",
                          "mail.afgeleverd"
                        ]
                      },
                      "minItems": 1,
                      "maxItems": 6,
                      "uniqueItems": true
                    },
                    "actief": {
                      "type": "boolean"
                    },
                    "aangemaakt_op": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "signing_secret": {
                      "type": "string",
                      "pattern": "^[a-f0-9]{64}$",
                      "description": "Alleen serverzijde bewaren; nooit loggen."
                    },
                    "herhaald": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "id",
                    "url",
                    "events",
                    "actief",
                    "aangemaakt_op",
                    "signing_secret",
                    "herhaald"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "webhooks:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/webhooks.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/ingest/resend_events.js",
          "server/lib/publiekeApi/webhookTransport.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "format": "uri",
                    "pattern": "^https://",
                    "maxLength": 1000
                  },
                  "events": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "verwerking.gereed",
                        "verwerking.mislukt",
                        "mail.geaccepteerd",
                        "mail.onzeker",
                        "mail.mislukt",
                        "mail.afgeleverd"
                      ]
                    },
                    "minItems": 1,
                    "maxItems": 6,
                    "uniqueItems": true
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "url",
                  "events",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "x-bronref": "3897cbd9"
      }
    },
    "/v1/webhooks/{id}": {
      "delete": {
        "operationId": "webhook_intrekken",
        "summary": "webhook intrekken",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Ok"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "webhooks:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/webhooks.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/ingest/resend_events.js",
          "server/lib/publiekeApi/webhookTransport.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bevestiging"
              }
            }
          }
        },
        "x-bronref": "3897cbd9"
      }
    },
    "/v1/webhook-afleveringen": {
      "get": {
        "operationId": "webhook_afleveringen",
        "summary": "webhook afleveringen",
        "description": "Geen inhoud. Mailhistorie heeft run_ref/job_id null en afzonderlijke outbox_id/poging_id/voorbereiding_poging. De verzonden mailenvelop laat run/job weg. Maximaal 50 events, offset0–10000; huidige eigen sleutel/actor/organisatie vereist. Volgende offset alleen bij volle50rijen en offset+50<=10000, andersnull. Leeg, arrays, exponent en leidende nullen worden geweigerd400. Selectieve pagineringsfix2779d55.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^(0|[1-9][0-9]*)$",
              "default": "0",
              "description": "Decimale gehele waarde0–10000 zonder leidende nullen, teken, exponent, witruimte of herhaalde queryparameter."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "events": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/WebhookEvent"
                      },
                      "maxItems": 50
                    },
                    "volgende_offset": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 10000
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "events",
                    "volgende_offset"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "webhooks:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/webhooks.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/ingest/resend_events.js",
          "server/lib/publiekeApi/webhookTransport.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "2779d55"
      }
    },
    "/v1/webhook-afleveringen/{id}": {
      "get": {
        "operationId": "webhook_aflevering",
        "summary": "webhook aflevering",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "abonnement_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "wacht",
                        "bezig",
                        "geaccepteerd",
                        "mislukt",
                        "gestopt"
                      ]
                    },
                    "poging": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 16
                    },
                    "http_status": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 100,
                          "maximum": 599
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "foutcode": {
                      "anyOf": [
                        {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{0,99}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "beschikbaar_op": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "afgerond_op": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "event_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "pogingen": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "poging": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 16
                          },
                          "gestart_op": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "afgerond_op": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "status": {
                            "type": "string",
                            "enum": [
                              "bezig",
                              "onzeker",
                              "geaccepteerd",
                              "mislukt",
                              "gestopt"
                            ]
                          },
                          "http_status": {
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": 100,
                                "maximum": 599
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "foutcode": {
                            "anyOf": [
                              {
                                "type": "string",
                                "pattern": "^[a-z][a-z0-9_]{0,99}$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": [
                          "poging",
                          "gestart_op",
                          "afgerond_op",
                          "status",
                          "http_status",
                          "foutcode"
                        ],
                        "additionalProperties": false
                      },
                      "maxItems": 16
                    }
                  },
                  "required": [
                    "id",
                    "abonnement_id",
                    "status",
                    "poging",
                    "http_status",
                    "foutcode",
                    "beschikbaar_op",
                    "afgerond_op",
                    "event_id",
                    "pogingen"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "webhooks:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/webhooks.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/ingest/resend_events.js",
          "server/lib/publiekeApi/webhookTransport.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "3897cbd9"
      }
    },
    "/v1/webhook-afleveringen/{id}/herhaal": {
      "post": {
        "operationId": "webhook_herhalen",
        "summary": "webhook herhalen",
        "description": "Bewuste extra bezorgronde; identieke Idempotency-Key herhaalt geen tweede ronde. Controleer eigen duurzame eventopslag vóór aanvragen. Maximaal één extra ronde van acht pogingen na maximaal acht automatische. Ook bij herhaalde ontvangst worden huidige sleutel/actor/organisatie, actief abonnement/eventkeuze, objecttoegang en retentie opnieuw gecontroleerd. Mail vereist oorspronkelijke goedkeuring en huidige poging; achterhaalde onzeker-/voorbereidingsmelding stopt vóór HTTP. Een al lopend HTTP-verzoek kan niet worden teruggeroepen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    },
                    "herhaald": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "ok",
                    "herhaald"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "webhooks:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/webhooks.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/ingest/resend_events.js",
          "server/lib/publiekeApi/webhookTransport.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bevestiging"
              }
            }
          }
        },
        "x-bronref": "3897cbd9"
      }
    },
    "/v1/uitvoer/rapport/{ankerId}/rapport_markdown": {
      "get": {
        "operationId": "rapport_tekst_lezen",
        "summary": "rapport tekst lezen",
        "description": "Concrete specialisatie van /uitvoer/{soort}/{ankerId}/{veld}. Alleen rapport/rapport_markdown hier uitgewerkt. Lees versie_nummer vóór een wijziging.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "soort": {
                      "const": "rapport"
                    },
                    "anker_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "veld": {
                      "const": "rapport_markdown"
                    },
                    "inhoud": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string"
                    },
                    "versie_nummer": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "herkomst": {
                      "type": "string"
                    },
                    "bewerkt": {
                      "type": "boolean"
                    },
                    "reeds_verzonden": {
                      "type": "boolean"
                    },
                    "bijgewerkt_op": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "put": {
        "operationId": "rapport_tekst_bewaren",
        "summary": "rapport tekst bewaren",
        "description": "Alleen native DOCX Rapportly-rapporten met document_soort rapport en actieve revisieroute. CAS op basis_versie. Nieuwe render, historie en ontvangst worden samen gepubliceerd. Lege tekst wordt geweigerd; totale bodylimiet blijft gelden.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    },
                    "versie_nummer": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "render_mislukt": {
                      "const": false
                    },
                    "herhaald": {
                      "type": "boolean"
                    },
                    "hersteld_van": {
                      "type": "integer",
                      "minimum": 0
                    }
                  },
                  "required": [
                    "ok",
                    "versie_nummer",
                    "render_mislukt",
                    "herhaald"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "documenten:wijzigen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/rapportRevisie.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "inhoud": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 400000,
                    "pattern": "\\S"
                  },
                  "basis_versie": {
                    "type": "integer",
                    "minimum": 1
                  }
                },
                "required": [
                  "inhoud",
                  "basis_versie"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/uitvoer/rapport/{ankerId}/rapport_markdown/herstel/{nr}": {
      "post": {
        "operationId": "rapport_versie_herstellen",
        "summary": "rapport versie herstellen",
        "description": "Herstel maakt een nieuwe revisie. nr is bronhistorie; basis_versie is de huidige versie. Een oude replay overschrijft geen nieuwere publicatie.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "nr",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    },
                    "versie_nummer": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "render_mislukt": {
                      "const": false
                    },
                    "herhaald": {
                      "type": "boolean"
                    },
                    "hersteld_van": {
                      "type": "integer",
                      "minimum": 0
                    }
                  },
                  "required": [
                    "ok",
                    "versie_nummer",
                    "render_mislukt",
                    "herhaald"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "documenten:wijzigen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/rapportRevisie.js",
          "server/rapportly_uitvoer_api.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis_versie": {
                    "type": "integer",
                    "minimum": 1
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "basis_versie",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/uitvoer/rapport/{ankerId}/rapport_markdown/versies/{nr}": {
      "get": {
        "operationId": "rapport_historie_lezen",
        "summary": "rapport historie lezen",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "nr",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "soort": {
                      "const": "rapport"
                    },
                    "anker_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "veld": {
                      "const": "rapport_markdown"
                    },
                    "versie_nummer": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "herkomst": {
                      "type": "string"
                    },
                    "hersteld_van": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 0
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "tekens": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "user_id": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "inhoud": {
                      "type": "string"
                    }
                  },
                  "required": [],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/uitvoer/rapport/{ankerId}/rapport_markdown/versies": {
      "get": {
        "operationId": "rapport_historie_lijst",
        "summary": "rapport historie lijst",
        "description": "Nieuwste eerst, maximaal 50 versies. Een fragment is geen volledige inhoud; lees één versie voor de tekst.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "soort": {
                      "const": "rapport"
                    },
                    "anker_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "veld": {
                      "const": "rapport_markdown"
                    },
                    "versies": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "versie_nummer": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "herkomst": {
                            "type": "string"
                          },
                          "hersteld_van": {
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": 0
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "tekens": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "user_id": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "created_at": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "fragment": {
                            "type": "string"
                          }
                        },
                        "required": [],
                        "additionalProperties": false
                      },
                      "maxItems": 50
                    }
                  },
                  "required": [],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js",
          "server/lib/uitvoer/versies.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/uitvoer/rapport/{ankerId}/rapport_markdown/hergenereer": {
      "post": {
        "operationId": "rapport_rapport_markdown_duurzaam_hergenereren",
        "summary": "rapport rapport markdown duurzaam hergenereren",
        "description": "Bestaande expliciete betaalde bijsturing van één canoniek veld. Actuele API-sleutel/actor/org/object/trial/pakket/budget, persoonlijke werkelijke kostenmodus en duurzame runtime vereist. Geen synchrone fallback. Basisversie is een positief veilig geheel getal. Sleutel van 8–128 veilige tekens bindt met oorspronkelijke API-sleutel de mutatie; gelijke sleutel met andere opdracht/basis geeft 409. Worker hercontroleert delegatie, bronnen en publicatiegrenzen. Bewaar mutatie_id uit de eerste 202; lees /v1/uitvoermutaties/{id} en daarna de actuele tekst/historie. Onzeker of reconcile_required nooit omzeilen met een nieuwe betaalde sleutel. Rapport geeft bij opgeslagen terminale ontvangst 200 of de opgeslagen foutstatus; een gespreksveld geeft altijd 202 met klaar/mislukt/controle_nodig. De API-adapter verwijdert credits_afgeboekt en voegt creditmodus toe; daadwerkelijke kosten blijven in het gebruiksoverzicht. Geen mailverzending door het bijsturen van mailtekst. Alleen een klaar DOCX-native rapport met passende bevroren renderbasis; SQL 366 actieve revisies en oude SQL 202 terminale vorm zijn beschreven. De startpoort meldt ontbrekende runtime/readiness met 503. De 202-status bezig bewijst niet dat een onzekere publicatie veilig opnieuw mag starten.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RapportHergeneratieOntvangen"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "$ref": "#/components/schemas/RapportHergeneratieHerhaaldMislukt"
                    }
                  ]
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "$ref": "#/components/schemas/RapportHergeneratieHerhaaldMislukt"
                    }
                  ]
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "$ref": "#/components/schemas/RapportHergeneratieHerhaaldMislukt"
                    }
                  ]
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "$ref": "#/components/schemas/RapportHergeneratieHerhaaldMislukt"
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "200": {
            "description": "Exact opgeslagen geslaagde eindontvangst bij herhaling.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RapportHergeneratieHerhaaldKlaar"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/uitvoer.js",
          "server/rapportly_uitvoer_api.js",
          "server/lib/uitvoer/duurzameMutaties.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/hergeneratie.js",
          "server/jobs/startIdempotency.js",
          "server/jobs/uitvoerMutatieContract.js",
          "server/jobs/handlers/rapportHergenereren.js",
          "server/jobs/adapters/uitvoerMutatieCredits.js",
          "server/migrations/202_rapportly_duurzame_uitvoermutaties.sql",
          "server/migrations/366_rapportly_rapportuitvoer_revisies.sql"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke getrimde instructie/tier beschreven; ruimere native witruimte- en scalar-normalisatie niet als aanbevolen invoer uitgewerkt."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DuurzameHergeneratieInvoer"
              }
            }
          }
        },
        "x-bronref": "cfe078af"
      }
    },
    "/v1/uitvoermutaties/{id}": {
      "get": {
        "operationId": "uitvoermutatie_huidige_status",
        "summary": "uitvoermutatie huidige status",
        "description": "Lees uitsluitend een rapport_hergenereren of gesprek_veld_hergenereren-mutatie van dezelfde oorspronkelijke API-sleutel, actor en organisatie. Ongeldige UUID eerst 404 api_mutatie_niet_gevonden; bij geldige UUID iedere queryparameter 400 api_invoer_ongeldig. Geen runbinding 404; bestaande binding maar verwijderde mutatie 410 api_mutatie_verwijderd. Actuele sleuteldelegatie vóór de lezing en vlak vóór het DTO opnieuw gecontroleerd; daarnaast huidige rapport-/gespreksrechten. Object niet meer zichtbaar geeft 404 object_niet_gevonden, intrekking 403 api_leesdelegatie_geweigerd. Alleen veilige vaste foutcodes verlaten deze statusroute; lees-/rechtenstoring 503. Cache-Control private, no-store. De technische statussen queued/processing/succeeded/failed/reconcile_required blijven ongewijzigd. Bij succeeded actuele inhoud afzonderlijk lezen. Geen bedrag, providerantwoord of inhoud in dit DTO.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PubliekeUitvoermutatieStatus"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              }
            }
          },
          "400": {
            "description": "api_invoer_ongeldig: queryparameters geweigerd. Algemene middleware kan eerder weigeren.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "api_leesdelegatie_geweigerd: oorspronkelijke sleutel/actor heeft geen actuele delegatie. Algemene middleware kan eerder weigeren.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "api_mutatie_niet_gevonden of object_niet_gevonden. Algemene middleware kan eerder weigeren.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "api_mutatie_verwijderd: oorspronkelijke binding bestaat, mutatie niet meer. Algemene middleware kan eerder weigeren.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "api_leesdelegatie_onbeschikbaar, api_uitvoer_onbeschikbaar of klantrechten_onbeschikbaar. Geen ruwe bronfout. Algemene middleware kan eerder weigeren.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/uitvoer.js",
          "server/rapportly_uitvoer_api.js",
          "server/lib/uitvoer/duurzameMutaties.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/hergeneratie.js",
          "server/jobs/startIdempotency.js",
          "server/jobs/uitvoerMutatieContract.js",
          "server/jobs/handlers/rapportHergenereren.js",
          "server/jobs/adapters/uitvoerMutatieCredits.js",
          "server/migrations/202_rapportly_duurzame_uitvoermutaties.sql",
          "server/migrations/366_rapportly_rapportuitvoer_revisies.sql",
          "server/lib/publiekeApi/leesdelegatie.js",
          "server/lib/klantrechten.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "c00e325b",
        "x-query-parameters-toegestaan": []
      }
    },
    "/v1/agenda/afspraken": {
      "get": {
        "operationId": "agenda_afspraken",
        "summary": "agenda afspraken",
        "description": "Alleen uren is toegestaan. Gebruikt bestaande toegestane verbindingen. verlopen noemt verlopen providers. Bij deels succesvolle providers kan een beperkt afsprakenresultaat volgen; dit is geen volledig providerbeschikbaarheidsrapport. Harde providerfout zonder succesvolle provider geeft 502.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "uren",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 72,
              "default": 24
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "afspraken": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string"
                          },
                          "titel": {
                            "type": "string"
                          },
                          "start": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "eind": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "soort": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "link": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uri"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "klant_id": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "klant_naam": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": [
                          "id",
                          "titel",
                          "start",
                          "eind",
                          "soort",
                          "link",
                          "klant_id",
                          "klant_naam"
                        ],
                        "additionalProperties": false
                      }
                    },
                    "verlopen": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "enum": [
                          "google",
                          "m365"
                        ]
                      }
                    }
                  },
                  "required": [
                    "afspraken",
                    "verlopen"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "agenda:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/agenda.js",
          "server/rapportly_agenda_api.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/klanten/{id}": {
      "get": {
        "operationId": "klantmap_lezen",
        "summary": "klantmap lezen",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "klant": {
                      "$ref": "#/components/schemas/Klantmap"
                    }
                  },
                  "required": [
                    "klant"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string"
                },
                "description": "Geciteerde actuele api_revisie voor If-Match."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/klantmappen.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "put": {
        "operationId": "klantmap_aanmaken",
        "summary": "klantmap aanmaken",
        "description": "PUT is create-only. PATCH/DELETE vereisen actuele If-Match. Ontvangst bevat geen gekopieerde klantinhoud: lees de map opnieuw. DELETE verwijdert alleen de map; inhoud blijft bewaard. Definitieve verwijdering heeft afzonderlijke routes/controle.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KlantmapOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "201": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KlantmapOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "412": {
            "description": "api_klant_revisie_conflict: lees opnieuw en herbeoordeel de wijziging.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/klantmappen.js",
          "server/migrations/363_rapportly_api_klantmutaties.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "naam": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 150,
                    "pattern": "^[^\\x00-\\x1f\\x7f]*\\S[^\\x00-\\x1f\\x7f]*$"
                  },
                  "email": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 254,
                        "description": "Leeg wist het adres; anders een geldig adres. De dienst trimt en normaliseert naar kleine letters."
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "taal": {
                    "anyOf": [
                      {
                        "type": "string",
                        "pattern": "^(?:[a-z]{2,3}(?:-[a-z]{2})?)?$",
                        "description": "Leeg/null wist de taal. Geen auto. Hoofdletters worden genormaliseerd."
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "bedrijf": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 180,
                        "pattern": "^[^\\x00-\\x1f\\x7f]*$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "contactpersoon": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 150,
                        "pattern": "^[^\\x00-\\x1f\\x7f]*$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "telefoon": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 50,
                        "pattern": "^[^\\x00-\\x1f\\x7f]*$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "adres": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 250,
                        "pattern": "^[^\\x00-\\x1f\\x7f]*$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "postcode": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 24,
                        "pattern": "^[^\\x00-\\x1f\\x7f]*$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "plaats": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 120,
                        "pattern": "^[^\\x00-\\x1f\\x7f]*$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "land": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 100,
                        "pattern": "^[^\\x00-\\x1f\\x7f]*$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "externe_referentie": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 200,
                        "pattern": "^[^\\x00-\\x1f\\x7f]*$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": [
                  "naam"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      },
      "patch": {
        "operationId": "klantmap_wijzigen",
        "summary": "klantmap wijzigen",
        "description": "PUT is create-only. PATCH/DELETE vereisen actuele If-Match. Ontvangst bevat geen gekopieerde klantinhoud: lees de map opnieuw. DELETE verwijdert alleen de map; inhoud blijft bewaard. Definitieve verwijdering heeft afzonderlijke routes/controle.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "If-Match",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^\"[1-9][0-9]{0,9}\"$",
              "description": "Exacte ETag van GET; het getal maximaal 2147483646."
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KlantmapOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "412": {
            "description": "api_klant_revisie_conflict: lees opnieuw en herbeoordeel de wijziging.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/klantmappen.js",
          "server/migrations/363_rapportly_api_klantmutaties.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "naam": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 150,
                    "pattern": "^[^\\x00-\\x1f\\x7f]*\\S[^\\x00-\\x1f\\x7f]*$"
                  },
                  "email": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 254,
                        "description": "Leeg wist het adres; anders een geldig adres. De dienst trimt en normaliseert naar kleine letters."
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "taal": {
                    "anyOf": [
                      {
                        "type": "string",
                        "pattern": "^(?:[a-z]{2,3}(?:-[a-z]{2})?)?$",
                        "description": "Leeg/null wist de taal. Geen auto. Hoofdletters worden genormaliseerd."
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "bedrijf": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 180,
                        "pattern": "^[^\\x00-\\x1f\\x7f]*$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "contactpersoon": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 150,
                        "pattern": "^[^\\x00-\\x1f\\x7f]*$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "telefoon": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 50,
                        "pattern": "^[^\\x00-\\x1f\\x7f]*$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "adres": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 250,
                        "pattern": "^[^\\x00-\\x1f\\x7f]*$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "postcode": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 24,
                        "pattern": "^[^\\x00-\\x1f\\x7f]*$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "plaats": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 120,
                        "pattern": "^[^\\x00-\\x1f\\x7f]*$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "land": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 100,
                        "pattern": "^[^\\x00-\\x1f\\x7f]*$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "externe_referentie": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 200,
                        "pattern": "^[^\\x00-\\x1f\\x7f]*$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "gearchiveerd": {
                    "type": "boolean"
                  }
                },
                "required": [],
                "additionalProperties": false,
                "minProperties": 1
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "klantmap_alleen_map_verwijderen",
        "summary": "klantmap alleen map verwijderen",
        "description": "PUT is create-only. PATCH/DELETE vereisen actuele If-Match. Ontvangst bevat geen gekopieerde klantinhoud: lees de map opnieuw. DELETE verwijdert alleen de map; inhoud blijft bewaard. Definitieve verwijdering heeft afzonderlijke routes/controle.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "If-Match",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^\"[1-9][0-9]{0,9}\"$",
              "description": "Exacte ETag van GET; het getal maximaal 2147483646."
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KlantmapOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "412": {
            "description": "api_klant_revisie_conflict: lees opnieuw en herbeoordeel de wijziging.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:verwijderen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/klantmappen.js",
          "server/migrations/363_rapportly_api_klantmutaties.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "bevestig": {
                    "const": "alleen_map"
                  }
                },
                "required": [
                  "bevestig"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/opnames/{id}/inhoud": {
      "get": {
        "operationId": "opname_inhoud",
        "summary": "opname inhoud",
        "description": "Inhoudpad staat los van GET /opnames/{id} voor opslagontvangst. Segmenten kunnen na transcriptcorrectie leeg zijn; bewaar de exacte tekst/sprekers als basis voor een correctie.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "titel": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "bron": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string"
                    },
                    "duur_seconden": {
                      "anyOf": [
                        {
                          "type": "number"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "transcript_taal": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "heeft_audio": {
                      "type": "boolean"
                    },
                    "audio_bytes": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 0
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "audio_verwijderd": {
                      "type": "boolean"
                    },
                    "heeft_transcript": {
                      "type": "boolean"
                    },
                    "gesprek_id": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "klant_id": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "transcript": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "transcript_bewerken_beschikbaar": {
                      "type": "boolean"
                    },
                    "segmenten": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/TranscriptSegment"
                      }
                    },
                    "sprekers": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Spreker"
                      }
                    }
                  },
                  "required": [
                    "id",
                    "titel",
                    "bron",
                    "status",
                    "duur_seconden",
                    "transcript_taal",
                    "heeft_audio",
                    "audio_bytes",
                    "audio_verwijderd",
                    "gesprek_id",
                    "klant_id",
                    "created_at",
                    "transcript",
                    "transcript_bewerken_beschikbaar",
                    "segmenten",
                    "sprekers"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_opname_api.js",
          "server/lib/transcriptie/speechmaticsProvider.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/opnames/{id}/audio": {
      "get": {
        "operationId": "opname_audiodownload",
        "summary": "opname audiodownload",
        "description": "Download-URL 300 seconden geldig. Geen Authorization naar de signed URL sturen. Geen behouden audio geeft 404.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "naam": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "url",
                    "naam"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_opname_api.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/opnames/{id}/transcript.txt": {
      "get": {
        "operationId": "opname_transcriptdownload",
        "summary": "opname transcriptdownload",
        "description": "Directe UTF-8 tekstbijlage. Dit antwoord bevat geen JSON en geen download-URL.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "Content-Disposition": {
                "schema": {
                  "type": "string"
                },
                "description": "attachment met bestandsnaam."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_opname_api.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/opnames/{id}/transcript": {
      "put": {
        "operationId": "transcript_corrigeren",
        "summary": "transcript corrigeren",
        "description": "Alleen afgeronde opname. Vergelijkt exacte basis_transcript én basis_sprekers. Bij versie_conflict409 opnieuw lezen. Correctie herstart geen transcriptie en verbruikt geen modelcredits; oude segmentuitlijning vervalt.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "transcript": {
                      "type": "string"
                    },
                    "sprekers": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Spreker"
                      }
                    }
                  },
                  "required": [
                    "transcript",
                    "sprekers"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "transcripten:wijzigen"
        ],
        "x-bronnen": [
          "server/rapportly_transcript_bewerken_api.js",
          "server/migrations/335_rapportly_transcript_bewerken.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "transcript": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 400000,
                    "pattern": "\\S"
                  },
                  "basis_transcript": {
                    "type": "string",
                    "maxLength": 400000
                  },
                  "sprekers": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "label": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 80,
                          "pattern": "^[\\p{L}\\p{N} _-]+$"
                        },
                        "naam": {
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 80,
                              "pattern": "^[^\\r\\n:]*$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "label",
                        "naam"
                      ],
                      "additionalProperties": false
                    },
                    "maxItems": 50,
                    "description": "Labels uniek. Gebruik de ongewijzigde huidige lijst als basis_sprekers."
                  },
                  "basis_sprekers": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "label": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 80,
                          "pattern": "^[\\p{L}\\p{N} _-]+$"
                        },
                        "naam": {
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 80,
                              "pattern": "^[^\\r\\n:]*$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "label",
                        "naam"
                      ],
                      "additionalProperties": false
                    },
                    "maxItems": 50,
                    "description": "Labels uniek. Gebruik de ongewijzigde huidige lijst als basis_sprekers."
                  }
                },
                "required": [
                  "transcript",
                  "basis_transcript",
                  "sprekers",
                  "basis_sprekers"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/bibliotheek/status": {
      "get": {
        "operationId": "bibliotheek_status",
        "summary": "bibliotheek status",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "actief": {
                      "const": true
                    },
                    "types": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "enum": [
                          "document",
                          "opname"
                        ]
                      }
                    },
                    "grens": {
                      "const": 200
                    }
                  },
                  "required": [
                    "actief",
                    "types",
                    "grens"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_bibliotheek_api.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/bibliotheek/zoek": {
      "get": {
        "operationId": "bibliotheek_zoeken",
        "summary": "bibliotheek zoeken",
        "description": "Zoekterm wordt getrimd, witruimte samengevoegd en tot 200 tekens afgekapt. Begrensde zoekset tot 200 per brontype, geen volledige archieftelling. Fragmenten bevatten alleen korte tekststukken. filters.taal geeft de gebruikte PostgreSQL-zoekconfiguratie; onbekende taal valt terug op simple.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "alles",
                "document",
                "opname",
                "document,opname",
                "opname,document"
              ]
            }
          },
          {
            "name": "van",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time",
              "description": "Ook YYYY-MM-DD toegestaan."
            }
          },
          {
            "name": "tot",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time",
              "description": "Ook YYYY-MM-DD toegestaan; die dag wordt tot het einde in UTC meegenomen."
            }
          },
          {
            "name": "klant_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "taal",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limiet",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 20
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 500,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "zoekterm": {
                      "type": "string"
                    },
                    "filters": {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "enum": [
                              "document",
                              "opname"
                            ]
                          }
                        },
                        "van": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "date-time"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "tot": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "date-time"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "klant_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "taal": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "van",
                        "tot",
                        "klant_id",
                        "taal"
                      ],
                      "additionalProperties": false
                    },
                    "treffers": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/BibliotheekTreffer"
                      },
                      "maxItems": 50
                    },
                    "totaal": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "limiet": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 50
                    },
                    "offset": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 500
                    },
                    "meer": {
                      "type": "boolean"
                    },
                    "begrensd": {
                      "type": "boolean"
                    },
                    "grens": {
                      "const": 200
                    }
                  },
                  "required": [
                    "zoekterm",
                    "filters",
                    "treffers",
                    "totaal",
                    "limiet",
                    "offset",
                    "meer",
                    "begrensd",
                    "grens"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_bibliotheek_api.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/zelfservice-aanvragen": {
      "post": {
        "operationId": "zelfservice_aanvragen",
        "summary": "zelfservice aanvragen",
        "description": "Geen queryvelden. Start uitsluitend een menselijke bevestiging, geen aankoop/beheeractie. Geldig 15 minuten; hoogstens 10 open aanvragen. Exacte herhaling verlengt niets. URL opent Rapportly-login met dezelfde gebruiker/organisatie. Status geopend bewijst geen betaling, abonnementwijziging, sleutelactie of MFA-wijziging.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ZelfserviceAanvraag"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "Location": {
                "schema": {
                  "type": "string",
                  "format": "uri"
                },
                "description": "Rapportly bevestiging_url."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "zelfservice:starten"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/zelfservice.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "doel": {
                    "type": "string",
                    "enum": [
                      "abonnement",
                      "opslag",
                      "white_label",
                      "facturatie",
                      "credits",
                      "automatische_credits",
                      "automatische_opslag",
                      "sleutels",
                      "beveiliging",
                      "passkeys",
                      "team"
                    ]
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "doel",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/zelfservice-aanvragen/{id}": {
      "get": {
        "operationId": "zelfservice_status",
        "summary": "zelfservice status",
        "description": "Geen queryvelden. Alleen dezelfde sleutel en actuele actor/organisatie. Bij verlopen ontbreekt bevestiging_url. uitvoering_bevestigd blijft false: de aanvraag registreert geen voltooiing van de menselijke vervolgactie.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ZelfserviceAanvraag"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "zelfservice:starten"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/zelfservice.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/keuzes/uitleg": {
      "get": {
        "operationId": "workflow_keuzeuitleg",
        "summary": "workflow keuzeuitleg",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "schema_versie": {
                      "const": 1
                    },
                    "standaard": {
                      "$ref": "#/components/schemas/Uitvoeringskeuze"
                    },
                    "modelniveaus": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "sleutel": {
                            "type": "string",
                            "enum": [
                              "basis",
                              "standaard",
                              "max"
                            ]
                          },
                          "naam_key": {
                            "type": "string"
                          },
                          "uitleg_key": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "sleutel",
                          "naam_key",
                          "uitleg_key"
                        ],
                        "additionalProperties": false
                      }
                    },
                    "verwerkingsvarianten": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "sleutel": {
                            "type": "string",
                            "enum": [
                              "basis",
                              "zorgvuldig",
                              "optimaal"
                            ]
                          },
                          "naam_key": {
                            "type": "string"
                          },
                          "uitleg_key": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "sleutel",
                          "naam_key",
                          "uitleg_key"
                        ],
                        "additionalProperties": false
                      }
                    },
                    "advies_uitleg_key": {
                      "type": "string"
                    },
                    "afwijking_uitleg_key": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "schema_versie",
                    "standaard",
                    "modelniveaus",
                    "verwerkingsvarianten",
                    "advies_uitleg_key",
                    "afwijking_uitleg_key"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "412": {
            "description": "ETag wijkt af: opnieuw lezen en herbeoordelen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Voorstel niet volledig of vereiste bevestiging ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/workflows.js",
          "server/rapportly_k_api.js",
          "server/lib/rapportlyK/opslag.js",
          "server/lib/rapportlyWorkflow/configuratie.js",
          "server/lib/rapportlyWorkflow/voorstellen.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/keuzes/advies": {
      "post": {
        "operationId": "workflow_keuzeadvies",
        "summary": "workflow keuzeadvies",
        "description": "Deterministisch advies zonder modelverbruik. In de huidige strategie zijn credits en tijd null; kosten_gevolg is relatief en vormt geen prijsopgave. Bewaar advies_id en advies_hash.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "schema_versie": {
                      "const": 1
                    },
                    "advies_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "beleid_versie": {
                      "const": 1
                    },
                    "gemaakt_op": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "aanbevolen": {
                      "$ref": "#/components/schemas/Uitvoeringskeuze"
                    },
                    "onderbouwing": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "code": {
                            "type": "string"
                          },
                          "parameters": {
                            "type": "object",
                            "properties": {
                              "documenttype": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 100
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "omvang": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 40
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "documenttype",
                              "omvang"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "required": [
                          "code",
                          "parameters"
                        ],
                        "additionalProperties": false
                      },
                      "minItems": 1
                    },
                    "combinaties": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "modelniveau": {
                            "type": "string",
                            "enum": [
                              "basis",
                              "standaard",
                              "max"
                            ]
                          },
                          "verwerkingsvariant": {
                            "type": "string",
                            "enum": [
                              "basis",
                              "zorgvuldig",
                              "optimaal"
                            ]
                          },
                          "gevolgen": {
                            "type": "object",
                            "properties": {
                              "output_codes": {
                                "type": "array",
                                "items": {
                                  "type": "string",
                                  "pattern": "^[a-z0-9_.-]+$"
                                },
                                "minItems": 1,
                                "uniqueItems": true
                              },
                              "kosten_gevolg": {
                                "type": "string",
                                "enum": [
                                  "lager",
                                  "gelijk",
                                  "hoger",
                                  "onbekend"
                                ]
                              },
                              "credits": {
                                "type": "null"
                              },
                              "tijd": {
                                "type": "null"
                              }
                            },
                            "required": [
                              "output_codes",
                              "kosten_gevolg",
                              "credits",
                              "tijd"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "required": [
                          "modelniveau",
                          "verwerkingsvariant",
                          "gevolgen"
                        ],
                        "additionalProperties": false
                      },
                      "minItems": 9,
                      "maxItems": 9
                    },
                    "advies_hash": {
                      "type": "string",
                      "pattern": "^[a-f0-9]{64}$"
                    }
                  },
                  "required": [
                    "schema_versie",
                    "advies_id",
                    "beleid_versie",
                    "gemaakt_op",
                    "aanbevolen",
                    "onderbouwing",
                    "combinaties",
                    "advies_hash"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string"
                },
                "description": "Actuele objectversie; stuur ongewijzigd als If-Match waar vereist."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "412": {
            "description": "ETag wijkt af: opnieuw lezen en herbeoordelen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Voorstel niet volledig of vereiste bevestiging ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "workflows:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/workflows.js",
          "server/rapportly_k_api.js",
          "server/lib/rapportlyK/opslag.js",
          "server/lib/rapportlyWorkflow/configuratie.js",
          "server/lib/rapportlyWorkflow/voorstellen.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "documenttype": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100,
                    "pattern": "\\S"
                  },
                  "omvang": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 40,
                    "pattern": "\\S"
                  },
                  "budgetvoorkeur": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 40,
                    "pattern": "\\S"
                  },
                  "doorlooptijdvoorkeur": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 40,
                    "pattern": "\\S"
                  },
                  "complexiteit": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 40,
                    "pattern": "\\S"
                  },
                  "risico": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 40,
                    "pattern": "\\S"
                  },
                  "kwaliteitsvoorkeur": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 40,
                    "pattern": "\\S"
                  }
                },
                "required": [],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/workflowvoorstellen": {
      "post": {
        "operationId": "workflowvoorstel_starten",
        "summary": "workflowvoorstel starten",
        "description": "Betaalde voorstelbouw, geen publicatie. Teamdeling vereist aparte teambevoegdheid. Bij antwoordverlies eerst status lezen met dezelfde sleutel. Onzekere kosten/verwerking niet omzeilen met een nieuwe sleutel.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Workflowvoorstel"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string"
                },
                "description": "Actuele objectversie; stuur ongewijzigd als If-Match waar vereist."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "412": {
            "description": "ETag wijkt af: opnieuw lezen en herbeoordelen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Voorstel niet volledig of vereiste bevestiging ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "workflows:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/workflows.js",
          "server/rapportly_k_api.js",
          "server/lib/rapportlyK/opslag.js",
          "server/lib/rapportlyWorkflow/configuratie.js",
          "server/lib/rapportlyWorkflow/voorstellen.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "naam": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "pattern": "\\S"
                  },
                  "klantbeschrijving": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 10000,
                    "pattern": "\\S"
                  },
                  "gekoppelde_stijlprofiel_ids": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "maxItems": 30,
                    "uniqueItems": true
                  },
                  "standaard_uitvoeringskeuze": {
                    "$ref": "#/components/schemas/Uitvoeringskeuze"
                  },
                  "deling_scope": {
                    "type": "string",
                    "enum": [
                      "persoonlijk",
                      "team"
                    ]
                  }
                },
                "required": [
                  "naam",
                  "klantbeschrijving",
                  "gekoppelde_stijlprofiel_ids"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      },
      "get": {
        "operationId": "workflowvoorstellen_lijst",
        "summary": "workflowvoorstellen lijst",
        "description": "Alleen eigen voorstellen. Begrensde eerste lijst; de huidige opslagadapter verwerkt cursor niet.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Workflowvoorstel"
                      },
                      "maxItems": 100
                    },
                    "volgende_cursor": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "items",
                    "volgende_cursor"
                  ],
                  "additionalProperties": false,
                  "description": "Huidige opslagadapter levert hoogstens de eerste 100 items en verwerkt cursor niet. volgende_cursor is daarom geen belofte van werkende vervolgpagina’s."
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "412": {
            "description": "ETag wijkt af: opnieuw lezen en herbeoordelen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Voorstel niet volledig of vereiste bevestiging ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/workflows.js",
          "server/rapportly_k_api.js",
          "server/lib/rapportlyK/opslag.js",
          "server/lib/rapportlyWorkflow/configuratie.js",
          "server/lib/rapportlyWorkflow/voorstellen.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/workflowvoorstellen/{voorstel_id}": {
      "get": {
        "operationId": "workflowvoorstel_lezen",
        "summary": "workflowvoorstel lezen",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "voorstel_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Workflowvoorstel"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string"
                },
                "description": "Actuele objectversie; stuur ongewijzigd als If-Match waar vereist."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "412": {
            "description": "ETag wijkt af: opnieuw lezen en herbeoordelen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Voorstel niet volledig of vereiste bevestiging ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/workflows.js",
          "server/rapportly_k_api.js",
          "server/lib/rapportlyK/opslag.js",
          "server/lib/rapportlyWorkflow/configuratie.js",
          "server/lib/rapportlyWorkflow/voorstellen.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "patch": {
        "operationId": "workflowvoorstel_wijzigen",
        "summary": "workflowvoorstel wijzigen",
        "description": "ETag moet actueel zijn. Antwoorden hebben unieke, bekende vraag_id. Alleen concept/verduidelijking_nodig/klaar_voor_indienen/informatie_gevraagd kunnen wijzigen. Tekst wordt getrimd en begrensd; aangepast proces vervangt de instellingen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "If-Match",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1
            }
          },
          {
            "name": "voorstel_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Workflowvoorstel"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string"
                },
                "description": "Actuele objectversie; stuur ongewijzigd als If-Match waar vereist."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "412": {
            "description": "ETag wijkt af: opnieuw lezen en herbeoordelen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Voorstel niet volledig of vereiste bevestiging ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "workflows:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/workflows.js",
          "server/rapportly_k_api.js",
          "server/lib/rapportlyK/opslag.js",
          "server/lib/rapportlyWorkflow/configuratie.js",
          "server/lib/rapportlyWorkflow/voorstellen.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "klantbeschrijving": {
                    "type": "string",
                    "maxLength": 10000
                  },
                  "aangepast_procesvoorstel": {
                    "$ref": "#/components/schemas/ProcesvoorstelInvoer"
                  },
                  "verduidelijkingsantwoorden": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "vraag_id": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 120
                        },
                        "antwoord": {
                          "$ref": "#/components/schemas/JsonWaarde"
                        }
                      },
                      "required": [
                        "vraag_id",
                        "antwoord"
                      ],
                      "additionalProperties": false
                    }
                  }
                },
                "required": [],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/workflowvoorstellen/status": {
      "get": {
        "operationId": "workflowvoorstel_ontvangst",
        "summary": "workflowvoorstel ontvangst",
        "description": "Idempotency-Key van de start verplicht, ook bij GET. Voorstel en etag alleen bij voltooid. veilig_opnieuw:false is geen toestemming voor een nieuwe betaalde start.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "toestand": {
                      "type": "string"
                    },
                    "veilig_opnieuw": {
                      "type": "boolean"
                    },
                    "voorstel": {
                      "$ref": "#/components/schemas/Workflowvoorstel"
                    },
                    "etag": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "toestand",
                    "veilig_opnieuw"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "412": {
            "description": "ETag wijkt af: opnieuw lezen en herbeoordelen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Voorstel niet volledig of vereiste bevestiging ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/workflows.js",
          "server/rapportly_k_api.js",
          "server/lib/rapportlyK/opslag.js",
          "server/lib/rapportlyWorkflow/configuratie.js",
          "server/lib/rapportlyWorkflow/voorstellen.js",
          "server/migrations/299_rapportly_workflowvoorstel_zekere_fout.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/workflowvoorstellen/{voorstel_id}/indienen": {
      "post": {
        "operationId": "workflowvoorstel_indienen",
        "summary": "workflowvoorstel indienen",
        "description": "Alleen klaar_voor_indienen met minstens één processtap. Status wordt ingediend; dit is geen goedkeuring of publicatie.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "If-Match",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1
            }
          },
          {
            "name": "voorstel_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Workflowvoorstel"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string"
                },
                "description": "Actuele objectversie; stuur ongewijzigd als If-Match waar vereist."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "412": {
            "description": "ETag wijkt af: opnieuw lezen en herbeoordelen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Voorstel niet volledig of vereiste bevestiging ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "workflows:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/workflows.js",
          "server/rapportly_k_api.js",
          "server/lib/rapportlyK/opslag.js",
          "server/lib/rapportlyWorkflow/configuratie.js",
          "server/lib/rapportlyWorkflow/voorstellen.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LegeBody"
              }
            }
          }
        }
      }
    },
    "/v1/organisatie-instructies": {
      "get": {
        "operationId": "organisatieinstructies_lijst",
        "summary": "organisatieinstructies lijst",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "documenttype",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/OrganisatieInstructie"
                      },
                      "maxItems": 100
                    },
                    "volgende_cursor": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "items",
                    "volgende_cursor"
                  ],
                  "additionalProperties": false,
                  "description": "Huidige opslagadapter levert hoogstens de eerste 100 items en verwerkt cursor niet. volgende_cursor is daarom geen belofte van werkende vervolgpagina’s."
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "412": {
            "description": "ETag wijkt af: opnieuw lezen en herbeoordelen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Voorstel niet volledig of vereiste bevestiging ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/workflows.js",
          "server/rapportly_k_api.js",
          "server/lib/rapportlyK/opslag.js",
          "server/lib/rapportlyWorkflow/configuratie.js",
          "server/lib/rapportlyWorkflow/voorstellen.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "post": {
        "operationId": "organisatieinstructie_opslaan",
        "summary": "organisatieinstructie opslaan",
        "description": "Nieuwe instructie zonder organisatie_instructie_id. Bestaande instructie met id vereist If-Match; documenttype mag niet wijzigen. Tekst wordt getrimd en afgekapt op 30000. Elke opslag maakt een onveranderlijke versie.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "If-Match",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganisatieInstructie"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string"
                },
                "description": "Actuele objectversie; stuur ongewijzigd als If-Match waar vereist."
              }
            }
          },
          "201": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganisatieInstructie"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string"
                },
                "description": "Actuele objectversie; stuur ongewijzigd als If-Match waar vereist."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "412": {
            "description": "ETag wijkt af: opnieuw lezen en herbeoordelen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Voorstel niet volledig of vereiste bevestiging ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "workflows:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/workflows.js",
          "server/rapportly_k_api.js",
          "server/lib/rapportlyK/opslag.js",
          "server/lib/rapportlyWorkflow/configuratie.js",
          "server/lib/rapportlyWorkflow/voorstellen.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "organisatie_instructie_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "documenttype": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100
                  },
                  "tekst": {
                    "type": "string",
                    "maxLength": 30000
                  }
                },
                "required": [
                  "documenttype",
                  "tekst"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/organisatie-instructies/{id}/versies": {
      "get": {
        "operationId": "organisatieinstructie_versies",
        "summary": "organisatieinstructie versies",
        "description": "Metadata zonder tekst; maximaal 100. Lees één versie voor de inhoud.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "schema_versie": {
                            "const": 1
                          },
                          "soort": {
                            "const": "organisatie_instructie"
                          },
                          "organization_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "organisatie_instructie_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "versie_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "versie_nummer": {
                            "type": "integer",
                            "minimum": 1
                          },
                          "immutable": {
                            "const": true
                          },
                          "inhoud_status": {
                            "type": "string",
                            "enum": [
                              "beschikbaar",
                              "inhoud_verwijderd"
                            ]
                          },
                          "payload_hash": {
                            "type": "string",
                            "pattern": "^[a-f0-9]{64}$"
                          },
                          "versie_hash": {
                            "type": "string",
                            "pattern": "^[a-f0-9]{64}$"
                          },
                          "vastgelegd_door": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "vastgelegd_op": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "inhoud_verwijderd_op": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "inhoud_verwijderbewijs_id": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": [
                          "schema_versie",
                          "soort",
                          "organization_id",
                          "organisatie_instructie_id",
                          "versie_id",
                          "versie_nummer",
                          "immutable",
                          "inhoud_status",
                          "payload_hash",
                          "versie_hash",
                          "vastgelegd_door",
                          "vastgelegd_op"
                        ],
                        "additionalProperties": false
                      },
                      "maxItems": 100
                    },
                    "volgende_cursor": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "items",
                    "volgende_cursor"
                  ],
                  "additionalProperties": false,
                  "description": "Huidige opslagadapter levert hoogstens de eerste 100 items en verwerkt cursor niet. volgende_cursor is daarom geen belofte van werkende vervolgpagina’s."
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "412": {
            "description": "ETag wijkt af: opnieuw lezen en herbeoordelen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Voorstel niet volledig of vereiste bevestiging ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/workflows.js",
          "server/rapportly_k_api.js",
          "server/lib/rapportlyK/opslag.js",
          "server/lib/rapportlyWorkflow/configuratie.js",
          "server/lib/rapportlyWorkflow/voorstellen.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/organisatie-instructies/{id}/versies/{versie_id}": {
      "get": {
        "operationId": "organisatieinstructie_versie",
        "summary": "organisatieinstructie versie",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "versie_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganisatieInstructieVersie"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "412": {
            "description": "ETag wijkt af: opnieuw lezen en herbeoordelen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Voorstel niet volledig of vereiste bevestiging ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/workflows.js",
          "server/rapportly_k_api.js",
          "server/lib/rapportlyK/opslag.js",
          "server/lib/rapportlyWorkflow/configuratie.js",
          "server/lib/rapportlyWorkflow/voorstellen.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/workflowprofielen": {
      "get": {
        "operationId": "workflowprofielen_lijst",
        "summary": "workflowprofielen lijst",
        "description": "Gepubliceerde, toegankelijke persoonlijke/teamprofielen. Optioneel filter op gekoppelde stijl. Maximaal 100; cursor wordt niet verwerkt.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "stijlprofiel_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "workflowprofiel_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "organization_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "actief": {
                            "const": true
                          },
                          "deling_scope": {
                            "type": "string",
                            "enum": [
                              "persoonlijk",
                              "team"
                            ]
                          },
                          "eigenaar_user_id": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "is_eigenaar": {
                            "type": "boolean"
                          },
                          "actieve_versie": {
                            "$ref": "#/components/schemas/WorkflowprofielVersie"
                          },
                          "aangemaakt_op": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "bijgewerkt_op": {
                            "type": "string",
                            "format": "date-time"
                          }
                        },
                        "required": [
                          "workflowprofiel_id",
                          "organization_id",
                          "actief",
                          "deling_scope",
                          "eigenaar_user_id",
                          "is_eigenaar",
                          "actieve_versie",
                          "aangemaakt_op",
                          "bijgewerkt_op"
                        ],
                        "additionalProperties": false
                      },
                      "maxItems": 100
                    },
                    "volgende_cursor": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "items",
                    "volgende_cursor"
                  ],
                  "additionalProperties": false,
                  "description": "Huidige opslagadapter levert hoogstens de eerste 100 items en verwerkt cursor niet. volgende_cursor is daarom geen belofte van werkende vervolgpagina’s."
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "412": {
            "description": "ETag wijkt af: opnieuw lezen en herbeoordelen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Voorstel niet volledig of vereiste bevestiging ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/workflows.js",
          "server/rapportly_k_api.js",
          "server/lib/rapportlyK/opslag.js",
          "server/lib/rapportlyWorkflow/configuratie.js",
          "server/lib/rapportlyWorkflow/voorstellen.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/workflowprofielen/{workflowprofiel_id}/versies/{versie_id}": {
      "get": {
        "operationId": "workflowprofiel_versie",
        "summary": "workflowprofiel versie",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "workflowprofiel_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "versie_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkflowprofielVersie"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "412": {
            "description": "ETag wijkt af: opnieuw lezen en herbeoordelen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Voorstel niet volledig of vereiste bevestiging ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/workflows.js",
          "server/rapportly_k_api.js",
          "server/lib/rapportlyK/opslag.js",
          "server/lib/rapportlyWorkflow/configuratie.js",
          "server/lib/rapportlyWorkflow/voorstellen.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/transcriptie/tarief": {
      "get": {
        "operationId": "transcriptie_tarief",
        "summary": "transcriptie tarief",
        "description": "Actuele beschikbaarheid en modeltarieven, geen vaste prijsbelofte. modelvelden alleen bij Speechmatics met persoonlijke audio-kostenmodus; anders zijn alleen de drie basisvelden aanwezig. Alle API-routes blijven achter de adapterpoorten.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TranscriptieTarief"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "gebruik:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_transcriptie_api.js",
          "server/lib/transcriptie/modellen.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/transcriptie/status": {
      "get": {
        "operationId": "transcriptie_status",
        "summary": "transcriptie status",
        "description": "Actuele beschikbaarheid en modeltarieven, geen vaste prijsbelofte. modelvelden alleen bij Speechmatics met persoonlijke audio-kostenmodus; anders zijn alleen de drie basisvelden aanwezig. Alle API-routes blijven achter de adapterpoorten.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TranscriptieTarief"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_transcriptie_api.js",
          "server/lib/transcriptie/modellen.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/verslag": {
      "get": {
        "operationId": "verslag_uitvoer_lezen",
        "summary": "verslag uitvoer lezen",
        "description": "reeds_verzonden waarschuwt dat de bestaande tekst al verzonden kan zijn. Bewerken verzendt geen nieuwe mail. bijsturen alleen bij actieve duurzame bijsturing.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "soort": {
                      "const": "gesprek"
                    },
                    "anker_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "veld": {
                      "const": "verslag"
                    },
                    "inhoud": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string"
                    },
                    "versie_nummer": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "herkomst": {
                      "type": "string",
                      "enum": [
                        "generatie",
                        "handmatig",
                        "hergeneratie",
                        "hersteld"
                      ]
                    },
                    "bewerkt": {
                      "type": "boolean"
                    },
                    "reeds_verzonden": {
                      "type": "boolean"
                    },
                    "bijgewerkt_op": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "bijsturen": {
                      "type": "object",
                      "properties": {
                        "duurzaam": {
                          "const": true
                        }
                      },
                      "required": [
                        "duurzaam"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "soort",
                    "anker_id",
                    "veld",
                    "inhoud",
                    "status",
                    "versie_nummer",
                    "herkomst",
                    "bewerkt",
                    "reeds_verzonden",
                    "bijgewerkt_op"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/uitvoer/gesprekMutatie.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/versies.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "put": {
        "operationId": "verslag_uitvoer_wijzigen",
        "summary": "verslag uitvoer wijzigen",
        "description": "Atomische actuele tekst plus historie. Basisversie verplicht; idempotentie16–128 door de hele middlewareketen. Geen modelverbruik. Lees bij conflict opnieuw.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    },
                    "versie_nummer": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "herhaald": {
                      "type": "boolean"
                    },
                    "hersteld_van": {
                      "type": "integer",
                      "minimum": 1
                    }
                  },
                  "required": [
                    "ok",
                    "versie_nummer"
                  ],
                  "additionalProperties": false,
                  "description": "Herstel kan hersteld_van toevoegen; een ontvangstherhaling bevat herhaald."
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "documenten:wijzigen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/uitvoer/gesprekMutatie.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/versies.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "inhoud": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 400000,
                    "pattern": "\\S"
                  },
                  "basis_versie": {
                    "type": "integer",
                    "minimum": 1
                  }
                },
                "required": [
                  "inhoud",
                  "basis_versie"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/verslag/versies": {
      "get": {
        "operationId": "verslag_uitvoer_historie",
        "summary": "verslag uitvoer historie",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "soort": {
                      "const": "gesprek"
                    },
                    "anker_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "veld": {
                      "const": "verslag"
                    },
                    "versies": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "versie_nummer": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "herkomst": {
                            "type": "string"
                          },
                          "hersteld_van": {
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": 0
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "tekens": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "user_id": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "created_at": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "fragment": {
                            "type": "string"
                          }
                        },
                        "required": [],
                        "additionalProperties": false
                      },
                      "maxItems": 50
                    }
                  },
                  "required": [
                    "soort",
                    "anker_id",
                    "veld",
                    "versies"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/uitvoer/gesprekMutatie.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/versies.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/verslag/versies/{nr}": {
      "get": {
        "operationId": "verslag_uitvoer_historische_tekst",
        "summary": "verslag uitvoer historische tekst",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "nr",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 999999999
            }
          },
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "soort": {
                      "const": "gesprek"
                    },
                    "anker_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "veld": {
                      "const": "verslag"
                    },
                    "versie_nummer": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "herkomst": {
                      "type": "string"
                    },
                    "hersteld_van": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 0
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "tekens": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "user_id": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "inhoud": {
                      "type": "string"
                    }
                  },
                  "required": [],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/uitvoer/gesprekMutatie.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/versies.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/verslag/herstel/{nr}": {
      "post": {
        "operationId": "verslag_uitvoer_herstellen",
        "summary": "verslag uitvoer herstellen",
        "description": "Herstel schrijft een nieuwe actuele versie vanuit de gekozen historische tekst. Eerdere verzonden berichten worden niet gewijzigd.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "nr",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 999999999
            }
          },
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    },
                    "versie_nummer": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "herhaald": {
                      "type": "boolean"
                    },
                    "hersteld_van": {
                      "type": "integer",
                      "minimum": 1
                    }
                  },
                  "required": [
                    "ok",
                    "versie_nummer"
                  ],
                  "additionalProperties": false,
                  "description": "Herstel kan hersteld_van toevoegen; een ontvangstherhaling bevat herhaald."
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "documenten:wijzigen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/uitvoer/gesprekMutatie.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/versies.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis_versie": {
                    "type": "integer",
                    "minimum": 1
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "basis_versie",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/verslag/hergenereer": {
      "post": {
        "operationId": "gesprek_verslag_duurzaam_hergenereren",
        "summary": "gesprek verslag duurzaam hergenereren",
        "description": "Bestaande expliciete betaalde bijsturing van één canoniek veld. Actuele API-sleutel/actor/org/object/trial/pakket/budget, persoonlijke werkelijke kostenmodus en duurzame runtime vereist. Geen synchrone fallback. Basisversie is een positief veilig geheel getal. Sleutel van 8–128 veilige tekens bindt met oorspronkelijke API-sleutel de mutatie; gelijke sleutel met andere opdracht/basis geeft 409. Worker hercontroleert delegatie, bronnen en publicatiegrenzen. Bewaar mutatie_id uit de eerste 202; lees /v1/uitvoermutaties/{id} en daarna de actuele tekst/historie. Onzeker of reconcile_required nooit omzeilen met een nieuwe betaalde sleutel. Rapport geeft bij opgeslagen terminale ontvangst 200 of de opgeslagen foutstatus; een gespreksveld geeft altijd 202 met klaar/mislukt/controle_nodig. De API-adapter verwijdert credits_afgeboekt en voegt creditmodus toe; daadwerkelijke kosten blijven in het gebruiksoverzicht. Geen mailverzending door het bijsturen van mailtekst.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GesprekHergeneratieOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/uitvoer.js",
          "server/rapportly_uitvoer_api.js",
          "server/lib/uitvoer/duurzameMutaties.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/hergeneratie.js",
          "server/jobs/startIdempotency.js",
          "server/jobs/uitvoerMutatieContract.js",
          "server/jobs/handlers/rapportHergenereren.js",
          "server/jobs/adapters/uitvoerMutatieCredits.js",
          "server/migrations/202_rapportly_duurzame_uitvoermutaties.sql",
          "server/migrations/366_rapportly_rapportuitvoer_revisies.sql"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke getrimde instructie/tier beschreven; ruimere native witruimte- en scalar-normalisatie niet als aanbevolen invoer uitgewerkt."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DuurzameHergeneratieInvoer"
              }
            }
          }
        },
        "x-bronref": "cfe078af"
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/interne_mail": {
      "get": {
        "operationId": "interne_mail_uitvoer_lezen",
        "summary": "interne mail uitvoer lezen",
        "description": "reeds_verzonden waarschuwt dat de bestaande tekst al verzonden kan zijn. Bewerken verzendt geen nieuwe mail. bijsturen alleen bij actieve duurzame bijsturing.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "soort": {
                      "const": "gesprek"
                    },
                    "anker_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "veld": {
                      "const": "interne_mail"
                    },
                    "inhoud": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string"
                    },
                    "versie_nummer": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "herkomst": {
                      "type": "string",
                      "enum": [
                        "generatie",
                        "handmatig",
                        "hergeneratie",
                        "hersteld"
                      ]
                    },
                    "bewerkt": {
                      "type": "boolean"
                    },
                    "reeds_verzonden": {
                      "type": "boolean"
                    },
                    "bijgewerkt_op": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "bijsturen": {
                      "type": "object",
                      "properties": {
                        "duurzaam": {
                          "const": true
                        }
                      },
                      "required": [
                        "duurzaam"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "soort",
                    "anker_id",
                    "veld",
                    "inhoud",
                    "status",
                    "versie_nummer",
                    "herkomst",
                    "bewerkt",
                    "reeds_verzonden",
                    "bijgewerkt_op"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/uitvoer/gesprekMutatie.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/versies.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "put": {
        "operationId": "interne_mail_uitvoer_wijzigen",
        "summary": "interne mail uitvoer wijzigen",
        "description": "Atomische actuele tekst plus historie. Basisversie verplicht; idempotentie16–128 door de hele middlewareketen. Geen modelverbruik. Lees bij conflict opnieuw.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    },
                    "versie_nummer": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "herhaald": {
                      "type": "boolean"
                    },
                    "hersteld_van": {
                      "type": "integer",
                      "minimum": 1
                    }
                  },
                  "required": [
                    "ok",
                    "versie_nummer"
                  ],
                  "additionalProperties": false,
                  "description": "Herstel kan hersteld_van toevoegen; een ontvangstherhaling bevat herhaald."
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "documenten:wijzigen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/uitvoer/gesprekMutatie.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/versies.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "inhoud": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 400000,
                    "pattern": "\\S"
                  },
                  "basis_versie": {
                    "type": "integer",
                    "minimum": 1
                  }
                },
                "required": [
                  "inhoud",
                  "basis_versie"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/interne_mail/versies": {
      "get": {
        "operationId": "interne_mail_uitvoer_historie",
        "summary": "interne mail uitvoer historie",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "soort": {
                      "const": "gesprek"
                    },
                    "anker_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "veld": {
                      "const": "interne_mail"
                    },
                    "versies": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "versie_nummer": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "herkomst": {
                            "type": "string"
                          },
                          "hersteld_van": {
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": 0
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "tekens": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "user_id": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "created_at": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "fragment": {
                            "type": "string"
                          }
                        },
                        "required": [],
                        "additionalProperties": false
                      },
                      "maxItems": 50
                    }
                  },
                  "required": [
                    "soort",
                    "anker_id",
                    "veld",
                    "versies"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/uitvoer/gesprekMutatie.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/versies.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/interne_mail/versies/{nr}": {
      "get": {
        "operationId": "interne_mail_uitvoer_historische_tekst",
        "summary": "interne mail uitvoer historische tekst",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "nr",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 999999999
            }
          },
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "soort": {
                      "const": "gesprek"
                    },
                    "anker_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "veld": {
                      "const": "interne_mail"
                    },
                    "versie_nummer": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "herkomst": {
                      "type": "string"
                    },
                    "hersteld_van": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 0
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "tekens": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "user_id": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "inhoud": {
                      "type": "string"
                    }
                  },
                  "required": [],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/uitvoer/gesprekMutatie.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/versies.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/interne_mail/herstel/{nr}": {
      "post": {
        "operationId": "interne_mail_uitvoer_herstellen",
        "summary": "interne mail uitvoer herstellen",
        "description": "Herstel schrijft een nieuwe actuele versie vanuit de gekozen historische tekst. Eerdere verzonden berichten worden niet gewijzigd.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "nr",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 999999999
            }
          },
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    },
                    "versie_nummer": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "herhaald": {
                      "type": "boolean"
                    },
                    "hersteld_van": {
                      "type": "integer",
                      "minimum": 1
                    }
                  },
                  "required": [
                    "ok",
                    "versie_nummer"
                  ],
                  "additionalProperties": false,
                  "description": "Herstel kan hersteld_van toevoegen; een ontvangstherhaling bevat herhaald."
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "documenten:wijzigen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/uitvoer/gesprekMutatie.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/versies.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis_versie": {
                    "type": "integer",
                    "minimum": 1
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "basis_versie",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/interne_mail/hergenereer": {
      "post": {
        "operationId": "gesprek_interne_mail_duurzaam_hergenereren",
        "summary": "gesprek interne mail duurzaam hergenereren",
        "description": "Bestaande expliciete betaalde bijsturing van één canoniek veld. Actuele API-sleutel/actor/org/object/trial/pakket/budget, persoonlijke werkelijke kostenmodus en duurzame runtime vereist. Geen synchrone fallback. Basisversie is een positief veilig geheel getal. Sleutel van 8–128 veilige tekens bindt met oorspronkelijke API-sleutel de mutatie; gelijke sleutel met andere opdracht/basis geeft 409. Worker hercontroleert delegatie, bronnen en publicatiegrenzen. Bewaar mutatie_id uit de eerste 202; lees /v1/uitvoermutaties/{id} en daarna de actuele tekst/historie. Onzeker of reconcile_required nooit omzeilen met een nieuwe betaalde sleutel. Rapport geeft bij opgeslagen terminale ontvangst 200 of de opgeslagen foutstatus; een gespreksveld geeft altijd 202 met klaar/mislukt/controle_nodig. De API-adapter verwijdert credits_afgeboekt en voegt creditmodus toe; daadwerkelijke kosten blijven in het gebruiksoverzicht. Geen mailverzending door het bijsturen van mailtekst.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GesprekHergeneratieOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/uitvoer.js",
          "server/rapportly_uitvoer_api.js",
          "server/lib/uitvoer/duurzameMutaties.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/hergeneratie.js",
          "server/jobs/startIdempotency.js",
          "server/jobs/uitvoerMutatieContract.js",
          "server/jobs/handlers/rapportHergenereren.js",
          "server/jobs/adapters/uitvoerMutatieCredits.js",
          "server/migrations/202_rapportly_duurzame_uitvoermutaties.sql",
          "server/migrations/366_rapportly_rapportuitvoer_revisies.sql"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke getrimde instructie/tier beschreven; ruimere native witruimte- en scalar-normalisatie niet als aanbevolen invoer uitgewerkt."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DuurzameHergeneratieInvoer"
              }
            }
          }
        },
        "x-bronref": "cfe078af"
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/klantmail": {
      "get": {
        "operationId": "klantmail_uitvoer_lezen",
        "summary": "klantmail uitvoer lezen",
        "description": "reeds_verzonden waarschuwt dat de bestaande tekst al verzonden kan zijn. Bewerken verzendt geen nieuwe mail. bijsturen alleen bij actieve duurzame bijsturing.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "soort": {
                      "const": "gesprek"
                    },
                    "anker_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "veld": {
                      "const": "klantmail"
                    },
                    "inhoud": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string"
                    },
                    "versie_nummer": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "herkomst": {
                      "type": "string",
                      "enum": [
                        "generatie",
                        "handmatig",
                        "hergeneratie",
                        "hersteld"
                      ]
                    },
                    "bewerkt": {
                      "type": "boolean"
                    },
                    "reeds_verzonden": {
                      "type": "boolean"
                    },
                    "bijgewerkt_op": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "bijsturen": {
                      "type": "object",
                      "properties": {
                        "duurzaam": {
                          "const": true
                        }
                      },
                      "required": [
                        "duurzaam"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "soort",
                    "anker_id",
                    "veld",
                    "inhoud",
                    "status",
                    "versie_nummer",
                    "herkomst",
                    "bewerkt",
                    "reeds_verzonden",
                    "bijgewerkt_op"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/uitvoer/gesprekMutatie.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/versies.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "put": {
        "operationId": "klantmail_uitvoer_wijzigen",
        "summary": "klantmail uitvoer wijzigen",
        "description": "Atomische actuele tekst plus historie. Basisversie verplicht; idempotentie16–128 door de hele middlewareketen. Geen modelverbruik. Lees bij conflict opnieuw.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    },
                    "versie_nummer": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "herhaald": {
                      "type": "boolean"
                    },
                    "hersteld_van": {
                      "type": "integer",
                      "minimum": 1
                    }
                  },
                  "required": [
                    "ok",
                    "versie_nummer"
                  ],
                  "additionalProperties": false,
                  "description": "Herstel kan hersteld_van toevoegen; een ontvangstherhaling bevat herhaald."
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "documenten:wijzigen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/uitvoer/gesprekMutatie.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/versies.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "inhoud": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 400000,
                    "pattern": "\\S"
                  },
                  "basis_versie": {
                    "type": "integer",
                    "minimum": 1
                  }
                },
                "required": [
                  "inhoud",
                  "basis_versie"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/klantmail/versies": {
      "get": {
        "operationId": "klantmail_uitvoer_historie",
        "summary": "klantmail uitvoer historie",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "soort": {
                      "const": "gesprek"
                    },
                    "anker_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "veld": {
                      "const": "klantmail"
                    },
                    "versies": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "versie_nummer": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "herkomst": {
                            "type": "string"
                          },
                          "hersteld_van": {
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": 0
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "tekens": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "user_id": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "created_at": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "fragment": {
                            "type": "string"
                          }
                        },
                        "required": [],
                        "additionalProperties": false
                      },
                      "maxItems": 50
                    }
                  },
                  "required": [
                    "soort",
                    "anker_id",
                    "veld",
                    "versies"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/uitvoer/gesprekMutatie.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/versies.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/klantmail/versies/{nr}": {
      "get": {
        "operationId": "klantmail_uitvoer_historische_tekst",
        "summary": "klantmail uitvoer historische tekst",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "nr",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 999999999
            }
          },
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "soort": {
                      "const": "gesprek"
                    },
                    "anker_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "veld": {
                      "const": "klantmail"
                    },
                    "versie_nummer": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "herkomst": {
                      "type": "string"
                    },
                    "hersteld_van": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 0
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "tekens": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "user_id": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "inhoud": {
                      "type": "string"
                    }
                  },
                  "required": [],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/uitvoer/gesprekMutatie.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/versies.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/klantmail/herstel/{nr}": {
      "post": {
        "operationId": "klantmail_uitvoer_herstellen",
        "summary": "klantmail uitvoer herstellen",
        "description": "Herstel schrijft een nieuwe actuele versie vanuit de gekozen historische tekst. Eerdere verzonden berichten worden niet gewijzigd.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "nr",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 999999999
            }
          },
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    },
                    "versie_nummer": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "herhaald": {
                      "type": "boolean"
                    },
                    "hersteld_van": {
                      "type": "integer",
                      "minimum": 1
                    }
                  },
                  "required": [
                    "ok",
                    "versie_nummer"
                  ],
                  "additionalProperties": false,
                  "description": "Herstel kan hersteld_van toevoegen; een ontvangstherhaling bevat herhaald."
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "documenten:wijzigen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/uitvoer/gesprekMutatie.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/versies.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis_versie": {
                    "type": "integer",
                    "minimum": 1
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "basis_versie",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/klantmail/hergenereer": {
      "post": {
        "operationId": "gesprek_klantmail_duurzaam_hergenereren",
        "summary": "gesprek klantmail duurzaam hergenereren",
        "description": "Bestaande expliciete betaalde bijsturing van één canoniek veld. Actuele API-sleutel/actor/org/object/trial/pakket/budget, persoonlijke werkelijke kostenmodus en duurzame runtime vereist. Geen synchrone fallback. Basisversie is een positief veilig geheel getal. Sleutel van 8–128 veilige tekens bindt met oorspronkelijke API-sleutel de mutatie; gelijke sleutel met andere opdracht/basis geeft 409. Worker hercontroleert delegatie, bronnen en publicatiegrenzen. Bewaar mutatie_id uit de eerste 202; lees /v1/uitvoermutaties/{id} en daarna de actuele tekst/historie. Onzeker of reconcile_required nooit omzeilen met een nieuwe betaalde sleutel. Rapport geeft bij opgeslagen terminale ontvangst 200 of de opgeslagen foutstatus; een gespreksveld geeft altijd 202 met klaar/mislukt/controle_nodig. De API-adapter verwijdert credits_afgeboekt en voegt creditmodus toe; daadwerkelijke kosten blijven in het gebruiksoverzicht. Geen mailverzending door het bijsturen van mailtekst.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GesprekHergeneratieOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/uitvoer.js",
          "server/rapportly_uitvoer_api.js",
          "server/lib/uitvoer/duurzameMutaties.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/hergeneratie.js",
          "server/jobs/startIdempotency.js",
          "server/jobs/uitvoerMutatieContract.js",
          "server/jobs/handlers/rapportHergenereren.js",
          "server/jobs/adapters/uitvoerMutatieCredits.js",
          "server/migrations/202_rapportly_duurzame_uitvoermutaties.sql",
          "server/migrations/366_rapportly_rapportuitvoer_revisies.sql"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke getrimde instructie/tier beschreven; ruimere native witruimte- en scalar-normalisatie niet als aanbevolen invoer uitgewerkt."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DuurzameHergeneratieInvoer"
              }
            }
          }
        },
        "x-bronref": "cfe078af"
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/followup_mail": {
      "get": {
        "operationId": "followup_mail_uitvoer_lezen",
        "summary": "followup mail uitvoer lezen",
        "description": "reeds_verzonden waarschuwt dat de bestaande tekst al verzonden kan zijn. Bewerken verzendt geen nieuwe mail. bijsturen alleen bij actieve duurzame bijsturing.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "soort": {
                      "const": "gesprek"
                    },
                    "anker_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "veld": {
                      "const": "followup_mail"
                    },
                    "inhoud": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string"
                    },
                    "versie_nummer": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "herkomst": {
                      "type": "string",
                      "enum": [
                        "generatie",
                        "handmatig",
                        "hergeneratie",
                        "hersteld"
                      ]
                    },
                    "bewerkt": {
                      "type": "boolean"
                    },
                    "reeds_verzonden": {
                      "type": "boolean"
                    },
                    "bijgewerkt_op": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "bijsturen": {
                      "type": "object",
                      "properties": {
                        "duurzaam": {
                          "const": true
                        }
                      },
                      "required": [
                        "duurzaam"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "soort",
                    "anker_id",
                    "veld",
                    "inhoud",
                    "status",
                    "versie_nummer",
                    "herkomst",
                    "bewerkt",
                    "reeds_verzonden",
                    "bijgewerkt_op"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/uitvoer/gesprekMutatie.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/versies.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "put": {
        "operationId": "followup_mail_uitvoer_wijzigen",
        "summary": "followup mail uitvoer wijzigen",
        "description": "Atomische actuele tekst plus historie. Basisversie verplicht; idempotentie16–128 door de hele middlewareketen. Geen modelverbruik. Lees bij conflict opnieuw.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    },
                    "versie_nummer": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "herhaald": {
                      "type": "boolean"
                    },
                    "hersteld_van": {
                      "type": "integer",
                      "minimum": 1
                    }
                  },
                  "required": [
                    "ok",
                    "versie_nummer"
                  ],
                  "additionalProperties": false,
                  "description": "Herstel kan hersteld_van toevoegen; een ontvangstherhaling bevat herhaald."
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "documenten:wijzigen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/uitvoer/gesprekMutatie.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/versies.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "inhoud": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 400000,
                    "pattern": "\\S"
                  },
                  "basis_versie": {
                    "type": "integer",
                    "minimum": 1
                  }
                },
                "required": [
                  "inhoud",
                  "basis_versie"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/followup_mail/versies": {
      "get": {
        "operationId": "followup_mail_uitvoer_historie",
        "summary": "followup mail uitvoer historie",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "soort": {
                      "const": "gesprek"
                    },
                    "anker_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "veld": {
                      "const": "followup_mail"
                    },
                    "versies": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "versie_nummer": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "herkomst": {
                            "type": "string"
                          },
                          "hersteld_van": {
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": 0
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "tekens": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "user_id": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "created_at": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "fragment": {
                            "type": "string"
                          }
                        },
                        "required": [],
                        "additionalProperties": false
                      },
                      "maxItems": 50
                    }
                  },
                  "required": [
                    "soort",
                    "anker_id",
                    "veld",
                    "versies"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/uitvoer/gesprekMutatie.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/versies.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/followup_mail/versies/{nr}": {
      "get": {
        "operationId": "followup_mail_uitvoer_historische_tekst",
        "summary": "followup mail uitvoer historische tekst",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "nr",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 999999999
            }
          },
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "soort": {
                      "const": "gesprek"
                    },
                    "anker_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "veld": {
                      "const": "followup_mail"
                    },
                    "versie_nummer": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "herkomst": {
                      "type": "string"
                    },
                    "hersteld_van": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 0
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "tekens": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "user_id": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "inhoud": {
                      "type": "string"
                    }
                  },
                  "required": [],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/uitvoer/gesprekMutatie.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/versies.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/followup_mail/herstel/{nr}": {
      "post": {
        "operationId": "followup_mail_uitvoer_herstellen",
        "summary": "followup mail uitvoer herstellen",
        "description": "Herstel schrijft een nieuwe actuele versie vanuit de gekozen historische tekst. Eerdere verzonden berichten worden niet gewijzigd.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "nr",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 999999999
            }
          },
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    },
                    "versie_nummer": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "herhaald": {
                      "type": "boolean"
                    },
                    "hersteld_van": {
                      "type": "integer",
                      "minimum": 1
                    }
                  },
                  "required": [
                    "ok",
                    "versie_nummer"
                  ],
                  "additionalProperties": false,
                  "description": "Herstel kan hersteld_van toevoegen; een ontvangstherhaling bevat herhaald."
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "documenten:wijzigen"
        ],
        "x-bronnen": [
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/uitvoer/gesprekMutatie.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/versies.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis_versie": {
                    "type": "integer",
                    "minimum": 1
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "basis_versie",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/followup_mail/hergenereer": {
      "post": {
        "operationId": "gesprek_followup_mail_duurzaam_hergenereren",
        "summary": "gesprek followup mail duurzaam hergenereren",
        "description": "Bestaande expliciete betaalde bijsturing van één canoniek veld. Actuele API-sleutel/actor/org/object/trial/pakket/budget, persoonlijke werkelijke kostenmodus en duurzame runtime vereist. Geen synchrone fallback. Basisversie is een positief veilig geheel getal. Sleutel van 8–128 veilige tekens bindt met oorspronkelijke API-sleutel de mutatie; gelijke sleutel met andere opdracht/basis geeft 409. Worker hercontroleert delegatie, bronnen en publicatiegrenzen. Bewaar mutatie_id uit de eerste 202; lees /v1/uitvoermutaties/{id} en daarna de actuele tekst/historie. Onzeker of reconcile_required nooit omzeilen met een nieuwe betaalde sleutel. Rapport geeft bij opgeslagen terminale ontvangst 200 of de opgeslagen foutstatus; een gespreksveld geeft altijd 202 met klaar/mislukt/controle_nodig. De API-adapter verwijdert credits_afgeboekt en voegt creditmodus toe; daadwerkelijke kosten blijven in het gebruiksoverzicht. Geen mailverzending door het bijsturen van mailtekst.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GesprekHergeneratieOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/uitvoer.js",
          "server/rapportly_uitvoer_api.js",
          "server/lib/uitvoer/duurzameMutaties.js",
          "server/lib/uitvoer/gesprekBijsturen.js",
          "server/lib/uitvoer/hergeneratie.js",
          "server/jobs/startIdempotency.js",
          "server/jobs/uitvoerMutatieContract.js",
          "server/jobs/handlers/rapportHergenereren.js",
          "server/jobs/adapters/uitvoerMutatieCredits.js",
          "server/migrations/202_rapportly_duurzame_uitvoermutaties.sql",
          "server/migrations/366_rapportly_rapportuitvoer_revisies.sql"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke getrimde instructie/tier beschreven; ruimere native witruimte- en scalar-normalisatie niet als aanbevolen invoer uitgewerkt."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DuurzameHergeneratieInvoer"
              }
            }
          }
        },
        "x-bronref": "cfe078af"
      }
    },
    "/v1/account/bedrijfsgegevens": {
      "get": {
        "operationId": "account_bedrijfsgegevens_lezen",
        "summary": "account bedrijfsgegevens lezen",
        "description": "Geen queryvelden. Huidige actor, pakket, rechten en plafond worden opnieuw gecontroleerd. basis is de ongewijzigd te bewaren revisiestring.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountBedrijf"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "account:lezen"
        ],
        "x-bronnen": [
          "server/lib/accountInstellingen.js",
          "server/lib/publiekeApi/account.js",
          "server/lib/tierVoorkeuren.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "patch": {
        "operationId": "account_bedrijfsgegevens_wijzigen",
        "summary": "account bedrijfsgegevens wijzigen",
        "description": "Geen queryvelden. Historische ontvangst en huidige toestand zijn apart. Ook een gelijke nieuwe bewuste mutatie krijgt een nieuwe revisie; een exacte retry niet. Genormaliseerde waarde maximaal 8000 UTF-8 bytes in de opslagtransactie. Teamkwaliteit/uitvoertalen/teamrollen vereisen eigenaar. Persoonlijke kwaliteit kan vast teambeleid niet omzeilen. Teamrol wijzigt geen eigenaar en kan niet voor de eigen actor worden gezet. Bij 409 opnieuw lezen en herbeoordelen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ontvangst": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^[a-f0-9]{64}$"
                        },
                        "basis": {
                          "type": "string",
                          "pattern": "^[0-9]{1,18}$",
                          "description": "Opaque revisie als string, ook \"0\" is geldig. Ongewijzigd terugsturen; niet zelf verhogen."
                        },
                        "afgerond_op": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "herhaald": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "id",
                        "basis",
                        "afgerond_op",
                        "herhaald"
                      ],
                      "additionalProperties": false
                    },
                    "huidig": {
                      "$ref": "#/components/schemas/AccountBedrijf"
                    }
                  },
                  "required": [
                    "ontvangst",
                    "huidig"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "account:lezen",
          "bedrijfsgegevens:wijzigen"
        ],
        "x-bronnen": [
          "server/lib/accountInstellingen.js",
          "server/lib/publiekeApi/account.js",
          "server/lib/tierVoorkeuren.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis": {
                    "type": "string",
                    "pattern": "^[0-9]{1,18}$",
                    "description": "Opaque revisie als string, ook \"0\" is geldig. Ongewijzigd terugsturen; niet zelf verhogen."
                  },
                  "waarde": {
                    "type": "object",
                    "properties": {
                      "contactpersoon": {
                        "anyOf": [
                          {
                            "type": "string",
                            "maxLength": 200
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "adres": {
                        "anyOf": [
                          {
                            "type": "string",
                            "maxLength": 200
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "postcode": {
                        "anyOf": [
                          {
                            "type": "string",
                            "maxLength": 200
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "plaats": {
                        "anyOf": [
                          {
                            "type": "string",
                            "maxLength": 200
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "telefoon": {
                        "anyOf": [
                          {
                            "type": "string",
                            "maxLength": 200
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "website": {
                        "anyOf": [
                          {
                            "type": "string",
                            "maxLength": 200
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "kvk_nummer": {
                        "anyOf": [
                          {
                            "type": "string",
                            "maxLength": 200
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "branche": {
                        "anyOf": [
                          {
                            "type": "string",
                            "maxLength": 120
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "offerte_prefix": {
                        "anyOf": [
                          {
                            "type": "string",
                            "maxLength": 20
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "offerte_geldigheid_dagen": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 365
                      },
                      "offerte_betalingscondities": {
                        "anyOf": [
                          {
                            "type": "string",
                            "maxLength": 500
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "offerte_btw_pct": {
                        "anyOf": [
                          {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 100
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "required": [],
                    "additionalProperties": false,
                    "minProperties": 1
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "basis",
                  "waarde",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/account/schermtaal": {
      "get": {
        "operationId": "account_schermtaal_lezen",
        "summary": "account schermtaal lezen",
        "description": "Geen queryvelden. Huidige actor, pakket, rechten en plafond worden opnieuw gecontroleerd. basis is de ongewijzigd te bewaren revisiestring.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountSchermtaal"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "account:lezen"
        ],
        "x-bronnen": [
          "server/lib/accountInstellingen.js",
          "server/lib/publiekeApi/account.js",
          "server/lib/tierVoorkeuren.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "patch": {
        "operationId": "account_schermtaal_wijzigen",
        "summary": "account schermtaal wijzigen",
        "description": "Geen queryvelden. Historische ontvangst en huidige toestand zijn apart. Ook een gelijke nieuwe bewuste mutatie krijgt een nieuwe revisie; een exacte retry niet. Genormaliseerde waarde maximaal 8000 UTF-8 bytes in de opslagtransactie. Teamkwaliteit/uitvoertalen/teamrollen vereisen eigenaar. Persoonlijke kwaliteit kan vast teambeleid niet omzeilen. Teamrol wijzigt geen eigenaar en kan niet voor de eigen actor worden gezet. Bij 409 opnieuw lezen en herbeoordelen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ontvangst": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^[a-f0-9]{64}$"
                        },
                        "basis": {
                          "type": "string",
                          "pattern": "^[0-9]{1,18}$",
                          "description": "Opaque revisie als string, ook \"0\" is geldig. Ongewijzigd terugsturen; niet zelf verhogen."
                        },
                        "afgerond_op": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "herhaald": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "id",
                        "basis",
                        "afgerond_op",
                        "herhaald"
                      ],
                      "additionalProperties": false
                    },
                    "huidig": {
                      "$ref": "#/components/schemas/AccountSchermtaal"
                    }
                  },
                  "required": [
                    "ontvangst",
                    "huidig"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "account:lezen",
          "voorkeuren:wijzigen"
        ],
        "x-bronnen": [
          "server/lib/accountInstellingen.js",
          "server/lib/publiekeApi/account.js",
          "server/lib/tierVoorkeuren.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis": {
                    "type": "string",
                    "pattern": "^[0-9]{1,18}$",
                    "description": "Opaque revisie als string, ook \"0\" is geldig. Ongewijzigd terugsturen; niet zelf verhogen."
                  },
                  "waarde": {
                    "type": "object",
                    "properties": {
                      "taal": {
                        "anyOf": [
                          {
                            "type": "string",
                            "maxLength": 6,
                            "pattern": "^(?:[a-z]{2,3}(?:-[a-z]{2})?)?$"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "required": [
                      "taal"
                    ],
                    "additionalProperties": false
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "basis",
                  "waarde",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/account/uitvoertalen": {
      "get": {
        "operationId": "account_uitvoertalen_lezen",
        "summary": "account uitvoertalen lezen",
        "description": "Geen queryvelden. Huidige actor, pakket, rechten en plafond worden opnieuw gecontroleerd. basis is de ongewijzigd te bewaren revisiestring.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountUitvoertalen"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "account:lezen"
        ],
        "x-bronnen": [
          "server/lib/accountInstellingen.js",
          "server/lib/publiekeApi/account.js",
          "server/lib/tierVoorkeuren.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "patch": {
        "operationId": "account_uitvoertalen_wijzigen",
        "summary": "account uitvoertalen wijzigen",
        "description": "Geen queryvelden. Historische ontvangst en huidige toestand zijn apart. Ook een gelijke nieuwe bewuste mutatie krijgt een nieuwe revisie; een exacte retry niet. Genormaliseerde waarde maximaal 8000 UTF-8 bytes in de opslagtransactie. Teamkwaliteit/uitvoertalen/teamrollen vereisen eigenaar. Persoonlijke kwaliteit kan vast teambeleid niet omzeilen. Teamrol wijzigt geen eigenaar en kan niet voor de eigen actor worden gezet. Bij 409 opnieuw lezen en herbeoordelen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ontvangst": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^[a-f0-9]{64}$"
                        },
                        "basis": {
                          "type": "string",
                          "pattern": "^[0-9]{1,18}$",
                          "description": "Opaque revisie als string, ook \"0\" is geldig. Ongewijzigd terugsturen; niet zelf verhogen."
                        },
                        "afgerond_op": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "herhaald": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "id",
                        "basis",
                        "afgerond_op",
                        "herhaald"
                      ],
                      "additionalProperties": false
                    },
                    "huidig": {
                      "$ref": "#/components/schemas/AccountUitvoertalen"
                    }
                  },
                  "required": [
                    "ontvangst",
                    "huidig"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "account:lezen",
          "teaminstellingen:wijzigen"
        ],
        "x-bronnen": [
          "server/lib/accountInstellingen.js",
          "server/lib/publiekeApi/account.js",
          "server/lib/tierVoorkeuren.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis": {
                    "type": "string",
                    "pattern": "^[0-9]{1,18}$",
                    "description": "Opaque revisie als string, ook \"0\" is geldig. Ongewijzigd terugsturen; niet zelf verhogen."
                  },
                  "waarde": {
                    "type": "object",
                    "properties": {
                      "primaryDefault": {
                        "type": "string",
                        "pattern": "^(?:auto|[a-z]{2,3})$"
                      },
                      "secondary": {
                        "type": "object",
                        "properties": {
                          "enabled": {
                            "type": "boolean"
                          },
                          "defaultLanguage": {
                            "anyOf": [
                              {
                                "type": "string",
                                "pattern": "^[a-z]{2,3}$",
                                "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": [
                          "enabled",
                          "defaultLanguage"
                        ],
                        "additionalProperties": false
                      }
                    },
                    "required": [
                      "primaryDefault",
                      "secondary"
                    ],
                    "additionalProperties": false,
                    "description": "secondary.enabled:true vereist concrete defaultLanguage. Primaire taal mag auto zijn. capability.available zegt of tweede uitvoertaal in de runtime is vrijgegeven."
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "basis",
                  "waarde",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/account/teamkwaliteit": {
      "get": {
        "operationId": "account_teamkwaliteit_lezen",
        "summary": "account teamkwaliteit lezen",
        "description": "Geen queryvelden. Huidige actor, pakket, rechten en plafond worden opnieuw gecontroleerd. basis is de ongewijzigd te bewaren revisiestring.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountTeamkwaliteit"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "account:lezen"
        ],
        "x-bronnen": [
          "server/lib/accountInstellingen.js",
          "server/lib/publiekeApi/account.js",
          "server/lib/tierVoorkeuren.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "patch": {
        "operationId": "account_teamkwaliteit_wijzigen",
        "summary": "account teamkwaliteit wijzigen",
        "description": "Geen queryvelden. Historische ontvangst en huidige toestand zijn apart. Ook een gelijke nieuwe bewuste mutatie krijgt een nieuwe revisie; een exacte retry niet. Genormaliseerde waarde maximaal 8000 UTF-8 bytes in de opslagtransactie. Teamkwaliteit/uitvoertalen/teamrollen vereisen eigenaar. Persoonlijke kwaliteit kan vast teambeleid niet omzeilen. Teamrol wijzigt geen eigenaar en kan niet voor de eigen actor worden gezet. Bij 409 opnieuw lezen en herbeoordelen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ontvangst": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^[a-f0-9]{64}$"
                        },
                        "basis": {
                          "type": "string",
                          "pattern": "^[0-9]{1,18}$",
                          "description": "Opaque revisie als string, ook \"0\" is geldig. Ongewijzigd terugsturen; niet zelf verhogen."
                        },
                        "afgerond_op": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "herhaald": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "id",
                        "basis",
                        "afgerond_op",
                        "herhaald"
                      ],
                      "additionalProperties": false
                    },
                    "huidig": {
                      "$ref": "#/components/schemas/AccountTeamkwaliteit"
                    }
                  },
                  "required": [
                    "ontvangst",
                    "huidig"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "account:lezen",
          "teaminstellingen:wijzigen"
        ],
        "x-bronnen": [
          "server/lib/accountInstellingen.js",
          "server/lib/publiekeApi/account.js",
          "server/lib/tierVoorkeuren.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis": {
                    "type": "string",
                    "pattern": "^[0-9]{1,18}$",
                    "description": "Opaque revisie als string, ook \"0\" is geldig. Ongewijzigd terugsturen; niet zelf verhogen."
                  },
                  "waarde": {
                    "type": "object",
                    "properties": {
                      "bundel": {
                        "oneOf": [
                          {
                            "type": "null"
                          },
                          {
                            "type": "string",
                            "enum": [
                              "basis",
                              "standaard",
                              "max"
                            ]
                          },
                          {
                            "type": "object",
                            "properties": {
                              "tier": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "enum": [
                                      "basis",
                                      "standaard",
                                      "max"
                                    ]
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "mag_afwijken": {
                                "type": "boolean"
                              }
                            },
                            "required": [],
                            "additionalProperties": false,
                            "minProperties": 1
                          }
                        ]
                      },
                      "rapport": {
                        "oneOf": [
                          {
                            "type": "null"
                          },
                          {
                            "type": "string",
                            "enum": [
                              "basis",
                              "standaard",
                              "max"
                            ]
                          },
                          {
                            "type": "object",
                            "properties": {
                              "tier": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "enum": [
                                      "basis",
                                      "standaard",
                                      "max"
                                    ]
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "mag_afwijken": {
                                "type": "boolean"
                              }
                            },
                            "required": [],
                            "additionalProperties": false,
                            "minProperties": 1
                          }
                        ]
                      },
                      "offerte": {
                        "oneOf": [
                          {
                            "type": "null"
                          },
                          {
                            "type": "string",
                            "enum": [
                              "basis",
                              "standaard",
                              "max"
                            ]
                          },
                          {
                            "type": "object",
                            "properties": {
                              "tier": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "enum": [
                                      "basis",
                                      "standaard",
                                      "max"
                                    ]
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "mag_afwijken": {
                                "type": "boolean"
                              }
                            },
                            "required": [],
                            "additionalProperties": false,
                            "minProperties": 1
                          }
                        ]
                      }
                    },
                    "required": [],
                    "additionalProperties": false,
                    "minProperties": 1
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "basis",
                  "waarde",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/account/mijnkwaliteit": {
      "get": {
        "operationId": "account_mijnkwaliteit_lezen",
        "summary": "account mijnkwaliteit lezen",
        "description": "Geen queryvelden. Huidige actor, pakket, rechten en plafond worden opnieuw gecontroleerd. basis is de ongewijzigd te bewaren revisiestring.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountMijnkwaliteit"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "account:lezen"
        ],
        "x-bronnen": [
          "server/lib/accountInstellingen.js",
          "server/lib/publiekeApi/account.js",
          "server/lib/tierVoorkeuren.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "patch": {
        "operationId": "account_mijnkwaliteit_wijzigen",
        "summary": "account mijnkwaliteit wijzigen",
        "description": "Geen queryvelden. Historische ontvangst en huidige toestand zijn apart. Ook een gelijke nieuwe bewuste mutatie krijgt een nieuwe revisie; een exacte retry niet. Genormaliseerde waarde maximaal 8000 UTF-8 bytes in de opslagtransactie. Teamkwaliteit/uitvoertalen/teamrollen vereisen eigenaar. Persoonlijke kwaliteit kan vast teambeleid niet omzeilen. Teamrol wijzigt geen eigenaar en kan niet voor de eigen actor worden gezet. Bij 409 opnieuw lezen en herbeoordelen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ontvangst": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^[a-f0-9]{64}$"
                        },
                        "basis": {
                          "type": "string",
                          "pattern": "^[0-9]{1,18}$",
                          "description": "Opaque revisie als string, ook \"0\" is geldig. Ongewijzigd terugsturen; niet zelf verhogen."
                        },
                        "afgerond_op": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "herhaald": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "id",
                        "basis",
                        "afgerond_op",
                        "herhaald"
                      ],
                      "additionalProperties": false
                    },
                    "huidig": {
                      "$ref": "#/components/schemas/AccountMijnkwaliteit"
                    }
                  },
                  "required": [
                    "ontvangst",
                    "huidig"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "account:lezen",
          "voorkeuren:wijzigen"
        ],
        "x-bronnen": [
          "server/lib/accountInstellingen.js",
          "server/lib/publiekeApi/account.js",
          "server/lib/tierVoorkeuren.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis": {
                    "type": "string",
                    "pattern": "^[0-9]{1,18}$",
                    "description": "Opaque revisie als string, ook \"0\" is geldig. Ongewijzigd terugsturen; niet zelf verhogen."
                  },
                  "waarde": {
                    "type": "object",
                    "properties": {
                      "bundel": {
                        "oneOf": [
                          {
                            "type": "null"
                          },
                          {
                            "type": "string",
                            "enum": [
                              "basis",
                              "standaard",
                              "max"
                            ]
                          },
                          {
                            "type": "object",
                            "properties": {
                              "tier": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "enum": [
                                      "basis",
                                      "standaard",
                                      "max"
                                    ]
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "tier"
                            ],
                            "additionalProperties": false
                          }
                        ]
                      },
                      "rapport": {
                        "oneOf": [
                          {
                            "type": "null"
                          },
                          {
                            "type": "string",
                            "enum": [
                              "basis",
                              "standaard",
                              "max"
                            ]
                          },
                          {
                            "type": "object",
                            "properties": {
                              "tier": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "enum": [
                                      "basis",
                                      "standaard",
                                      "max"
                                    ]
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "tier"
                            ],
                            "additionalProperties": false
                          }
                        ]
                      },
                      "offerte": {
                        "oneOf": [
                          {
                            "type": "null"
                          },
                          {
                            "type": "string",
                            "enum": [
                              "basis",
                              "standaard",
                              "max"
                            ]
                          },
                          {
                            "type": "object",
                            "properties": {
                              "tier": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "enum": [
                                      "basis",
                                      "standaard",
                                      "max"
                                    ]
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "tier"
                            ],
                            "additionalProperties": false
                          }
                        ]
                      }
                    },
                    "required": [],
                    "additionalProperties": false,
                    "minProperties": 1
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "basis",
                  "waarde",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/account/teamrollen": {
      "get": {
        "operationId": "account_teamrollen_lezen",
        "summary": "account teamrollen lezen",
        "description": "Geen queryvelden. Huidige actor, pakket, rechten en plafond worden opnieuw gecontroleerd. basis is de ongewijzigd te bewaren revisiestring.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountTeamrollen"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "account:lezen"
        ],
        "x-bronnen": [
          "server/lib/accountInstellingen.js",
          "server/lib/publiekeApi/account.js",
          "server/lib/tierVoorkeuren.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "patch": {
        "operationId": "account_teamrollen_wijzigen",
        "summary": "account teamrollen wijzigen",
        "description": "Geen queryvelden. Historische ontvangst en huidige toestand zijn apart. Ook een gelijke nieuwe bewuste mutatie krijgt een nieuwe revisie; een exacte retry niet. Genormaliseerde waarde maximaal 8000 UTF-8 bytes in de opslagtransactie. Teamkwaliteit/uitvoertalen/teamrollen vereisen eigenaar. Persoonlijke kwaliteit kan vast teambeleid niet omzeilen. Teamrol wijzigt geen eigenaar en kan niet voor de eigen actor worden gezet. Bij 409 opnieuw lezen en herbeoordelen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ontvangst": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^[a-f0-9]{64}$"
                        },
                        "basis": {
                          "type": "string",
                          "pattern": "^[0-9]{1,18}$",
                          "description": "Opaque revisie als string, ook \"0\" is geldig. Ongewijzigd terugsturen; niet zelf verhogen."
                        },
                        "afgerond_op": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "herhaald": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "id",
                        "basis",
                        "afgerond_op",
                        "herhaald"
                      ],
                      "additionalProperties": false
                    },
                    "huidig": {
                      "$ref": "#/components/schemas/AccountTeamrollen"
                    }
                  },
                  "required": [
                    "ontvangst",
                    "huidig"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "account:lezen",
          "teamrollen:wijzigen"
        ],
        "x-bronnen": [
          "server/lib/accountInstellingen.js",
          "server/lib/publiekeApi/account.js",
          "server/lib/tierVoorkeuren.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis": {
                    "type": "string",
                    "pattern": "^[0-9]{1,18}$",
                    "description": "Opaque revisie als string, ook \"0\" is geldig. Ongewijzigd terugsturen; niet zelf verhogen."
                  },
                  "waarde": {
                    "type": "object",
                    "properties": {
                      "user_id": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      "rol": {
                        "type": "string",
                        "enum": [
                          "teamleider",
                          "lid"
                        ]
                      }
                    },
                    "required": [
                      "user_id",
                      "rol"
                    ],
                    "additionalProperties": false
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "basis",
                  "waarde",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/team": {
      "get": {
        "operationId": "team_lezen",
        "summary": "team lezen",
        "description": "Lees bestaande teamleden, rol en capaciteit. Geen uitnodiging/seatwijziging. Ontbrekende authinformatie kan email/laatst_ingelogd null maken; status uitgenodigd is afgeleid van ontbrekende laatste login en bewijst geen mailbezorging.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "leden": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "naam": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "email": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "email"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "laatst_ingelogd": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "status": {
                            "type": "string",
                            "enum": [
                              "actief",
                              "uitgenodigd"
                            ]
                          },
                          "is_eigenaar": {
                            "type": "boolean"
                          },
                          "teamrol": {
                            "type": "string",
                            "enum": [
                              "beheerder",
                              "teamleider",
                              "lid"
                            ]
                          }
                        },
                        "required": [
                          "id",
                          "naam",
                          "email",
                          "laatst_ingelogd",
                          "status",
                          "is_eigenaar",
                          "teamrol"
                        ],
                        "additionalProperties": false
                      }
                    },
                    "seats": {
                      "type": "object",
                      "properties": {
                        "totaal": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "gebruikt": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "vrij": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "totaal",
                        "gebruikt",
                        "vrij"
                      ],
                      "additionalProperties": false
                    },
                    "is_beheerder": {
                      "type": "boolean"
                    },
                    "eigen_rol": {
                      "type": "string",
                      "enum": [
                        "beheerder",
                        "teamleider",
                        "lid"
                      ]
                    },
                    "mogelijkheden": {
                      "type": "object",
                      "properties": {
                        "rol": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "beheerder",
                                "teamleider",
                                "lid"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "is_beheerder": {
                          "type": "boolean"
                        },
                        "kan_team_publiceren": {
                          "type": "boolean"
                        },
                        "kan_teamrollen_beheren": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "rol",
                        "is_beheerder",
                        "kan_team_publiceren",
                        "kan_teamrollen_beheren"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "leden",
                    "seats",
                    "is_beheerder",
                    "eigen_rol",
                    "mogelijkheden"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "account:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/account.js",
          "server/rapportly_team_api.js",
          "server/lib/teamGovernance.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/koppelingen/actierechten": {
      "get": {
        "operationId": "api_beheer_actierechten",
        "summary": "beheer actierechten",
        "description": "Alleen metadata lezen met sleutels:lezen. Organisatie-eigenaar ziet organisatiebeleid, overige actoren alleen hun eigen sleutels. Geen geheim, uitgifte, activatie of beleidsverruiming via deze API-route.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "rechten": {
                      "$ref": "#/components/schemas/Actierechten"
                    }
                  },
                  "required": [
                    "rechten"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "sleutels:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/sleutelbeheer.js",
          "server/lib/publiekeApi/account.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/koppelingen/sleutels/{id}/beleid": {
      "get": {
        "operationId": "api_sleutelbeleid_lezen",
        "summary": "sleutelbeleid lezen",
        "description": "Alleen metadata lezen met sleutels:lezen. Organisatie-eigenaar ziet organisatiebeleid, overige actoren alleen hun eigen sleutels. Geen geheim, uitgifte, activatie of beleidsverruiming via deze API-route.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Sleutelbeleid"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string"
                },
                "description": "Gequote beleid_versie; letterlijk als If-Match meesturen."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "sleutels:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/sleutelbeheer.js",
          "server/lib/publiekeApi/sleutelbeleid.js",
          "server/lib/publiekeApi/account.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/koppelingen/sleutels/{id}/verzoeken": {
      "get": {
        "operationId": "api_beheer_sleutelverzoeken",
        "summary": "beheer sleutelverzoeken",
        "description": "Alleen metadata lezen met sleutels:lezen. Organisatie-eigenaar ziet organisatiebeleid, overige actoren alleen hun eigen sleutels. Geen geheim, uitgifte, activatie of beleidsverruiming via deze API-route.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "limiet",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 30
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VerzoekenLijst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "sleutels:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/sleutelbeheer.js",
          "server/lib/publiekeApi/account.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/koppelingen/sleutels/{id}/gebruik": {
      "get": {
        "operationId": "api_beheer_sleutelgebruik",
        "summary": "beheer sleutelgebruik",
        "description": "Alleen metadata lezen met sleutels:lezen. Organisatie-eigenaar ziet organisatiebeleid, overige actoren alleen hun eigen sleutels. Geen geheim, uitgifte, activatie of beleidsverruiming via deze API-route.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Gebruik"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "sleutels:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/sleutelbeheer.js",
          "server/lib/publiekeApi/account.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/koppelingen/sleutels": {
      "get": {
        "operationId": "api_sleutels_lijst",
        "summary": "api sleutels lijst",
        "description": "Alleen limiet/offset toegestaan. Eigenaar ziet alle organisatiesleutels; teamleden alleen eigen sleutels. Bevat geen geheim.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "limiet",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 30
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "sleutels": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "actie_rechten": {
                            "$ref": "#/components/schemas/Actierechten"
                          },
                          "max_actie_rechten": {
                            "$ref": "#/components/schemas/Actierechten"
                          },
                          "creditbudget_maand": {
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 1000000000
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "gepauzeerd": {
                            "type": "boolean"
                          },
                          "verloopt_op": {
                            "anyOf": [
                              {
                                "type": "string",
                                "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "omgeving": {
                            "type": "string",
                            "enum": [
                              "productie",
                              "test"
                            ]
                          },
                          "mag_rechten_aanpassen": {
                            "type": "boolean"
                          },
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "geactiveerd_op": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "ingetrokken_op": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "beleid_versie": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "naam": {
                            "type": "string"
                          },
                          "key_prefix": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "created_by": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "uitgegeven_door": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": [
                          "actie_rechten",
                          "max_actie_rechten",
                          "creditbudget_maand",
                          "gepauzeerd",
                          "verloopt_op",
                          "omgeving",
                          "mag_rechten_aanpassen",
                          "id",
                          "geactiveerd_op",
                          "ingetrokken_op",
                          "beleid_versie",
                          "naam",
                          "key_prefix",
                          "created_by",
                          "uitgegeven_door"
                        ],
                        "additionalProperties": false
                      }
                    },
                    "limiet": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 100
                    },
                    "offset": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 10000
                    },
                    "meer": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "sleutels",
                    "limiet",
                    "offset",
                    "meer"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "sleutels:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/account.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/koppelingen": {
      "get": {
        "operationId": "beheer_koppelingen_overzicht",
        "summary": "beheer koppelingen overzicht",
        "description": "Gebruikerssessie. Beheerder ziet leden/sleutels van organisatie, teamlid alleen eigen sleutels en lege ledenlijst. webhooks hier zijn het bestaande Zapier-contract. Beleidsvelden hangen af van sleutelbeleid_beschikbaar. Geen geheimen.",
        "security": [
          {
            "Gebruikerssessie": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "koppelingen_actief": {
                      "type": "boolean"
                    },
                    "team_sleutels_beschikbaar": {
                      "const": true
                    },
                    "sleutelbeleid_beschikbaar": {
                      "type": "boolean"
                    },
                    "is_beheerder": {
                      "type": "boolean"
                    },
                    "eigen_gebruiker_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "leden": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "naam": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "id",
                          "naam"
                        ],
                        "additionalProperties": false
                      }
                    },
                    "sleutels": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "actie_rechten": {
                            "$ref": "#/components/schemas/Actierechten"
                          },
                          "max_actie_rechten": {
                            "$ref": "#/components/schemas/Actierechten"
                          },
                          "creditbudget_maand": {
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 1000000000
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "gepauzeerd": {
                            "type": "boolean"
                          },
                          "verloopt_op": {
                            "anyOf": [
                              {
                                "type": "string",
                                "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "omgeving": {
                            "type": "string",
                            "enum": [
                              "productie",
                              "test"
                            ]
                          },
                          "mag_rechten_aanpassen": {
                            "type": "boolean"
                          },
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "geactiveerd_op": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "ingetrokken_op": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "beleid_versie": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "naam": {
                            "type": "string"
                          },
                          "key_prefix": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "created_by": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "uitgegeven_door": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "scopes": {
                            "type": "array",
                            "items": {
                              "type": "string",
                              "enum": [
                                "webhooks",
                                "resultaten:lezen",
                                "verwerkingen:starten"
                              ]
                            }
                          },
                          "aangemaakt_op": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "laatst_gebruikt": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": [],
                        "additionalProperties": false
                      }
                    },
                    "webhooks": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "event": {
                            "type": "string"
                          },
                          "url": {
                            "type": "string",
                            "format": "uri"
                          },
                          "actief": {
                            "type": "boolean"
                          },
                          "aangemaakt_op": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "laatste_status": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "laatste_status_code": {
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": 0
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "laatste_bezorgd_op": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "laatste_fout": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": [
                          "id",
                          "event",
                          "url",
                          "actief",
                          "aangemaakt_op",
                          "laatste_status",
                          "laatste_status_code",
                          "laatste_bezorgd_op",
                          "laatste_fout"
                        ],
                        "additionalProperties": false
                      }
                    }
                  },
                  "required": [
                    "koppelingen_actief",
                    "team_sleutels_beschikbaar",
                    "sleutelbeleid_beschikbaar",
                    "is_beheerder",
                    "eigen_gebruiker_id",
                    "leden",
                    "sleutels",
                    "webhooks"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [],
        "x-bronnen": [
          "server/rapportly_koppeling_api.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/koppelingen/sleutels": {
      "post": {
        "operationId": "beheer_sleutel_aanmaken",
        "summary": "beheer sleutel aanmaken",
        "description": "Alleen beheerder, maximaal 10 actieve sleutels. Naam wordt getrimd/afgekapt op 100 tekens. scope standaard webhooks; beleid alleen bij volledige API. Andere gebruiker: nog geen bruikbaar geheim en key_prefix:null, doelgebruiker moet zelf activeren. Eigen gebruiker: geheim eenmalig. Geen idempotent ontvangstcontract; na antwoordverlies eerst overzicht lezen en geen nieuwe sleutel automatisch aanmaken.",
        "security": [
          {
            "Gebruikerssessie": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "actie_rechten": {
                      "$ref": "#/components/schemas/Actierechten"
                    },
                    "max_actie_rechten": {
                      "$ref": "#/components/schemas/Actierechten"
                    },
                    "creditbudget_maand": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 1000000000
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "gepauzeerd": {
                      "type": "boolean"
                    },
                    "verloopt_op": {
                      "anyOf": [
                        {
                          "type": "string",
                          "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "omgeving": {
                      "type": "string",
                      "enum": [
                        "productie",
                        "test"
                      ]
                    },
                    "mag_rechten_aanpassen": {
                      "type": "boolean"
                    },
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "geactiveerd_op": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "beleid_versie": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "naam": {
                      "type": "string"
                    },
                    "key_prefix": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "created_by": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "uitgegeven_door": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "scopes": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "enum": [
                          "webhooks",
                          "resultaten:lezen",
                          "verwerkingen:starten"
                        ]
                      }
                    },
                    "aangemaakt_op": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "sleutel": {
                      "type": "string",
                      "description": "Alleen bij eigen directe uitgifte eenmaal aanwezig. Niet loggen."
                    }
                  },
                  "required": [
                    "id",
                    "naam",
                    "key_prefix",
                    "scopes",
                    "created_by",
                    "uitgegeven_door",
                    "geactiveerd_op",
                    "mag_rechten_aanpassen",
                    "aangemaakt_op"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [],
        "x-bronnen": [
          "server/rapportly_koppeling_api.js",
          "server/lib/publiekeApi/sleutelbeleid.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "naam": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100,
                    "pattern": "\\S"
                  },
                  "scope": {
                    "type": "string",
                    "enum": [
                      "webhooks",
                      "resultaten:lezen",
                      "verwerkingen:starten"
                    ]
                  },
                  "mag_rechten_aanpassen": {
                    "type": "boolean"
                  },
                  "gebruiker_id": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "beleid": {
                    "$ref": "#/components/schemas/SleutelbeleidWijziging"
                  }
                },
                "required": [
                  "naam"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/koppelingen/sleutels/{id}/activeren": {
      "post": {
        "operationId": "beheer_sleutel_activeren",
        "summary": "beheer sleutel activeren",
        "description": "Alleen toegewezen doelgebruiker activeert een nog niet actieve gedelegeerde sleutel. Geheim wordt eenmaal getoond. Verloren antwoord is niet herhaalbaar: huidige toestand lezen en zo nodig bewuste geheimvervanging via /vervangen.",
        "security": [
          {
            "Gebruikerssessie": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "naam": {
                      "type": "string"
                    },
                    "key_prefix": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "scopes": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "enum": [
                          "webhooks",
                          "resultaten:lezen",
                          "verwerkingen:starten"
                        ]
                      }
                    },
                    "created_by": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "uitgegeven_door": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "geactiveerd_op": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "sleutel": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "naam",
                    "key_prefix",
                    "scopes",
                    "created_by",
                    "uitgegeven_door",
                    "geactiveerd_op",
                    "sleutel"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [],
        "x-bronnen": [
          "server/rapportly_koppeling_api.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LegeBody"
              }
            }
          }
        }
      }
    },
    "/koppelingen/sleutels/{id}": {
      "delete": {
        "operationId": "beheer_sleutel_intrekken",
        "summary": "beheer sleutel intrekken",
        "description": "Alleen beheerder. Trek een actieve sleutel in; huidige sleuteltoegang stopt. Oude Zapierwebhooks worden aanvullend gedeactiveerd. Reeds ingetrokken of onzichtbare sleutel geeft 404. Geen automatische opruimstap in de collectie.",
        "security": [
          {
            "Gebruikerssessie": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Ok"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [],
        "x-bronnen": [
          "server/rapportly_koppeling_api.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/koppelingen/sleutels/{id}/rechten": {
      "patch": {
        "operationId": "beheer_oude_scopes_geblokkeerd",
        "summary": "beheer oude scopes geblokkeerd",
        "description": "Volledige API weigert deze historische route altijd met 409 gebruik_sleutelbeleid_met_versie. Gebruik GET/PATCH /beleid met actuele If-Match.",
        "security": [
          {
            "Gebruikerssessie": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Volledige API: gebruik_sleutelbeleid_met_versie.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "const": "gebruik_sleutelbeleid_met_versie"
                    }
                  },
                  "required": [
                    "code"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [],
        "x-bronnen": [
          "server/rapportly_koppeling_api.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/klant-inname": {
      "get": {
        "operationId": "inname_organisatie_status",
        "summary": "inname organisatie status",
        "description": "Volledige-APIleesmodel met blijvende UUIDbasis, ook zonder bron; geen queryvelden. is_beheerder betekent exact de huidige organisatie-eigenaar, geen algemene teamrol. beschikbaar volgt de bestaande minimaal-pro_plus-pakkethelper; actief en beschikbaar zijn afzonderlijke feiten. Onleesbare/ongeldige context503, geen fictieve inactieve fallback. private,no-store. Nieuwere selectieve bron354bfa39 vervangt alleen dit vroegere statusantwoord.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganisatieInname"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "account:lezen"
        ],
        "x-bronnen": [
          "server/lib/orgInnameBeheer.js",
          "server/rapportly_api.js",
          "server/lib/publiekeApi/acties.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "354bfa39"
      },
      "post": {
        "operationId": "inname_organisatie_beheren",
        "summary": "inname organisatie beheren",
        "description": "Bewuste organisatie-innamepolicy met huidige UUIDbasis en Idempotency-Key16–128 veilige tekens. Alleen echte organisatie-eigenaar, actuele API-koppelingenfeature en bestaande minimaal-pro_plus-pakkettoegang; context wordt in transactie opnieuw vergeleken. Schrijft actief plus optionele complete afzenderlijst en duurzame ontvangst samen. Exacte herhaling geeft historische ontvangst en huidige policy zonder latere wijzigingen terug te draaien; gewijzigde invoer bij dezelfde sleutel409. Eerste opslaan met actief:false maakt een echte inactieve bron. Bron-/policywijzigingen wijzigen basis, alleen updated_at niet. Er wordt geen organisatie-innameadres aangemaakt; per-klantadres is afzonderlijk. Klant-e-mailadres blijft automatisch toegelaten naast de aanvullende orglijst; [] is dus geen verbod voor die klant. Geen model, credits of providerstart. private,no-store. Ontvangst bevat geen allowlist/adres/ingeleverde inhoud. Geen automatische retry na conflict; ontbrekende basis428, ongeldige volledige lijst400, geen huidige bevoegdheid403, opslagfout503. Algemene proefperiodepoort blijft gelden.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "huidig": {
                      "$ref": "#/components/schemas/OrganisatieInname"
                    },
                    "ontvangst": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "basis": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "actief": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "id",
                        "basis",
                        "actief"
                      ],
                      "additionalProperties": false
                    },
                    "herhaald": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "huidig",
                    "ontvangst",
                    "herhaald"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "teaminstellingen:wijzigen"
        ],
        "x-bronnen": [
          "server/lib/orgInnameBeheer.js",
          "server/rapportly_api.js",
          "server/lib/publiekeApi/acties.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "actief": {
                    "type": "boolean"
                  },
                  "basis": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "bevestigd": {
                    "const": true
                  },
                  "allowlist": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "description": "String wordt getrimd en naar kleine letters omgezet; genormaliseerd1–200tekens. Bestaande regel: ^[^\\s@]+@[a-z0-9.-]+\\.[a-z]{2,}$ of *@domein. Ongeldige regel weigert gehele opdracht; geen automatische typeconversie."
                    },
                    "maxItems": 20
                  }
                },
                "required": [
                  "actief",
                  "basis",
                  "bevestigd"
                ],
                "additionalProperties": false,
                "description": "allowlist weglaten bewaart bestaande lijst; [] wist aanvullende afzenders. Maximaal20invoerregels vóór ontdubbelen; ontdubbeling bewaart eerste volgorde. Getrimde lengte geldt; er is geen limiet200op de ongetrimde bronstring. Basis exact overnemen uit lezen."
              }
            }
          }
        },
        "x-bronref": "354bfa39"
      }
    },
    "/v1/klanten/{id}/inname": {
      "get": {
        "operationId": "klantinname_lezen",
        "summary": "klantinname lezen",
        "description": "Geen queryvelden. Ook zonder actief adres is er een UUID-basis. Bewaar die exact. Klantrechten en huidige pakket-/organisatiegrens blijven gelden.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KlantInname"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:delen"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/klantInnameBeheer.js",
          "server/lib/klantInname.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "post": {
        "operationId": "klantinname_wijzigen",
        "summary": "klantinname wijzigen",
        "description": "Geen queryvelden. Bewuste activering roteert het oude innameadres transactioneel; intrekken zet het uit. Historische ontvangst en huidige toestand apart. Een exacte oude replay roteert nooit opnieuw en draait latere toestand niet terug. Een cyclus inactief-actief-inactief verandert de basis; inactief opnieuw uitzetten verandert die niet; laatst_gebruikt_op wijzigt de basis niet. Conflicten 409/428 vragen opnieuw lezen. Geen modelcredits/providerstart.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ontvangst": {
                      "type": "object",
                      "properties": {
                        "actief": {
                          "type": "boolean"
                        },
                        "basis": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "afgerond_op": {
                          "type": "string",
                          "format": "date-time"
                        }
                      },
                      "required": [
                        "actief",
                        "basis",
                        "afgerond_op"
                      ],
                      "additionalProperties": false
                    },
                    "herhaald": {
                      "type": "boolean"
                    },
                    "huidig": {
                      "$ref": "#/components/schemas/KlantInname"
                    }
                  },
                  "required": [
                    "ontvangst",
                    "herhaald",
                    "huidig"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:delen"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/klantInnameBeheer.js",
          "server/lib/klantInname.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "actief": {
                    "type": "boolean"
                  },
                  "basis": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "actief",
                  "basis",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/opnamewerkplek/mogelijkheden": {
      "get": {
        "operationId": "opnamewerkplek_mogelijkheden",
        "summary": "opnamewerkplek mogelijkheden",
        "description": "Functieoverzicht. melia-1 is meertalig; enhanced biedt woordenlijst, woordzekerheid en stemprofielen. Opslagfunctie moet actief zijn en tabel beschikbaar.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "versie": {
                      "const": "2026-09-30"
                    },
                    "standaard": {
                      "const": "automatisch"
                    },
                    "modellen": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "enum": [
                              "melia-1",
                              "enhanced"
                            ]
                          },
                          "woordtijden": {
                            "const": true
                          },
                          "sprekeronderscheid": {
                            "const": true
                          },
                          "meertalig": {
                            "type": "boolean"
                          },
                          "woordenlijst": {
                            "type": "boolean"
                          },
                          "woordzekerheid": {
                            "type": "boolean"
                          },
                          "stemprofielen": {
                            "type": "boolean"
                          }
                        },
                        "required": [
                          "id",
                          "woordtijden",
                          "sprekeronderscheid",
                          "meertalig",
                          "woordenlijst",
                          "woordzekerheid",
                          "stemprofielen"
                        ],
                        "additionalProperties": false
                      },
                      "minItems": 2,
                      "maxItems": 2
                    }
                  },
                  "required": [
                    "versie",
                    "standaard",
                    "modellen"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_opnamewerkplek_api.js",
          "server/lib/opnames/werkplek.js",
          "server/migrations/337_rapportly_opnamewerkplek.sql",
          "server/migrations/342_rapportly_opname_klantrechten.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/opnamewerkplek/lijst": {
      "get": {
        "operationId": "opnamewerkplek_lijst",
        "summary": "opnamewerkplek lijst",
        "description": "Pagina begint bij0 en heeft100 items; meer bepaalt vervolg. Zoekterm wordt getrimd en letterlijk op titel gezocht. Alleen zichtbare opnames; map verwijst naar gedeelde organisatie-indeling.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "pagina",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100000,
              "default": 0
            }
          },
          {
            "name": "map_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
            }
          },
          {
            "name": "zoek",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 100
            }
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "",
                "bewaard",
                "bezig",
                "klaar",
                "mislukt"
              ]
            }
          },
          {
            "name": "sortering",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "nieuwste",
                "oudste",
                "naam"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "opnames": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "titel": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "bron": {
                            "type": "string"
                          },
                          "status": {
                            "type": "string"
                          },
                          "duur_seconden": {
                            "anyOf": [
                              {
                                "type": "number"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "transcript_taal": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "heeft_audio": {
                            "type": "boolean"
                          },
                          "audio_bytes": {
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": 0
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "audio_verwijderd": {
                            "type": "boolean"
                          },
                          "heeft_transcript": {
                            "type": "boolean"
                          },
                          "gesprek_id": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "klant_id": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "created_at": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "map_id": {
                            "anyOf": [
                              {
                                "type": "string",
                                "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": [
                          "id",
                          "titel",
                          "bron",
                          "status",
                          "duur_seconden",
                          "transcript_taal",
                          "heeft_audio",
                          "audio_bytes",
                          "audio_verwijderd",
                          "gesprek_id",
                          "klant_id",
                          "created_at",
                          "map_id"
                        ],
                        "additionalProperties": false
                      },
                      "maxItems": 100
                    },
                    "meer": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "opnames",
                    "meer"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_opnamewerkplek_api.js",
          "server/lib/opnames/werkplek.js",
          "server/migrations/337_rapportly_opnamewerkplek.sql",
          "server/migrations/342_rapportly_opname_klantrechten.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/opnamewerkplek/mappen": {
      "get": {
        "operationId": "opnamemappen_lijst",
        "summary": "opnamemappen lijst",
        "description": "Broncontract; niet getest en geen productieactivatiebewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "mappen": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
                          },
                          "naam": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 100
                          }
                        },
                        "required": [
                          "id",
                          "naam"
                        ],
                        "additionalProperties": false
                      },
                      "maxItems": 500
                    }
                  },
                  "required": [
                    "mappen"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_opnamewerkplek_api.js",
          "server/lib/opnames/werkplek.js",
          "server/migrations/337_rapportly_opnamewerkplek.sql",
          "server/migrations/342_rapportly_opname_klantrechten.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "post": {
        "operationId": "opnamemap_maken",
        "summary": "opnamemap maken",
        "description": "Canonieke getrimde naam; dubbele naam binnen organisatie geeft409. Geen idempotent ontvangstcontract: na antwoordverlies eerst lijst lezen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "201": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
                    },
                    "naam": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 100
                    }
                  },
                  "required": [
                    "id",
                    "naam"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "opnames:wijzigen"
        ],
        "x-bronnen": [
          "server/rapportly_opnamewerkplek_api.js",
          "server/lib/opnames/werkplek.js",
          "server/migrations/337_rapportly_opnamewerkplek.sql",
          "server/migrations/342_rapportly_opname_klantrechten.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "naam": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100,
                    "pattern": "\\S"
                  }
                },
                "required": [
                  "naam"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/opnamewerkplek/mappen/{id}": {
      "patch": {
        "operationId": "opnamemap_hernoemen",
        "summary": "opnamemap hernoemen",
        "description": "Canonieke getrimde naam; dubbele naam binnen organisatie geeft409. Geen idempotent ontvangstcontract: na antwoordverlies eerst lijst lezen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
                    },
                    "naam": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 100
                    }
                  },
                  "required": [
                    "id",
                    "naam"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "opnames:wijzigen"
        ],
        "x-bronnen": [
          "server/rapportly_opnamewerkplek_api.js",
          "server/lib/opnames/werkplek.js",
          "server/migrations/337_rapportly_opnamewerkplek.sql",
          "server/migrations/342_rapportly_opname_klantrechten.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "naam": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100,
                    "pattern": "\\S"
                  }
                },
                "required": [
                  "naam"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "opnamemap_verwijderen",
        "summary": "opnamemap verwijderen",
        "description": "Verwijdert alleen de mapverwijzing, bewaart opnames. Geldige maar al ontbrekende UUID is ook geslaagd.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "verwijderd": {
                      "const": true
                    },
                    "opnames_behouden": {
                      "const": true
                    }
                  },
                  "required": [
                    "verwijderd",
                    "opnames_behouden"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "opnames:wijzigen"
        ],
        "x-bronnen": [
          "server/rapportly_opnamewerkplek_api.js",
          "server/lib/opnames/werkplek.js",
          "server/migrations/337_rapportly_opnamewerkplek.sql",
          "server/migrations/342_rapportly_opname_klantrechten.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/opnamewerkplek/indeling": {
      "get": {
        "operationId": "opname_indeling",
        "summary": "opname indeling",
        "description": "Maximaal10000 zichtbare opname-mapverwijzingen; geen vervolgcursor.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "indeling": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "opname_id": {
                            "type": "string",
                            "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
                          },
                          "map_id": {
                            "type": "string",
                            "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
                          }
                        },
                        "required": [
                          "opname_id",
                          "map_id"
                        ],
                        "additionalProperties": false
                      },
                      "maxItems": 10000
                    }
                  },
                  "required": [
                    "indeling"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_opnamewerkplek_api.js",
          "server/lib/opnames/werkplek.js",
          "server/migrations/337_rapportly_opnamewerkplek.sql",
          "server/migrations/342_rapportly_opname_klantrechten.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/opnamewerkplek/opnames/{id}": {
      "get": {
        "operationId": "opnamewerkplek_lezen",
        "summary": "opnamewerkplek lezen",
        "description": "Zonder opgeslagen werkplek ontbreken map_id/notitie/opties en is versie0. Transcriptrevisie is onafhankelijk van werkplekversie.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "map_id": {
                      "anyOf": [
                        {
                          "type": "string",
                          "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "notitie": {
                      "type": "string",
                      "maxLength": 20000
                    },
                    "opties": {
                      "$ref": "#/components/schemas/TranscriptieOpties"
                    },
                    "versie": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "eigen": {
                      "type": "boolean"
                    },
                    "transcript_revisie": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "waarschuwingen": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "enum": [
                          "stemprofielen_controleren",
                          "provider_melding"
                        ]
                      }
                    },
                    "model_id": {
                      "type": "string",
                      "enum": [
                        "melia-1",
                        "enhanced"
                      ]
                    }
                  },
                  "required": [
                    "eigen",
                    "versie",
                    "transcript_revisie",
                    "waarschuwingen",
                    "model_id"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_opnamewerkplek_api.js",
          "server/lib/opnames/werkplek.js",
          "server/migrations/337_rapportly_opnamewerkplek.sql",
          "server/migrations/342_rapportly_opname_klantrechten.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "patch": {
        "operationId": "opnamewerkplek_wijzigen",
        "summary": "opnamewerkplek wijzigen",
        "description": "Exacte actuele werkplekversie vereist. Opties alleen door opname-eigenaar in bewaard/mislukt; anders409 opties_vergrendeld. Ook lege patch met versie maakt een nieuwe werkplekversie. Na antwoordverlies eerst lezen, niet automatisch met nieuwe versie herhalen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "map_id": {
                      "anyOf": [
                        {
                          "type": "string",
                          "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "notitie": {
                      "type": "string",
                      "maxLength": 20000
                    },
                    "opties": {
                      "$ref": "#/components/schemas/TranscriptieOpties"
                    },
                    "versie": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "opname_id": {
                      "type": "string",
                      "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
                    },
                    "organization_id": {
                      "type": "string",
                      "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
                    },
                    "bijgewerkt_op": {
                      "type": "string",
                      "format": "date-time"
                    }
                  },
                  "required": [
                    "map_id",
                    "notitie",
                    "opties",
                    "versie",
                    "opname_id",
                    "organization_id",
                    "bijgewerkt_op"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "opnames:wijzigen"
        ],
        "x-bronnen": [
          "server/rapportly_opnamewerkplek_api.js",
          "server/lib/opnames/werkplek.js",
          "server/migrations/337_rapportly_opnamewerkplek.sql",
          "server/migrations/342_rapportly_opname_klantrechten.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "map_id": {
                    "anyOf": [
                      {
                        "type": "string",
                        "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "notitie": {
                    "type": "string",
                    "maxLength": 20000
                  },
                  "opties": {
                    "$ref": "#/components/schemas/TranscriptieOpties"
                  },
                  "versie": {
                    "type": "integer",
                    "minimum": 0
                  }
                },
                "required": [
                  "versie"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/opnamewerkplek/opnames/{id}/revisies": {
      "get": {
        "operationId": "transcriptrevisies_lijst",
        "summary": "transcriptrevisies lijst",
        "description": "Maximaal100 historische transcriptrevisies, nieuwste eerst. Huidige inhoud staat op opname-inhoud.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "huidige_revisie": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "revisies": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "revisie": {
                            "type": "integer",
                            "minimum": 1
                          },
                          "created_at": {
                            "type": "string",
                            "format": "date-time"
                          }
                        },
                        "required": [
                          "revisie",
                          "created_at"
                        ],
                        "additionalProperties": false
                      },
                      "maxItems": 100
                    }
                  },
                  "required": [
                    "huidige_revisie",
                    "revisies"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_opnamewerkplek_api.js",
          "server/lib/opnames/werkplek.js",
          "server/migrations/337_rapportly_opnamewerkplek.sql",
          "server/migrations/342_rapportly_opname_klantrechten.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/opnamewerkplek/opnames/{id}/revisies/{revisie}": {
      "get": {
        "operationId": "transcriptrevisie_lezen",
        "summary": "transcriptrevisie lezen",
        "description": "Historische opgeslagen tekst met oorspronkelijke sprekers/segmenten. Geen herstelmutatie; transcriptcorrectie heeft een eigen huidig-basiscontract.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "revisie",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "revisie": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "transcript": {
                      "type": "string"
                    },
                    "sprekers": {
                      "anyOf": [
                        {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Spreker"
                          }
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "segmenten": {
                      "anyOf": [
                        {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/TranscriptSegment"
                          }
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    }
                  },
                  "required": [
                    "revisie",
                    "transcript",
                    "sprekers",
                    "segmenten",
                    "created_at"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_opnamewerkplek_api.js",
          "server/lib/opnames/werkplek.js",
          "server/migrations/337_rapportly_opnamewerkplek.sql",
          "server/migrations/342_rapportly_opname_klantrechten.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/opnamewerkplek/herstel": {
      "get": {
        "operationId": "opname_herstelmetadata",
        "summary": "opname herstelmetadata",
        "description": "Alleen ID/datum van eigen opnames waarvan gekoppelde klant niet meer leesbaar is. Geeft geen inhoud of klantnaam vrij.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "pagina",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100000,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "opnames": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
                          },
                          "created_at": {
                            "type": "string",
                            "format": "date-time"
                          }
                        },
                        "required": [
                          "id",
                          "created_at"
                        ],
                        "additionalProperties": false
                      },
                      "maxItems": 100
                    },
                    "meer": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "opnames",
                    "meer"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_opnamewerkplek_api.js",
          "server/lib/opnames/werkplek.js",
          "server/migrations/337_rapportly_opnamewerkplek.sql",
          "server/migrations/342_rapportly_opname_klantrechten.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/opnamewerkplek/herstel/{id}/ontkoppelen": {
      "post": {
        "operationId": "opname_herstel_ontkoppelen",
        "summary": "opname herstel ontkoppelen",
        "description": "Ontkoppelt alleen eigen opname met vervallen klanttoegang. Lees hersteloverzicht en opname opnieuw. Geen idempotent ontvangstcontract.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ontkoppeld": {
                      "const": true
                    }
                  },
                  "required": [
                    "ontkoppeld"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "opnames:wijzigen"
        ],
        "x-bronnen": [
          "server/rapportly_opnamewerkplek_api.js",
          "server/lib/opnames/werkplek.js",
          "server/migrations/337_rapportly_opnamewerkplek.sql",
          "server/migrations/342_rapportly_opname_klantrechten.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LegeBody"
              }
            }
          }
        }
      }
    },
    "/v1/opnamewerkplek/voorkeuren": {
      "get": {
        "operationId": "transcriptievoorkeuren_lezen",
        "summary": "transcriptievoorkeuren lezen",
        "description": "Persoonlijke standaardkeuze; zonder opslag automatisch, lege lijsten en versie0.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TranscriptieVoorkeuren"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_stemprofielen_api.js",
          "server/lib/opnames/werkplek.js",
          "server/lib/publiekeApi/stemprofielen.js",
          "server/migrations/338_rapportly_stemprofielen.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "put": {
        "operationId": "transcriptievoorkeuren_wijzigen",
        "summary": "transcriptievoorkeuren wijzigen",
        "description": "Vervangt volledige voorkeur; weggelaten opties worden standaard/leeg. Actuele versie vereist, eerste opslag versie0. Na antwoordverlies lezen; conflict409. Stemproef is geen blijvende voorkeur.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TranscriptieVoorkeuren"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "opnames:wijzigen"
        ],
        "x-bronnen": [
          "server/rapportly_stemprofielen_api.js",
          "server/lib/opnames/werkplek.js",
          "server/lib/publiekeApi/stemprofielen.js",
          "server/migrations/338_rapportly_stemprofielen.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "model": {
                    "type": "string",
                    "enum": [
                      "automatisch",
                      "melia-1",
                      "enhanced"
                    ]
                  },
                  "woordenlijst": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "content": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 100,
                          "pattern": "^(?!.*[\\r\\n\\u0000])(?=.*\\S).*$"
                        },
                        "sounds_like": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 100,
                            "pattern": "^(?!.*[\\r\\n\\u0000])(?=.*\\S).*$"
                          },
                          "maxItems": 4
                        }
                      },
                      "required": [
                        "content"
                      ],
                      "additionalProperties": false
                    },
                    "maxItems": 1000
                  },
                  "stemprofiel_ids": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
                    },
                    "maxItems": 10,
                    "uniqueItems": true
                  },
                  "versie": {
                    "type": "integer",
                    "minimum": 0
                  }
                },
                "required": [
                  "versie"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/stemprofielen": {
      "get": {
        "operationId": "stemprofielen_lijst",
        "summary": "stemprofielen lijst",
        "description": "Eigen of bewust met team gedeelde profielen; geen provideridentifiers, stemproeven of user_id in antwoord.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "toestemming_versie": {
                      "const": "eigen-stem-2026-09-30"
                    },
                    "profielen": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Stemprofiel"
                      },
                      "maxItems": 500
                    }
                  },
                  "required": [
                    "toestemming_versie",
                    "profielen"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_stemprofielen_api.js",
          "server/lib/opnames/werkplek.js",
          "server/lib/publiekeApi/stemprofielen.js",
          "server/migrations/338_rapportly_stemprofielen.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "post": {
        "operationId": "stemprofiel_aanmaken",
        "summary": "stemprofiel aanmaken",
        "description": "Bewuste toestemming voor eigen stem, versie exact overnemen. HTTP201 nieuw,200 herhaald; ontvangst-ID deterministisch voor deze sleutel/opdrachtcode. Verwijderd profiel410 wordt niet opnieuw gemaakt. Registratie maakt nog geen gereed stemprofiel.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
                    },
                    "naam": {
                      "type": "string",
                      "maxLength": 80
                    },
                    "model": {
                      "const": "enhanced"
                    },
                    "actief": {
                      "type": "boolean"
                    },
                    "delen_team": {
                      "type": "boolean"
                    },
                    "proeven": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "bijgewerkt_op": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "eigen": {
                      "type": "boolean"
                    },
                    "herhaald": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "id",
                    "naam",
                    "model",
                    "actief",
                    "delen_team",
                    "proeven",
                    "bijgewerkt_op",
                    "created_at",
                    "eigen",
                    "herhaald"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "201": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
                    },
                    "naam": {
                      "type": "string",
                      "maxLength": 80
                    },
                    "model": {
                      "const": "enhanced"
                    },
                    "actief": {
                      "type": "boolean"
                    },
                    "delen_team": {
                      "type": "boolean"
                    },
                    "proeven": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "bijgewerkt_op": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "eigen": {
                      "type": "boolean"
                    },
                    "herhaald": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "id",
                    "naam",
                    "model",
                    "actief",
                    "delen_team",
                    "proeven",
                    "bijgewerkt_op",
                    "created_at",
                    "eigen",
                    "herhaald"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "opnames:wijzigen"
        ],
        "x-bronnen": [
          "server/rapportly_stemprofielen_api.js",
          "server/lib/opnames/werkplek.js",
          "server/lib/publiekeApi/stemprofielen.js",
          "server/migrations/338_rapportly_stemprofielen.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "naam": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80,
                    "pattern": "^(?!.*[\\r\\n:])(?=.*\\S).*$"
                  },
                  "delen_team": {
                    "type": "boolean"
                  },
                  "toestemming_versie": {
                    "const": "eigen-stem-2026-09-30"
                  },
                  "eigen_stem": {
                    "const": true
                  }
                },
                "required": [
                  "naam",
                  "toestemming_versie",
                  "eigen_stem"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/stemprofielen/{id}": {
      "patch": {
        "operationId": "stemprofiel_wijzigen",
        "summary": "stemprofiel wijzigen",
        "description": "Alleen eigen profiel, huidige If-Match verplicht. Lege patch ververst bijgewerkt_op. Conflict/onzichtbaar geeft409; versie ontbreekt428.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "If-Match",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^\"[0-9]{4}-[0-9]{2}-[0-9]{2}T[^\"\r\n]+\"$",
              "description": "Exact bijgewerkt_op uit huidig profiel, met dubbele aanhalingstekens."
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Stemprofiel"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "opnames:wijzigen"
        ],
        "x-bronnen": [
          "server/rapportly_stemprofielen_api.js",
          "server/lib/opnames/werkplek.js",
          "server/lib/publiekeApi/stemprofielen.js",
          "server/migrations/338_rapportly_stemprofielen.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "naam": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80,
                    "pattern": "^(?!.*[\\r\\n:])(?=.*\\S).*$"
                  },
                  "actief": {
                    "type": "boolean"
                  },
                  "delen_team": {
                    "type": "boolean"
                  }
                },
                "required": [],
                "additionalProperties": false
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "stemprofiel_verwijderen",
        "summary": "stemprofiel verwijderen",
        "description": "Alleen eigen profiel met bewuste bevestiging en huidige If-Match. Reeds verwijderd of gewijzigde basis geeft409.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "If-Match",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^\"[0-9]{4}-[0-9]{2}-[0-9]{2}T[^\"\r\n]+\"$",
              "description": "Exact bijgewerkt_op uit huidig profiel, met dubbele aanhalingstekens."
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "verwijderd": {
                      "const": true
                    }
                  },
                  "required": [
                    "verwijderd"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "opnames:verwijderen"
        ],
        "x-bronnen": [
          "server/rapportly_stemprofielen_api.js",
          "server/lib/opnames/werkplek.js",
          "server/lib/publiekeApi/stemprofielen.js",
          "server/migrations/338_rapportly_stemprofielen.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bevestiging"
              }
            }
          }
        }
      }
    },
    "/v1/klanten/crm-overzicht": {
      "get": {
        "operationId": "crm_overzicht",
        "summary": "crm overzicht",
        "description": "Alle zichtbare CRM-rijen met opvolging. Zonder opgeslagen opvolging is die exact leeg. Geen paginering in huidige handler; databaselezen per200 zichtbare klanten.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "klantId": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "opvolging": {
                            "oneOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "status": {
                                    "type": "string",
                                    "enum": [
                                      "actief",
                                      "wacht_klant",
                                      "wacht_collega",
                                      "afgerond"
                                    ]
                                  },
                                  "volgende": {
                                    "type": "string",
                                    "maxLength": 500
                                  },
                                  "deadline": {
                                    "type": "string",
                                    "maxLength": 10,
                                    "pattern": "^(?:\\d{4}-\\d{2}-\\d{2})?$",
                                    "description": "Leeg of werkelijk bestaande kalenderdatum YYYY-MM-DD."
                                  },
                                  "verantwoordelijke": {
                                    "oneOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                      },
                                      {
                                        "const": ""
                                      }
                                    ]
                                  },
                                  "actiepuntId": {
                                    "oneOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                      },
                                      {
                                        "const": ""
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "status",
                                  "volgende",
                                  "deadline",
                                  "verantwoordelijke",
                                  "actiepuntId"
                                ],
                                "additionalProperties": false
                              },
                              {
                                "type": "object",
                                "properties": {},
                                "required": [],
                                "additionalProperties": false
                              }
                            ]
                          },
                          "bijgewerktOp": {
                            "type": "string",
                            "format": "date-time"
                          }
                        },
                        "required": [
                          "klantId",
                          "opvolging",
                          "bijgewerktOp"
                        ],
                        "additionalProperties": false
                      }
                    },
                    "userId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    }
                  },
                  "required": [
                    "items",
                    "userId"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_klantcrm_api.js",
          "server/lib/klantcrm.js",
          "server/migrations/364_rapportly_klantcrm.sql",
          "server/migrations/366_rapportly_rapportuitvoer_revisies.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/klanten/{id}/crm": {
      "get": {
        "operationId": "crm_lezen",
        "summary": "crm lezen",
        "description": "Nieuwe CRM heeft revisie0 en lege gegevens. Audit maximaal200 nieuwste inhoudsvrije mutaties. Collega’s zijn beperkt tot huidige klantlezers.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "revisie": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "gegevens": {
                      "$ref": "#/components/schemas/CrmGegevens"
                    },
                    "audit": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "actor_id": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "onderdeel": {
                            "type": "string",
                            "enum": [
                              "opvolging",
                              "contactpersonen",
                              "notities",
                              "checklist",
                              "pins",
                              "definitief"
                            ]
                          },
                          "aangemaakt_op": {
                            "type": "string",
                            "format": "date-time"
                          }
                        },
                        "required": [
                          "id",
                          "actor_id",
                          "onderdeel",
                          "aangemaakt_op"
                        ],
                        "additionalProperties": false
                      },
                      "maxItems": 200
                    },
                    "collegas": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "naam": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "id",
                          "naam"
                        ],
                        "additionalProperties": false
                      }
                    },
                    "userId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    }
                  },
                  "required": [
                    "revisie",
                    "gegevens",
                    "audit",
                    "collegas",
                    "userId"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_klantcrm_api.js",
          "server/lib/klantcrm.js",
          "server/migrations/364_rapportly_klantcrm.sql",
          "server/migrations/366_rapportly_rapportuitvoer_revisies.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "put": {
        "operationId": "crm_wijzigen",
        "summary": "crm wijzigen",
        "description": "Canonieke invoer. Vervangt één volledig onderdeel op actuele revisie, maximaal200000 bytes genormaliseerde JSON. Ontbrekende rij-ID’s worden gemaakt; aangeleverde ID’s moeten uniek zijn. Maximaal één hoofdcontact. Checklist ontvangen/gecontroleerd vereist bestaand bestandId. Pins/definitief en actiepunt moeten bij deze zichtbare klant horen; verantwoordelijke moet klant mogen lezen. Notitie-auteur/datum komen uit server en bestaand auteurschap blijft. Verloren antwoord: eerst lezen; geen idempotente ontvangst of blind replay.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "revisie": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "gegevens": {
                      "$ref": "#/components/schemas/CrmGegevens"
                    },
                    "bijgewerktOp": {
                      "type": "string",
                      "format": "date-time"
                    }
                  },
                  "required": [
                    "revisie",
                    "gegevens",
                    "bijgewerktOp"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:beheren"
        ],
        "x-bronnen": [
          "server/rapportly_klantcrm_api.js",
          "server/lib/klantcrm.js",
          "server/migrations/364_rapportly_klantcrm.sql",
          "server/migrations/366_rapportly_rapportuitvoer_revisies.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "revisie": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "onderdeel": {
                        "const": "opvolging"
                      },
                      "waarde": {
                        "type": "object",
                        "properties": {
                          "status": {
                            "type": "string",
                            "enum": [
                              "actief",
                              "wacht_klant",
                              "wacht_collega",
                              "afgerond"
                            ]
                          },
                          "volgende": {
                            "type": "string",
                            "maxLength": 500
                          },
                          "deadline": {
                            "type": "string",
                            "maxLength": 10,
                            "pattern": "^(?:\\d{4}-\\d{2}-\\d{2})?$",
                            "description": "Leeg of werkelijk bestaande kalenderdatum YYYY-MM-DD."
                          },
                          "verantwoordelijke": {
                            "oneOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              },
                              {
                                "const": ""
                              }
                            ]
                          },
                          "actiepuntId": {
                            "oneOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              },
                              {
                                "const": ""
                              }
                            ]
                          }
                        },
                        "required": [
                          "status"
                        ],
                        "additionalProperties": false
                      }
                    },
                    "required": [
                      "revisie",
                      "onderdeel",
                      "waarde"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "revisie": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "onderdeel": {
                        "const": "contactpersonen"
                      },
                      "waarde": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                            },
                            "naam": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 150,
                              "pattern": "\\S"
                            },
                            "rol": {
                              "type": "string",
                              "maxLength": 100
                            },
                            "email": {
                              "type": "string",
                              "maxLength": 254,
                              "pattern": "^(?:[^\\s@]+@[^\\s@]+\\.[^\\s@]+)?$"
                            },
                            "telefoon": {
                              "type": "string",
                              "maxLength": 50
                            },
                            "hoofdcontact": {
                              "type": "boolean"
                            }
                          },
                          "required": [
                            "naam"
                          ],
                          "additionalProperties": false
                        },
                        "maxItems": 30
                      }
                    },
                    "required": [
                      "revisie",
                      "onderdeel",
                      "waarde"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "revisie": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "onderdeel": {
                        "const": "notities"
                      },
                      "waarde": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                            },
                            "titel": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 150,
                              "pattern": "\\S"
                            },
                            "tekst": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 5000,
                              "pattern": "\\S"
                            },
                            "contactmoment": {
                              "type": "boolean"
                            }
                          },
                          "required": [
                            "titel",
                            "tekst"
                          ],
                          "additionalProperties": false
                        },
                        "maxItems": 200
                      }
                    },
                    "required": [
                      "revisie",
                      "onderdeel",
                      "waarde"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "revisie": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "onderdeel": {
                        "const": "checklist"
                      },
                      "waarde": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                            },
                            "titel": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 150,
                              "pattern": "\\S"
                            },
                            "status": {
                              "type": "string",
                              "enum": [
                                "gevraagd",
                                "ontvangen",
                                "gecontroleerd"
                              ]
                            },
                            "bestandId": {
                              "oneOf": [
                                {
                                  "type": "string",
                                  "format": "uuid",
                                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                },
                                {
                                  "const": ""
                                }
                              ]
                            }
                          },
                          "required": [
                            "titel",
                            "status"
                          ],
                          "additionalProperties": false
                        },
                        "maxItems": 100
                      }
                    },
                    "required": [
                      "revisie",
                      "onderdeel",
                      "waarde"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "revisie": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "onderdeel": {
                        "const": "pins"
                      },
                      "waarde": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                            },
                            "itemId": {
                              "type": "string",
                              "pattern": "^(?:bestand|versie|opname|gesprek|notitie)-[0-9a-fA-F-]{36}$"
                            }
                          },
                          "required": [
                            "itemId"
                          ],
                          "additionalProperties": false
                        },
                        "maxItems": 30
                      }
                    },
                    "required": [
                      "revisie",
                      "onderdeel",
                      "waarde"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "revisie": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "onderdeel": {
                        "const": "definitief"
                      },
                      "waarde": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                            },
                            "itemId": {
                              "type": "string",
                              "pattern": "^versie-[0-9a-fA-F-]{36}$"
                            }
                          },
                          "required": [
                            "itemId"
                          ],
                          "additionalProperties": false
                        },
                        "maxItems": 100
                      }
                    },
                    "required": [
                      "revisie",
                      "onderdeel",
                      "waarde"
                    ],
                    "additionalProperties": false
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/v1/klanten/{id}/zoeken": {
      "get": {
        "operationId": "klantinhoud_zoeken",
        "summary": "klantinhoud zoeken",
        "description": "Getrimde zoekterm2–200,30 resultaten; vervolgoffset +30. Resultaatpad is een interne verwijzing, geen publieke downloadautorisatie. Alleen actuele geïndexeerde bronpaden, klant- en bronrechten blijven gelden.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 2,
              "maxLength": 200
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 5000,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string"
                          },
                          "categorie": {
                            "type": "string",
                            "enum": [
                              "gesprekken",
                              "opnames",
                              "mail",
                              "bestanden",
                              "powerpoint",
                              "offertes",
                              "rapporten",
                              "notities"
                            ]
                          },
                          "titel": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "datum": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "pad": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "bestand_pad": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "pagina": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "fragment": {
                            "type": "string",
                            "maxLength": 500
                          }
                        },
                        "required": [
                          "id",
                          "categorie",
                          "titel",
                          "datum",
                          "pad",
                          "bestand_pad",
                          "pagina",
                          "fragment"
                        ],
                        "additionalProperties": false
                      },
                      "maxItems": 30
                    },
                    "meer": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "items",
                    "meer"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_klantcrm_api.js",
          "server/lib/klantcrm.js",
          "server/migrations/364_rapportly_klantcrm.sql",
          "server/migrations/366_rapportly_rapportuitvoer_revisies.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/klanten/{id}/zoekbestanden": {
      "get": {
        "operationId": "klantzoekbestanden_lijst",
        "summary": "klantzoekbestanden lijst",
        "description": "Indexstatus van zichtbare bronbestanden en afgeronde rapportbestanden; vervangen bronpad wordt wacht.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "soort": {
                            "type": "string",
                            "enum": [
                              "bestand",
                              "versie"
                            ]
                          },
                          "naam": {
                            "type": "string"
                          },
                          "status": {
                            "type": "string",
                            "enum": [
                              "wacht",
                              "bezig",
                              "klaar",
                              "mislukt",
                              "onleesbaar"
                            ]
                          }
                        },
                        "required": [
                          "id",
                          "soort",
                          "naam",
                          "status"
                        ],
                        "additionalProperties": false
                      }
                    }
                  },
                  "required": [
                    "items"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_klantcrm_api.js",
          "server/lib/klantcrm.js",
          "server/migrations/364_rapportly_klantcrm.sql",
          "server/migrations/366_rapportly_rapportuitvoer_revisies.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/klanten/{id}/zoekbestanden/{bestandId}": {
      "post": {
        "operationId": "klantzoekbestand_verwerken",
        "summary": "klantzoekbestand verwerken",
        "description": "Modelvrije zoekextractie, maximaal20MiB per bron, twee parallel per proces, workerlimiet60s. Bestaande bron en lease bepalen herhaling; recente bezige lease blijft bezig. HTTP200 kan wacht/bezig/mislukt/onleesbaar zijn. Bij bronwijziging wordt oud resultaat niet gepubliceerd. Geen OCR-belofte voor gescande documenten.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "bestandId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string",
                      "enum": [
                        "wacht",
                        "bezig",
                        "klaar",
                        "mislukt",
                        "onleesbaar"
                      ]
                    }
                  },
                  "required": [
                    "status"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:beheren"
        ],
        "x-bronnen": [
          "server/rapportly_klantcrm_api.js",
          "server/lib/klantcrm.js",
          "server/migrations/364_rapportly_klantcrm.sql",
          "server/migrations/366_rapportly_rapportuitvoer_revisies.sql",
          "server/lib/klantzoekbestanden.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "soort": {
                    "type": "string",
                    "enum": [
                      "bestand",
                      "versie"
                    ]
                  }
                },
                "required": [
                  "soort"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/klanten/{id}/toegang": {
      "get": {
        "operationId": "klanttoegang_lezen",
        "summary": "klanttoegang lezen",
        "description": "Huidige toegang plus wijzigmogelijkheid. Alleen eigenaar kan wijzigen; organisatie-eigenaar mag een oude teammap zonder eigenaar claimen. Collegalijst blijft leeg zonder wijzigrecht.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "scope": {
                      "type": "string",
                      "enum": [
                        "team",
                        "geselecteerd",
                        "prive"
                      ]
                    },
                    "eigenaarUserId": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "collegaIds": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      "maxItems": 200,
                      "uniqueItems": true
                    },
                    "revisie": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "kanWijzigen": {
                      "type": "boolean"
                    },
                    "collegas": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "naam": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": [
                          "id",
                          "naam"
                        ],
                        "additionalProperties": false
                      }
                    }
                  },
                  "required": [
                    "scope",
                    "eigenaarUserId",
                    "collegaIds",
                    "revisie",
                    "kanWijzigen",
                    "collegas"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_klantrechten_api.js",
          "server/lib/klantrechten.js",
          "server/migrations/343_rapportly_klantrechten_conflict.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "put": {
        "operationId": "klanttoegang_wijzigen",
        "summary": "klanttoegang wijzigen",
        "description": "Volledige keuze met actuele revisie. Geselecteerd vereist minstens één andere toegestane collega; team/prive vereisen geen andere collega. Duplicaten/eigen actor worden genormaliseerd. Alleen eigenaar, conflict409. Geen idempotente ontvangst: na antwoordverlies opnieuw lezen en herbeoordelen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "scope": {
                      "type": "string",
                      "enum": [
                        "team",
                        "geselecteerd",
                        "prive"
                      ]
                    },
                    "eigenaarUserId": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "collegaIds": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      "maxItems": 200,
                      "uniqueItems": true
                    },
                    "revisie": {
                      "type": "integer",
                      "minimum": 1
                    }
                  },
                  "required": [
                    "scope",
                    "eigenaarUserId",
                    "collegaIds",
                    "revisie"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:delen"
        ],
        "x-bronnen": [
          "server/rapportly_klantrechten_api.js",
          "server/lib/klantrechten.js",
          "server/migrations/343_rapportly_klantrechten_conflict.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "scope": {
                    "type": "string",
                    "enum": [
                      "team",
                      "geselecteerd",
                      "prive"
                    ]
                  },
                  "collegaIds": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "maxItems": 200
                  },
                  "revisie": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 9007199254740991
                  }
                },
                "required": [
                  "scope",
                  "collegaIds",
                  "revisie"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/klantmappen/koppel": {
      "post": {
        "operationId": "bron_aan_klantmap_koppelen",
        "summary": "bron aan klantmap koppelen",
        "description": "Canonieke invoer: precies één bestaande klant_id of naam. Naam wordt getrimd/afgekapt150, leesbare actieve exacte naam wordt hergebruikt. Geen opslagverplaatsing. Bron eerst controleren; herkoppelen vereist recht op oude klant. Gesprek erft alleen lege bronkoppelingen. Werkdossierborgen kan afzonderlijk falen terwijl hoofdverbinding geslaagd is (dossier_id:null). Geen atomaire ontvangst of idempotentiegarantie; na fout/antwoordverlies lezen vóór hervatten.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "klant": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "naam": {
                          "type": "string"
                        },
                        "aangemaakt": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "id",
                        "naam",
                        "aangemaakt"
                      ],
                      "additionalProperties": false
                    },
                    "item": {
                      "type": "object",
                      "properties": {
                        "soort": {
                          "type": "string",
                          "enum": [
                            "opname",
                            "gesprek",
                            "dossier"
                          ]
                        },
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "klant_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "kolom": {
                          "type": "string",
                          "enum": [
                            "klant_id",
                            "rapportly_klant_id"
                          ]
                        }
                      },
                      "required": [
                        "soort",
                        "id",
                        "klant_id",
                        "kolom"
                      ],
                      "additionalProperties": false
                    },
                    "dossier_id": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "bronnen_geerfd": {
                      "type": "integer",
                      "minimum": 0
                    }
                  },
                  "required": [
                    "klant",
                    "item",
                    "dossier_id",
                    "bronnen_geerfd"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:beheren"
        ],
        "x-bronnen": [
          "server/rapportly_koppel_api.js",
          "server/lib/bronnen/koppeling.js",
          "server/lib/klantrechten.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "item": {
                        "type": "object",
                        "properties": {
                          "soort": {
                            "type": "string",
                            "enum": [
                              "opname",
                              "gesprek",
                              "dossier"
                            ]
                          },
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          }
                        },
                        "required": [
                          "soort",
                          "id"
                        ],
                        "additionalProperties": false
                      },
                      "klant_id": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      }
                    },
                    "required": [
                      "item",
                      "klant_id"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "item": {
                        "type": "object",
                        "properties": {
                          "soort": {
                            "type": "string",
                            "enum": [
                              "opname",
                              "gesprek",
                              "dossier"
                            ]
                          },
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          }
                        },
                        "required": [
                          "soort",
                          "id"
                        ],
                        "additionalProperties": false
                      },
                      "klant_naam": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 150,
                        "pattern": "\\S"
                      }
                    },
                    "required": [
                      "item",
                      "klant_naam"
                    ],
                    "additionalProperties": false
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/v1/rapporten/{versieId}/voorkeuren": {
      "get": {
        "operationId": "rapportvoorkeur_lezen",
        "summary": "rapportvoorkeur lezen",
        "description": "Persoonlijke voorkeur per stijlprofiel van deze rapportversie, of standaard bij geen profiel. ETag staat in JSON, letterlijk als If-Match terugsturen. Lege/getrimd lege tekst wist voorkeur. Gehele voorkeurenkaart maximaal100000 tekens. Ontbrekende of oude If-Match409. Huidige rapporttekst wordt hierdoor niet herschreven.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "versieId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "tekst": {
                      "type": "string",
                      "maxLength": 2000
                    },
                    "etag": {
                      "type": "string",
                      "pattern": "^\"[a-f0-9]{64}\"$"
                    },
                    "profielGebonden": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "tekst",
                    "etag",
                    "profielGebonden"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/rapportVoorkeuren.js",
          "server/lib/publiekeApi/acties.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "put": {
        "operationId": "rapportvoorkeur_wijzigen",
        "summary": "rapportvoorkeur wijzigen",
        "description": "Persoonlijke voorkeur per stijlprofiel van deze rapportversie, of standaard bij geen profiel. ETag staat in JSON, letterlijk als If-Match terugsturen. Lege/getrimd lege tekst wist voorkeur. Gehele voorkeurenkaart maximaal100000 tekens. Ontbrekende of oude If-Match409. Huidige rapporttekst wordt hierdoor niet herschreven.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "If-Match",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^\"[a-f0-9]{64}\"$"
            }
          },
          {
            "name": "versieId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "tekst": {
                      "type": "string",
                      "maxLength": 2000
                    },
                    "etag": {
                      "type": "string",
                      "pattern": "^\"[a-f0-9]{64}\"$"
                    },
                    "profielGebonden": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "tekst",
                    "etag",
                    "profielGebonden"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "documenten:wijzigen"
        ],
        "x-bronnen": [
          "server/lib/rapportVoorkeuren.js",
          "server/lib/publiekeApi/acties.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "tekst": {
                    "type": "string",
                    "maxLength": 2000
                  }
                },
                "required": [
                  "tekst"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/klanten/{id}/aanleverlinks": {
      "get": {
        "operationId": "aanleverlinks_lijst",
        "summary": "aanleverlinks lijst",
        "description": "Alleen genoemde queryvelden. Bevat metadata, nooit linktoken/URL. Maximaal limiet items; geen meer-vlag. Offset begrensd10000. Aanleverlinks per klant, deellinks per verplichte versie_id.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "limiet",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 30
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "links": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "aangemaakt_op": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "verloopt_op": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "ingetrokken_op": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "aantal_aanleveringen": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "aantal_bytes": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "laatst_gebruikt_op": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": [
                          "id",
                          "aangemaakt_op",
                          "verloopt_op",
                          "ingetrokken_op",
                          "aantal_aanleveringen",
                          "aantal_bytes",
                          "laatst_gebruikt_op"
                        ],
                        "additionalProperties": false
                      },
                      "maxItems": 100
                    },
                    "pagina": {
                      "type": "object",
                      "properties": {
                        "limiet": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 100
                        },
                        "offset": {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 10000
                        }
                      },
                      "required": [
                        "limiet",
                        "offset"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "links",
                    "pagina"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/links.js",
          "server/rapportly_aanleverlink_api.js",
          "server/rapportly_deel_api.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "post": {
        "operationId": "aanleverlink_aanmaken",
        "summary": "aanleverlink aanmaken",
        "description": "Bewuste toegangslink, geen mailverzending. Dagen7/14/30, standaard14. Sleutelgebonden exact herhaalbaar, nieuwe201 of herhaald200. Zelfde opdrachtcode met andere doel/dagen of vervangen sleutelgeheim409. Herhaling van verlopen/ingetrokken link geeft huidige metadata zonder nieuw token/URL en verlengt niets. Aanlevering vereist huidige Pro+-pakketpoort; deellink vereist zichtbare rapport-PDF. Aanleverlinkacceptatie bewijst niet dat de link nog ruimte heeft: lees gebruiksmetadata. Niet automatisch naar derden sturen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LinkOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "201": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LinkOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:delen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/links.js",
          "server/rapportly_aanleverlink_api.js",
          "server/rapportly_deel_api.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "dagen": {
                    "type": "integer",
                    "enum": [
                      7,
                      14,
                      30
                    ],
                    "default": 14
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/aanleverlinks/{id}": {
      "delete": {
        "operationId": "aanleverlink_intrekken",
        "summary": "aanleverlink intrekken",
        "description": "Bewuste intrekking van zichtbare bestaande link. Reeds ingetrokken geeft404. Geen nieuwe link en geen automatische vervolgactie. Dit verandert geen andere gedeelde links.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Ok"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:delen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/links.js",
          "server/rapportly_aanleverlink_api.js",
          "server/rapportly_deel_api.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bevestiging"
              }
            }
          }
        }
      }
    },
    "/v1/deel-links": {
      "get": {
        "operationId": "deellinks_lijst",
        "summary": "deellinks lijst",
        "description": "Alleen genoemde queryvelden. Bevat metadata, nooit linktoken/URL. Maximaal limiet items; geen meer-vlag. Offset begrensd10000. Aanleverlinks per klant, deellinks per verplichte versie_id.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "versie_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "limiet",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 30
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "links": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "aangemaakt_op": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "verloopt_op": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "ingetrokken_op": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "bekeken_aantal": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "laatst_bekeken_op": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": [
                          "id",
                          "aangemaakt_op",
                          "verloopt_op",
                          "ingetrokken_op",
                          "bekeken_aantal",
                          "laatst_bekeken_op"
                        ],
                        "additionalProperties": false
                      },
                      "maxItems": 100
                    },
                    "pagina": {
                      "type": "object",
                      "properties": {
                        "limiet": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 100
                        },
                        "offset": {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 10000
                        }
                      },
                      "required": [
                        "limiet",
                        "offset"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "links",
                    "pagina"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/links.js",
          "server/rapportly_aanleverlink_api.js",
          "server/rapportly_deel_api.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "post": {
        "operationId": "deellink_aanmaken",
        "summary": "deellink aanmaken",
        "description": "Bewuste toegangslink, geen mailverzending. Dagen7/14/30, standaard14. Sleutelgebonden exact herhaalbaar, nieuwe201 of herhaald200. Zelfde opdrachtcode met andere doel/dagen of vervangen sleutelgeheim409. Herhaling van verlopen/ingetrokken link geeft huidige metadata zonder nieuw token/URL en verlengt niets. Aanlevering vereist huidige Pro+-pakketpoort; deellink vereist zichtbare rapport-PDF. Aanleverlinkacceptatie bewijst niet dat de link nog ruimte heeft: lees gebruiksmetadata. Niet automatisch naar derden sturen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LinkOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "201": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LinkOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:delen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/links.js",
          "server/rapportly_aanleverlink_api.js",
          "server/rapportly_deel_api.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "versie_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "dagen": {
                    "type": "integer",
                    "enum": [
                      7,
                      14,
                      30
                    ],
                    "default": 14
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "versie_id",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/deel-links/{id}": {
      "delete": {
        "operationId": "deellink_intrekken",
        "summary": "deellink intrekken",
        "description": "Bewuste intrekking van zichtbare bestaande link. Reeds ingetrokken geeft404. Geen nieuwe link en geen automatische vervolgactie. Dit verandert geen andere gedeelde links.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Ok"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:delen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/links.js",
          "server/rapportly_aanleverlink_api.js",
          "server/rapportly_deel_api.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bevestiging"
              }
            }
          }
        }
      }
    },
    "/v1/klanten/{id}/briefing": {
      "get": {
        "operationId": "briefing_lezen",
        "summary": "briefing lezen",
        "description": "Alleen taal als query. Leest huidige Amsterdamse kalenderdag per actor/klant/taal; geen betekent geen huidige niet-verlopen aanvraag. Interne controle_nodig wordt openbaar mislukt. Andere dagresultaten niet via deze route opvragen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "taal",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^(?:auto|[a-z]{2,3}(?:-[a-z]{2})?)?$",
              "description": "Canonieke taal; lege/ontbrekende waarde wordt nl. Server trimt en normaliseert hoofdletters."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "status": {
                          "type": "string",
                          "enum": [
                            "geen",
                            "bezig"
                          ]
                        }
                      },
                      "required": [
                        "status"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "status": {
                          "const": "klaar"
                        },
                        "briefing": {
                          "$ref": "#/components/schemas/Briefing"
                        }
                      },
                      "required": [
                        "status",
                        "briefing"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "status": {
                          "const": "mislukt"
                        },
                        "fout": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "status",
                        "fout"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/briefing.js",
          "server/jobs/briefingJobs.js",
          "server/jobs/handlers/briefingJob.js",
          "server/lib/briefing.js",
          "server/lib/taal.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "post": {
        "operationId": "briefing_start",
        "summary": "briefing start",
        "description": "Duurzame betaalde API-variant, huidige expliciete Amsterdamse dag verplicht; oude dag409. Zelfde sleutel/klant/taal/dag/opdrachtcode met andere vernieuwen409. Nieuwe run202, gereed dagcache200. vernieuwen:true is bewuste nieuwe generatie, geen automatische herstelkeuze. Lees huidige status na antwoordverlies. Alleen bij vrijgegeven privacy en werkelijke API-kostenmodus; dagcap standaard40, configureerbaar. Leeg dossier409. Raceantwoord202 kan klaar/controle_nodig zonder resultaat bevatten; lees dan GET.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "const": "klaar"
                    },
                    "briefing": {
                      "$ref": "#/components/schemas/Briefing"
                    }
                  },
                  "required": [
                    "status",
                    "briefing"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "202": {
            "description": "Bezig, mislukte herhaling of terminale race-uitkomst; lees GET voor actuele inhoud.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string",
                      "enum": [
                        "bezig",
                        "mislukt",
                        "klaar",
                        "controle_nodig"
                      ]
                    }
                  },
                  "required": [
                    "status"
                  ],
                  "additionalProperties": false
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/briefing.js",
          "server/jobs/briefingJobs.js",
          "server/jobs/handlers/briefingJob.js",
          "server/lib/briefing.js",
          "server/lib/taal.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "dag": {
                    "type": "string",
                    "format": "date"
                  },
                  "taal": {
                    "type": "string",
                    "pattern": "^(?:auto|[a-z]{2,3}(?:-[a-z]{2})?)?$",
                    "description": "Canonieke taal; lege/ontbrekende waarde wordt nl. Server trimt en normaliseert hoofdletters."
                  },
                  "vernieuwen": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "dag"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/klanten/{id}/verwijdercontrole": {
      "get": {
        "operationId": "klant_definitieve_verwijdercontrole",
        "summary": "klant definitieve verwijdercontrole",
        "description": "Beheerder leest huidig verwijderplan zonder opslagmanifest/paden. Klant-, bron-, bewaarplicht- en lopendeverwerkinggrenzen blijven gelden. Dit is een controle, nog geen verwijdering.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "klant": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "naam": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "id",
                        "naam"
                      ],
                      "additionalProperties": false
                    },
                    "fingerprint": {
                      "type": "string",
                      "pattern": "^[a-f0-9]{64}$"
                    },
                    "kanVerwijderen": {
                      "type": "boolean"
                    },
                    "aantallen": {
                      "type": "object",
                      "properties": {
                        "concepten": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "rapporten": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "rapportversies": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "gesprekken": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "opnames": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "brondocumenten": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "reacties": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "bestanden": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "concepten",
                        "rapporten",
                        "rapportversies",
                        "gesprekken",
                        "opnames",
                        "brondocumenten",
                        "reacties",
                        "bestanden"
                      ],
                      "additionalProperties": false
                    },
                    "blokkades": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "code": {
                            "type": "string"
                          },
                          "aantal": {
                            "type": "integer",
                            "minimum": 0
                          }
                        },
                        "required": [
                          "code",
                          "aantal"
                        ],
                        "additionalProperties": false
                      }
                    }
                  },
                  "required": [
                    "klant",
                    "fingerprint",
                    "kanVerwijderen",
                    "aantallen",
                    "blokkades"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:verwijderen"
        ],
        "x-bronnen": [
          "server/rapportly_klantverwijdering_api.js",
          "server/lib/klantverwijdering.js",
          "server/migrations/260_rapportly_klantverwijdering.sql",
          "server/migrations/261_rapportly_klantverwijdering_servicerol.sql",
          "server/migrations/367_rapportly_briefing_verwijderplan.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/klanten/{id}/definitief-verwijderen": {
      "post": {
        "operationId": "klant_definitief_verwijderen",
        "summary": "klant definitief verwijderen",
        "description": "Destructieve beheerderactie: exact gelezen klantnaam en actuele fingerprint, kanVerwijderen vereist. SQL-verwijdering transactioneel; opslagopruiming kan doorlopen (202). Zelfde klant/fingerprint/naam herhaalt bestaande verwijdering; andere fingerprint409. Verouderd plan opnieuw lezen en bewust bevestigen.200 betekent status verwijderd. Niet opgenomen als uitvoerbaar collectievoorbeeld.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "verwijdering": {
                      "$ref": "#/components/schemas/Klantverwijdering"
                    }
                  },
                  "required": [
                    "verwijdering"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "verwijdering": {
                      "$ref": "#/components/schemas/Klantverwijdering"
                    }
                  },
                  "required": [
                    "verwijdering"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:verwijderen"
        ],
        "x-bronnen": [
          "server/rapportly_klantverwijdering_api.js",
          "server/lib/klantverwijdering.js",
          "server/migrations/260_rapportly_klantverwijdering.sql",
          "server/migrations/261_rapportly_klantverwijdering_servicerol.sql",
          "server/migrations/367_rapportly_briefing_verwijderplan.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "bevestigd": {
                    "const": true
                  },
                  "klantnaam": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 150,
                    "pattern": "\\S"
                  },
                  "fingerprint": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  }
                },
                "required": [
                  "bevestigd",
                  "klantnaam",
                  "fingerprint"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/klantverwijderingen/{id}": {
      "get": {
        "operationId": "klantverwijdering_status",
        "summary": "klantverwijdering status",
        "description": "Beheerder leest duurzame opruimstatus zonder opslagpaden. Acceptatie202 bewijst geen volledige opslagopruiming.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "verwijdering": {
                      "$ref": "#/components/schemas/Klantverwijdering"
                    }
                  },
                  "required": [
                    "verwijdering"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:verwijderen"
        ],
        "x-bronnen": [
          "server/rapportly_klantverwijdering_api.js",
          "server/lib/klantverwijdering.js",
          "server/migrations/260_rapportly_klantverwijdering.sql",
          "server/migrations/261_rapportly_klantverwijdering_servicerol.sql",
          "server/migrations/367_rapportly_briefing_verwijderplan.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/stijlprofielen/{id}/bronstatus": {
      "get": {
        "operationId": "stijlbron_status",
        "summary": "stijlbron status",
        "description": "Geen queryvelden. Actieve klassieke stijlbron, eigen/teamzichtbaar volgens huidige rechten. Metadata zonder inhoud/opslagpad. basis bindt huidige profiel-/bron-/laatstejobtoestand. maker vereist zowel created_by als eigenaar; teamleider kan niet namens een andere maker starten. OCR-functie moet beschikbaar zijn.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "basis": {
                      "type": "string",
                      "pattern": "^[a-f0-9]{64}$"
                    },
                    "status": {
                      "type": "string"
                    },
                    "ocr_status": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "actieve_versie_id": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "ocr_keuze_nodig": {
                      "anyOf": [
                        {
                          "type": "boolean"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "maker": {
                      "anyOf": [
                        {
                          "type": "boolean"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "laatste_job": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "status": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "foutcode": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "id",
                        "status",
                        "foutcode"
                      ],
                      "additionalProperties": false
                    },
                    "bronnen": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "titel": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "mime": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": [
                          "id",
                          "titel",
                          "mime"
                        ],
                        "additionalProperties": false
                      }
                    }
                  },
                  "required": [
                    "basis",
                    "status",
                    "ocr_status",
                    "actieve_versie_id",
                    "ocr_keuze_nodig",
                    "maker",
                    "laatste_job",
                    "bronnen"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:bronnen_lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlocr.js",
          "server/lib/publiekeApi/stijlherstel.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/stijlprofielen/{id}/ocr-schattingen/{aanvraagId}": {
      "get": {
        "operationId": "stijlocr_schattingstatus",
        "summary": "stijlocr schattingstatus",
        "description": "Geen queryvelden. Alleen eigen sleutel/actor/organisatie. Vijftien minuten geldig; claim twee minuten. Onzeker is geen toestemming om automatisch opnieuw providercontact te maken. Deze ontvangst heeft nog geen betaalde OCR-verwerking gestart.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "aanvraagId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StijlOcrSchatting"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:uitgebreid_lezen",
          "stijlen:bronnen_lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlocr.js",
          "server/lib/publiekeApi/stijlherstel.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/stijlprofielen/{id}/ocr-schattingen": {
      "post": {
        "operationId": "stijlocr_schatting",
        "summary": "stijlocr schatting",
        "description": "Geen queryvelden. Eigen maker, actuele basis en native OCR-keuze vereist. Expliciet providercontact voor PDF-tokenraming: privacycontrole blijft verplicht423. Hoogstens10 niet-verlopen schattingen per profiel. Model/actuele prijs en persoonlijke kostenberekening bepalen raming; geen vaste prijs.200 bij complete raming,202 bij nog lopende/onzekere/verlopen ontvangst. Exacte herhaling veroorzaakt geen nieuwe telling. Andere basis met dezelfde code409. Geen betaalde extractie gestart.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "basis": {
                      "type": "string",
                      "pattern": "^[a-f0-9]{64}$"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "verwerken",
                        "onzeker",
                        "klaar",
                        "verlopen"
                      ]
                    },
                    "credits_geschat": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 1
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "model": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "prijs_id": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "aangemaakt_op": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "verloopt_op": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "afgerond_op": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "verwerking_gestart": {
                      "const": false
                    },
                    "statusUrl": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "basis",
                    "status",
                    "credits_geschat",
                    "model",
                    "prijs_id",
                    "aangemaakt_op",
                    "verloopt_op",
                    "afgerond_op",
                    "verwerking_gestart",
                    "statusUrl"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "basis": {
                      "type": "string",
                      "pattern": "^[a-f0-9]{64}$"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "verwerken",
                        "onzeker",
                        "klaar",
                        "verlopen"
                      ]
                    },
                    "credits_geschat": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 1
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "model": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "prijs_id": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "aangemaakt_op": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "verloopt_op": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "afgerond_op": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "verwerking_gestart": {
                      "const": false
                    },
                    "statusUrl": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "basis",
                    "status",
                    "credits_geschat",
                    "model",
                    "prijs_id",
                    "aangemaakt_op",
                    "verloopt_op",
                    "afgerond_op",
                    "verwerking_gestart",
                    "statusUrl"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:uitgebreid_lezen",
          "stijlen:bronnen_lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlocr.js",
          "server/lib/publiekeApi/stijlherstel.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/lib/stijlprofielVisionPrijs.js",
          "server/lib/persoonlijkeApiCredits.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "basis",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/stijlprofielen/{id}/herstelopdrachten/{aanvraagId}": {
      "get": {
        "operationId": "stijlherstel_status",
        "summary": "stijlherstel status",
        "description": "Geen queryvelden. Eigen ontvangst, laatste eraan gebonden native job en huidige profielstatus. basis is de oorspronkelijke ontvangstbasis, geen nieuwe huidige bronbasis. Jobacceptatie/succeeded is geen bewijs dat een documentstijl actief/gepubliceerd is: controle/goedkeuring kan nog nodig zijn.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "aanvraagId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StijlHerstelOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:bronnen_lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlocr.js",
          "server/lib/publiekeApi/stijlherstel.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/stijlprofielen/{id}/herstellen": {
      "post": {
        "operationId": "stijl_herstel_start",
        "summary": "stijl herstel start",
        "description": "Geen queryvelden. Alleen huidige maker én eigenaar, mislukte actieve bron zonder actieve stijlversie en1–3 eigen organisatievoorbeelden. Herstel vereist terminale dead-job met herstelbare native fout; OCR vereist expliciete OCR-keuze en verse complete eigen schatting bij dezelfde basis/bytes. Rapport/offerte/presentatie/email/gespreksverslag/anders gebruiken eigen native producer en publicatie.202 nieuwe ontvangst met statusUrl;200 exacte oude ontvangst zonder bronherdownload of nieuwe job. Credits via actuele native persoonlijke providerkosten; worker kan hogere nieuwe raming weigeren. Huidige delegatie/bron/lease blijft bij retry/publicatie gelden.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StijlHerstelOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "202": {
            "description": "Nieuwe verwerking ontvangen; voltooiing en publicatie afzonderlijk lezen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "operatie": {
                      "type": "string",
                      "enum": [
                        "herstel",
                        "ocr"
                      ]
                    },
                    "job_id": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "job_status": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "status": {
                      "type": "string"
                    },
                    "ocr_status": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "actieve_versie_id": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "basis": {
                      "type": "string",
                      "pattern": "^[a-f0-9]{64}$"
                    },
                    "aangemaakt_op": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "verwerking_gestart": {
                      "const": true
                    },
                    "statusUrl": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "operatie",
                    "job_id",
                    "job_status",
                    "status",
                    "ocr_status",
                    "actieve_versie_id",
                    "basis",
                    "aangemaakt_op",
                    "verwerking_gestart",
                    "statusUrl"
                  ],
                  "additionalProperties": false
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:herstellen",
          "stijlen:bronnen_lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlocr.js",
          "server/lib/publiekeApi/stijlherstel.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "basis",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/stijlprofielen/{id}/uitgebreid-lezen": {
      "post": {
        "operationId": "stijl_ocr_start",
        "summary": "stijl ocr start",
        "description": "Geen queryvelden. Alleen huidige maker én eigenaar, mislukte actieve bron zonder actieve stijlversie en1–3 eigen organisatievoorbeelden. Herstel vereist terminale dead-job met herstelbare native fout; OCR vereist expliciete OCR-keuze en verse complete eigen schatting bij dezelfde basis/bytes. Rapport/offerte/presentatie/email/gespreksverslag/anders gebruiken eigen native producer en publicatie.202 nieuwe ontvangst met statusUrl;200 exacte oude ontvangst zonder bronherdownload of nieuwe job. Credits via actuele native persoonlijke providerkosten; worker kan hogere nieuwe raming weigeren. Huidige delegatie/bron/lease blijft bij retry/publicatie gelden.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StijlHerstelOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "202": {
            "description": "Nieuwe verwerking ontvangen; voltooiing en publicatie afzonderlijk lezen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "operatie": {
                      "type": "string",
                      "enum": [
                        "herstel",
                        "ocr"
                      ]
                    },
                    "job_id": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "job_status": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "status": {
                      "type": "string"
                    },
                    "ocr_status": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "actieve_versie_id": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "basis": {
                      "type": "string",
                      "pattern": "^[a-f0-9]{64}$"
                    },
                    "aangemaakt_op": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "verwerking_gestart": {
                      "const": true
                    },
                    "statusUrl": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "operatie",
                    "job_id",
                    "job_status",
                    "status",
                    "ocr_status",
                    "actieve_versie_id",
                    "basis",
                    "aangemaakt_op",
                    "verwerking_gestart",
                    "statusUrl"
                  ],
                  "additionalProperties": false
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:uitgebreid_lezen",
          "stijlen:bronnen_lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlocr.js",
          "server/lib/publiekeApi/stijlherstel.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  },
                  "bevestigd": {
                    "const": true
                  },
                  "schatting_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  }
                },
                "required": [
                  "basis",
                  "bevestigd",
                  "schatting_id"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/gesprekken/{id}/mail/voorbeeld": {
      "post": {
        "operationId": "mail_voorbeeld",
        "summary": "mail voorbeeld",
        "description": "Volledige-APIcontract met versiecontrole:true. Alleen lezen, geen wachtrij of verzending. Standaard klantmail; vrije mailtekst is daarbij verboden. basis is voor beide soorten optioneel bij preview, maar moet indien opgegeven exact actueel zijn. Followup kan een inline mailbewerking met basis gebruiken, behalve bij een taalvariant. De gekozen klantmail/followup heeft een eigen outboxidentiteit. Voorbeeld leest huidige afzender en exacte bytes van maximaal100 unieke bijlagen samen15MiB; ontbrekende afzender/bytes geeft fout en geen ongecontroleerd voorbeeld. Lees in dat geval de afzonderlijke outboxstatus voor bestaand herstel. Bewaar mailsoort, basis, hash en exacte aanvraag. Hash bindt actor/organisatie/gesprek/basis, taalvariant, ontvanger/bcc, provider/modus/kanaal, onderwerp/body, afzender en bijlagebytes. Preview mag na verlopen proefperiode beschikbaar blijven; mag_verzenden/send_capable vervangen geen actuele goedkeuringspoorten.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GecontroleerdMailVoorbeeld"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/mailGoedkeuring.js",
          "server/lib/publiekeApi/mail.js",
          "server/lib/actiepuntMutaties.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke inputsubset: optionele genegeerde review_hash/bevestigd bij preview en niet-canonieke taal-/emailnormalisatie zijn niet als aanbevolen invoer beschreven."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "ontvanger": {
                        "type": "string",
                        "format": "email"
                      },
                      "language": {
                        "type": "string",
                        "pattern": "^[a-z]{2,3}$",
                        "description": "Concrete beschikbare taalvariant. Geen automatische generatie bij goedkeuren."
                      },
                      "mailsoort": {
                        "const": "klantmail"
                      },
                      "basis": {
                        "type": "string",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$",
                        "description": "Exacte basis uit het actuele voorbeeld; de aanvraagcontrole beperkt niet tot één UUID-versie."
                      }
                    },
                    "required": [],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "ontvanger": {
                        "type": "string",
                        "format": "email"
                      },
                      "language": {
                        "type": "string",
                        "pattern": "^[a-z]{2,3}$",
                        "description": "Concrete beschikbare taalvariant. Geen automatische generatie bij goedkeuren."
                      },
                      "mailsoort": {
                        "const": "followup"
                      },
                      "basis": {
                        "type": "string",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$",
                        "description": "Exacte basis uit het actuele voorbeeld; de aanvraagcontrole beperkt niet tot één UUID-versie."
                      },
                      "mail": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 20000,
                        "pattern": "^(?!.*\\u0000)(?=[\\s\\S]*\\S)[\\s\\S]*$"
                      }
                    },
                    "required": [
                      "mailsoort"
                    ],
                    "additionalProperties": false,
                    "dependentRequired": {
                      "mail": [
                        "basis"
                      ]
                    }
                  }
                ]
              }
            }
          }
        },
        "x-bronref": "48512877"
      }
    },
    "/v1/gesprekken/{id}/mail/goedkeuren": {
      "post": {
        "operationId": "mail_goedkeuren",
        "summary": "mail goedkeuren",
        "description": "Voor klantmail én followup zijn basis, review_hash en bevestigd:true verplicht. Geen Idempotency-Keycontract. Eerste klantmail accepteert geen vrije mailtekst; kies de opgeslagen bron of bestaande customerEmail-taalvariant. Exacte retry bindt sleutel, mailsoort, basis, mail/ontvanger/taal en review_hash en geeft dezelfde outbox-ID met huidige status en reeds_in_wachtrij:true, zonder wacht_tot. Nieuwe goedkeuring bevat wacht_tot. SQL vergrendelt huidige actor/sleutel/organisatie/klant/gesprek/bron. Verouderde basis, afzender, vertaling, bijlagen of inhoud409 vereist nieuw voorbeeld en akkoord. Eerste en followup gebruiken afzonderlijke ontvangsten; bestaande verzonden/lopende/poging-/providerconceptrijen worden niet opnieuw aangeboden. Alleen nooit aangeboden ongecontroleerde wacht_op_review/geannuleerd-rijen kunnen een nieuwe snapshot krijgen. Snapshot blijft onveranderlijk. Voor iedere providerpoging worden delegatie, object, afzender en exacte bijlagebytes hercontroleerd. Huidige pakket-/proefperiodepoorten blijven gelden. queued/sent/reeds_in_wachtrij en200 zijn geen afleverbewijs; onzeker verlangt expliciete herstelkeuze en zo nodig dubbelrisico.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "outbox_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "status": {
                      "type": "string"
                    },
                    "wacht_tot": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "reeds_in_wachtrij": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "outbox_id",
                    "status",
                    "reeds_in_wachtrij"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "berichten:verzenden"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/mailGoedkeuring.js",
          "server/lib/publiekeApi/mail.js",
          "server/lib/actiepuntMutaties.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke taal-/emailinput. Een exacte historische retry wordt vóór nieuwe bronselectie gelezen; ruimere historische normalisatie is geen aanbevolen nieuw verzoek."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "ontvanger": {
                        "type": "string",
                        "format": "email"
                      },
                      "language": {
                        "type": "string",
                        "pattern": "^[a-z]{2,3}$",
                        "description": "Concrete beschikbare taalvariant. Geen automatische generatie bij goedkeuren."
                      },
                      "mailsoort": {
                        "const": "klantmail"
                      },
                      "basis": {
                        "type": "string",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$",
                        "description": "Exacte basis uit het actuele voorbeeld; de aanvraagcontrole beperkt niet tot één UUID-versie."
                      },
                      "review_hash": {
                        "type": "string",
                        "pattern": "^[a-f0-9]{64}$"
                      },
                      "bevestigd": {
                        "const": true
                      }
                    },
                    "required": [
                      "basis",
                      "review_hash",
                      "bevestigd"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "ontvanger": {
                        "type": "string",
                        "format": "email"
                      },
                      "language": {
                        "type": "string",
                        "pattern": "^[a-z]{2,3}$",
                        "description": "Concrete beschikbare taalvariant. Geen automatische generatie bij goedkeuren."
                      },
                      "mailsoort": {
                        "const": "followup"
                      },
                      "basis": {
                        "type": "string",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$",
                        "description": "Exacte basis uit het actuele voorbeeld; de aanvraagcontrole beperkt niet tot één UUID-versie."
                      },
                      "mail": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 20000,
                        "pattern": "^(?!.*\\u0000)(?=[\\s\\S]*\\S)[\\s\\S]*$"
                      },
                      "review_hash": {
                        "type": "string",
                        "pattern": "^[a-f0-9]{64}$"
                      },
                      "bevestigd": {
                        "const": true
                      }
                    },
                    "required": [
                      "mailsoort",
                      "basis",
                      "review_hash",
                      "bevestigd"
                    ],
                    "additionalProperties": false
                  }
                ]
              }
            }
          }
        },
        "x-bronref": "48512877"
      }
    },
    "/v1/mail-outbox": {
      "get": {
        "operationId": "mail_outbox_status",
        "summary": "mail outbox status",
        "description": "Maximaal100 recente zichtbare berichten; geen querypaginering in handler. Geen ontvanger/body_snapshot in antwoord. Bezorg/open/klikvelden kunnen ontbreken bij oudere schemas. API-leesfout503. Geaccepteerde Gmail/M365-MIME-aanroep en sent bewijzen geen aflevering; handmatig_bevestigd is een menselijke keuze. Directe_status onzeker verhindert automatische herverzending.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "beschikbaar": {
                      "const": true
                    },
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "gesprek_id": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "provider": {
                            "type": "string",
                            "enum": [
                              "gmail",
                              "m365",
                              "resend"
                            ]
                          },
                          "kanaal": {
                            "type": "string",
                            "enum": [
                              "mailbox",
                              "domein"
                            ]
                          },
                          "modus": {
                            "type": "string"
                          },
                          "status": {
                            "type": "string"
                          },
                          "onderwerp": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "poging": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "max_pogingen": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "volgende_poging_op": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "laatste_fout": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "aangemaakt_op": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "updated_at": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "verzonden_op": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "directe_status": {
                            "anyOf": [
                              {
                                "type": "string",
                                "enum": [
                                  "onzeker",
                                  "geaccepteerd",
                                  "handmatig_bevestigd",
                                  "gestopt"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "directe_poging": {
                            "anyOf": [
                              {
                                "type": "string",
                                "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "directe_gestart_op": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "gesprek_titel": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "bezorgd_op": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "geopend_op": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "geklikt_op": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": [
                          "id",
                          "gesprek_id",
                          "provider",
                          "kanaal",
                          "modus",
                          "status",
                          "onderwerp",
                          "poging",
                          "max_pogingen",
                          "volgende_poging_op",
                          "laatste_fout",
                          "aangemaakt_op",
                          "updated_at",
                          "verzonden_op",
                          "directe_status",
                          "directe_poging",
                          "directe_gestart_op",
                          "gesprek_titel"
                        ],
                        "additionalProperties": false
                      },
                      "maxItems": 100
                    }
                  },
                  "required": [
                    "beschikbaar",
                    "items"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/mailGoedkeuring.js",
          "server/lib/publiekeApi/mail.js",
          "server/lib/actiepuntMutaties.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/mail-outbox/{outboxId}/herstel": {
      "post": {
        "operationId": "mail_direct_herstellen",
        "summary": "mail direct herstellen",
        "description": "Eigen gecontroleerde mailboxopdracht, huidige poging_id, onzeker en minimaal vijf minuten oud. Stoppen annuleert; als_verzonden markeert handmatig sent zonder bezorgbewijs; opnieuw zet queued en vereist expliciet dubbelrisico:true. Zelfde poging+actie herhaalt zonder nieuwe actie, andere keuze409. Na proefperiode alleen stoppen/als_verzonden; opnieuw vereist geldig betaald vervolg en anders402. Alle overige sleutel/object/actorrechten blijven gelden.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "outboxId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "status": {
                      "type": "string"
                    },
                    "directe_status": {
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "onzeker",
                            "geaccepteerd",
                            "handmatig_bevestigd",
                            "gestopt"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "herhaald": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "id",
                    "status",
                    "directe_status",
                    "herhaald"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "berichten:verzenden"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/mailGoedkeuring.js",
          "server/lib/publiekeApi/mail.js",
          "server/lib/actiepuntMutaties.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/tenant.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "poging_id": {
                        "type": "string",
                        "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
                      },
                      "actie": {
                        "type": "string",
                        "enum": [
                          "stoppen",
                          "als_verzonden"
                        ]
                      },
                      "bevestigd": {
                        "const": true
                      },
                      "dubbelrisico": {
                        "type": "boolean"
                      }
                    },
                    "required": [
                      "poging_id",
                      "actie",
                      "bevestigd"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "poging_id": {
                        "type": "string",
                        "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
                      },
                      "actie": {
                        "const": "opnieuw"
                      },
                      "bevestigd": {
                        "const": true
                      },
                      "dubbelrisico": {
                        "const": true
                      }
                    },
                    "required": [
                      "poging_id",
                      "actie",
                      "bevestigd",
                      "dubbelrisico"
                    ],
                    "additionalProperties": false
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/v1/stijlprofielen/{id}/template-navigatie": {
      "get": {
        "operationId": "klassieke_stijl_controle_navigatie",
        "summary": "klassieke stijl controle navigatie",
        "description": "Uitsluitend blauwe controlemarkeringen in geverifieerde PDF; geen tekstherkenning. Rechthoek bevat relatieve x/y/breedte/hoogte (0–1); pagina begint bij1. Boven500paginas lege vakken en begrensd:true; maximaal2000vakken. Controlebasis ontbreekt409, onbetrouwbare preview503. opslagSleutel is een cache-identiteit (organisatie:actor:profiel:controlehash), geen storagepad of downloadrecht. Huidige toegang blijft vereist; interne cache5min.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "documentSha256": {
                      "type": "string",
                      "pattern": "^[a-f0-9]{64}$"
                    },
                    "paginaAantal": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "vakken": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "pagina": {
                            "type": "integer",
                            "minimum": 1
                          },
                          "rechthoek": {
                            "type": "array",
                            "items": {
                              "type": "number",
                              "minimum": 0,
                              "maximum": 1
                            },
                            "minItems": 4,
                            "maxItems": 4
                          }
                        },
                        "required": [
                          "pagina",
                          "rechthoek"
                        ],
                        "additionalProperties": false
                      },
                      "maxItems": 2000
                    },
                    "begrensd": {
                      "type": "boolean"
                    },
                    "controleSha256": {
                      "type": "string",
                      "pattern": "^[a-f0-9]{64}$"
                    },
                    "opslagSleutel": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "documentSha256",
                    "paginaAantal",
                    "vakken",
                    "begrensd",
                    "controleSha256",
                    "opslagSleutel"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/templateNavigatie.js",
          "server/lib/formulierControleNavigatie.js",
          "server/lib/publiekeApi/stijlcontrole.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/stijlprofielen/{id}": {
      "get": {
        "operationId": "stijlmetadata_lezen",
        "summary": "stijlmetadata lezen",
        "description": "Actieve eigen of teamzichtbare klassieke stijl; ETag over exact gelezen metadata. Mutatie vereist huidige hash en eigenaar/teamgovernance. Naamcanoniek getrimd1–100. Persoonlijke stijl kan geen teamstandaard zijn; teampublicatie vereist bevoegdheid. DELETE deactiveert en vereist bevestigd:true; inactieve stijl is daarna404. Geen generieke idempotentiegarantie; na antwoordverlies eerst huidige toestand lezen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "stijlprofiel": {
                      "$ref": "#/components/schemas/StijlMetadata"
                    }
                  },
                  "required": [
                    "stijlprofiel"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[a-f0-9]{64}\"$"
                },
                "description": "Huidige metadatahash inclusief intern organisatiescope; letterlijk bewaren."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlmetadata.js",
          "server/lib/teamGovernance.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "patch": {
        "operationId": "stijlmetadata_wijzigen",
        "summary": "stijlmetadata wijzigen",
        "description": "Actieve eigen of teamzichtbare klassieke stijl; ETag over exact gelezen metadata. Mutatie vereist huidige hash en eigenaar/teamgovernance. Naamcanoniek getrimd1–100. Persoonlijke stijl kan geen teamstandaard zijn; teampublicatie vereist bevoegdheid. DELETE deactiveert en vereist bevestigd:true; inactieve stijl is daarna404. Geen generieke idempotentiegarantie; na antwoordverlies eerst huidige toestand lezen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "If-Match",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^\"[a-f0-9]{64}\"$"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    },
                    "stijlprofiel": {
                      "$ref": "#/components/schemas/StijlMetadata"
                    }
                  },
                  "required": [
                    "ok",
                    "stijlprofiel"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[a-f0-9]{64}\"$"
                },
                "description": "Huidige metadatahash inclusief intern organisatiescope; letterlijk bewaren."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlmetadata.js",
          "server/lib/teamGovernance.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "naam": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100,
                    "pattern": "\\S"
                  },
                  "is_standaard": {
                    "type": "boolean"
                  },
                  "deling_scope": {
                    "type": "string",
                    "enum": [
                      "persoonlijk",
                      "team"
                    ]
                  }
                },
                "required": [],
                "additionalProperties": false,
                "minProperties": 1
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "stijlmetadata_deactiveren",
        "summary": "stijlmetadata deactiveren",
        "description": "Actieve eigen of teamzichtbare klassieke stijl; ETag over exact gelezen metadata. Mutatie vereist huidige hash en eigenaar/teamgovernance. Naamcanoniek getrimd1–100. Persoonlijke stijl kan geen teamstandaard zijn; teampublicatie vereist bevoegdheid. DELETE deactiveert en vereist bevestigd:true; inactieve stijl is daarna404. Geen generieke idempotentiegarantie; na antwoordverlies eerst huidige toestand lezen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "If-Match",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^\"[a-f0-9]{64}\"$"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    },
                    "stijlprofiel": {
                      "$ref": "#/components/schemas/StijlMetadata"
                    }
                  },
                  "required": [
                    "ok",
                    "stijlprofiel"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[a-f0-9]{64}\"$"
                },
                "description": "Huidige metadatahash inclusief intern organisatiescope; letterlijk bewaren."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlmetadata.js",
          "server/lib/teamGovernance.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bevestiging"
              }
            }
          }
        }
      }
    },
    "/v1/stijlprofielen": {
      "post": {
        "operationId": "klassieke_stijl_upload",
        "summary": "klassieke stijl upload",
        "description": "1–3 bestanden, naam per bestand maximaal180 tekens, oorspronkelijke niet-lege bytes. Niet-presentatie maximaal20MiB per bestand (pdf/docx/doc/txt/md); rapport begint met DOCX/PDF. Presentatie maximaal50MiB per bestand: pptx/potx/ppsx/pptm/potm/ppsm/ppt/pot/pps/odp/otp/png/jpg/jpeg/webp plus pdf/docx; aanvullende txt/md/doc vallen onder huidige toegestane tekstset maar eerste bestand moet presentatie/PDF/DOCX zijn. Keynote geweigerd. Magicbytes en veilige Word/PowerPoint-sanering vóór opslag. Compleet origineel manifest (bytes/namen/volgorde/metadata) bindt retry.202 nieuwe volledige ontvangst,200 herhaald. Een incomplete upload heeft nog geen profiel/job en kan30dagen exact hervat worden; verlopen/verwijderd410, andere invoer409. Persoonlijke opslag/kostenmodus en native privacy/planlimiet/teamrechten vóór verwerking. Ontvangen betekent geen goedgekeurde stijl.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "opdracht_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "status": {
                      "type": "string"
                    },
                    "ontvangen": {
                      "const": true
                    },
                    "herhaald": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "id",
                    "opdracht_id",
                    "status",
                    "ontvangen",
                    "herhaald"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "opdracht_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "status": {
                      "type": "string"
                    },
                    "ontvangen": {
                      "const": true
                    },
                    "herhaald": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "id",
                    "opdracht_id",
                    "status",
                    "ontvangen",
                    "herhaald"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/publiekeApi/stijlupload.js",
          "server/lib/voorbeeldProfielBronnen.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "naam": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100,
                    "pattern": "\\S"
                  },
                  "soort": {
                    "type": "string",
                    "enum": [
                      "rapport",
                      "email",
                      "gespreksverslag",
                      "offerte",
                      "presentatie"
                    ]
                  },
                  "deling_scope": {
                    "type": "string",
                    "enum": [
                      "persoonlijk",
                      "team"
                    ]
                  },
                  "bevestigd": {
                    "type": "string",
                    "const": "true"
                  },
                  "bestanden": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "minItems": 1,
                    "maxItems": 3
                  }
                },
                "required": [
                  "naam",
                  "soort",
                  "deling_scope",
                  "bevestigd",
                  "bestanden"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/stijlprofiel-uploads/{id}": {
      "get": {
        "operationId": "klassieke_stijlupload_status",
        "summary": "klassieke stijlupload status",
        "description": "Alleen oorspronkelijke sleutel/actor/organisatie. Zonder ontvangst status upload_onvolledig of verlopen en herhalen_tot. Na volledige ontvangst huidige actieve profielstatus, zonder herhalen_tot. Verwijderd profiel410. Antwoord kan na mislukte upload worden opgevraagd met opdracht_id uit foutantwoord.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "status": {
                      "type": "string"
                    },
                    "ontvangen": {
                      "type": "boolean"
                    },
                    "aangemaakt_op": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "herhalen_tot": {
                      "type": "string",
                      "format": "date-time"
                    }
                  },
                  "required": [
                    "id",
                    "status",
                    "ontvangen",
                    "aangemaakt_op"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/publiekeApi/stijlupload.js",
          "server/lib/voorbeeldProfielBronnen.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/stijlprofielen/startcontrole": {
      "post": {
        "operationId": "stijl_startcontrole",
        "summary": "stijl startcontrole",
        "description": "Controleert huidige persoonlijke/team-, pakket-, privacy- en modelgereedheid, zonder verwerking te starten. deling_scope standaard persoonlijk. bron_type docx of presentatie/extensie activeert passende extra startcontrole; overige waarden gebruiken basiscontrole. Succes geen ontvangst, quote of gereserveerd budget. Catalogus registreert deze POST als wijzigactie, dus proefperiode-schrijfpoort blijft gelden.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "gereed": {
                      "const": true
                    }
                  },
                  "required": [
                    "gereed"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/publiekeApi/stijlcontrole.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "deling_scope": {
                    "type": "string",
                    "enum": [
                      "persoonlijk",
                      "team"
                    ]
                  },
                  "bron_type": {
                    "type": "string"
                  }
                },
                "required": [],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/stijlprofielen/aanvragen/{aanvraagId}": {
      "get": {
        "operationId": "klassieke_native_stijlaanvraag_lezen",
        "summary": "klassieke native stijlaanvraag lezen",
        "description": "Bestaande native UUIDv4-aanvraag, huidige actor/organisatie. Een profielrij alleen bevestigt ontvangst niet: gereed/controle_nodig of passende actorjob vereist. Kan via andere bevoegde sleutel van dezelfde actor gelezen worden. Nieuwe API-upload gebruikt eigen deterministische UUIDv5 en aparte /stijlprofiel-uploads-route.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "aanvraagId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-4[a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "status": {
                      "type": "string"
                    },
                    "ontvangst_bevestigd": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "id",
                    "status",
                    "ontvangst_bevestigd"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/stijlprofielAanvraag.js",
          "server/lib/publiekeApi/stijlcontrole.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/documenten": {
      "get": {
        "operationId": "documentenbank_lijst",
        "summary": "documentenbank lijst",
        "description": "Actieve documenten van eigen organisatie, nieuwste eerst. Handler verzamelt alle interne paginas; geen publieke limiet/offset/cursor. status betreft verrijking en is geen downloadvoorwaarde. Leesfout409 documentenbank niet beschikbaar; lege lijst is alleen geslaagde lege read. Dit contract ontsluit geen documentenbankupload of deactivering via de API.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "documenten": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "naam": {
                            "type": "string"
                          },
                          "omschrijving": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "trefwoorden": {
                            "anyOf": [
                              {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "mime": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "grootte_bytes": {
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": 0
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "status": {
                            "type": "string"
                          },
                          "created_at": {
                            "type": "string",
                            "format": "date-time"
                          }
                        },
                        "required": [
                          "id",
                          "naam",
                          "omschrijving",
                          "trefwoorden",
                          "mime",
                          "grootte_bytes",
                          "status",
                          "created_at"
                        ],
                        "additionalProperties": false
                      }
                    }
                  },
                  "required": [
                    "documenten"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/migrations/126_rapportly_documenten.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/documenten/{id}/download": {
      "get": {
        "operationId": "documentenbank_download",
        "summary": "documentenbank download",
        "description": "Kortlevende signedURL, geldig300seconden; zelf downloaden, geen HTTP-redirect. Huidige organisatie moet eigenaar zijn. Ook inactieve documenten blijven downloadbaar voor verwijzingen in oudere gespreksbundels. Ontbrekend bestand404, onbetrouwbare ondertekening500. URL bevat tijdelijke bevoegdheid: niet loggen of als blijvende link bewaren.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "naam": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "url",
                    "naam"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/migrations/126_rapportly_documenten.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/bedrijfsgegevens": {
      "get": {
        "operationId": "bedrijf_leesmodel",
        "summary": "bedrijf leesmodel",
        "description": "Bestaand leesmodel zonder revisiebasis. Ontbrekende velden null. Offertevelden hebben best-effort nullterugval; basis-/brancheleesfout500. Voor wijzigingen het afzonderlijke /account/bedrijfsgegevens-contract met revisiebasis gebruiken.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "contactpersoon": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "adres": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "postcode": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "plaats": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "telefoon": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "website": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "kvk_nummer": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "offerte_prefix": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "offerte_betalingscondities": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "branche": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "offerte_volgnummer": {
                      "anyOf": [
                        {
                          "type": "number"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "offerte_geldigheid_dagen": {
                      "anyOf": [
                        {
                          "type": "number"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "offerte_btw_pct": {
                      "anyOf": [
                        {
                          "type": "number"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "contactpersoon",
                    "adres",
                    "postcode",
                    "plaats",
                    "telefoon",
                    "website",
                    "kvk_nummer",
                    "offerte_prefix",
                    "offerte_betalingscondities",
                    "branche",
                    "offerte_volgnummer",
                    "offerte_geldigheid_dagen",
                    "offerte_btw_pct"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/publiekeApi/acties.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/instellingen/taal": {
      "get": {
        "operationId": "kantoorstandaard_taal",
        "summary": "kantoorstandaard taal",
        "description": "Kantoorstandaard uitvoertaal. Historische route valt bij leesfout terug op nl;200 bewijst hier geen geslaagde instellingenread. Geen schermtaal.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "taal": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "taal"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/publiekeApi/acties.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/instellingen/uitvoertalen": {
      "get": {
        "operationId": "kantoorstandaard_uitvoertalen",
        "summary": "kantoorstandaard uitvoertalen",
        "description": "Primair beleid, optionele tweede uitvoertaal en actuele technische beschikbaarheid. Een voorkeur maakt de tweede uitvoertaal niet vanzelf beschikbaar.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "primaryDefault": {
                      "type": "string"
                    },
                    "secondary": {
                      "type": "object",
                      "properties": {
                        "enabled": {
                          "type": "boolean"
                        },
                        "defaultLanguage": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "enabled",
                        "defaultLanguage"
                      ],
                      "additionalProperties": false
                    },
                    "capability": {
                      "type": "object",
                      "properties": {
                        "available": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "available"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "primaryDefault",
                    "secondary",
                    "capability"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/publiekeApi/acties.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/saldo": {
      "get": {
        "operationId": "account_saldo",
        "summary": "account saldo",
        "description": "Persoonlijk saldo in actieve persoonlijke kostenmodus bij betaald plan; anders organisatie-/legacycredits. Persoonlijke velden alleen in persoonlijke modus. Geen dagcap is null. Historische kolomleesfout kan naar legacycreditbron terugvallen. Sleutelbudget, creditsaldo en definitief activiteitverbruik zijn afzonderlijke grenzen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "credits": {
                      "type": "number"
                    },
                    "plan": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "vandaag": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "dagcap": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 0
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "organizationId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "offerte_maker": {
                      "type": "boolean"
                    },
                    "creditmodus": {
                      "const": "persoonlijke_api_kosten"
                    },
                    "persoonlijk": {
                      "const": true
                    },
                    "pool": {
                      "const": false
                    },
                    "maandcredits": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "gereserveerd": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "verbruikt": {
                      "type": "integer",
                      "minimum": 0
                    }
                  },
                  "required": [
                    "credits",
                    "plan",
                    "vandaag",
                    "dagcap",
                    "organizationId",
                    "offerte_maker"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "gebruik:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/persoonlijkeApiCredits.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/opslag": {
      "get": {
        "operationId": "account_opslag",
        "summary": "account opslag",
        "description": "private,no-store. Organisatiequotum of scope:persoon. Persoonlijke onvolledige toerekening geeft gebruikt/beschikbaar null, geen nulgebruik; toerekening_gereed kan ook door historische organisatie-uitbreiding/override false zijn. Bytes zijn decimaal (1GB=1000000000). Uitbreidingsbedragen zijn huidig broncontract, geen bestelling of betaalbevestiging.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "pakket": {
                          "type": "string"
                        },
                        "basis_bytes": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "extra_bytes": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "limiet_bytes": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "gebruikt_bytes": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "beschikbaar_bytes": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "automatisch_beschikbaar": {
                          "type": "boolean"
                        },
                        "uitbreidingen": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "gb": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "bytes": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "prijs_cents_maand": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "prijs_cents_jaar": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "jaar_korting_pct": {
                                "const": 15
                              }
                            },
                            "required": [
                              "gb",
                              "bytes",
                              "prijs_cents_maand",
                              "prijs_cents_jaar",
                              "jaar_korting_pct"
                            ],
                            "additionalProperties": false
                          }
                        }
                      },
                      "required": [
                        "pakket",
                        "basis_bytes",
                        "extra_bytes",
                        "limiet_bytes",
                        "gebruikt_bytes",
                        "beschikbaar_bytes",
                        "automatisch_beschikbaar",
                        "uitbreidingen"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "pakket": {
                          "type": "string"
                        },
                        "basis_bytes": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "extra_bytes": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "limiet_bytes": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "gebruikt_bytes": {
                          "anyOf": [
                            {
                              "type": "integer",
                              "minimum": 0
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "beschikbaar_bytes": {
                          "anyOf": [
                            {
                              "type": "integer",
                              "minimum": 0
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "scope": {
                          "const": "persoon"
                        },
                        "interval": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "toerekening_gereed": {
                          "type": "boolean"
                        },
                        "onbekende_objecten": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "organisatieuitbreiding_aanwezig": {
                          "type": "boolean"
                        },
                        "automatisch_beschikbaar": {
                          "type": "boolean"
                        },
                        "uitbreidingen": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "gb": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "bytes": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "prijs_cents_maand": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "prijs_cents_jaar": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "jaar_korting_pct": {
                                "const": 15
                              }
                            },
                            "required": [
                              "gb",
                              "bytes",
                              "prijs_cents_maand",
                              "prijs_cents_jaar",
                              "jaar_korting_pct"
                            ],
                            "additionalProperties": false
                          }
                        }
                      },
                      "required": [
                        "pakket",
                        "basis_bytes",
                        "extra_bytes",
                        "limiet_bytes",
                        "gebruikt_bytes",
                        "beschikbaar_bytes",
                        "scope",
                        "interval",
                        "toerekening_gereed",
                        "onbekende_objecten",
                        "organisatieuitbreiding_aanwezig",
                        "automatisch_beschikbaar",
                        "uitbreidingen"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "gebruik:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/opslagQuota.js",
          "server/migrations/246_rapportly_opslagquota_supabase_kosten.sql",
          "server/migrations/296_rapportly_persoonlijke_opslag.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/credits/runs/{runRef}": {
      "get": {
        "operationId": "persoonlijke_runcredits",
        "summary": "persoonlijke runcredits",
        "description": "Alleen eigen actor en organisatie; persoonlijke kostenmodus vereist. Geen calls of uitgeschakelde modus404. totaal=definitief+veilig_gereserveerd; afgerond betekent calls>0 en geen openreservering, niet dat het productresultaat geslaagd is. Deze historische run-RPC rondt geaggregeerde werkelijke kosten af; het maandoverzicht telt exacte afgeschreven ledgercredits. Geen modelnaam, providerprijs of inhoud.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "runRef",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "creditmodus": {
                      "const": "persoonlijke_api_kosten"
                    },
                    "persoonlijk": {
                      "const": true
                    },
                    "run_ref": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "definitief": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "veilig_gereserveerd": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "vrijgegeven": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "totaal": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "foutacties": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "calls": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "afgerond": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "creditmodus",
                    "persoonlijk",
                    "run_ref",
                    "definitief",
                    "veilig_gereserveerd",
                    "vrijgegeven",
                    "totaal",
                    "foutacties",
                    "calls",
                    "afgerond"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "gebruik:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/persoonlijkeApiCredits.js",
          "server/migrations/210_rapportly_persoonlijke_api_kostencredits.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/credits/afmaakmeldingen": {
      "get": {
        "operationId": "persoonlijke_afmaakmeldingen",
        "summary": "persoonlijke afmaakmeldingen",
        "description": "Hoogstens20 eigen geslaagde jobs met bewezen intern gedekte foutkosten uit laatste7dagen; inhoudsvrije melding. Persoonlijke creditmodus uit geeft lege lijst. Onbetrouwbare read503. Bevestigt geen levering of ontvangst door derden.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "meldingen": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "code": {
                            "const": "creditlimiet_opgevangen"
                          },
                          "internGedekt": {
                            "const": true
                          },
                          "onderdeel": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": [
                          "id",
                          "code",
                          "internGedekt",
                          "onderdeel"
                        ],
                        "additionalProperties": false
                      },
                      "maxItems": 20
                    }
                  },
                  "required": [
                    "meldingen"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "gebruik:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/publiekeApi/acties.js",
          "server/migrations/316_rapportly_creditcontinuiteit.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/credits/verbruik": {
      "get": {
        "operationId": "persoonlijk_maandverbruik",
        "summary": "persoonlijk maandverbruik",
        "description": "private,no-store; standaard huidige UTC-maand. Exacte afgeschreven ledgercredits gegroepeerd op run, geen nieuwe afronding per call. Venster op reserveringsdatum; maximaal20000API- en20000audioregels, te groot/onvolledig503. Voorschotten openstaand is actueel totaal, aflossingen geselecteerde maand; voorgeschoten/openstaand op activiteit alleen indien aanwezig. Uitgeschakelde persoonlijke modus404, verkeerde actor403, ongeldige maand400.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "maand",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^20\\d{2}-(0[1-9]|1[0-2])$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "maand": {
                      "type": "string",
                      "pattern": "^20\\d{2}-(0[1-9]|1[0-2])$"
                    },
                    "tijdzone": {
                      "const": "UTC"
                    },
                    "persoonlijk": {
                      "const": true
                    },
                    "creditmodus": {
                      "const": "persoonlijke_api_kosten"
                    },
                    "totaal": {
                      "type": "object",
                      "properties": {
                        "credits": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "activiteiten": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "credits",
                        "activiteiten"
                      ],
                      "additionalProperties": false
                    },
                    "activiteiten": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "datum": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "onderdeel": {
                            "type": "string",
                            "enum": [
                              "rapport",
                              "offerte",
                              "offertevoorstel",
                              "bronprofiel",
                              "bronverwerking",
                              "presentatie",
                              "formulier",
                              "excel",
                              "excelvoorstel",
                              "klantmail",
                              "gespreksbundel",
                              "transcriptie",
                              "vertaling",
                              "stijlprofiel",
                              "workflow",
                              "briefing",
                              "document",
                              "resultaat"
                            ]
                          },
                          "credits": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "in_verwerking": {
                            "type": "boolean"
                          },
                          "door_rapportly": {
                            "type": "boolean"
                          },
                          "voorgeschoten": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "openstaand": {
                            "type": "integer",
                            "minimum": 0
                          }
                        },
                        "required": [
                          "id",
                          "datum",
                          "onderdeel",
                          "credits",
                          "in_verwerking",
                          "door_rapportly"
                        ],
                        "additionalProperties": false
                      },
                      "maxItems": 40000
                    },
                    "voorschotten": {
                      "type": "object",
                      "properties": {
                        "openstaand": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "aflossingen": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              },
                              "datum": {
                                "type": "string",
                                "format": "date-time"
                              },
                              "gekocht": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "verrekend": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "teruggegeven": {
                                "type": "integer",
                                "minimum": 0
                              }
                            },
                            "required": [
                              "id",
                              "datum",
                              "gekocht",
                              "verrekend",
                              "teruggegeven"
                            ],
                            "additionalProperties": false
                          }
                        }
                      },
                      "required": [
                        "openstaand",
                        "aflossingen"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "maand",
                    "tijdzone",
                    "persoonlijk",
                    "creditmodus",
                    "totaal",
                    "activiteiten",
                    "voorschotten"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "gebruik:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/persoonlijkVerbruik.js",
          "server/lib/creditContinuiteit.js",
          "server/migrations/321_rapportly_creditvoorschotten.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/abonnement": {
      "get": {
        "operationId": "abonnement_leesmodel",
        "summary": "abonnement leesmodel",
        "description": "private,no-store; queryparameters verboden400. Status en catalogus voor eigen organisatie/actor, geen bestelling, checkout of betaalmutatie. Persoonlijke saldo-uitbreiding alleen in actieve persoonlijke modus voor betaald plan. Heeft betaalgegevens betekent Stripe-customer bekend, geen betaalbewijs. Governance beschrijft native menselijke bevoegdheid; verleent API geen abonnementsmutatierecht. Privacybronfout wordt niet_beschikbaar/actief:false; foundingbronfout voorbereiding; ontbrekende/onleesbare handmatige proefperiode null. Banner resterende_dagen is ceil en verlopen pas bij dagen<0; dit is geen toegangspoort en kan vlak na eindtijd afwijken van de stricte trialpoort. maandcredits/features kunnen null zijn bij ontbrekende instellingen. White Label is afzonderlijke add-onstatus; pakketbeschikbaarheid is geen activatie. Prijzen/catalogus uit deze bron, dynamische configuratie blijft runtimefeit; geen live beschikbaarheidsclaim.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "pakketcontract_versie": {
                      "type": "string"
                    },
                    "huidig": {
                      "type": "object",
                      "properties": {
                        "pakket": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "plan": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "seats": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "credits": {
                          "type": "number"
                        },
                        "abonnement_status": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "heeft_stripe_abonnement": {
                          "type": "boolean"
                        },
                        "heeft_betaalgegevens": {
                          "type": "boolean"
                        },
                        "handmatig_ingericht": {
                          "type": "boolean"
                        },
                        "creditmodus": {
                          "const": "persoonlijke_api_kosten"
                        },
                        "persoonlijk": {
                          "const": true
                        },
                        "pool": {
                          "const": false
                        },
                        "maandcredits": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "gereserveerd": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "verbruikt": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "pakket",
                        "plan",
                        "seats",
                        "credits",
                        "abonnement_status",
                        "heeft_stripe_abonnement",
                        "heeft_betaalgegevens",
                        "handmatig_ingericht"
                      ],
                      "additionalProperties": false
                    },
                    "governance": {
                      "type": "object",
                      "properties": {
                        "wijzig_door": {
                          "type": "string"
                        },
                        "is_eigenaar": {
                          "type": "boolean"
                        },
                        "mag_wijzigen": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "wijzig_door",
                        "is_eigenaar",
                        "mag_wijzigen"
                      ],
                      "additionalProperties": false
                    },
                    "stripe_actief": {
                      "type": "boolean"
                    },
                    "pakketcontract_actief": {
                      "type": "boolean"
                    },
                    "privacy_basis": {
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "status": {
                              "const": "niet_beschikbaar"
                            },
                            "actief": {
                              "const": false
                            }
                          },
                          "required": [
                            "status",
                            "actief"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "status": {
                              "type": "string",
                              "enum": [
                                "actief",
                                "actie_nodig"
                              ]
                            },
                            "actief": {
                              "type": "boolean"
                            },
                            "offboarding_actief": {
                              "type": "boolean"
                            },
                            "basis_versie": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "dienstvoorwaarden_versie": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "privacyverklaring_versie": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "leren": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "ruwe_inhoud_organisatie_overstijgend": {
                                      "const": false
                                    },
                                    "inhoudsvrije_productinzichten": {
                                      "const": true
                                    },
                                    "niet_persoonlijke_config_opt_in": {
                                      "const": true
                                    }
                                  },
                                  "required": [
                                    "ruwe_inhoud_organisatie_overstijgend",
                                    "inhoudsvrije_productinzichten",
                                    "niet_persoonlijke_config_opt_in"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "offboarding_bewaartermijn_dagen": {
                              "anyOf": [
                                {
                                  "type": "integer",
                                  "minimum": 0
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "bron_code": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "privacy_snapshot_id": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "format": "uuid",
                                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": [
                            "status",
                            "actief",
                            "offboarding_actief",
                            "basis_versie",
                            "dienstvoorwaarden_versie",
                            "privacyverklaring_versie",
                            "leren",
                            "offboarding_bewaartermijn_dagen",
                            "bron_code",
                            "privacy_snapshot_id"
                          ],
                          "additionalProperties": false
                        }
                      ]
                    },
                    "founding": {
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "actief": {
                              "const": false
                            },
                            "fase": {
                              "const": "voorbereiding"
                            },
                            "beschikbaar": {
                              "const": false
                            }
                          },
                          "required": [
                            "actief",
                            "fase",
                            "beschikbaar"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "actief": {
                              "const": true
                            },
                            "totaal": {
                              "type": "number",
                              "minimum": 1
                            },
                            "bezet": {
                              "type": "number",
                              "minimum": 0
                            },
                            "resterend": {
                              "type": "number",
                              "minimum": 0
                            },
                            "korting_pct": {
                              "type": "number",
                              "minimum": 1
                            },
                            "publiek_vanaf": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "format": "date-time"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "einddatum": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "format": "date-time"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "einddatum_tekst": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "is_lid": {
                              "type": "boolean"
                            },
                            "fase": {
                              "type": "string",
                              "enum": [
                                "gesloten",
                                "vol",
                                "publiek",
                                "aankondiging"
                              ]
                            },
                            "beschikbaar": {
                              "type": "boolean"
                            }
                          },
                          "required": [
                            "actief",
                            "totaal",
                            "bezet",
                            "resterend",
                            "korting_pct",
                            "publiek_vanaf",
                            "einddatum",
                            "einddatum_tekst",
                            "is_lid",
                            "fase",
                            "beschikbaar"
                          ],
                          "additionalProperties": false
                        }
                      ]
                    },
                    "proefperiode": {
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "pakket": {
                              "type": "string"
                            },
                            "eindigt_op": {
                              "type": "string",
                              "format": "date-time"
                            },
                            "resterende_dagen": {
                              "type": "integer"
                            },
                            "verlopen": {
                              "type": "boolean"
                            }
                          },
                          "required": [
                            "pakket",
                            "eindigt_op",
                            "resterende_dagen",
                            "verlopen"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "white_label": {
                      "type": "object",
                      "properties": {
                        "beschikbaar": {
                          "type": "boolean"
                        },
                        "actief": {
                          "type": "boolean"
                        },
                        "staffel": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "gebruikers": {
                          "type": "number",
                          "minimum": 1
                        },
                        "via_sales": {
                          "type": "boolean"
                        },
                        "staffels": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "sleutel": {
                                "type": "string"
                              },
                              "minGebruikers": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "maxGebruikers": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "prijsCentsPerMaand": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "prijsCentsPerJaar": {
                                "type": "integer",
                                "minimum": 0
                              }
                            },
                            "required": [
                              "sleutel",
                              "minGebruikers",
                              "maxGebruikers",
                              "prijsCentsPerMaand",
                              "prijsCentsPerJaar"
                            ],
                            "additionalProperties": false
                          }
                        }
                      },
                      "required": [
                        "beschikbaar",
                        "actief",
                        "staffel",
                        "gebruikers",
                        "via_sales",
                        "staffels"
                      ],
                      "additionalProperties": false
                    },
                    "pakketten": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "sleutel": {
                            "type": "string",
                            "enum": [
                              "gratis",
                              "basic",
                              "pro",
                              "pro_plus",
                              "ent_start",
                              "ent_prof",
                              "ent_compliance"
                            ]
                          },
                          "naam": {
                            "type": "string"
                          },
                          "prijs_cents": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "per_gebruiker": {
                            "type": "boolean"
                          },
                          "self_serve": {
                            "type": "boolean"
                          },
                          "via_sales": {
                            "type": "boolean"
                          },
                          "gebruikers_inbegrepen": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "implementatie_vanaf_cents": {
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": 0
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "pakketcontract_versie": {
                            "type": "string"
                          },
                          "maandcredits": {
                            "anyOf": [
                              {
                                "type": "number"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "maandcredits_per_gebruiker": {
                            "type": "boolean"
                          },
                          "features": {
                            "$ref": "#/components/schemas/InstellingenJsonWaarde",
                            "description": "Dynamische databasewaarde zonder normalisatie in deze leesroute; kan null zijn. Exacte semantiek van featurevelden blijft open, geen vervanging van actuele functiepoort."
                          }
                        },
                        "required": [
                          "sleutel",
                          "naam",
                          "prijs_cents",
                          "per_gebruiker",
                          "self_serve",
                          "via_sales",
                          "gebruikers_inbegrepen",
                          "implementatie_vanaf_cents",
                          "pakketcontract_versie",
                          "maandcredits",
                          "maandcredits_per_gebruiker",
                          "features"
                        ],
                        "additionalProperties": false
                      },
                      "minItems": 7,
                      "maxItems": 7
                    }
                  },
                  "required": [
                    "pakketcontract_versie",
                    "huidig",
                    "governance",
                    "stripe_actief",
                    "pakketcontract_actief",
                    "privacy_basis",
                    "founding",
                    "proefperiode",
                    "white_label",
                    "pakketten"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "abonnement:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/rapportlyPakketContract.js",
          "server/lib/rapportlyPrivacy/repository.js",
          "server/lib/rapportlyPrivacy/contract.js",
          "server/lib/rapportlyProefperiode.js",
          "server/founding_api.js"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "pakketten[].features: dynamische database-JSON zonder native normalisatie; productspecifieke featurevelden/semantiek nog apart vastleggen."
        ]
      }
    },
    "/v1/stijlprofielen/{id}/template-controle": {
      "get": {
        "operationId": "klassieke_stijl_controle_lezen",
        "summary": "klassieke stijl controle lezen",
        "description": "private,no-store. Documentcontrole bevat actuele hash en tijdelijke previewlinks; PDF-/Word-/formulierdetails optioneel volgens bron. Geen controle409; ontbrekende of onbetrouwbare preview503. Presentatie is reeds gepubliceerd: sha256:null, actieve profielversie en correcties_mogelijk:true; inzage is geen verplichte wachtstap. Presentatie-diaformaat is een object, terwijl presentatie_controle in een documentvoorstel een samenvattende tekstverhouding heeft. Previews zijn tijdelijke toegang en nooit bewaren als blijvende openbare links.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "template_controle": {
                      "oneOf": [
                        {
                          "$ref": "#/components/schemas/KlassiekeDocumentControle"
                        },
                        {
                          "$ref": "#/components/schemas/KlassiekePresentatieInzage"
                        }
                      ]
                    }
                  },
                  "required": [
                    "template_controle"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/voorbeeldProfiel.js",
          "server/lib/publiekeApi/stijlcontrole.js",
          "server/lib/templateV2/formulierAanpassingen.js",
          "server/lib/templateV2/bronFontContract.js",
          "server/lib/templateV2/passieveOpmaakHerstel.js",
          "server/lib/bronstijl/vasteTeksten.js",
          "server/lib/bronstijl/identiteit.js",
          "server/lib/presentatieV1/inzage.js",
          "server/lib/presentatieV1/publicatie.js",
          "server/lib/presentatieV1/contract.js",
          "server/lib/presentatieV1/pptxCompiler.js",
          "server/lib/templateV2/bronFontPdfBewijs.json"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/stijlprofielen/{id}/template-vaste-teksten": {
      "post": {
        "operationId": "klassieke_stijl_vasteteksten_kiezen",
        "summary": "klassieke stijl vasteteksten kiezen",
        "description": "Exact huidige ongepubliceerde PDF-controle met bestaande kandidaten; lege selectie toegestaan. Geen vrije tekstinvoer. Keuze maakt een nieuwe preview/hash, publiceert niet; daarna opnieuw bekijken en apart goedkeuren. Huidige toegang/eigenaarschap vereist, verouderde bron/basis409, onbetrouwbare verwerking503. Geen generieke idempotentieroute.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "template_controle": {
                      "$ref": "#/components/schemas/KlassiekeDocumentControle"
                    }
                  },
                  "required": [
                    "template_controle"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/voorbeeldProfiel.js",
          "server/lib/publiekeApi/stijlcontrole.js",
          "server/lib/templateV2/formulierAanpassingen.js",
          "server/lib/templateV2/bronFontContract.js",
          "server/lib/templateV2/passieveOpmaakHerstel.js",
          "server/lib/bronstijl/vasteTeksten.js",
          "server/lib/bronstijl/identiteit.js",
          "server/lib/presentatieV1/inzage.js",
          "server/lib/presentatieV1/publicatie.js",
          "server/lib/presentatieV1/contract.js",
          "server/lib/presentatieV1/pptxCompiler.js",
          "server/lib/templateV2/bronFontPdfBewijs.json"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "controleSha256": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  },
                  "gekozenSha256": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "pattern": "^[a-f0-9]{64}$"
                    },
                    "maxItems": 32,
                    "uniqueItems": true
                  }
                },
                "required": [
                  "controleSha256",
                  "gekozenSha256"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/stijlprofielen/{id}/template-formulier-aanpassingen": {
      "post": {
        "operationId": "klassieke_stijl_formulierkeuzes",
        "summary": "klassieke stijl formulierkeuzes",
        "description": "1–500 bestaande formulierkeuzes bij actuele hash en oorspronkelijke DOCX. true behoudt verbetering; false zet terug, bij teruggevallen alinea maakt false alsnog invulveld. Nieuwe preview/hash vraagt nieuwe inhoudscontrole; geen publicatie. Onbekende keuze/verouderde bron409, veilige rendering niet beschikbaar503. Na verloren antwoord eerst huidige controle lezen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "template_controle": {
                      "$ref": "#/components/schemas/KlassiekeDocumentControle"
                    }
                  },
                  "required": [
                    "template_controle"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/voorbeeldProfiel.js",
          "server/lib/publiekeApi/stijlcontrole.js",
          "server/lib/templateV2/formulierAanpassingen.js",
          "server/lib/templateV2/bronFontContract.js",
          "server/lib/templateV2/passieveOpmaakHerstel.js",
          "server/lib/bronstijl/vasteTeksten.js",
          "server/lib/bronstijl/identiteit.js",
          "server/lib/presentatieV1/inzage.js",
          "server/lib/presentatieV1/publicatie.js",
          "server/lib/presentatieV1/contract.js",
          "server/lib/presentatieV1/pptxCompiler.js",
          "server/lib/templateV2/bronFontPdfBewijs.json"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "controleSha256": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  },
                  "keuzes": {
                    "type": "object",
                    "minProperties": 1,
                    "maxProperties": 500,
                    "propertyNames": {
                      "type": "string",
                      "maxLength": 120
                    },
                    "additionalProperties": {
                      "type": "boolean"
                    }
                  }
                },
                "required": [
                  "controleSha256",
                  "keuzes"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/stijlprofielen/{id}/template-goedkeuren": {
      "post": {
        "operationId": "klassieke_stijl_publiceren",
        "summary": "klassieke stijl publiceren",
        "description": "Bewuste goedkeuring bevestigd:true. Document gebruikt controleSha256 plus volledige huidige merkassetlijst; bij formulier verplicht formulierInhoudGecontroleerd:true, basis_versie_id verboden. Exact passende reeds opgeslagen documentgoedkeuring kan hergebruikt:true retourneren. Presentatie vereist basis_versie_id van huidige actieve versie; optionele assets_uit/layoutrol maken nieuwe CAS-versie. Zonder effectieve presentatiecorrectie alleen herbevestigen, hergebruikt:true. Native serializer kan niet-canonieke veldtypes normaliseren; schema biedt canonieke invoer. Huidige bronidentiteit en governance opnieuw gecontroleerd. Na antwoordverlies huidige actieve versie lezen; geen algemene Idempotency-Keygarantie. Niet autoritatief bevestigde publicatie503, basisconflict409, inhoudelijk onpubliceerbare presentatie422.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    },
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "status": {
                      "const": "klaar"
                    },
                    "profielversie_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "cas_bevestigd": {
                      "const": true
                    },
                    "hergebruikt": {
                      "const": true
                    }
                  },
                  "required": [
                    "ok",
                    "id",
                    "status",
                    "profielversie_id",
                    "cas_bevestigd"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Presentatiecorrectie kan inhoudelijk niet worden gepubliceerd. Lees de actuele inzage opnieuw.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/voorbeeldProfiel.js",
          "server/lib/publiekeApi/stijlcontrole.js",
          "server/lib/templateV2/formulierAanpassingen.js",
          "server/lib/templateV2/bronFontContract.js",
          "server/lib/templateV2/passieveOpmaakHerstel.js",
          "server/lib/bronstijl/vasteTeksten.js",
          "server/lib/bronstijl/identiteit.js",
          "server/lib/presentatieV1/inzage.js",
          "server/lib/presentatieV1/publicatie.js",
          "server/lib/presentatieV1/contract.js",
          "server/lib/presentatieV1/pptxCompiler.js",
          "server/lib/templateV2/bronFontPdfBewijs.json"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "bevestigd": {
                        "const": true
                      },
                      "controleSha256": {
                        "type": "string",
                        "pattern": "^[a-f0-9]{64}$"
                      },
                      "goedgekeurdeMerkassetSha256": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "pattern": "^[a-f0-9]{64}$"
                        },
                        "maxItems": 100,
                        "uniqueItems": true
                      },
                      "formulierInhoudGecontroleerd": {
                        "type": "boolean"
                      }
                    },
                    "required": [
                      "bevestigd",
                      "controleSha256",
                      "goedgekeurdeMerkassetSha256"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "bevestigd": {
                        "const": true
                      },
                      "basis_versie_id": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      "correcties": {
                        "type": "object",
                        "properties": {
                          "assets_uit": {
                            "type": "array",
                            "items": {
                              "type": "string",
                              "pattern": "^[a-f0-9]{64}$"
                            },
                            "maxItems": 100,
                            "uniqueItems": true
                          },
                          "layoutrol": {
                            "type": "object",
                            "maxProperties": 64,
                            "propertyNames": {
                              "type": "string",
                              "pattern": "^L\\d{3}$"
                            },
                            "additionalProperties": {
                              "type": "string",
                              "enum": [
                                "titel",
                                "sectie",
                                "titel_inhoud",
                                "twee_inhoud",
                                "vergelijking",
                                "beeld_tekst",
                                "alleen_titel",
                                "leeg"
                              ]
                            }
                          }
                        },
                        "required": [],
                        "additionalProperties": false
                      }
                    },
                    "required": [
                      "bevestigd",
                      "basis_versie_id"
                    ],
                    "additionalProperties": false
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/v1/stijlprofielen/{id}/onderzoek": {
      "get": {
        "operationId": "stijlonderzoek_lezen",
        "summary": "stijlonderzoek lezen",
        "description": "Laatste100 eigen actormeldingen voor zichtbaar profiel, geen cursor. Technische onderzoeksstatus en persoonlijke keuze zijn afzonderlijke velden. Formaat/kenmerk/code kunnen ontbreken als bijbehorend onderzoek niet gevonden is. klantCredits:0 geldt voor dit herstelonderzoek, niet voor nieuwe betaalde verfijnopdrachten. Readiness ontbreekt503; lijst is geen volledige historische export.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "meldingen": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "status": {
                            "type": "string",
                            "enum": [
                              "wacht",
                              "beschikbaar",
                              "voorbereiden",
                              "voorstel",
                              "later",
                              "behouden",
                              "toegepast",
                              "hulp_nodig"
                            ]
                          },
                          "onderzoekStatus": {
                            "type": "string",
                            "enum": [
                              "wacht",
                              "bezig",
                              "opgelost",
                              "hulp_nodig"
                            ]
                          },
                          "stap": {
                            "type": "string",
                            "enum": [
                              "herkennen",
                              "bibliotheek",
                              "bronnen",
                              "ontwerpen",
                              "licentie",
                              "proefuitvoer",
                              "controleren",
                              "vrijgeven",
                              "hulp_nodig"
                            ]
                          },
                          "formaat": {
                            "type": "string",
                            "enum": [
                              "docx",
                              "pdf",
                              "xlsx",
                              "pptx",
                              "offerte"
                            ]
                          },
                          "kenmerk": {
                            "type": "string",
                            "enum": [
                              "lettertype",
                              "tabel",
                              "lijst",
                              "tekstpassing",
                              "pagina",
                              "passieve_opmaak",
                              "onbekend_onderdeel"
                            ]
                          },
                          "code": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "bijgewerktOp": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "klantCredits": {
                            "const": 0
                          },
                          "basisVersieId": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "voorstelId": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "gewijzigd": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          }
                        },
                        "required": [
                          "id",
                          "status",
                          "onderzoekStatus",
                          "stap",
                          "bijgewerktOp",
                          "klantCredits",
                          "basisVersieId",
                          "voorstelId",
                          "gewijzigd"
                        ],
                        "additionalProperties": false
                      },
                      "maxItems": 100
                    }
                  },
                  "required": [
                    "meldingen"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/stijlOnderzoek/routes.js",
          "server/lib/stijlOnderzoek/repository.js",
          "server/lib/stijlOnderzoek/contract.js",
          "server/lib/stijlOnderzoek/voorstellen.js",
          "server/lib/stijlOnderzoek/presentatie.js",
          "server/migrations/289_rapportly_stijlonderzoek.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/stijlprofielen/{id}/onderzoek/{meldingId}/voorstel": {
      "post": {
        "operationId": "stijlonderzoek_voorstel",
        "summary": "stijlonderzoek voorstel",
        "description": "201 nieuw concreet voorstel,200 bestaand voorstel. Native recept moet nog vrijgegeven zijn en basis actueel; geen vrije onderzoeksopdracht of vrije prompt. Niet-presentatieantwoord laat engine weg. Muterende onderzoeksroutes maximaal12verzoeken/minuut naast algemene API-limieten. Voorstel maakt geen actieve versie; herhaling gebruikt bestaande melding/voorstel, geen algemene Idempotency-Keyontvangst.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "meldingId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "voorstelId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "basisVersieId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "gewijzigd": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "engine": {
                      "const": "pptx_native_v1"
                    },
                    "klantCredits": {
                      "const": 0
                    }
                  },
                  "required": [
                    "voorstelId",
                    "basisVersieId",
                    "gewijzigd",
                    "klantCredits"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "201": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "voorstelId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "basisVersieId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "gewijzigd": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "engine": {
                      "const": "pptx_native_v1"
                    },
                    "klantCredits": {
                      "const": 0
                    }
                  },
                  "required": [
                    "voorstelId",
                    "basisVersieId",
                    "gewijzigd",
                    "klantCredits"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/stijlOnderzoek/routes.js",
          "server/lib/stijlOnderzoek/repository.js",
          "server/lib/stijlOnderzoek/contract.js",
          "server/lib/stijlOnderzoek/voorstellen.js",
          "server/lib/stijlOnderzoek/presentatie.js",
          "server/migrations/289_rapportly_stijlonderzoek.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LegeBody"
              }
            }
          }
        }
      }
    },
    "/v1/stijlprofielen/{id}/onderzoek/{meldingId}/toepassen": {
      "post": {
        "operationId": "stijlonderzoek_toepassen",
        "summary": "stijlonderzoek toepassen",
        "description": "Past exact huidige voorstelbasis toe via bestaande CAS-publicatie. Actuele actor/objectrechten en vrijgegeven recept opnieuw vereist. Presentatie vereist dat dezelfde actor de exacte onderzoeks-PDF heeft geopend; andere engines behouden hun bestaande previewcontrole. Herhaling alleen zolang de opgeslagen publicatie nog past; actuele nieuwere versie409. Geen vrije modelprompt en klantCredits:0.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "meldingId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "profielversie": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "versie_nummer": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "id",
                        "versie_nummer"
                      ],
                      "additionalProperties": false
                    },
                    "klantCredits": {
                      "const": 0
                    }
                  },
                  "required": [
                    "profielversie",
                    "klantCredits"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/stijlOnderzoek/routes.js",
          "server/lib/stijlOnderzoek/repository.js",
          "server/lib/stijlOnderzoek/contract.js",
          "server/lib/stijlOnderzoek/voorstellen.js",
          "server/lib/stijlOnderzoek/presentatie.js",
          "server/migrations/289_rapportly_stijlonderzoek.sql",
          "server/migrations/274_rapportly_stijlwerkplaats_mastereigenaar.sql",
          "server/migrations/294_rapportly_beeldbank_engines.sql",
          "server/migrations/290_rapportly_templatecontrole_digest.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basisVersieId": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "basisVersieId",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/stijlprofielen/{id}/onderzoek/{meldingId}/preview": {
      "get": {
        "operationId": "stijlonderzoek_presentatiepreview",
        "summary": "stijlonderzoek presentatiepreview",
        "description": "Directe application/pdf, maximaal40MiB, eigen synthetisch presentatievoorstel. Alleen voorstel/later/toegepast met passende previewref; bytes/lengte/hash/PDFmagic gecontroleerd. Deze GET registreert dat de huidige actor precies deze previewhash heeft geopend; de publicatiepoort gebruikt dat bewijs. Geen signedURL/redirect. Ontbrekend404, gewijzigde uitvoer409, onbetrouwbare opslag503.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "meldingId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "X-Content-Type-Options": {
                "schema": {
                  "const": "nosniff"
                }
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/stijlOnderzoek/routes.js",
          "server/lib/stijlOnderzoek/repository.js",
          "server/lib/stijlOnderzoek/contract.js",
          "server/lib/stijlOnderzoek/voorstellen.js",
          "server/lib/stijlOnderzoek/presentatie.js",
          "server/migrations/289_rapportly_stijlonderzoek.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/stijlprofielen/{id}/onderzoek/{meldingId}/keuze": {
      "post": {
        "operationId": "stijlonderzoek_keuze",
        "summary": "stijlonderzoek keuze",
        "description": "Kies later of behouden met exact de laatst gelezen bijgewerktOp-tekenreeks, niet opnieuw geformatteerd. Actorgebonden CAS voorkomt concurrent overschrijven. Alleen wacht/beschikbaar/voorstel/later/behouden/hulp_nodig; tijdens voorbereiding of na toepassing409. Verkeerde keuze422; eerst opnieuw lezen na verloren antwoord. Maximaal12mutaties/minuut.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "meldingId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Ok"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Keuze moet later of behouden zijn.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/stijlOnderzoek/routes.js",
          "server/lib/stijlOnderzoek/repository.js",
          "server/lib/stijlOnderzoek/contract.js",
          "server/lib/stijlOnderzoek/voorstellen.js",
          "server/lib/stijlOnderzoek/presentatie.js",
          "server/migrations/289_rapportly_stijlonderzoek.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "keuze": {
                    "type": "string",
                    "enum": [
                      "later",
                      "behouden"
                    ]
                  },
                  "bijgewerktOp": {
                    "type": "string",
                    "format": "date-time",
                    "maxLength": 50
                  }
                },
                "required": [
                  "keuze",
                  "bijgewerktOp"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/excel/{excelId}/onderzoek/{meldingId}/keuze": {
      "post": {
        "operationId": "excelonderzoek_keuze",
        "summary": "excelonderzoek keuze",
        "description": "Kies later of behouden met exact de laatst gelezen bijgewerktOp-tekenreeks, niet opnieuw geformatteerd. Actorgebonden CAS voorkomt concurrent overschrijven. Alleen wacht/beschikbaar/voorstel/later/behouden/hulp_nodig; tijdens voorbereiding of na toepassing409. Verkeerde keuze422; eerst opnieuw lezen na verloren antwoord. Maximaal12mutaties/minuut.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "excelId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "meldingId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Ok"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Keuze moet later of behouden zijn.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "excel:verwerken"
        ],
        "x-bronnen": [
          "server/lib/stijlOnderzoek/routes.js",
          "server/lib/stijlOnderzoek/repository.js",
          "server/lib/stijlOnderzoek/contract.js",
          "server/lib/stijlOnderzoek/voorstellen.js",
          "server/lib/stijlOnderzoek/presentatie.js",
          "server/migrations/289_rapportly_stijlonderzoek.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "keuze": {
                    "type": "string",
                    "enum": [
                      "later",
                      "behouden"
                    ]
                  },
                  "bijgewerktOp": {
                    "type": "string",
                    "format": "date-time",
                    "maxLength": 50
                  }
                },
                "required": [
                  "keuze",
                  "bijgewerktOp"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/excel/{excelId}/onderzoek": {
      "get": {
        "operationId": "excelonderzoek_lezen",
        "summary": "excelonderzoek lezen",
        "description": "Laatste100 eigen meldingen; huidige toegang tot Excelobject vereist. Geen vrije zoekopdracht of providerprompt. Onderzoekkosten voor Rapportly, klantCredits:0. Het analyseantwoord staat in ExcelOpenbareAnalyse bij de afzonderlijke voorstelroute.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "excelId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "meldingen": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "status": {
                            "type": "string",
                            "enum": [
                              "wacht",
                              "beschikbaar",
                              "voorbereiden",
                              "voorstel",
                              "later",
                              "behouden",
                              "toegepast",
                              "hulp_nodig"
                            ]
                          },
                          "onderzoekStatus": {
                            "type": "string",
                            "enum": [
                              "wacht",
                              "bezig",
                              "opgelost",
                              "hulp_nodig"
                            ]
                          },
                          "stap": {
                            "type": "string",
                            "enum": [
                              "herkennen",
                              "bibliotheek",
                              "bronnen",
                              "ontwerpen",
                              "licentie",
                              "proefuitvoer",
                              "controleren",
                              "vrijgeven",
                              "hulp_nodig"
                            ]
                          },
                          "formaat": {
                            "const": "xlsx"
                          },
                          "kenmerk": {
                            "type": "string",
                            "enum": [
                              "lettertype",
                              "tabel",
                              "lijst",
                              "tekstpassing",
                              "pagina",
                              "passieve_opmaak",
                              "onbekend_onderdeel"
                            ]
                          },
                          "code": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "bijgewerktOp": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "klantCredits": {
                            "const": 0
                          }
                        },
                        "required": [
                          "id",
                          "status",
                          "onderzoekStatus",
                          "stap",
                          "formaat",
                          "bijgewerktOp",
                          "klantCredits"
                        ],
                        "additionalProperties": false
                      },
                      "maxItems": 100
                    }
                  },
                  "required": [
                    "meldingen"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/stijlOnderzoek/routes.js",
          "server/lib/stijlOnderzoek/repository.js",
          "server/lib/stijlOnderzoek/contract.js",
          "server/lib/stijlOnderzoek/voorstellen.js",
          "server/lib/stijlOnderzoek/presentatie.js",
          "server/migrations/289_rapportly_stijlonderzoek.sql",
          "server/lib/stijlOnderzoek/excel.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/excel/{excelId}/onderzoek/{meldingId}/toepassen": {
      "post": {
        "operationId": "excelonderzoek_toepassen",
        "summary": "excelonderzoek toepassen",
        "description": "Pas een reeds bestaand en gecontroleerd onderzoeksvoorstel toe bij exact huidige bronhash. Origineel bronobject blijft onveranderlijk; toegepast analysevoorstel wordt gebruikt zolang hash en receptvrijgave passen. Herhaling van hetzelfde toegepast voorstel toegestaan. Geen bevestiging met een nieuw model en geen klantcredits; mismatch409. Lees en beoordeel het getypeerde analysevoorstel voordat je toepast.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "excelId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "meldingId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    },
                    "klantCredits": {
                      "const": 0
                    }
                  },
                  "required": [
                    "ok",
                    "klantCredits"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "excel:verwerken"
        ],
        "x-bronnen": [
          "server/lib/stijlOnderzoek/routes.js",
          "server/lib/stijlOnderzoek/repository.js",
          "server/lib/stijlOnderzoek/contract.js",
          "server/lib/stijlOnderzoek/voorstellen.js",
          "server/lib/stijlOnderzoek/presentatie.js",
          "server/migrations/289_rapportly_stijlonderzoek.sql",
          "server/lib/stijlOnderzoek/excel.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "gecontroleerd": {
                    "const": true
                  },
                  "bronSha256": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  }
                },
                "required": [
                  "gecontroleerd",
                  "bronSha256"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/stijlprofielen/{id}/verfijnen/jobs": {
      "post": {
        "operationId": "stijlverfijning_start",
        "summary": "stijlverfijning start",
        "description": "Betaalde asynchrone verfijning uitsluitend legacy profiel_v1, actuele klaarversie en mutatierecht. Flag uit404; persoonlijke werkelijkekostenmodus/readiness ontbreekt503. Canonieke opmerking3–1000tekens: alleen vormgeving; whitespace/controltekens worden genormaliseerd en gevoelige gegevenspatronen geweigerd. Volledige middleware: publieke Idempotency-Key8–128 veilige tekens wordt per sleutel/profiel gehasht vóór native16–200controle. Dezelfde genormaliseerde invoer herhaalt dezelfde ontvangst; ander invoer409.202 ook voor bestaande terminale ontvangst. Ontvangst48uur, daarna herhaalstart410; geen nieuwe providerpoging na onzeker providercontact. API-delegatie wordt opnieuw gecontroleerd vóór providerstart en publicatie.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "aanvraagId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "ontvangen",
                        "provider_gestart",
                        "voorstel_bewaard",
                        "klaar",
                        "mislukt",
                        "controle_nodig"
                      ]
                    },
                    "statusUrl": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "aanvraagId",
                    "status",
                    "statusUrl"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlverfijning.js",
          "server/jobs/stijlVerfijnJobs.js",
          "server/lib/voorbeeldProfielVerfijning.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/migrations/355_rapportly_stijlverfijn_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "verwachte_profielversie_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                  },
                  "opmerking": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 1000
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "verwachte_profielversie_id",
                  "opmerking",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/stijlprofielen/{id}/verfijnen/jobs/{aanvraagId}": {
      "get": {
        "operationId": "stijlverfijning_status",
        "summary": "stijlverfijning status",
        "description": "Alleen oorspronkelijke API-sleutel, actor, organisatie en profiel; ook deze leesroute vereist native mutatierecht op huidige stijl. Receipt verlopen/ontbreekt404. Dode job vóór providerstart wordt mislukt, na providerstart/voorstel_bewaard controle_nodig. Klaar geeft opgeslagen versie-id en gewijzigdevelden; handmatige beoordeling vereist bij controle_nodig, niet automatisch nieuwe opdracht starten.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          },
          {
            "name": "aanvraagId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "aanvraagId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "status": {
                          "const": "ontvangen"
                        }
                      },
                      "required": [
                        "aanvraagId",
                        "status"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "aanvraagId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "status": {
                          "const": "provider_gestart"
                        }
                      },
                      "required": [
                        "aanvraagId",
                        "status"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "aanvraagId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "status": {
                          "const": "voorstel_bewaard"
                        }
                      },
                      "required": [
                        "aanvraagId",
                        "status"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "aanvraagId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "status": {
                          "const": "klaar"
                        },
                        "profielversie": {
                          "type": "object",
                          "properties": {
                            "id": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "format": "uuid",
                                  "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": [
                            "id"
                          ],
                          "additionalProperties": false
                        },
                        "gewijzigde_velden": {
                          "anyOf": [
                            {
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "aanvraagId",
                        "status",
                        "profielversie",
                        "gewijzigde_velden"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "aanvraagId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "status": {
                          "const": "mislukt"
                        },
                        "code": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "aanvraagId",
                        "status",
                        "code"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "aanvraagId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "status": {
                          "const": "controle_nodig"
                        },
                        "code": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "aanvraagId",
                        "status",
                        "code"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlverfijning.js",
          "server/jobs/stijlVerfijnJobs.js",
          "server/lib/voorbeeldProfielVerfijning.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/migrations/355_rapportly_stijlverfijn_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/stijlprofielen/{id}/werkplaats": {
      "get": {
        "operationId": "werkplaats_lezen",
        "summary": "werkplaats lezen",
        "description": "Actieve basis, werkelijk beschikbare serverlettertypen en mogelijkheden per engine/recht/vrijgave. voorstel is het laatste niet verlopen, niet geactiveerde voorstel van deze actor voor deze basis. conceptSleutel bevat organisatie:actor:profiel:versie en is geen geheim of machtiging. Fontvervanging is alleen voor legacyontwerp beschikbaar. Alle werkplaatsroutes vereisen de API-jobflag en readiness356 plus native werkplaatsreadiness270; ontbreken geeft503. Huidige actor-, organisatie- en objectrechten blijven vereist; private,no-store.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "basisVersieId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                    },
                    "conceptSleutel": {
                      "type": "string"
                    },
                    "ontwerp": {
                      "type": "object",
                      "properties": {
                        "lettertype": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "basis_font_pt": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "regelafstand": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "marges_mm": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "boven": {
                                  "type": "number"
                                },
                                "rechts": {
                                  "type": "number"
                                },
                                "onder": {
                                  "type": "number"
                                },
                                "links": {
                                  "type": "number"
                                }
                              },
                              "required": [],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "kleuren": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "primair": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "accent": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "tekst": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "lijn": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "lichtgrijs": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              },
                              "required": [],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "logo_positie": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [],
                      "additionalProperties": false,
                      "description": "Alleen aanwezige velden uit het opgeslagen ontwerp of de gevalideerde bronbewerking. Lezen legt geen nieuwe schrijfgrenzen op historische waarden."
                    },
                    "mogelijkheden": {
                      "type": "object",
                      "properties": {
                        "beheren": {
                          "type": "boolean"
                        },
                        "opmerking": {
                          "type": "boolean"
                        },
                        "achtergrondVoorstel": {
                          "type": "boolean"
                        },
                        "achtergrondBewerkingen": {
                          "type": "boolean"
                        },
                        "instellingen": {
                          "type": "boolean"
                        },
                        "indeling": {
                          "type": "boolean"
                        },
                        "bronopmaak": {
                          "type": "boolean"
                        },
                        "afbeeldingen": {
                          "type": "boolean"
                        },
                        "logo": {
                          "type": "boolean"
                        },
                        "velden": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "enum": [
                              "lettertype",
                              "basis_font_pt",
                              "regelafstand",
                              "marges_mm",
                              "kleuren",
                              "logo_positie"
                            ]
                          }
                        }
                      },
                      "required": [
                        "beheren",
                        "opmerking",
                        "achtergrondVoorstel",
                        "achtergrondBewerkingen",
                        "instellingen",
                        "indeling",
                        "bronopmaak",
                        "afbeeldingen",
                        "logo",
                        "velden"
                      ],
                      "additionalProperties": false
                    },
                    "lettertypen": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "lettertypeKeuze": {
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "van": {
                              "type": "string"
                            },
                            "naar": {
                              "type": "string"
                            },
                            "vervangen": {
                              "type": "boolean"
                            }
                          },
                          "required": [
                            "van",
                            "naar",
                            "vervangen"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "opmaakMeldingen": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "enum": [
                          "logo_asset_ontbreekt"
                        ]
                      }
                    },
                    "voorstel": {
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                            },
                            "basisVersieId": {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                            },
                            "aangemaaktOp": {
                              "type": "string",
                              "format": "date-time"
                            },
                            "verlooptOp": {
                              "type": "string",
                              "format": "date-time"
                            },
                            "gewijzigd": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            },
                            "herkomst": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "id",
                            "basisVersieId",
                            "aangemaaktOp",
                            "verlooptOp",
                            "gewijzigd",
                            "herkomst"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "basisVersieId",
                    "conceptSleutel",
                    "ontwerp",
                    "mogelijkheden",
                    "lettertypen",
                    "lettertypeKeuze",
                    "opmaakMeldingen",
                    "voorstel"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige of niet ondersteunde vormgeving, geen wijziging of onbruikbare bron. Workerfouten na202 verschijnen in de status.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/werkplaats.js",
          "server/lib/stijlprofielWerkplaats.js",
          "server/jobs/stijlWerkplaatsVoorstelJobs.js",
          "server/jobs/stijlWerkplaatsOperaties.js",
          "server/jobs/stijlWerkplaatsPreviewJobs.js",
          "server/lib/stijlwerkplaatsLettertypen.js",
          "server/lib/stijlprofielOpmaakMeldingen.js",
          "server/lib/bronstijlBewerking/contract.js",
          "server/lib/stijlIndeling.js",
          "server/lib/stijlprofielAfbeeldingen.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/stijlprofielen/{id}/voorstellen/jobs": {
      "post": {
        "operationId": "werkplaats_start",
        "summary": "werkplaats start",
        "description": "Duurzame ontvangst, nog geen actieve versie. Publieke Idempotency-Key8–128 veilige tekens wordt per API-sleutel gehasht vóór native16–200controle. Zelfde invoer herhaalt ontvangst; sleutel niet voor een ander profiel hergebruiken. Receipt7dagen, herhaalstart daarna410. Opmerking wordt genormaliseerd en mag alleen vormgeving bevatten; alleen deze operatie kan AI/klantcredits gebruiken en vereist persoonlijke werkelijkekostenmodus. Instellingen/afbeeldingen/indeling gebruiken lokale verwerking. Worker toetst engine, huidige basis, assets, echte wijziging en governance opnieuw;202 garandeert geen geslaagd voorstel. Renderherstel van opgeslagen voorstel maximaal2pogingen zonder nieuw model; onzeker providercontact wordt controle_nodig. Canonieke bodies tonen alleen de geselecteerde operatievelden; de registrar kan overige bekende operatievelden negeren. Alle werkplaatsroutes vereisen de API-jobflag en readiness356 plus native werkplaatsreadiness270; ontbreken geeft503. Huidige actor-, organisatie- en objectrechten blijven vereist; private,no-store.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "aanvraagId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "ontvangen",
                        "provider_gestart",
                        "voorstel_bewaard",
                        "klaar",
                        "mislukt",
                        "controle_nodig"
                      ]
                    },
                    "statusUrl": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "aanvraagId",
                    "status",
                    "statusUrl"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige of niet ondersteunde vormgeving, geen wijziging of onbruikbare bron. Workerfouten na202 verschijnen in de status.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/werkplaats.js",
          "server/lib/stijlprofielWerkplaats.js",
          "server/jobs/stijlWerkplaatsVoorstelJobs.js",
          "server/jobs/stijlWerkplaatsOperaties.js",
          "server/jobs/stijlWerkplaatsPreviewJobs.js",
          "server/lib/stijlwerkplaatsLettertypen.js",
          "server/lib/stijlprofielOpmaakMeldingen.js",
          "server/lib/bronstijlBewerking/contract.js",
          "server/lib/stijlIndeling.js",
          "server/lib/stijlprofielAfbeeldingen.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "basis_versie_id": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                      },
                      "operatie": {
                        "const": "opmerking"
                      },
                      "opmerking": {
                        "type": "string",
                        "minLength": 3,
                        "maxLength": 1000
                      }
                    },
                    "required": [
                      "basis_versie_id",
                      "opmerking"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "basis_versie_id": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                      },
                      "operatie": {
                        "const": "instellingen"
                      },
                      "instellingen": {
                        "anyOf": [
                          {
                            "type": "object",
                            "properties": {
                              "lettertype": {
                                "type": "string"
                              },
                              "basis_font_pt": {
                                "type": "number",
                                "minimum": 8,
                                "maximum": 14
                              },
                              "regelafstand": {
                                "type": "number",
                                "minimum": 1,
                                "maximum": 2
                              },
                              "marges_mm": {
                                "type": "object",
                                "properties": {
                                  "boven": {
                                    "type": "number",
                                    "minimum": 8,
                                    "maximum": 40
                                  },
                                  "rechts": {
                                    "type": "number",
                                    "minimum": 8,
                                    "maximum": 40
                                  },
                                  "onder": {
                                    "type": "number",
                                    "minimum": 8,
                                    "maximum": 40
                                  },
                                  "links": {
                                    "type": "number",
                                    "minimum": 8,
                                    "maximum": 40
                                  }
                                },
                                "required": [],
                                "additionalProperties": false
                              },
                              "kleuren": {
                                "type": "object",
                                "properties": {
                                  "primair": {
                                    "type": "string",
                                    "pattern": "^#[a-fA-F0-9]{6}$"
                                  }
                                },
                                "required": [
                                  "primair"
                                ],
                                "additionalProperties": false
                              },
                              "logo_positie": {
                                "type": "string",
                                "enum": [
                                  "geen",
                                  "linksboven",
                                  "middenboven",
                                  "rechtsboven"
                                ]
                              }
                            },
                            "required": [],
                            "additionalProperties": false,
                            "description": "Legacy profiel_v1. Lettertype moet letterlijk in huidige lettertypenlijst staan. Niet-geen logo vereist huidig logoasset; marges mogen gedeeltelijk. Een lege of ongewijzigde delta kan asynchroon worden geweigerd."
                          },
                          {
                            "type": "object",
                            "properties": {
                              "lettertype": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "pattern": "^[A-Za-z][A-Za-z0-9 ._-]{0,99}$"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "basis_font_pt": {
                                "anyOf": [
                                  {
                                    "type": "number",
                                    "minimum": 8,
                                    "maximum": 14
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "regelafstand": {
                                "anyOf": [
                                  {
                                    "type": "number",
                                    "minimum": 1,
                                    "maximum": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "kleuren": {
                                "anyOf": [
                                  {
                                    "type": "object",
                                    "properties": {
                                      "primair": {
                                        "type": "string",
                                        "pattern": "^#[a-fA-F0-9]{6}$"
                                      }
                                    },
                                    "required": [
                                      "primair"
                                    ],
                                    "additionalProperties": false
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [],
                            "additionalProperties": false,
                            "description": "Alleen docx_native_v1/pdf_bron_v1. null verwijdert de override. Gewijzigd lettertype moet beschikbaar zijn; fontnaam maximaal100 tekens en begint met een letter."
                          }
                        ]
                      }
                    },
                    "required": [
                      "basis_versie_id",
                      "instellingen",
                      "operatie"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "basis_versie_id": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                      },
                      "operatie": {
                        "const": "afbeeldingen"
                      },
                      "vervangingen": {
                        "type": "array",
                        "items": {
                          "oneOf": [
                            {
                              "type": "object",
                              "properties": {
                                "sleutel": {
                                  "type": "string",
                                  "pattern": "^[a-f0-9]{64}$"
                                },
                                "actie": {
                                  "const": "vervang"
                                },
                                "beeld_id": {
                                  "type": "string",
                                  "format": "uuid",
                                  "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                                },
                                "passing": {
                                  "type": "string",
                                  "enum": [
                                    "passend",
                                    "vullend"
                                  ]
                                }
                              },
                              "required": [
                                "sleutel",
                                "actie",
                                "beeld_id",
                                "passing"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "object",
                              "properties": {
                                "sleutel": {
                                  "type": "string",
                                  "pattern": "^[a-f0-9]{64}$"
                                },
                                "actie": {
                                  "type": "string",
                                  "enum": [
                                    "verwijder",
                                    "origineel"
                                  ]
                                }
                              },
                              "required": [
                                "sleutel",
                                "actie"
                              ],
                              "additionalProperties": false
                            }
                          ]
                        },
                        "minItems": 1,
                        "maxItems": 64
                      }
                    },
                    "required": [
                      "basis_versie_id",
                      "vervangingen",
                      "operatie"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "basis_versie_id": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                      },
                      "operatie": {
                        "const": "indeling"
                      },
                      "secties": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "sleutel": {
                              "type": "string",
                              "pattern": "^[a-z0-9_]{1,80}$"
                            },
                            "titel": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 120,
                              "pattern": "^[^\\x00-\\x1f\\x7f<>]+$"
                            },
                            "witruimte_voor_pt": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 72
                            },
                            "voorbeeldtekst": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 500
                            }
                          },
                          "required": [
                            "titel",
                            "witruimte_voor_pt"
                          ],
                          "additionalProperties": false,
                          "description": "Huidige zichtbare sleutels allemaal behouden, uniek en geen verborgen secties. Nieuwe sleutel weglaten of eigen_ plus32kleine hextekens. Titel wordt getrimd; voorbeeldtekst is optioneel, synthetisch en zonder persoonsgegevens/controltekens/markup. Validatie vergelijkt de actuele structuur."
                        },
                        "minItems": 1,
                        "maxItems": 24
                      }
                    },
                    "required": [
                      "basis_versie_id",
                      "secties",
                      "operatie"
                    ],
                    "additionalProperties": false
                  }
                ],
                "description": "Canonieke invoer per operatie. Weggelaten operatie betekent opmerking. Geen bevestigd-veld. Geselecteerde genormaliseerde invoer maximaal120000UTF8bytes. De queue accepteert bij afbeeldingen tot100items; de worker vereist1–64unieke sleutels, zoals hier beschreven. Indeling behoudt minimaal alle huidige zichtbare secties; maximaal24."
              }
            }
          }
        }
      },
      "get": {
        "operationId": "werkplaats_ontvangst",
        "summary": "werkplaats ontvangst",
        "description": "Ontvangst terugvinden met dezelfde Idempotency-Key en basis_versie_id, bijvoorbeeld na verloren startantwoord. Deze lookup is wel aan de oorspronkelijke API-sleutel gebonden door de adapterhash, naast organisatie/actor/profiel. Ontbrekend of verlopen404; geen nieuwe provideropdracht. Alle werkplaatsroutes vereisen de API-jobflag en readiness356 plus native werkplaatsreadiness270; ontbreken geeft503. Huidige actor-, organisatie- en objectrechten blijven vereist; private,no-store.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          },
          {
            "name": "basis_versie_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "aanvraagId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "status": {
                          "const": "ontvangen"
                        },
                        "operatie": {
                          "type": "string",
                          "enum": [
                            "opmerking",
                            "instellingen",
                            "afbeeldingen",
                            "indeling",
                            "preview"
                          ]
                        }
                      },
                      "required": [
                        "aanvraagId",
                        "status",
                        "operatie"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "aanvraagId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "status": {
                          "const": "provider_gestart"
                        },
                        "operatie": {
                          "type": "string",
                          "enum": [
                            "opmerking",
                            "instellingen",
                            "afbeeldingen",
                            "indeling",
                            "preview"
                          ]
                        }
                      },
                      "required": [
                        "aanvraagId",
                        "status",
                        "operatie"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "aanvraagId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "status": {
                          "const": "voorstel_bewaard"
                        },
                        "operatie": {
                          "type": "string",
                          "enum": [
                            "opmerking",
                            "instellingen",
                            "afbeeldingen",
                            "indeling",
                            "preview"
                          ]
                        }
                      },
                      "required": [
                        "aanvraagId",
                        "status",
                        "operatie"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "aanvraagId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "status": {
                          "const": "klaar"
                        },
                        "operatie": {
                          "const": "preview"
                        }
                      },
                      "required": [
                        "aanvraagId",
                        "status",
                        "operatie"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "aanvraagId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "status": {
                          "const": "klaar"
                        },
                        "operatie": {
                          "type": "string",
                          "enum": [
                            "opmerking",
                            "instellingen",
                            "afbeeldingen",
                            "indeling"
                          ]
                        },
                        "voorstel": {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                            },
                            "soort": {
                              "type": "string",
                              "enum": [
                                "voorstel",
                                "indeling"
                              ]
                            }
                          },
                          "required": [
                            "id",
                            "soort"
                          ],
                          "additionalProperties": false
                        },
                        "previewUrl": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "aanvraagId",
                        "status",
                        "operatie",
                        "voorstel",
                        "previewUrl"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "aanvraagId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "status": {
                          "const": "mislukt"
                        },
                        "operatie": {
                          "type": "string",
                          "enum": [
                            "opmerking",
                            "instellingen",
                            "afbeeldingen",
                            "indeling",
                            "preview"
                          ]
                        },
                        "code": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "aanvraagId",
                        "status",
                        "operatie",
                        "code"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "aanvraagId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "status": {
                          "const": "controle_nodig"
                        },
                        "operatie": {
                          "type": "string",
                          "enum": [
                            "opmerking",
                            "instellingen",
                            "afbeeldingen",
                            "indeling",
                            "preview"
                          ]
                        },
                        "code": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "aanvraagId",
                        "status",
                        "operatie",
                        "code"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige of niet ondersteunde vormgeving, geen wijziging of onbruikbare bron. Workerfouten na202 verschijnen in de status.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/werkplaats.js",
          "server/lib/stijlprofielWerkplaats.js",
          "server/jobs/stijlWerkplaatsVoorstelJobs.js",
          "server/jobs/stijlWerkplaatsOperaties.js",
          "server/jobs/stijlWerkplaatsPreviewJobs.js",
          "server/lib/stijlwerkplaatsLettertypen.js",
          "server/lib/stijlprofielOpmaakMeldingen.js",
          "server/lib/bronstijlBewerking/contract.js",
          "server/lib/stijlIndeling.js",
          "server/lib/stijlprofielAfbeeldingen.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/stijlprofielen/{id}/voorstellen/jobs/{aanvraagId}": {
      "get": {
        "operationId": "werkplaats_status",
        "summary": "werkplaats status",
        "description": "Status op aanvraagId is organisatie-/actor-/profielgebonden; deze native statusquery eist niet dezelfde API-sleutel als de start. Een andere bevoegde sleutel van dezelfde actor kan dus lezen. Ontbrekend/verlopen404. Klaar geeft voorstel en handmatig te openen previewUrl; previewjobs zelf geven geen voorstel. Dode providerjob wordt controle_nodig; opgeslagen voorstel kan nog renderherstel krijgen. Alle werkplaatsroutes vereisen de API-jobflag en readiness356 plus native werkplaatsreadiness270; ontbreken geeft503. Huidige actor-, organisatie- en objectrechten blijven vereist; private,no-store.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          },
          {
            "name": "aanvraagId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "aanvraagId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "status": {
                          "const": "ontvangen"
                        },
                        "operatie": {
                          "type": "string",
                          "enum": [
                            "opmerking",
                            "instellingen",
                            "afbeeldingen",
                            "indeling",
                            "preview"
                          ]
                        }
                      },
                      "required": [
                        "aanvraagId",
                        "status",
                        "operatie"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "aanvraagId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "status": {
                          "const": "provider_gestart"
                        },
                        "operatie": {
                          "type": "string",
                          "enum": [
                            "opmerking",
                            "instellingen",
                            "afbeeldingen",
                            "indeling",
                            "preview"
                          ]
                        }
                      },
                      "required": [
                        "aanvraagId",
                        "status",
                        "operatie"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "aanvraagId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "status": {
                          "const": "voorstel_bewaard"
                        },
                        "operatie": {
                          "type": "string",
                          "enum": [
                            "opmerking",
                            "instellingen",
                            "afbeeldingen",
                            "indeling",
                            "preview"
                          ]
                        }
                      },
                      "required": [
                        "aanvraagId",
                        "status",
                        "operatie"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "aanvraagId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "status": {
                          "const": "klaar"
                        },
                        "operatie": {
                          "const": "preview"
                        }
                      },
                      "required": [
                        "aanvraagId",
                        "status",
                        "operatie"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "aanvraagId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "status": {
                          "const": "klaar"
                        },
                        "operatie": {
                          "type": "string",
                          "enum": [
                            "opmerking",
                            "instellingen",
                            "afbeeldingen",
                            "indeling"
                          ]
                        },
                        "voorstel": {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                            },
                            "soort": {
                              "type": "string",
                              "enum": [
                                "voorstel",
                                "indeling"
                              ]
                            }
                          },
                          "required": [
                            "id",
                            "soort"
                          ],
                          "additionalProperties": false
                        },
                        "previewUrl": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "aanvraagId",
                        "status",
                        "operatie",
                        "voorstel",
                        "previewUrl"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "aanvraagId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "status": {
                          "const": "mislukt"
                        },
                        "operatie": {
                          "type": "string",
                          "enum": [
                            "opmerking",
                            "instellingen",
                            "afbeeldingen",
                            "indeling",
                            "preview"
                          ]
                        },
                        "code": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "aanvraagId",
                        "status",
                        "operatie",
                        "code"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "aanvraagId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "status": {
                          "const": "controle_nodig"
                        },
                        "operatie": {
                          "type": "string",
                          "enum": [
                            "opmerking",
                            "instellingen",
                            "afbeeldingen",
                            "indeling",
                            "preview"
                          ]
                        },
                        "code": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "aanvraagId",
                        "status",
                        "operatie",
                        "code"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige of niet ondersteunde vormgeving, geen wijziging of onbruikbare bron. Workerfouten na202 verschijnen in de status.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/werkplaats.js",
          "server/lib/stijlprofielWerkplaats.js",
          "server/jobs/stijlWerkplaatsVoorstelJobs.js",
          "server/jobs/stijlWerkplaatsOperaties.js",
          "server/jobs/stijlWerkplaatsPreviewJobs.js",
          "server/lib/stijlwerkplaatsLettertypen.js",
          "server/lib/stijlprofielOpmaakMeldingen.js",
          "server/lib/bronstijlBewerking/contract.js",
          "server/lib/stijlIndeling.js",
          "server/lib/stijlprofielAfbeeldingen.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/stijlprofielen/{id}/indeling": {
      "get": {
        "operationId": "werkplaats_indeling",
        "summary": "werkplaats indeling",
        "description": "Huidige zichtbare indeling. Alleen legacy of ondersteunde bronkopie, geen PDFformulier; aanvullende readiness352. Een afgeleide bronkopie wordt bij activeren profiel_v1 en bewaart geen exacte tabellen, bronafbeeldingen of vaste bronopmaak. Alle werkplaatsroutes vereisen de API-jobflag en readiness356 plus native werkplaatsreadiness270; ontbreken geeft503. Huidige actor-, organisatie- en objectrechten blijven vereist; private,no-store.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "basisVersieId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                    },
                    "secties": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "sleutel": {
                            "type": "string"
                          },
                          "titel": {
                            "type": "string"
                          },
                          "witruimte_voor_pt": {
                            "type": "integer"
                          },
                          "voorbeeldtekst": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "sleutel",
                          "titel",
                          "witruimte_voor_pt"
                        ],
                        "additionalProperties": false
                      },
                      "minItems": 1,
                      "maxItems": 24
                    },
                    "bewerkbareKopieVanBron": {
                      "type": "boolean"
                    },
                    "beperkingen": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "enum": [
                          "exacte_tabellen",
                          "bronafbeeldingen",
                          "vaste_bronopmaak"
                        ]
                      }
                    }
                  },
                  "required": [
                    "basisVersieId",
                    "secties",
                    "bewerkbareKopieVanBron",
                    "beperkingen"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige of niet ondersteunde vormgeving, geen wijziging of onbruikbare bron. Workerfouten na202 verschijnen in de status.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/werkplaats.js",
          "server/lib/stijlprofielWerkplaats.js",
          "server/jobs/stijlWerkplaatsVoorstelJobs.js",
          "server/jobs/stijlWerkplaatsOperaties.js",
          "server/jobs/stijlWerkplaatsPreviewJobs.js",
          "server/lib/stijlwerkplaatsLettertypen.js",
          "server/lib/stijlprofielOpmaakMeldingen.js",
          "server/lib/bronstijlBewerking/contract.js",
          "server/lib/stijlIndeling.js",
          "server/lib/stijlprofielAfbeeldingen.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/stijlprofielen/{id}/indeling/voorstellen/{voorstelId}": {
      "get": {
        "operationId": "werkplaats_indelingvoorstel",
        "summary": "werkplaats indelingvoorstel",
        "description": "Eigen actorgebonden indelingsvoorstel; ontbrekend404, verlopen en nog niet geactiveerd410. Dit is opgeslagen voorstelinhoud, geen actieve versie. Alle werkplaatsroutes vereisen de API-jobflag en readiness356 plus native werkplaatsreadiness270; ontbreken geeft503. Huidige actor-, organisatie- en objectrechten blijven vereist; private,no-store.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          },
          {
            "name": "voorstelId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "voorstel": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "basisVersieId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        }
                      },
                      "required": [
                        "id",
                        "basisVersieId"
                      ],
                      "additionalProperties": false
                    },
                    "secties": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "sleutel": {
                            "type": "string"
                          },
                          "titel": {
                            "type": "string"
                          },
                          "witruimte_voor_pt": {
                            "type": "integer"
                          },
                          "voorbeeldtekst": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "sleutel",
                          "titel",
                          "witruimte_voor_pt"
                        ],
                        "additionalProperties": false
                      }
                    }
                  },
                  "required": [
                    "voorstel",
                    "secties"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige of niet ondersteunde vormgeving, geen wijziging of onbruikbare bron. Workerfouten na202 verschijnen in de status.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/werkplaats.js",
          "server/lib/stijlprofielWerkplaats.js",
          "server/jobs/stijlWerkplaatsVoorstelJobs.js",
          "server/jobs/stijlWerkplaatsOperaties.js",
          "server/jobs/stijlWerkplaatsPreviewJobs.js",
          "server/lib/stijlwerkplaatsLettertypen.js",
          "server/lib/stijlprofielOpmaakMeldingen.js",
          "server/lib/bronstijlBewerking/contract.js",
          "server/lib/stijlIndeling.js",
          "server/lib/stijlprofielAfbeeldingen.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "delete": {
        "operationId": "werkplaats_indeling_verwijderen",
        "summary": "werkplaats indeling verwijderen",
        "description": "Verwijder uitsluitend eigen nog niet geactiveerd voorstel. Expliciet bevestigd:true; reeds toegepast409, ontbrekend404, verlopen nog niet toegepast410. Geen verwijdering van actieve/historische stijlversie. Alle werkplaatsroutes vereisen de API-jobflag en readiness356 plus native werkplaatsreadiness270; ontbreken geeft503. Huidige actor-, organisatie- en objectrechten blijven vereist; private,no-store.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          },
          {
            "name": "voorstelId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Ok"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige of niet ondersteunde vormgeving, geen wijziging of onbruikbare bron. Workerfouten na202 verschijnen in de status.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/werkplaats.js",
          "server/lib/stijlprofielWerkplaats.js",
          "server/jobs/stijlWerkplaatsVoorstelJobs.js",
          "server/jobs/stijlWerkplaatsOperaties.js",
          "server/jobs/stijlWerkplaatsPreviewJobs.js",
          "server/lib/stijlwerkplaatsLettertypen.js",
          "server/lib/stijlprofielOpmaakMeldingen.js",
          "server/lib/bronstijlBewerking/contract.js",
          "server/lib/stijlIndeling.js",
          "server/lib/stijlprofielAfbeeldingen.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bevestiging"
              }
            }
          }
        }
      }
    },
    "/v1/stijlprofielen/{id}/afbeeldingen": {
      "get": {
        "operationId": "werkplaats_afbeeldingen",
        "summary": "werkplaats afbeeldingen",
        "description": "Bevroren originele assets plus huidige vervanging/verwijdering voor Word/PDF/PowerPoint. Originele miniatuur-URLs120seconden geldig en kunnen ontbreken. Deze GET kan inventaris/miniatuurcache aanmaken; geen AI-opdracht. Schrijven gebruikt actuele originele sleutel en eigen beeld_id, nooit aangeleverde opslagpaden of vervangende beeldhashes. Unieke sleutels en maximaal64bewaarde wijzigingen. Alle werkplaatsroutes vereisen de API-jobflag en readiness356 plus native werkplaatsreadiness270; ontbreken geeft503. Huidige actor-, organisatie- en objectrechten blijven vereist; private,no-store.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "basisVersieId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                    },
                    "toelichting": {
                      "type": "object",
                      "properties": {
                        "pagina_aantal": {
                          "anyOf": [
                            {
                              "type": "integer"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "gescande_paginas": {
                          "type": "integer"
                        },
                        "afgekapt": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "pagina_aantal",
                        "gescande_paginas",
                        "afgekapt"
                      ],
                      "additionalProperties": false
                    },
                    "afbeeldingen": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "sleutel": {
                            "type": "string",
                            "pattern": "^[a-f0-9]{64}$"
                          },
                          "origineel": {
                            "type": "object",
                            "properties": {
                              "preview_url": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "breedte": {
                                "type": "number"
                              },
                              "hoogte": {
                                "type": "number"
                              }
                            },
                            "required": [
                              "breedte",
                              "hoogte"
                            ],
                            "additionalProperties": false
                          },
                          "huidig": {
                            "oneOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "bron": {
                                    "type": "string",
                                    "enum": [
                                      "origineel",
                                      "verwijderd"
                                    ]
                                  }
                                },
                                "required": [
                                  "bron"
                                ],
                                "additionalProperties": false
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "bron": {
                                    "const": "beeldbank"
                                  },
                                  "beeld_sha256": {
                                    "type": "string",
                                    "pattern": "^[a-f0-9]{64}$"
                                  },
                                  "passing": {
                                    "type": "string",
                                    "enum": [
                                      "passend",
                                      "vullend"
                                    ]
                                  },
                                  "naam": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "preview_url": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "breedte": {
                                    "anyOf": [
                                      {
                                        "type": "number"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "hoogte": {
                                    "anyOf": [
                                      {
                                        "type": "number"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "bron",
                                  "beeld_sha256",
                                  "passing",
                                  "naam",
                                  "preview_url",
                                  "breedte",
                                  "hoogte"
                                ],
                                "additionalProperties": false
                              }
                            ]
                          },
                          "plaatsingen": {
                            "type": "array",
                            "items": {
                              "oneOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "locatie": {
                                      "type": "string",
                                      "enum": [
                                        "inhoud",
                                        "koptekst",
                                        "voettekst",
                                        "voetnoot",
                                        "master",
                                        "layout"
                                      ]
                                    },
                                    "aantal": {
                                      "type": "integer",
                                      "minimum": 0
                                    }
                                  },
                                  "required": [
                                    "locatie",
                                    "aantal"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "object",
                                  "properties": {
                                    "locatie": {
                                      "const": "pagina"
                                    },
                                    "aantal": {
                                      "type": "integer",
                                      "minimum": 0
                                    },
                                    "pagina": {
                                      "type": "integer"
                                    }
                                  },
                                  "required": [
                                    "locatie",
                                    "aantal",
                                    "pagina"
                                  ],
                                  "additionalProperties": false
                                }
                              ]
                            }
                          }
                        },
                        "required": [
                          "sleutel",
                          "origineel",
                          "huidig",
                          "plaatsingen"
                        ],
                        "additionalProperties": false
                      }
                    }
                  },
                  "required": [
                    "basisVersieId",
                    "toelichting",
                    "afbeeldingen"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige of niet ondersteunde vormgeving, geen wijziging of onbruikbare bron. Workerfouten na202 verschijnen in de status.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/werkplaats.js",
          "server/lib/stijlprofielWerkplaats.js",
          "server/jobs/stijlWerkplaatsVoorstelJobs.js",
          "server/jobs/stijlWerkplaatsOperaties.js",
          "server/jobs/stijlWerkplaatsPreviewJobs.js",
          "server/lib/stijlwerkplaatsLettertypen.js",
          "server/lib/stijlprofielOpmaakMeldingen.js",
          "server/lib/bronstijlBewerking/contract.js",
          "server/lib/stijlIndeling.js",
          "server/lib/stijlprofielAfbeeldingen.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/stijlprofielen/{id}/voorstellen/{voorstelId}/activeren": {
      "post": {
        "operationId": "werkplaats_activeren",
        "summary": "werkplaats activeren",
        "description": "Expliciete publicatie met huidige actieve basis en exact opgeslagen previewhash. CAS en actuele publicatierechten worden opnieuw getoetst. Eerst exacte voorstelpreview openen; geen automatische activatie na klaarstatus. Geen algemene idempotentieontvangst: na verloren antwoord eerst werkplaats/versies lezen. Indeling vereist ook dat bodybasis gelijk is aan voorstelbasis. Alle werkplaatsroutes vereisen de API-jobflag en readiness356 plus native werkplaatsreadiness270; ontbreken geeft503. Huidige actor-, organisatie- en objectrechten blijven vereist; private,no-store.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          },
          {
            "name": "voorstelId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "profielversie": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "nummer": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "id",
                        "nummer"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "profielversie"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige of niet ondersteunde vormgeving, geen wijziging of onbruikbare bron. Workerfouten na202 verschijnen in de status.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/werkplaats.js",
          "server/lib/stijlprofielWerkplaats.js",
          "server/jobs/stijlWerkplaatsVoorstelJobs.js",
          "server/jobs/stijlWerkplaatsOperaties.js",
          "server/jobs/stijlWerkplaatsPreviewJobs.js",
          "server/lib/stijlwerkplaatsLettertypen.js",
          "server/lib/stijlprofielOpmaakMeldingen.js",
          "server/lib/bronstijlBewerking/contract.js",
          "server/lib/stijlIndeling.js",
          "server/lib/stijlprofielAfbeeldingen.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis_versie_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                  },
                  "bevestigd": {
                    "const": true
                  },
                  "preview_hash": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  }
                },
                "required": [
                  "basis_versie_id",
                  "bevestigd",
                  "preview_hash"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/stijlprofielen/{id}/voorstellen/{voorstelId}": {
      "delete": {
        "operationId": "werkplaats_verwijderen",
        "summary": "werkplaats verwijderen",
        "description": "Verwijder uitsluitend eigen nog niet geactiveerd voorstel. Expliciet bevestigd:true; reeds toegepast409, ontbrekend404, verlopen nog niet toegepast410. Geen verwijdering van actieve/historische stijlversie. Alle werkplaatsroutes vereisen de API-jobflag en readiness356 plus native werkplaatsreadiness270; ontbreken geeft503. Huidige actor-, organisatie- en objectrechten blijven vereist; private,no-store.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          },
          {
            "name": "voorstelId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Ok"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige of niet ondersteunde vormgeving, geen wijziging of onbruikbare bron. Workerfouten na202 verschijnen in de status.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/werkplaats.js",
          "server/lib/stijlprofielWerkplaats.js",
          "server/jobs/stijlWerkplaatsVoorstelJobs.js",
          "server/jobs/stijlWerkplaatsOperaties.js",
          "server/jobs/stijlWerkplaatsPreviewJobs.js",
          "server/lib/stijlwerkplaatsLettertypen.js",
          "server/lib/stijlprofielOpmaakMeldingen.js",
          "server/lib/bronstijlBewerking/contract.js",
          "server/lib/stijlIndeling.js",
          "server/lib/stijlprofielAfbeeldingen.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bevestiging"
              }
            }
          }
        }
      }
    },
    "/v1/stijlprofielen/{id}/indeling/voorstellen/{voorstelId}/activeren": {
      "post": {
        "operationId": "werkplaats_indeling_activeren",
        "summary": "werkplaats indeling activeren",
        "description": "Expliciete publicatie met huidige actieve basis en exact opgeslagen previewhash. CAS en actuele publicatierechten worden opnieuw getoetst. Eerst exacte voorstelpreview openen; geen automatische activatie na klaarstatus. Geen algemene idempotentieontvangst: na verloren antwoord eerst werkplaats/versies lezen. Indeling vereist ook dat bodybasis gelijk is aan voorstelbasis. Alle werkplaatsroutes vereisen de API-jobflag en readiness356 plus native werkplaatsreadiness270; ontbreken geeft503. Huidige actor-, organisatie- en objectrechten blijven vereist; private,no-store.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          },
          {
            "name": "voorstelId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "profielversie": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "nummer": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "engine": {
                          "const": "profiel_v1"
                        }
                      },
                      "required": [
                        "id",
                        "nummer",
                        "engine"
                      ],
                      "additionalProperties": false
                    },
                    "bewerkbareKopieVanBron": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "profielversie",
                    "bewerkbareKopieVanBron"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige of niet ondersteunde vormgeving, geen wijziging of onbruikbare bron. Workerfouten na202 verschijnen in de status.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/werkplaats.js",
          "server/lib/stijlprofielWerkplaats.js",
          "server/jobs/stijlWerkplaatsVoorstelJobs.js",
          "server/jobs/stijlWerkplaatsOperaties.js",
          "server/jobs/stijlWerkplaatsPreviewJobs.js",
          "server/lib/stijlwerkplaatsLettertypen.js",
          "server/lib/stijlprofielOpmaakMeldingen.js",
          "server/lib/bronstijlBewerking/contract.js",
          "server/lib/stijlIndeling.js",
          "server/lib/stijlprofielAfbeeldingen.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis_versie_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                  },
                  "bevestigd": {
                    "const": true
                  },
                  "preview_hash": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  }
                },
                "required": [
                  "basis_versie_id",
                  "bevestigd",
                  "preview_hash"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/stijlprofielen/{id}/voorstellen/{voorstelId}/preview": {
      "get": {
        "operationId": "werkplaats_voorstel_preview",
        "summary": "werkplaats voorstel preview",
        "description": "Deze GET kan een modelvrije achtergrondrender plannen.202 JSON met aanvraagId/status en Retry-After:2; later handmatig opnieuw openen.200 levert gecontroleerde PDFbytes (cache maximaal80MiB) plus X-Rapportly-Preview-Hash. Voorstellen zijn actorgebonden en krijgen hun eerste vaste previewhash; afwijkende nieuwe bytes409. Versiepreview registreert bekeken_op bij de huidige API-sleutel in de huidige UTC-dagcache. Dat specifieke bewijs is nodig voor versieherstel; na dagwisseling opnieuw openen. Dit is geen zuiver passieve leesactie, daarom niet automatisch in de importcollectie uitgevoerd. Alle werkplaatsroutes vereisen de API-jobflag en readiness356 plus native werkplaatsreadiness270; ontbreken geeft503. Huidige actor-, organisatie- en objectrechten blijven vereist; private,no-store.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          },
          {
            "name": "voorstelId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "X-Rapportly-Preview-Hash": {
                "schema": {
                  "type": "string",
                  "pattern": "^[a-f0-9]{64}$"
                }
              },
              "X-Content-Type-Options": {
                "schema": {
                  "const": "nosniff"
                }
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige of niet ondersteunde vormgeving, geen wijziging of onbruikbare bron. Workerfouten na202 verschijnen in de status.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "202": {
            "description": "Render ingepland of bezig; geen PDF en geen activatiebewijs.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "aanvraagId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "ontvangen",
                        "provider_gestart",
                        "voorstel_bewaard",
                        "klaar",
                        "mislukt",
                        "controle_nodig"
                      ]
                    }
                  },
                  "required": [
                    "aanvraagId",
                    "status"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Retry-After": {
                "schema": {
                  "const": "2"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/werkplaats.js",
          "server/lib/stijlprofielWerkplaats.js",
          "server/jobs/stijlWerkplaatsVoorstelJobs.js",
          "server/jobs/stijlWerkplaatsOperaties.js",
          "server/jobs/stijlWerkplaatsPreviewJobs.js",
          "server/lib/stijlwerkplaatsLettertypen.js",
          "server/lib/stijlprofielOpmaakMeldingen.js",
          "server/lib/bronstijlBewerking/contract.js",
          "server/lib/stijlIndeling.js",
          "server/lib/stijlprofielAfbeeldingen.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/stijlprofielen/{id}/indeling/voorstellen/{voorstelId}/preview": {
      "get": {
        "operationId": "werkplaats_indeling_preview",
        "summary": "werkplaats indeling preview",
        "description": "Deze GET kan een modelvrije achtergrondrender plannen.202 JSON met aanvraagId/status en Retry-After:2; later handmatig opnieuw openen.200 levert gecontroleerde PDFbytes (cache maximaal80MiB) plus X-Rapportly-Preview-Hash. Voorstellen zijn actorgebonden en krijgen hun eerste vaste previewhash; afwijkende nieuwe bytes409. Versiepreview registreert bekeken_op bij de huidige API-sleutel in de huidige UTC-dagcache. Dat specifieke bewijs is nodig voor versieherstel; na dagwisseling opnieuw openen. Dit is geen zuiver passieve leesactie, daarom niet automatisch in de importcollectie uitgevoerd. Alle werkplaatsroutes vereisen de API-jobflag en readiness356 plus native werkplaatsreadiness270; ontbreken geeft503. Huidige actor-, organisatie- en objectrechten blijven vereist; private,no-store.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          },
          {
            "name": "voorstelId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "X-Rapportly-Preview-Hash": {
                "schema": {
                  "type": "string",
                  "pattern": "^[a-f0-9]{64}$"
                }
              },
              "X-Content-Type-Options": {
                "schema": {
                  "const": "nosniff"
                }
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige of niet ondersteunde vormgeving, geen wijziging of onbruikbare bron. Workerfouten na202 verschijnen in de status.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "202": {
            "description": "Render ingepland of bezig; geen PDF en geen activatiebewijs.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "aanvraagId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "ontvangen",
                        "provider_gestart",
                        "voorstel_bewaard",
                        "klaar",
                        "mislukt",
                        "controle_nodig"
                      ]
                    }
                  },
                  "required": [
                    "aanvraagId",
                    "status"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Retry-After": {
                "schema": {
                  "const": "2"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/werkplaats.js",
          "server/lib/stijlprofielWerkplaats.js",
          "server/jobs/stijlWerkplaatsVoorstelJobs.js",
          "server/jobs/stijlWerkplaatsOperaties.js",
          "server/jobs/stijlWerkplaatsPreviewJobs.js",
          "server/lib/stijlwerkplaatsLettertypen.js",
          "server/lib/stijlprofielOpmaakMeldingen.js",
          "server/lib/bronstijlBewerking/contract.js",
          "server/lib/stijlIndeling.js",
          "server/lib/stijlprofielAfbeeldingen.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/stijlprofielen/{id}/versies/{versieId}/preview": {
      "get": {
        "operationId": "werkplaats_versie_preview",
        "summary": "werkplaats versie preview",
        "description": "Deze GET kan een modelvrije achtergrondrender plannen.202 JSON met aanvraagId/status en Retry-After:2; later handmatig opnieuw openen.200 levert gecontroleerde PDFbytes (cache maximaal80MiB) plus X-Rapportly-Preview-Hash. Voorstellen zijn actorgebonden en krijgen hun eerste vaste previewhash; afwijkende nieuwe bytes409. Versiepreview registreert bekeken_op bij de huidige API-sleutel in de huidige UTC-dagcache. Dat specifieke bewijs is nodig voor versieherstel; na dagwisseling opnieuw openen. Dit is geen zuiver passieve leesactie, daarom niet automatisch in de importcollectie uitgevoerd. Alle werkplaatsroutes vereisen de API-jobflag en readiness356 plus native werkplaatsreadiness270; ontbreken geeft503. Huidige actor-, organisatie- en objectrechten blijven vereist; private,no-store.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          },
          {
            "name": "versieId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "X-Rapportly-Preview-Hash": {
                "schema": {
                  "type": "string",
                  "pattern": "^[a-f0-9]{64}$"
                }
              },
              "X-Content-Type-Options": {
                "schema": {
                  "const": "nosniff"
                }
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige of niet ondersteunde vormgeving, geen wijziging of onbruikbare bron. Workerfouten na202 verschijnen in de status.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "202": {
            "description": "Render ingepland of bezig; geen PDF en geen activatiebewijs.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "aanvraagId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "ontvangen",
                        "provider_gestart",
                        "voorstel_bewaard",
                        "klaar",
                        "mislukt",
                        "controle_nodig"
                      ]
                    }
                  },
                  "required": [
                    "aanvraagId",
                    "status"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Retry-After": {
                "schema": {
                  "const": "2"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/werkplaats.js",
          "server/lib/stijlprofielWerkplaats.js",
          "server/jobs/stijlWerkplaatsVoorstelJobs.js",
          "server/jobs/stijlWerkplaatsOperaties.js",
          "server/jobs/stijlWerkplaatsPreviewJobs.js",
          "server/lib/stijlwerkplaatsLettertypen.js",
          "server/lib/stijlprofielOpmaakMeldingen.js",
          "server/lib/bronstijlBewerking/contract.js",
          "server/lib/stijlIndeling.js",
          "server/lib/stijlprofielAfbeeldingen.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/stijlprofielen/{id}/preview": {
      "get": {
        "operationId": "werkplaats_actief_preview",
        "summary": "werkplaats actief preview",
        "description": "Deze GET kan een modelvrije achtergrondrender plannen.202 JSON met aanvraagId/status en Retry-After:2; later handmatig opnieuw openen.200 levert gecontroleerde PDFbytes (cache maximaal80MiB) plus X-Rapportly-Preview-Hash. Voorstellen zijn actorgebonden en krijgen hun eerste vaste previewhash; afwijkende nieuwe bytes409. Versiepreview registreert bekeken_op bij de huidige API-sleutel in de huidige UTC-dagcache. Dat specifieke bewijs is nodig voor versieherstel; na dagwisseling opnieuw openen. Dit is geen zuiver passieve leesactie, daarom niet automatisch in de importcollectie uitgevoerd. Alle werkplaatsroutes vereisen de API-jobflag en readiness356 plus native werkplaatsreadiness270; ontbreken geeft503. Huidige actor-, organisatie- en objectrechten blijven vereist; private,no-store.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "X-Rapportly-Preview-Hash": {
                "schema": {
                  "type": "string",
                  "pattern": "^[a-f0-9]{64}$"
                }
              },
              "X-Content-Type-Options": {
                "schema": {
                  "const": "nosniff"
                }
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige of niet ondersteunde vormgeving, geen wijziging of onbruikbare bron. Workerfouten na202 verschijnen in de status.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "202": {
            "description": "Render ingepland of bezig; geen PDF en geen activatiebewijs.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "aanvraagId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "ontvangen",
                        "provider_gestart",
                        "voorstel_bewaard",
                        "klaar",
                        "mislukt",
                        "controle_nodig"
                      ]
                    }
                  },
                  "required": [
                    "aanvraagId",
                    "status"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Retry-After": {
                "schema": {
                  "const": "2"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/werkplaats.js",
          "server/lib/stijlprofielWerkplaats.js",
          "server/jobs/stijlWerkplaatsVoorstelJobs.js",
          "server/jobs/stijlWerkplaatsOperaties.js",
          "server/jobs/stijlWerkplaatsPreviewJobs.js",
          "server/lib/stijlwerkplaatsLettertypen.js",
          "server/lib/stijlprofielOpmaakMeldingen.js",
          "server/lib/bronstijlBewerking/contract.js",
          "server/lib/stijlIndeling.js",
          "server/lib/stijlprofielAfbeeldingen.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/stijlprofielen/{id}/versies": {
      "get": {
        "operationId": "werkplaats_versies",
        "summary": "werkplaats versies",
        "description": "Nieuwste100bruikbare versies, aflopend versienummer, geen cursor. Gewijzigd is auditmetadata; ontbrekende auditrij geeft lege lijst, auditqueryfout503. Lijst is geen volledige historie-export. Alle werkplaatsroutes vereisen de API-jobflag en readiness356 plus native werkplaatsreadiness270; ontbreken geeft503. Huidige actor-, organisatie- en objectrechten blijven vereist; private,no-store.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "versies": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                          },
                          "nummer": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "aangemaaktOp": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "actief": {
                            "type": "boolean"
                          },
                          "gewijzigd": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          }
                        },
                        "required": [
                          "id",
                          "nummer",
                          "aangemaaktOp",
                          "actief",
                          "gewijzigd"
                        ],
                        "additionalProperties": false
                      },
                      "maxItems": 100
                    }
                  },
                  "required": [
                    "versies"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige of niet ondersteunde vormgeving, geen wijziging of onbruikbare bron. Workerfouten na202 verschijnen in de status.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/werkplaats.js",
          "server/lib/stijlprofielWerkplaats.js",
          "server/jobs/stijlWerkplaatsVoorstelJobs.js",
          "server/jobs/stijlWerkplaatsOperaties.js",
          "server/jobs/stijlWerkplaatsPreviewJobs.js",
          "server/lib/stijlwerkplaatsLettertypen.js",
          "server/lib/stijlprofielOpmaakMeldingen.js",
          "server/lib/bronstijlBewerking/contract.js",
          "server/lib/stijlIndeling.js",
          "server/lib/stijlprofielAfbeeldingen.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/stijlprofielen/{id}/versies/{versieId}/herstellen": {
      "post": {
        "operationId": "werkplaats_versieherstellen",
        "summary": "werkplaats versieherstellen",
        "description": "Herstel op basis van huidige actieve versie met expliciete bevestiging en exact bekeken previewhash van doelversie. Dezelfde API-sleutel moet de huidige UTC-dagpreview hebben geopend; zonder bewijs409, herstel plant zelf geen render. Publicatie via bestaande CAS/rechten, geen nieuwe AI-opdracht. Na verloren antwoord eerst actieve versie lezen. Alle werkplaatsroutes vereisen de API-jobflag en readiness356 plus native werkplaatsreadiness270; ontbreken geeft503. Huidige actor-, organisatie- en objectrechten blijven vereist; private,no-store.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          },
          {
            "name": "versieId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "profielversie": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                        },
                        "nummer": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "id",
                        "nummer"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "profielversie"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige of niet ondersteunde vormgeving, geen wijziging of onbruikbare bron. Workerfouten na202 verschijnen in de status.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/werkplaats.js",
          "server/lib/stijlprofielWerkplaats.js",
          "server/jobs/stijlWerkplaatsVoorstelJobs.js",
          "server/jobs/stijlWerkplaatsOperaties.js",
          "server/jobs/stijlWerkplaatsPreviewJobs.js",
          "server/lib/stijlwerkplaatsLettertypen.js",
          "server/lib/stijlprofielOpmaakMeldingen.js",
          "server/lib/bronstijlBewerking/contract.js",
          "server/lib/stijlIndeling.js",
          "server/lib/stijlprofielAfbeeldingen.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis_versie_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                  },
                  "bevestigd": {
                    "const": true
                  },
                  "preview_hash": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  }
                },
                "required": [
                  "basis_versie_id",
                  "bevestigd",
                  "preview_hash"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/stijlmaker/jobs/voorstellen": {
      "post": {
        "operationId": "stijlmaker_voorstellen",
        "summary": "stijlmaker voorstellen",
        "description": "Multipart: maximaal1screenshot en1logo, ieder5MiB, maximaal8tekstvelden en10parts; veld maximaal8MiB. Canonieke tekstgrenzen gelden na trimmen; bedrijfsnaam/controltekens en omschrijving worden door worker gecontroleerd. Ontbrekende uitstraling gebruikt voorstel. Website optioneel; als ingevuld alleen publieke HTTPSsite, geen credentials of afwijkende poort, beperkte redirects/stylesheetlezer en15secondentijdgrens. Website mag een netwerkleesactie veroorzaken. Screenshot/logo worden inhoudelijk als raster gedecodeerd. InvoerJSON inclusief base64bestanden maximaal15MiB. Adapter leidt per API-sleutel een vaste UUID af uit de publieke Idempotency-Key; gelijke input herhaalt202, gewijzigde input/bewerking409.202 kan aan inhoudelijke workerweigering voorafgaan; ontvangst:false bewijst geen opgeslagen ontvangst, ontbrekend ontvangst:false bewijst dat niet. Modelvrij; geen betaalde AI-provider. Jobflag uit404; ontbrekende service/readiness361503. Private,no-store. Ontvangst/invoer/resultaat48uur; verlopen410. Muterende routes maximaal30verzoeken per15minuten per organisatie/actor, naast API-limieten.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{7,127}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StijlmakerOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlmaker.js",
          "server/rapportly_stijlmaker_api.js",
          "server/jobs/stijlmakerJobs.js",
          "server/lib/stijlmaker/ontwerp.js",
          "server/lib/stijlmaker/voorbeeld.js",
          "server/lib/stijlmaker/website.js",
          "server/lib/templateV2/veiligheid.js",
          "server/migrations/361_rapportly_stijlmaker_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "bedrijfsnaam": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100
                  },
                  "omschrijving": {
                    "type": "string",
                    "maxLength": 1200
                  },
                  "uitstraling": {
                    "type": "string",
                    "enum": [
                      "voorstel",
                      "rustig",
                      "warm",
                      "uitgesproken"
                    ]
                  },
                  "website": {
                    "type": "string",
                    "maxLength": 2048
                  },
                  "screenshot": {
                    "type": "string",
                    "format": "binary"
                  },
                  "logo": {
                    "type": "string",
                    "format": "binary"
                  }
                },
                "required": [
                  "bedrijfsnaam"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/stijlmaker/jobs/voorbeeld": {
      "post": {
        "operationId": "stijlmaker_voorbeeld",
        "summary": "stijlmaker voorbeeld",
        "description": "Genereer een synthetisch downloadbaar voorbeeld uit een ontwerp. Geen bestanden in multipart; logo alleen via optionele dataURI in ontwerp. JSONparsefout400 met ontvangst:false; ontwerp-/soortvalidatie kan later een mislukte receipt opleveren. Maximaal8velden/10parts en8MiBpertekstveld, totale bewaardeJSON15MiB. Standaard documentuitvoer: presentatie→PPTX, excel→XLSX, overige→DOCX; huisstijl→PNG. Een resultaat maakt geen actieve huisstijl. Modelvrij; geen betaalde AI-provider. Jobflag uit404; ontbrekende service/readiness361503. Private,no-store. Ontvangst/invoer/resultaat48uur; verlopen410. Muterende routes maximaal30verzoeken per15minuten per organisatie/actor, naast API-limieten.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{7,127}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StijlmakerOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlmaker.js",
          "server/rapportly_stijlmaker_api.js",
          "server/jobs/stijlmakerJobs.js",
          "server/lib/stijlmaker/ontwerp.js",
          "server/lib/stijlmaker/voorbeeld.js",
          "server/lib/stijlmaker/website.js",
          "server/lib/templateV2/veiligheid.js",
          "server/migrations/361_rapportly_stijlmaker_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "ontwerp": {
                    "type": "string",
                    "contentMediaType": "application/json",
                    "contentSchema": {
                      "$ref": "#/components/schemas/StijlmakerOntwerpInvoer"
                    }
                  },
                  "soort": {
                    "type": "string",
                    "enum": [
                      "rapport",
                      "presentatie",
                      "excel",
                      "offerte",
                      "email",
                      "gespreksverslag",
                      "formulier",
                      "anders"
                    ]
                  },
                  "taal": {
                    "type": "string",
                    "default": "nl"
                  },
                  "uitvoer": {
                    "type": "string",
                    "enum": [
                      "document",
                      "huisstijl"
                    ]
                  }
                },
                "required": [
                  "ontwerp",
                  "soort"
                ],
                "additionalProperties": false,
                "description": "Multipart zonder bestanden. ontwerp is één JSONstring, geen genest multipartobject. Taal basiscode wordt naar kleine letters genormaliseerd, regiocode genegeerd; onbekende taal valt terug op Engels, ontbrekende taal op Nederlands. huisstijl alleen voor rapport/offerte/email/gespreksverslag; document is standaard."
              }
            }
          }
        }
      }
    },
    "/v1/stijlmaker/jobs/ontvangst/{sleutel}": {
      "get": {
        "operationId": "stijlmaker_ontvangst",
        "summary": "stijlmaker ontvangst",
        "description": "Lookup met de oorspronkelijke idempotentietekst als URLpadsegment. Adapter vertaalt die per API-sleutel naar de native UUID. Daardoor dezelfde oorspronkelijke sleutel gebruiken.404is nog geen ontvangst; bij onzeker uploadantwoord eerst lookup, niet meteen een nieuwe opdracht. Modelvrij; geen betaalde AI-provider. Jobflag uit404; ontbrekende service/readiness361503. Private,no-store. Ontvangst/invoer/resultaat48uur; verlopen410. Muterende routes maximaal30verzoeken per15minuten per organisatie/actor, naast API-limieten.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "sleutel",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9_.-]{8,128}$",
              "description": "Ontvangstpad accepteert letters/cijfers/underscore/punt/streepje. Bij start geldt daarnaast de algemene headerpoort: eerste teken letter/cijfer. Dubbelepunt is hier niet toegestaan."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StijlmakerOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlmaker.js",
          "server/rapportly_stijlmaker_api.js",
          "server/jobs/stijlmakerJobs.js",
          "server/lib/stijlmaker/ontwerp.js",
          "server/lib/stijlmaker/voorbeeld.js",
          "server/lib/stijlmaker/website.js",
          "server/lib/templateV2/veiligheid.js",
          "server/migrations/361_rapportly_stijlmaker_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/stijlmaker/jobs/{id}": {
      "get": {
        "operationId": "stijlmaker_status",
        "summary": "stijlmaker status",
        "description": "Native query is organisatie-/actor-/aanvraaggebonden en controleert huidige actor. De query vereist niet oorspronkelijke API-sleutel; een andere bevoegde sleutel van dezelfde actor kan status via aanvraagId lezen. Gebruik aanvraagId uit receipt, niet de afgeleide ontvangstUUID. Modelvrij; geen betaalde AI-provider. Jobflag uit404; ontbrekende service/readiness361503. Private,no-store. Ontvangst/invoer/resultaat48uur; verlopen410. Muterende routes maximaal30verzoeken per15minuten per organisatie/actor, naast API-limieten.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StijlmakerOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlmaker.js",
          "server/rapportly_stijlmaker_api.js",
          "server/jobs/stijlmakerJobs.js",
          "server/lib/stijlmaker/ontwerp.js",
          "server/lib/stijlmaker/voorbeeld.js",
          "server/lib/stijlmaker/website.js",
          "server/lib/templateV2/veiligheid.js",
          "server/migrations/361_rapportly_stijlmaker_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/stijlmaker/jobs/ontvangst/{sleutel}/afbreken": {
      "post": {
        "operationId": "stijlmaker_upload_afbreken",
        "summary": "stijlmaker upload afbreken",
        "description": "Breekt uitsluitend een onvolledige upload zonder geplande job af; ontvangen/bezig/klaar blijft bestaan en geeft afgebroken:false. Kan vooraf een mislukte technische ontvangst vastleggen om een late upload te blokkeren; een eerdere afbreking herhaalttrue. Geen algemene jobannulering, geen bevestigd-veld en geen nieuwe headeridempotentie: de oorspronkelijke sleutel staat in het pad. Algemene proefperiodepoort blijft gelden. Modelvrij; geen betaalde AI-provider. Jobflag uit404; ontbrekende service/readiness361503. Private,no-store. Ontvangst/invoer/resultaat48uur; verlopen410. Muterende routes maximaal30verzoeken per15minuten per organisatie/actor, naast API-limieten.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "sleutel",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9_.-]{8,128}$",
              "description": "Ontvangstpad accepteert letters/cijfers/underscore/punt/streepje. Bij start geldt daarnaast de algemene headerpoort: eerste teken letter/cijfer. Dubbelepunt is hier niet toegestaan."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "afgebroken": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "afgebroken"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlmaker.js",
          "server/rapportly_stijlmaker_api.js",
          "server/jobs/stijlmakerJobs.js",
          "server/lib/stijlmaker/ontwerp.js",
          "server/lib/stijlmaker/voorbeeld.js",
          "server/lib/stijlmaker/website.js",
          "server/lib/templateV2/veiligheid.js",
          "server/migrations/361_rapportly_stijlmaker_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "bewerking": {
                    "type": "string",
                    "enum": [
                      "voorstellen",
                      "voorbeeld"
                    ]
                  }
                },
                "required": [
                  "bewerking"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/stijlmaker/jobs/{id}/resultaat": {
      "get": {
        "operationId": "stijlmaker_resultaat",
        "summary": "stijlmaker resultaat",
        "description": "Altijd application/json, ook voor een documentvoorbeeld. Voorstellen geven drie concrete ontwerpen; voorbeeld geeft bestandbase64+mime+ext+invoermetadata. Alleen klaar; nogbezig wordt503 stijlmaker_nog_bezig. Resultaatpad, maximale24MiB en hash gecontroleerd; actor opnieuw gecontroleerd na download. Zelfde actor-/organisatiegrens als status, geen signedURL. Aanvullende ontwerpvelden behouden hun expliciet willekeurige JSONwaarde; alleen beschreven renderingvelden hebben productsemantiek. Modelvrij; geen betaalde AI-provider. Jobflag uit404; ontbrekende service/readiness361503. Private,no-store. Ontvangst/invoer/resultaat48uur; verlopen410. Muterende routes maximaal30verzoeken per15minuten per organisatie/actor, naast API-limieten.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/StijlmakerVoorstellenResultaat"
                    },
                    {
                      "$ref": "#/components/schemas/StijlmakerVoorbeeldResultaat"
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlmaker.js",
          "server/rapportly_stijlmaker_api.js",
          "server/jobs/stijlmakerJobs.js",
          "server/lib/stijlmaker/ontwerp.js",
          "server/lib/stijlmaker/voorbeeld.js",
          "server/lib/stijlmaker/website.js",
          "server/lib/templateV2/veiligheid.js",
          "server/migrations/361_rapportly_stijlmaker_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/bronprofielen": {
      "get": {
        "operationId": "bronprofielen_lijst",
        "summary": "bronprofielen lijst",
        "description": "Actieve profielen binnen huidige organisatie, aflopend bijgewerkt_op en daarna id. Alleen limiet/offsetquery, standaard30/0. Antwoord geeft pagina zonder heeft_meer/totaal. Opslagfout409 bronprofielen_niet_beschikbaar; geen lege succeslijst bij fout. Velden volgen normalisatie van huidige producent.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "limiet",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 30
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "bronprofielen": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Bronprofiel"
                      }
                    },
                    "pagina": {
                      "type": "object",
                      "properties": {
                        "limiet": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 100
                        },
                        "offset": {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 10000
                        }
                      },
                      "required": [
                        "limiet",
                        "offset"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "bronprofielen",
                    "pagina"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/bronprofielen.js",
          "server/rapportly_brondocument_api.js",
          "server/jobs/bronverwerkingJobs.js",
          "server/jobs/handlers/bronverwerking.js",
          "server/migrations/198_rapportly_brondocument_profielen.sql",
          "server/migrations/358_rapportly_bronverwerking_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "post": {
        "operationId": "bronprofiel_aanmaken",
        "summary": "bronprofiel aanmaken",
        "description": "201nieuw profiel met handmatig meegegeven genormaliseerde velden;202duurzame afleiding zonder velden en zonder versienummer in eerste antwoord;200exacte herhaling met huidige status/versie. Jobflag/readiness358 altijd vereist; zonder velden bovendien persoonlijke werkelijkekostenmodus. Invoerhash omvat genormaliseerde tekst, velden en bestandsnaam/MIME/bytes/hash. Nieuwe inhoud onder dezelfde sleutel409; verwijderd profiel of definitief vervallen upload410, niet opnieuw aanmaken. Opgeslagen velden maken aanmaak modelvrij; instructieafleiding kan klantcredits gebruiken. Voortgang via GETprofiel, geen aparte externe jobstatusroute. Bestandsvalidatiefout kan in adapter als bronprofiel_onbeschikbaar met HTTP400 terugkomen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "bronprofiel": {
                      "$ref": "#/components/schemas/BronprofielStart"
                    }
                  },
                  "required": [
                    "bronprofiel"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "201": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "bronprofiel": {
                      "$ref": "#/components/schemas/BronprofielStart"
                    }
                  },
                  "required": [
                    "bronprofiel"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "bronprofiel": {
                      "$ref": "#/components/schemas/BronprofielStart"
                    }
                  },
                  "required": [
                    "bronprofiel"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/bronprofielen.js",
          "server/rapportly_brondocument_api.js",
          "server/jobs/bronverwerkingJobs.js",
          "server/jobs/handlers/bronverwerking.js",
          "server/migrations/198_rapportly_brondocument_profielen.sql",
          "server/migrations/358_rapportly_bronverwerking_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "naam": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120,
                    "pattern": "\\S"
                  },
                  "omschrijving": {
                    "type": "string",
                    "maxLength": 1000
                  },
                  "instructie": {
                    "type": "string",
                    "maxLength": 30000
                  },
                  "velden": {
                    "type": "string",
                    "contentMediaType": "application/json",
                    "contentSchema": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "sleutel": {
                            "type": "string",
                            "maxLength": 80
                          },
                          "naam": {
                            "type": "string",
                            "maxLength": 120
                          },
                          "vraag": {
                            "type": "string",
                            "maxLength": 500
                          },
                          "waarom": {
                            "type": "string",
                            "maxLength": 500
                          },
                          "doel": {
                            "type": "string",
                            "maxLength": 300
                          },
                          "verplicht": {
                            "type": "boolean"
                          }
                        },
                        "required": [],
                        "additionalProperties": false,
                        "description": "Alle velden optioneel; normalisatie maakt sleutel/naam/vraag waar nodig. Sleutel wordt ASCII snake_case, maximaal80tekens; dubbele sleutel krijgt indexsuffix. Lege naam/vraag na trimmen wordt weggefilterd. Geen extra keys bij aanmaak."
                      },
                      "maxItems": 30
                    },
                    "default": "[]"
                  },
                  "voorbeeld": {
                    "type": "string",
                    "format": "binary"
                  },
                  "instructiebestand": {
                    "type": "string",
                    "format": "binary"
                  }
                },
                "required": [
                  "naam"
                ],
                "additionalProperties": false,
                "description": "Multipart met optioneel1voorbeeld en1instructiebestand. velden is een JSONstring van maximaal30objecten, geen genest multipartobject. Na normalisatie minimaal1veld of instructietekst of instructiebestand vereist; alleen voorbeeld is onvoldoende. Bestanden PDF/DOCX/DOC/TXT/MD, elk maximaal20MiB, niet leeg; extensie plus magic gecontroleerd. Maximaal2bestanden,8velden,10parts en100000bytes per tekstveld."
              }
            }
          }
        }
      }
    },
    "/v1/bronprofielen/{id}": {
      "get": {
        "operationId": "bronprofiel_lezen",
        "summary": "bronprofiel lezen",
        "description": "Huidig actief organisatieprofiel. Bewaar integer versie voor If-Match bij wijzigen/deactiveren. Deze leeshandler zet zelf geen ETag; construeer de quoted versie uit het antwoord. Inactief/ontbrekend404, bronleesfout503.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "bronprofiel": {
                      "$ref": "#/components/schemas/Bronprofiel"
                    }
                  },
                  "required": [
                    "bronprofiel"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/bronprofielen.js",
          "server/rapportly_brondocument_api.js",
          "server/jobs/bronverwerkingJobs.js",
          "server/jobs/handlers/bronverwerking.js",
          "server/migrations/198_rapportly_brondocument_profielen.sql",
          "server/migrations/358_rapportly_bronverwerking_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "patch": {
        "operationId": "bronprofiel_wijzigen",
        "summary": "bronprofiel wijzigen",
        "description": "If-Match:\"versie\" verplicht428; onveilige integer400. Alleen actuele actieve versie en niet bezig; databaseCAS controleert tevens gelezen status. Verhoogt versie, start geen nieuw afleidingsmodel en wisselt geen bestanden. Naam trim/truncate, omschrijving/instructie null kan wissen; velden normaliseren, minstens1bruikbaar. Conflict409 vereist opnieuw lezen. Antwoord bevat slechts de geselecteerde patchvelden, niet volledige profielinhoud.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "If-Match",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^\"[1-9][0-9]*\"$",
              "description": "Quoted positieve veilige integer uit laatst gelezen versie; maximaal9007199254740991."
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "bronprofiel": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "naam": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 120
                        },
                        "omschrijving": {
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 1000
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "velden": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "sleutel": {
                                "type": "string",
                                "maxLength": 80
                              },
                              "naam": {
                                "type": "string",
                                "maxLength": 120
                              },
                              "vraag": {
                                "type": "string",
                                "maxLength": 500
                              },
                              "waarom": {
                                "type": "string",
                                "maxLength": 500
                              },
                              "doel": {
                                "type": "string",
                                "maxLength": 300
                              },
                              "verplicht": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "sleutel",
                              "naam",
                              "vraag",
                              "waarom",
                              "doel",
                              "verplicht"
                            ],
                            "additionalProperties": false
                          },
                          "maxItems": 30
                        },
                        "versie": {
                          "type": "integer",
                          "minimum": 1
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "bezig",
                            "klaar",
                            "mislukt"
                          ]
                        },
                        "bijgewerkt_op": {
                          "type": "string",
                          "format": "date-time"
                        }
                      },
                      "required": [
                        "id",
                        "naam",
                        "omschrijving",
                        "velden",
                        "versie",
                        "status",
                        "bijgewerkt_op"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "bronprofiel"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[1-9][0-9]*\"$"
                },
                "description": "Nieuwe quoted versie."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/bronprofielen.js",
          "server/rapportly_brondocument_api.js",
          "server/jobs/bronverwerkingJobs.js",
          "server/jobs/handlers/bronverwerking.js",
          "server/migrations/198_rapportly_brondocument_profielen.sql",
          "server/migrations/358_rapportly_bronverwerking_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Getypeerde canonieke PATCHinvoer beschreven; alle historische coercie/truncatie van willekeurige JSONwaarden nog niet als clientinvoercontract uitgewerkt."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "naam": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120
                  },
                  "omschrijving": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 1000
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "instructie": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 30000
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "velden": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "sleutel": {
                          "type": "string",
                          "maxLength": 80
                        },
                        "naam": {
                          "type": "string",
                          "maxLength": 120
                        },
                        "vraag": {
                          "type": "string",
                          "maxLength": 500
                        },
                        "waarom": {
                          "type": "string",
                          "maxLength": 500
                        },
                        "doel": {
                          "type": "string",
                          "maxLength": 300
                        },
                        "verplicht": {
                          "type": "boolean"
                        }
                      },
                      "required": [],
                      "additionalProperties": false,
                      "description": "Alle velden optioneel; normalisatie maakt sleutel/naam/vraag waar nodig. Sleutel wordt ASCII snake_case, maximaal80tekens; dubbele sleutel krijgt indexsuffix. Lege naam/vraag na trimmen wordt weggefilterd. Geen extra keys bij aanmaak."
                    },
                    "minItems": 1,
                    "maxItems": 30
                  }
                },
                "required": [],
                "additionalProperties": false,
                "description": "Aanbevolen getypeerde schrijfvorm. Velden is hier een echte JSONarray, anders dan bij multipartaanmaak. Lege body verhoogt ook de versie; stuur alleen bewuste wijzigingen. Native handler kent ruimere coercie/truncatie, apart als open invoercompatibiliteit gemarkeerd."
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "bronprofiel_deactiveren",
        "summary": "bronprofiel deactiveren",
        "description": "Deactiveert actief profiel met exacte quoted versie en bevestigd:true; bezig/conflict/ontbrekend409. Geen fysieke verwijdering van bestanden of historische extracties. Geen algemene idempotentieontvangst; na verloren antwoord opnieuw lezen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "If-Match",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^\"[1-9][0-9]*\"$",
              "description": "Quoted positieve veilige integer uit laatst gelezen versie; maximaal9007199254740991."
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Ok"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/bronprofielen.js",
          "server/rapportly_brondocument_api.js",
          "server/jobs/bronverwerkingJobs.js",
          "server/jobs/handlers/bronverwerking.js",
          "server/migrations/198_rapportly_brondocument_profielen.sql",
          "server/migrations/358_rapportly_bronverwerking_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bevestiging"
              }
            }
          }
        }
      }
    },
    "/v1/bronprofielen/{id}/bestand": {
      "get": {
        "operationId": "bronprofiel_bestand",
        "summary": "bronprofiel bestand",
        "description": "Tijdelijke signedURL300seconden; standaardvoorbeeld, alleen querysoort toegestaan. Ook historisch gedeactiveerd organisatieprofiel kan bestand leveren: handler filtert hier niet op actief. Ontbrekende bron/pad404, onderliggende profielleesfout wordt eveneens404; signedURLfout500. URL vertrouwelijk lokaal gebruiken, niet loggen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "soort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "voorbeeld",
                "instructie"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "url": {
                      "type": "string",
                      "format": "uri"
                    }
                  },
                  "required": [
                    "url"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/bronprofielen.js",
          "server/rapportly_brondocument_api.js",
          "server/jobs/bronverwerkingJobs.js",
          "server/jobs/handlers/bronverwerking.js",
          "server/migrations/198_rapportly_brondocument_profielen.sql",
          "server/migrations/358_rapportly_bronverwerking_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/klanten/{klantId}/brondocumenten": {
      "get": {
        "operationId": "brondocumenten_lijst",
        "summary": "brondocumenten lijst",
        "description": "Alle extracties voor de zichtbare klant, nieuwste eerst; deze native lijst heeft geen cursor/limiet. Elke rij wordt aanvullend gefilterd op actueel dossierleesrecht. Queryfout409, onleesbaar rechtenbewijs503. Volg AIafleiding met deze lijst; zichtbaar statusmislukt/foutcode provideruitkomst_onzeker is geen toestemming voor een automatische nieuwe betaalde start. Canonieke AIresultaten en expliciet door gebruiker vervangen resultaten hebben verschillende metadata.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "klantId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "brondocumenten": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "dossier_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "dossier_bestand_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "bronprofiel_id": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "bronprofiel_versie": {
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": 1
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "bestandsnaam": {
                            "type": "string"
                          },
                          "status": {
                            "type": "string",
                            "enum": [
                              "bezig",
                              "te_controleren",
                              "goedgekeurd",
                              "afgekeurd",
                              "mislukt"
                            ]
                          },
                          "match_confidence": {
                            "anyOf": [
                              {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 1
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "resultaat": {
                            "type": "array",
                            "items": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "sleutel": {
                                      "type": "string",
                                      "maxLength": 80
                                    },
                                    "naam": {
                                      "type": "string",
                                      "maxLength": 120
                                    },
                                    "vraag": {
                                      "type": "string",
                                      "maxLength": 500
                                    },
                                    "waarom": {
                                      "type": "string",
                                      "maxLength": 500
                                    },
                                    "doel": {
                                      "type": "string",
                                      "maxLength": 300
                                    },
                                    "verplicht": {
                                      "type": "boolean"
                                    },
                                    "waarde": {
                                      "anyOf": [
                                        {
                                          "type": "string",
                                          "maxLength": 1000
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    },
                                    "confidence": {
                                      "anyOf": [
                                        {
                                          "type": "number",
                                          "minimum": 0,
                                          "maximum": 1
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    },
                                    "pagina": {
                                      "anyOf": [
                                        {
                                          "type": "string",
                                          "maxLength": 30
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    },
                                    "bewijs": {
                                      "type": "string",
                                      "maxLength": 300
                                    }
                                  },
                                  "required": [
                                    "sleutel",
                                    "naam",
                                    "vraag",
                                    "waarom",
                                    "doel",
                                    "verplicht",
                                    "waarde",
                                    "confidence",
                                    "pagina",
                                    "bewijs"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "object",
                                  "properties": {
                                    "sleutel": {
                                      "$ref": "#/components/schemas/InstellingenJsonWaarde"
                                    },
                                    "waarde": {
                                      "anyOf": [
                                        {
                                          "type": "string",
                                          "maxLength": 1000
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    },
                                    "confidence": {
                                      "$ref": "#/components/schemas/InstellingenJsonWaarde"
                                    },
                                    "pagina": {
                                      "$ref": "#/components/schemas/InstellingenJsonWaarde"
                                    },
                                    "bewijs": {
                                      "type": "string",
                                      "maxLength": 300
                                    }
                                  },
                                  "required": [
                                    "waarde",
                                    "bewijs"
                                  ],
                                  "additionalProperties": false,
                                  "description": "Bij expliciete vervanging van resultaat bewaart controller sleutel/confidence/pagina zoals ingestuurd: geen numerieke of paginanormalisatie. Alleen waarde/bewijs worden naar begrensde tekst geconverteerd. Metadata naam/vraag/waarom/doel/verplicht uit het AIantwoord is dan niet opnieuw toegevoegd."
                                },
                                {
                                  "type": "object",
                                  "properties": {
                                    "waarde": {
                                      "anyOf": [
                                        {
                                          "type": "string",
                                          "maxLength": 1000
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    },
                                    "bewijs": {
                                      "type": "string",
                                      "maxLength": 300
                                    }
                                  },
                                  "required": [
                                    "waarde",
                                    "bewijs"
                                  ],
                                  "additionalProperties": {
                                    "$ref": "#/components/schemas/InstellingenJsonWaarde"
                                  },
                                  "description": "Bestaande native controle kan aanvullende resultaatmetadata doorgeven; APIlezen bewaart die zonder opnieuw te typeren."
                                }
                              ]
                            },
                            "description": "AIproducent en actuele APIcontrole leveren maximaal30items; historische native controle kan meer items/metadata hebben opgeslagen. Geen stille truncatie bij lezen."
                          },
                          "foutcode": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "gecontroleerd_op": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "aangemaakt_op": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "bijgewerkt_op": {
                            "type": "string",
                            "format": "date-time"
                          }
                        },
                        "required": [
                          "id",
                          "dossier_id",
                          "dossier_bestand_id",
                          "bronprofiel_id",
                          "bronprofiel_versie",
                          "bestandsnaam",
                          "status",
                          "match_confidence",
                          "resultaat",
                          "foutcode",
                          "gecontroleerd_op",
                          "aangemaakt_op",
                          "bijgewerkt_op"
                        ],
                        "additionalProperties": false
                      }
                    }
                  },
                  "required": [
                    "brondocumenten"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/bronprofielen.js",
          "server/rapportly_brondocument_api.js",
          "server/jobs/bronverwerkingJobs.js",
          "server/jobs/handlers/bronverwerking.js",
          "server/migrations/198_rapportly_brondocument_profielen.sql",
          "server/migrations/358_rapportly_bronverwerking_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/klanten/{klantId}/brondocumenten/start": {
      "post": {
        "operationId": "brondocument_start",
        "summary": "brondocument start",
        "description": "202nieuwe duurzame extractie,200exacte herhaling met huidige status. Verwerkt alleen een bestaand dossierbestand van deze klant, geen extra uploadendpoint. Beide klant-/dossierrechten en actuele sleutel opnieuw getoetst. Optioneel klaar/actief bronprofiel; null/omissie laat bestaande classificatie kiezen. Uniek bestandcontract geldt over app en alle API-sleutels: een andere start voor hetzelfde bestand409, niet overnemen/herafrekenen. Zelfde sleutel met andere klant/bestand/profiel409, verwijderde extractie410. Flag/readiness358 en persoonlijke werkelijkekostenmodus vereist503. AIclassificatie/extractie kan klantcredits gebruiken; publicatie bewaakt dezelfde profielversie. Eerste antwoord statusbezig; vervolg via klantlijst.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "klantId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "brondocument": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "bestandsnaam": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "bezig",
                            "te_controleren",
                            "goedgekeurd",
                            "afgekeurd",
                            "mislukt"
                          ]
                        },
                        "herhaald": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "id",
                        "bestandsnaam",
                        "status",
                        "herhaald"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "brondocument"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "brondocument": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "bestandsnaam": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "bezig",
                            "te_controleren",
                            "goedgekeurd",
                            "afgekeurd",
                            "mislukt"
                          ]
                        },
                        "herhaald": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "id",
                        "bestandsnaam",
                        "status",
                        "herhaald"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "brondocument"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/bronprofielen.js",
          "server/rapportly_brondocument_api.js",
          "server/jobs/bronverwerkingJobs.js",
          "server/jobs/handlers/bronverwerking.js",
          "server/migrations/198_rapportly_brondocument_profielen.sql",
          "server/migrations/358_rapportly_bronverwerking_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "dossier_bestand_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "bronprofiel_id": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": [
                  "dossier_bestand_id"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/klanten/{klantId}/brondocumenten/{id}": {
      "patch": {
        "operationId": "brondocument_controleren",
        "summary": "brondocument controleren",
        "description": "Alleen status te_controleren kan éénmaal goed- of afgekeurd worden. Exacte datumIf-Match verplicht428; andere huidige versie409. Huidige klant/dossierleesrechten opnieuw vereist. Update controleert status plus bijgewerkt_op atomair, bewaart gecontroleerd_op/actor en resultaat; geen nieuwe providerstap. Geen ETagheader in antwoord: neem nieuwe bijgewerkt_op uit body. Verloren antwoord: opnieuw lezen, niet automatisch dezelfde controle verwachten.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "If-Match",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^\"[0-9]{4}-[0-9]{2}-[0-9]{2}T[^\"]+\"$",
              "description": "Exacte bijgewerkt_optekenreeks uit gelezen rij tussen dubbele quotes; geldige parseerbare datum. Niet herformatteren."
            }
          },
          {
            "name": "klantId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "brondocument": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "bezig",
                            "te_controleren",
                            "goedgekeurd",
                            "afgekeurd",
                            "mislukt"
                          ]
                        },
                        "resultaat": {
                          "type": "array",
                          "items": {
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "sleutel": {
                                    "type": "string",
                                    "maxLength": 80
                                  },
                                  "naam": {
                                    "type": "string",
                                    "maxLength": 120
                                  },
                                  "vraag": {
                                    "type": "string",
                                    "maxLength": 500
                                  },
                                  "waarom": {
                                    "type": "string",
                                    "maxLength": 500
                                  },
                                  "doel": {
                                    "type": "string",
                                    "maxLength": 300
                                  },
                                  "verplicht": {
                                    "type": "boolean"
                                  },
                                  "waarde": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "maxLength": 1000
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "confidence": {
                                    "anyOf": [
                                      {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 1
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "pagina": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "maxLength": 30
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "bewijs": {
                                    "type": "string",
                                    "maxLength": 300
                                  }
                                },
                                "required": [
                                  "sleutel",
                                  "naam",
                                  "vraag",
                                  "waarom",
                                  "doel",
                                  "verplicht",
                                  "waarde",
                                  "confidence",
                                  "pagina",
                                  "bewijs"
                                ],
                                "additionalProperties": false
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "sleutel": {
                                    "$ref": "#/components/schemas/InstellingenJsonWaarde"
                                  },
                                  "waarde": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "maxLength": 1000
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "confidence": {
                                    "$ref": "#/components/schemas/InstellingenJsonWaarde"
                                  },
                                  "pagina": {
                                    "$ref": "#/components/schemas/InstellingenJsonWaarde"
                                  },
                                  "bewijs": {
                                    "type": "string",
                                    "maxLength": 300
                                  }
                                },
                                "required": [
                                  "waarde",
                                  "bewijs"
                                ],
                                "additionalProperties": false,
                                "description": "Bij expliciete vervanging van resultaat bewaart controller sleutel/confidence/pagina zoals ingestuurd: geen numerieke of paginanormalisatie. Alleen waarde/bewijs worden naar begrensde tekst geconverteerd. Metadata naam/vraag/waarom/doel/verplicht uit het AIantwoord is dan niet opnieuw toegevoegd."
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "waarde": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "maxLength": 1000
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "bewijs": {
                                    "type": "string",
                                    "maxLength": 300
                                  }
                                },
                                "required": [
                                  "waarde",
                                  "bewijs"
                                ],
                                "additionalProperties": {
                                  "$ref": "#/components/schemas/InstellingenJsonWaarde"
                                },
                                "description": "Bestaande native controle kan aanvullende resultaatmetadata doorgeven; APIlezen bewaart die zonder opnieuw te typeren."
                              }
                            ]
                          },
                          "description": "AIproducent en actuele APIcontrole leveren maximaal30items; historische native controle kan meer items/metadata hebben opgeslagen. Geen stille truncatie bij lezen."
                        },
                        "gecontroleerd_op": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "date-time"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "bijgewerkt_op": {
                          "type": "string",
                          "format": "date-time"
                        }
                      },
                      "required": [
                        "id",
                        "status",
                        "resultaat",
                        "gecontroleerd_op",
                        "bijgewerkt_op"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "brondocument"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "documenten:wijzigen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/bronprofielen.js",
          "server/rapportly_brondocument_api.js",
          "server/jobs/bronverwerkingJobs.js",
          "server/jobs/handlers/bronverwerking.js",
          "server/migrations/198_rapportly_brondocument_profielen.sql",
          "server/migrations/358_rapportly_bronverwerking_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "status": {
                    "type": "string",
                    "enum": [
                      "goedgekeurd",
                      "afgekeurd"
                    ]
                  },
                  "resultaat": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "sleutel": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        },
                        "waarde": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        },
                        "confidence": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        },
                        "pagina": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        },
                        "bewijs": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [],
                      "additionalProperties": false
                    },
                    "maxItems": 30
                  }
                },
                "required": [
                  "status"
                ],
                "additionalProperties": false,
                "description": "resultaat optioneel: weglaten behoudt complete huidige resultaten. Meesturen vervangt de gehele lijst, [] is toegestaan. Alleen vijf genoemde keys, geen extrametadata; individuele types worden niet gevalideerd. Gebruik zelf tekst/null voor waarde/pagina, getal0–1/null voor confidence en bestaande sleutel; controller dwingt die aanbeveling niet af."
              }
            }
          }
        }
      }
    },
    "/v1/huisstijl-sjabloon/{doeltype}": {
      "get": {
        "operationId": "huisstijl_lezen",
        "summary": "huisstijl lezen",
        "description": "Nieuwste versie voor organisatie/doeltype, niet noodzakelijk de actieve versie. Actieve id staat apart; conceptSleutel is organisatie:actor:doeltype. Optionele verwerking/aanvraagId komen uit duurzame job. Geen automatische nieuwe analyse of twee-minutentimeoutmutatie voor APIlezen. Selectieve bron61b786b3: beide sjabloon-/versiequeryfouten geven503 code sjabloon_onbeschikbaar. Alleen werkelijk ontbrekend sjabloon geeft200 met sjabloon:null en versie:null. Geen afwezigheidsclaim bij een onleesbare bron. API vereist huisstijlsjabloonjobflag, anders503. Ontvangsten vereisen readiness362/service-only. Publieke header8–128 begint met letter/cijfer, daarna letter/cijfer/underscore/punt/streepje; geen dubbelepunt. Adapter maakt sleutelgebonden hash vóór native16–200controle.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "doeltype",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "offerte",
                "rapport",
                "email",
                "gespreksverslag"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "achtergrond": {
                      "const": true
                    },
                    "conceptSleutel": {
                      "type": "string"
                    },
                    "sjabloon": {
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                            },
                            "actieve_versie_id": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "format": "uuid",
                                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "doeltype": {
                              "type": "string",
                              "enum": [
                                "offerte",
                                "rapport",
                                "email",
                                "gespreksverslag"
                              ]
                            }
                          },
                          "required": [
                            "id",
                            "actieve_versie_id",
                            "doeltype"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "versie": {
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                            },
                            "versie_nr": {
                              "type": "integer",
                              "minimum": 1
                            },
                            "status": {
                              "type": "string",
                              "enum": [
                                "bezig",
                                "concept_klaar",
                                "goedgekeurd",
                                "vervangen",
                                "mislukt"
                              ]
                            },
                            "herkend": {
                              "anyOf": [
                                {
                                  "oneOf": [
                                    {
                                      "type": "object",
                                      "properties": {
                                        "primair": {
                                          "anyOf": [
                                            {
                                              "type": "string"
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        },
                                        "accent": {
                                          "anyOf": [
                                            {
                                              "type": "string"
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        },
                                        "tekst": {
                                          "anyOf": [
                                            {
                                              "type": "string"
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        },
                                        "lettertype": {
                                          "anyOf": [
                                            {
                                              "type": "string"
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        },
                                        "font_substitutie": {
                                          "type": "boolean"
                                        },
                                        "lettertype_bron": {
                                          "anyOf": [
                                            {
                                              "type": "string",
                                              "maxLength": 60
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        },
                                        "cover": {
                                          "type": "object",
                                          "properties": {
                                            "tekst_hoofd": {
                                              "type": "string",
                                              "maxLength": 80
                                            },
                                            "stijl": {
                                              "type": "string",
                                              "enum": [
                                                "vlak",
                                                "rand",
                                                "minimaal"
                                              ]
                                            }
                                          },
                                          "required": [
                                            "tekst_hoofd",
                                            "stijl"
                                          ],
                                          "additionalProperties": false
                                        }
                                      },
                                      "required": [
                                        "primair",
                                        "accent",
                                        "tekst",
                                        "lettertype",
                                        "font_substitutie",
                                        "lettertype_bron"
                                      ],
                                      "additionalProperties": false
                                    },
                                    {
                                      "type": "object",
                                      "properties": {
                                        "primair": {
                                          "anyOf": [
                                            {
                                              "type": "string"
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        },
                                        "accent": {
                                          "anyOf": [
                                            {
                                              "type": "string"
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        },
                                        "tekst": {
                                          "anyOf": [
                                            {
                                              "type": "string"
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        },
                                        "lettertype": {
                                          "anyOf": [
                                            {
                                              "type": "string"
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        },
                                        "bron": {
                                          "const": "aanpassing"
                                        }
                                      },
                                      "required": [
                                        "primair",
                                        "accent",
                                        "tekst",
                                        "lettertype",
                                        "bron"
                                      ],
                                      "additionalProperties": false
                                    }
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "heeft_preview": {
                              "type": "boolean"
                            },
                            "is_actief": {
                              "type": "boolean"
                            },
                            "fout": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "verwerking": {
                              "type": "string",
                              "enum": [
                                "uploaden",
                                "ontvangen",
                                "provider_gestart",
                                "ontwerp_bewaard",
                                "klaar",
                                "mislukt",
                                "controle_nodig"
                              ]
                            },
                            "aanvraagId": {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                            },
                            "heeft_cover": {
                              "type": "boolean"
                            },
                            "cover_html": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": [
                            "id",
                            "versie_nr",
                            "status",
                            "herkend",
                            "heeft_preview",
                            "is_actief",
                            "fout",
                            "heeft_cover",
                            "cover_html"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "achtergrond",
                    "conceptSleutel",
                    "sjabloon",
                    "versie"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/huisstijl.js",
          "server/rapportly_sjabloon_api.js",
          "server/jobs/huisstijlSjabloonJobs.js",
          "server/jobs/handlers/huisstijlSjabloonJob.js",
          "server/lib/sjabloonSpec.js",
          "server/lib/sjabloon/font.js",
          "server/lib/sjabloon/sanitize.js",
          "server/migrations/362_rapportly_huisstijlsjabloon_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "61b786b3"
      },
      "post": {
        "operationId": "huisstijl_upload",
        "summary": "huisstijl upload",
        "description": "Eén niet leeg bestand, maximaal15MiB; MIME application/pdf,image/png,image/jpeg,image/webp. Geen tekstvelden bij deze uploadactie. Multipartparser maximaal1bestand/5tekstvelden en65536bytes per veld. PDF gebruikt voor vision uitsluitend eerste pagina, beeld wordt begrensd voor verwerking. Persoonlijke werkelijkekostenmodus en actuele visionprivacycontrole verplicht; deze operatie kan klantcredits gebruiken.202antwoord blijft statusbezig, ook bij herhaling van reeds afgeronde ontvangst. Gebruik ontvangstGET voor werkelijke status. Nieuwe upload maakt concept, geen actieve vervanging. API vereist huisstijlsjabloonjobflag, anders503. Ontvangsten vereisen readiness362/service-only. Publieke header8–128 begint met letter/cijfer, daarna letter/cijfer/underscore/punt/streepje; geen dubbelepunt. Adapter maakt sleutelgebonden hash vóór native16–200controle.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "doeltype",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "offerte",
                "rapport",
                "email",
                "gespreksverslag"
              ]
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{7,127}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    },
                    "versie_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "status": {
                      "const": "bezig"
                    },
                    "aanvraagId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    }
                  },
                  "required": [
                    "ok",
                    "versie_id",
                    "status",
                    "aanvraagId"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/huisstijl.js",
          "server/rapportly_sjabloon_api.js",
          "server/jobs/huisstijlSjabloonJobs.js",
          "server/jobs/handlers/huisstijlSjabloonJob.js",
          "server/lib/sjabloonSpec.js",
          "server/lib/sjabloon/font.js",
          "server/lib/sjabloon/sanitize.js",
          "server/migrations/362_rapportly_huisstijlsjabloon_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "bestand": {
                    "type": "string",
                    "format": "binary"
                  }
                },
                "required": [
                  "bestand"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/huisstijl-sjabloon/{doeltype}/ontvangst": {
      "get": {
        "operationId": "huisstijl_ontvangst",
        "summary": "huisstijl ontvangst",
        "description": "Oorspronkelijke Idempotency-Key, actor, organisatie en doeltype bepalen de lookup. versie_id kan nog null zijn tijdens upload. De lookup toetst zelf geen verloopt_op: terminale technische ontvangst kan na7dagen nog leesbaar zijn. Tijdelijke input/basissnapshot wordt opgeruimd; nieuwe startreplay na7dagen geeft409 sjabloon_aanvraag_verlopen. Verander doeltype/operatie/invoer niet onder dezelfde sleutel. Onbekend404; statuscontrole_nodig na onzeker providercontact is geen automatische retrytoestemming. API vereist huisstijlsjabloonjobflag, anders503. Ontvangsten vereisen readiness362/service-only. Publieke header8–128 begint met letter/cijfer, daarna letter/cijfer/underscore/punt/streepje; geen dubbelepunt. Adapter maakt sleutelgebonden hash vóór native16–200controle.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "doeltype",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "offerte",
                "rapport",
                "email",
                "gespreksverslag"
              ]
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "aanvraagId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "versie_id": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "uploaden",
                        "ontvangen",
                        "provider_gestart",
                        "ontwerp_bewaard",
                        "klaar",
                        "mislukt",
                        "controle_nodig"
                      ]
                    },
                    "operatie": {
                      "type": "string",
                      "enum": [
                        "upload",
                        "font",
                        "aanpassen",
                        "cover"
                      ]
                    },
                    "code": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "aanvraagId",
                    "versie_id",
                    "status",
                    "operatie",
                    "code"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/huisstijl.js",
          "server/rapportly_sjabloon_api.js",
          "server/jobs/huisstijlSjabloonJobs.js",
          "server/jobs/handlers/huisstijlSjabloonJob.js",
          "server/lib/sjabloonSpec.js",
          "server/lib/sjabloon/font.js",
          "server/lib/sjabloon/sanitize.js",
          "server/migrations/362_rapportly_huisstijlsjabloon_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/huisstijl-sjabloon/preview/{versieId}": {
      "get": {
        "operationId": "huisstijl_previewlink",
        "summary": "huisstijl previewlink",
        "description": "Geeft signedURL300seconden plus opgeslagen previewhash van klaargekomen duurzame job. Deze GET markeert preview_bekeken_op en preview_bekeken_door bij de huidige actor; de server bewijst hiermee het opvragen van de link, niet het downloaden/lezen van PDFbytes. Geen dagcache of API-sleutelgebonden kijkbewijs zoals werkplaatsherstel. Ontbrekende preview/signedURL404; jobhash ontbreekt409; markeerfout500. Geen automatische voorbeeldcall in collectie, omdat dit de latere goedkeurpoort beïnvloedt. API vereist huisstijlsjabloonjobflag, anders503. Ontvangsten vereisen readiness362/service-only. Publieke header8–128 begint met letter/cijfer, daarna letter/cijfer/underscore/punt/streepje; geen dubbelepunt. Adapter maakt sleutelgebonden hash vóór native16–200controle.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "versieId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "preview_hash": {
                      "type": "string",
                      "pattern": "^[a-f0-9]{64}$"
                    }
                  },
                  "required": [
                    "url",
                    "preview_hash"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/huisstijl.js",
          "server/rapportly_sjabloon_api.js",
          "server/jobs/huisstijlSjabloonJobs.js",
          "server/jobs/handlers/huisstijlSjabloonJob.js",
          "server/lib/sjabloonSpec.js",
          "server/lib/sjabloon/font.js",
          "server/lib/sjabloon/sanitize.js",
          "server/migrations/362_rapportly_huisstijlsjabloon_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/huisstijl-sjabloon/{versieId}/goedkeuren": {
      "post": {
        "operationId": "huisstijl_goedkeuren",
        "summary": "huisstijl goedkeuren",
        "description": "Expliciet activeren/vergrendelen van concept_klaar met exact opgeslagen previewhash en preview_bekeken_door gelijk aan huidige actor. Het bodycontract bevat geen basis-id: SQLvergelijkt huidige actieve versie met de bij start opgeslagen actieve_basis_id. Andere actieve basis409. Golden-snapshot wordt samen met publicatie vastgezet. Reeds goedgekeurd én nog actief geeft herhaald:true, maar alleen na opnieuw voldoen aan hash/actorpoort. Geen algemene idempotentieontvangst. Na verloren antwoord eerst actuele versie lezen. API vereist huisstijlsjabloonjobflag, anders503. Ontvangsten vereisen readiness362/service-only. Publieke header8–128 begint met letter/cijfer, daarna letter/cijfer/underscore/punt/streepje; geen dubbelepunt. Adapter maakt sleutelgebonden hash vóór native16–200controle.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "versieId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    },
                    "actief": {
                      "const": true
                    },
                    "herhaald": {
                      "const": true
                    }
                  },
                  "required": [
                    "ok",
                    "actief"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/huisstijl.js",
          "server/rapportly_sjabloon_api.js",
          "server/jobs/huisstijlSjabloonJobs.js",
          "server/jobs/handlers/huisstijlSjabloonJob.js",
          "server/lib/sjabloonSpec.js",
          "server/lib/sjabloon/font.js",
          "server/lib/sjabloon/sanitize.js",
          "server/migrations/362_rapportly_huisstijlsjabloon_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "bevestigd": {
                    "const": true
                  },
                  "preview_hash": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  }
                },
                "required": [
                  "bevestigd",
                  "preview_hash"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/huisstijl-sjabloon/{doeltype}/font": {
      "post": {
        "operationId": "huisstijl_font",
        "summary": "huisstijl font",
        "description": "Merkfont met gelezen concept/goedgekeurde basis. WOFF2/WOFF/TTF/OTF op magicbytes; maximaal2MiB, minstens4bytes. Multipartlicentie_akkoord letterlijk true; native accepteert tevens JSONbooleantrue maar deze parser leest tekst. Nieuwe duurzame conceptversie en modelvrije rendering, geen nieuwe vision. Fontembedding is PDF-only; DOCX gebruikt bestaande fontstack. Ongeldig font/licentie400, huidige basis niet bruikbaar409. Bestandsnaam wordt intern merkfont.ext, niet de callernaam. API vereist huisstijlsjabloonjobflag, anders503. Ontvangsten vereisen readiness362/service-only. Publieke header8–128 begint met letter/cijfer, daarna letter/cijfer/underscore/punt/streepje; geen dubbelepunt. Adapter maakt sleutelgebonden hash vóór native16–200controle.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "doeltype",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "offerte",
                "rapport",
                "email",
                "gespreksverslag"
              ]
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{7,127}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    },
                    "versie_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "status": {
                      "const": "bezig"
                    },
                    "aanvraagId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    }
                  },
                  "required": [
                    "ok",
                    "versie_id",
                    "status",
                    "aanvraagId"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/huisstijl.js",
          "server/rapportly_sjabloon_api.js",
          "server/jobs/huisstijlSjabloonJobs.js",
          "server/jobs/handlers/huisstijlSjabloonJob.js",
          "server/lib/sjabloonSpec.js",
          "server/lib/sjabloon/font.js",
          "server/lib/sjabloon/sanitize.js",
          "server/migrations/362_rapportly_huisstijlsjabloon_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis_versie_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "licentie_akkoord": {
                    "const": "true"
                  },
                  "bestand": {
                    "type": "string",
                    "format": "binary"
                  }
                },
                "required": [
                  "basis_versie_id",
                  "licentie_akkoord",
                  "bestand"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/huisstijl-sjabloon/{doeltype}/aanpassen": {
      "post": {
        "operationId": "huisstijl_aanpassen",
        "summary": "huisstijl aanpassen",
        "description": "Gelezen basisconcept of goedgekeurde versie vereist; maakt nieuw concept en preview met bestaande rendering zonder AI. Kleuren en fontklasse worden op opgesloten basis gemerged; bestaand merkfont blijft staan. Preview en nieuwe expliciete goedkeuring vereist vóór gebruik. Canonieke getypeerde invoer; historische normalisatie accepteert ruimere genegeerde waarden. API vereist huisstijlsjabloonjobflag, anders503. Ontvangsten vereisen readiness362/service-only. Publieke header8–128 begint met letter/cijfer, daarna letter/cijfer/underscore/punt/streepje; geen dubbelepunt. Adapter maakt sleutelgebonden hash vóór native16–200controle.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "doeltype",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "offerte",
                "rapport",
                "email",
                "gespreksverslag"
              ]
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{7,127}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    },
                    "versie_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "status": {
                      "const": "bezig"
                    },
                    "aanvraagId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    }
                  },
                  "required": [
                    "ok",
                    "versie_id",
                    "status",
                    "aanvraagId"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/huisstijl.js",
          "server/rapportly_sjabloon_api.js",
          "server/jobs/huisstijlSjabloonJobs.js",
          "server/jobs/handlers/huisstijlSjabloonJob.js",
          "server/lib/sjabloonSpec.js",
          "server/lib/sjabloon/font.js",
          "server/lib/sjabloon/sanitize.js",
          "server/migrations/362_rapportly_huisstijlsjabloon_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Alle tolerante inputvormen van kleur-/fontnormalisatie niet als clientschrijfcontract uitgewerkt; canonieke geldige waarden en volledig startantwoord beschreven."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis_versie_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "kleuren": {
                    "type": "object",
                    "properties": {
                      "primair": {
                        "anyOf": [
                          {
                            "type": "string",
                            "pattern": "^\\s*#[a-fA-F0-9]{6}\\s*$"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "accent": {
                        "anyOf": [
                          {
                            "type": "string",
                            "pattern": "^\\s*#[a-fA-F0-9]{6}\\s*$"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "tekst": {
                        "anyOf": [
                          {
                            "type": "string",
                            "pattern": "^\\s*#[a-fA-F0-9]{6}\\s*$"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "required": [],
                    "additionalProperties": false
                  },
                  "lettertype_klasse": {
                    "type": "string",
                    "enum": [
                      "serif",
                      "sans-serif",
                      "sans serif",
                      "sans"
                    ]
                  }
                },
                "required": [
                  "basis_versie_id"
                ],
                "additionalProperties": false,
                "description": "Canonieke bruikbare aanpassing. Minstens één geldige kleur of herkende fontklasse vereist; lege/ongeldige waarden worden door bestaande normalisatie genegeerd. Zelfde geldige kleur geldt ook als aanpassing: de producent vergelijkt niet op waardeverschil. Geen lettertype_naam als APIveld."
              }
            }
          }
        }
      }
    },
    "/v1/huisstijl-sjabloon/{doeltype}/cover": {
      "post": {
        "operationId": "huisstijl_cover",
        "summary": "huisstijl cover",
        "description": "Kleine decoratieve cover bij gelezen basisconcept/goedgekeurde versie. HTML maximaal32000tekens; leeg wist cover. Saneert tags/CSS; scripts, links, afbeeldingen, tabellen en externe bronnen overleven niet. Vervangt alleen cover van nieuw concept, render modelvrij. Requesthash gebruikt gesaneerde cover: verschillende ruwe HTML met dezelfde schone uitkomst kan dezelfde ontvangst zijn. Goedkeuring blijft afzonderlijk verplicht. API vereist huisstijlsjabloonjobflag, anders503. Ontvangsten vereisen readiness362/service-only. Publieke header8–128 begint met letter/cijfer, daarna letter/cijfer/underscore/punt/streepje; geen dubbelepunt. Adapter maakt sleutelgebonden hash vóór native16–200controle.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "doeltype",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "offerte",
                "rapport",
                "email",
                "gespreksverslag"
              ]
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{7,127}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    },
                    "versie_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "status": {
                      "const": "bezig"
                    },
                    "aanvraagId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    }
                  },
                  "required": [
                    "ok",
                    "versie_id",
                    "status",
                    "aanvraagId"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/huisstijl.js",
          "server/rapportly_sjabloon_api.js",
          "server/jobs/huisstijlSjabloonJobs.js",
          "server/jobs/handlers/huisstijlSjabloonJob.js",
          "server/lib/sjabloonSpec.js",
          "server/lib/sjabloon/font.js",
          "server/lib/sjabloon/sanitize.js",
          "server/migrations/362_rapportly_huisstijlsjabloon_jobs.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis_versie_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "html": {
                    "type": "string",
                    "maxLength": 32000
                  }
                },
                "required": [
                  "basis_versie_id",
                  "html"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/gesprekken/{id}/taalvarianten": {
      "get": {
        "operationId": "taalstatus_conversation",
        "summary": "taalstatus conversation",
        "description": "Alle huidige/historische taalopdrachten van zichtbare bron, oplopend aanmaakmoment; geen queryvelden/cursor. Bron-/actor-/objectrechten vóór en na lezen; gewijzigde taal/dossier-/klantbinding409. Huidige beleidskeuze en historische status zijn afzonderlijk. Bij uitgeschakelde tweede-taalfeature en ontbrekend beleidsleesmodel reconstrueert native helper alleen resolvedLanguages plus historie; requestedLanguagePolicy,actieve selectie en policyversie kunnen dan ontbreken. Historie bevat geen creditsveld: eigen gebruiksoverzicht blijft afrekenbron. Private,no-store; bron niet zichtbaar404, onleesbare status503. Geen nieuwe vertaling of retry. Vlak vóór antwoord worden sleutelactivatie/pauze/intrekking/verval, recht en rechtenplafond, actorrol/organisatie en expliciet pakket opnieuw gecontroleerd. Tijdens lezen vervallen delegatie geeft403 api_leesdelegatie_geweigerd; onleesbare controlebron503 api_taalstatus_onbeschikbaar.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "gesprek_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "requestedLanguagePolicy": {
                      "type": "object",
                      "properties": {
                        "primary": {
                          "type": "string",
                          "pattern": "^[a-z]{2,3}$",
                          "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                        },
                        "secondary": {
                          "type": "object",
                          "properties": {
                            "conversationReport": {
                              "oneOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "mode": {
                                      "type": "string",
                                      "enum": [
                                        "inherit",
                                        "off"
                                      ]
                                    }
                                  },
                                  "required": [
                                    "mode"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "object",
                                  "properties": {
                                    "mode": {
                                      "const": "specific"
                                    },
                                    "language": {
                                      "type": "string",
                                      "pattern": "^[a-z]{2,3}$",
                                      "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                                    }
                                  },
                                  "required": [
                                    "mode",
                                    "language"
                                  ],
                                  "additionalProperties": false
                                }
                              ]
                            },
                            "customerEmail": {
                              "oneOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "mode": {
                                      "type": "string",
                                      "enum": [
                                        "inherit",
                                        "off"
                                      ]
                                    }
                                  },
                                  "required": [
                                    "mode"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "object",
                                  "properties": {
                                    "mode": {
                                      "const": "specific"
                                    },
                                    "language": {
                                      "type": "string",
                                      "pattern": "^[a-z]{2,3}$",
                                      "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                                    }
                                  },
                                  "required": [
                                    "mode",
                                    "language"
                                  ],
                                  "additionalProperties": false
                                }
                              ]
                            },
                            "followUpEmail": {
                              "oneOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "mode": {
                                      "type": "string",
                                      "enum": [
                                        "inherit",
                                        "off"
                                      ]
                                    }
                                  },
                                  "required": [
                                    "mode"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "object",
                                  "properties": {
                                    "mode": {
                                      "const": "specific"
                                    },
                                    "language": {
                                      "type": "string",
                                      "pattern": "^[a-z]{2,3}$",
                                      "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                                    }
                                  },
                                  "required": [
                                    "mode",
                                    "language"
                                  ],
                                  "additionalProperties": false
                                }
                              ]
                            }
                          },
                          "required": [
                            "conversationReport",
                            "customerEmail",
                            "followUpEmail"
                          ],
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "primary",
                        "secondary"
                      ],
                      "additionalProperties": false
                    },
                    "resolvedLanguages": {
                      "$ref": "#/components/schemas/ResolvedLanguages"
                    },
                    "activeVariantStatuses": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "sourceType": {
                            "const": "conversation"
                          },
                          "sourceId": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "language": {
                            "type": "string"
                          },
                          "action": {
                            "type": "string"
                          },
                          "status": {
                            "type": "string"
                          },
                          "outcomes": {
                            "type": "object",
                            "properties": {
                              "report": {
                                "type": "object",
                                "properties": {
                                  "status": {
                                    "type": "string"
                                  },
                                  "contentAvailable": {
                                    "type": "boolean"
                                  },
                                  "artifactId": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "errorCode": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "pattern": "^[a-zA-Z0-9_.-]{1,100}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "status",
                                  "contentAvailable",
                                  "artifactId",
                                  "errorCode"
                                ],
                                "additionalProperties": false
                              },
                              "coverLetter": {
                                "type": "object",
                                "properties": {
                                  "status": {
                                    "type": "string"
                                  },
                                  "contentAvailable": {
                                    "type": "boolean"
                                  },
                                  "artifactId": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "errorCode": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "pattern": "^[a-zA-Z0-9_.-]{1,100}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "status",
                                  "contentAvailable",
                                  "artifactId",
                                  "errorCode"
                                ],
                                "additionalProperties": false
                              },
                              "conversationReport": {
                                "type": "object",
                                "properties": {
                                  "status": {
                                    "type": "string"
                                  },
                                  "contentAvailable": {
                                    "type": "boolean"
                                  },
                                  "artifactId": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "errorCode": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "pattern": "^[a-zA-Z0-9_.-]{1,100}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "status",
                                  "contentAvailable",
                                  "artifactId",
                                  "errorCode"
                                ],
                                "additionalProperties": false
                              },
                              "customerEmail": {
                                "type": "object",
                                "properties": {
                                  "status": {
                                    "type": "string"
                                  },
                                  "contentAvailable": {
                                    "type": "boolean"
                                  },
                                  "artifactId": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "errorCode": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "pattern": "^[a-zA-Z0-9_.-]{1,100}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "status",
                                  "contentAvailable",
                                  "artifactId",
                                  "errorCode"
                                ],
                                "additionalProperties": false
                              },
                              "followUpEmail": {
                                "type": "object",
                                "properties": {
                                  "status": {
                                    "type": "string"
                                  },
                                  "contentAvailable": {
                                    "type": "boolean"
                                  },
                                  "artifactId": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "errorCode": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "pattern": "^[a-zA-Z0-9_.-]{1,100}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "status",
                                  "contentAvailable",
                                  "artifactId",
                                  "errorCode"
                                ],
                                "additionalProperties": false
                              }
                            },
                            "required": [],
                            "additionalProperties": false
                          }
                        },
                        "required": [
                          "id",
                          "sourceType",
                          "sourceId",
                          "language",
                          "action",
                          "status",
                          "outcomes"
                        ],
                        "additionalProperties": false,
                        "description": "Geprojecteerde metadata zonder legacycredits, opslagpaden of inhoud. Onbruikbare artifactId/foutcode wordt null; status/action blijven bestaande opgeslagen tekenreeksen."
                      }
                    },
                    "variantStatuses": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "sourceType": {
                            "const": "conversation"
                          },
                          "sourceId": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "language": {
                            "type": "string"
                          },
                          "action": {
                            "type": "string"
                          },
                          "status": {
                            "type": "string"
                          },
                          "outcomes": {
                            "type": "object",
                            "properties": {
                              "report": {
                                "type": "object",
                                "properties": {
                                  "status": {
                                    "type": "string"
                                  },
                                  "contentAvailable": {
                                    "type": "boolean"
                                  },
                                  "artifactId": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "errorCode": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "pattern": "^[a-zA-Z0-9_.-]{1,100}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "status",
                                  "contentAvailable",
                                  "artifactId",
                                  "errorCode"
                                ],
                                "additionalProperties": false
                              },
                              "coverLetter": {
                                "type": "object",
                                "properties": {
                                  "status": {
                                    "type": "string"
                                  },
                                  "contentAvailable": {
                                    "type": "boolean"
                                  },
                                  "artifactId": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "errorCode": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "pattern": "^[a-zA-Z0-9_.-]{1,100}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "status",
                                  "contentAvailable",
                                  "artifactId",
                                  "errorCode"
                                ],
                                "additionalProperties": false
                              },
                              "conversationReport": {
                                "type": "object",
                                "properties": {
                                  "status": {
                                    "type": "string"
                                  },
                                  "contentAvailable": {
                                    "type": "boolean"
                                  },
                                  "artifactId": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "errorCode": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "pattern": "^[a-zA-Z0-9_.-]{1,100}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "status",
                                  "contentAvailable",
                                  "artifactId",
                                  "errorCode"
                                ],
                                "additionalProperties": false
                              },
                              "customerEmail": {
                                "type": "object",
                                "properties": {
                                  "status": {
                                    "type": "string"
                                  },
                                  "contentAvailable": {
                                    "type": "boolean"
                                  },
                                  "artifactId": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "errorCode": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "pattern": "^[a-zA-Z0-9_.-]{1,100}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "status",
                                  "contentAvailable",
                                  "artifactId",
                                  "errorCode"
                                ],
                                "additionalProperties": false
                              },
                              "followUpEmail": {
                                "type": "object",
                                "properties": {
                                  "status": {
                                    "type": "string"
                                  },
                                  "contentAvailable": {
                                    "type": "boolean"
                                  },
                                  "artifactId": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "errorCode": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "pattern": "^[a-zA-Z0-9_.-]{1,100}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "status",
                                  "contentAvailable",
                                  "artifactId",
                                  "errorCode"
                                ],
                                "additionalProperties": false
                              }
                            },
                            "required": [],
                            "additionalProperties": false
                          }
                        },
                        "required": [
                          "id",
                          "sourceType",
                          "sourceId",
                          "language",
                          "action",
                          "status",
                          "outcomes"
                        ],
                        "additionalProperties": false,
                        "description": "Geprojecteerde metadata zonder legacycredits, opslagpaden of inhoud. Onbruikbare artifactId/foutcode wordt null; status/action blijven bestaande opgeslagen tekenreeksen."
                      }
                    },
                    "policyVersion": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "policyUpdatedAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "gesprek_id",
                    "resolvedLanguages",
                    "variantStatuses"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/taalvariantenLezen.js",
          "server/lib/publiekeApi/leesdelegatie.js",
          "server/lib/publiekeApi/acties.js",
          "server/rapportly_api.js",
          "server/jobs/tweedeUitvoertaal.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/migrations/197_tweede_uitvoertaal.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "91a4b1b4"
      },
      "post": {
        "operationId": "taalproductie_gesprek_start",
        "summary": "taalproductie gesprek start",
        "description": "Expliciete betaalde vertaalstart van gekozen beschikbare uitkomsten. Gebruik huidige contextbasis, andere taal dan de bron en bevestigd:true. Actuele tweede-taalkeuze, kantoor, proefperiode/pakket en werkelijke-kostenmodus vereist. Ontvangst en oorspronkelijke actor/key worden duurzaam gebonden vóór native workerstart. Een bestaande native/legacytaalopdracht of bestaande doelvertaling wordt niet geadopteerd; dezelfde bron/taal met een nieuwe sleutel is geen tweede start. Rapportproducer kan rapport én brief verwerken ook bij één gekozen uitkomst; lees verwerkt_uitkomsten voor de werkelijke reikwijdte. HTTP202 is geen voltooiingsbewijs; volg statusUrl. Een exact herhaalverzoek krijgt dezelfde opdracht. Geen vrije actor/model/tarief/providerinvoer. Geen queryparameters. Alleen actuele eigen actor/organisatie, oorspronkelijke sleutel en zichtbare bron; volledige-APIvrijgave en huidige rechten/plafond blijven vereist. Schrijven gebruikt8–128 veilige tekens in Idempotency-Key. Bewaar exact verzoek en sleutel voor antwoordverlies. Gewijzigde bron, actor, key, taalkeuze of workflowbinding geeft geen toestemming om een bestaande opdracht over te nemen. Native taalproducer, persoonlijke werkelijke kosten, reservering/afrekening en privacy blijven leidend. Geen vast of gratis tarief. ",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ZelfstandigeTaalStartOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige route-UUID. De zelfstandige registrar maskeert de detailcode als taalproductie_onbeschikbaar; workflow behoudt validatie_mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "verwerkingen:starten",
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/taalvariantenSchrijven.js",
          "server/lib/uitvoer/workflowTaalContract.js",
          "server/lib/uitvoer/taalProductieContext.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/jobs/tweedeUitvoertaal.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/migrations/372_rapportly_workflow_uitvoering.sql"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke taalinput: gebruik een kleine taalcode van twee of drie letters. De normalisator accepteert ook hoofdletters en omliggende witruimte; die ruimere invoer is niet als aanbevolen vorm beschreven."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "language": {
                    "type": "string",
                    "pattern": "^[a-z]{2,3}$"
                  },
                  "outcomes": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "conversationReport",
                        "customerEmail",
                        "followUpEmail"
                      ]
                    },
                    "minItems": 1,
                    "maxItems": 3,
                    "uniqueItems": true
                  },
                  "basis": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "language",
                  "outcomes",
                  "basis",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "x-bronref": "cfe078af",
        "x-query-aanvullingen-toegestaan": false
      }
    },
    "/v1/rapporten/{id}/taalvarianten": {
      "get": {
        "operationId": "taalstatus_report",
        "summary": "taalstatus report",
        "description": "Alle huidige/historische taalopdrachten van zichtbare bron, oplopend aanmaakmoment; geen queryvelden/cursor. Bron-/actor-/objectrechten vóór en na lezen; gewijzigde taal/dossier-/klantbinding409. Huidige beleidskeuze en historische status zijn afzonderlijk. Bij uitgeschakelde tweede-taalfeature en ontbrekend beleidsleesmodel reconstrueert native helper alleen resolvedLanguages plus historie; requestedLanguagePolicy,actieve selectie en policyversie kunnen dan ontbreken. Historie bevat geen creditsveld: eigen gebruiksoverzicht blijft afrekenbron. Private,no-store; bron niet zichtbaar404, onleesbare status503. Geen nieuwe vertaling of retry. Vlak vóór antwoord worden sleutelactivatie/pauze/intrekking/verval, recht en rechtenplafond, actorrol/organisatie en expliciet pakket opnieuw gecontroleerd. Tijdens lezen vervallen delegatie geeft403 api_leesdelegatie_geweigerd; onleesbare controlebron503 api_taalstatus_onbeschikbaar.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "rapport_versie_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "requestedLanguagePolicy": {
                      "type": "object",
                      "properties": {
                        "primary": {
                          "type": "string",
                          "pattern": "^[a-z]{2,3}$",
                          "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                        },
                        "secondary": {
                          "type": "object",
                          "properties": {
                            "report": {
                              "oneOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "mode": {
                                      "type": "string",
                                      "enum": [
                                        "inherit",
                                        "off"
                                      ]
                                    }
                                  },
                                  "required": [
                                    "mode"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "object",
                                  "properties": {
                                    "mode": {
                                      "const": "specific"
                                    },
                                    "language": {
                                      "type": "string",
                                      "pattern": "^[a-z]{2,3}$",
                                      "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                                    }
                                  },
                                  "required": [
                                    "mode",
                                    "language"
                                  ],
                                  "additionalProperties": false
                                }
                              ]
                            },
                            "coverLetter": {
                              "oneOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "mode": {
                                      "type": "string",
                                      "enum": [
                                        "inherit",
                                        "off"
                                      ]
                                    }
                                  },
                                  "required": [
                                    "mode"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "object",
                                  "properties": {
                                    "mode": {
                                      "const": "specific"
                                    },
                                    "language": {
                                      "type": "string",
                                      "pattern": "^[a-z]{2,3}$",
                                      "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                                    }
                                  },
                                  "required": [
                                    "mode",
                                    "language"
                                  ],
                                  "additionalProperties": false
                                }
                              ]
                            }
                          },
                          "required": [
                            "report",
                            "coverLetter"
                          ],
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "primary",
                        "secondary"
                      ],
                      "additionalProperties": false
                    },
                    "resolvedLanguages": {
                      "$ref": "#/components/schemas/ResolvedLanguages"
                    },
                    "activeVariantStatuses": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "sourceType": {
                            "const": "report"
                          },
                          "sourceId": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "language": {
                            "type": "string"
                          },
                          "action": {
                            "type": "string"
                          },
                          "status": {
                            "type": "string"
                          },
                          "outcomes": {
                            "type": "object",
                            "properties": {
                              "report": {
                                "type": "object",
                                "properties": {
                                  "status": {
                                    "type": "string"
                                  },
                                  "contentAvailable": {
                                    "type": "boolean"
                                  },
                                  "artifactId": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "errorCode": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "pattern": "^[a-zA-Z0-9_.-]{1,100}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "status",
                                  "contentAvailable",
                                  "artifactId",
                                  "errorCode"
                                ],
                                "additionalProperties": false
                              },
                              "coverLetter": {
                                "type": "object",
                                "properties": {
                                  "status": {
                                    "type": "string"
                                  },
                                  "contentAvailable": {
                                    "type": "boolean"
                                  },
                                  "artifactId": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "errorCode": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "pattern": "^[a-zA-Z0-9_.-]{1,100}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "status",
                                  "contentAvailable",
                                  "artifactId",
                                  "errorCode"
                                ],
                                "additionalProperties": false
                              },
                              "conversationReport": {
                                "type": "object",
                                "properties": {
                                  "status": {
                                    "type": "string"
                                  },
                                  "contentAvailable": {
                                    "type": "boolean"
                                  },
                                  "artifactId": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "errorCode": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "pattern": "^[a-zA-Z0-9_.-]{1,100}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "status",
                                  "contentAvailable",
                                  "artifactId",
                                  "errorCode"
                                ],
                                "additionalProperties": false
                              },
                              "customerEmail": {
                                "type": "object",
                                "properties": {
                                  "status": {
                                    "type": "string"
                                  },
                                  "contentAvailable": {
                                    "type": "boolean"
                                  },
                                  "artifactId": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "errorCode": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "pattern": "^[a-zA-Z0-9_.-]{1,100}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "status",
                                  "contentAvailable",
                                  "artifactId",
                                  "errorCode"
                                ],
                                "additionalProperties": false
                              },
                              "followUpEmail": {
                                "type": "object",
                                "properties": {
                                  "status": {
                                    "type": "string"
                                  },
                                  "contentAvailable": {
                                    "type": "boolean"
                                  },
                                  "artifactId": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "errorCode": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "pattern": "^[a-zA-Z0-9_.-]{1,100}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "status",
                                  "contentAvailable",
                                  "artifactId",
                                  "errorCode"
                                ],
                                "additionalProperties": false
                              }
                            },
                            "required": [],
                            "additionalProperties": false
                          }
                        },
                        "required": [
                          "id",
                          "sourceType",
                          "sourceId",
                          "language",
                          "action",
                          "status",
                          "outcomes"
                        ],
                        "additionalProperties": false,
                        "description": "Geprojecteerde metadata zonder legacycredits, opslagpaden of inhoud. Onbruikbare artifactId/foutcode wordt null; status/action blijven bestaande opgeslagen tekenreeksen."
                      }
                    },
                    "variantStatuses": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "sourceType": {
                            "const": "report"
                          },
                          "sourceId": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "language": {
                            "type": "string"
                          },
                          "action": {
                            "type": "string"
                          },
                          "status": {
                            "type": "string"
                          },
                          "outcomes": {
                            "type": "object",
                            "properties": {
                              "report": {
                                "type": "object",
                                "properties": {
                                  "status": {
                                    "type": "string"
                                  },
                                  "contentAvailable": {
                                    "type": "boolean"
                                  },
                                  "artifactId": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "errorCode": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "pattern": "^[a-zA-Z0-9_.-]{1,100}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "status",
                                  "contentAvailable",
                                  "artifactId",
                                  "errorCode"
                                ],
                                "additionalProperties": false
                              },
                              "coverLetter": {
                                "type": "object",
                                "properties": {
                                  "status": {
                                    "type": "string"
                                  },
                                  "contentAvailable": {
                                    "type": "boolean"
                                  },
                                  "artifactId": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "errorCode": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "pattern": "^[a-zA-Z0-9_.-]{1,100}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "status",
                                  "contentAvailable",
                                  "artifactId",
                                  "errorCode"
                                ],
                                "additionalProperties": false
                              },
                              "conversationReport": {
                                "type": "object",
                                "properties": {
                                  "status": {
                                    "type": "string"
                                  },
                                  "contentAvailable": {
                                    "type": "boolean"
                                  },
                                  "artifactId": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "errorCode": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "pattern": "^[a-zA-Z0-9_.-]{1,100}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "status",
                                  "contentAvailable",
                                  "artifactId",
                                  "errorCode"
                                ],
                                "additionalProperties": false
                              },
                              "customerEmail": {
                                "type": "object",
                                "properties": {
                                  "status": {
                                    "type": "string"
                                  },
                                  "contentAvailable": {
                                    "type": "boolean"
                                  },
                                  "artifactId": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "errorCode": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "pattern": "^[a-zA-Z0-9_.-]{1,100}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "status",
                                  "contentAvailable",
                                  "artifactId",
                                  "errorCode"
                                ],
                                "additionalProperties": false
                              },
                              "followUpEmail": {
                                "type": "object",
                                "properties": {
                                  "status": {
                                    "type": "string"
                                  },
                                  "contentAvailable": {
                                    "type": "boolean"
                                  },
                                  "artifactId": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "errorCode": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "pattern": "^[a-zA-Z0-9_.-]{1,100}$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "status",
                                  "contentAvailable",
                                  "artifactId",
                                  "errorCode"
                                ],
                                "additionalProperties": false
                              }
                            },
                            "required": [],
                            "additionalProperties": false
                          }
                        },
                        "required": [
                          "id",
                          "sourceType",
                          "sourceId",
                          "language",
                          "action",
                          "status",
                          "outcomes"
                        ],
                        "additionalProperties": false,
                        "description": "Geprojecteerde metadata zonder legacycredits, opslagpaden of inhoud. Onbruikbare artifactId/foutcode wordt null; status/action blijven bestaande opgeslagen tekenreeksen."
                      }
                    },
                    "policyVersion": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "policyUpdatedAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "rapport_versie_id",
                    "resolvedLanguages",
                    "variantStatuses"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/taalvariantenLezen.js",
          "server/lib/publiekeApi/leesdelegatie.js",
          "server/lib/publiekeApi/acties.js",
          "server/rapportly_api.js",
          "server/jobs/tweedeUitvoertaal.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/migrations/197_tweede_uitvoertaal.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "91a4b1b4"
      },
      "post": {
        "operationId": "taalproductie_rapport_start",
        "summary": "taalproductie rapport start",
        "description": "Expliciete betaalde vertaalstart van gekozen beschikbare uitkomsten. Gebruik huidige contextbasis, andere taal dan de bron en bevestigd:true. Actuele tweede-taalkeuze, kantoor, proefperiode/pakket en werkelijke-kostenmodus vereist. Ontvangst en oorspronkelijke actor/key worden duurzaam gebonden vóór native workerstart. Een bestaande native/legacytaalopdracht of bestaande doelvertaling wordt niet geadopteerd; dezelfde bron/taal met een nieuwe sleutel is geen tweede start. Rapportproducer kan rapport én brief verwerken ook bij één gekozen uitkomst; lees verwerkt_uitkomsten voor de werkelijke reikwijdte. HTTP202 is geen voltooiingsbewijs; volg statusUrl. Een exact herhaalverzoek krijgt dezelfde opdracht. Geen vrije actor/model/tarief/providerinvoer. Geen queryparameters. Alleen actuele eigen actor/organisatie, oorspronkelijke sleutel en zichtbare bron; volledige-APIvrijgave en huidige rechten/plafond blijven vereist. Schrijven gebruikt8–128 veilige tekens in Idempotency-Key. Bewaar exact verzoek en sleutel voor antwoordverlies. Gewijzigde bron, actor, key, taalkeuze of workflowbinding geeft geen toestemming om een bestaande opdracht over te nemen. Native taalproducer, persoonlijke werkelijke kosten, reservering/afrekening en privacy blijven leidend. Geen vast of gratis tarief. ",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ZelfstandigeTaalStartOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige route-UUID. De zelfstandige registrar maskeert de detailcode als taalproductie_onbeschikbaar; workflow behoudt validatie_mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "verwerkingen:starten",
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/taalvariantenSchrijven.js",
          "server/lib/uitvoer/workflowTaalContract.js",
          "server/lib/uitvoer/taalProductieContext.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/jobs/tweedeUitvoertaal.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/migrations/372_rapportly_workflow_uitvoering.sql"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke taalinput: gebruik een kleine taalcode van twee of drie letters. De normalisator accepteert ook hoofdletters en omliggende witruimte; die ruimere invoer is niet als aanbevolen vorm beschreven."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "language": {
                    "type": "string",
                    "pattern": "^[a-z]{2,3}$"
                  },
                  "outcomes": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "report",
                        "coverLetter"
                      ]
                    },
                    "minItems": 1,
                    "maxItems": 2,
                    "uniqueItems": true
                  },
                  "basis": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "language",
                  "outcomes",
                  "basis",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "x-bronref": "cfe078af",
        "x-query-aanvullingen-toegestaan": false
      }
    },
    "/v1/taalvarianten/{opdrachtId}/{outcome}": {
      "get": {
        "operationId": "taalvariant_inhoud",
        "summary": "taalvariant inhoud",
        "description": "Geen queryvelden. Leest bestaande geslaagde uitkomst, met taalopdracht-/bronrechten voor en na inhoudsread. Gewijzigde opdrachtbinding409. Bij persoonlijke gesprekcredits kan een geslaagde uitkomst al leesbaar zijn terwijl de hele opdracht nog niet geslaagd is; anders volledige opdracht geslaagd vereist. Ontbrekende/nog niet gereed variant409; bron/onzichtbare opdracht404; database-/projectiefout503. content is tekst of null. artifactRefs/opslagpaden/vrije downloadURLs worden niet geëxporteerd. artifactId vereist aanvullend actueel rapportversieleesrecht en gebruikt bestaande geauthenticeerde resultaatdownload; deze GET rendert geen nieuw document. Private,no-store. Vlak vóór antwoord worden sleutelactivatie/pauze/intrekking/verval, recht en rechtenplafond, actorrol/organisatie en expliciet pakket opnieuw gecontroleerd. Tijdens lezen vervallen delegatie geeft403 api_leesdelegatie_geweigerd; onleesbare controlebron503 api_taalstatus_onbeschikbaar. Selectieve bron80be4075: coverLetter geeft de daadwerkelijke niet-lege UTF8brieftekst, maximaal1MiB. Alleen de bestaande native referentie reportVersionId + file brief.md is bruikbaar; artifactRefs blijft intern. Bron en doel moeten dezelfde dossier/organisatie hebben; doel is klaar, Rapportly, vertaald van de bron en in de opdrachttaal. Bron- en doelrapportrechten worden vóór en na lezen gecontroleerd, evenals de ongewijzigde variant/opdracht en actuele sleutel. Ontbrekende/onveilige referentie, onleesbare bytes, lege of ongeldige UTF8 en bovengrens geven503; gewijzigde binding409. Geen vrije opslagreferentie of nieuwe rendering.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "opdrachtId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "outcome",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "report",
                "coverLetter",
                "conversationReport",
                "customerEmail",
                "followUpEmail"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "language": {
                      "type": "string"
                    },
                    "outcome": {
                      "type": "string",
                      "enum": [
                        "report",
                        "coverLetter",
                        "conversationReport",
                        "customerEmail",
                        "followUpEmail"
                      ]
                    },
                    "content": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "artifactId": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "language",
                    "outcome",
                    "content",
                    "artifactId"
                  ],
                  "additionalProperties": false,
                  "allOf": [
                    {
                      "if": {
                        "properties": {
                          "outcome": {
                            "const": "coverLetter"
                          }
                        },
                        "required": [
                          "outcome"
                        ]
                      },
                      "then": {
                        "properties": {
                          "content": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 1048576,
                            "pattern": "\\S",
                            "x-max-utf8-bytes": 1048576
                          }
                        }
                      }
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/taalvariantenLezen.js",
          "server/lib/publiekeApi/leesdelegatie.js",
          "server/lib/publiekeApi/acties.js",
          "server/rapportly_api.js",
          "server/jobs/tweedeUitvoertaal.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/migrations/197_tweede_uitvoertaal.sql",
          "server/lib/publiekeApi/taalbriefLezen.js",
          "server/lib/klantrechten.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "80be4075"
      }
    },
    "/v1/stijlen-v2": {
      "get": {
        "operationId": "stijlenv2_lijst",
        "summary": "stijlenv2 lijst",
        "description": "Actieve stijlen aflopend bijgewerkt, zonder clientpaginering. Interne grens5000 organisatiestijlen vóór persoonlijke zichtbaarheidsfilter geeft503 stijl_lijst_te_groot. kan_beheren is teampublicatierecht; een fout bij uitsluitend deze extra UIcontrole wordt false. Lezen van getoonde teamstijlen en vakstijl faalt bij onbeschikbare rechten/opslag met503. Cache-Control:no-store. Persoonlijke stijlen zijn alleen voor de eigenaar zichtbaar; organisatie-/documentstijlen vereisen voor wijzigen actuele teampublicatierechten. Een API-sleutelrecht vervangt deze objectrechten niet.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "format": {
                      "const": "v2"
                    },
                    "stijlen": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StijlenV2Stijl"
                      }
                    },
                    "vakstijl": {
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                            },
                            "naam": {
                              "type": "string"
                            },
                            "omschrijving": {
                              "type": "string"
                            },
                            "versie": {
                              "type": "integer",
                              "minimum": 1
                            },
                            "zichtbare_regels": {
                              "type": "array",
                              "items": {
                                "$ref": "#/components/schemas/StijlenV2Regel"
                              },
                              "maxItems": 30,
                              "description": "Unieke sleutel per regel; sleutel en waarde worden getrimd. Handmatig opgegeven regels gaan vóór de uit antwoorden afgeleide regel met dezelfde sleutel."
                            },
                            "heeft_vaste_vakafspraken": {
                              "type": "boolean"
                            }
                          },
                          "required": [
                            "id",
                            "naam",
                            "omschrijving",
                            "versie",
                            "zichtbare_regels",
                            "heeft_vaste_vakafspraken"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "kan_beheren": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "format",
                    "stijlen",
                    "vakstijl",
                    "kan_beheren"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlenV2.js",
          "server/lib/stijlenV2/routes.js",
          "server/lib/stijlenV2/contract.js",
          "server/jobs/adapters/stijlenV2Test.js",
          "server/jobs/handlers/stijlenV2Test.js",
          "server/jobs/stijlenV2TestOnderhoud.js",
          "server/migrations/348_rapportly_stijlen_v2.sql",
          "server/migrations/353_rapportly_stijltest_jobquota.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "post": {
        "operationId": "stijlenv2_aanmaken",
        "summary": "stijlenv2 aanmaken",
        "description": "Modelvrije aanmaak met eerste direct actieve versie.201 nieuw,200 identieke ontvangst. begeleid gebruikt vragen/regels; voorbeeld vereist zichtbaar actief/klaar klassiek stijlprofiel. Buiten laagdocument wordt document_type als null bewaard. Gelezen legacystructuur kan opbouwregel aanvullen. Zelfde sleutel en genormaliseerde invoer geeft oorspronkelijke ontvangst, maar stijl beschrijft de HUIDIGE actieve versie. Aanmaken en versiepublicatie delen sleutelnamespace; kies een nieuwe sleutel voor een andere operatie. Gewijzigde invoer409, verdwenen stijl410. Naam trim1–120, categorie trim/samengevouwen witruimte1–80 zonder controls. Cache-Control:no-store. Persoonlijke stijlen zijn alleen voor de eigenaar zichtbaar; organisatie-/documentstijlen vereisen voor wijzigen actuele teampublicatierechten. Een API-sleutelrecht vervangt deze objectrechten niet.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "stijl": {
                      "$ref": "#/components/schemas/StijlenV2Stijl"
                    },
                    "ontvangst": {
                      "type": "object",
                      "properties": {
                        "stijl_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "versie_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "herhaald": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "stijl_id",
                        "versie_id",
                        "herhaald"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "stijl",
                    "ontvangst"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "201": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "stijl": {
                      "$ref": "#/components/schemas/StijlenV2Stijl"
                    },
                    "ontvangst": {
                      "type": "object",
                      "properties": {
                        "stijl_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "versie_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "herhaald": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "stijl_id",
                        "versie_id",
                        "herhaald"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "stijl",
                    "ontvangst"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlenV2.js",
          "server/lib/stijlenV2/routes.js",
          "server/lib/stijlenV2/contract.js",
          "server/jobs/adapters/stijlenV2Test.js",
          "server/jobs/handlers/stijlenV2Test.js",
          "server/jobs/stijlenV2TestOnderhoud.js",
          "server/migrations/348_rapportly_stijlen_v2.sql",
          "server/migrations/353_rapportly_stijltest_jobquota.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke getypeerde invoer beschreven; tolerante normalisatie van niet-arrayanalyse, extra geneste velden en witruimte boven de grens vóór trimmen is geen volledig acceptatieschema."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "naam": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120,
                    "pattern": "\\S"
                  },
                  "laag": {
                    "type": "string",
                    "enum": [
                      "persoonlijk",
                      "organisatie",
                      "document"
                    ]
                  },
                  "document_type": {
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "rapport",
                          "offerte",
                          "email",
                          "gespreksverslag",
                          "brief",
                          "presentatie"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "bron": {
                    "type": "string",
                    "enum": [
                      "begeleid",
                      "voorbeeld"
                    ]
                  },
                  "bron_stijlprofiel_id": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "regels": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/StijlenV2Regel"
                    },
                    "maxItems": 30,
                    "description": "Unieke sleutel per regel; sleutel en waarde worden getrimd. Handmatig opgegeven regels gaan vóór de uit antwoorden afgeleide regel met dezelfde sleutel."
                  },
                  "antwoorden": {
                    "anyOf": [
                      {
                        "$ref": "#/components/schemas/StijlenV2Antwoorden"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "analyse": {
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "herkend": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "properties": {
                                "onderdeel": {
                                  "type": "string",
                                  "maxLength": 64
                                },
                                "waarde": {
                                  "type": "string",
                                  "maxLength": 500
                                }
                              },
                              "required": [
                                "onderdeel",
                                "waarde"
                              ],
                              "additionalProperties": false
                            },
                            "maxItems": 30
                          },
                          "onzeker": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "properties": {
                                "onderdeel": {
                                  "type": "string",
                                  "maxLength": 64
                                },
                                "vraag": {
                                  "type": "string",
                                  "maxLength": 500
                                }
                              },
                              "required": [
                                "onderdeel",
                                "vraag"
                              ],
                              "additionalProperties": false
                            },
                            "maxItems": 30
                          },
                          "niet_herkend": {
                            "type": "array",
                            "items": {
                              "type": "string",
                              "maxLength": 500
                            },
                            "maxItems": 30
                          }
                        },
                        "required": [],
                        "additionalProperties": false,
                        "description": "Canonieke optionele analyseaantekeningen. Bron en voorbeeldcategorie komen van de server. Niet-arrayvelden worden historisch als lege lijst behandeld; stuur de beschreven arrays."
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "voorbeeld_categorie": {
                    "anyOf": [
                      {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 80,
                        "pattern": "^[^\\x00-\\x1f\\x7f]+$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": [
                  "naam",
                  "laag",
                  "bron"
                ],
                "additionalProperties": false,
                "allOf": [
                  {
                    "if": {
                      "properties": {
                        "laag": {
                          "const": "document"
                        }
                      },
                      "required": [
                        "laag"
                      ]
                    },
                    "then": {
                      "required": [
                        "document_type"
                      ],
                      "properties": {
                        "document_type": {
                          "type": "string",
                          "enum": [
                            "rapport",
                            "offerte",
                            "email",
                            "gespreksverslag",
                            "brief",
                            "presentatie"
                          ]
                        }
                      }
                    }
                  },
                  {
                    "if": {
                      "properties": {
                        "bron": {
                          "const": "voorbeeld"
                        }
                      },
                      "required": [
                        "bron"
                      ]
                    },
                    "then": {
                      "required": [
                        "bron_stijlprofiel_id"
                      ],
                      "properties": {
                        "bron_stijlprofiel_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        }
                      }
                    },
                    "else": {
                      "properties": {
                        "bron_stijlprofiel_id": {
                          "type": "null"
                        },
                        "voorbeeld_categorie": {
                          "type": "null"
                        }
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/v1/stijlen-v2/{id}": {
      "get": {
        "operationId": "stijlenv2_lezen",
        "summary": "stijlenv2 lezen",
        "description": "Huidige stijl plus alle onveranderlijke versies, aflopend versie_nummer. Actieve pointer kan naar een oudere versie wijzen. Geen cursor of kunstmatige historielimiet. Cache-Control:no-store. Persoonlijke stijlen zijn alleen voor de eigenaar zichtbaar; organisatie-/documentstijlen vereisen voor wijzigen actuele teampublicatierechten. Een API-sleutelrecht vervangt deze objectrechten niet.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "stijl": {
                      "$ref": "#/components/schemas/StijlenV2Stijl"
                    },
                    "versies": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StijlenV2VersieHistorie"
                      }
                    }
                  },
                  "required": [
                    "stijl",
                    "versies"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlenV2.js",
          "server/lib/stijlenV2/routes.js",
          "server/lib/stijlenV2/contract.js",
          "server/jobs/adapters/stijlenV2Test.js",
          "server/jobs/handlers/stijlenV2Test.js",
          "server/jobs/stijlenV2TestOnderhoud.js",
          "server/migrations/348_rapportly_stijlen_v2.sql",
          "server/migrations/353_rapportly_stijltest_jobquota.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/stijlen-v2/context": {
      "get": {
        "operationId": "stijlenv2_context",
        "summary": "stijlenv2 context",
        "description": "Zonder expliciete id kiest de server de laatst bijgewerkte actieve stijl per laag; persoonlijk alleen eigen en document alleen gevraagd document_type. Documentstijl-id vereist document_type en dezelfde documentsoort. Hoogste laag wint per sleutel: beschermd, vakstijl, organisatie, document, persoonlijk, opdracht. Dit leest regels en start geen model. Cache-Control:no-store. Persoonlijke stijlen zijn alleen voor de eigenaar zichtbaar; organisatie-/documentstijlen vereisen voor wijzigen actuele teampublicatierechten. Een API-sleutelrecht vervangt deze objectrechten niet.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "document_type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "rapport",
                "offerte",
                "email",
                "gespreksverslag",
                "brief",
                "presentatie"
              ]
            }
          },
          {
            "name": "organisatiestijl_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "documentstijl_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "persoonlijk_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "prioriteit": {
                      "const": [
                        "beschermd",
                        "vakstijl",
                        "organisatie",
                        "document",
                        "persoonlijk",
                        "opdracht"
                      ]
                    },
                    "regels": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "sleutel": {
                            "type": "string"
                          },
                          "waarde": {
                            "type": "string"
                          },
                          "laag": {
                            "type": "string",
                            "enum": [
                              "beschermd",
                              "vakstijl",
                              "organisatie",
                              "document",
                              "persoonlijk",
                              "opdracht"
                            ]
                          }
                        },
                        "required": [
                          "sleutel",
                          "waarde",
                          "laag"
                        ],
                        "additionalProperties": false
                      }
                    },
                    "vakstijl": {
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                            },
                            "naam": {
                              "type": "string"
                            },
                            "versie": {
                              "type": "integer",
                              "minimum": 1
                            }
                          },
                          "required": [
                            "id",
                            "naam",
                            "versie"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "lagen": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "laag": {
                            "type": "string",
                            "enum": [
                              "persoonlijk",
                              "organisatie",
                              "document"
                            ]
                          },
                          "stijl_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "versie_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          }
                        },
                        "required": [
                          "laag",
                          "stijl_id",
                          "versie_id"
                        ],
                        "additionalProperties": false
                      }
                    },
                    "versie_ids": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      }
                    }
                  },
                  "required": [
                    "prioriteit",
                    "regels",
                    "vakstijl",
                    "lagen",
                    "versie_ids"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlenV2.js",
          "server/lib/stijlenV2/routes.js",
          "server/lib/stijlenV2/contract.js",
          "server/jobs/adapters/stijlenV2Test.js",
          "server/jobs/handlers/stijlenV2Test.js",
          "server/jobs/stijlenV2TestOnderhoud.js",
          "server/migrations/348_rapportly_stijlen_v2.sql",
          "server/migrations/353_rapportly_stijltest_jobquota.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke contextquery beschrijft vier scalars. Native helper kan daarnaast opdracht_regels uit een genest queryobject verwerken; Express-arrayserialisatie is nog niet als interoperabel clientcontract uitgewerkt."
        ]
      }
    },
    "/v1/stijlen-v2/{id}/versies": {
      "post": {
        "operationId": "stijlenv2_versie_publiceren",
        "summary": "stijlenv2 versie publiceren",
        "description": "Nieuwe onveranderlijke versie wordt meteen actief; basis_versie_id moet bij eerste publicatie nog actief zijn. Verouderde basis409; niet gevonden basis503. API vereist naam en regels. Ontbrekende/null antwoorden erven basis; leeg object wist antwoorden. Categorie bij voorbeeld erft bij ontbrekend/null en kan dus niet via null worden gewist; begeleid accepteert alleen null/ontbrekend.201 nieuw,200 identieke ontvangst. Bij replay is versie de historische ontvangen versie, stijl de huidige actieve stijl; verwar deze niet. Genormaliseerde invoerhash en blijvende sleutelontvangst voorkomen dubbele versiepublicatie. Cache-Control:no-store. Persoonlijke stijlen zijn alleen voor de eigenaar zichtbaar; organisatie-/documentstijlen vereisen voor wijzigen actuele teampublicatierechten. Een API-sleutelrecht vervangt deze objectrechten niet.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "stijl": {
                      "$ref": "#/components/schemas/StijlenV2Stijl"
                    },
                    "versie": {
                      "$ref": "#/components/schemas/StijlenV2Versie"
                    },
                    "ontvangst": {
                      "type": "object",
                      "properties": {
                        "stijl_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "versie_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "herhaald": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "stijl_id",
                        "versie_id",
                        "herhaald"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "stijl",
                    "versie",
                    "ontvangst"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "201": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "stijl": {
                      "$ref": "#/components/schemas/StijlenV2Stijl"
                    },
                    "versie": {
                      "$ref": "#/components/schemas/StijlenV2Versie"
                    },
                    "ontvangst": {
                      "type": "object",
                      "properties": {
                        "stijl_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "versie_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "herhaald": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "stijl_id",
                        "versie_id",
                        "herhaald"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "stijl",
                    "versie",
                    "ontvangst"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlenV2.js",
          "server/lib/stijlenV2/routes.js",
          "server/lib/stijlenV2/contract.js",
          "server/jobs/adapters/stijlenV2Test.js",
          "server/jobs/handlers/stijlenV2Test.js",
          "server/jobs/stijlenV2TestOnderhoud.js",
          "server/migrations/348_rapportly_stijlen_v2.sql",
          "server/migrations/353_rapportly_stijltest_jobquota.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke getypeerde invoer beschreven; tolerante normalisatie van niet-arrayanalyse, extra geneste velden en witruimte boven de grens vóór trimmen is geen volledig acceptatieschema.",
          "Wijzigingsreden heeft historisch String-coercie; de canonieke invoer is tekst of null."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis_versie_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "naam": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120,
                    "pattern": "\\S"
                  },
                  "regels": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/StijlenV2Regel"
                    },
                    "maxItems": 30,
                    "description": "Unieke sleutel per regel; sleutel en waarde worden getrimd. Handmatig opgegeven regels gaan vóór de uit antwoorden afgeleide regel met dezelfde sleutel."
                  },
                  "antwoorden": {
                    "anyOf": [
                      {
                        "$ref": "#/components/schemas/StijlenV2Antwoorden"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "analyse": {
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "herkend": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "properties": {
                                "onderdeel": {
                                  "type": "string",
                                  "maxLength": 64
                                },
                                "waarde": {
                                  "type": "string",
                                  "maxLength": 500
                                }
                              },
                              "required": [
                                "onderdeel",
                                "waarde"
                              ],
                              "additionalProperties": false
                            },
                            "maxItems": 30
                          },
                          "onzeker": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "properties": {
                                "onderdeel": {
                                  "type": "string",
                                  "maxLength": 64
                                },
                                "vraag": {
                                  "type": "string",
                                  "maxLength": 500
                                }
                              },
                              "required": [
                                "onderdeel",
                                "vraag"
                              ],
                              "additionalProperties": false
                            },
                            "maxItems": 30
                          },
                          "niet_herkend": {
                            "type": "array",
                            "items": {
                              "type": "string",
                              "maxLength": 500
                            },
                            "maxItems": 30
                          }
                        },
                        "required": [],
                        "additionalProperties": false,
                        "description": "Canonieke optionele analyseaantekeningen. Bron en voorbeeldcategorie komen van de server. Niet-arrayvelden worden historisch als lege lijst behandeld; stuur de beschreven arrays."
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "voorbeeld_categorie": {
                    "anyOf": [
                      {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 80,
                        "pattern": "^[^\\x00-\\x1f\\x7f]+$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "wijzigingsreden": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 500
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": [
                  "basis_versie_id",
                  "naam",
                  "regels"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/stijlen-v2/{id}/analyse": {
      "post": {
        "operationId": "stijlenv2_analyse",
        "summary": "stijlenv2 analyse",
        "description": "Leest reeds opgeslagen analyse van de actieve versie; geen AI of nieuwe analyse. Deze route is POST met resultaten:lezen en staat in de catalogus niet als leesvrijstelling voor de proefperiode. Actieve versie ontbreekt503. Cache-Control:no-store. Persoonlijke stijlen zijn alleen voor de eigenaar zichtbaar; organisatie-/documentstijlen vereisen voor wijzigen actuele teampublicatierechten. Een API-sleutelrecht vervangt deze objectrechten niet.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "analyse": {
                      "$ref": "#/components/schemas/StijlenV2Analyse"
                    }
                  },
                  "required": [
                    "analyse"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlenV2.js",
          "server/lib/stijlenV2/routes.js",
          "server/lib/stijlenV2/contract.js",
          "server/jobs/adapters/stijlenV2Test.js",
          "server/jobs/handlers/stijlenV2Test.js",
          "server/jobs/stijlenV2TestOnderhoud.js",
          "server/migrations/348_rapportly_stijlen_v2.sql",
          "server/migrations/353_rapportly_stijltest_jobquota.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LegeBody"
              }
            }
          }
        }
      }
    },
    "/v1/stijlen-v2/{id}/activeren": {
      "post": {
        "operationId": "stijlenv2_activeren",
        "summary": "stijlenv2 activeren",
        "description": "Activeert een bestaande versie van dezelfde stijl. Expliciete bevestiging en huidige basis vereist; vergelijk-en-wissel voorkomt overschrijven. Als doelversie al actief is, antwoord herhaald:true vóór vergelijking met basiswaarde; basis moet wel een geldige UUID zijn. Geen afzonderlijke idempotentieontvangst.404 bij ontbrekende doelversie,409 bij concurrent gewijzigde actieve pointer. Cache-Control:no-store. Persoonlijke stijlen zijn alleen voor de eigenaar zichtbaar; organisatie-/documentstijlen vereisen voor wijzigen actuele teampublicatierechten. Een API-sleutelrecht vervangt deze objectrechten niet.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "stijl": {
                      "$ref": "#/components/schemas/StijlenV2Stijl"
                    },
                    "herhaald": {
                      "const": true
                    }
                  },
                  "required": [
                    "stijl"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlenV2.js",
          "server/lib/stijlenV2/routes.js",
          "server/lib/stijlenV2/contract.js",
          "server/jobs/adapters/stijlenV2Test.js",
          "server/jobs/handlers/stijlenV2Test.js",
          "server/jobs/stijlenV2TestOnderhoud.js",
          "server/migrations/348_rapportly_stijlen_v2.sql",
          "server/migrations/353_rapportly_stijltest_jobquota.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "versie_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "basis_versie_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "versie_id",
                  "basis_versie_id",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/stijlen-v2/{id}/feedback": {
      "post": {
        "operationId": "stijlenv2_feedback",
        "summary": "stijlenv2 feedback",
        "description": "Eenmalige beoordeling van eigen test bij deze zichtbare stijl. Bewaart score en hash van getrimde opmerking, geen opmerkingstekst. Opmerking maximaal500 ruwe tekens. Ontbrekende of al beoordeelde test404; verloren antwoord niet blind opnieuw insturen. Geen idempotentieontvangst. Cache-Control:no-store. Persoonlijke stijlen zijn alleen voor de eigenaar zichtbaar; organisatie-/documentstijlen vereisen voor wijzigen actuele teampublicatierechten. Een API-sleutelrecht vervangt deze objectrechten niet.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "feedback": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "score": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 5
                        },
                        "feedback_op": {
                          "type": "string",
                          "format": "date-time"
                        }
                      },
                      "required": [
                        "id",
                        "score",
                        "feedback_op"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "feedback"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlenV2.js",
          "server/lib/stijlenV2/routes.js",
          "server/lib/stijlenV2/contract.js",
          "server/jobs/adapters/stijlenV2Test.js",
          "server/jobs/handlers/stijlenV2Test.js",
          "server/jobs/stijlenV2TestOnderhoud.js",
          "server/migrations/348_rapportly_stijlen_v2.sql",
          "server/migrations/353_rapportly_stijltest_jobquota.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "test_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "score": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 5
                  },
                  "opmerking": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 500
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": [
                  "test_id",
                  "score"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/stijlen-v2/{id}/test-aanvragen": {
      "post": {
        "operationId": "stijlenv2_test_starten",
        "summary": "stijlenv2 test starten",
        "description": "Betaalde duurzame stijltest, geen gratis simulator. Kies voorbeeldtekst OF zichtbaar gereed gesprekverslag; gesprek wordt tot eerste3000tekens begrensd met waarschuwing. Private adapter accepteert UUIDversies1–5. API leidt aanvraag_id af uit sleutel/idempotentie: niet zelf opsturen. Vereist werkelijke API-kostenmodus, jobreadiness en actuele credit-/budget-/privacypoorten. Snapshot van huidige stijl/context hoort bij de inputhash; gewijzigde context onder dezelfde sleutel kan409 geven.202 bewijst alleen ontvangst. Worker reserveert hoogstens10pogingen per actor/UTCdag met jobgebonden herhaling. Reeds opgeslagen output wordt hergebruikt; na onzekere providerstart verhindert startpoort automatische tweede generatie. Bronrechten opnieuw vóór/na generatie. Geen publieke retryroute in deze groep. Cache-Control:no-store. Persoonlijke stijlen zijn alleen voor de eigenaar zichtbaar; organisatie-/documentstijlen vereisen voor wijzigen actuele teampublicatierechten. Een API-sleutelrecht vervangt deze objectrechten niet.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "aanvraag_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "job_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "status": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "aanvraag_id",
                    "job_id",
                    "status"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Gesprek heeft geen gereed verslag van minstens20 getrimde tekens.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlenV2.js",
          "server/lib/stijlenV2/routes.js",
          "server/lib/stijlenV2/contract.js",
          "server/jobs/adapters/stijlenV2Test.js",
          "server/jobs/handlers/stijlenV2Test.js",
          "server/jobs/stijlenV2TestOnderhoud.js",
          "server/migrations/348_rapportly_stijlen_v2.sql",
          "server/migrations/353_rapportly_stijltest_jobquota.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "voorbeeldtekst": {
                    "type": "string",
                    "minLength": 20,
                    "maxLength": 3000,
                    "description": "Getrimde lengte minstens20; ruwe lengte maximaal3000."
                  },
                  "gesprek_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[1-5][a-f0-9A-F]{3}-[89abAB][a-f0-9A-F]{3}-[a-f0-9A-F]{12}$"
                  },
                  "document_type": {
                    "type": "string",
                    "enum": [
                      "rapport",
                      "offerte",
                      "email",
                      "gespreksverslag",
                      "brief",
                      "presentatie"
                    ]
                  }
                },
                "required": [],
                "additionalProperties": false,
                "oneOf": [
                  {
                    "required": [
                      "voorbeeldtekst"
                    ],
                    "not": {
                      "required": [
                        "gesprek_id"
                      ]
                    }
                  },
                  {
                    "required": [
                      "gesprek_id"
                    ],
                    "not": {
                      "required": [
                        "voorbeeldtekst"
                      ]
                    }
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/v1/stijlen-v2/test-aanvragen/{jobId}": {
      "get": {
        "operationId": "stijlenv2_test_lezen",
        "summary": "stijlenv2 test lezen",
        "description": "Alleen eigen actor/organisatie/style-testjob; huidige stijl- en eventuele gespreksrechten blijven gelden. Geen oorspronkelijke API-sleutelparameter in deze statuslookup. Nog lopend geeft ruwe platformstatus. dead/cancelled wordt mislukt met beperkte code; geslaagd wordt klaar met private tekst/regels/waarschuwingen, geen opslagpad. Vanaf30dagen na job.created_at geeft geslaagde job410verlopen; onbekend404. Ontbrekende of hashafwijkende output503. Een gewijzigd stijlprofiel verandert de bewaarde testsnapshot niet. Cache-Control:no-store. Persoonlijke stijlen zijn alleen voor de eigenaar zichtbaar; organisatie-/documentstijlen vereisen voor wijzigen actuele teampublicatierechten. Een API-sleutelrecht vervangt deze objectrechten niet.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "job_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "status": {
                          "type": "string",
                          "not": {
                            "enum": [
                              "klaar",
                              "mislukt",
                              "verlopen"
                            ]
                          }
                        }
                      },
                      "required": [
                        "job_id",
                        "status"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "job_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "status": {
                          "const": "mislukt"
                        },
                        "code": {
                          "type": "string",
                          "enum": [
                            "stijltest_daglimiet_bereikt",
                            "stijltest_mislukt"
                          ]
                        }
                      },
                      "required": [
                        "job_id",
                        "status",
                        "code"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "job_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "status": {
                          "const": "klaar"
                        },
                        "test_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "resultaat": {
                          "type": "object",
                          "properties": {
                            "tekst": {
                              "type": "string"
                            },
                            "toegepaste_regels": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "sleutel": {
                                    "type": "string"
                                  },
                                  "waarde": {
                                    "type": "string"
                                  },
                                  "laag": {
                                    "type": "string",
                                    "enum": [
                                      "beschermd",
                                      "vakstijl",
                                      "organisatie",
                                      "document",
                                      "persoonlijk",
                                      "opdracht"
                                    ]
                                  }
                                },
                                "required": [
                                  "sleutel",
                                  "waarde",
                                  "laag"
                                ],
                                "additionalProperties": false
                              }
                            },
                            "versie_ids": {
                              "type": "array",
                              "items": {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              }
                            },
                            "waarschuwingen": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            }
                          },
                          "required": [
                            "tekst",
                            "toegepaste_regels",
                            "versie_ids",
                            "waarschuwingen"
                          ],
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "job_id",
                        "status",
                        "test_id",
                        "resultaat"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Geslaagd resultaat vanaf30dagen na jobaanmaak niet meer heropenbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "job_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "status": {
                      "const": "verlopen"
                    },
                    "code": {
                      "const": "stijltest_resultaat_verlopen"
                    }
                  },
                  "required": [
                    "job_id",
                    "status",
                    "code"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/stijlenV2.js",
          "server/lib/stijlenV2/routes.js",
          "server/lib/stijlenV2/contract.js",
          "server/jobs/adapters/stijlenV2Test.js",
          "server/jobs/handlers/stijlenV2Test.js",
          "server/jobs/stijlenV2TestOnderhoud.js",
          "server/migrations/348_rapportly_stijlen_v2.sql",
          "server/migrations/353_rapportly_stijltest_jobquota.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/documentarchetypen": {
      "get": {
        "operationId": "documentarchetypen_lezen",
        "summary": "documentarchetypen lezen",
        "description": "Vaste lijst van vier inhoudsvrije universele DOCXformats. Geen klantinhoud, provideroproep of kosten. Beschikbaar naast de inhoudelijke werkplaatspoort; huidige API-/actor-/organisatierechten blijven vereist.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "enum": [
                          "raster",
                          "nabij",
                          "werkstaat",
                          "dossier"
                        ]
                      },
                      "naam": {
                        "type": "string"
                      },
                      "categorie": {
                        "type": "string"
                      },
                      "omschrijving": {
                        "type": "string"
                      },
                      "pastBij": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "voordeel": {
                        "type": "string"
                      },
                      "nadeel": {
                        "type": "string"
                      },
                      "kleuren": {
                        "type": "object",
                        "properties": {
                          "papier": {
                            "type": "string",
                            "pattern": "^#[0-9A-F]{6}$"
                          },
                          "inkt": {
                            "type": "string",
                            "pattern": "^#[0-9A-F]{6}$"
                          },
                          "primair": {
                            "type": "string",
                            "pattern": "^#[0-9A-F]{6}$"
                          },
                          "accent": {
                            "type": "string",
                            "pattern": "^#[0-9A-F]{6}$"
                          },
                          "zacht": {
                            "type": "string",
                            "pattern": "^#[0-9A-F]{6}$"
                          },
                          "lijn": {
                            "type": "string",
                            "pattern": "^#[0-9A-F]{6}$"
                          },
                          "gedempt": {
                            "type": "string",
                            "pattern": "^#[0-9A-F]{6}$"
                          }
                        },
                        "required": [
                          "papier",
                          "inkt",
                          "primair",
                          "accent",
                          "zacht",
                          "lijn",
                          "gedempt"
                        ],
                        "additionalProperties": false
                      },
                      "fonts": {
                        "type": "object",
                        "properties": {
                          "kop": {
                            "type": "string"
                          },
                          "tekst": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "kop",
                          "tekst"
                        ],
                        "additionalProperties": false
                      },
                      "supportedDocumentTypes": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "enum": [
                            "rapport",
                            "gespreksverslag",
                            "offerte"
                          ]
                        },
                        "minItems": 3,
                        "maxItems": 3,
                        "uniqueItems": true
                      },
                      "previews": {
                        "type": "object",
                        "properties": {
                          "rapport": {
                            "type": "object",
                            "properties": {
                              "pdf": {
                                "type": "string"
                              },
                              "docx": {
                                "type": "string"
                              },
                              "thumbnail": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "pdf",
                              "docx",
                              "thumbnail"
                            ],
                            "additionalProperties": false,
                            "description": "Relatieve voorbeeldbestandsnamen uit het register. Geen signed API-downloadURLs en geen verzoek om een nieuw document."
                          },
                          "gespreksverslag": {
                            "type": "object",
                            "properties": {
                              "pdf": {
                                "type": "string"
                              },
                              "docx": {
                                "type": "string"
                              },
                              "thumbnail": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "pdf",
                              "docx",
                              "thumbnail"
                            ],
                            "additionalProperties": false,
                            "description": "Relatieve voorbeeldbestandsnamen uit het register. Geen signed API-downloadURLs en geen verzoek om een nieuw document."
                          },
                          "offerte": {
                            "type": "object",
                            "properties": {
                              "pdf": {
                                "type": "string"
                              },
                              "docx": {
                                "type": "string"
                              },
                              "thumbnail": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "pdf",
                              "docx",
                              "thumbnail"
                            ],
                            "additionalProperties": false,
                            "description": "Relatieve voorbeeldbestandsnamen uit het register. Geen signed API-downloadURLs en geen verzoek om een nieuw document."
                          }
                        },
                        "required": [
                          "rapport",
                          "gespreksverslag",
                          "offerte"
                        ],
                        "additionalProperties": false
                      }
                    },
                    "required": [
                      "key",
                      "naam",
                      "categorie",
                      "omschrijving",
                      "pastBij",
                      "voordeel",
                      "nadeel",
                      "kleuren",
                      "fonts",
                      "supportedDocumentTypes",
                      "previews"
                    ],
                    "additionalProperties": false
                  },
                  "minItems": 4,
                  "maxItems": 4
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_productie_api.js",
          "server/lib/universele-documentarchetypen/index.js",
          "server/lib/universele-documentarchetypen/voorkeuren.js",
          "server/lib/presentatieV1/stijllozePresentatie.js",
          "server/lib/presentatieV1/archetypeBouwer.js",
          "server/lib/publiekeApi/poorten.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/presentatie-archetypen": {
      "get": {
        "operationId": "presentatiearchetypen_lezen",
        "summary": "presentatiearchetypen lezen",
        "description": "Eigen PPTXregister, los van documentarchetypen. vrijgegeven weerspiegelt presentatiefeatureflag en is geen vrijstelling van render-/privacy-/pakketpoorten of bewijs van gereed resultaat. Alleen metadata.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "schemaVersie": {
                      "const": 1
                    },
                    "registryVersie": {
                      "const": "rapportly-presentatie-archetypen-v1"
                    },
                    "standaard": {
                      "const": "rustig"
                    },
                    "vrijgegeven": {
                      "type": "boolean"
                    },
                    "archetypen": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "key": {
                            "type": "string",
                            "enum": [
                              "raster",
                              "rustig",
                              "kader",
                              "contrast"
                            ]
                          },
                          "naam": {
                            "type": "string"
                          },
                          "beschrijving": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "key",
                          "naam",
                          "beschrijving"
                        ],
                        "additionalProperties": false
                      },
                      "minItems": 4,
                      "maxItems": 4
                    }
                  },
                  "required": [
                    "schemaVersie",
                    "registryVersie",
                    "standaard",
                    "vrijgegeven",
                    "archetypen"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_productie_api.js",
          "server/lib/universele-documentarchetypen/index.js",
          "server/lib/universele-documentarchetypen/voorkeuren.js",
          "server/lib/presentatieV1/stijllozePresentatie.js",
          "server/lib/presentatieV1/archetypeBouwer.js",
          "server/lib/publiekeApi/poorten.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/documentarchetypen/voorkeur": {
      "get": {
        "operationId": "documentformat_voorkeur_lezen",
        "summary": "documentformat voorkeur lezen",
        "description": "Organisatievoorkeur plus wijzigingsrecht en ETag. Binnen de externe API kan alleen de Rapportly-eigenaar wijzigen: de API-actor heeft rolbedrijf. De gedeelde native store kent daarnaast superadmin. Ongeldige/op oude registry gebaseerde opgeslagen voorkeur wordt als automatisch/null gelezen. Databasefout of ontbrekende organisatie503, geen stille standaard bij onleesbare bron. Private,no-store.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentformatVoorkeur"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"documentformat-voorkeur:[a-f0-9]{64}\"$"
                },
                "description": "Exact dezelfde quoted waarde als etag in de body."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_productie_api.js",
          "server/lib/universele-documentarchetypen/index.js",
          "server/lib/universele-documentarchetypen/voorkeuren.js",
          "server/lib/presentatieV1/stijllozePresentatie.js",
          "server/lib/presentatieV1/archetypeBouwer.js",
          "server/lib/publiekeApi/poorten.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "put": {
        "operationId": "documentformat_voorkeur_bewaren",
        "summary": "documentformat voorkeur bewaren",
        "description": "Bewaar exact laatst gelezen quoted ETag. Ontbreekt428, gewijzigd409; daarnaast CAS op organisatierevisie voorkomt overschrijven van andere instellingen. registryVersieconflict409. null verwijdert voorkeur en herstelt automatisch. Geen Idempotency-Keycontract; na verloren antwoord eerst opnieuw lezen. Geen documentgeneratie of nieuwe providerkosten.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "If-Match",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^\"documentformat-voorkeur:[a-f0-9]{64}\"$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentformatVoorkeur"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"documentformat-voorkeur:[a-f0-9]{64}\"$"
                },
                "description": "Exact dezelfde quoted waarde als etag in de body."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/rapportly_productie_api.js",
          "server/lib/universele-documentarchetypen/index.js",
          "server/lib/universele-documentarchetypen/voorkeuren.js",
          "server/lib/presentatieV1/stijllozePresentatie.js",
          "server/lib/presentatieV1/archetypeBouwer.js",
          "server/lib/publiekeApi/poorten.js"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke string/null-invoer beschreven; historische String-coercie van andere JSONwaarden is geen volledig uitgeschreven clientcontract."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "registryVersie": {
                    "const": "rapportly-archetypen-v1"
                  },
                  "archetypeKey": {
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "raster",
                          "nabij",
                          "werkstaat",
                          "dossier"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": [
                  "registryVersie",
                  "archetypeKey"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/documentarchetypen/selecties/controleren": {
      "post": {
        "operationId": "documentformat_selectie_controleren",
        "summary": "documentformat selectie controleren",
        "description": "Leesactie, geen opslaan/genereren/credits. Expliciet universeel vereist registryVersie en archetypeKey. Automatisch leest eerst de organisatievoorkeur; die wint van stijlsignaal. Zonder voorkeur kiest signaal helder_zakelijk→raster, warm_persoonlijk→nabij, compact_operationeel→werkstaat, formeel_controlegericht→dossier; zonder signaal kiest rapport→raster, gespreksverslag→nabij, offerte→werkstaat. Automatisch negeert meegegeven registryVersie/archetypeKey en bouwt huidige registry. Een niet ingerichte voorkeurstore valt terug naar geen voorkeur; een ingerichte maar onleesbare store geeft503. Ongeldige selectie400. Geen menselijke akkoordclaim.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "formatBron": {
                          "const": "universeel"
                        },
                        "registryVersie": {
                          "const": "rapportly-archetypen-v1"
                        },
                        "archetypeKey": {
                          "type": "string",
                          "enum": [
                            "raster",
                            "nabij",
                            "werkstaat",
                            "dossier"
                          ]
                        },
                        "documenttype": {
                          "type": "string",
                          "enum": [
                            "rapport",
                            "gespreksverslag",
                            "offerte"
                          ]
                        }
                      },
                      "required": [
                        "formatBron",
                        "registryVersie",
                        "archetypeKey",
                        "documenttype"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "formatBron": {
                          "const": "universeel"
                        },
                        "registryVersie": {
                          "const": "rapportly-archetypen-v1"
                        },
                        "archetypeKey": {
                          "type": "string",
                          "enum": [
                            "raster",
                            "nabij",
                            "werkstaat",
                            "dossier"
                          ]
                        },
                        "documenttype": {
                          "type": "string",
                          "enum": [
                            "rapport",
                            "gespreksverslag",
                            "offerte"
                          ]
                        },
                        "selectieModus": {
                          "const": "organisatie"
                        },
                        "selectieReden": {
                          "const": "organisatievoorkeur"
                        }
                      },
                      "required": [
                        "formatBron",
                        "registryVersie",
                        "archetypeKey",
                        "documenttype",
                        "selectieModus",
                        "selectieReden"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "formatBron": {
                          "const": "universeel"
                        },
                        "registryVersie": {
                          "const": "rapportly-archetypen-v1"
                        },
                        "archetypeKey": {
                          "type": "string",
                          "enum": [
                            "raster",
                            "nabij",
                            "werkstaat",
                            "dossier"
                          ]
                        },
                        "documenttype": {
                          "type": "string",
                          "enum": [
                            "rapport",
                            "gespreksverslag",
                            "offerte"
                          ]
                        },
                        "selectieModus": {
                          "const": "automatisch"
                        },
                        "selectieReden": {
                          "type": "string",
                          "enum": [
                            "stijlsignaal",
                            "documenttype"
                          ]
                        }
                      },
                      "required": [
                        "formatBron",
                        "registryVersie",
                        "archetypeKey",
                        "documenttype",
                        "selectieModus",
                        "selectieReden"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Fout"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "details": {
                          "$ref": "#/components/schemas/InstellingenJsonWaarde"
                        }
                      },
                      "required": [
                        "error",
                        "message"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_productie_api.js",
          "server/lib/universele-documentarchetypen/index.js",
          "server/lib/universele-documentarchetypen/voorkeuren.js",
          "server/lib/presentatieV1/stijllozePresentatie.js",
          "server/lib/presentatieV1/archetypeBouwer.js",
          "server/lib/publiekeApi/poorten.js"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke string/null-invoer beschreven; historische String-coercie en tolerantie van overbodige velden niet volledig als invoervarianten beschreven."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "formatBron": {
                        "const": "universeel"
                      },
                      "registryVersie": {
                        "const": "rapportly-archetypen-v1"
                      },
                      "archetypeKey": {
                        "type": "string",
                        "enum": [
                          "raster",
                          "nabij",
                          "werkstaat",
                          "dossier"
                        ]
                      },
                      "documenttype": {
                        "type": "string",
                        "enum": [
                          "rapport",
                          "gespreksverslag",
                          "offerte"
                        ]
                      }
                    },
                    "required": [
                      "formatBron",
                      "registryVersie",
                      "archetypeKey",
                      "documenttype"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "formatBron": {
                        "const": "automatisch"
                      },
                      "registryVersie": {
                        "const": "rapportly-archetypen-v1"
                      },
                      "documenttype": {
                        "type": "string",
                        "enum": [
                          "rapport",
                          "gespreksverslag",
                          "offerte"
                        ]
                      },
                      "stijlsignaal": {
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "helder_zakelijk",
                              "warm_persoonlijk",
                              "compact_operationeel",
                              "formeel_controlegericht"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "required": [
                      "formatBron",
                      "documenttype"
                    ],
                    "additionalProperties": false
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/v1/excel/status": {
      "get": {
        "operationId": "excel_beschikbaarheid",
        "summary": "excel beschikbaarheid",
        "description": "Readiness voor opslag, interne rekenservice, beeldbank en converter. Een false-veld is geen bewijs dat alle andere onderdelen werken; de latere actie controleert opnieuw. Geen providerstart.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "beschikbaar": {
                      "type": "boolean"
                    },
                    "rekenserviceBeschikbaar": {
                      "type": "boolean"
                    },
                    "capaciteiten": {
                      "const": "xlsx_native_veilig_v4"
                    },
                    "limieten": {
                      "type": "object",
                      "properties": {
                        "bestand": {
                          "const": 26214400
                        },
                        "onderdeel": {
                          "const": 33554432
                        },
                        "uitgepakt": {
                          "const": 100663296
                        },
                        "onderdelen": {
                          "const": 1500
                        },
                        "cellen": {
                          "const": 100000
                        },
                        "bladen": {
                          "const": 64
                        },
                        "velden": {
                          "const": 2000
                        },
                        "formules": {
                          "const": 20000
                        }
                      },
                      "required": [
                        "bestand",
                        "onderdeel",
                        "uitgepakt",
                        "onderdelen",
                        "cellen",
                        "bladen",
                        "velden",
                        "formules"
                      ],
                      "additionalProperties": false
                    },
                    "bronvelden": {
                      "const": 300
                    },
                    "beeldbank": {
                      "type": "boolean"
                    },
                    "voorbeeldbeeld": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "beschikbaar",
                    "rekenserviceBeschikbaar",
                    "capaciteiten",
                    "limieten",
                    "bronvelden",
                    "beeldbank",
                    "voorbeeldbeeld"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Excelinvoer, bestand, controle of akkoord is niet bruikbaar. code en eventuele diagnose/onderzoek.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_excel_api.js",
          "server/lib/publiekeApi/excel.js",
          "server/lib/publiekeApi/voorBody.js",
          "server/lib/rapportlyClientVersie.js",
          "server/lib/excelSjablonen/contract.js",
          "server/lib/excelSjablonen/body.js",
          "server/lib/excelSjablonen/store.js",
          "server/lib/excelSjablonen/werkmap.js",
          "server/lib/excelSjablonen/voorbereiden.js",
          "server/lib/excelSjablonen/job.js",
          "server/lib/excelSjablonen/bronnen/router.js",
          "server/migrations/271_rapportly_excel_sjablonen.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/excel": {
      "get": {
        "operationId": "excel_bronnen",
        "summary": "excel bronnen",
        "description": "Maximaal200 eigen zichtbare bronobjecten, nieuwste eerst. Geen cursor of queryfilters in deze handler; actor-/organisatie-/klantrechten blijven gelden. Namen/modus uit lijstprojectie; geen celinhoud.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "bronnen": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ExcelObjectKort"
                      },
                      "maxItems": 200
                    }
                  },
                  "required": [
                    "bronnen"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Excelinvoer, bestand, controle of akkoord is niet bruikbaar. code en eventuele diagnose/onderzoek.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_excel_api.js",
          "server/lib/publiekeApi/excel.js",
          "server/lib/publiekeApi/voorBody.js",
          "server/lib/rapportlyClientVersie.js",
          "server/lib/excelSjablonen/contract.js",
          "server/lib/excelSjablonen/body.js",
          "server/lib/excelSjablonen/store.js",
          "server/lib/excelSjablonen/werkmap.js",
          "server/lib/excelSjablonen/voorbereiden.js",
          "server/lib/excelSjablonen/job.js",
          "server/lib/excelSjablonen/bronnen/router.js",
          "server/migrations/271_rapportly_excel_sjablonen.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "post": {
        "operationId": "excel_uploaden",
        "summary": "excel uploaden",
        "description": "Upload één complete bron, maximaal7tekstvelden van5000bytes; instructie na trim maximaal4000tekens. Naamtrim wordt opgeslagen. Workflowid en huidige actieve versie samen, huidig klantleesrecht vereist. xls wordt geconverteerd; veilige kopie van xlsm/xlsx kan afwijken terwijl origineel privé behouden blijft. Opslagquotum en gedeelde stijlprofiellimiet blijven gelden.201nieuw/200identieke ontvangst, gewijzigde bytes/formaat/modus/naam/opdracht409. Een ondersteunde onderzoeksfout kan bron met ontbrekende analyse opslaan: ontvangst bewijst dan geen invulbaarheid.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "X-Rapportly-Client-Version",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExcelObjectKort"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "201": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExcelObjectKort"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Excelinvoer, bestand, controle of akkoord is niet bruikbaar. code en eventuele diagnose/onderzoek.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "426": {
            "description": "X-Rapportly-Client-Version ontbreekt of ongeldig: client_update_required.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "excel:verwerken"
        ],
        "x-bronnen": [
          "server/rapportly_excel_api.js",
          "server/lib/publiekeApi/excel.js",
          "server/lib/publiekeApi/voorBody.js",
          "server/lib/rapportlyClientVersie.js",
          "server/lib/excelSjablonen/contract.js",
          "server/lib/excelSjablonen/body.js",
          "server/lib/excelSjablonen/store.js",
          "server/lib/excelSjablonen/werkmap.js",
          "server/lib/excelSjablonen/voorbereiden.js",
          "server/lib/excelSjablonen/job.js",
          "server/lib/excelSjablonen/bronnen/router.js",
          "server/migrations/271_rapportly_excel_sjablonen.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "bestand": {
                    "type": "string",
                    "format": "binary",
                    "description": "Eén lokaal bestand met extensie xlsx, xlsm of xls; maximaal25MiB. Extensie bepaalt de native route, interne pakketcontrole blijft vereist."
                  },
                  "naam": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120,
                    "pattern": "\\S"
                  },
                  "modus": {
                    "type": "string",
                    "enum": [
                      "sjabloon",
                      "aanvullen"
                    ]
                  },
                  "klant_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "workflowprofiel_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "workflowprofiel_versie_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "instructie": {
                    "type": "string",
                    "maxLength": 4000
                  },
                  "klant_zelf_uitleggen": {
                    "type": "string",
                    "enum": [
                      "true",
                      "false",
                      ""
                    ]
                  }
                },
                "required": [
                  "bestand",
                  "naam",
                  "modus"
                ],
                "additionalProperties": false,
                "dependentRequired": {
                  "workflowprofiel_id": [
                    "workflowprofiel_versie_id"
                  ],
                  "workflowprofiel_versie_id": [
                    "workflowprofiel_id"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/v1/excel/{id}/bestand": {
      "get": {
        "operationId": "excel_bestand",
        "summary": "excel bestand",
        "description": "Alleen bron/voorbeeld/resultaat, huidige actor-/organisatie-/klantrechten. Bron geeft origineel als dat afzonderlijk bewaard is; anders veilige XLSX. Antwoordbytes worden op opgeslagen SHA gecontroleerd. Geen signed URL. Een controle of invoer heeft hier geen bestand:404.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "application/vnd.ms-excel.sheet.macroEnabled.12": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "application/vnd.ms-excel": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "Content-Disposition": {
                "schema": {
                  "type": "string"
                },
                "description": "attachment; filename=\"rapportly-{soort}.{formaat}\""
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Excelinvoer, bestand, controle of akkoord is niet bruikbaar. code en eventuele diagnose/onderzoek.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_excel_api.js",
          "server/lib/publiekeApi/excel.js",
          "server/lib/publiekeApi/voorBody.js",
          "server/lib/rapportlyClientVersie.js",
          "server/lib/excelSjablonen/contract.js",
          "server/lib/excelSjablonen/body.js",
          "server/lib/excelSjablonen/store.js",
          "server/lib/excelSjablonen/werkmap.js",
          "server/lib/excelSjablonen/voorbereiden.js",
          "server/lib/excelSjablonen/job.js",
          "server/lib/excelSjablonen/bronnen/router.js",
          "server/migrations/271_rapportly_excel_sjablonen.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/excel/{id}/voorbeeldbeeld": {
      "get": {
        "operationId": "excel_voorbeeldbeeld",
        "summary": "excel voorbeeldbeeld",
        "description": "Converteert bron/controlebasis/voorbeeld/resultaat via private converter en rastert één pagina als PNG; bewaart niets. GET kan rekenwerk veroorzaken. Geen invoer/akkoordobject. Ontbrekende converter503, niet rasterbare pagina404/503. paginaAantal wordt op12begrensd en is bij telproblemen informatief1. Volledige PDF wordt niet teruggegeven.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "pagina",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 12,
              "default": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "pagina": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 12
                    },
                    "paginaAantal": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 12
                    },
                    "breedte": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "hoogte": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "png_base64": {
                      "type": "string",
                      "contentEncoding": "base64",
                      "contentMediaType": "image/png"
                    }
                  },
                  "required": [
                    "pagina",
                    "paginaAantal",
                    "breedte",
                    "hoogte",
                    "png_base64"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Excelinvoer, bestand, controle of akkoord is niet bruikbaar. code en eventuele diagnose/onderzoek.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_excel_api.js",
          "server/lib/publiekeApi/excel.js",
          "server/lib/publiekeApi/voorBody.js",
          "server/lib/rapportlyClientVersie.js",
          "server/lib/excelSjablonen/contract.js",
          "server/lib/excelSjablonen/body.js",
          "server/lib/excelSjablonen/store.js",
          "server/lib/excelSjablonen/werkmap.js",
          "server/lib/excelSjablonen/voorbereiden.js",
          "server/lib/excelSjablonen/job.js",
          "server/lib/excelSjablonen/bronnen/router.js",
          "server/migrations/271_rapportly_excel_sjablonen.sql",
          "server/lib/excelSjablonen/voorbeeldbeeld.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/excel/{id}/afbeeldingen": {
      "get": {
        "operationId": "excel_afbeeldingen",
        "summary": "excel afbeeldingen",
        "description": "Alleen bron of controle. Inventaris van de oorspronkelijke bron; controles tonen de bewaarde keuze per oorspronkelijke inhoudssleutel. Geen verborgen nieuwe upload. Ontbrekende/verwijderde beeldbankmetadata geeft nullable velden; afgekapt alleen bij afgekapte inventaris. Private miniaturen en tijdelijke previews niet publiceren.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "bronId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "beeldbank": {
                      "type": "boolean"
                    },
                    "afbeeldingen": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "sleutel": {
                            "type": "string",
                            "pattern": "^[a-f0-9]{64}$"
                          },
                          "origineel": {
                            "type": "object",
                            "properties": {
                              "breedte": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "hoogte": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "miniatuur_png_base64": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "contentEncoding": "base64",
                                    "contentMediaType": "image/png"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "breedte",
                              "hoogte",
                              "miniatuur_png_base64"
                            ],
                            "additionalProperties": false
                          },
                          "huidig": {
                            "oneOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "bron": {
                                    "type": "string",
                                    "enum": [
                                      "origineel",
                                      "verwijderd"
                                    ]
                                  }
                                },
                                "required": [
                                  "bron"
                                ],
                                "additionalProperties": false
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "bron": {
                                    "const": "beeldbank"
                                  },
                                  "beeld_sha256": {
                                    "type": "string",
                                    "pattern": "^[a-f0-9]{64}$"
                                  },
                                  "passing": {
                                    "type": "string",
                                    "enum": [
                                      "passend",
                                      "vullend"
                                    ]
                                  },
                                  "naam": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "preview_url": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "format": "uri"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "breedte": {
                                    "anyOf": [
                                      {
                                        "type": "integer",
                                        "minimum": 0
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "hoogte": {
                                    "anyOf": [
                                      {
                                        "type": "integer",
                                        "minimum": 0
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "bron",
                                  "beeld_sha256",
                                  "passing",
                                  "naam",
                                  "preview_url",
                                  "breedte",
                                  "hoogte"
                                ],
                                "additionalProperties": false
                              }
                            ]
                          },
                          "plaatsingen": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "properties": {
                                "locatie": {
                                  "type": "string",
                                  "enum": [
                                    "kopvoettekst",
                                    "blad"
                                  ]
                                },
                                "blad": {
                                  "type": "string"
                                },
                                "aantal": {
                                  "type": "integer",
                                  "minimum": 0
                                }
                              },
                              "required": [
                                "locatie",
                                "blad",
                                "aantal"
                              ],
                              "additionalProperties": false
                            }
                          }
                        },
                        "required": [
                          "sleutel",
                          "origineel",
                          "huidig",
                          "plaatsingen"
                        ],
                        "additionalProperties": false
                      }
                    },
                    "afgekapt": {
                      "const": true
                    }
                  },
                  "required": [
                    "bronId",
                    "beeldbank",
                    "afbeeldingen"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Excelinvoer, bestand, controle of akkoord is niet bruikbaar. code en eventuele diagnose/onderzoek.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_excel_api.js",
          "server/lib/publiekeApi/excel.js",
          "server/lib/publiekeApi/voorBody.js",
          "server/lib/rapportlyClientVersie.js",
          "server/lib/excelSjablonen/contract.js",
          "server/lib/excelSjablonen/body.js",
          "server/lib/excelSjablonen/store.js",
          "server/lib/excelSjablonen/werkmap.js",
          "server/lib/excelSjablonen/voorbereiden.js",
          "server/lib/excelSjablonen/job.js",
          "server/lib/excelSjablonen/bronnen/router.js",
          "server/migrations/271_rapportly_excel_sjablonen.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/excel/{id}/controle": {
      "post": {
        "operationId": "excel_controle_bewaren",
        "summary": "excel controle bewaren",
        "description": "Alleen bronobject. Volledige celkaart plus akkoord op vaste onderdelen; passieveOnderdelenAkkoord:true vereist zodra analyse passieve onderdelen bevat. Beeldkeuzes worden in controle vastgelegd met inhoudshash. Totale JSONbody16MiB, ongecomprimeerd; vóór bodycontrole al sleutel/recht/pakket/clientversie/idempotentie/object.201nieuw/200zelfde volledige body; andere body met dezelfde sleutel409. Bewaart veilige basis en synthetische voorbeeldinvoer; nog geen menselijke voorbeeldgoedkeuring.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "X-Rapportly-Client-Version",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExcelObjectKort"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "201": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExcelObjectKort"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Excelinvoer, bestand, controle of akkoord is niet bruikbaar. code en eventuele diagnose/onderzoek.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "426": {
            "description": "X-Rapportly-Client-Version ontbreekt of ongeldig: client_update_required.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "excel:verwerken"
        ],
        "x-bronnen": [
          "server/rapportly_excel_api.js",
          "server/lib/publiekeApi/excel.js",
          "server/lib/publiekeApi/voorBody.js",
          "server/lib/rapportlyClientVersie.js",
          "server/lib/excelSjablonen/contract.js",
          "server/lib/excelSjablonen/body.js",
          "server/lib/excelSjablonen/store.js",
          "server/lib/excelSjablonen/werkmap.js",
          "server/lib/excelSjablonen/voorbereiden.js",
          "server/lib/excelSjablonen/job.js",
          "server/lib/excelSjablonen/bronnen/router.js",
          "server/migrations/271_rapportly_excel_sjablonen.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "kaart": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "object",
                      "properties": {
                        "rol": {
                          "type": "string",
                          "enum": [
                            "vast",
                            "invoer",
                            "berekening",
                            "leeg"
                          ]
                        },
                        "type": {
                          "type": "string",
                          "enum": [
                            "tekst",
                            "getal",
                            "percentage",
                            "datum",
                            "ja_nee"
                          ]
                        },
                        "label": {
                          "type": "string",
                          "maxLength": 120
                        },
                        "verplicht": {
                          "type": "boolean"
                        },
                        "betekenis": {
                          "type": "string",
                          "maxLength": 600
                        }
                      },
                      "required": [
                        "rol"
                      ],
                      "additionalProperties": false,
                      "allOf": [
                        {
                          "if": {
                            "properties": {
                              "rol": {
                                "const": "invoer"
                              }
                            }
                          },
                          "then": {
                            "required": [
                              "type",
                              "label",
                              "verplicht"
                            ],
                            "properties": {
                              "label": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 120,
                                "pattern": "\\S"
                              }
                            }
                          }
                        }
                      ]
                    },
                    "propertyNames": {
                      "type": "string",
                      "pattern": "^[1-9][0-9]*:[A-Z]{1,3}[1-9][0-9]*$"
                    },
                    "description": "Exact één keuze per cel-id uit analyse; geen onbekende cel. Formules uitsluitend berekening, andere cellen geen berekening. Invoer/leeg vereisen bewerkbaarheid; minstens1 en maximaal huidige veldenlimiet invoercellen."
                  },
                  "onderdelenAkkoord": {
                    "const": true
                  },
                  "passieveOnderdelenAkkoord": {
                    "type": "boolean"
                  },
                  "afbeeldingen": {
                    "type": "array",
                    "items": {
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "sleutel": {
                              "type": "string",
                              "pattern": "^[a-f0-9]{64}$"
                            },
                            "actie": {
                              "const": "verwijder"
                            }
                          },
                          "required": [
                            "sleutel",
                            "actie"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "sleutel": {
                              "type": "string",
                              "pattern": "^[a-f0-9]{64}$"
                            },
                            "actie": {
                              "const": "vervang"
                            },
                            "beeld_id": {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                            },
                            "passing": {
                              "type": "string",
                              "enum": [
                                "passend",
                                "vullend"
                              ]
                            }
                          },
                          "required": [
                            "sleutel",
                            "actie",
                            "beeld_id",
                            "passing"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "sleutel": {
                              "type": "string",
                              "pattern": "^[a-f0-9]{64}$"
                            },
                            "actie": {
                              "const": "vervang"
                            },
                            "beeld_sha256": {
                              "type": "string",
                              "pattern": "^[a-f0-9]{64}$"
                            },
                            "passing": {
                              "type": "string",
                              "enum": [
                                "passend",
                                "vullend"
                              ]
                            }
                          },
                          "required": [
                            "sleutel",
                            "actie",
                            "beeld_sha256",
                            "passing"
                          ],
                          "additionalProperties": false
                        }
                      ]
                    },
                    "maxItems": 64,
                    "description": "Unieke sleutel per keuze. Vervanging via actuele zichtbare beeldbank-id of eerder bewaarde beeldhash; nooit beide."
                  }
                },
                "required": [
                  "kaart",
                  "onderdelenAkkoord"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/excel/{id}/voorbeeld": {
      "post": {
        "operationId": "excel_voorbeeld_maken",
        "summary": "excel voorbeeld maken",
        "description": "Alleen controleobject. Interne rekenservice maakt het synthetisch ingevulde voorbeeld.201nieuw/200bestaand; server gebruikt vaste sleutel per controle, geen vrije Idempotency-Key. Lees object en download het voorbeeld voor menselijke controle.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "X-Rapportly-Client-Version",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExcelObjectKort"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "201": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExcelObjectKort"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Excelinvoer, bestand, controle of akkoord is niet bruikbaar. code en eventuele diagnose/onderzoek.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "426": {
            "description": "X-Rapportly-Client-Version ontbreekt of ongeldig: client_update_required.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "excel:verwerken"
        ],
        "x-bronnen": [
          "server/rapportly_excel_api.js",
          "server/lib/publiekeApi/excel.js",
          "server/lib/publiekeApi/voorBody.js",
          "server/lib/rapportlyClientVersie.js",
          "server/lib/excelSjablonen/contract.js",
          "server/lib/excelSjablonen/body.js",
          "server/lib/excelSjablonen/store.js",
          "server/lib/excelSjablonen/werkmap.js",
          "server/lib/excelSjablonen/voorbereiden.js",
          "server/lib/excelSjablonen/job.js",
          "server/lib/excelSjablonen/bronnen/router.js",
          "server/migrations/271_rapportly_excel_sjablonen.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LegeBody"
              }
            }
          }
        }
      }
    },
    "/v1/excel/{id}/akkoord": {
      "post": {
        "operationId": "excel_voorbeeld_goedkeuren",
        "summary": "excel voorbeeld goedkeuren",
        "description": "Alleen controleobject. controleHash is inhoudHash van controle; voorbeeldHash is bestandHash van het bijbehorende gemaakte voorbeeld. Database eist dat dit voorbeeld bij deze controle hoort. Geen hash van een andere versie gebruiken. Identiek akkoord geeft opnieuw201; gewijzigd akkoord409. Menselijke controle vereist, geen automatische goedkeuring uit previewontvangst.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "X-Rapportly-Client-Version",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExcelObjectKort"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Excelinvoer, bestand, controle of akkoord is niet bruikbaar. code en eventuele diagnose/onderzoek.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "426": {
            "description": "X-Rapportly-Client-Version ontbreekt of ongeldig: client_update_required.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "excel:verwerken"
        ],
        "x-bronnen": [
          "server/rapportly_excel_api.js",
          "server/lib/publiekeApi/excel.js",
          "server/lib/publiekeApi/voorBody.js",
          "server/lib/rapportlyClientVersie.js",
          "server/lib/excelSjablonen/contract.js",
          "server/lib/excelSjablonen/body.js",
          "server/lib/excelSjablonen/store.js",
          "server/lib/excelSjablonen/werkmap.js",
          "server/lib/excelSjablonen/voorbereiden.js",
          "server/lib/excelSjablonen/job.js",
          "server/lib/excelSjablonen/bronnen/router.js",
          "server/migrations/271_rapportly_excel_sjablonen.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "controleHash": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  },
                  "voorbeeldHash": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  },
                  "gecontroleerd": {
                    "const": true
                  }
                },
                "required": [
                  "controleHash",
                  "voorbeeldHash",
                  "gecontroleerd"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/excel/{id}/invullen": {
      "post": {
        "operationId": "excel_invullen",
        "summary": "excel invullen",
        "description": "Alleen goedgekeurde controle. Bestaande waarden worden getypeerd gevalideerd vóór opslag. Bronvoorstel optioneel, maar alleen klaar en bij dezelfde controle/hash; expliciete voorstellenGecontroleerd:true. Gekozen kandidaat krijgt bronbewijs, afwijking blijft handmatig. JSONbody16MiB onder dezelfde voorpoorten als controle.202ook als resultaat al bestaat. Bewaar id van invoer en volg GET /excel/{id}; resultaatId verschijnt bij bestaande gereeduitkomst. Native invuljob gebruikt geen AI of nieuwe creditboeking; betaalde bronvoorstellen zijn een afzonderlijke start.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "X-Rapportly-Client-Version",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "parentId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "soort": {
                          "type": "string",
                          "enum": [
                            "bron",
                            "controle",
                            "voorbeeld",
                            "akkoord",
                            "invoer",
                            "resultaat"
                          ]
                        },
                        "aangemaaktOp": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "inhoudHash": {
                          "type": "string",
                          "pattern": "^[a-f0-9]{64}$"
                        },
                        "naam": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "modus": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "sjabloon",
                                "aanvullen"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "opdracht": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "schemaVersie": {
                                  "const": 1
                                },
                                "klantId": {
                                  "type": "string",
                                  "format": "uuid",
                                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                },
                                "workflow": {
                                  "type": "object",
                                  "properties": {
                                    "profielId": {
                                      "type": "string",
                                      "format": "uuid",
                                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                    },
                                    "versieId": {
                                      "type": "string",
                                      "format": "uuid",
                                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                    }
                                  },
                                  "required": [
                                    "profielId",
                                    "versieId"
                                  ],
                                  "additionalProperties": false
                                },
                                "instructie": {
                                  "type": "string",
                                  "maxLength": 4000
                                },
                                "klantZelfUitleggen": {
                                  "const": true
                                }
                              },
                              "required": [
                                "schemaVersie"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "status": {
                          "type": "string"
                        },
                        "resultaatId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        }
                      },
                      "required": [
                        "id",
                        "parentId",
                        "soort",
                        "aangemaaktOp",
                        "inhoudHash",
                        "opdracht",
                        "status",
                        "resultaatId"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "parentId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "soort": {
                          "type": "string",
                          "enum": [
                            "bron",
                            "controle",
                            "voorbeeld",
                            "akkoord",
                            "invoer",
                            "resultaat"
                          ]
                        },
                        "aangemaaktOp": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "inhoudHash": {
                          "type": "string",
                          "pattern": "^[a-f0-9]{64}$"
                        },
                        "naam": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "modus": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "sjabloon",
                                "aanvullen"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "opdracht": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "schemaVersie": {
                                  "const": 1
                                },
                                "klantId": {
                                  "type": "string",
                                  "format": "uuid",
                                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                },
                                "workflow": {
                                  "type": "object",
                                  "properties": {
                                    "profielId": {
                                      "type": "string",
                                      "format": "uuid",
                                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                    },
                                    "versieId": {
                                      "type": "string",
                                      "format": "uuid",
                                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                    }
                                  },
                                  "required": [
                                    "profielId",
                                    "versieId"
                                  ],
                                  "additionalProperties": false
                                },
                                "instructie": {
                                  "type": "string",
                                  "maxLength": 4000
                                },
                                "klantZelfUitleggen": {
                                  "const": true
                                }
                              },
                              "required": [
                                "schemaVersie"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "status": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "id",
                        "parentId",
                        "soort",
                        "aangemaaktOp",
                        "inhoudHash",
                        "opdracht",
                        "status"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Excelinvoer, bestand, controle of akkoord is niet bruikbaar. code en eventuele diagnose/onderzoek.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "426": {
            "description": "X-Rapportly-Client-Version ontbreekt of ongeldig: client_update_required.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "excel:verwerken"
        ],
        "x-bronnen": [
          "server/rapportly_excel_api.js",
          "server/lib/publiekeApi/excel.js",
          "server/lib/publiekeApi/voorBody.js",
          "server/lib/rapportlyClientVersie.js",
          "server/lib/excelSjablonen/contract.js",
          "server/lib/excelSjablonen/body.js",
          "server/lib/excelSjablonen/store.js",
          "server/lib/excelSjablonen/werkmap.js",
          "server/lib/excelSjablonen/voorbereiden.js",
          "server/lib/excelSjablonen/job.js",
          "server/lib/excelSjablonen/bronnen/router.js",
          "server/migrations/271_rapportly_excel_sjablonen.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "waarden": {
                        "type": "object",
                        "additionalProperties": {
                          "type": "object",
                          "properties": {
                            "waarde": {
                              "oneOf": [
                                {
                                  "type": "null"
                                },
                                {
                                  "type": "boolean"
                                },
                                {
                                  "type": "number",
                                  "exclusiveMinimum": -1000000000000000,
                                  "exclusiveMaximum": 1000000000000000
                                },
                                {
                                  "type": "string",
                                  "maxLength": 32767,
                                  "pattern": "^[^\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]*$"
                                }
                              ]
                            },
                            "bron": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 300
                            }
                          },
                          "required": [
                            "waarde",
                            "bron"
                          ],
                          "additionalProperties": false
                        },
                        "description": "Exact alle invoercellen uit de controlekaart. Type, verplicht en native celvalidatie blijven gelden: datum YYYY-MM-DD is echte kalenderdatum binnen Excelepoch; percentage is een numerieke fractie. null alleen bij optioneel veld, verplichte tekst niet leeg. Noem per waarde de bron."
                      }
                    },
                    "required": [
                      "waarden"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "waarden": {
                        "type": "object",
                        "additionalProperties": {
                          "type": "object",
                          "properties": {
                            "waarde": {
                              "oneOf": [
                                {
                                  "type": "null"
                                },
                                {
                                  "type": "boolean"
                                },
                                {
                                  "type": "number",
                                  "exclusiveMinimum": -1000000000000000,
                                  "exclusiveMaximum": 1000000000000000
                                },
                                {
                                  "type": "string",
                                  "maxLength": 32767,
                                  "pattern": "^[^\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]*$"
                                }
                              ]
                            },
                            "bron": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 300
                            }
                          },
                          "required": [
                            "waarde",
                            "bron"
                          ],
                          "additionalProperties": false
                        },
                        "description": "Exact alle invoercellen uit de controlekaart. Type, verplicht en native celvalidatie blijven gelden: datum YYYY-MM-DD is echte kalenderdatum binnen Excelepoch; percentage is een numerieke fractie. null alleen bij optioneel veld, verplichte tekst niet leeg. Noem per waarde de bron."
                      },
                      "voorstelId": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      "voorstellenGecontroleerd": {
                        "const": true
                      }
                    },
                    "required": [
                      "waarden",
                      "voorstelId",
                      "voorstellenGecontroleerd"
                    ],
                    "additionalProperties": false
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/v1/excel/{id}/hervatten": {
      "post": {
        "operationId": "excel_invullen_hervatten",
        "summary": "excel invullen hervatten",
        "description": "Alleen bestaande onveranderlijke invoer. Bestaand resultaat→gereed+resultaatId; actieve job wordt hergebruikt. Pas na terminale dead/cancelled/succeeded-job kan een nieuwe herstelgeneratie komen, maximaal3pogingen per job. Geen nieuwe AI of creditboeking. Geen vrije Idempotency-Key; huidige toegang blijft vereist.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "X-Rapportly-Client-Version",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "parentId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "soort": {
                          "type": "string",
                          "enum": [
                            "bron",
                            "controle",
                            "voorbeeld",
                            "akkoord",
                            "invoer",
                            "resultaat"
                          ]
                        },
                        "aangemaaktOp": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "inhoudHash": {
                          "type": "string",
                          "pattern": "^[a-f0-9]{64}$"
                        },
                        "naam": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "modus": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "sjabloon",
                                "aanvullen"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "opdracht": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "schemaVersie": {
                                  "const": 1
                                },
                                "klantId": {
                                  "type": "string",
                                  "format": "uuid",
                                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                },
                                "workflow": {
                                  "type": "object",
                                  "properties": {
                                    "profielId": {
                                      "type": "string",
                                      "format": "uuid",
                                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                    },
                                    "versieId": {
                                      "type": "string",
                                      "format": "uuid",
                                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                    }
                                  },
                                  "required": [
                                    "profielId",
                                    "versieId"
                                  ],
                                  "additionalProperties": false
                                },
                                "instructie": {
                                  "type": "string",
                                  "maxLength": 4000
                                },
                                "klantZelfUitleggen": {
                                  "const": true
                                }
                              },
                              "required": [
                                "schemaVersie"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "status": {
                          "type": "string"
                        },
                        "resultaatId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        }
                      },
                      "required": [
                        "id",
                        "parentId",
                        "soort",
                        "aangemaaktOp",
                        "inhoudHash",
                        "opdracht",
                        "status",
                        "resultaatId"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "parentId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "soort": {
                          "type": "string",
                          "enum": [
                            "bron",
                            "controle",
                            "voorbeeld",
                            "akkoord",
                            "invoer",
                            "resultaat"
                          ]
                        },
                        "aangemaaktOp": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "inhoudHash": {
                          "type": "string",
                          "pattern": "^[a-f0-9]{64}$"
                        },
                        "naam": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "modus": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "sjabloon",
                                "aanvullen"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "opdracht": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "schemaVersie": {
                                  "const": 1
                                },
                                "klantId": {
                                  "type": "string",
                                  "format": "uuid",
                                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                },
                                "workflow": {
                                  "type": "object",
                                  "properties": {
                                    "profielId": {
                                      "type": "string",
                                      "format": "uuid",
                                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                    },
                                    "versieId": {
                                      "type": "string",
                                      "format": "uuid",
                                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                    }
                                  },
                                  "required": [
                                    "profielId",
                                    "versieId"
                                  ],
                                  "additionalProperties": false
                                },
                                "instructie": {
                                  "type": "string",
                                  "maxLength": 4000
                                },
                                "klantZelfUitleggen": {
                                  "const": true
                                }
                              },
                              "required": [
                                "schemaVersie"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "status": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "id",
                        "parentId",
                        "soort",
                        "aangemaaktOp",
                        "inhoudHash",
                        "opdracht",
                        "status"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Excelinvoer, bestand, controle of akkoord is niet bruikbaar. code en eventuele diagnose/onderzoek.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "426": {
            "description": "X-Rapportly-Client-Version ontbreekt of ongeldig: client_update_required.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "excel:verwerken"
        ],
        "x-bronnen": [
          "server/rapportly_excel_api.js",
          "server/lib/publiekeApi/excel.js",
          "server/lib/publiekeApi/voorBody.js",
          "server/lib/rapportlyClientVersie.js",
          "server/lib/excelSjablonen/contract.js",
          "server/lib/excelSjablonen/body.js",
          "server/lib/excelSjablonen/store.js",
          "server/lib/excelSjablonen/werkmap.js",
          "server/lib/excelSjablonen/voorbereiden.js",
          "server/lib/excelSjablonen/job.js",
          "server/lib/excelSjablonen/bronnen/router.js",
          "server/migrations/271_rapportly_excel_sjablonen.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LegeBody"
              }
            }
          }
        }
      }
    },
    "/v1/excel/{id}/verwijderen": {
      "post": {
        "operationId": "excel_bron_verwijderen",
        "summary": "excel bron verwijderen",
        "description": "Alleen bronobject. bronHash is de huidige inhoudHash van de bron, niet bestandHash. Verwijdert bron en afgeleide controles/invoer/resultaten via cascade. Een oude worker kan daarna geen resultaat publiceren. Opnieuw verwijderen kan404geven; geen aparte idempotentieontvangst. Geen algemene vrijstelling na verlopen proefperiode.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "X-Rapportly-Client-Version",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "verwijderd": {
                      "const": true
                    }
                  },
                  "required": [
                    "verwijderd"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Excelinvoer, bestand, controle of akkoord is niet bruikbaar. code en eventuele diagnose/onderzoek.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "426": {
            "description": "X-Rapportly-Client-Version ontbreekt of ongeldig: client_update_required.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "documenten:verwijderen"
        ],
        "x-bronnen": [
          "server/rapportly_excel_api.js",
          "server/lib/publiekeApi/excel.js",
          "server/lib/publiekeApi/voorBody.js",
          "server/lib/rapportlyClientVersie.js",
          "server/lib/excelSjablonen/contract.js",
          "server/lib/excelSjablonen/body.js",
          "server/lib/excelSjablonen/store.js",
          "server/lib/excelSjablonen/werkmap.js",
          "server/lib/excelSjablonen/voorbereiden.js",
          "server/lib/excelSjablonen/job.js",
          "server/lib/excelSjablonen/bronnen/router.js",
          "server/migrations/271_rapportly_excel_sjablonen.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "bevestigd": {
                    "const": true
                  },
                  "bronHash": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  }
                },
                "required": [
                  "bevestigd",
                  "bronHash"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/v1/excel/bronvoorstellen/status": {
      "get": {
        "operationId": "excel_bronvoorstellen_beschikbaarheid",
        "summary": "excel bronvoorstellen beschikbaarheid",
        "description": "Na algemene Excelreadiness en API-poorten: controleert bronextractieprivacy, provider/runtimevrijgave, pakket, actor en creditmodus. Domeinpoort niet beschikbaar geeft200beschikbaar:false plus code; eerdere API-/Excelpoorten kunnen503/403geven. Deze read reserveert geen credits en start geen verwerking.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "beschikbaar": {
                          "const": true
                        }
                      },
                      "required": [
                        "beschikbaar"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "beschikbaar": {
                          "const": false
                        },
                        "code": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "beschikbaar",
                        "code"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Excelinvoer, bestand, controle of akkoord is niet bruikbaar. code en eventuele diagnose/onderzoek.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/excelSjablonen/bronnen/router.js",
          "server/lib/excelSjablonen/bronnen/store.js",
          "server/lib/excelSjablonen/bronnen/privacy.js",
          "server/lib/excelSjablonen/bronnen/voorstellen.js",
          "server/lib/excelSjablonen/bronnen/document.js",
          "server/lib/excelSjablonen/bronnen/job.js",
          "server/lib/publiekeApi/excel.js",
          "server/lib/rapportlyClientVersie.js",
          "server/migrations/276_rapportly_excel_bronvoorstellen.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/excel/bronvoorstellen/opnames": {
      "get": {
        "operationId": "excel_bronopnames",
        "summary": "excel bronopnames",
        "description": "Maximaal100 eigen zichtbare, niet verwijderde klaaropnames met niet-lege transcriptie, nieuwste eerst. Alleen metadata; inhoud wordt pas serverzijde uit gekozen opname geladen. Bronextractiepoort vereist. Opnameopslag uit geeft lege lijst.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "opnames": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "titel": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "created_at": {
                            "type": "string",
                            "format": "date-time"
                          }
                        },
                        "required": [
                          "id",
                          "titel",
                          "created_at"
                        ],
                        "additionalProperties": false
                      },
                      "maxItems": 100
                    }
                  },
                  "required": [
                    "opnames"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Excelinvoer, bestand, controle of akkoord is niet bruikbaar. code en eventuele diagnose/onderzoek.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/excelSjablonen/bronnen/router.js",
          "server/lib/excelSjablonen/bronnen/store.js",
          "server/lib/excelSjablonen/bronnen/privacy.js",
          "server/lib/excelSjablonen/bronnen/voorstellen.js",
          "server/lib/excelSjablonen/bronnen/document.js",
          "server/lib/excelSjablonen/bronnen/job.js",
          "server/lib/publiekeApi/excel.js",
          "server/lib/rapportlyClientVersie.js",
          "server/migrations/276_rapportly_excel_bronvoorstellen.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/excel/{id}/bronvoorstellen": {
      "get": {
        "operationId": "excel_bronvoorstellen_lijst",
        "summary": "excel bronvoorstellen lijst",
        "description": "Huidig zichtbaar controleobject vereist. Maximaal100 eigen voorstellen, nieuwste eerst. Bronvoorstelstore niet gereed geeft lege lijst; overige leesfouten503. Geen modeloproep, geen cursor.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "voorstellen": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ExcelBronvoorstelKort"
                      },
                      "maxItems": 100
                    }
                  },
                  "required": [
                    "voorstellen"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Excelinvoer, bestand, controle of akkoord is niet bruikbaar. code en eventuele diagnose/onderzoek.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/excelSjablonen/bronnen/router.js",
          "server/lib/excelSjablonen/bronnen/store.js",
          "server/lib/excelSjablonen/bronnen/privacy.js",
          "server/lib/excelSjablonen/bronnen/voorstellen.js",
          "server/lib/excelSjablonen/bronnen/document.js",
          "server/lib/excelSjablonen/bronnen/job.js",
          "server/lib/publiekeApi/excel.js",
          "server/lib/rapportlyClientVersie.js",
          "server/migrations/276_rapportly_excel_bronvoorstellen.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      },
      "post": {
        "operationId": "excel_bronvoorstel_voorbereiden",
        "summary": "excel bronvoorstel voorbereiden",
        "description": "Voorbereiden bij een zichtbaar controleobject met bestaand menselijk akkoord. Maximaal300invoervelden. Privacy-/credittoegang vóór body, nog geen betaalde modelstart. Lees gekozen bestanden volledig lokaal; PDF maximaal100pagina’s en elke pagina tekst, geen OCR. TXT/MDgeldigeUTF8; DOCX veilige zip. Opnamen opnieuw op huidige zichtbaarheid/transcript gecontroleerd. Bronnen en providerparameters worden onveranderlijk bewaard.201nieuw/200identieke aanvraag; andere controle, bronvolgorde, bytes, namen, tekst of label met zelfde sleutel409. Voorstel-id bewaren vóór expliciete start.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "X-Rapportly-Client-Version",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExcelBronvoorstelKort"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "201": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExcelBronvoorstelKort"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Excelinvoer, bestand, controle of akkoord is niet bruikbaar. code en eventuele diagnose/onderzoek.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "426": {
            "description": "X-Rapportly-Client-Version ontbreekt of ongeldig: client_update_required.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "excel:verwerken"
        ],
        "x-bronnen": [
          "server/lib/excelSjablonen/bronnen/router.js",
          "server/lib/excelSjablonen/bronnen/store.js",
          "server/lib/excelSjablonen/bronnen/privacy.js",
          "server/lib/excelSjablonen/bronnen/voorstellen.js",
          "server/lib/excelSjablonen/bronnen/document.js",
          "server/lib/excelSjablonen/bronnen/job.js",
          "server/lib/publiekeApi/excel.js",
          "server/lib/rapportlyClientVersie.js",
          "server/migrations/276_rapportly_excel_bronvoorstellen.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "opnameIds": {
                    "type": "string",
                    "contentMediaType": "application/json",
                    "contentSchema": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      "maxItems": 10,
                      "uniqueItems": true
                    },
                    "description": "JSONtekst van maximaal10unieke opnameUUIDs; weglaten betekent[]."
                  },
                  "tekst": {
                    "type": "string",
                    "maxLength": 120000
                  },
                  "tekstLabel": {
                    "type": "string",
                    "maxLength": 160
                  },
                  "bestanden": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "binary",
                      "description": "PDF/DOCX/TXT/MD, niet leeg, maximaal25MiB per bestand en bestandsnaam1–160tekens."
                    },
                    "maxItems": 5
                  }
                },
                "required": [],
                "additionalProperties": false,
                "description": "Samen1–10bronnen: elke opname, elk bestand en eventuele niet-lege tekst telt één. Niet-lege tekst vereist niet-lege getrimde tekstLabel. Alle geëxtraheerde pagina’s samen maximaal120000tekens; geen NUL. Maximaal3tekstvelden/8multipartdelen, veldbuffer500000bytes."
              }
            }
          }
        }
      }
    },
    "/v1/excel/bronvoorstellen/{voorstelId}": {
      "get": {
        "operationId": "excel_bronvoorstel_lezen",
        "summary": "excel bronvoorstel lezen",
        "description": "Eigen actor/organisatie; inhouds-/antwoordhashen en actuele toegang tot opgeslagen opnamebronnen worden opnieuw gecontroleerd. Geeft bronfragmenten terug: niet in logs of webhooks opnemen. Alleen statusklaar bevat voorstellen, voorstellenHash en definitieve credits; daarvoor null. Statusantwoord kan nog afrekening vereisen. Jobvoortgang en domeinstatus zijn afzonderlijk. Modelresultaat blijft voorstel; controleer gevonden/conflict/ontbreekt/ongeldig en bewijs, wijzig waar nodig vóór afzonderlijk invullen. Geen providerherhaling door lezen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "voorstelId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "controleId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "concept",
                        "bezig",
                        "antwoord",
                        "klaar",
                        "mislukt"
                      ]
                    },
                    "aangemaaktOp": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "controleHash": {
                      "type": "string",
                      "pattern": "^[a-f0-9]{64}$"
                    },
                    "bronnen": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ExcelVoorstelBron"
                      },
                      "minItems": 1,
                      "maxItems": 10
                    },
                    "voorstellen": {
                      "anyOf": [
                        {
                          "$ref": "#/components/schemas/ExcelVeldvoorstellen"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "voorstellenHash": {
                      "anyOf": [
                        {
                          "type": "string",
                          "pattern": "^[a-f0-9]{64}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "credits": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "foutCode": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "voortgang": {
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "status": {
                              "type": "string"
                            },
                            "fase": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "voorstellen",
                                    "afrekenen"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": [
                            "status",
                            "fase"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "id",
                    "controleId",
                    "status",
                    "aangemaaktOp",
                    "controleHash",
                    "bronnen",
                    "voorstellen",
                    "voorstellenHash",
                    "credits",
                    "foutCode",
                    "voortgang"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Excelinvoer, bestand, controle of akkoord is niet bruikbaar. code en eventuele diagnose/onderzoek.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/excelSjablonen/bronnen/router.js",
          "server/lib/excelSjablonen/bronnen/store.js",
          "server/lib/excelSjablonen/bronnen/privacy.js",
          "server/lib/excelSjablonen/bronnen/voorstellen.js",
          "server/lib/excelSjablonen/bronnen/document.js",
          "server/lib/excelSjablonen/bronnen/job.js",
          "server/lib/publiekeApi/excel.js",
          "server/lib/rapportlyClientVersie.js",
          "server/migrations/276_rapportly_excel_bronvoorstellen.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/excel/bronvoorstellen/{voorstelId}/start": {
      "post": {
        "operationId": "excel_bronvoorstel_starten",
        "summary": "excel bronvoorstel starten",
        "description": "Expliciet betaalde bronextractiestart; actuele privacy-, pakket-, sleutelbudget- en actorpoorten gelden. Klaar geeft200, actieve job202zonder nieuweenqueue. Mislukt domeinvoorstel wordt geweigerd422. Een nieuwe job gebruikt de bestaande onveranderlijke bronnen, koppelt APIherkomst aan eigen voorstel en controleert huidig Excelobject. Na terminale job alleen native herstelgeneratie met dezelfde voorstel-id, geen vrije Idempotency-Key. De worker gebruikt bestaande persoonlijke kostencredits of eenmalig gratis starttegoed volgens native poort; geen tweede API-creditafrekening.202is ontvangst, niet een geslaagd modelresultaat; volg GET en keur waarden menselijk goed. Een reeds als bezig opgeslagen maar niet bewezen provideruitkomst wordt bij herstel definitief mislukt met excel_bronuitkomst_onzeker, zonder tweede providercall. Statusantwoord hervat alleen de afrekening van het opgeslagen antwoord. Een geldig antwoord met bewezen interne dekking kan0klantcredits krijgen; providerkosten en klantcredits blijven afzonderlijk.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "X-Rapportly-Client-Version",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
            }
          },
          {
            "name": "voorstelId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExcelBronvoorstelKort"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExcelBronvoorstelKort"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Excelinvoer, bestand, controle of akkoord is niet bruikbaar. code en eventuele diagnose/onderzoek.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "426": {
            "description": "X-Rapportly-Client-Version ontbreekt of ongeldig: client_update_required.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "excel:verwerken"
        ],
        "x-bronnen": [
          "server/lib/excelSjablonen/bronnen/router.js",
          "server/lib/excelSjablonen/bronnen/store.js",
          "server/lib/excelSjablonen/bronnen/privacy.js",
          "server/lib/excelSjablonen/bronnen/voorstellen.js",
          "server/lib/excelSjablonen/bronnen/document.js",
          "server/lib/excelSjablonen/bronnen/job.js",
          "server/lib/publiekeApi/excel.js",
          "server/lib/rapportlyClientVersie.js",
          "server/migrations/276_rapportly_excel_bronvoorstellen.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bevestiging"
              }
            }
          }
        }
      }
    },
    "/v1/excel/{id}": {
      "get": {
        "operationId": "excel_object_lezen",
        "summary": "excel object lezen",
        "description": "Eén zichtbaar onveranderlijk object met soortafhankelijk inhoudsmodel en maximaal200directe kinderen, nieuwste eerst. Bestand/basis/previewInvoer/origineel-opslagreferenties worden weggehaald; bestandHash verschijnt alleen als het object een bestand heeft. inhoudHash is de objectinhoudhash en verschilt van bestandHash. Compacte opslag wordt eerst begrensd ontvouwd; geen gecomprimeerde blob buiten de opslaglaag. Bron kan een toegepast, nog vrijgegeven onderzoeksvoorstel als analyse gebruiken zolang de bronhash gelijk blijft. Bij onleesbaar/ontbrekend onderzoeksrecept valt native terug op oorspronkelijke bronanalyse. Alleen invoer bevat mogelijk actuele jobvoortgang; andere soorten geven null. Geen signed URL, gebruik aparte bestandsroute voor bron/voorbeeld/resultaat.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "parentId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "soort": {
                          "const": "bron"
                        },
                        "aangemaaktOp": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "inhoudHash": {
                          "type": "string",
                          "pattern": "^[a-f0-9]{64}$"
                        },
                        "naam": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "modus": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "sjabloon",
                                "aanvullen"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "opdracht": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "schemaVersie": {
                                  "const": 1
                                },
                                "klantId": {
                                  "type": "string",
                                  "format": "uuid",
                                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                },
                                "workflow": {
                                  "type": "object",
                                  "properties": {
                                    "profielId": {
                                      "type": "string",
                                      "format": "uuid",
                                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                    },
                                    "versieId": {
                                      "type": "string",
                                      "format": "uuid",
                                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                    }
                                  },
                                  "required": [
                                    "profielId",
                                    "versieId"
                                  ],
                                  "additionalProperties": false
                                },
                                "instructie": {
                                  "type": "string",
                                  "maxLength": 4000
                                },
                                "klantZelfUitleggen": {
                                  "const": true
                                }
                              },
                              "required": [
                                "schemaVersie"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "inhoud": {
                          "type": "object",
                          "properties": {
                            "naam": {
                              "type": "string"
                            },
                            "modus": {
                              "type": "string",
                              "enum": [
                                "sjabloon",
                                "aanvullen"
                              ]
                            },
                            "bestandsformaat": {
                              "type": "string",
                              "enum": [
                                "xlsx",
                                "xlsm",
                                "xls"
                              ]
                            },
                            "analyse": {
                              "anyOf": [
                                {
                                  "$ref": "#/components/schemas/ExcelOpenbareAnalyse"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "opdracht": {
                              "type": "object",
                              "properties": {
                                "schemaVersie": {
                                  "const": 1
                                },
                                "klantId": {
                                  "type": "string",
                                  "format": "uuid",
                                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                },
                                "workflow": {
                                  "type": "object",
                                  "properties": {
                                    "profielId": {
                                      "type": "string",
                                      "format": "uuid",
                                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                    },
                                    "versieId": {
                                      "type": "string",
                                      "format": "uuid",
                                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                    }
                                  },
                                  "required": [
                                    "profielId",
                                    "versieId"
                                  ],
                                  "additionalProperties": false
                                },
                                "instructie": {
                                  "type": "string",
                                  "maxLength": 4000
                                },
                                "klantZelfUitleggen": {
                                  "const": true
                                }
                              },
                              "required": [
                                "schemaVersie"
                              ],
                              "additionalProperties": false
                            },
                            "onderzoek": {
                              "type": "object",
                              "properties": {
                                "code": {
                                  "type": "string"
                                },
                                "diagnose": {
                                  "anyOf": [
                                    {
                                      "$ref": "#/components/schemas/ExcelDiagnose"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              },
                              "required": [
                                "code",
                                "diagnose"
                              ],
                              "additionalProperties": false
                            },
                            "bestandHash": {
                              "type": "string",
                              "pattern": "^[a-f0-9]{64}$"
                            }
                          },
                          "required": [
                            "naam",
                            "modus",
                            "analyse",
                            "bestandHash"
                          ],
                          "additionalProperties": false
                        },
                        "versies": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/ExcelObjectKort"
                          },
                          "maxItems": 200
                        },
                        "voortgang": {
                          "type": "null"
                        }
                      },
                      "required": [
                        "id",
                        "parentId",
                        "soort",
                        "aangemaaktOp",
                        "inhoudHash",
                        "opdracht",
                        "inhoud",
                        "versies",
                        "voortgang"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "parentId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "soort": {
                          "const": "controle"
                        },
                        "aangemaaktOp": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "inhoudHash": {
                          "type": "string",
                          "pattern": "^[a-f0-9]{64}$"
                        },
                        "naam": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "modus": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "sjabloon",
                                "aanvullen"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "opdracht": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "schemaVersie": {
                                  "const": 1
                                },
                                "klantId": {
                                  "type": "string",
                                  "format": "uuid",
                                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                },
                                "workflow": {
                                  "type": "object",
                                  "properties": {
                                    "profielId": {
                                      "type": "string",
                                      "format": "uuid",
                                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                    },
                                    "versieId": {
                                      "type": "string",
                                      "format": "uuid",
                                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                    }
                                  },
                                  "required": [
                                    "profielId",
                                    "versieId"
                                  ],
                                  "additionalProperties": false
                                },
                                "instructie": {
                                  "type": "string",
                                  "maxLength": 4000
                                },
                                "klantZelfUitleggen": {
                                  "const": true
                                }
                              },
                              "required": [
                                "schemaVersie"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "inhoud": {
                          "type": "object",
                          "properties": {
                            "verzoekHash": {
                              "type": "string",
                              "pattern": "^[a-f0-9]{64}$"
                            },
                            "kaart": {
                              "type": "object",
                              "additionalProperties": {
                                "type": "object",
                                "properties": {
                                  "rol": {
                                    "type": "string",
                                    "enum": [
                                      "vast",
                                      "invoer",
                                      "berekening",
                                      "leeg"
                                    ]
                                  },
                                  "type": {
                                    "type": "string",
                                    "enum": [
                                      "tekst",
                                      "getal",
                                      "percentage",
                                      "datum",
                                      "ja_nee"
                                    ]
                                  },
                                  "label": {
                                    "type": "string",
                                    "maxLength": 120
                                  },
                                  "verplicht": {
                                    "type": "boolean"
                                  },
                                  "betekenis": {
                                    "type": "string",
                                    "maxLength": 600
                                  }
                                },
                                "required": [
                                  "rol"
                                ],
                                "additionalProperties": false,
                                "allOf": [
                                  {
                                    "if": {
                                      "properties": {
                                        "rol": {
                                          "const": "invoer"
                                        }
                                      }
                                    },
                                    "then": {
                                      "required": [
                                        "type",
                                        "label",
                                        "verplicht"
                                      ],
                                      "properties": {
                                        "label": {
                                          "type": "string",
                                          "minLength": 1,
                                          "maxLength": 120,
                                          "pattern": "\\S"
                                        }
                                      }
                                    }
                                  }
                                ]
                              },
                              "propertyNames": {
                                "type": "string",
                                "pattern": "^[1-9][0-9]*:[A-Z]{1,3}[1-9][0-9]*$"
                              },
                              "description": "Exact één keuze per cel-id uit analyse; geen onbekende cel. Formules uitsluitend berekening, andere cellen geen berekening. Invoer/leeg vereisen bewerkbaarheid; minstens1 en maximaal huidige veldenlimiet invoercellen."
                            },
                            "analyse": {
                              "$ref": "#/components/schemas/ExcelOpenbareAnalyse"
                            },
                            "voorbeeldWaarden": {
                              "type": "object",
                              "additionalProperties": {
                                "type": "object",
                                "properties": {
                                  "waarde": {
                                    "oneOf": [
                                      {
                                        "type": "null"
                                      },
                                      {
                                        "type": "boolean"
                                      },
                                      {
                                        "type": "number",
                                        "exclusiveMinimum": -1000000000000000,
                                        "exclusiveMaximum": 1000000000000000
                                      },
                                      {
                                        "type": "string",
                                        "maxLength": 32767,
                                        "pattern": "^[^\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]*$"
                                      }
                                    ]
                                  },
                                  "bron": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 300
                                  }
                                },
                                "required": [
                                  "waarde",
                                  "bron"
                                ],
                                "additionalProperties": false
                              },
                              "description": "Exact alle invoercellen uit de controlekaart. Type, verplicht en native celvalidatie blijven gelden: datum YYYY-MM-DD is echte kalenderdatum binnen Excelepoch; percentage is een numerieke fractie. null alleen bij optioneel veld, verplichte tekst niet leeg. Noem per waarde de bron."
                            },
                            "modus": {
                              "type": "string",
                              "enum": [
                                "sjabloon",
                                "aanvullen"
                              ]
                            },
                            "afbeeldingen": {
                              "type": "array",
                              "items": {
                                "oneOf": [
                                  {
                                    "type": "object",
                                    "properties": {
                                      "sleutel": {
                                        "type": "string",
                                        "pattern": "^[a-f0-9]{64}$"
                                      },
                                      "actie": {
                                        "const": "verwijder"
                                      }
                                    },
                                    "required": [
                                      "sleutel",
                                      "actie"
                                    ],
                                    "additionalProperties": false
                                  },
                                  {
                                    "type": "object",
                                    "properties": {
                                      "sleutel": {
                                        "type": "string",
                                        "pattern": "^[a-f0-9]{64}$"
                                      },
                                      "actie": {
                                        "const": "vervang"
                                      },
                                      "beeld_sha256": {
                                        "type": "string",
                                        "pattern": "^[a-f0-9]{64}$"
                                      },
                                      "passing": {
                                        "type": "string",
                                        "enum": [
                                          "passend",
                                          "vullend"
                                        ]
                                      }
                                    },
                                    "required": [
                                      "sleutel",
                                      "actie",
                                      "beeld_sha256",
                                      "passing"
                                    ],
                                    "additionalProperties": false
                                  }
                                ]
                              },
                              "maxItems": 64
                            }
                          },
                          "required": [
                            "verzoekHash",
                            "kaart",
                            "analyse",
                            "voorbeeldWaarden",
                            "modus"
                          ],
                          "additionalProperties": false
                        },
                        "versies": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/ExcelObjectKort"
                          },
                          "maxItems": 200
                        },
                        "voortgang": {
                          "type": "null"
                        }
                      },
                      "required": [
                        "id",
                        "parentId",
                        "soort",
                        "aangemaaktOp",
                        "inhoudHash",
                        "opdracht",
                        "inhoud",
                        "versies",
                        "voortgang"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "parentId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "soort": {
                          "const": "voorbeeld"
                        },
                        "aangemaaktOp": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "inhoudHash": {
                          "type": "string",
                          "pattern": "^[a-f0-9]{64}$"
                        },
                        "naam": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "modus": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "sjabloon",
                                "aanvullen"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "opdracht": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "schemaVersie": {
                                  "const": 1
                                },
                                "klantId": {
                                  "type": "string",
                                  "format": "uuid",
                                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                },
                                "workflow": {
                                  "type": "object",
                                  "properties": {
                                    "profielId": {
                                      "type": "string",
                                      "format": "uuid",
                                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                    },
                                    "versieId": {
                                      "type": "string",
                                      "format": "uuid",
                                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                    }
                                  },
                                  "required": [
                                    "profielId",
                                    "versieId"
                                  ],
                                  "additionalProperties": false
                                },
                                "instructie": {
                                  "type": "string",
                                  "maxLength": 4000
                                },
                                "klantZelfUitleggen": {
                                  "const": true
                                }
                              },
                              "required": [
                                "schemaVersie"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "inhoud": {
                          "type": "object",
                          "properties": {
                            "analyse": {
                              "$ref": "#/components/schemas/ExcelOpenbareAnalyse"
                            },
                            "bestandHash": {
                              "type": "string",
                              "pattern": "^[a-f0-9]{64}$"
                            }
                          },
                          "required": [
                            "analyse",
                            "bestandHash"
                          ],
                          "additionalProperties": false
                        },
                        "versies": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/ExcelObjectKort"
                          },
                          "maxItems": 200
                        },
                        "voortgang": {
                          "type": "null"
                        }
                      },
                      "required": [
                        "id",
                        "parentId",
                        "soort",
                        "aangemaaktOp",
                        "inhoudHash",
                        "opdracht",
                        "inhoud",
                        "versies",
                        "voortgang"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "parentId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "soort": {
                          "const": "akkoord"
                        },
                        "aangemaaktOp": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "inhoudHash": {
                          "type": "string",
                          "pattern": "^[a-f0-9]{64}$"
                        },
                        "naam": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "modus": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "sjabloon",
                                "aanvullen"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "opdracht": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "schemaVersie": {
                                  "const": 1
                                },
                                "klantId": {
                                  "type": "string",
                                  "format": "uuid",
                                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                },
                                "workflow": {
                                  "type": "object",
                                  "properties": {
                                    "profielId": {
                                      "type": "string",
                                      "format": "uuid",
                                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                    },
                                    "versieId": {
                                      "type": "string",
                                      "format": "uuid",
                                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                    }
                                  },
                                  "required": [
                                    "profielId",
                                    "versieId"
                                  ],
                                  "additionalProperties": false
                                },
                                "instructie": {
                                  "type": "string",
                                  "maxLength": 4000
                                },
                                "klantZelfUitleggen": {
                                  "const": true
                                }
                              },
                              "required": [
                                "schemaVersie"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "inhoud": {
                          "type": "object",
                          "properties": {
                            "controleHash": {
                              "type": "string",
                              "pattern": "^[a-f0-9]{64}$"
                            },
                            "voorbeeldHash": {
                              "type": "string",
                              "pattern": "^[a-f0-9]{64}$"
                            }
                          },
                          "required": [
                            "controleHash",
                            "voorbeeldHash"
                          ],
                          "additionalProperties": false
                        },
                        "versies": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/ExcelObjectKort"
                          },
                          "maxItems": 200
                        },
                        "voortgang": {
                          "type": "null"
                        }
                      },
                      "required": [
                        "id",
                        "parentId",
                        "soort",
                        "aangemaaktOp",
                        "inhoudHash",
                        "opdracht",
                        "inhoud",
                        "versies",
                        "voortgang"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "parentId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "soort": {
                          "const": "invoer"
                        },
                        "aangemaaktOp": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "inhoudHash": {
                          "type": "string",
                          "pattern": "^[a-f0-9]{64}$"
                        },
                        "naam": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "modus": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "sjabloon",
                                "aanvullen"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "opdracht": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "schemaVersie": {
                                  "const": 1
                                },
                                "klantId": {
                                  "type": "string",
                                  "format": "uuid",
                                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                },
                                "workflow": {
                                  "type": "object",
                                  "properties": {
                                    "profielId": {
                                      "type": "string",
                                      "format": "uuid",
                                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                    },
                                    "versieId": {
                                      "type": "string",
                                      "format": "uuid",
                                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                    }
                                  },
                                  "required": [
                                    "profielId",
                                    "versieId"
                                  ],
                                  "additionalProperties": false
                                },
                                "instructie": {
                                  "type": "string",
                                  "maxLength": 4000
                                },
                                "klantZelfUitleggen": {
                                  "const": true
                                }
                              },
                              "required": [
                                "schemaVersie"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "inhoud": {
                          "oneOf": [
                            {
                              "type": "object",
                              "properties": {
                                "waarden": {
                                  "type": "object",
                                  "additionalProperties": {
                                    "type": "object",
                                    "properties": {
                                      "waarde": {
                                        "oneOf": [
                                          {
                                            "type": "null"
                                          },
                                          {
                                            "type": "boolean"
                                          },
                                          {
                                            "type": "number",
                                            "exclusiveMinimum": -1000000000000000,
                                            "exclusiveMaximum": 1000000000000000
                                          },
                                          {
                                            "type": "string",
                                            "maxLength": 32767,
                                            "pattern": "^[^\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]*$"
                                          }
                                        ]
                                      },
                                      "bron": {
                                        "type": "string",
                                        "minLength": 1,
                                        "maxLength": 300
                                      }
                                    },
                                    "required": [
                                      "waarde",
                                      "bron"
                                    ],
                                    "additionalProperties": false
                                  },
                                  "description": "Exact alle invoercellen uit de controlekaart. Type, verplicht en native celvalidatie blijven gelden: datum YYYY-MM-DD is echte kalenderdatum binnen Excelepoch; percentage is een numerieke fractie. null alleen bij optioneel veld, verplichte tekst niet leeg. Noem per waarde de bron."
                                }
                              },
                              "required": [
                                "waarden"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "object",
                              "properties": {
                                "waarden": {
                                  "type": "object",
                                  "additionalProperties": {
                                    "type": "object",
                                    "properties": {
                                      "waarde": {
                                        "oneOf": [
                                          {
                                            "type": "null"
                                          },
                                          {
                                            "type": "boolean"
                                          },
                                          {
                                            "type": "number",
                                            "exclusiveMinimum": -1000000000000000,
                                            "exclusiveMaximum": 1000000000000000
                                          },
                                          {
                                            "type": "string",
                                            "maxLength": 32767,
                                            "pattern": "^[^\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]*$"
                                          }
                                        ]
                                      },
                                      "bron": {
                                        "type": "string",
                                        "minLength": 1,
                                        "maxLength": 300
                                      }
                                    },
                                    "required": [
                                      "waarde",
                                      "bron"
                                    ],
                                    "additionalProperties": false
                                  },
                                  "description": "Exact alle invoercellen uit de controlekaart. Type, verplicht en native celvalidatie blijven gelden: datum YYYY-MM-DD is echte kalenderdatum binnen Excelepoch; percentage is een numerieke fractie. null alleen bij optioneel veld, verplichte tekst niet leeg. Noem per waarde de bron."
                                },
                                "voorstelId": {
                                  "type": "string",
                                  "format": "uuid",
                                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                },
                                "voorstelHash": {
                                  "type": "string",
                                  "pattern": "^[a-f0-9]{64}$"
                                },
                                "bronBewijzen": {
                                  "type": "object",
                                  "additionalProperties": {
                                    "type": "object",
                                    "properties": {
                                      "handmatigGewijzigd": {
                                        "type": "boolean"
                                      },
                                      "bewijzen": {
                                        "type": "array",
                                        "items": {
                                          "$ref": "#/components/schemas/ExcelBronbewijs"
                                        },
                                        "maxItems": 3
                                      }
                                    },
                                    "required": [
                                      "handmatigGewijzigd",
                                      "bewijzen"
                                    ],
                                    "additionalProperties": false
                                  }
                                },
                                "voorstellenGecontroleerd": {
                                  "const": true
                                }
                              },
                              "required": [
                                "waarden",
                                "voorstelId",
                                "voorstelHash",
                                "bronBewijzen",
                                "voorstellenGecontroleerd"
                              ],
                              "additionalProperties": false
                            }
                          ]
                        },
                        "versies": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/ExcelObjectKort"
                          },
                          "maxItems": 200
                        },
                        "voortgang": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "status": {
                                  "type": "string"
                                },
                                "poging": {
                                  "type": "integer",
                                  "minimum": 0
                                },
                                "fase": {
                                  "anyOf": [
                                    {
                                      "type": "string",
                                      "enum": [
                                        "invullen",
                                        "berekenen",
                                        "bewaren"
                                      ]
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              },
                              "required": [
                                "status",
                                "poging",
                                "fase"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "id",
                        "parentId",
                        "soort",
                        "aangemaaktOp",
                        "inhoudHash",
                        "opdracht",
                        "inhoud",
                        "versies",
                        "voortgang"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "parentId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "soort": {
                          "const": "resultaat"
                        },
                        "aangemaaktOp": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "inhoudHash": {
                          "type": "string",
                          "pattern": "^[a-f0-9]{64}$"
                        },
                        "naam": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "modus": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "sjabloon",
                                "aanvullen"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "opdracht": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "schemaVersie": {
                                  "const": 1
                                },
                                "klantId": {
                                  "type": "string",
                                  "format": "uuid",
                                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                },
                                "workflow": {
                                  "type": "object",
                                  "properties": {
                                    "profielId": {
                                      "type": "string",
                                      "format": "uuid",
                                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                    },
                                    "versieId": {
                                      "type": "string",
                                      "format": "uuid",
                                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                                    }
                                  },
                                  "required": [
                                    "profielId",
                                    "versieId"
                                  ],
                                  "additionalProperties": false
                                },
                                "instructie": {
                                  "type": "string",
                                  "maxLength": 4000
                                },
                                "klantZelfUitleggen": {
                                  "const": true
                                }
                              },
                              "required": [
                                "schemaVersie"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "inhoud": {
                          "type": "object",
                          "properties": {
                            "engine": {
                              "const": "xlsx_native_v1"
                            },
                            "capaciteiten": {
                              "type": "string",
                              "enum": [
                                "xlsx_native_v1",
                                "xlsx_native_passief_v2",
                                "xlsx_native_ruim_v3",
                                "xlsx_native_veilig_v4"
                              ]
                            },
                            "controleHash": {
                              "type": "string",
                              "pattern": "^[a-f0-9]{64}$"
                            },
                            "invoerHash": {
                              "type": "string",
                              "pattern": "^[a-f0-9]{64}$"
                            },
                            "bestandHash": {
                              "type": "string",
                              "pattern": "^[a-f0-9]{64}$"
                            }
                          },
                          "required": [
                            "engine",
                            "controleHash",
                            "invoerHash",
                            "bestandHash"
                          ],
                          "additionalProperties": false
                        },
                        "versies": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/ExcelObjectKort"
                          },
                          "maxItems": 200
                        },
                        "voortgang": {
                          "type": "null"
                        }
                      },
                      "required": [
                        "id",
                        "parentId",
                        "soort",
                        "aangemaaktOp",
                        "inhoudHash",
                        "opdracht",
                        "inhoud",
                        "versies",
                        "voortgang"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Excelinvoer, bestand, controle of akkoord is niet bruikbaar. code en eventuele diagnose/onderzoek.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_excel_api.js",
          "server/lib/publiekeApi/excel.js",
          "server/lib/publiekeApi/voorBody.js",
          "server/lib/rapportlyClientVersie.js",
          "server/lib/excelSjablonen/contract.js",
          "server/lib/excelSjablonen/body.js",
          "server/lib/excelSjablonen/store.js",
          "server/lib/excelSjablonen/werkmap.js",
          "server/lib/excelSjablonen/voorbereiden.js",
          "server/lib/excelSjablonen/job.js",
          "server/lib/excelSjablonen/bronnen/router.js",
          "server/migrations/271_rapportly_excel_sjablonen.sql",
          "server/lib/excelSjablonen/passief.js",
          "server/lib/excelSjablonen/pakket.js",
          "server/lib/excelSjablonen/isolate.js",
          "server/lib/excelSjablonen/opslagCodec.js",
          "server/lib/excelSjablonen/diagnose.js",
          "server/lib/stijlOnderzoek/excel.js",
          "server/package-lock.json",
          "server/lib/excelSjablonen/bronnen/voorstellen.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    },
    "/v1/excel/{excelId}/onderzoek/{meldingId}/voorstel": {
      "post": {
        "operationId": "excelonderzoek_voorstel",
        "summary": "excelonderzoek voorstel",
        "description": "Vraagt een voorstel bij bestaande eigen onderzoeksmelding en zichtbaar bronobject. Alleen een vrijgegeven en bewezen recept mag de bron opnieuw analyseren; geen willekeurige modelprompt.200voor nieuw of bestaand voorstel/toegepast resultaat. Server-CAS op voorbereiden; maximaal12mutaties/minuut. Analysebronhash moet exact bij huidige bytes passen. Voorstel bewaart nog geen akkoord/toepassing. Klantcredits0 voor dit herstelonderzoek; gewone betaalde bronextractie is een ander contract.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "excelId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "meldingId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "engine": {
                      "const": "xlsx_native_veilig_v4"
                    },
                    "bronSha256": {
                      "type": "string",
                      "pattern": "^[a-f0-9]{64}$"
                    },
                    "analyse": {
                      "$ref": "#/components/schemas/ExcelOpenbareAnalyse"
                    },
                    "klantCredits": {
                      "const": 0
                    }
                  },
                  "required": [
                    "engine",
                    "bronSha256",
                    "analyse",
                    "klantCredits"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "excel:verwerken"
        ],
        "x-bronnen": [
          "server/rapportly_excel_api.js",
          "server/lib/publiekeApi/excel.js",
          "server/lib/publiekeApi/voorBody.js",
          "server/lib/rapportlyClientVersie.js",
          "server/lib/excelSjablonen/contract.js",
          "server/lib/excelSjablonen/body.js",
          "server/lib/excelSjablonen/store.js",
          "server/lib/excelSjablonen/werkmap.js",
          "server/lib/excelSjablonen/voorbereiden.js",
          "server/lib/excelSjablonen/job.js",
          "server/lib/excelSjablonen/bronnen/router.js",
          "server/migrations/271_rapportly_excel_sjablonen.sql",
          "server/lib/excelSjablonen/passief.js",
          "server/lib/excelSjablonen/pakket.js",
          "server/lib/excelSjablonen/isolate.js",
          "server/lib/excelSjablonen/opslagCodec.js",
          "server/lib/excelSjablonen/diagnose.js",
          "server/lib/stijlOnderzoek/excel.js",
          "server/package-lock.json",
          "server/lib/stijlOnderzoek/routes.js",
          "server/lib/stijlOnderzoek/repository.js",
          "server/lib/stijlOnderzoek/contract.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LegeBody"
              }
            }
          }
        }
      }
    },
    "/v1/workflowruns/{runId}": {
      "get": {
        "operationId": "workflowrun_status",
        "summary": "workflowrun status",
        "description": "Lees huidige run en gebonden hoofd-/opmaakjob. klaar betekent canonieke uitvoer volgens runpoort; vraag een geauthenticeerde download apart aan. herstel_nodig vereist bewuste beoordeling. Ontbrekende of niet bij eigen actor/key passende run404. Afzonderlijke workflowvrijgave en volledige-APIvrijgave vereist, anders503. Alleen huidige eigen organisatie/actor en oorspronkelijke API-sleutel; actuele sleutelactivatie/pauze/verval/rechtenplafond en dossier-/klant-/bronrechten. Private,no-store. Bezet native rijslot geeft409 workflowrun_bezig; expliciete herhaling gebruikt hetzelfde exacte verzoek en dezelfde opdrachtcode. Een ontvangst is geen bewijs van provideruitvoering of canonieke publicatie.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "runId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkflowRun"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Domein-ID of gevalideerde bron-/productie-invoer ongeldig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/uitvoer/workflowRunnerContract.js",
          "server/lib/uitvoer/workflowRunnerRoutes.js",
          "server/lib/uitvoer/workflowRunnerService.js",
          "server/lib/uitvoer/workflowRunnerStore.js",
          "server/lib/uitvoer/workflowRunnerProducent.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/lib/publiekeApi/workflowRunner.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/migrations/371_rapportly_workflow_uitvoering.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "cd6dcaf4"
      }
    },
    "/v1/uitvoeringen/{id}/productieruns": {
      "post": {
        "operationId": "workflowrun_start",
        "summary": "workflowrun start",
        "description": "Maak een ontvangst voor exact de gecontroleerde immutable uitvoeringversie en actuele bronmanifesthash. Gebruik basis uit de productiecontext. Eén run per uitvoeringversie; nieuwe Idempotency-Key maakt daarvoor geen tweede betaalde run. Canonieke bron is een rapport; expliciete doelen rapport/presentatie/offerte volgen hun eigen vastgelegde productiekeuze. Deze stap geeft200 en wacht_op_bevestiging, geen automatische providerstart. bevestigd:true bevestigt uitsluitend deze API-aanvraag. Inhoudelijke review moet een bevoegde ingelogde mens via de native sessieroute doen; geen v1/bevestigen-route. Daarna pas uitvoeren. Hoofdjob en rapportidentiteit worden serverbepaald. Native modelkeuze/creditreservering/settlement blijven leidend; geen vast starttarief. Afzonderlijke workflowvrijgave en volledige-APIvrijgave vereist, anders503. Alleen huidige eigen organisatie/actor en oorspronkelijke API-sleutel; actuele sleutelactivatie/pauze/verval/rechtenplafond en dossier-/klant-/bronrechten. Private,no-store. Bezet native rijslot geeft409 workflowrun_bezig; expliciete herhaling gebruikt hetzelfde exacte verzoek en dezelfde opdrachtcode. Een ontvangst is geen bewijs van provideruitvoering of canonieke publicatie.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkflowRunOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "Idempotency-Replayed": {
                "schema": {
                  "const": "true"
                },
                "description": "Alleen bij herhaald:true. Geen actuele voortgangsgarantie van de historische ontvangst."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Domein-ID of gevalideerde bron-/productie-invoer ongeldig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "workflows:beheren",
          "resultaten:lezen",
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/uitvoer/workflowRunnerContract.js",
          "server/lib/uitvoer/workflowRunnerRoutes.js",
          "server/lib/uitvoer/workflowRunnerService.js",
          "server/lib/uitvoer/workflowRunnerStore.js",
          "server/lib/uitvoer/workflowRunnerProducent.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/lib/publiekeApi/workflowRunner.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/migrations/371_rapportly_workflow_uitvoering.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "bevestigd": {
                    "const": true
                  },
                  "basis": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  }
                },
                "required": [
                  "bevestigd",
                  "basis"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "x-bronref": "cd6dcaf4"
      }
    },
    "/v1/workflowruns/{runId}/uitvoeren": {
      "post": {
        "operationId": "workflowrun_uitvoeren",
        "summary": "workflowrun uitvoeren",
        "description": "Body gebruikt verse versie en basis uit dezelfde run-GET; geen If-Match-header. Idempotency-Key is door de volledige middlewareketen16–128 veilige tekens. Exacte herhaling behoudt ontvangst, gewijzigde body met dezelfde code409. Vereist menselijke bevestiging en actuele reviewbasis. Start dezelfde native producer met serverafgeleide aanvraagidentiteit. Antwoordverlies wordt tegen bestaande rapport/jobbinding herlezen. start_hervatten_mogelijk staat uitsluitend een bewuste adoptie toe na verlopen startclaim zonder job; dezelfde run en aanvraagidentiteit blijven bestaan. offerte_afmaken_mogelijk staat alleen metadata-afronding van de bestaande native offerteclaim/snapshot toe, zonder nieuwe nummerclaim of provider. Geen vrije actor/model/provider/prijskeuze. Afzonderlijke workflowvrijgave en volledige-APIvrijgave vereist, anders503. Alleen huidige eigen organisatie/actor en oorspronkelijke API-sleutel; actuele sleutelactivatie/pauze/verval/rechtenplafond en dossier-/klant-/bronrechten. Private,no-store. Bezet native rijslot geeft409 workflowrun_bezig; expliciete herhaling gebruikt hetzelfde exacte verzoek en dezelfde opdrachtcode. Een ontvangst is geen bewijs van provideruitvoering of canonieke publicatie.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "runId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkflowRunOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "Idempotency-Replayed": {
                "schema": {
                  "const": "true"
                },
                "description": "Alleen bij herhaald:true. Geen actuele voortgangsgarantie van de historische ontvangst."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Domein-ID of gevalideerde bron-/productie-invoer ongeldig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "workflows:beheren",
          "resultaten:lezen",
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/uitvoer/workflowRunnerContract.js",
          "server/lib/uitvoer/workflowRunnerRoutes.js",
          "server/lib/uitvoer/workflowRunnerService.js",
          "server/lib/uitvoer/workflowRunnerStore.js",
          "server/lib/uitvoer/workflowRunnerProducent.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/lib/publiekeApi/workflowRunner.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/migrations/371_rapportly_workflow_uitvoering.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkflowRunMutatie"
              }
            }
          }
        },
        "x-bronref": "cd6dcaf4"
      }
    },
    "/v1/workflowruns/{runId}/pauzeren": {
      "post": {
        "operationId": "workflowrun_pauzeren",
        "summary": "workflowrun pauzeren",
        "description": "Body gebruikt verse versie en basis uit dezelfde run-GET; geen If-Match-header. Idempotency-Key is door de volledige middlewareketen16–128 veilige tekens. Exacte herhaling behoudt ontvangst, gewijzigde body met dezelfde code409. Alleen vanuit gereed/starten/verwerken. Parkeert queued/failed hoofd- en opmaakjob. Actieve provider kan nog kosten maken; vervolgprovider/publicatie stopt bij de volgende poort. Bewezen resultaat/checkpoint blijft bewaard. Na verlopen proefperiode blijft deze stopactie toegestaan; overige actuele rechten blijven gelden. Afzonderlijke workflowvrijgave en volledige-APIvrijgave vereist, anders503. Alleen huidige eigen organisatie/actor en oorspronkelijke API-sleutel; actuele sleutelactivatie/pauze/verval/rechtenplafond en dossier-/klant-/bronrechten. Private,no-store. Bezet native rijslot geeft409 workflowrun_bezig; expliciete herhaling gebruikt hetzelfde exacte verzoek en dezelfde opdrachtcode. Een ontvangst is geen bewijs van provideruitvoering of canonieke publicatie.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "runId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkflowRunOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "Idempotency-Replayed": {
                "schema": {
                  "const": "true"
                },
                "description": "Alleen bij herhaald:true. Geen actuele voortgangsgarantie van de historische ontvangst."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Domein-ID of gevalideerde bron-/productie-invoer ongeldig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "workflows:beheren",
          "resultaten:lezen",
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/uitvoer/workflowRunnerContract.js",
          "server/lib/uitvoer/workflowRunnerRoutes.js",
          "server/lib/uitvoer/workflowRunnerService.js",
          "server/lib/uitvoer/workflowRunnerStore.js",
          "server/lib/uitvoer/workflowRunnerProducent.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/lib/publiekeApi/workflowRunner.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/migrations/371_rapportly_workflow_uitvoering.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkflowRunMutatie"
              }
            }
          }
        },
        "x-bronref": "cd6dcaf4"
      }
    },
    "/v1/workflowruns/{runId}/hervatten": {
      "post": {
        "operationId": "workflowrun_hervatten",
        "summary": "workflowrun hervatten",
        "description": "Body gebruikt verse versie en basis uit dezelfde run-GET; geen If-Match-header. Idempotency-Key is door de volledige middlewareketen16–128 veilige tekens. Exacte herhaling behoudt ontvangst, gewijzigde body met dezelfde code409. Alleen vanuit gepauzeerd na bevestiging door dezelfde actor. Hercontroleert actuele uitvoeringversie en bronnen. Zonder job terug naar gereed; anders dezelfde hoofd-/opmaakjob en behouden pogingteller. Alleen bewezen veilige stopfout is hervatbaar. Onbekende provideruitkomst of dead-job vereist herstel/reconciliatie en start geen automatische betaalde retry. Geldige lopende proefperiode of betaald vervolg vereist. Afzonderlijke workflowvrijgave en volledige-APIvrijgave vereist, anders503. Alleen huidige eigen organisatie/actor en oorspronkelijke API-sleutel; actuele sleutelactivatie/pauze/verval/rechtenplafond en dossier-/klant-/bronrechten. Private,no-store. Bezet native rijslot geeft409 workflowrun_bezig; expliciete herhaling gebruikt hetzelfde exacte verzoek en dezelfde opdrachtcode. Een ontvangst is geen bewijs van provideruitvoering of canonieke publicatie.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "runId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkflowRunOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "Idempotency-Replayed": {
                "schema": {
                  "const": "true"
                },
                "description": "Alleen bij herhaald:true. Geen actuele voortgangsgarantie van de historische ontvangst."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Domein-ID of gevalideerde bron-/productie-invoer ongeldig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "workflows:beheren",
          "resultaten:lezen",
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/uitvoer/workflowRunnerContract.js",
          "server/lib/uitvoer/workflowRunnerRoutes.js",
          "server/lib/uitvoer/workflowRunnerService.js",
          "server/lib/uitvoer/workflowRunnerStore.js",
          "server/lib/uitvoer/workflowRunnerProducent.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/lib/publiekeApi/workflowRunner.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/migrations/371_rapportly_workflow_uitvoering.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkflowRunMutatie"
              }
            }
          }
        },
        "x-bronref": "cd6dcaf4"
      }
    },
    "/v1/workflowruns/{runId}/herstellen": {
      "post": {
        "operationId": "workflowrun_herstellen",
        "summary": "workflowrun herstellen",
        "description": "Body gebruikt verse versie en basis uit dezelfde run-GET; geen If-Match-header. Idempotency-Key is door de volledige middlewareketen16–128 veilige tekens. Exacte herhaling behoudt ontvangst, gewijzigde body met dezelfde code409. Alleen herstel_nodig met oorspronkelijke menselijke bevestiging en extra documenten:wijzigen in recht én plafond. Vereist eigen mislukte/geparkeerde hoofdjob, bewaarde input, oorspronkelijke gecontroleerde inhoudrevisie1, juiste requestbinding en geen actieve opmaakjob. Bewuste extra poging op dezelfde native job, teller minder dan25, geen reset. herstel_zonder_provider weigert iedere externe poging vóór reservering; ontbrekende/gewijzigde cache geeft fout. Geen garantie dat onbekende provideruitvoer hersteld kan worden. Geldige lopende proefperiode of betaald vervolg vereist. Afzonderlijke workflowvrijgave en volledige-APIvrijgave vereist, anders503. Alleen huidige eigen organisatie/actor en oorspronkelijke API-sleutel; actuele sleutelactivatie/pauze/verval/rechtenplafond en dossier-/klant-/bronrechten. Private,no-store. Bezet native rijslot geeft409 workflowrun_bezig; expliciete herhaling gebruikt hetzelfde exacte verzoek en dezelfde opdrachtcode. Een ontvangst is geen bewijs van provideruitvoering of canonieke publicatie.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "runId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkflowRunOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "Idempotency-Replayed": {
                "schema": {
                  "const": "true"
                },
                "description": "Alleen bij herhaald:true. Geen actuele voortgangsgarantie van de historische ontvangst."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Domein-ID of gevalideerde bron-/productie-invoer ongeldig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "workflows:beheren",
          "resultaten:lezen",
          "verwerkingen:starten",
          "documenten:wijzigen"
        ],
        "x-bronnen": [
          "server/lib/uitvoer/workflowRunnerContract.js",
          "server/lib/uitvoer/workflowRunnerRoutes.js",
          "server/lib/uitvoer/workflowRunnerService.js",
          "server/lib/uitvoer/workflowRunnerStore.js",
          "server/lib/uitvoer/workflowRunnerProducent.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/lib/publiekeApi/workflowRunner.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/migrations/371_rapportly_workflow_uitvoering.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkflowRunMutatie"
              }
            }
          }
        },
        "x-bronref": "cd6dcaf4"
      }
    },
    "/v1/workflowruns/{runId}/annuleren": {
      "post": {
        "operationId": "workflowrun_annuleren",
        "summary": "workflowrun annuleren",
        "description": "Body gebruikt verse versie en basis uit dezelfde run-GET; geen If-Match-header. Idempotency-Key is door de volledige middlewareketen16–128 veilige tekens. Exacte herhaling behoudt ontvangst, gewijzigde body met dezelfde code409. Alleen zolang niet klaar/geannuleerd. Definitief voor deze run; parkeert verdere nieuwe starts. Lopende providerkosten worden nog verantwoord, historische inhoud en kosten blijven auditbaar. Geen verzonnen terugbetaling. Na verlopen proefperiode blijft annuleren toegestaan; overige actuele rechten blijven gelden. Afzonderlijke workflowvrijgave en volledige-APIvrijgave vereist, anders503. Alleen huidige eigen organisatie/actor en oorspronkelijke API-sleutel; actuele sleutelactivatie/pauze/verval/rechtenplafond en dossier-/klant-/bronrechten. Private,no-store. Bezet native rijslot geeft409 workflowrun_bezig; expliciete herhaling gebruikt hetzelfde exacte verzoek en dezelfde opdrachtcode. Een ontvangst is geen bewijs van provideruitvoering of canonieke publicatie.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "runId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkflowRunOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "Idempotency-Replayed": {
                "schema": {
                  "const": "true"
                },
                "description": "Alleen bij herhaald:true. Geen actuele voortgangsgarantie van de historische ontvangst."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Domein-ID of gevalideerde bron-/productie-invoer ongeldig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "workflows:beheren",
          "resultaten:lezen",
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/uitvoer/workflowRunnerContract.js",
          "server/lib/uitvoer/workflowRunnerRoutes.js",
          "server/lib/uitvoer/workflowRunnerService.js",
          "server/lib/uitvoer/workflowRunnerStore.js",
          "server/lib/uitvoer/workflowRunnerProducent.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/lib/publiekeApi/workflowRunner.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/migrations/371_rapportly_workflow_uitvoering.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkflowRunMutatie"
              }
            }
          }
        },
        "x-bronref": "cd6dcaf4"
      }
    },
    "/v1/workflowruns/{runId}/download/{formaat}": {
      "get": {
        "operationId": "workflowrun_download",
        "summary": "workflowrun download",
        "description": "Alleen canoniek klaar en exact gebonden rapportversie. URL60seconden geldig; apart zonder API-sleutel downloaden. Huidige rechten en runbinding worden na signing opnieuw gelezen. PDF/Word volgen de actuele native revisiepointer. PPTX vereist presentatie, originele onveranderlijke pad-/bytehash en geen latere366-revisie; een latere tekstbewerking geeft niet automatisch nieuwe PowerPoint. Geen conceptdownload als canoniek resultaat. Afzonderlijke workflowvrijgave en volledige-APIvrijgave vereist, anders503. Alleen huidige eigen organisatie/actor en oorspronkelijke API-sleutel; actuele sleutelactivatie/pauze/verval/rechtenplafond en dossier-/klant-/bronrechten. Private,no-store. Bezet native rijslot geeft409 workflowrun_bezig; expliciete herhaling gebruikt hetzelfde exacte verzoek en dezelfde opdrachtcode. Een ontvangst is geen bewijs van provideruitvoering of canonieke publicatie.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "runId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "formaat",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "pdf",
                "docx",
                "pptx"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "rapport_versie_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "formaat": {
                      "type": "string",
                      "enum": [
                        "pdf",
                        "docx",
                        "pptx"
                      ]
                    },
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "geldig_seconden": {
                      "const": 60
                    }
                  },
                  "required": [
                    "rapport_versie_id",
                    "formaat",
                    "url",
                    "geldig_seconden"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Domein-ID of gevalideerde bron-/productie-invoer ongeldig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/uitvoer/workflowRunnerContract.js",
          "server/lib/uitvoer/workflowRunnerRoutes.js",
          "server/lib/uitvoer/workflowRunnerService.js",
          "server/lib/uitvoer/workflowRunnerStore.js",
          "server/lib/uitvoer/workflowRunnerProducent.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/lib/publiekeApi/workflowRunner.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/migrations/371_rapportly_workflow_uitvoering.sql",
          "server/lib/uitvoer/workflowRunnerDownload.js",
          "server/lib/uitvoer/rapportOpslag.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "cd6dcaf4"
      }
    },
    "/v1/uitvoeringen/{id}/offerte-regelbewijzen": {
      "post": {
        "operationId": "workflowrun_offerte_regelbewijs",
        "summary": "workflowrun offerte regelbewijs",
        "description": "Importeer bestaande native product-/routebevestigingen met huidige uitvoering-ETag. JSON.stringify(body) maximaal200000tekens; maximaal100 bewijsimports per uitvoering en uitsluitend vóór een productierun bestaat. Native schema2 normaliseert/geeft volledige berekening; geen nieuwe routeberekening, providerstart, creditsboeking of offertenummerclaim. Minstens één bevestigde catalogus-/routeregel; handmatige regels mogen erbij. Kortlevende token wordt alleen bij eerste import geopend. Exacte retry met dezelfde body/If-Match/Idempotency-Key geeft dezelfde receipt ook na tokenverval, mits huidige actor/key/catalogusrechten nog geldig zijn; gewijzigde body/ETag409. Eerste import van verlopen token weigert. Bewijs bindt oorspronkelijke actor/key, uitvoering, versie/hash en concept. Concept kan niet aan een andere uitvoering worden overgedragen. Catalogus, gepubliceerde workflow, actieve routevertrekpunt-/prijsversies worden opnieuw gecontroleerd. Tokens komen niet terug of als herbruikbaar token in opslag; bewaar/log geen ruwe tokenbody. Gebruik receipt-ID daarna in productiekeuze.offerte_regelbewijs_id, wederzijds exclusief met offerte_invoer; dezelfde native229/238-nummer-/snapshotketen blijft leidend. Recht offertes:regelbewijzen is expliciet, niet standaard toegekend en geen betaalde runallowlist. Actuele recht/plafond geldt opnieuw vóór provider/publicatie. Afzonderlijke workflowvrijgave en volledige-APIvrijgave vereist, anders503. Alleen huidige eigen organisatie/actor en oorspronkelijke API-sleutel; actuele sleutelactivatie/pauze/verval/rechtenplafond en dossier-/klant-/bronrechten. Private,no-store. Bezet native rijslot geeft409 workflowrun_bezig; expliciete herhaling gebruikt hetzelfde exacte verzoek en dezelfde opdrachtcode. Een ontvangst is geen bewijs van provideruitvoering of canonieke publicatie.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "If-Match",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkflowOfferteBewijsOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "Idempotency-Replayed": {
                "schema": {
                  "const": "true"
                },
                "description": "Alleen bij herhaald:true. Geen actuele voortgangsgarantie van de historische ontvangst."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Domein-ID of gevalideerde bron-/productie-invoer ongeldig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "offertes:regelbewijzen",
          "resultaten:lezen",
          "workflows:beheren",
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/uitvoer/workflowRunnerContract.js",
          "server/lib/uitvoer/workflowRunnerRoutes.js",
          "server/lib/uitvoer/workflowRunnerService.js",
          "server/lib/uitvoer/workflowRunnerStore.js",
          "server/lib/uitvoer/workflowRunnerProducent.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/lib/publiekeApi/workflowRunner.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/migrations/371_rapportly_workflow_uitvoering.sql",
          "server/lib/uitvoer/workflowOfferteBewijzen.js",
          "server/lib/uitvoer/workflowOfferteReceipt.js",
          "server/lib/uitvoer/workflowOfferteInvoer.js",
          "server/lib/uitvoer/workflowProductiekeuze.js",
          "server/lib/rapportlyOfferteInvoer.js",
          "server/lib/offerteRoute.js",
          "server/lib/catalogusproducten/uitvoeringMatch.js",
          "server/lib/publiekeApi/sleutelbeleid.js"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke native tekst-/getalinvoer; ruimere String/Number-normalisatie en genegeerde velden bij bevestigde regels zijn niet als aanbevolen invoer uitgewerkt."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "offerte_invoer": {
                    "$ref": "#/components/schemas/WorkflowOfferteBewijsInvoer"
                  }
                },
                "required": [
                  "offerte_invoer"
                ],
                "additionalProperties": false,
                "x-max-json-stringify-tekens": 200000
              }
            }
          }
        },
        "x-bronref": "cd6dcaf4"
      }
    },
    "/v1/uitvoeringen": {
      "get": {
        "operationId": "uitvoeringen_lijst",
        "summary": "uitvoeringen lijst",
        "description": "Metadata zonder snapshot. Onbekende queryvelden400. Stabiele aflopende sortering op bijgewerkt_op en ID, maximaal50. Alleen momenteel zichtbare dossiers/klanten voor sleutelactor. Fases beschrijven de uitvoering, niet daadwerkelijke provider- of runstatus. Discovery-/mutatievrijgave, pakket productiewerkplaats, huidige objectrechten en bij inhoud huidige privacy/adapters/readiness vereist. Private,no-store. Domeinfouten gebruiken error.code/message_key/request_id/velden; middleware kan code/detail teruggeven.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "description": "alles of kommagescheiden fases; afwezig/leeg betekent alle fases."
            }
          },
          {
            "name": "limiet",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 20
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 512,
              "pattern": "^[A-Za-z0-9_-]+$",
              "description": "Ongedeelde base64url-cursor uit vorige pagina; bewaart v1, datum met precisie en ID."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "schema_versie": {
                      "const": 1
                    },
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "uitvoering_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "documenttype": {
                            "const": "rapport"
                          },
                          "dossier_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "rapport_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "status": {
                            "type": "string",
                            "enum": [
                              "voorbereiding",
                              "gesprek",
                              "concept",
                              "goedkeuring",
                              "aanvulling",
                              "definitief"
                            ]
                          },
                          "huidige_versie_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "huidige_versie_nummer": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 9007199254740991
                          },
                          "etag": {
                            "type": "string",
                            "pattern": "^\"uitvoering:[a-f0-9-]{36}:[a-f0-9-]{36}:[1-9][0-9]*:[a-f0-9]{64}\"$"
                          },
                          "aangemaakt_op": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "bijgewerkt_op": {
                            "type": "string",
                            "format": "date-time"
                          }
                        },
                        "required": [
                          "uitvoering_id",
                          "documenttype",
                          "dossier_id",
                          "rapport_id",
                          "status",
                          "huidige_versie_id",
                          "huidige_versie_nummer",
                          "etag",
                          "aangemaakt_op",
                          "bijgewerkt_op"
                        ],
                        "additionalProperties": false
                      },
                      "maxItems": 50
                    },
                    "status_filter": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "enum": [
                          "voorbereiding",
                          "gesprek",
                          "concept",
                          "goedkeuring",
                          "aanvulling",
                          "definitief"
                        ]
                      },
                      "uniqueItems": true
                    },
                    "limiet": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 50
                    },
                    "volgende_cursor": {
                      "anyOf": [
                        {
                          "type": "string",
                          "maxLength": 512,
                          "pattern": "^[A-Za-z0-9_-]+$",
                          "description": "Ongedeelde base64url-cursor uit vorige pagina; bewaart v1, datum met precisie en ID."
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "sortering": {
                      "const": "bijgewerkt_op_desc,id_desc"
                    }
                  },
                  "required": [
                    "schema_versie",
                    "items",
                    "status_filter",
                    "limiet",
                    "volgende_cursor",
                    "sortering"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"uitvoering:[a-f0-9-]{36}:[a-f0-9-]{36}:[1-9][0-9]*:[a-f0-9]{64}\"$"
                },
                "description": "Bij object- en versieantwoorden; lijst geeft dit niet."
              }
            }
          },
          "400": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "402": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "403": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "409": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "410": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "413": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "423": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "428": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "500": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "422": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/uitvoeringen.js",
          "server/lib/publiekeApi/workflowBroncontrole.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/uitvoer/uitvoeringenRoutes.js",
          "server/lib/uitvoer/uitvoeringenStore.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/lib/uitvoer/voortgang.js",
          "server/lib/uitvoer/productieIntegratie/rapportIdentiteit.js",
          "server/lib/uitvoer/productieIntegratie/catalogusSelectie.js",
          "server/lib/uitvoer/productieAdapters/workflow.js",
          "server/lib/uitvoer/productieAdapters/bronnen.js",
          "server/jobs/adapters/uitvoeringPrivacy.js",
          "server/lib/rapportlyWorkflow/bronpoort.js",
          "server/lib/universele-documentarchetypen/uitvoeringSelectie.js",
          "server/lib/universele-documentarchetypen/productieRenderer.js",
          "server/lib/uitvoer/workflowProductiekeuze.js",
          "server/lib/uitvoer/workflowBriefContract.js",
          "server/migrations/202_rapportly_duurzame_uitvoermutaties.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke querysubset; native Number-normalisatie accepteert ook andere numerieke schrijfwijzen."
        ],
        "x-bronref": "579b18e8"
      },
      "post": {
        "operationId": "uitvoering_start",
        "summary": "uitvoering start",
        "description": "Maak uitvoeringscontext op bestaand klaar Rapportly-rapport; geen workflowproducerstart. Server leidt uitvoering-ID af uit API-key en opdrachtcode. Exacte herhaling gebruikt oorspronkelijke201-ontvangst; andere body409, verlopen ontvangst410. Optionele workflow-/catalogusversie en bronrapportidentiteit moeten echt beschikbaar zijn. Geen client-modelkeuze, bronhash of prijs. Discovery-/mutatievrijgave, pakket productiewerkplaats, huidige objectrechten en bij inhoud huidige privacy/adapters/readiness vereist. Private,no-store. Domeinfouten gebruiken error.code/message_key/request_id/velden; middleware kan code/detail teruggeven. Opgeslagen profielkeuzes bevatten vier getypeerde enginevormen met vaste rendercapaciteiten. Dit is geen bewijs van geslaagde documentproductie; huidige profieltoegang, actieve versie, keuzehash en native renderpoorten blijven vereist.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Uitvoering"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"uitvoering:[a-f0-9-]{36}:[a-f0-9-]{36}:[1-9][0-9]*:[a-f0-9]{64}\"$"
                },
                "description": "Bij object- en versieantwoorden; lijst geeft dit niet."
              }
            }
          },
          "400": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "402": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "403": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "409": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "410": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "413": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "423": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "428": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "500": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "422": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "workflows:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/uitvoeringen.js",
          "server/lib/publiekeApi/workflowBroncontrole.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/uitvoer/uitvoeringenRoutes.js",
          "server/lib/uitvoer/uitvoeringenStore.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/lib/uitvoer/voortgang.js",
          "server/lib/uitvoer/productieIntegratie/rapportIdentiteit.js",
          "server/lib/uitvoer/productieIntegratie/catalogusSelectie.js",
          "server/lib/uitvoer/productieAdapters/workflow.js",
          "server/lib/uitvoer/productieAdapters/bronnen.js",
          "server/jobs/adapters/uitvoeringPrivacy.js",
          "server/lib/rapportlyWorkflow/bronpoort.js",
          "server/lib/universele-documentarchetypen/uitvoeringSelectie.js",
          "server/lib/universele-documentarchetypen/productieRenderer.js",
          "server/lib/uitvoer/workflowProductiekeuze.js",
          "server/lib/uitvoer/workflowBriefContract.js",
          "server/migrations/202_rapportly_duurzame_uitvoermutaties.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/lib/voorbeeldProfiel.js",
          "server/lib/voorbeeldProfielSelectie.js",
          "server/lib/templateV2/contract.js",
          "server/lib/templateV2/markdownCapabilities.js",
          "server/lib/templateV2/formulierPlan.js",
          "server/lib/presentatieV1/contract.js",
          "server/lib/presentatieV1/identiteit.js",
          "server/lib/presentatieV1/diaplan.js",
          "server/lib/bronstijl/identiteit.js",
          "server/lib/bronstijl/contract.js",
          "server/lib/universele-documentarchetypen/templateV2Adapter.js"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Doel-renderidentiteit heeft nu vier engine-enveloppen en concrete Word-/PPTX-capaciteiten; nested historische voorbeeldmanifesten/herkenning, opgeslagen offerte-invoer/aliases en historische retentie-/goedkeuringssnapshotvarianten blijven afzonderlijk schema-open."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "rapport_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "workflowprofiel_id": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "workflowprofiel_versie_id": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "documentformat_selectie": {
                    "$ref": "#/components/schemas/UitvoeringDocumentformatInvoer"
                  },
                  "catalogus_selectie": {
                    "type": "object",
                    "properties": {
                      "catalogusVersionId": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      "etag": {
                        "type": "string",
                        "pattern": "^[a-f0-9]{64}$"
                      }
                    },
                    "required": [
                      "catalogusVersionId",
                      "etag"
                    ],
                    "additionalProperties": false
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "rapport_id",
                  "bevestigd"
                ],
                "additionalProperties": false,
                "description": "Workflowprofiel en versie samen beide niet-null of beide afwezig/null. Start gebruikt serveraanbevolen uitvoeringskeuze. Documentformatselectie na eerste write onveranderlijk."
              }
            }
          }
        },
        "x-bronref": "cfe078af"
      }
    },
    "/v1/uitvoeringen/{id}/versies": {
      "get": {
        "operationId": "uitvoering_versies",
        "summary": "uitvoering versies",
        "description": "Maximaal50 versies aflopend op versienummer. volgende_cursor is het laatste zichtbare versienummer als nog een volgende rij bestaat; andersnull. Alleen cursor als query toegestaan; geen0, exponent, lege waarde of leidende nullen. Discovery-/mutatievrijgave, pakket productiewerkplaats, huidige objectrechten en bij inhoud huidige privacy/adapters/readiness vereist. Private,no-store. Domeinfouten gebruiken error.code/message_key/request_id/velden; middleware kan code/detail teruggeven.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^[1-9][0-9]*$",
              "description": "Positief veilig geheel versienummer; uitsluitend eerdere versies, maximaal9007199254740991."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "versie_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          "versie_nummer": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 9007199254740991
                          },
                          "vorige_versie_id": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "mutatie_soort": {
                            "type": "string"
                          },
                          "snapshot_sha256": {
                            "type": "string",
                            "pattern": "^[a-f0-9]{64}$"
                          },
                          "etag": {
                            "type": "string",
                            "pattern": "^\"uitvoering:[a-f0-9-]{36}:[a-f0-9-]{36}:[1-9][0-9]*:[a-f0-9]{64}\"$"
                          },
                          "aangemaakt_op": {
                            "type": "string",
                            "format": "date-time"
                          }
                        },
                        "required": [
                          "versie_id",
                          "versie_nummer",
                          "vorige_versie_id",
                          "mutatie_soort",
                          "snapshot_sha256",
                          "etag",
                          "aangemaakt_op"
                        ],
                        "additionalProperties": false
                      },
                      "maxItems": 50
                    },
                    "volgende_cursor": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "items",
                    "volgende_cursor"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"uitvoering:[a-f0-9-]{36}:[a-f0-9-]{36}:[1-9][0-9]*:[a-f0-9]{64}\"$"
                },
                "description": "Bij object- en versieantwoorden; lijst geeft dit niet."
              }
            }
          },
          "400": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "402": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "403": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "409": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "410": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "413": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "423": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "428": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "500": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "422": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/uitvoeringen.js",
          "server/lib/publiekeApi/workflowBroncontrole.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/uitvoer/uitvoeringenRoutes.js",
          "server/lib/uitvoer/uitvoeringenStore.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/lib/uitvoer/voortgang.js",
          "server/lib/uitvoer/productieIntegratie/rapportIdentiteit.js",
          "server/lib/uitvoer/productieIntegratie/catalogusSelectie.js",
          "server/lib/uitvoer/productieAdapters/workflow.js",
          "server/lib/uitvoer/productieAdapters/bronnen.js",
          "server/jobs/adapters/uitvoeringPrivacy.js",
          "server/lib/rapportlyWorkflow/bronpoort.js",
          "server/lib/universele-documentarchetypen/uitvoeringSelectie.js",
          "server/lib/universele-documentarchetypen/productieRenderer.js",
          "server/lib/uitvoer/workflowProductiekeuze.js",
          "server/lib/uitvoer/workflowBriefContract.js",
          "server/migrations/202_rapportly_duurzame_uitvoermutaties.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "579b18e8"
      }
    },
    "/v1/uitvoeringen/{id}": {
      "get": {
        "operationId": "uitvoering_lezen",
        "summary": "uitvoering lezen",
        "description": "Huidige immutable versie plus uitvoeringfase en ETag; lees dit vóór iedere mutatie. Oude prijsgevolg is een contextuele raming, geen nieuwe boeking. Discovery-/mutatievrijgave, pakket productiewerkplaats, huidige objectrechten en bij inhoud huidige privacy/adapters/readiness vereist. Private,no-store. Domeinfouten gebruiken error.code/message_key/request_id/velden; middleware kan code/detail teruggeven. Opgeslagen profielkeuzes bevatten vier getypeerde enginevormen met vaste rendercapaciteiten. Dit is geen bewijs van geslaagde documentproductie; huidige profieltoegang, actieve versie, keuzehash en native renderpoorten blijven vereist.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Uitvoering"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"uitvoering:[a-f0-9-]{36}:[a-f0-9-]{36}:[1-9][0-9]*:[a-f0-9]{64}\"$"
                },
                "description": "Bij object- en versieantwoorden; lijst geeft dit niet."
              }
            }
          },
          "400": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "402": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "403": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "409": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "410": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "413": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "423": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "428": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "500": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "422": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/uitvoeringen.js",
          "server/lib/publiekeApi/workflowBroncontrole.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/uitvoer/uitvoeringenRoutes.js",
          "server/lib/uitvoer/uitvoeringenStore.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/lib/uitvoer/voortgang.js",
          "server/lib/uitvoer/productieIntegratie/rapportIdentiteit.js",
          "server/lib/uitvoer/productieIntegratie/catalogusSelectie.js",
          "server/lib/uitvoer/productieAdapters/workflow.js",
          "server/lib/uitvoer/productieAdapters/bronnen.js",
          "server/jobs/adapters/uitvoeringPrivacy.js",
          "server/lib/rapportlyWorkflow/bronpoort.js",
          "server/lib/universele-documentarchetypen/uitvoeringSelectie.js",
          "server/lib/universele-documentarchetypen/productieRenderer.js",
          "server/lib/uitvoer/workflowProductiekeuze.js",
          "server/lib/uitvoer/workflowBriefContract.js",
          "server/migrations/202_rapportly_duurzame_uitvoermutaties.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/lib/voorbeeldProfiel.js",
          "server/lib/voorbeeldProfielSelectie.js",
          "server/lib/templateV2/contract.js",
          "server/lib/templateV2/markdownCapabilities.js",
          "server/lib/templateV2/formulierPlan.js",
          "server/lib/presentatieV1/contract.js",
          "server/lib/presentatieV1/identiteit.js",
          "server/lib/presentatieV1/diaplan.js",
          "server/lib/bronstijl/identiteit.js",
          "server/lib/bronstijl/contract.js",
          "server/lib/universele-documentarchetypen/templateV2Adapter.js"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Doel-renderidentiteit heeft nu vier engine-enveloppen en concrete Word-/PPTX-capaciteiten; nested historische voorbeeldmanifesten/herkenning, opgeslagen offerte-invoer/aliases en historische retentie-/goedkeuringssnapshotvarianten blijven afzonderlijk schema-open."
        ],
        "x-bronref": "cfe078af"
      }
    },
    "/v1/uitvoeringen/{id}/versies/{versie_id}": {
      "get": {
        "operationId": "uitvoering_versie",
        "summary": "uitvoering versie",
        "description": "Exact gekozen historische snapshot, geen automatisch bijgewerkte brondata. ETag behoort bij deze versie; een oude versie geeft geen huidige mutatietoestemming. Discovery-/mutatievrijgave, pakket productiewerkplaats, huidige objectrechten en bij inhoud huidige privacy/adapters/readiness vereist. Private,no-store. Domeinfouten gebruiken error.code/message_key/request_id/velden; middleware kan code/detail teruggeven. Opgeslagen profielkeuzes bevatten vier getypeerde enginevormen met vaste rendercapaciteiten. Dit is geen bewijs van geslaagde documentproductie; huidige profieltoegang, actieve versie, keuzehash en native renderpoorten blijven vereist.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "versie_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UitvoeringSnapshot"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"uitvoering:[a-f0-9-]{36}:[a-f0-9-]{36}:[1-9][0-9]*:[a-f0-9]{64}\"$"
                },
                "description": "Bij object- en versieantwoorden; lijst geeft dit niet."
              }
            }
          },
          "400": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "402": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "403": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "409": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "410": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "413": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "423": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "428": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "500": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "422": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/uitvoeringen.js",
          "server/lib/publiekeApi/workflowBroncontrole.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/uitvoer/uitvoeringenRoutes.js",
          "server/lib/uitvoer/uitvoeringenStore.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/lib/uitvoer/voortgang.js",
          "server/lib/uitvoer/productieIntegratie/rapportIdentiteit.js",
          "server/lib/uitvoer/productieIntegratie/catalogusSelectie.js",
          "server/lib/uitvoer/productieAdapters/workflow.js",
          "server/lib/uitvoer/productieAdapters/bronnen.js",
          "server/jobs/adapters/uitvoeringPrivacy.js",
          "server/lib/rapportlyWorkflow/bronpoort.js",
          "server/lib/universele-documentarchetypen/uitvoeringSelectie.js",
          "server/lib/universele-documentarchetypen/productieRenderer.js",
          "server/lib/uitvoer/workflowProductiekeuze.js",
          "server/lib/uitvoer/workflowBriefContract.js",
          "server/migrations/202_rapportly_duurzame_uitvoermutaties.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/lib/voorbeeldProfiel.js",
          "server/lib/voorbeeldProfielSelectie.js",
          "server/lib/templateV2/contract.js",
          "server/lib/templateV2/markdownCapabilities.js",
          "server/lib/templateV2/formulierPlan.js",
          "server/lib/presentatieV1/contract.js",
          "server/lib/presentatieV1/identiteit.js",
          "server/lib/presentatieV1/diaplan.js",
          "server/lib/bronstijl/identiteit.js",
          "server/lib/bronstijl/contract.js",
          "server/lib/universele-documentarchetypen/templateV2Adapter.js"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Doel-renderidentiteit heeft nu vier engine-enveloppen en concrete Word-/PPTX-capaciteiten; nested historische voorbeeldmanifesten/herkenning, opgeslagen offerte-invoer/aliases en historische retentie-/goedkeuringssnapshotvarianten blijven afzonderlijk schema-open."
        ],
        "x-bronref": "cfe078af"
      }
    },
    "/v1/uitvoeringen/{id}/run-opdracht": {
      "patch": {
        "operationId": "uitvoering_opdracht",
        "summary": "uitvoering opdracht",
        "description": "Nieuwe immutable versie van opdracht/instructie/uitvoeringskeuze en expliciet productiedoel. Idempotentie bindt exacte body én If-Match. Verouderde advieshash409. Alleen rapport accepteert begeleidende_brief; formulierbron weigert die. Presentatie/offerte-profiel vereist huidige stijlen:lezen en plafond plus dezelfde actieve eigen/teamprofielversie. Offertregelbewijs en handmatige offerte-invoer zijn exclusief. Een gewijzigde productiekeuze vereist nieuwe bron-/menselijke productiebeoordeling; deze PATCH produceert zelf geen document. Discovery-/mutatievrijgave, pakket productiewerkplaats, huidige objectrechten en bij inhoud huidige privacy/adapters/readiness vereist. Private,no-store. Domeinfouten gebruiken error.code/message_key/request_id/velden; middleware kan code/detail teruggeven. Opgeslagen profielkeuzes bevatten vier getypeerde enginevormen met vaste rendercapaciteiten. Dit is geen bewijs van geslaagde documentproductie; huidige profieltoegang, actieve versie, keuzehash en native renderpoorten blijven vereist.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "If-Match",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^\"uitvoering:[a-f0-9-]{36}:[a-f0-9-]{36}:[1-9][0-9]*:[a-f0-9]{64}\"$"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Uitvoering"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"uitvoering:[a-f0-9-]{36}:[a-f0-9-]{36}:[1-9][0-9]*:[a-f0-9]{64}\"$"
                },
                "description": "Bij object- en versieantwoorden; lijst geeft dit niet."
              }
            }
          },
          "400": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "402": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "403": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "409": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "410": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "413": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "423": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "428": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "500": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "422": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "workflows:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/uitvoeringen.js",
          "server/lib/publiekeApi/workflowBroncontrole.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/uitvoer/uitvoeringenRoutes.js",
          "server/lib/uitvoer/uitvoeringenStore.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/lib/uitvoer/voortgang.js",
          "server/lib/uitvoer/productieIntegratie/rapportIdentiteit.js",
          "server/lib/uitvoer/productieIntegratie/catalogusSelectie.js",
          "server/lib/uitvoer/productieAdapters/workflow.js",
          "server/lib/uitvoer/productieAdapters/bronnen.js",
          "server/jobs/adapters/uitvoeringPrivacy.js",
          "server/lib/rapportlyWorkflow/bronpoort.js",
          "server/lib/universele-documentarchetypen/uitvoeringSelectie.js",
          "server/lib/universele-documentarchetypen/productieRenderer.js",
          "server/lib/uitvoer/workflowProductiekeuze.js",
          "server/lib/uitvoer/workflowBriefContract.js",
          "server/migrations/202_rapportly_duurzame_uitvoermutaties.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/lib/voorbeeldProfiel.js",
          "server/lib/voorbeeldProfielSelectie.js",
          "server/lib/templateV2/contract.js",
          "server/lib/templateV2/markdownCapabilities.js",
          "server/lib/templateV2/formulierPlan.js",
          "server/lib/presentatieV1/contract.js",
          "server/lib/presentatieV1/identiteit.js",
          "server/lib/presentatieV1/diaplan.js",
          "server/lib/bronstijl/identiteit.js",
          "server/lib/bronstijl/contract.js",
          "server/lib/universele-documentarchetypen/templateV2Adapter.js"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Doel-renderidentiteit heeft nu vier engine-enveloppen en concrete Word-/PPTX-capaciteiten; nested historische voorbeeldmanifesten/herkenning, opgeslagen offerte-invoer/aliases en historische retentie-/goedkeuringssnapshotvarianten blijven afzonderlijk schema-open.",
          "Canonieke nested invoer; native keuze-normalisatie is ruimer."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "run_opdracht": {
                    "type": "object",
                    "properties": {
                      "tekst": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 20000,
                        "pattern": "\\S"
                      }
                    },
                    "required": [
                      "tekst"
                    ],
                    "additionalProperties": false
                  },
                  "organisatie_instructie_versie_id": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "uitvoeringskeuze": {
                    "$ref": "#/components/schemas/UitvoeringKeuzeVast"
                  },
                  "keuzeadvies": {
                    "type": "object",
                    "properties": {
                      "advies_id": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      "advies_hash": {
                        "type": "string",
                        "pattern": "^[a-f0-9]{64}$"
                      }
                    },
                    "required": [
                      "advies_id",
                      "advies_hash"
                    ],
                    "additionalProperties": false
                  },
                  "afwijkingsbevestiging": {
                    "anyOf": [
                      {
                        "$ref": "#/components/schemas/UitvoeringAfwijkingsbevestiging"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "productiekeuze": {
                    "$ref": "#/components/schemas/WorkflowProductiekeuzeInvoer"
                  }
                },
                "required": [
                  "run_opdracht",
                  "organisatie_instructie_versie_id",
                  "keuzeadvies"
                ],
                "additionalProperties": false,
                "description": "Afwezige uitvoeringskeuze normaliseert naar standaard/zorgvuldig. Afwijking van bevroren advies vereist exacte bevestiging; bij aanbevolen keuze alleen null/afwezig. Afwezige productiekeuze behoudt bestaande keuze; expliciet rapport keert terug naar rapportdoel."
              }
            }
          }
        },
        "x-bronref": "cfe078af"
      }
    },
    "/v1/uitvoeringen/{id}/broncontrole": {
      "post": {
        "operationId": "uitvoering_broncontrole",
        "summary": "uitvoering broncontrole",
        "description": "Controleer bestaande originele documenten, gesprekken en bronkeuzes. Ieder antwoorden-/bronkeuzesobject maximaal100sleutels/20000UTF8bytes; null/afwezig wordt leeg. Antwoorden zijn dynamische JSONwaarden; bronkeuzes gebruikt bronversie-ID per bronregel. Geen vrije bronmanifest-/actor-/prijsinvoer. Server leest bronbasis vóór controle en verifieert die atomair bij opslag. Gewijzigde bronnen409; ontbrekende/verkeerde bron of vraag levert conflict in nieuwe snapshot. Huidige interne privacy/adapters blijven vereist; geen nieuw generatiemodel gestart. Discovery-/mutatievrijgave, pakket productiewerkplaats, huidige objectrechten en bij inhoud huidige privacy/adapters/readiness vereist. Private,no-store. Domeinfouten gebruiken error.code/message_key/request_id/velden; middleware kan code/detail teruggeven. Opgeslagen profielkeuzes bevatten vier getypeerde enginevormen met vaste rendercapaciteiten. Dit is geen bewijs van geslaagde documentproductie; huidige profieltoegang, actieve versie, keuzehash en native renderpoorten blijven vereist.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "If-Match",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^\"uitvoering:[a-f0-9-]{36}:[a-f0-9-]{36}:[1-9][0-9]*:[a-f0-9]{64}\"$"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Uitvoering"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"uitvoering:[a-f0-9-]{36}:[a-f0-9-]{36}:[1-9][0-9]*:[a-f0-9]{64}\"$"
                },
                "description": "Bij object- en versieantwoorden; lijst geeft dit niet."
              }
            }
          },
          "400": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "402": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "403": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "409": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "410": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "413": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "423": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "428": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "500": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "422": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "workflows:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/uitvoeringen.js",
          "server/lib/publiekeApi/workflowBroncontrole.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/uitvoer/uitvoeringenRoutes.js",
          "server/lib/uitvoer/uitvoeringenStore.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/lib/uitvoer/voortgang.js",
          "server/lib/uitvoer/productieIntegratie/rapportIdentiteit.js",
          "server/lib/uitvoer/productieIntegratie/catalogusSelectie.js",
          "server/lib/uitvoer/productieAdapters/workflow.js",
          "server/lib/uitvoer/productieAdapters/bronnen.js",
          "server/jobs/adapters/uitvoeringPrivacy.js",
          "server/lib/rapportlyWorkflow/bronpoort.js",
          "server/lib/universele-documentarchetypen/uitvoeringSelectie.js",
          "server/lib/universele-documentarchetypen/productieRenderer.js",
          "server/lib/uitvoer/workflowProductiekeuze.js",
          "server/lib/uitvoer/workflowBriefContract.js",
          "server/migrations/202_rapportly_duurzame_uitvoermutaties.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/lib/voorbeeldProfiel.js",
          "server/lib/voorbeeldProfielSelectie.js",
          "server/lib/templateV2/contract.js",
          "server/lib/templateV2/markdownCapabilities.js",
          "server/lib/templateV2/formulierPlan.js",
          "server/lib/presentatieV1/contract.js",
          "server/lib/presentatieV1/identiteit.js",
          "server/lib/presentatieV1/diaplan.js",
          "server/lib/bronstijl/identiteit.js",
          "server/lib/bronstijl/contract.js",
          "server/lib/universele-documentarchetypen/templateV2Adapter.js"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Doel-renderidentiteit heeft nu vier engine-enveloppen en concrete Word-/PPTX-capaciteiten; nested historische voorbeeldmanifesten/herkenning, opgeslagen offerte-invoer/aliases en historische retentie-/goedkeuringssnapshotvarianten blijven afzonderlijk schema-open."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "bevestigd": {
                    "const": true
                  },
                  "antwoorden": {
                    "anyOf": [
                      {
                        "type": "object",
                        "maxProperties": 100,
                        "propertyNames": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 120,
                          "not": {
                            "enum": [
                              "__proto__",
                              "constructor",
                              "prototype"
                            ]
                          }
                        },
                        "additionalProperties": {
                          "$ref": "#/components/schemas/JsonWaarde"
                        },
                        "x-max-json-utf8-bytes": 20000
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "bronkeuzes": {
                    "anyOf": [
                      {
                        "type": "object",
                        "maxProperties": 100,
                        "propertyNames": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 120,
                          "not": {
                            "enum": [
                              "__proto__",
                              "constructor",
                              "prototype"
                            ]
                          }
                        },
                        "additionalProperties": {
                          "$ref": "#/components/schemas/JsonWaarde"
                        },
                        "x-max-json-utf8-bytes": 20000
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": [
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "x-bronref": "cfe078af"
      }
    },
    "/v1/uitvoeringen/{id}/bronbevestigingen": {
      "post": {
        "operationId": "uitvoering_bronbevestiging",
        "summary": "uitvoering bronbevestiging",
        "description": "Leg één menselijke bronhandeling vast op exact huidige voorbereidende uitvoeringversie, punt en bronhash. Bronadapter controleert dit opnieuw. Bij aangepast niet-null JSONwaarde vereist; andere handelingen alleen null/afwezig. Dit is geen native sessiebevestiging van een productierun en vervangt die niet. Discovery-/mutatievrijgave, pakket productiewerkplaats, huidige objectrechten en bij inhoud huidige privacy/adapters/readiness vereist. Private,no-store. Domeinfouten gebruiken error.code/message_key/request_id/velden; middleware kan code/detail teruggeven. Opgeslagen profielkeuzes bevatten vier getypeerde enginevormen met vaste rendercapaciteiten. Dit is geen bewijs van geslaagde documentproductie; huidige profieltoegang, actieve versie, keuzehash en native renderpoorten blijven vereist.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "If-Match",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^\"uitvoering:[a-f0-9-]{36}:[a-f0-9-]{36}:[1-9][0-9]*:[a-f0-9]{64}\"$"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Uitvoering"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"uitvoering:[a-f0-9-]{36}:[a-f0-9-]{36}:[1-9][0-9]*:[a-f0-9]{64}\"$"
                },
                "description": "Bij object- en versieantwoorden; lijst geeft dit niet."
              }
            }
          },
          "400": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "402": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "403": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "409": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "410": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "413": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "423": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "428": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "500": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "422": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "workflows:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/uitvoeringen.js",
          "server/lib/publiekeApi/workflowBroncontrole.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/uitvoer/uitvoeringenRoutes.js",
          "server/lib/uitvoer/uitvoeringenStore.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/lib/uitvoer/voortgang.js",
          "server/lib/uitvoer/productieIntegratie/rapportIdentiteit.js",
          "server/lib/uitvoer/productieIntegratie/catalogusSelectie.js",
          "server/lib/uitvoer/productieAdapters/workflow.js",
          "server/lib/uitvoer/productieAdapters/bronnen.js",
          "server/jobs/adapters/uitvoeringPrivacy.js",
          "server/lib/rapportlyWorkflow/bronpoort.js",
          "server/lib/universele-documentarchetypen/uitvoeringSelectie.js",
          "server/lib/universele-documentarchetypen/productieRenderer.js",
          "server/lib/uitvoer/workflowProductiekeuze.js",
          "server/lib/uitvoer/workflowBriefContract.js",
          "server/migrations/202_rapportly_duurzame_uitvoermutaties.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/lib/voorbeeldProfiel.js",
          "server/lib/voorbeeldProfielSelectie.js",
          "server/lib/templateV2/contract.js",
          "server/lib/templateV2/markdownCapabilities.js",
          "server/lib/templateV2/formulierPlan.js",
          "server/lib/presentatieV1/contract.js",
          "server/lib/presentatieV1/identiteit.js",
          "server/lib/presentatieV1/diaplan.js",
          "server/lib/bronstijl/identiteit.js",
          "server/lib/bronstijl/contract.js",
          "server/lib/universele-documentarchetypen/templateV2Adapter.js"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Doel-renderidentiteit heeft nu vier engine-enveloppen en concrete Word-/PPTX-capaciteiten; nested historische voorbeeldmanifesten/herkenning, opgeslagen offerte-invoer/aliases en historische retentie-/goedkeuringssnapshotvarianten blijven afzonderlijk schema-open."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UitvoeringBronbevestigingInvoer"
              }
            }
          }
        },
        "x-bronref": "cfe078af"
      }
    },
    "/v1/uitvoeringen/{id}/transities": {
      "post": {
        "operationId": "uitvoering_transitie",
        "summary": "uitvoering transitie",
        "description": "Toegestane fases: voorbereiding→gesprek/concept; gesprek→concept; concept→goedkeuring/aanvulling/definitief; goedkeuring→aanvulling/definitief; aanvulling→concept/goedkeuring; definitief terminaal. Huidige privacycontrole; definitief vereist exact gevalideerde oorspronkelijke rapportversie. Faseovergang is geen automatische nieuwe documentproductie, providerstart of mailverzending. Discovery-/mutatievrijgave, pakket productiewerkplaats, huidige objectrechten en bij inhoud huidige privacy/adapters/readiness vereist. Private,no-store. Domeinfouten gebruiken error.code/message_key/request_id/velden; middleware kan code/detail teruggeven. Opgeslagen profielkeuzes bevatten vier getypeerde enginevormen met vaste rendercapaciteiten. Dit is geen bewijs van geslaagde documentproductie; huidige profieltoegang, actieve versie, keuzehash en native renderpoorten blijven vereist.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "If-Match",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^\"uitvoering:[a-f0-9-]{36}:[a-f0-9-]{36}:[1-9][0-9]*:[a-f0-9]{64}\"$"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Uitvoering"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"uitvoering:[a-f0-9-]{36}:[a-f0-9-]{36}:[1-9][0-9]*:[a-f0-9]{64}\"$"
                },
                "description": "Bij object- en versieantwoorden; lijst geeft dit niet."
              }
            }
          },
          "400": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "402": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "403": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "409": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "410": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "413": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "423": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "428": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "500": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          },
          "422": {
            "description": "Actuele poort- of domeinfout;409 opnieuw lezen,428 vereist If-Match.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/UitvoeringFout"
                    },
                    {
                      "$ref": "#/components/schemas/Fout"
                    }
                  ]
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "workflows:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/uitvoeringen.js",
          "server/lib/publiekeApi/workflowBroncontrole.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/uitvoer/uitvoeringenRoutes.js",
          "server/lib/uitvoer/uitvoeringenStore.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/lib/uitvoer/voortgang.js",
          "server/lib/uitvoer/productieIntegratie/rapportIdentiteit.js",
          "server/lib/uitvoer/productieIntegratie/catalogusSelectie.js",
          "server/lib/uitvoer/productieAdapters/workflow.js",
          "server/lib/uitvoer/productieAdapters/bronnen.js",
          "server/jobs/adapters/uitvoeringPrivacy.js",
          "server/lib/rapportlyWorkflow/bronpoort.js",
          "server/lib/universele-documentarchetypen/uitvoeringSelectie.js",
          "server/lib/universele-documentarchetypen/productieRenderer.js",
          "server/lib/uitvoer/workflowProductiekeuze.js",
          "server/lib/uitvoer/workflowBriefContract.js",
          "server/migrations/202_rapportly_duurzame_uitvoermutaties.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/lib/voorbeeldProfiel.js",
          "server/lib/voorbeeldProfielSelectie.js",
          "server/lib/templateV2/contract.js",
          "server/lib/templateV2/markdownCapabilities.js",
          "server/lib/templateV2/formulierPlan.js",
          "server/lib/presentatieV1/contract.js",
          "server/lib/presentatieV1/identiteit.js",
          "server/lib/presentatieV1/diaplan.js",
          "server/lib/bronstijl/identiteit.js",
          "server/lib/bronstijl/contract.js",
          "server/lib/universele-documentarchetypen/templateV2Adapter.js"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Doel-renderidentiteit heeft nu vier engine-enveloppen en concrete Word-/PPTX-capaciteiten; nested historische voorbeeldmanifesten/herkenning, opgeslagen offerte-invoer/aliases en historische retentie-/goedkeuringssnapshotvarianten blijven afzonderlijk schema-open."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "naar_fase": {
                    "type": "string",
                    "enum": [
                      "voorbereiding",
                      "gesprek",
                      "concept",
                      "goedkeuring",
                      "aanvulling",
                      "definitief"
                    ]
                  },
                  "reden_code": {
                    "type": "string",
                    "maxLength": 100
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "naar_fase",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "x-bronref": "cfe078af"
      }
    },
    "/v1/uitvoeringen/{id}/productie": {
      "get": {
        "operationId": "workflowrun_productiecontext",
        "summary": "workflowrun productiecontext",
        "description": "Huidige uitvoeringversie, snapshot/dossier, reviewbasis, bronblokkade, eigen laatste run en generatiekeuze. Ontbrekende broncontrole/onleesbare/gewijzigde bron geeft basis:null plus blokkade; bestaande run blijft apart leesbaar. Canoniek bronrapport kan expliciet rapport/presentatie/offerte voortbrengen. Alleen rapport mag begeleidendeBrief:true hebben; dit is dezelfde gebonden native deelstap en geen aparte mailactie. taalvervolg blijftfalse. Lees deze context en prijsberekening voor menselijke review; een context-GET start niets. Afzonderlijke workflowvrijgave en volledige-APIvrijgave vereist, anders503. Alleen huidige eigen organisatie/actor en oorspronkelijke API-sleutel; actuele sleutelactivatie/pauze/verval/rechtenplafond en dossier-/klant-/bronrechten. Private,no-store. Bezet native rijslot geeft409 workflowrun_bezig; expliciete herhaling gebruikt hetzelfde exacte verzoek en dezelfde opdrachtcode. Een ontvangst is geen bewijs van provideruitvoering of canonieke publicatie. Opgeslagen profielkeuzes bevatten vier getypeerde enginevormen met vaste rendercapaciteiten. Dit is geen bewijs van geslaagde documentproductie; huidige profieltoegang, actieve versie, keuzehash en native renderpoorten blijven vereist.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "uitvoering_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "uitvoering_versie_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "dossier_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "etag": {
                      "type": "string",
                      "pattern": "^\"uitvoering:[a-f0-9-]{36}:[a-f0-9-]{36}:[1-9][0-9]*:[a-f0-9]{64}\"$"
                    },
                    "snapshot": {
                      "$ref": "#/components/schemas/WorkflowProductiesnapshot"
                    },
                    "basis": {
                      "anyOf": [
                        {
                          "type": "string",
                          "pattern": "^[a-f0-9]{64}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "blokkade": {
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "code": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "code"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "run": {
                      "anyOf": [
                        {
                          "$ref": "#/components/schemas/WorkflowRun"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "generatiekeuze": {
                      "anyOf": [
                        {
                          "$ref": "#/components/schemas/WorkflowGeneratiekeuze"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "uitvoering_id",
                    "uitvoering_versie_id",
                    "dossier_id",
                    "etag",
                    "snapshot",
                    "basis",
                    "blokkade",
                    "run",
                    "generatiekeuze"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Domein-ID of gevalideerde bron-/productie-invoer ongeldig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/uitvoeringen.js",
          "server/lib/publiekeApi/workflowBroncontrole.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/uitvoer/uitvoeringenRoutes.js",
          "server/lib/uitvoer/uitvoeringenStore.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/lib/uitvoer/voortgang.js",
          "server/lib/uitvoer/productieIntegratie/rapportIdentiteit.js",
          "server/lib/uitvoer/productieIntegratie/catalogusSelectie.js",
          "server/lib/uitvoer/productieAdapters/workflow.js",
          "server/lib/uitvoer/productieAdapters/bronnen.js",
          "server/jobs/adapters/uitvoeringPrivacy.js",
          "server/lib/rapportlyWorkflow/bronpoort.js",
          "server/lib/universele-documentarchetypen/uitvoeringSelectie.js",
          "server/lib/universele-documentarchetypen/productieRenderer.js",
          "server/lib/uitvoer/workflowProductiekeuze.js",
          "server/lib/uitvoer/workflowBriefContract.js",
          "server/migrations/202_rapportly_duurzame_uitvoermutaties.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/lib/uitvoer/workflowRunnerService.js",
          "server/lib/uitvoer/workflowRunnerProducent.js",
          "server/lib/voorbeeldProfiel.js",
          "server/lib/voorbeeldProfielSelectie.js",
          "server/lib/templateV2/contract.js",
          "server/lib/templateV2/markdownCapabilities.js",
          "server/lib/templateV2/formulierPlan.js",
          "server/lib/presentatieV1/contract.js",
          "server/lib/presentatieV1/identiteit.js",
          "server/lib/presentatieV1/diaplan.js",
          "server/lib/bronstijl/identiteit.js",
          "server/lib/bronstijl/contract.js",
          "server/lib/universele-documentarchetypen/templateV2Adapter.js"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Doel-renderidentiteit heeft nu vier engine-enveloppen en concrete Word-/PPTX-capaciteiten; nested historische voorbeeldmanifesten/herkenning, opgeslagen offerte-invoer/aliases en historische retentie-/goedkeuringssnapshotvarianten blijven afzonderlijk schema-open."
        ],
        "x-bronref": "cfe078af"
      }
    },
    "/v1/uitvoeringen/{id}/verschillen": {
      "get": {
        "operationId": "uitvoering_rapportrevisies_vergelijken",
        "summary": "uitvoering rapportrevisies vergelijken",
        "description": "Aangesloten productieadapter op bron9bab4bc9, zonder test- of liveclaim. Geen queryparameter toegestaan:400 ongeldige_queryparameter. Volledige-API- én workflowvrijgave vereist; uitgeschakeld geeft200 beschikbaar:false/beleid_uitgeschakeld. Zowel het vastgelegde workflowprofiel als de huidige actieve, goedgekeurde en beschikbare profielversie moeten expliciet verschillenbeleid.intern:volledig hebben. Actuele actor/key/plafond/organisatie-/uitvoering-/bron-/rapportrechten worden hercontroleerd. Selecteert de nieuwste eigen run voor deze uitvoering; die moet klaar zijn en documenttype rapport hebben. Een nieuwere onklare run geeft geen terugval naar oudere klare inhoud. Leest uitsluitend de actieve366rapport_markdownrevisie en haar directe voorganger, met huidig pointerhashbewijs. Iedere hele revisie maximaal2MiB UTF8. Ontbrekende/grote historie geeft200 beschikbaar:false; hash-/leesfout503. Gelijke teksten geven gewijzigd:false/blok:null. Anders één tekstblok van eerste tot laatste afwijking, met mogelijk ongewijzigde tussenregels; perzijde maximaal8000 Unicodecodepunten. Geen brieven, bronmanifesten, opmaak, andere documentsoorten, vrije versienummers of uitvoering-snapshotdiff. Beleids-/run-/pointer-/ETagwijziging tijdens lezen geeft409 of de actuele niet-beschikbaarreden; gewijzigde herlezen historie geeft200/historie_gewijzigd. Er worden geen provider, render of mutatie gestart.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UitvoeringRapportVerschil"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store, max-age=0"
                }
              },
              "Pragma": {
                "schema": {
                  "const": "no-cache"
                }
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige uitvoering-UUID.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/uitvoer/workflowDocumentVerschil.js",
          "server/lib/uitvoer/productieAdapters/verschillen.js",
          "server/lib/uitvoer/productieAdapters/index.js",
          "server/lib/uitvoer/productieIntegratie/index.js",
          "server/lib/uitvoer/uitvoeringenRoutes.js",
          "server/lib/uitvoer/workflowRunnerStore.js",
          "server/lib/uitvoer/rapportOpslag.js",
          "server/lib/klantrechten.js",
          "server/migrations/372_rapportly_workflow_uitvoering.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "9bab4bc9",
        "x-query-aanvullingen-toegestaan": false
      }
    },
    "/v1/gesprekken/{id}/mail/concepten": {
      "get": {
        "operationId": "mailboxconcepten_lezen",
        "summary": "mailboxconcepten lezen",
        "description": "Geen queryparameters. Volledige-APIvrijgave, actuele sleutel/actor/organisatie, objecttoegang en berichten:verzenden blijven vereist; native legacyfallback is geen API-antwoord. Geen Idempotency-Keycontract: aanvraag_id is de duurzame identiteit. Antwoorden zijn private, no-store. Voor iedere nieuwe status-/stop-/maakactie wordt de schema-readiness opnieuw gelezen, zonder positieve cache. Ontbrekende of afwijkende cataloguscontrole, transportfout of deadline geeft503 mail_concept_schema_onbeschikbaar vóór domein/providerstart. Dit is uitsluitend een schemapoort en geen bewijs dat tenantpurge of productie is vrijgegeven. Een andere sleutel mag ook bij dezelfde actor geen ontvangst overnemen. Geen ontvanger, afzender, mailtekst, providerpad of URL in de aanvraag; ontvangst bevat geen inhoud of provideridentiteit. Leest opgeslagen ontvangsten zonder tokenrefresh of provideractie. Lezen blijft mogelijk na verlopen proefperiode. Geen verzend- of afleverbewijs.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MailboxConceptStatus"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "berichten:verzenden"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/mailConcepten.js",
          "server/lib/mailConceptIntent.js",
          "server/lib/mailReadiness.js",
          "server/rapportly_api.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/klantrechten.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "25aa00db",
        "x-query-aanvullingen-toegestaan": false
      }
    },
    "/v1/gesprekken/{id}/mail/concepten/outlook": {
      "post": {
        "operationId": "mailboxconcept_outlook_aanmaken",
        "summary": "mailboxconcept outlook aanmaken",
        "description": "Geen queryparameters. Volledige-APIvrijgave, actuele sleutel/actor/organisatie, objecttoegang en berichten:verzenden blijven vereist; native legacyfallback is geen API-antwoord. Geen Idempotency-Keycontract: aanvraag_id is de duurzame identiteit. Antwoorden zijn private, no-store. Voor iedere nieuwe status-/stop-/maakactie wordt de schema-readiness opnieuw gelezen, zonder positieve cache. Ontbrekende of afwijkende cataloguscontrole, transportfout of deadline geeft503 mail_concept_schema_onbeschikbaar vóór domein/providerstart. Dit is uitsluitend een schemapoort en geen bewijs dat tenantpurge of productie is vrijgegeven. Een andere sleutel mag ook bij dezelfde actor geen ontvangst overnemen. Geen ontvanger, afzender, mailtekst, providerpad of URL in de aanvraag; ontvangst bevat geen inhoud of provideridentiteit. Slaat de bestaande eerste klantmail op als concept in de gekoppelde mailbox, met alle maximaal100 bijlagen samen15MiB. Geen followup of automatische verzending. MIME maximaal24MiB; Outlook heeft bovendien een eigen grens van4MiB voor de base64-body. Overschrijding geeft413 vóór providerstart; niets wordt stil overgeslagen. Nieuwe aanvraag vereist actuele basis, geldige proefperiode/pakket en mailbox. Exacte replay vergelijkt provider/basis/language en leest dezelfde ontvangst zonder nieuwe bytes, refresh of provideractie. Onzeker/gestopt blokkeert nieuwe concepten ook bij een nieuw aanvraag-ID. Marker wordt vóór één providercreate duurzaam opgeslagen; timeout, onleesbaar antwoord en verloren opslagbevestiging geven geen automatische retry. Controleer de conceptenmap bij onzekerheid. HTTP200 betekent aangemaakt; HTTP202 betekent onzeker of gestopt. Vul ontvanger en verzend later bewust in de mailbox. Geen nieuwe creditactie door deze route; algemene budgetpoorten blijven gelden.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/MailboxConceptOntvangst"
                    },
                    {
                      "properties": {
                        "status": {
                          "const": "aangemaakt"
                        }
                      }
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/MailboxConceptOntvangst"
                    },
                    {
                      "properties": {
                        "status": {
                          "type": "string",
                          "enum": [
                            "onzeker",
                            "gestopt"
                          ]
                        }
                      }
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "berichten:verzenden"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/mailConcepten.js",
          "server/lib/mailConceptIntent.js",
          "server/lib/mailReadiness.js",
          "server/rapportly_api.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/klantrechten.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MailboxConceptAanmaken"
              }
            }
          }
        },
        "x-bronref": "25aa00db",
        "x-query-aanvullingen-toegestaan": false
      }
    },
    "/v1/gesprekken/{id}/mail/concepten/gmail": {
      "post": {
        "operationId": "mailboxconcept_gmail_aanmaken",
        "summary": "mailboxconcept gmail aanmaken",
        "description": "Geen queryparameters. Volledige-APIvrijgave, actuele sleutel/actor/organisatie, objecttoegang en berichten:verzenden blijven vereist; native legacyfallback is geen API-antwoord. Geen Idempotency-Keycontract: aanvraag_id is de duurzame identiteit. Antwoorden zijn private, no-store. Voor iedere nieuwe status-/stop-/maakactie wordt de schema-readiness opnieuw gelezen, zonder positieve cache. Ontbrekende of afwijkende cataloguscontrole, transportfout of deadline geeft503 mail_concept_schema_onbeschikbaar vóór domein/providerstart. Dit is uitsluitend een schemapoort en geen bewijs dat tenantpurge of productie is vrijgegeven. Een andere sleutel mag ook bij dezelfde actor geen ontvangst overnemen. Geen ontvanger, afzender, mailtekst, providerpad of URL in de aanvraag; ontvangst bevat geen inhoud of provideridentiteit. Slaat de bestaande eerste klantmail op als concept in de gekoppelde mailbox, met alle maximaal100 bijlagen samen15MiB. Geen followup of automatische verzending. MIME maximaal24MiB; Outlook heeft bovendien een eigen grens van4MiB voor de base64-body. Overschrijding geeft413 vóór providerstart; niets wordt stil overgeslagen. Nieuwe aanvraag vereist actuele basis, geldige proefperiode/pakket en mailbox. Exacte replay vergelijkt provider/basis/language en leest dezelfde ontvangst zonder nieuwe bytes, refresh of provideractie. Onzeker/gestopt blokkeert nieuwe concepten ook bij een nieuw aanvraag-ID. Marker wordt vóór één providercreate duurzaam opgeslagen; timeout, onleesbaar antwoord en verloren opslagbevestiging geven geen automatische retry. Controleer de conceptenmap bij onzekerheid. HTTP200 betekent aangemaakt; HTTP202 betekent onzeker of gestopt. Vul ontvanger en verzend later bewust in de mailbox. Geen nieuwe creditactie door deze route; algemene budgetpoorten blijven gelden.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/MailboxConceptOntvangst"
                    },
                    {
                      "properties": {
                        "status": {
                          "const": "aangemaakt"
                        }
                      }
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/MailboxConceptOntvangst"
                    },
                    {
                      "properties": {
                        "status": {
                          "type": "string",
                          "enum": [
                            "onzeker",
                            "gestopt"
                          ]
                        }
                      }
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "berichten:verzenden"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/mailConcepten.js",
          "server/lib/mailConceptIntent.js",
          "server/lib/mailReadiness.js",
          "server/rapportly_api.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/klantrechten.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MailboxConceptAanmaken"
              }
            }
          }
        },
        "x-bronref": "25aa00db",
        "x-query-aanvullingen-toegestaan": false
      }
    },
    "/v1/gesprekken/{id}/mail/concepten/stoppen": {
      "post": {
        "operationId": "mailboxconcept_stoppen",
        "summary": "mailboxconcept stoppen",
        "description": "Geen queryparameters. Volledige-APIvrijgave, actuele sleutel/actor/organisatie, objecttoegang en berichten:verzenden blijven vereist; native legacyfallback is geen API-antwoord. Geen Idempotency-Keycontract: aanvraag_id is de duurzame identiteit. Antwoorden zijn private, no-store. Voor iedere nieuwe status-/stop-/maakactie wordt de schema-readiness opnieuw gelezen, zonder positieve cache. Ontbrekende of afwijkende cataloguscontrole, transportfout of deadline geeft503 mail_concept_schema_onbeschikbaar vóór domein/providerstart. Dit is uitsluitend een schemapoort en geen bewijs dat tenantpurge of productie is vrijgegeven. Een andere sleutel mag ook bij dezelfde actor geen ontvangst overnemen. Geen ontvanger, afzender, mailtekst, providerpad of URL in de aanvraag; ontvangst bevat geen inhoud of provideridentiteit. Expliciet stoppen geeft HTTP200 met de actuele ontvangst, ook als die al aangemaakt is. Gestopt blijft herstelplichtig. Houdt nieuwe providerstart tegen bij de laatste controle; annuleert geen reeds lopend HTTP-verzoek en verwijdert geen providerconcept. Een later bewezen providerantwoord kan alsnog aangemaakt opleveren. Stoppen blijft na verlopen proefperiode toegestaan en verleent geen recht op nieuwe conceptaanmaak.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MailboxConceptOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "berichten:verzenden"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/mailConcepten.js",
          "server/lib/mailConceptIntent.js",
          "server/lib/mailReadiness.js",
          "server/rapportly_api.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/klantrechten.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MailboxConceptStoppen"
              }
            }
          }
        },
        "x-bronref": "25aa00db",
        "x-query-aanvullingen-toegestaan": false
      }
    },
    "/v1/gesprekken/{id}/taalbeleid": {
      "get": {
        "operationId": "brontaal_gesprek_lezen",
        "summary": "brontaal gesprek lezen",
        "description": "Geen queryparameters. Huidige sleutel, actor/organisatie en bron-/klantrechten blijven vereist. basis bindt broninhoud, kantoorvoorkeur en policyversie. Ontbrekende opgeslagen uitkomstkeuzes worden expliciet off. Rapport heeft report/coverLetter; gesprek heeft conversationReport/customerEmail/followUpEmail. Geen primaire taalwijziging via deze route. Lees voorkeuren zonder productie te starten. Een huidige bronpoort kan ook voor beleid weigeren wanneer de bron niet klaar/toegankelijk is.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BronTaalBeleid_conversation"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige bron-UUID; de route maskeert niet-taalproductiecode als taalproductie_onbeschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/taalvariantenSchrijven.js",
          "server/lib/uitvoer/workflowTaalContract.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/migrations/372_rapportly_workflow_uitvoering.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "45ad97fd",
        "x-query-aanvullingen-toegestaan": false
      },
      "patch": {
        "operationId": "brontaal_gesprek_wijzigen",
        "summary": "brontaal gesprek wijzigen",
        "description": "Geen queryparameters. Huidige sleutel, actor/organisatie en bron-/klantrechten blijven vereist. basis bindt broninhoud, kantoorvoorkeur en policyversie. Ontbrekende opgeslagen uitkomstkeuzes worden expliciet off. Rapport heeft report/coverLetter; gesprek heeft conversationReport/customerEmail/followUpEmail. Geen primaire taalwijziging via deze route. Bewaar uitsluitend de genoemde uitkomstkeuzes, modelvrij en zonder wachtrij of provider. Niet genoemde keuzes blijven behouden; inherit is een bewuste keuze voor kantoorbeleid. Gebruik actuele basis, policyVersion en vaste Idempotency-Key van8–128 veilige tekens. Native taalnormalisatie en actuele feature-/kantoor-/proefperiodepoorten blijven gelden. Exacte replay behoudt ontvangenPolicyVersion van de oorspronkelijke ontvangst maar retourneert huidige requestedSecondary, policyVersion en basis; changed ontbreekt dan. Nieuwe identieke voorkeur kan changed:false geven. Gewijzigde invoer met dezelfde sleutel409; echte versieconflict vereist opnieuw lezen. productiestart blijft altijd afzonderlijk en productie_gestart:false.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BronTaalOntvangst_conversation"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige bron-UUID; de route maskeert niet-taalproductiecode als taalproductie_onbeschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "voorkeuren:wijzigen",
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/taalvariantenSchrijven.js",
          "server/lib/uitvoer/workflowTaalContract.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/migrations/372_rapportly_workflow_uitvoering.sql"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke inputsubset: de native normalisatie accepteert ook null als inherit, hoofdletters/witruimte bij modus/taal en lege/null language bij niet-specific. De aanbevolen aanvraag gebruikt expliciete getypeerde keuzes."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "secondary": {
                    "type": "object",
                    "properties": {
                      "conversationReport": {
                        "$ref": "#/components/schemas/BronTaalKeuze"
                      },
                      "customerEmail": {
                        "$ref": "#/components/schemas/BronTaalKeuze"
                      },
                      "followUpEmail": {
                        "$ref": "#/components/schemas/BronTaalKeuze"
                      }
                    },
                    "required": [],
                    "additionalProperties": false,
                    "minProperties": 1
                  },
                  "basis": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  },
                  "policyVersion": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 999999999
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "secondary",
                  "basis",
                  "policyVersion",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "x-bronref": "45ad97fd",
        "x-query-aanvullingen-toegestaan": false
      }
    },
    "/v1/rapporten/{id}/taalbeleid": {
      "get": {
        "operationId": "brontaal_rapport_lezen",
        "summary": "brontaal rapport lezen",
        "description": "Geen queryparameters. Huidige sleutel, actor/organisatie en bron-/klantrechten blijven vereist. basis bindt broninhoud, kantoorvoorkeur en policyversie. Ontbrekende opgeslagen uitkomstkeuzes worden expliciet off. Rapport heeft report/coverLetter; gesprek heeft conversationReport/customerEmail/followUpEmail. Geen primaire taalwijziging via deze route. Lees voorkeuren zonder productie te starten. Een huidige bronpoort kan ook voor beleid weigeren wanneer de bron niet klaar/toegankelijk is.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BronTaalBeleid_report"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige bron-UUID; de route maskeert niet-taalproductiecode als taalproductie_onbeschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/taalvariantenSchrijven.js",
          "server/lib/uitvoer/workflowTaalContract.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/migrations/372_rapportly_workflow_uitvoering.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "45ad97fd",
        "x-query-aanvullingen-toegestaan": false
      },
      "patch": {
        "operationId": "brontaal_rapport_wijzigen",
        "summary": "brontaal rapport wijzigen",
        "description": "Geen queryparameters. Huidige sleutel, actor/organisatie en bron-/klantrechten blijven vereist. basis bindt broninhoud, kantoorvoorkeur en policyversie. Ontbrekende opgeslagen uitkomstkeuzes worden expliciet off. Rapport heeft report/coverLetter; gesprek heeft conversationReport/customerEmail/followUpEmail. Geen primaire taalwijziging via deze route. Bewaar uitsluitend de genoemde uitkomstkeuzes, modelvrij en zonder wachtrij of provider. Niet genoemde keuzes blijven behouden; inherit is een bewuste keuze voor kantoorbeleid. Gebruik actuele basis, policyVersion en vaste Idempotency-Key van8–128 veilige tekens. Native taalnormalisatie en actuele feature-/kantoor-/proefperiodepoorten blijven gelden. Exacte replay behoudt ontvangenPolicyVersion van de oorspronkelijke ontvangst maar retourneert huidige requestedSecondary, policyVersion en basis; changed ontbreekt dan. Nieuwe identieke voorkeur kan changed:false geven. Gewijzigde invoer met dezelfde sleutel409; echte versieconflict vereist opnieuw lezen. productiestart blijft altijd afzonderlijk en productie_gestart:false.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BronTaalOntvangst_report"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige bron-UUID; de route maskeert niet-taalproductiecode als taalproductie_onbeschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "voorkeuren:wijzigen",
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/taalvariantenSchrijven.js",
          "server/lib/uitvoer/workflowTaalContract.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/migrations/372_rapportly_workflow_uitvoering.sql"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke inputsubset: de native normalisatie accepteert ook null als inherit, hoofdletters/witruimte bij modus/taal en lege/null language bij niet-specific. De aanbevolen aanvraag gebruikt expliciete getypeerde keuzes."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "secondary": {
                    "type": "object",
                    "properties": {
                      "report": {
                        "$ref": "#/components/schemas/BronTaalKeuze"
                      },
                      "coverLetter": {
                        "$ref": "#/components/schemas/BronTaalKeuze"
                      }
                    },
                    "required": [],
                    "additionalProperties": false,
                    "minProperties": 1
                  },
                  "basis": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  },
                  "policyVersion": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 999999999
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "secondary",
                  "basis",
                  "policyVersion",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "x-bronref": "45ad97fd",
        "x-query-aanvullingen-toegestaan": false
      }
    },
    "/v1/gesprekken/{id}/taalproductie": {
      "get": {
        "operationId": "taalproductie_gesprek_context",
        "summary": "taalproductie gesprek context",
        "description": "Lees huidige beschikbare uitkomsten en bronbasis. Rapportbasis bindt actuele revisie/renderidentiteit, opslagmetadata en eventuele workflowbrief; gesprekbasis bindt huidige opgeslagen teksten. Geen modelstart of budgetreservering. Geen queryparameters. Alleen actuele eigen actor/organisatie, oorspronkelijke sleutel en zichtbare bron; volledige-APIvrijgave en huidige rechten/plafond blijven vereist. Schrijven gebruikt8–128 veilige tekens in Idempotency-Key. Bewaar exact verzoek en sleutel voor antwoordverlies. Gewijzigde bron, actor, key, taalkeuze of workflowbinding geeft geen toestemming om een bestaande opdracht over te nemen. Native taalproducer, persoonlijke werkelijke kosten, reservering/afrekening en privacy blijven leidend. Geen vast of gratis tarief.  Alleen failed/refunded met ongewijzigde huidige bron/actor/key/parent. Zonder providerstart én zonder doelrapport kan de bestaande herstart nog produceren. Daarnaast kan een volledige gevalideerde rapport-/briefvertaling met definitief bewezen werkelijke afrekening privé bewaard zijn vóór render/upload/publicatie. Dan mag dezelfde opdracht en hetzelfde doelrapport uitsluitend renderen/uploaden/publiceren met dezelfde inhoud, catalogus en bevroren rendergegevens, zonder nieuwe provider of reservering. Een actieve canonieke rapportrevisie mag niet via dit herstel worden overschreven. De huidige sleutel, actor, bron, parent, kostenbewijs en proefperiode worden opnieuw gecontroleerd vóór herstel en publicatie. Een onbekende/ontbrekende of gedeeltelijk geslaagde provideruitkomst is geen complete receipt en geeft geen betaalde retry. Gesprek-, presentatie-, formulier-/offerte- en ongebonden legacyproductie vallen niet onder deze nieuwe inhoudreceipt. De nieuwe afzonderlijke betaalde uitkomstvervolguitbreiding uit 28d23f2e is uitgesloten van deze releasekandidaat. Releasekandidaat a2f438b8 met376-v2, geen productieactivering bewezen. Workflowtaalstart/herstart/hervatting vereist eerst het exacte volledige service-only taalouder-v2 readinessantwoord: herkomst_brongebonden, oudervrijgave en starts_vrijgegeven true; workflow_lifecycle bronlevensduur_202_260; klantplan bestaande_260_bevestiging; nieuwe_bewaartermijn en bulk_vrijgegeven false. Ontbrekend, oud, deels gesloten of onleesbaar schema geeft409 taalproductie_ouderretentie_niet_vrijgegeven vóór receipt/queue/provider. Geen automatische retry of andere key/route om dit te omzeilen. Daarna blijven workflow-/volledige-API-/tweede-taalvlaggen, trial/pakket, huidige oorspronkelijke key/actor/run/bronrechten, bronbasis en persoonlijke werkelijke kosten vereist. Context mogelijk:true is geen volledige starttoestemming. De bestaande202-expiry/archiefregel kan uitsluitend de volledige terminale en financieel afgeronde ouderketen overdragen naar brongebonden bewijs; broninhoud krijgt geen nieuwe bewaartermijn. Gearchiveerde opdrachten blijven gesloten voor productie/publicatie/wijziging met taalproductie_ouder_vervallen; oude replay maakt geen verdwenen run opnieuw aan. Blijvende API-herkomst verhindert native adoptie. De volledige bronketen blijft onder bestaande260/261-klantbevestiging, actuele fingerprint, holds, platformjobretentie en afzonderlijke opslagafronding vallen. Financiële ledgers/API-runhistorie worden niet gewist. Geen algemene accountpurger of nieuw retentiebesluit.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TaalProductieContext_conversation"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige route-UUID. De zelfstandige registrar maskeert de detailcode als taalproductie_onbeschikbaar; workflow behoudt validatie_mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/taalvariantenSchrijven.js",
          "server/lib/uitvoer/workflowTaalContract.js",
          "server/lib/uitvoer/taalProductieContext.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/jobs/tweedeUitvoertaal.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/migrations/372_rapportly_workflow_uitvoering.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "cfe078af",
        "x-query-aanvullingen-toegestaan": false,
        "x-aanvullende-bronnen": [
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/uitvoer/taalHerstelContract.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/vertaalRapport.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalRetentieReleasegrens.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalService.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowRunnerRoutes.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalContract.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/bulkTaalProductie.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImport.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImportOntvangst.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/376_rapportly_taal_ouderlevensduur.sql"
          }
        ]
      }
    },
    "/v1/rapporten/{id}/taalproductie": {
      "get": {
        "operationId": "taalproductie_rapport_context",
        "summary": "taalproductie rapport context",
        "description": "Lees huidige beschikbare uitkomsten en bronbasis. Rapportbasis bindt actuele revisie/renderidentiteit, opslagmetadata en eventuele workflowbrief; gesprekbasis bindt huidige opgeslagen teksten. Geen modelstart of budgetreservering. Geen queryparameters. Alleen actuele eigen actor/organisatie, oorspronkelijke sleutel en zichtbare bron; volledige-APIvrijgave en huidige rechten/plafond blijven vereist. Schrijven gebruikt8–128 veilige tekens in Idempotency-Key. Bewaar exact verzoek en sleutel voor antwoordverlies. Gewijzigde bron, actor, key, taalkeuze of workflowbinding geeft geen toestemming om een bestaande opdracht over te nemen. Native taalproducer, persoonlijke werkelijke kosten, reservering/afrekening en privacy blijven leidend. Geen vast of gratis tarief.  Alleen failed/refunded met ongewijzigde huidige bron/actor/key/parent. Zonder providerstart én zonder doelrapport kan de bestaande herstart nog produceren. Daarnaast kan een volledige gevalideerde rapport-/briefvertaling met definitief bewezen werkelijke afrekening privé bewaard zijn vóór render/upload/publicatie. Dan mag dezelfde opdracht en hetzelfde doelrapport uitsluitend renderen/uploaden/publiceren met dezelfde inhoud, catalogus en bevroren rendergegevens, zonder nieuwe provider of reservering. Een actieve canonieke rapportrevisie mag niet via dit herstel worden overschreven. De huidige sleutel, actor, bron, parent, kostenbewijs en proefperiode worden opnieuw gecontroleerd vóór herstel en publicatie. Een onbekende/ontbrekende of gedeeltelijk geslaagde provideruitkomst is geen complete receipt en geeft geen betaalde retry. Gesprek-, presentatie-, formulier-/offerte- en ongebonden legacyproductie vallen niet onder deze nieuwe inhoudreceipt. De nieuwe afzonderlijke betaalde uitkomstvervolguitbreiding uit 28d23f2e is uitgesloten van deze releasekandidaat. Releasekandidaat a2f438b8 met376-v2, geen productieactivering bewezen. Workflowtaalstart/herstart/hervatting vereist eerst het exacte volledige service-only taalouder-v2 readinessantwoord: herkomst_brongebonden, oudervrijgave en starts_vrijgegeven true; workflow_lifecycle bronlevensduur_202_260; klantplan bestaande_260_bevestiging; nieuwe_bewaartermijn en bulk_vrijgegeven false. Ontbrekend, oud, deels gesloten of onleesbaar schema geeft409 taalproductie_ouderretentie_niet_vrijgegeven vóór receipt/queue/provider. Geen automatische retry of andere key/route om dit te omzeilen. Daarna blijven workflow-/volledige-API-/tweede-taalvlaggen, trial/pakket, huidige oorspronkelijke key/actor/run/bronrechten, bronbasis en persoonlijke werkelijke kosten vereist. Context mogelijk:true is geen volledige starttoestemming. De bestaande202-expiry/archiefregel kan uitsluitend de volledige terminale en financieel afgeronde ouderketen overdragen naar brongebonden bewijs; broninhoud krijgt geen nieuwe bewaartermijn. Gearchiveerde opdrachten blijven gesloten voor productie/publicatie/wijziging met taalproductie_ouder_vervallen; oude replay maakt geen verdwenen run opnieuw aan. Blijvende API-herkomst verhindert native adoptie. De volledige bronketen blijft onder bestaande260/261-klantbevestiging, actuele fingerprint, holds, platformjobretentie en afzonderlijke opslagafronding vallen. Financiële ledgers/API-runhistorie worden niet gewist. Geen algemene accountpurger of nieuw retentiebesluit.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TaalProductieContext_report"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige route-UUID. De zelfstandige registrar maskeert de detailcode als taalproductie_onbeschikbaar; workflow behoudt validatie_mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/taalvariantenSchrijven.js",
          "server/lib/uitvoer/workflowTaalContract.js",
          "server/lib/uitvoer/taalProductieContext.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/jobs/tweedeUitvoertaal.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/migrations/372_rapportly_workflow_uitvoering.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "cfe078af",
        "x-query-aanvullingen-toegestaan": false,
        "x-aanvullende-bronnen": [
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/uitvoer/taalHerstelContract.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/vertaalRapport.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalRetentieReleasegrens.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalService.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowRunnerRoutes.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalContract.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/bulkTaalProductie.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImport.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImportOntvangst.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/376_rapportly_taal_ouderlevensduur.sql"
          }
        ]
      }
    },
    "/v1/taalopdrachten/{opdrachtId}": {
      "get": {
        "operationId": "gebonden_taalopdracht_lezen",
        "summary": "gebonden taalopdracht lezen",
        "description": "Lees eigen gebonden opdracht. Historische legacytaalopdrachten zijn geen ontvangst in deze route. Resultaatinhoud gebruikt de afzonderlijke bestaande taalvariantGET; rapportdownload vereist opnieuw eigen rapportrechten. Een gewijzigd bronbasis wordt expliciet als bron_gewijzigd gemeld. Geen queryparameters. Alleen actuele eigen actor/organisatie, oorspronkelijke sleutel en zichtbare bron; volledige-APIvrijgave en huidige rechten/plafond blijven vereist. Schrijven gebruikt8–128 veilige tekens in Idempotency-Key. Bewaar exact verzoek en sleutel voor antwoordverlies. Gewijzigde bron, actor, key, taalkeuze of workflowbinding geeft geen toestemming om een bestaande opdracht over te nemen. Native taalproducer, persoonlijke werkelijke kosten, reservering/afrekening en privacy blijven leidend. Geen vast of gratis tarief.  Alleen failed/refunded met ongewijzigde huidige bron/actor/key/parent. Zonder providerstart én zonder doelrapport kan de bestaande herstart nog produceren. Daarnaast kan een volledige gevalideerde rapport-/briefvertaling met definitief bewezen werkelijke afrekening privé bewaard zijn vóór render/upload/publicatie. Dan mag dezelfde opdracht en hetzelfde doelrapport uitsluitend renderen/uploaden/publiceren met dezelfde inhoud, catalogus en bevroren rendergegevens, zonder nieuwe provider of reservering. Een actieve canonieke rapportrevisie mag niet via dit herstel worden overschreven. De huidige sleutel, actor, bron, parent, kostenbewijs en proefperiode worden opnieuw gecontroleerd vóór herstel en publicatie. Een onbekende/ontbrekende of gedeeltelijk geslaagde provideruitkomst is geen complete receipt en geeft geen betaalde retry. Gesprek-, presentatie-, formulier-/offerte- en ongebonden legacyproductie vallen niet onder deze nieuwe inhoudreceipt. De nieuwe afzonderlijke betaalde uitkomstvervolguitbreiding uit 28d23f2e is uitgesloten van deze releasekandidaat. Releasekandidaat a2f438b8 met376-v2, geen productieactivering bewezen. Workflowtaalstart/herstart/hervatting vereist eerst het exacte volledige service-only taalouder-v2 readinessantwoord: herkomst_brongebonden, oudervrijgave en starts_vrijgegeven true; workflow_lifecycle bronlevensduur_202_260; klantplan bestaande_260_bevestiging; nieuwe_bewaartermijn en bulk_vrijgegeven false. Ontbrekend, oud, deels gesloten of onleesbaar schema geeft409 taalproductie_ouderretentie_niet_vrijgegeven vóór receipt/queue/provider. Geen automatische retry of andere key/route om dit te omzeilen. Daarna blijven workflow-/volledige-API-/tweede-taalvlaggen, trial/pakket, huidige oorspronkelijke key/actor/run/bronrechten, bronbasis en persoonlijke werkelijke kosten vereist. Context mogelijk:true is geen volledige starttoestemming. De bestaande202-expiry/archiefregel kan uitsluitend de volledige terminale en financieel afgeronde ouderketen overdragen naar brongebonden bewijs; broninhoud krijgt geen nieuwe bewaartermijn. Gearchiveerde opdrachten blijven gesloten voor productie/publicatie/wijziging met taalproductie_ouder_vervallen; oude replay maakt geen verdwenen run opnieuw aan. Blijvende API-herkomst verhindert native adoptie. De volledige bronketen blijft onder bestaande260/261-klantbevestiging, actuele fingerprint, holds, platformjobretentie en afzonderlijke opslagafronding vallen. Financiële ledgers/API-runhistorie worden niet gewist. Geen algemene accountpurger of nieuw retentiebesluit.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "opdrachtId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GebondenTaalOpdracht"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige route-UUID. De zelfstandige registrar maskeert de detailcode als taalproductie_onbeschikbaar; workflow behoudt validatie_mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/taalvariantenSchrijven.js",
          "server/lib/uitvoer/workflowTaalContract.js",
          "server/lib/uitvoer/taalProductieContext.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/jobs/tweedeUitvoertaal.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/migrations/372_rapportly_workflow_uitvoering.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "cfe078af",
        "x-query-aanvullingen-toegestaan": false,
        "x-aanvullende-bronnen": [
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/uitvoer/taalHerstelContract.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/vertaalRapport.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalRetentieReleasegrens.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalService.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowRunnerRoutes.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalContract.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/bulkTaalProductie.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImport.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImportOntvangst.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/376_rapportly_taal_ouderlevensduur.sql"
          }
        ]
      }
    },
    "/v1/taalvarianten/{opdrachtId}/retry": {
      "post": {
        "operationId": "gebonden_taalopdracht_herstart",
        "summary": "gebonden taalopdracht herstart",
        "description": "Bewuste herstart met eigen idempotentiesleutel en huidige opdrachtbasis/versie. HTTP202 geeft de huidige opdracht met herhaald. Alleen failed/refunded met ongewijzigde huidige bron/actor/key/parent. Zonder providerstart én zonder doelrapport kan de bestaande herstart nog produceren. Daarnaast kan een volledige gevalideerde rapport-/briefvertaling met definitief bewezen werkelijke afrekening privé bewaard zijn vóór render/upload/publicatie. Dan mag dezelfde opdracht en hetzelfde doelrapport uitsluitend renderen/uploaden/publiceren met dezelfde inhoud, catalogus en bevroren rendergegevens, zonder nieuwe provider of reservering. Een actieve canonieke rapportrevisie mag niet via dit herstel worden overschreven. De huidige sleutel, actor, bron, parent, kostenbewijs en proefperiode worden opnieuw gecontroleerd vóór herstel en publicatie. Een onbekende/ontbrekende of gedeeltelijk geslaagde provideruitkomst is geen complete receipt en geeft geen betaalde retry. Gesprek-, presentatie-, formulier-/offerte- en ongebonden legacyproductie vallen niet onder deze nieuwe inhoudreceipt. De nieuwe afzonderlijke betaalde uitkomstvervolguitbreiding uit 28d23f2e is uitgesloten van deze releasekandidaat. Geen queryparameters. Alleen actuele eigen actor/organisatie, oorspronkelijke sleutel en zichtbare bron; volledige-APIvrijgave en huidige rechten/plafond blijven vereist. Schrijven gebruikt8–128 veilige tekens in Idempotency-Key. Bewaar exact verzoek en sleutel voor antwoordverlies. Gewijzigde bron, actor, key, taalkeuze of workflowbinding geeft geen toestemming om een bestaande opdracht over te nemen. Native taalproducer, persoonlijke werkelijke kosten, reservering/afrekening en privacy blijven leidend. Geen vast of gratis tarief.  Releasekandidaat a2f438b8 met376-v2, geen productieactivering bewezen. Workflowtaalstart/herstart/hervatting vereist eerst het exacte volledige service-only taalouder-v2 readinessantwoord: herkomst_brongebonden, oudervrijgave en starts_vrijgegeven true; workflow_lifecycle bronlevensduur_202_260; klantplan bestaande_260_bevestiging; nieuwe_bewaartermijn en bulk_vrijgegeven false. Ontbrekend, oud, deels gesloten of onleesbaar schema geeft409 taalproductie_ouderretentie_niet_vrijgegeven vóór receipt/queue/provider. Geen automatische retry of andere key/route om dit te omzeilen. Daarna blijven workflow-/volledige-API-/tweede-taalvlaggen, trial/pakket, huidige oorspronkelijke key/actor/run/bronrechten, bronbasis en persoonlijke werkelijke kosten vereist. Context mogelijk:true is geen volledige starttoestemming. De bestaande202-expiry/archiefregel kan uitsluitend de volledige terminale en financieel afgeronde ouderketen overdragen naar brongebonden bewijs; broninhoud krijgt geen nieuwe bewaartermijn. Gearchiveerde opdrachten blijven gesloten voor productie/publicatie/wijziging met taalproductie_ouder_vervallen; oude replay maakt geen verdwenen run opnieuw aan. Blijvende API-herkomst verhindert native adoptie. De volledige bronketen blijft onder bestaande260/261-klantbevestiging, actuele fingerprint, holds, platformjobretentie en afzonderlijke opslagafronding vallen. Financiële ledgers/API-runhistorie worden niet gewist. Geen algemene accountpurger of nieuw retentiebesluit.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "opdrachtId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GebondenTaalOpdrachtOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken. Schema niet vrijgegeven: taalproductie_ouderretentie_niet_vrijgegeven. Gearchiveerde workflowherkomst: taalproductie_ouder_vervallen. Huidige basis-/versie-/replayconflicten blijven gelden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige route-UUID. De zelfstandige registrar maskeert de detailcode als taalproductie_onbeschikbaar; workflow behoudt validatie_mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "verwerkingen:starten",
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/taalvariantenSchrijven.js",
          "server/lib/uitvoer/workflowTaalContract.js",
          "server/lib/uitvoer/taalProductieContext.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/jobs/tweedeUitvoertaal.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/migrations/372_rapportly_workflow_uitvoering.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TaalProductieMutatie"
              }
            }
          }
        },
        "x-bronref": "cfe078af",
        "x-query-aanvullingen-toegestaan": false,
        "x-aanvullende-bronnen": [
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/uitvoer/taalHerstelContract.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/vertaalRapport.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalRetentieReleasegrens.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalService.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowRunnerRoutes.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalContract.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/bulkTaalProductie.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImport.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImportOntvangst.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/376_rapportly_taal_ouderlevensduur.sql"
          }
        ]
      }
    },
    "/v1/workflowruns/{runId}/taalproductie": {
      "get": {
        "operationId": "workflowtaal_context",
        "summary": "workflowtaal context",
        "description": "Lees huidige eigen workflowrun plus maximaal50 nieuwste eigen taalopdrachten. Ondersteund canoniek klaar rapport geeft mogelijk:true, blokkade:null, gecombineerde basis, bron en opdrachten_meer. Niet klaar of niet ondersteund geeft mogelijk:false, expliciete blokkade en basis:null zonder bron. Geen paginering of interne key-ID. Gebruik bij start context.basis plus run.versie; bij opdrachtbesturing de opdrachtbasis en opdrachtversie. Releasekandidaat a2f438b8 met376-v2, geen productieactivering bewezen. Workflowtaalstart/herstart/hervatting vereist eerst het exacte volledige service-only taalouder-v2 readinessantwoord: herkomst_brongebonden, oudervrijgave en starts_vrijgegeven true; workflow_lifecycle bronlevensduur_202_260; klantplan bestaande_260_bevestiging; nieuwe_bewaartermijn en bulk_vrijgegeven false. Ontbrekend, oud, deels gesloten of onleesbaar schema geeft409 taalproductie_ouderretentie_niet_vrijgegeven vóór receipt/queue/provider. Geen automatische retry of andere key/route om dit te omzeilen. Daarna blijven workflow-/volledige-API-/tweede-taalvlaggen, trial/pakket, huidige oorspronkelijke key/actor/run/bronrechten, bronbasis en persoonlijke werkelijke kosten vereist. Context mogelijk:true is geen volledige starttoestemming. De bestaande202-expiry/archiefregel kan uitsluitend de volledige terminale en financieel afgeronde ouderketen overdragen naar brongebonden bewijs; broninhoud krijgt geen nieuwe bewaartermijn. Gearchiveerde opdrachten blijven gesloten voor productie/publicatie/wijziging met taalproductie_ouder_vervallen; oude replay maakt geen verdwenen run opnieuw aan. Blijvende API-herkomst verhindert native adoptie. De volledige bronketen blijft onder bestaande260/261-klantbevestiging, actuele fingerprint, holds, platformjobretentie en afzonderlijke opslagafronding vallen. Financiële ledgers/API-runhistorie worden niet gewist. Geen algemene accountpurger of nieuw retentiebesluit.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "runId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkflowTaalContext"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige route-UUID. De zelfstandige registrar maskeert de detailcode als taalproductie_onbeschikbaar; workflow behoudt validatie_mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/taalvariantenSchrijven.js",
          "server/lib/uitvoer/workflowTaalContract.js",
          "server/lib/uitvoer/taalProductieContext.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/jobs/tweedeUitvoertaal.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/migrations/372_rapportly_workflow_uitvoering.sql",
          "server/lib/uitvoer/workflowTaalService.js",
          "server/lib/uitvoer/workflowRunnerRoutes.js",
          "server/lib/uitvoer/rapportOpslag.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "cfe078af",
        "x-query-aanvullingen-toegestaan": false,
        "x-aanvullende-bronnen": [
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/uitvoer/taalHerstelContract.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/vertaalRapport.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalRetentieReleasegrens.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalService.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowRunnerRoutes.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalContract.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/bulkTaalProductie.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImport.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImportOntvangst.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/376_rapportly_taal_ouderlevensduur.sql"
          }
        ],
        "x-release-status": "releasekandidaat; volledige376-v2-readiness en activering afzonderlijk vereist"
      }
    },
    "/v1/workflowruns/{runId}/taalvarianten": {
      "post": {
        "operationId": "workflowtaal_start",
        "summary": "workflowtaal start",
        "description": "Bewuste betaalde vervolgstap ná een canoniek klare run. Gebruik de gecombineerde contextbasis plus run.versie, niet de losse bronbasis. Keuze report/coverLetter en concrete taal; actuele rechten op oorspronkelijke run en bron blijven vereist. HTTP200 geeft huidige opdrachtstatus met herhaald; geen statusUrl. Gebruikerssessie en API delen domeinbediening, maar een sessie verwijdert nooit de oorspronkelijke API-key uit autorisatie/kostenketen. Taalproductie is geen nieuwe hoofdrun of mailactie. Geen queryparameters. Alleen actuele eigen actor/organisatie, oorspronkelijke sleutel en zichtbare bron; volledige-APIvrijgave en huidige rechten/plafond blijven vereist. Schrijven gebruikt8–128 veilige tekens in Idempotency-Key. Bewaar exact verzoek en sleutel voor antwoordverlies. Gewijzigde bron, actor, key, taalkeuze of workflowbinding geeft geen toestemming om een bestaande opdracht over te nemen. Native taalproducer, persoonlijke werkelijke kosten, reservering/afrekening en privacy blijven leidend. Geen vast of gratis tarief.  Releasekandidaat a2f438b8 met376-v2, geen productieactivering bewezen. Workflowtaalstart/herstart/hervatting vereist eerst het exacte volledige service-only taalouder-v2 readinessantwoord: herkomst_brongebonden, oudervrijgave en starts_vrijgegeven true; workflow_lifecycle bronlevensduur_202_260; klantplan bestaande_260_bevestiging; nieuwe_bewaartermijn en bulk_vrijgegeven false. Ontbrekend, oud, deels gesloten of onleesbaar schema geeft409 taalproductie_ouderretentie_niet_vrijgegeven vóór receipt/queue/provider. Geen automatische retry of andere key/route om dit te omzeilen. Daarna blijven workflow-/volledige-API-/tweede-taalvlaggen, trial/pakket, huidige oorspronkelijke key/actor/run/bronrechten, bronbasis en persoonlijke werkelijke kosten vereist. Context mogelijk:true is geen volledige starttoestemming. De bestaande202-expiry/archiefregel kan uitsluitend de volledige terminale en financieel afgeronde ouderketen overdragen naar brongebonden bewijs; broninhoud krijgt geen nieuwe bewaartermijn. Gearchiveerde opdrachten blijven gesloten voor productie/publicatie/wijziging met taalproductie_ouder_vervallen; oude replay maakt geen verdwenen run opnieuw aan. Blijvende API-herkomst verhindert native adoptie. De volledige bronketen blijft onder bestaande260/261-klantbevestiging, actuele fingerprint, holds, platformjobretentie en afzonderlijke opslagafronding vallen. Financiële ledgers/API-runhistorie worden niet gewist. Geen algemene accountpurger of nieuw retentiebesluit.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "runId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GebondenTaalOpdrachtOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "Idempotency-Replayed": {
                "schema": {
                  "const": "true"
                },
                "description": "Alleen bij herhaald:true; de antwoordvelden tonen huidige opdrachtstatus."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken. Schema niet vrijgegeven: taalproductie_ouderretentie_niet_vrijgegeven. Gearchiveerde workflowherkomst: taalproductie_ouder_vervallen. Huidige basis-/versie-/replayconflicten blijven gelden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige route-UUID. De zelfstandige registrar maskeert de detailcode als taalproductie_onbeschikbaar; workflow behoudt validatie_mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "workflows:beheren",
          "resultaten:lezen",
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/taalvariantenSchrijven.js",
          "server/lib/uitvoer/workflowTaalContract.js",
          "server/lib/uitvoer/taalProductieContext.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/jobs/tweedeUitvoertaal.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/migrations/372_rapportly_workflow_uitvoering.sql",
          "server/lib/uitvoer/workflowTaalService.js",
          "server/lib/uitvoer/workflowRunnerRoutes.js",
          "server/lib/uitvoer/rapportOpslag.js"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke taalinput: gebruik een kleine taalcode van twee of drie letters. De normalisator accepteert ook hoofdletters en omliggende witruimte; die ruimere invoer is niet als aanbevolen vorm beschreven."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "language": {
                    "type": "string",
                    "pattern": "^[a-z]{2,3}$"
                  },
                  "outcomes": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "report",
                        "coverLetter"
                      ]
                    },
                    "minItems": 1,
                    "maxItems": 2,
                    "uniqueItems": true
                  },
                  "basis": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  },
                  "bevestigd": {
                    "const": true
                  },
                  "versie": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 9007199254740991
                  }
                },
                "required": [
                  "language",
                  "outcomes",
                  "basis",
                  "bevestigd",
                  "versie"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "x-bronref": "cfe078af",
        "x-query-aanvullingen-toegestaan": false,
        "x-aanvullende-bronnen": [
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalRetentieReleasegrens.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalService.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowRunnerRoutes.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalContract.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/bulkTaalProductie.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImport.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImportOntvangst.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/376_rapportly_taal_ouderlevensduur.sql"
          }
        ],
        "x-release-status": "releasekandidaat; volledige376-v2-readiness en activering afzonderlijk vereist"
      }
    },
    "/v1/workflowruns/{runId}/taalopdrachten/{opdrachtId}": {
      "get": {
        "operationId": "workflowtaal_status",
        "summary": "workflowtaal status",
        "description": "Lees uitsluitend de opdracht die werkelijk bij deze eigen workflowrun hoort. besturing en verwerkingstatus zijn afzonderlijk; bron_gewijzigd/workflow_gewijzigd geven huidige afwijkingen. Geen inhoud of providerclaims. Geen queryparameters. Alleen actuele eigen actor/organisatie, oorspronkelijke sleutel en zichtbare bron; volledige-APIvrijgave en huidige rechten/plafond blijven vereist. Schrijven gebruikt8–128 veilige tekens in Idempotency-Key. Bewaar exact verzoek en sleutel voor antwoordverlies. Gewijzigde bron, actor, key, taalkeuze of workflowbinding geeft geen toestemming om een bestaande opdracht over te nemen. Native taalproducer, persoonlijke werkelijke kosten, reservering/afrekening en privacy blijven leidend. Geen vast of gratis tarief.  Alleen failed/refunded met ongewijzigde huidige bron/actor/key/parent. Zonder providerstart én zonder doelrapport kan de bestaande herstart nog produceren. Daarnaast kan een volledige gevalideerde rapport-/briefvertaling met definitief bewezen werkelijke afrekening privé bewaard zijn vóór render/upload/publicatie. Dan mag dezelfde opdracht en hetzelfde doelrapport uitsluitend renderen/uploaden/publiceren met dezelfde inhoud, catalogus en bevroren rendergegevens, zonder nieuwe provider of reservering. Een actieve canonieke rapportrevisie mag niet via dit herstel worden overschreven. De huidige sleutel, actor, bron, parent, kostenbewijs en proefperiode worden opnieuw gecontroleerd vóór herstel en publicatie. Een onbekende/ontbrekende of gedeeltelijk geslaagde provideruitkomst is geen complete receipt en geeft geen betaalde retry. Gesprek-, presentatie-, formulier-/offerte- en ongebonden legacyproductie vallen niet onder deze nieuwe inhoudreceipt. De nieuwe afzonderlijke betaalde uitkomstvervolguitbreiding uit 28d23f2e is uitgesloten van deze releasekandidaat. Releasekandidaat a2f438b8 met376-v2, geen productieactivering bewezen. Workflowtaalstart/herstart/hervatting vereist eerst het exacte volledige service-only taalouder-v2 readinessantwoord: herkomst_brongebonden, oudervrijgave en starts_vrijgegeven true; workflow_lifecycle bronlevensduur_202_260; klantplan bestaande_260_bevestiging; nieuwe_bewaartermijn en bulk_vrijgegeven false. Ontbrekend, oud, deels gesloten of onleesbaar schema geeft409 taalproductie_ouderretentie_niet_vrijgegeven vóór receipt/queue/provider. Geen automatische retry of andere key/route om dit te omzeilen. Daarna blijven workflow-/volledige-API-/tweede-taalvlaggen, trial/pakket, huidige oorspronkelijke key/actor/run/bronrechten, bronbasis en persoonlijke werkelijke kosten vereist. Context mogelijk:true is geen volledige starttoestemming. De bestaande202-expiry/archiefregel kan uitsluitend de volledige terminale en financieel afgeronde ouderketen overdragen naar brongebonden bewijs; broninhoud krijgt geen nieuwe bewaartermijn. Gearchiveerde opdrachten blijven gesloten voor productie/publicatie/wijziging met taalproductie_ouder_vervallen; oude replay maakt geen verdwenen run opnieuw aan. Blijvende API-herkomst verhindert native adoptie. De volledige bronketen blijft onder bestaande260/261-klantbevestiging, actuele fingerprint, holds, platformjobretentie en afzonderlijke opslagafronding vallen. Financiële ledgers/API-runhistorie worden niet gewist. Geen algemene accountpurger of nieuw retentiebesluit.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "runId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "opdrachtId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GebondenTaalOpdracht"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige route-UUID. De zelfstandige registrar maskeert de detailcode als taalproductie_onbeschikbaar; workflow behoudt validatie_mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/taalvariantenSchrijven.js",
          "server/lib/uitvoer/workflowTaalContract.js",
          "server/lib/uitvoer/taalProductieContext.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/jobs/tweedeUitvoertaal.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/migrations/372_rapportly_workflow_uitvoering.sql",
          "server/lib/uitvoer/workflowTaalService.js",
          "server/lib/uitvoer/workflowRunnerRoutes.js",
          "server/lib/uitvoer/rapportOpslag.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "cfe078af",
        "x-query-aanvullingen-toegestaan": false,
        "x-aanvullende-bronnen": [
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/uitvoer/taalHerstelContract.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/vertaalRapport.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalRetentieReleasegrens.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalService.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowRunnerRoutes.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalContract.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/bulkTaalProductie.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImport.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImportOntvangst.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/376_rapportly_taal_ouderlevensduur.sql"
          }
        ],
        "x-release-status": "releasekandidaat; volledige376-v2-readiness en activering afzonderlijk vereist"
      }
    },
    "/v1/workflowruns/{runId}/taalopdrachten/{opdrachtId}/herstart": {
      "post": {
        "operationId": "workflowtaal_herstart",
        "summary": "workflowtaal herstart",
        "description": "Gebruik huidige opdrachtbasis en opdrachtversie, niet de runversie. HTTP200 geeft actuele status; exact herhalen geeft herhaald:true. Eigen herstelverzoek op dezelfde run/opdracht. Alleen failed/refunded met ongewijzigde huidige bron/actor/key/parent. Zonder providerstart én zonder doelrapport kan de bestaande herstart nog produceren. Daarnaast kan een volledige gevalideerde rapport-/briefvertaling met definitief bewezen werkelijke afrekening privé bewaard zijn vóór render/upload/publicatie. Dan mag dezelfde opdracht en hetzelfde doelrapport uitsluitend renderen/uploaden/publiceren met dezelfde inhoud, catalogus en bevroren rendergegevens, zonder nieuwe provider of reservering. Een actieve canonieke rapportrevisie mag niet via dit herstel worden overschreven. De huidige sleutel, actor, bron, parent, kostenbewijs en proefperiode worden opnieuw gecontroleerd vóór herstel en publicatie. Een onbekende/ontbrekende of gedeeltelijk geslaagde provideruitkomst is geen complete receipt en geeft geen betaalde retry. Gesprek-, presentatie-, formulier-/offerte- en ongebonden legacyproductie vallen niet onder deze nieuwe inhoudreceipt. De nieuwe afzonderlijke betaalde uitkomstvervolguitbreiding uit 28d23f2e is uitgesloten van deze releasekandidaat. Geen queryparameters. Alleen actuele eigen actor/organisatie, oorspronkelijke sleutel en zichtbare bron; volledige-APIvrijgave en huidige rechten/plafond blijven vereist. Schrijven gebruikt8–128 veilige tekens in Idempotency-Key. Bewaar exact verzoek en sleutel voor antwoordverlies. Gewijzigde bron, actor, key, taalkeuze of workflowbinding geeft geen toestemming om een bestaande opdracht over te nemen. Native taalproducer, persoonlijke werkelijke kosten, reservering/afrekening en privacy blijven leidend. Geen vast of gratis tarief.  Releasekandidaat a2f438b8 met376-v2, geen productieactivering bewezen. Workflowtaalstart/herstart/hervatting vereist eerst het exacte volledige service-only taalouder-v2 readinessantwoord: herkomst_brongebonden, oudervrijgave en starts_vrijgegeven true; workflow_lifecycle bronlevensduur_202_260; klantplan bestaande_260_bevestiging; nieuwe_bewaartermijn en bulk_vrijgegeven false. Ontbrekend, oud, deels gesloten of onleesbaar schema geeft409 taalproductie_ouderretentie_niet_vrijgegeven vóór receipt/queue/provider. Geen automatische retry of andere key/route om dit te omzeilen. Daarna blijven workflow-/volledige-API-/tweede-taalvlaggen, trial/pakket, huidige oorspronkelijke key/actor/run/bronrechten, bronbasis en persoonlijke werkelijke kosten vereist. Context mogelijk:true is geen volledige starttoestemming. De bestaande202-expiry/archiefregel kan uitsluitend de volledige terminale en financieel afgeronde ouderketen overdragen naar brongebonden bewijs; broninhoud krijgt geen nieuwe bewaartermijn. Gearchiveerde opdrachten blijven gesloten voor productie/publicatie/wijziging met taalproductie_ouder_vervallen; oude replay maakt geen verdwenen run opnieuw aan. Blijvende API-herkomst verhindert native adoptie. De volledige bronketen blijft onder bestaande260/261-klantbevestiging, actuele fingerprint, holds, platformjobretentie en afzonderlijke opslagafronding vallen. Financiële ledgers/API-runhistorie worden niet gewist. Geen algemene accountpurger of nieuw retentiebesluit.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "runId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "opdrachtId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GebondenTaalOpdrachtOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "Idempotency-Replayed": {
                "schema": {
                  "const": "true"
                },
                "description": "Alleen bij herhaald:true; de antwoordvelden tonen huidige opdrachtstatus."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken. Schema niet vrijgegeven: taalproductie_ouderretentie_niet_vrijgegeven. Gearchiveerde workflowherkomst: taalproductie_ouder_vervallen. Huidige basis-/versie-/replayconflicten blijven gelden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige route-UUID. De zelfstandige registrar maskeert de detailcode als taalproductie_onbeschikbaar; workflow behoudt validatie_mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "workflows:beheren",
          "resultaten:lezen",
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/taalvariantenSchrijven.js",
          "server/lib/uitvoer/workflowTaalContract.js",
          "server/lib/uitvoer/taalProductieContext.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/jobs/tweedeUitvoertaal.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/migrations/372_rapportly_workflow_uitvoering.sql",
          "server/lib/uitvoer/workflowTaalService.js",
          "server/lib/uitvoer/workflowRunnerRoutes.js",
          "server/lib/uitvoer/rapportOpslag.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TaalProductieMutatie"
              }
            }
          }
        },
        "x-bronref": "cfe078af",
        "x-query-aanvullingen-toegestaan": false,
        "x-aanvullende-bronnen": [
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/uitvoer/taalHerstelContract.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/vertaalRapport.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalRetentieReleasegrens.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalService.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowRunnerRoutes.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalContract.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/bulkTaalProductie.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImport.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImportOntvangst.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/376_rapportly_taal_ouderlevensduur.sql"
          }
        ],
        "x-release-status": "releasekandidaat; volledige376-v2-readiness en activering afzonderlijk vereist"
      }
    },
    "/v1/workflowruns/{runId}/taalopdrachten/{opdrachtId}/pauzeren": {
      "post": {
        "operationId": "workflowtaal_pauzeren",
        "summary": "workflowtaal pauzeren",
        "description": "Gebruik huidige opdrachtbasis en opdrachtversie, niet de runversie. HTTP200 geeft actuele status; exact herhalen geeft herhaald:true. Pauzeer uitsluitend een actieve, niet geslaagde opdracht. queued wordt failed met stopcode. Een reeds lopende provider houdt zijn lease voor kosten-/foutafrekening; volgende provider-/publicatiepoort blokkeert. Geen terugbetaling of onmiddellijke externe annulering. Na verlopen proefperiode toegestaan, overige rechten blijven vereist. Geen queryparameters. Alleen actuele eigen actor/organisatie, oorspronkelijke sleutel en zichtbare bron; volledige-APIvrijgave en huidige rechten/plafond blijven vereist. Schrijven gebruikt8–128 veilige tekens in Idempotency-Key. Bewaar exact verzoek en sleutel voor antwoordverlies. Gewijzigde bron, actor, key, taalkeuze of workflowbinding geeft geen toestemming om een bestaande opdracht over te nemen. Native taalproducer, persoonlijke werkelijke kosten, reservering/afrekening en privacy blijven leidend. Geen vast of gratis tarief.  Alleen failed/refunded met ongewijzigde huidige bron/actor/key/parent. Zonder providerstart én zonder doelrapport kan de bestaande herstart nog produceren. Daarnaast kan een volledige gevalideerde rapport-/briefvertaling met definitief bewezen werkelijke afrekening privé bewaard zijn vóór render/upload/publicatie. Dan mag dezelfde opdracht en hetzelfde doelrapport uitsluitend renderen/uploaden/publiceren met dezelfde inhoud, catalogus en bevroren rendergegevens, zonder nieuwe provider of reservering. Een actieve canonieke rapportrevisie mag niet via dit herstel worden overschreven. De huidige sleutel, actor, bron, parent, kostenbewijs en proefperiode worden opnieuw gecontroleerd vóór herstel en publicatie. Een onbekende/ontbrekende of gedeeltelijk geslaagde provideruitkomst is geen complete receipt en geeft geen betaalde retry. Gesprek-, presentatie-, formulier-/offerte- en ongebonden legacyproductie vallen niet onder deze nieuwe inhoudreceipt. De nieuwe afzonderlijke betaalde uitkomstvervolguitbreiding uit 28d23f2e is uitgesloten van deze releasekandidaat. Releasekandidaat a2f438b8 met376-v2, geen productieactivering bewezen. Workflowtaalstart/herstart/hervatting vereist eerst het exacte volledige service-only taalouder-v2 readinessantwoord: herkomst_brongebonden, oudervrijgave en starts_vrijgegeven true; workflow_lifecycle bronlevensduur_202_260; klantplan bestaande_260_bevestiging; nieuwe_bewaartermijn en bulk_vrijgegeven false. Ontbrekend, oud, deels gesloten of onleesbaar schema geeft409 taalproductie_ouderretentie_niet_vrijgegeven vóór receipt/queue/provider. Geen automatische retry of andere key/route om dit te omzeilen. Daarna blijven workflow-/volledige-API-/tweede-taalvlaggen, trial/pakket, huidige oorspronkelijke key/actor/run/bronrechten, bronbasis en persoonlijke werkelijke kosten vereist. Context mogelijk:true is geen volledige starttoestemming. De bestaande202-expiry/archiefregel kan uitsluitend de volledige terminale en financieel afgeronde ouderketen overdragen naar brongebonden bewijs; broninhoud krijgt geen nieuwe bewaartermijn. Gearchiveerde opdrachten blijven gesloten voor productie/publicatie/wijziging met taalproductie_ouder_vervallen; oude replay maakt geen verdwenen run opnieuw aan. Blijvende API-herkomst verhindert native adoptie. De volledige bronketen blijft onder bestaande260/261-klantbevestiging, actuele fingerprint, holds, platformjobretentie en afzonderlijke opslagafronding vallen. Financiële ledgers/API-runhistorie worden niet gewist. Geen algemene accountpurger of nieuw retentiebesluit.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "runId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "opdrachtId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GebondenTaalOpdrachtOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "Idempotency-Replayed": {
                "schema": {
                  "const": "true"
                },
                "description": "Alleen bij herhaald:true; de antwoordvelden tonen huidige opdrachtstatus."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige route-UUID. De zelfstandige registrar maskeert de detailcode als taalproductie_onbeschikbaar; workflow behoudt validatie_mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "workflows:beheren",
          "resultaten:lezen",
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/taalvariantenSchrijven.js",
          "server/lib/uitvoer/workflowTaalContract.js",
          "server/lib/uitvoer/taalProductieContext.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/jobs/tweedeUitvoertaal.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/migrations/372_rapportly_workflow_uitvoering.sql",
          "server/lib/uitvoer/workflowTaalService.js",
          "server/lib/uitvoer/workflowRunnerRoutes.js",
          "server/lib/uitvoer/rapportOpslag.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TaalProductieMutatie"
              }
            }
          }
        },
        "x-bronref": "cfe078af",
        "x-query-aanvullingen-toegestaan": false,
        "x-aanvullende-bronnen": [
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/uitvoer/taalHerstelContract.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/vertaalRapport.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalRetentieReleasegrens.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalService.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowRunnerRoutes.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalContract.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/bulkTaalProductie.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImport.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImportOntvangst.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/376_rapportly_taal_ouderlevensduur.sql"
          }
        ],
        "x-release-status": "releasekandidaat; volledige376-v2-readiness en activering afzonderlijk vereist"
      }
    },
    "/v1/workflowruns/{runId}/taalopdrachten/{opdrachtId}/hervatten": {
      "post": {
        "operationId": "workflowtaal_hervatten",
        "summary": "workflowtaal hervatten",
        "description": "Gebruik huidige opdrachtbasis en opdrachtversie, niet de runversie. HTTP200 geeft actuele status; exact herhalen geeft herhaald:true. Alleen gepauzeerd en failed/refunded; oorspronkelijke bron/run/key moeten nog geldig zijn. Alleen vóór provider zonder doelrapport of met volledig bewaard en afgerekend resultaat. Dan dezelfde opdracht queued; herstel uit de volledige privé-inhoudreceipt verhindert iedere nieuwe provider. Geen nieuwe claim op onbekende provideruitvoer. Trial/pakket/kostenmodus opnieuw vereist. Geen queryparameters. Alleen actuele eigen actor/organisatie, oorspronkelijke sleutel en zichtbare bron; volledige-APIvrijgave en huidige rechten/plafond blijven vereist. Schrijven gebruikt8–128 veilige tekens in Idempotency-Key. Bewaar exact verzoek en sleutel voor antwoordverlies. Gewijzigde bron, actor, key, taalkeuze of workflowbinding geeft geen toestemming om een bestaande opdracht over te nemen. Native taalproducer, persoonlijke werkelijke kosten, reservering/afrekening en privacy blijven leidend. Geen vast of gratis tarief.  Alleen failed/refunded met ongewijzigde huidige bron/actor/key/parent. Zonder providerstart én zonder doelrapport kan de bestaande herstart nog produceren. Daarnaast kan een volledige gevalideerde rapport-/briefvertaling met definitief bewezen werkelijke afrekening privé bewaard zijn vóór render/upload/publicatie. Dan mag dezelfde opdracht en hetzelfde doelrapport uitsluitend renderen/uploaden/publiceren met dezelfde inhoud, catalogus en bevroren rendergegevens, zonder nieuwe provider of reservering. Een actieve canonieke rapportrevisie mag niet via dit herstel worden overschreven. De huidige sleutel, actor, bron, parent, kostenbewijs en proefperiode worden opnieuw gecontroleerd vóór herstel en publicatie. Een onbekende/ontbrekende of gedeeltelijk geslaagde provideruitkomst is geen complete receipt en geeft geen betaalde retry. Gesprek-, presentatie-, formulier-/offerte- en ongebonden legacyproductie vallen niet onder deze nieuwe inhoudreceipt. De nieuwe afzonderlijke betaalde uitkomstvervolguitbreiding uit 28d23f2e is uitgesloten van deze releasekandidaat. Releasekandidaat a2f438b8 met376-v2, geen productieactivering bewezen. Workflowtaalstart/herstart/hervatting vereist eerst het exacte volledige service-only taalouder-v2 readinessantwoord: herkomst_brongebonden, oudervrijgave en starts_vrijgegeven true; workflow_lifecycle bronlevensduur_202_260; klantplan bestaande_260_bevestiging; nieuwe_bewaartermijn en bulk_vrijgegeven false. Ontbrekend, oud, deels gesloten of onleesbaar schema geeft409 taalproductie_ouderretentie_niet_vrijgegeven vóór receipt/queue/provider. Geen automatische retry of andere key/route om dit te omzeilen. Daarna blijven workflow-/volledige-API-/tweede-taalvlaggen, trial/pakket, huidige oorspronkelijke key/actor/run/bronrechten, bronbasis en persoonlijke werkelijke kosten vereist. Context mogelijk:true is geen volledige starttoestemming. De bestaande202-expiry/archiefregel kan uitsluitend de volledige terminale en financieel afgeronde ouderketen overdragen naar brongebonden bewijs; broninhoud krijgt geen nieuwe bewaartermijn. Gearchiveerde opdrachten blijven gesloten voor productie/publicatie/wijziging met taalproductie_ouder_vervallen; oude replay maakt geen verdwenen run opnieuw aan. Blijvende API-herkomst verhindert native adoptie. De volledige bronketen blijft onder bestaande260/261-klantbevestiging, actuele fingerprint, holds, platformjobretentie en afzonderlijke opslagafronding vallen. Financiële ledgers/API-runhistorie worden niet gewist. Geen algemene accountpurger of nieuw retentiebesluit.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "runId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "opdrachtId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GebondenTaalOpdrachtOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "Idempotency-Replayed": {
                "schema": {
                  "const": "true"
                },
                "description": "Alleen bij herhaald:true; de antwoordvelden tonen huidige opdrachtstatus."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken. Schema niet vrijgegeven: taalproductie_ouderretentie_niet_vrijgegeven. Gearchiveerde workflowherkomst: taalproductie_ouder_vervallen. Huidige basis-/versie-/replayconflicten blijven gelden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige route-UUID. De zelfstandige registrar maskeert de detailcode als taalproductie_onbeschikbaar; workflow behoudt validatie_mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "workflows:beheren",
          "resultaten:lezen",
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/taalvariantenSchrijven.js",
          "server/lib/uitvoer/workflowTaalContract.js",
          "server/lib/uitvoer/taalProductieContext.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/jobs/tweedeUitvoertaal.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/migrations/372_rapportly_workflow_uitvoering.sql",
          "server/lib/uitvoer/workflowTaalService.js",
          "server/lib/uitvoer/workflowRunnerRoutes.js",
          "server/lib/uitvoer/rapportOpslag.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TaalProductieMutatie"
              }
            }
          }
        },
        "x-bronref": "cfe078af",
        "x-query-aanvullingen-toegestaan": false,
        "x-aanvullende-bronnen": [
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/uitvoer/taalHerstelContract.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/vertaalRapport.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalRetentieReleasegrens.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalService.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowRunnerRoutes.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalContract.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/bulkTaalProductie.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImport.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImportOntvangst.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/376_rapportly_taal_ouderlevensduur.sql"
          }
        ],
        "x-release-status": "releasekandidaat; volledige376-v2-readiness en activering afzonderlijk vereist"
      }
    },
    "/v1/workflowruns/{runId}/taalopdrachten/{opdrachtId}/annuleren": {
      "post": {
        "operationId": "workflowtaal_annuleren",
        "summary": "workflowtaal annuleren",
        "description": "Gebruik huidige opdrachtbasis en opdrachtversie, niet de runversie. HTTP200 geeft actuele status; exact herhalen geeft herhaald:true. Definitief voor deze opdracht, uitsluitend zolang niet geslaagd of al geannuleerd. Blokkeert verdere provider/publicatie bij de poort, laat lopende kostenafrekening toe en wist geen historische inhoud. Na verlopen proefperiode toegestaan; geen recht op nieuwe verwerking. Geen queryparameters. Alleen actuele eigen actor/organisatie, oorspronkelijke sleutel en zichtbare bron; volledige-APIvrijgave en huidige rechten/plafond blijven vereist. Schrijven gebruikt8–128 veilige tekens in Idempotency-Key. Bewaar exact verzoek en sleutel voor antwoordverlies. Gewijzigde bron, actor, key, taalkeuze of workflowbinding geeft geen toestemming om een bestaande opdracht over te nemen. Native taalproducer, persoonlijke werkelijke kosten, reservering/afrekening en privacy blijven leidend. Geen vast of gratis tarief.  Alleen failed/refunded met ongewijzigde huidige bron/actor/key/parent. Zonder providerstart én zonder doelrapport kan de bestaande herstart nog produceren. Daarnaast kan een volledige gevalideerde rapport-/briefvertaling met definitief bewezen werkelijke afrekening privé bewaard zijn vóór render/upload/publicatie. Dan mag dezelfde opdracht en hetzelfde doelrapport uitsluitend renderen/uploaden/publiceren met dezelfde inhoud, catalogus en bevroren rendergegevens, zonder nieuwe provider of reservering. Een actieve canonieke rapportrevisie mag niet via dit herstel worden overschreven. De huidige sleutel, actor, bron, parent, kostenbewijs en proefperiode worden opnieuw gecontroleerd vóór herstel en publicatie. Een onbekende/ontbrekende of gedeeltelijk geslaagde provideruitkomst is geen complete receipt en geeft geen betaalde retry. Gesprek-, presentatie-, formulier-/offerte- en ongebonden legacyproductie vallen niet onder deze nieuwe inhoudreceipt. De nieuwe afzonderlijke betaalde uitkomstvervolguitbreiding uit 28d23f2e is uitgesloten van deze releasekandidaat. Releasekandidaat a2f438b8 met376-v2, geen productieactivering bewezen. Workflowtaalstart/herstart/hervatting vereist eerst het exacte volledige service-only taalouder-v2 readinessantwoord: herkomst_brongebonden, oudervrijgave en starts_vrijgegeven true; workflow_lifecycle bronlevensduur_202_260; klantplan bestaande_260_bevestiging; nieuwe_bewaartermijn en bulk_vrijgegeven false. Ontbrekend, oud, deels gesloten of onleesbaar schema geeft409 taalproductie_ouderretentie_niet_vrijgegeven vóór receipt/queue/provider. Geen automatische retry of andere key/route om dit te omzeilen. Daarna blijven workflow-/volledige-API-/tweede-taalvlaggen, trial/pakket, huidige oorspronkelijke key/actor/run/bronrechten, bronbasis en persoonlijke werkelijke kosten vereist. Context mogelijk:true is geen volledige starttoestemming. De bestaande202-expiry/archiefregel kan uitsluitend de volledige terminale en financieel afgeronde ouderketen overdragen naar brongebonden bewijs; broninhoud krijgt geen nieuwe bewaartermijn. Gearchiveerde opdrachten blijven gesloten voor productie/publicatie/wijziging met taalproductie_ouder_vervallen; oude replay maakt geen verdwenen run opnieuw aan. Blijvende API-herkomst verhindert native adoptie. De volledige bronketen blijft onder bestaande260/261-klantbevestiging, actuele fingerprint, holds, platformjobretentie en afzonderlijke opslagafronding vallen. Financiële ledgers/API-runhistorie worden niet gewist. Geen algemene accountpurger of nieuw retentiebesluit.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "runId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "opdrachtId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GebondenTaalOpdrachtOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "Idempotency-Replayed": {
                "schema": {
                  "const": "true"
                },
                "description": "Alleen bij herhaald:true; de antwoordvelden tonen huidige opdrachtstatus."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige route-UUID. De zelfstandige registrar maskeert de detailcode als taalproductie_onbeschikbaar; workflow behoudt validatie_mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "workflows:beheren",
          "resultaten:lezen",
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/taalvariantenSchrijven.js",
          "server/lib/uitvoer/workflowTaalContract.js",
          "server/lib/uitvoer/taalProductieContext.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/jobs/tweedeUitvoertaal.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/migrations/372_rapportly_workflow_uitvoering.sql",
          "server/lib/uitvoer/workflowTaalService.js",
          "server/lib/uitvoer/workflowRunnerRoutes.js",
          "server/lib/uitvoer/rapportOpslag.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TaalProductieMutatie"
              }
            }
          }
        },
        "x-bronref": "cfe078af",
        "x-query-aanvullingen-toegestaan": false,
        "x-aanvullende-bronnen": [
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/uitvoer/taalHerstelContract.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/vertaalRapport.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalRetentieReleasegrens.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalService.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowRunnerRoutes.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalContract.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/bulkTaalProductie.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImport.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImportOntvangst.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/376_rapportly_taal_ouderlevensduur.sql"
          }
        ],
        "x-release-status": "releasekandidaat; volledige376-v2-readiness en activering afzonderlijk vereist"
      }
    },
    "/v1/workflowruns/{runId}/taalopdrachten/{opdrachtId}/download/{formaat}": {
      "get": {
        "operationId": "workflowtaal_download",
        "summary": "workflowtaal download",
        "description": "Alleen succeeded met gebonden doelrapport en daadwerkelijk gevraagde report-uitkomst of coverLetter voor brief. Doel moet klaar, vertaling_van de juiste bron en in de opdrachttaal zijn. PDF/Word volgen huidige revisiepointer; PowerPoint met latere actieve revisie wordt geweigerd. Brief gebruikt vaste brief.md. Rechten en opdracht/padbinding worden na signing opnieuw gelezen. URL60seconden geldig, afzonderlijk downloaden zonder API-sleutel; er wordt geen nieuwe render gestart. Geen queryparameters. Alleen actuele eigen actor/organisatie, oorspronkelijke sleutel en zichtbare bron; volledige-APIvrijgave en huidige rechten/plafond blijven vereist. Schrijven gebruikt8–128 veilige tekens in Idempotency-Key. Bewaar exact verzoek en sleutel voor antwoordverlies. Gewijzigde bron, actor, key, taalkeuze of workflowbinding geeft geen toestemming om een bestaande opdracht over te nemen. Native taalproducer, persoonlijke werkelijke kosten, reservering/afrekening en privacy blijven leidend. Geen vast of gratis tarief.  Alleen failed/refunded met ongewijzigde huidige bron/actor/key/parent. Zonder providerstart én zonder doelrapport kan de bestaande herstart nog produceren. Daarnaast kan een volledige gevalideerde rapport-/briefvertaling met definitief bewezen werkelijke afrekening privé bewaard zijn vóór render/upload/publicatie. Dan mag dezelfde opdracht en hetzelfde doelrapport uitsluitend renderen/uploaden/publiceren met dezelfde inhoud, catalogus en bevroren rendergegevens, zonder nieuwe provider of reservering. Een actieve canonieke rapportrevisie mag niet via dit herstel worden overschreven. De huidige sleutel, actor, bron, parent, kostenbewijs en proefperiode worden opnieuw gecontroleerd vóór herstel en publicatie. Een onbekende/ontbrekende of gedeeltelijk geslaagde provideruitkomst is geen complete receipt en geeft geen betaalde retry. Gesprek-, presentatie-, formulier-/offerte- en ongebonden legacyproductie vallen niet onder deze nieuwe inhoudreceipt. De nieuwe afzonderlijke betaalde uitkomstvervolguitbreiding uit 28d23f2e is uitgesloten van deze releasekandidaat. Releasekandidaat a2f438b8 met376-v2, geen productieactivering bewezen. Workflowtaalstart/herstart/hervatting vereist eerst het exacte volledige service-only taalouder-v2 readinessantwoord: herkomst_brongebonden, oudervrijgave en starts_vrijgegeven true; workflow_lifecycle bronlevensduur_202_260; klantplan bestaande_260_bevestiging; nieuwe_bewaartermijn en bulk_vrijgegeven false. Ontbrekend, oud, deels gesloten of onleesbaar schema geeft409 taalproductie_ouderretentie_niet_vrijgegeven vóór receipt/queue/provider. Geen automatische retry of andere key/route om dit te omzeilen. Daarna blijven workflow-/volledige-API-/tweede-taalvlaggen, trial/pakket, huidige oorspronkelijke key/actor/run/bronrechten, bronbasis en persoonlijke werkelijke kosten vereist. Context mogelijk:true is geen volledige starttoestemming. De bestaande202-expiry/archiefregel kan uitsluitend de volledige terminale en financieel afgeronde ouderketen overdragen naar brongebonden bewijs; broninhoud krijgt geen nieuwe bewaartermijn. Gearchiveerde opdrachten blijven gesloten voor productie/publicatie/wijziging met taalproductie_ouder_vervallen; oude replay maakt geen verdwenen run opnieuw aan. Blijvende API-herkomst verhindert native adoptie. De volledige bronketen blijft onder bestaande260/261-klantbevestiging, actuele fingerprint, holds, platformjobretentie en afzonderlijke opslagafronding vallen. Financiële ledgers/API-runhistorie worden niet gewist. Geen algemene accountpurger of nieuw retentiebesluit.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "runId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "opdrachtId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "formaat",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "pdf",
                "docx",
                "pptx",
                "brief"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "opdracht_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "rapport_versie_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "language": {
                      "type": "string"
                    },
                    "formaat": {
                      "type": "string",
                      "enum": [
                        "pdf",
                        "docx",
                        "pptx",
                        "brief"
                      ]
                    },
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "geldig_seconden": {
                      "const": 60
                    }
                  },
                  "required": [
                    "opdracht_id",
                    "rapport_versie_id",
                    "language",
                    "formaat",
                    "url",
                    "geldig_seconden"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Ongeldige route-UUID. De zelfstandige registrar maskeert de detailcode als taalproductie_onbeschikbaar; workflow behoudt validatie_mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/taalvariantenSchrijven.js",
          "server/lib/uitvoer/workflowTaalContract.js",
          "server/lib/uitvoer/taalProductieContext.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/jobs/tweedeUitvoertaal.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/lib/uitvoer/kSnapshot.js",
          "server/migrations/372_rapportly_workflow_uitvoering.sql",
          "server/lib/uitvoer/workflowTaalService.js",
          "server/lib/uitvoer/workflowRunnerRoutes.js",
          "server/lib/uitvoer/rapportOpslag.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "cfe078af",
        "x-query-aanvullingen-toegestaan": false,
        "x-aanvullende-bronnen": [
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/uitvoer/taalHerstelContract.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/lib/vertaalRapport.js"
          },
          {
            "bronref": "5edf9824",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalRetentieReleasegrens.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalService.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowRunnerRoutes.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalContract.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/bulkTaalProductie.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImport.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImportOntvangst.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/376_rapportly_taal_ouderlevensduur.sql"
          }
        ],
        "x-release-status": "releasekandidaat; volledige376-v2-readiness en activering afzonderlijk vereist"
      }
    },
    "/v1/gesprekken/{id}/followup": {
      "get": {
        "operationId": "gesprek_followup_lezen",
        "summary": "gesprek followup lezen",
        "description": "Volledige-APIvrijgave en huidige actor/key/organisatie/object-/klantrechten vereist. Queryvelden hebben geen beschreven functie en worden door deze native handlers niet inhoudelijk gebruikt. Wijzigen is geen modelstart, mailgoedkeuring of verzending. Actiepunten oplopend op volgorde, alleen zichtbare punten; geen pagina of limiet. Mailbron is opgeslagen followup, anders eerste klantmail. Basis is followup_basis. Niet-klaar blijft200 met lege followup/punten. Volledige-APIbron- of actiepuntleesfout geeft500, geen stille legacylege lijst. Outbox is het afzonderlijke followupslot. Automatiseringsinstellingen kunnen bij leesfout terugvallen op veilige native conceptdefaults; dit is geen bewijs van werkelijk ingesteld beleid. Bij outbox ontbreken van de drie gevolgde tijdstippen kan nog de smallere projectie slagen. Geen opslagpaden of goedkeuringssnapshot.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GesprekFollowup"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/actiepuntMutaties.js",
          "server/lib/klantrechten.js",
          "server/lib/publiekeApi/registratie.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/migrations/169_rapportly_followup.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "cfe078af"
      },
      "put": {
        "operationId": "gesprek_followup_wijzigen",
        "summary": "gesprek followup wijzigen",
        "description": "Volledige-APIvrijgave en huidige actor/key/organisatie/object-/klantrechten vereist. Queryvelden hebben geen beschreven functie en worden door deze native handlers niet inhoudelijk gebruikt. Wijzigen is geen modelstart, mailgoedkeuring of verzending. Gebruik vaste Idempotency-Key8–128 en de gelezen basis per punt; mail vereist daarnaast de huidige followupbasis. Alleen mail, alleen minimaal één punt, of beide zijn mogelijk; maximaal100 verschillende punten per gesprek. Geen eigenaar/volgorde/klantwijziging. Deadline is echte kalenderdatum1000–9999 ofnull, geen lege string of datumcorrectie. Tekst maximaal500 en mail20000 Unicodecodepunten, zonder NUL en zonder stil afkappen. De hele SQLmutatie is atomisch; fout betekent geen gedeeltelijk bewaarde lijst. Exacte herhaling hercontroleert huidige toegang, bewaart dezelfde historische ontvangst en schrijft niet opnieuw. Topniveau basis en actiepunten tonen huidige rijen en kunnen verschillen van ontvangst. Puntlijsten zijn oplopend op ID, niet schermvolgorde. Gewijzigde invoer met dezelfde sleutel409; echte basisconflict409 vraagt herlezen. Geen bevestigdveld in deze body. Nieuwe wijziging vereist huidige proefperiode/pakket.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FollowupBewaard"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "actiepunten:beheren"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/actiepuntMutaties.js",
          "server/lib/klantrechten.js",
          "server/lib/publiekeApi/registratie.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/migrations/169_rapportly_followup.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FollowupWijziging"
              }
            }
          }
        },
        "x-bronref": "cfe078af"
      }
    },
    "/v1/actiepunten/{id}": {
      "patch": {
        "operationId": "actiepunt_wijzigen",
        "summary": "actiepunt wijzigen",
        "description": "Volledige-APIvrijgave en huidige actor/key/organisatie/object-/klantrechten vereist. Queryvelden hebben geen beschreven functie en worden door deze native handlers niet inhoudelijk gebruikt. Wijzigen is geen modelstart, mailgoedkeuring of verzending. Gebruik vaste Idempotency-Key8–128 en de gelezen basis per punt; mail vereist daarnaast de huidige followupbasis. Alleen mail, alleen minimaal één punt, of beide zijn mogelijk; maximaal100 verschillende punten per gesprek. Geen eigenaar/volgorde/klantwijziging. Deadline is echte kalenderdatum1000–9999 ofnull, geen lege string of datumcorrectie. Tekst maximaal500 en mail20000 Unicodecodepunten, zonder NUL en zonder stil afkappen. De hele SQLmutatie is atomisch; fout betekent geen gedeeltelijk bewaarde lijst. Exacte herhaling hercontroleert huidige toegang, bewaart dezelfde historische ontvangst en schrijft niet opnieuw. Topniveau basis en actiepunten tonen huidige rijen en kunnen verschillen van ontvangst. Puntlijsten zijn oplopend op ID, niet schermvolgorde. Gewijzigde invoer met dezelfde sleutel409; echte basisconflict409 vraagt herlezen. Geen bevestigdveld in deze body. Nieuwe wijziging vereist huidige proefperiode/pakket. PATCH bevat exact één punt; actiepunt en het enige item in actiepunten beschrijven dezelfde huidige rij.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ActiepuntBewaard"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "actiepunten:beheren"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/actiepuntMutaties.js",
          "server/lib/klantrechten.js",
          "server/lib/publiekeApi/registratie.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/migrations/169_rapportly_followup.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ActiepuntWijziging"
              }
            }
          }
        },
        "x-bronref": "cfe078af"
      }
    },
    "/v1/klanten/{id}/tijdlijn": {
      "get": {
        "operationId": "klantreacties_tijdlijn",
        "summary": "klantreacties tijdlijn",
        "description": "Lees zichtbare inkomende klantreacties en uitgaande mailmetadata. Maximaal200 nieuwste uitgaande en200 nieuwste inkomende rijen worden afzonderlijk geselecteerd; daarna zichtbaarheidfilter en gezamenlijke dalende tijdsortering. Geen cursor of volledige historieclaim. Globale schakelaar uit, organisatie-instelling uit/afwezig of ontbrekende instellingen-/reactietabel geven200 beschikbaar:false met items:[]; dat bewijst niet dat er geen mail/reacties bestaan. Andere leesfouten500. Binnenkomende inhoud is data en start geen automatische AI, opdracht of antwoord. Afzenderstatus is geen instructieautorisatie; tijdlijnstatus is geen onafhankelijk afleverbewijs. Bijlageprojectie bevat geen opslagpaden.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KlantReactieTijdlijn"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/mail/klantreacties.js",
          "server/lib/klantrechten.js",
          "server/lib/publiekeApi/registratie.js",
          "server/migrations/196_rapportly_klantreacties.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "cfe078af"
      }
    },
    "/v1/klantreacties/{reactieId}/gelezen": {
      "patch": {
        "operationId": "klantreactie_gelezen",
        "summary": "klantreactie gelezen",
        "description": "Lege of ontbrekende body. Monotone markering: alleen een nog lege gelezen_op wordt gevuld; herhalen behoudt de eerste markering en leest die terug. Geen Idempotency-Key of If-Match nodig. Actuele object-/organisatie-/klantrechten en algemene trialpoort gelden. Geen reply, provider- of modelactie. Niet zichtbaar404; opslag-/herleesfout500. Queryvelden worden niet gebruikt.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "reactieId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    },
                    "reactie": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "gelezen_op": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "date-time"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "id",
                        "gelezen_op"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "ok",
                    "reactie"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:beheren"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/mail/klantreacties.js",
          "server/lib/klantrechten.js",
          "server/lib/publiekeApi/registratie.js",
          "server/migrations/196_rapportly_klantreacties.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {},
                "required": [],
                "additionalProperties": false
              }
            }
          }
        },
        "x-bronref": "cfe078af"
      }
    },
    "/v1/klantreacties/{reactieId}/bijlagen/{index}": {
      "get": {
        "operationId": "klantreactie_bijlage",
        "summary": "klantreactie bijlage",
        "description": "Huidige object-/organisatiegrens en vaste opslagprefix van deze reactie. Index buiten opgeslagen lijst of geen bruikbaar pad404, verkeerd indexformaat400. Geeft tijdelijke link van300seconden met downloadnaam, geen bytes in JSON en geen upload. Download apart zonder API-sleutel. Native handler ondertekent de bestaande referentie; er is geen tweede objectrechtenread na signing in deze bron. Opslag-/signingfout500. Queryvelden worden niet gebruikt.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "reactieId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "index",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9]{1,4}$",
              "description": "Nulgebaseerde index;1–4decimale cijfers, voorloopnullen worden door deze handler geaccepteerd."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "naam": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "url",
                    "naam"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/rapportly_api.js",
          "server/lib/mail/klantreacties.js",
          "server/lib/klantrechten.js",
          "server/lib/publiekeApi/registratie.js",
          "server/migrations/196_rapportly_klantreacties.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "cfe078af"
      }
    },
    "/v1/uitvoer/rapport/{ankerId}/rapport_markdown/verschillen": {
      "get": {
        "operationId": "rapport_rapport_markdown_historie_vergelijken",
        "summary": "rapport rapport markdown historie vergelijken",
        "description": "Stabiel broncontract aa6153e5, geen liveclaim. Actie uitvoer.verschillen met resultaten:lezen. Exact twee unieke queryparameters van en naar, decimale strings 1..999999999 zonder voorloopnullen, whitespace, exponent of arrays; van < naar. Geen body of Idempotency-Key. Volledige-API- en bestaande outputbewerken-vlag vereist. Alleen twee werkelijk opgeslagen historievelden; ontbrekende versie geeft 404, geen huidige tekst als fallback. Rapport vereist product_context rapportly en bevroren document_soort rapport; offerte/presentatie/MijnAdvies uitgesloten. Actor, organisatie, sleutel, pakket, objectbinding en exact privacybewijs worden vóór en na lezen gecontroleerd; adapter ontbreekt geeft 423. Historie wordt herlezen; gewijzigde binding/inhoud/privacybasis geeft 409 zonder tekst, verdwenen bron 404. Maximaal 2 MiB UTF-8 per brontekst, anders 413; antwoordfragment per zijde maximaal 8000 Unicodecodepunten. Gelijke tekst geeft gewijzigd:false en blok:null. Geen provider, opslagmutatie, render, job, creditreservering of mailverzending. De bestaande workflowvergelijkroute houdt haar eigen opeenvolgende revisie-, pointer- en beleidsvoorwaarden.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "van",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[1-9][0-9]{0,8}$",
              "minLength": 1,
              "maxLength": 9
            }
          },
          {
            "name": "naar",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[1-9][0-9]{0,8}$",
              "minLength": 1,
              "maxLength": 9
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Vergelijking van twee opgeslagen historieversies; beschikbaar is altijd true bij 200.",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/UitvoerHistorieVerschilAntwoord"
                    },
                    {
                      "properties": {
                        "verschil": {
                          "properties": {
                            "doel_soort": {
                              "const": "rapport"
                            },
                            "veld": {
                              "const": "rapport_markdown"
                            }
                          }
                        }
                      }
                    }
                  ]
                },
                "examples": {
                  "gewijzigd": {
                    "summary": "Fictieve datumwijziging tussen opgeslagen versies 1 en 3",
                    "value": {
                      "beschikbaar": true,
                      "verschil": {
                        "soort": "uitvoerinhoud",
                        "doel_soort": "rapport",
                        "anker_id": "11111111-1111-4111-8111-111111111111",
                        "veld": "rapport_markdown",
                        "van_versie": 1,
                        "naar_versie": 3,
                        "methode": "aaneengesloten_tekstblok",
                        "gewijzigd": true,
                        "bevat_inhoud": true,
                        "alleen_opgeslagen_historie": true,
                        "blok": {
                          "oud": {
                            "vanaf_regel": 2,
                            "tot_regel": 2,
                            "tekst": "Dag: donderdag",
                            "ingekort": false
                          },
                          "nieuw": {
                            "vanaf_regel": 2,
                            "tot_regel": 2,
                            "tekst": "Dag: vrijdag",
                            "ingekort": false
                          }
                        }
                      }
                    }
                  },
                  "gelijk": {
                    "summary": "Twee opgeslagen versies met gelijke tekst",
                    "value": {
                      "beschikbaar": true,
                      "verschil": {
                        "soort": "uitvoerinhoud",
                        "doel_soort": "rapport",
                        "anker_id": "11111111-1111-4111-8111-111111111111",
                        "veld": "rapport_markdown",
                        "van_versie": 1,
                        "naar_versie": 3,
                        "methode": "aaneengesloten_tekstblok",
                        "gewijzigd": false,
                        "bevat_inhoud": true,
                        "alleen_opgeslagen_historie": true,
                        "blok": null
                      }
                    }
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              }
            }
          },
          "400": {
            "description": "Vergelijkhandler: uitvoervergelijking_invoer_ongeldig. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_invoer_ongeldig": {
                    "value": {
                      "code": "uitvoervergelijking_invoer_ongeldig"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Vergelijkhandler: api_leesdelegatie_geweigerd. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "api_leesdelegatie_geweigerd": {
                    "value": {
                      "code": "api_leesdelegatie_geweigerd"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Vergelijkhandler: uitvoervergelijking_niet_gevonden. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_niet_gevonden": {
                    "value": {
                      "code": "uitvoervergelijking_niet_gevonden"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Vergelijkhandler: uitvoervergelijking_basis_conflict. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_basis_conflict": {
                    "value": {
                      "code": "uitvoervergelijking_basis_conflict"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "Vergelijkhandler: uitvoervergelijking_te_groot. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_te_groot": {
                    "value": {
                      "code": "uitvoervergelijking_te_groot"
                    }
                  }
                }
              }
            }
          },
          "423": {
            "description": "Vergelijkhandler: privacyadapter_niet_beschikbaar, privacy_scope_ongeldig, privacycontrole_geblokkeerd, privacycontrole_onzeker, privacybewijs_ongeldig. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "privacyadapter_niet_beschikbaar": {
                    "value": {
                      "code": "privacyadapter_niet_beschikbaar"
                    }
                  },
                  "privacy_scope_ongeldig": {
                    "value": {
                      "code": "privacy_scope_ongeldig"
                    }
                  },
                  "privacycontrole_geblokkeerd": {
                    "value": {
                      "code": "privacycontrole_geblokkeerd"
                    }
                  },
                  "privacycontrole_onzeker": {
                    "value": {
                      "code": "privacycontrole_onzeker"
                    }
                  },
                  "privacybewijs_ongeldig": {
                    "value": {
                      "code": "privacybewijs_ongeldig"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Vergelijkhandler: uitvoervergelijking_onbeschikbaar, api_leesdelegatie_onbeschikbaar. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_onbeschikbaar": {
                    "value": {
                      "code": "uitvoervergelijking_onbeschikbaar"
                    }
                  },
                  "api_leesdelegatie_onbeschikbaar": {
                    "value": {
                      "code": "api_leesdelegatie_onbeschikbaar"
                    }
                  }
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/uitvoer/uitvoerHistorieVerschil.js",
          "server/lib/uitvoer/workflowDocumentVerschil.js",
          "server/lib/uitvoer/versies.js",
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/publiekeApi/acties.js",
          "server/jobs/adapters/uitvoeringPrivacy.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "aa6153e5d9d53938c276bc839268ed53aec71002",
        "x-actie": "uitvoer.verschillen",
        "x-query-aanvullingen-toegestaan": false,
        "x-handler-foutcodes": {
          "400": [
            "uitvoervergelijking_invoer_ongeldig"
          ],
          "403": [
            "api_leesdelegatie_geweigerd"
          ],
          "404": [
            "uitvoervergelijking_niet_gevonden"
          ],
          "409": [
            "uitvoervergelijking_basis_conflict"
          ],
          "413": [
            "uitvoervergelijking_te_groot"
          ],
          "423": [
            "privacyadapter_niet_beschikbaar",
            "privacy_scope_ongeldig",
            "privacycontrole_geblokkeerd",
            "privacycontrole_onzeker",
            "privacybewijs_ongeldig"
          ],
          "503": [
            "uitvoervergelijking_onbeschikbaar",
            "api_leesdelegatie_onbeschikbaar"
          ]
        }
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/verslag/verschillen": {
      "get": {
        "operationId": "gesprek_verslag_historie_vergelijken",
        "summary": "gesprek verslag historie vergelijken",
        "description": "Stabiel broncontract aa6153e5, geen liveclaim. Actie uitvoer.verschillen met resultaten:lezen. Exact twee unieke queryparameters van en naar, decimale strings 1..999999999 zonder voorloopnullen, whitespace, exponent of arrays; van < naar. Geen body of Idempotency-Key. Volledige-API- en bestaande outputbewerken-vlag vereist. Alleen twee werkelijk opgeslagen historievelden; ontbrekende versie geeft 404, geen huidige tekst als fallback. Rapport vereist product_context rapportly en bevroren document_soort rapport; offerte/presentatie/MijnAdvies uitgesloten. Actor, organisatie, sleutel, pakket, objectbinding en exact privacybewijs worden vóór en na lezen gecontroleerd; adapter ontbreekt geeft 423. Historie wordt herlezen; gewijzigde binding/inhoud/privacybasis geeft 409 zonder tekst, verdwenen bron 404. Maximaal 2 MiB UTF-8 per brontekst, anders 413; antwoordfragment per zijde maximaal 8000 Unicodecodepunten. Gelijke tekst geeft gewijzigd:false en blok:null. Geen provider, opslagmutatie, render, job, creditreservering of mailverzending. De bestaande workflowvergelijkroute houdt haar eigen opeenvolgende revisie-, pointer- en beleidsvoorwaarden.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "van",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[1-9][0-9]{0,8}$",
              "minLength": 1,
              "maxLength": 9
            }
          },
          {
            "name": "naar",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[1-9][0-9]{0,8}$",
              "minLength": 1,
              "maxLength": 9
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Vergelijking van twee opgeslagen historieversies; beschikbaar is altijd true bij 200.",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/UitvoerHistorieVerschilAntwoord"
                    },
                    {
                      "properties": {
                        "verschil": {
                          "properties": {
                            "doel_soort": {
                              "const": "gesprek"
                            },
                            "veld": {
                              "const": "verslag"
                            }
                          }
                        }
                      }
                    }
                  ]
                },
                "examples": {
                  "gewijzigd": {
                    "summary": "Fictieve datumwijziging tussen opgeslagen versies 1 en 3",
                    "value": {
                      "beschikbaar": true,
                      "verschil": {
                        "soort": "uitvoerinhoud",
                        "doel_soort": "gesprek",
                        "anker_id": "11111111-1111-4111-8111-111111111111",
                        "veld": "verslag",
                        "van_versie": 1,
                        "naar_versie": 3,
                        "methode": "aaneengesloten_tekstblok",
                        "gewijzigd": true,
                        "bevat_inhoud": true,
                        "alleen_opgeslagen_historie": true,
                        "blok": {
                          "oud": {
                            "vanaf_regel": 2,
                            "tot_regel": 2,
                            "tekst": "Dag: donderdag",
                            "ingekort": false
                          },
                          "nieuw": {
                            "vanaf_regel": 2,
                            "tot_regel": 2,
                            "tekst": "Dag: vrijdag",
                            "ingekort": false
                          }
                        }
                      }
                    }
                  },
                  "gelijk": {
                    "summary": "Twee opgeslagen versies met gelijke tekst",
                    "value": {
                      "beschikbaar": true,
                      "verschil": {
                        "soort": "uitvoerinhoud",
                        "doel_soort": "gesprek",
                        "anker_id": "11111111-1111-4111-8111-111111111111",
                        "veld": "verslag",
                        "van_versie": 1,
                        "naar_versie": 3,
                        "methode": "aaneengesloten_tekstblok",
                        "gewijzigd": false,
                        "bevat_inhoud": true,
                        "alleen_opgeslagen_historie": true,
                        "blok": null
                      }
                    }
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              }
            }
          },
          "400": {
            "description": "Vergelijkhandler: uitvoervergelijking_invoer_ongeldig. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_invoer_ongeldig": {
                    "value": {
                      "code": "uitvoervergelijking_invoer_ongeldig"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Vergelijkhandler: api_leesdelegatie_geweigerd. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "api_leesdelegatie_geweigerd": {
                    "value": {
                      "code": "api_leesdelegatie_geweigerd"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Vergelijkhandler: uitvoervergelijking_niet_gevonden. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_niet_gevonden": {
                    "value": {
                      "code": "uitvoervergelijking_niet_gevonden"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Vergelijkhandler: uitvoervergelijking_basis_conflict. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_basis_conflict": {
                    "value": {
                      "code": "uitvoervergelijking_basis_conflict"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "Vergelijkhandler: uitvoervergelijking_te_groot. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_te_groot": {
                    "value": {
                      "code": "uitvoervergelijking_te_groot"
                    }
                  }
                }
              }
            }
          },
          "423": {
            "description": "Vergelijkhandler: privacyadapter_niet_beschikbaar, privacy_scope_ongeldig, privacycontrole_geblokkeerd, privacycontrole_onzeker, privacybewijs_ongeldig. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "privacyadapter_niet_beschikbaar": {
                    "value": {
                      "code": "privacyadapter_niet_beschikbaar"
                    }
                  },
                  "privacy_scope_ongeldig": {
                    "value": {
                      "code": "privacy_scope_ongeldig"
                    }
                  },
                  "privacycontrole_geblokkeerd": {
                    "value": {
                      "code": "privacycontrole_geblokkeerd"
                    }
                  },
                  "privacycontrole_onzeker": {
                    "value": {
                      "code": "privacycontrole_onzeker"
                    }
                  },
                  "privacybewijs_ongeldig": {
                    "value": {
                      "code": "privacybewijs_ongeldig"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Vergelijkhandler: uitvoervergelijking_onbeschikbaar, api_leesdelegatie_onbeschikbaar. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_onbeschikbaar": {
                    "value": {
                      "code": "uitvoervergelijking_onbeschikbaar"
                    }
                  },
                  "api_leesdelegatie_onbeschikbaar": {
                    "value": {
                      "code": "api_leesdelegatie_onbeschikbaar"
                    }
                  }
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/uitvoer/uitvoerHistorieVerschil.js",
          "server/lib/uitvoer/workflowDocumentVerschil.js",
          "server/lib/uitvoer/versies.js",
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/publiekeApi/acties.js",
          "server/jobs/adapters/uitvoeringPrivacy.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "aa6153e5d9d53938c276bc839268ed53aec71002",
        "x-actie": "uitvoer.verschillen",
        "x-query-aanvullingen-toegestaan": false,
        "x-handler-foutcodes": {
          "400": [
            "uitvoervergelijking_invoer_ongeldig"
          ],
          "403": [
            "api_leesdelegatie_geweigerd"
          ],
          "404": [
            "uitvoervergelijking_niet_gevonden"
          ],
          "409": [
            "uitvoervergelijking_basis_conflict"
          ],
          "413": [
            "uitvoervergelijking_te_groot"
          ],
          "423": [
            "privacyadapter_niet_beschikbaar",
            "privacy_scope_ongeldig",
            "privacycontrole_geblokkeerd",
            "privacycontrole_onzeker",
            "privacybewijs_ongeldig"
          ],
          "503": [
            "uitvoervergelijking_onbeschikbaar",
            "api_leesdelegatie_onbeschikbaar"
          ]
        }
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/interne_mail/verschillen": {
      "get": {
        "operationId": "gesprek_interne_mail_historie_vergelijken",
        "summary": "gesprek interne mail historie vergelijken",
        "description": "Stabiel broncontract aa6153e5, geen liveclaim. Actie uitvoer.verschillen met resultaten:lezen. Exact twee unieke queryparameters van en naar, decimale strings 1..999999999 zonder voorloopnullen, whitespace, exponent of arrays; van < naar. Geen body of Idempotency-Key. Volledige-API- en bestaande outputbewerken-vlag vereist. Alleen twee werkelijk opgeslagen historievelden; ontbrekende versie geeft 404, geen huidige tekst als fallback. Rapport vereist product_context rapportly en bevroren document_soort rapport; offerte/presentatie/MijnAdvies uitgesloten. Actor, organisatie, sleutel, pakket, objectbinding en exact privacybewijs worden vóór en na lezen gecontroleerd; adapter ontbreekt geeft 423. Historie wordt herlezen; gewijzigde binding/inhoud/privacybasis geeft 409 zonder tekst, verdwenen bron 404. Maximaal 2 MiB UTF-8 per brontekst, anders 413; antwoordfragment per zijde maximaal 8000 Unicodecodepunten. Gelijke tekst geeft gewijzigd:false en blok:null. Geen provider, opslagmutatie, render, job, creditreservering of mailverzending. De bestaande workflowvergelijkroute houdt haar eigen opeenvolgende revisie-, pointer- en beleidsvoorwaarden.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "van",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[1-9][0-9]{0,8}$",
              "minLength": 1,
              "maxLength": 9
            }
          },
          {
            "name": "naar",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[1-9][0-9]{0,8}$",
              "minLength": 1,
              "maxLength": 9
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Vergelijking van twee opgeslagen historieversies; beschikbaar is altijd true bij 200.",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/UitvoerHistorieVerschilAntwoord"
                    },
                    {
                      "properties": {
                        "verschil": {
                          "properties": {
                            "doel_soort": {
                              "const": "gesprek"
                            },
                            "veld": {
                              "const": "interne_mail"
                            }
                          }
                        }
                      }
                    }
                  ]
                },
                "examples": {
                  "gewijzigd": {
                    "summary": "Fictieve datumwijziging tussen opgeslagen versies 1 en 3",
                    "value": {
                      "beschikbaar": true,
                      "verschil": {
                        "soort": "uitvoerinhoud",
                        "doel_soort": "gesprek",
                        "anker_id": "11111111-1111-4111-8111-111111111111",
                        "veld": "interne_mail",
                        "van_versie": 1,
                        "naar_versie": 3,
                        "methode": "aaneengesloten_tekstblok",
                        "gewijzigd": true,
                        "bevat_inhoud": true,
                        "alleen_opgeslagen_historie": true,
                        "blok": {
                          "oud": {
                            "vanaf_regel": 2,
                            "tot_regel": 2,
                            "tekst": "Dag: donderdag",
                            "ingekort": false
                          },
                          "nieuw": {
                            "vanaf_regel": 2,
                            "tot_regel": 2,
                            "tekst": "Dag: vrijdag",
                            "ingekort": false
                          }
                        }
                      }
                    }
                  },
                  "gelijk": {
                    "summary": "Twee opgeslagen versies met gelijke tekst",
                    "value": {
                      "beschikbaar": true,
                      "verschil": {
                        "soort": "uitvoerinhoud",
                        "doel_soort": "gesprek",
                        "anker_id": "11111111-1111-4111-8111-111111111111",
                        "veld": "interne_mail",
                        "van_versie": 1,
                        "naar_versie": 3,
                        "methode": "aaneengesloten_tekstblok",
                        "gewijzigd": false,
                        "bevat_inhoud": true,
                        "alleen_opgeslagen_historie": true,
                        "blok": null
                      }
                    }
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              }
            }
          },
          "400": {
            "description": "Vergelijkhandler: uitvoervergelijking_invoer_ongeldig. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_invoer_ongeldig": {
                    "value": {
                      "code": "uitvoervergelijking_invoer_ongeldig"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Vergelijkhandler: api_leesdelegatie_geweigerd. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "api_leesdelegatie_geweigerd": {
                    "value": {
                      "code": "api_leesdelegatie_geweigerd"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Vergelijkhandler: uitvoervergelijking_niet_gevonden. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_niet_gevonden": {
                    "value": {
                      "code": "uitvoervergelijking_niet_gevonden"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Vergelijkhandler: uitvoervergelijking_basis_conflict. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_basis_conflict": {
                    "value": {
                      "code": "uitvoervergelijking_basis_conflict"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "Vergelijkhandler: uitvoervergelijking_te_groot. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_te_groot": {
                    "value": {
                      "code": "uitvoervergelijking_te_groot"
                    }
                  }
                }
              }
            }
          },
          "423": {
            "description": "Vergelijkhandler: privacyadapter_niet_beschikbaar, privacy_scope_ongeldig, privacycontrole_geblokkeerd, privacycontrole_onzeker, privacybewijs_ongeldig. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "privacyadapter_niet_beschikbaar": {
                    "value": {
                      "code": "privacyadapter_niet_beschikbaar"
                    }
                  },
                  "privacy_scope_ongeldig": {
                    "value": {
                      "code": "privacy_scope_ongeldig"
                    }
                  },
                  "privacycontrole_geblokkeerd": {
                    "value": {
                      "code": "privacycontrole_geblokkeerd"
                    }
                  },
                  "privacycontrole_onzeker": {
                    "value": {
                      "code": "privacycontrole_onzeker"
                    }
                  },
                  "privacybewijs_ongeldig": {
                    "value": {
                      "code": "privacybewijs_ongeldig"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Vergelijkhandler: uitvoervergelijking_onbeschikbaar, api_leesdelegatie_onbeschikbaar. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_onbeschikbaar": {
                    "value": {
                      "code": "uitvoervergelijking_onbeschikbaar"
                    }
                  },
                  "api_leesdelegatie_onbeschikbaar": {
                    "value": {
                      "code": "api_leesdelegatie_onbeschikbaar"
                    }
                  }
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/uitvoer/uitvoerHistorieVerschil.js",
          "server/lib/uitvoer/workflowDocumentVerschil.js",
          "server/lib/uitvoer/versies.js",
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/publiekeApi/acties.js",
          "server/jobs/adapters/uitvoeringPrivacy.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "aa6153e5d9d53938c276bc839268ed53aec71002",
        "x-actie": "uitvoer.verschillen",
        "x-query-aanvullingen-toegestaan": false,
        "x-handler-foutcodes": {
          "400": [
            "uitvoervergelijking_invoer_ongeldig"
          ],
          "403": [
            "api_leesdelegatie_geweigerd"
          ],
          "404": [
            "uitvoervergelijking_niet_gevonden"
          ],
          "409": [
            "uitvoervergelijking_basis_conflict"
          ],
          "413": [
            "uitvoervergelijking_te_groot"
          ],
          "423": [
            "privacyadapter_niet_beschikbaar",
            "privacy_scope_ongeldig",
            "privacycontrole_geblokkeerd",
            "privacycontrole_onzeker",
            "privacybewijs_ongeldig"
          ],
          "503": [
            "uitvoervergelijking_onbeschikbaar",
            "api_leesdelegatie_onbeschikbaar"
          ]
        }
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/klantmail/verschillen": {
      "get": {
        "operationId": "gesprek_klantmail_historie_vergelijken",
        "summary": "gesprek klantmail historie vergelijken",
        "description": "Stabiel broncontract aa6153e5, geen liveclaim. Actie uitvoer.verschillen met resultaten:lezen. Exact twee unieke queryparameters van en naar, decimale strings 1..999999999 zonder voorloopnullen, whitespace, exponent of arrays; van < naar. Geen body of Idempotency-Key. Volledige-API- en bestaande outputbewerken-vlag vereist. Alleen twee werkelijk opgeslagen historievelden; ontbrekende versie geeft 404, geen huidige tekst als fallback. Rapport vereist product_context rapportly en bevroren document_soort rapport; offerte/presentatie/MijnAdvies uitgesloten. Actor, organisatie, sleutel, pakket, objectbinding en exact privacybewijs worden vóór en na lezen gecontroleerd; adapter ontbreekt geeft 423. Historie wordt herlezen; gewijzigde binding/inhoud/privacybasis geeft 409 zonder tekst, verdwenen bron 404. Maximaal 2 MiB UTF-8 per brontekst, anders 413; antwoordfragment per zijde maximaal 8000 Unicodecodepunten. Gelijke tekst geeft gewijzigd:false en blok:null. Geen provider, opslagmutatie, render, job, creditreservering of mailverzending. De bestaande workflowvergelijkroute houdt haar eigen opeenvolgende revisie-, pointer- en beleidsvoorwaarden.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "van",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[1-9][0-9]{0,8}$",
              "minLength": 1,
              "maxLength": 9
            }
          },
          {
            "name": "naar",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[1-9][0-9]{0,8}$",
              "minLength": 1,
              "maxLength": 9
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Vergelijking van twee opgeslagen historieversies; beschikbaar is altijd true bij 200.",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/UitvoerHistorieVerschilAntwoord"
                    },
                    {
                      "properties": {
                        "verschil": {
                          "properties": {
                            "doel_soort": {
                              "const": "gesprek"
                            },
                            "veld": {
                              "const": "klantmail"
                            }
                          }
                        }
                      }
                    }
                  ]
                },
                "examples": {
                  "gewijzigd": {
                    "summary": "Fictieve datumwijziging tussen opgeslagen versies 1 en 3",
                    "value": {
                      "beschikbaar": true,
                      "verschil": {
                        "soort": "uitvoerinhoud",
                        "doel_soort": "gesprek",
                        "anker_id": "11111111-1111-4111-8111-111111111111",
                        "veld": "klantmail",
                        "van_versie": 1,
                        "naar_versie": 3,
                        "methode": "aaneengesloten_tekstblok",
                        "gewijzigd": true,
                        "bevat_inhoud": true,
                        "alleen_opgeslagen_historie": true,
                        "blok": {
                          "oud": {
                            "vanaf_regel": 2,
                            "tot_regel": 2,
                            "tekst": "Dag: donderdag",
                            "ingekort": false
                          },
                          "nieuw": {
                            "vanaf_regel": 2,
                            "tot_regel": 2,
                            "tekst": "Dag: vrijdag",
                            "ingekort": false
                          }
                        }
                      }
                    }
                  },
                  "gelijk": {
                    "summary": "Twee opgeslagen versies met gelijke tekst",
                    "value": {
                      "beschikbaar": true,
                      "verschil": {
                        "soort": "uitvoerinhoud",
                        "doel_soort": "gesprek",
                        "anker_id": "11111111-1111-4111-8111-111111111111",
                        "veld": "klantmail",
                        "van_versie": 1,
                        "naar_versie": 3,
                        "methode": "aaneengesloten_tekstblok",
                        "gewijzigd": false,
                        "bevat_inhoud": true,
                        "alleen_opgeslagen_historie": true,
                        "blok": null
                      }
                    }
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              }
            }
          },
          "400": {
            "description": "Vergelijkhandler: uitvoervergelijking_invoer_ongeldig. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_invoer_ongeldig": {
                    "value": {
                      "code": "uitvoervergelijking_invoer_ongeldig"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Vergelijkhandler: api_leesdelegatie_geweigerd. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "api_leesdelegatie_geweigerd": {
                    "value": {
                      "code": "api_leesdelegatie_geweigerd"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Vergelijkhandler: uitvoervergelijking_niet_gevonden. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_niet_gevonden": {
                    "value": {
                      "code": "uitvoervergelijking_niet_gevonden"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Vergelijkhandler: uitvoervergelijking_basis_conflict. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_basis_conflict": {
                    "value": {
                      "code": "uitvoervergelijking_basis_conflict"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "Vergelijkhandler: uitvoervergelijking_te_groot. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_te_groot": {
                    "value": {
                      "code": "uitvoervergelijking_te_groot"
                    }
                  }
                }
              }
            }
          },
          "423": {
            "description": "Vergelijkhandler: privacyadapter_niet_beschikbaar, privacy_scope_ongeldig, privacycontrole_geblokkeerd, privacycontrole_onzeker, privacybewijs_ongeldig. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "privacyadapter_niet_beschikbaar": {
                    "value": {
                      "code": "privacyadapter_niet_beschikbaar"
                    }
                  },
                  "privacy_scope_ongeldig": {
                    "value": {
                      "code": "privacy_scope_ongeldig"
                    }
                  },
                  "privacycontrole_geblokkeerd": {
                    "value": {
                      "code": "privacycontrole_geblokkeerd"
                    }
                  },
                  "privacycontrole_onzeker": {
                    "value": {
                      "code": "privacycontrole_onzeker"
                    }
                  },
                  "privacybewijs_ongeldig": {
                    "value": {
                      "code": "privacybewijs_ongeldig"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Vergelijkhandler: uitvoervergelijking_onbeschikbaar, api_leesdelegatie_onbeschikbaar. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_onbeschikbaar": {
                    "value": {
                      "code": "uitvoervergelijking_onbeschikbaar"
                    }
                  },
                  "api_leesdelegatie_onbeschikbaar": {
                    "value": {
                      "code": "api_leesdelegatie_onbeschikbaar"
                    }
                  }
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/uitvoer/uitvoerHistorieVerschil.js",
          "server/lib/uitvoer/workflowDocumentVerschil.js",
          "server/lib/uitvoer/versies.js",
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/publiekeApi/acties.js",
          "server/jobs/adapters/uitvoeringPrivacy.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "aa6153e5d9d53938c276bc839268ed53aec71002",
        "x-actie": "uitvoer.verschillen",
        "x-query-aanvullingen-toegestaan": false,
        "x-handler-foutcodes": {
          "400": [
            "uitvoervergelijking_invoer_ongeldig"
          ],
          "403": [
            "api_leesdelegatie_geweigerd"
          ],
          "404": [
            "uitvoervergelijking_niet_gevonden"
          ],
          "409": [
            "uitvoervergelijking_basis_conflict"
          ],
          "413": [
            "uitvoervergelijking_te_groot"
          ],
          "423": [
            "privacyadapter_niet_beschikbaar",
            "privacy_scope_ongeldig",
            "privacycontrole_geblokkeerd",
            "privacycontrole_onzeker",
            "privacybewijs_ongeldig"
          ],
          "503": [
            "uitvoervergelijking_onbeschikbaar",
            "api_leesdelegatie_onbeschikbaar"
          ]
        }
      }
    },
    "/v1/uitvoer/gesprek/{ankerId}/followup_mail/verschillen": {
      "get": {
        "operationId": "gesprek_followup_mail_historie_vergelijken",
        "summary": "gesprek followup mail historie vergelijken",
        "description": "Stabiel broncontract aa6153e5, geen liveclaim. Actie uitvoer.verschillen met resultaten:lezen. Exact twee unieke queryparameters van en naar, decimale strings 1..999999999 zonder voorloopnullen, whitespace, exponent of arrays; van < naar. Geen body of Idempotency-Key. Volledige-API- en bestaande outputbewerken-vlag vereist. Alleen twee werkelijk opgeslagen historievelden; ontbrekende versie geeft 404, geen huidige tekst als fallback. Rapport vereist product_context rapportly en bevroren document_soort rapport; offerte/presentatie/MijnAdvies uitgesloten. Actor, organisatie, sleutel, pakket, objectbinding en exact privacybewijs worden vóór en na lezen gecontroleerd; adapter ontbreekt geeft 423. Historie wordt herlezen; gewijzigde binding/inhoud/privacybasis geeft 409 zonder tekst, verdwenen bron 404. Maximaal 2 MiB UTF-8 per brontekst, anders 413; antwoordfragment per zijde maximaal 8000 Unicodecodepunten. Gelijke tekst geeft gewijzigd:false en blok:null. Geen provider, opslagmutatie, render, job, creditreservering of mailverzending. De bestaande workflowvergelijkroute houdt haar eigen opeenvolgende revisie-, pointer- en beleidsvoorwaarden.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "ankerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "van",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[1-9][0-9]{0,8}$",
              "minLength": 1,
              "maxLength": 9
            }
          },
          {
            "name": "naar",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[1-9][0-9]{0,8}$",
              "minLength": 1,
              "maxLength": 9
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Vergelijking van twee opgeslagen historieversies; beschikbaar is altijd true bij 200.",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/UitvoerHistorieVerschilAntwoord"
                    },
                    {
                      "properties": {
                        "verschil": {
                          "properties": {
                            "doel_soort": {
                              "const": "gesprek"
                            },
                            "veld": {
                              "const": "followup_mail"
                            }
                          }
                        }
                      }
                    }
                  ]
                },
                "examples": {
                  "gewijzigd": {
                    "summary": "Fictieve datumwijziging tussen opgeslagen versies 1 en 3",
                    "value": {
                      "beschikbaar": true,
                      "verschil": {
                        "soort": "uitvoerinhoud",
                        "doel_soort": "gesprek",
                        "anker_id": "11111111-1111-4111-8111-111111111111",
                        "veld": "followup_mail",
                        "van_versie": 1,
                        "naar_versie": 3,
                        "methode": "aaneengesloten_tekstblok",
                        "gewijzigd": true,
                        "bevat_inhoud": true,
                        "alleen_opgeslagen_historie": true,
                        "blok": {
                          "oud": {
                            "vanaf_regel": 2,
                            "tot_regel": 2,
                            "tekst": "Dag: donderdag",
                            "ingekort": false
                          },
                          "nieuw": {
                            "vanaf_regel": 2,
                            "tot_regel": 2,
                            "tekst": "Dag: vrijdag",
                            "ingekort": false
                          }
                        }
                      }
                    }
                  },
                  "gelijk": {
                    "summary": "Twee opgeslagen versies met gelijke tekst",
                    "value": {
                      "beschikbaar": true,
                      "verschil": {
                        "soort": "uitvoerinhoud",
                        "doel_soort": "gesprek",
                        "anker_id": "11111111-1111-4111-8111-111111111111",
                        "veld": "followup_mail",
                        "van_versie": 1,
                        "naar_versie": 3,
                        "methode": "aaneengesloten_tekstblok",
                        "gewijzigd": false,
                        "bevat_inhoud": true,
                        "alleen_opgeslagen_historie": true,
                        "blok": null
                      }
                    }
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              }
            }
          },
          "400": {
            "description": "Vergelijkhandler: uitvoervergelijking_invoer_ongeldig. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_invoer_ongeldig": {
                    "value": {
                      "code": "uitvoervergelijking_invoer_ongeldig"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Vergelijkhandler: api_leesdelegatie_geweigerd. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "api_leesdelegatie_geweigerd": {
                    "value": {
                      "code": "api_leesdelegatie_geweigerd"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Vergelijkhandler: uitvoervergelijking_niet_gevonden. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_niet_gevonden": {
                    "value": {
                      "code": "uitvoervergelijking_niet_gevonden"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Vergelijkhandler: uitvoervergelijking_basis_conflict. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_basis_conflict": {
                    "value": {
                      "code": "uitvoervergelijking_basis_conflict"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "Vergelijkhandler: uitvoervergelijking_te_groot. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_te_groot": {
                    "value": {
                      "code": "uitvoervergelijking_te_groot"
                    }
                  }
                }
              }
            }
          },
          "423": {
            "description": "Vergelijkhandler: privacyadapter_niet_beschikbaar, privacy_scope_ongeldig, privacycontrole_geblokkeerd, privacycontrole_onzeker, privacybewijs_ongeldig. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "privacyadapter_niet_beschikbaar": {
                    "value": {
                      "code": "privacyadapter_niet_beschikbaar"
                    }
                  },
                  "privacy_scope_ongeldig": {
                    "value": {
                      "code": "privacy_scope_ongeldig"
                    }
                  },
                  "privacycontrole_geblokkeerd": {
                    "value": {
                      "code": "privacycontrole_geblokkeerd"
                    }
                  },
                  "privacycontrole_onzeker": {
                    "value": {
                      "code": "privacycontrole_onzeker"
                    }
                  },
                  "privacybewijs_ongeldig": {
                    "value": {
                      "code": "privacybewijs_ongeldig"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Vergelijkhandler: uitvoervergelijking_onbeschikbaar, api_leesdelegatie_onbeschikbaar. Geen eerder gelezen inhoud in de fout. Voorliggende authenticatie-/featurepoorten kunnen het bestaande Fout-contract geven.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                },
                "examples": {
                  "uitvoervergelijking_onbeschikbaar": {
                    "value": {
                      "code": "uitvoervergelijking_onbeschikbaar"
                    }
                  },
                  "api_leesdelegatie_onbeschikbaar": {
                    "value": {
                      "code": "api_leesdelegatie_onbeschikbaar"
                    }
                  }
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/uitvoer/uitvoerHistorieVerschil.js",
          "server/lib/uitvoer/workflowDocumentVerschil.js",
          "server/lib/uitvoer/versies.js",
          "server/rapportly_uitvoer_api.js",
          "server/lib/publiekeApi/uitvoer.js",
          "server/lib/publiekeApi/acties.js",
          "server/jobs/adapters/uitvoeringPrivacy.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "aa6153e5d9d53938c276bc839268ed53aec71002",
        "x-actie": "uitvoer.verschillen",
        "x-query-aanvullingen-toegestaan": false,
        "x-handler-foutcodes": {
          "400": [
            "uitvoervergelijking_invoer_ongeldig"
          ],
          "403": [
            "api_leesdelegatie_geweigerd"
          ],
          "404": [
            "uitvoervergelijking_niet_gevonden"
          ],
          "409": [
            "uitvoervergelijking_basis_conflict"
          ],
          "413": [
            "uitvoervergelijking_te_groot"
          ],
          "423": [
            "privacyadapter_niet_beschikbaar",
            "privacy_scope_ongeldig",
            "privacycontrole_geblokkeerd",
            "privacycontrole_onzeker",
            "privacybewijs_ongeldig"
          ],
          "503": [
            "uitvoervergelijking_onbeschikbaar",
            "api_leesdelegatie_onbeschikbaar"
          ]
        }
      }
    },
    "/v1/gesprekken/documenten": {
      "post": {
        "operationId": "gesprekdocumenten_ontvangen",
        "summary": "gesprekdocumenten ontvangen",
        "description": "Duurzame privéontvangst van 1–50 documenten, maximaal 50 MiB per bestand. Vereist actieve documentvoorbereiding, duurzame generatie, actuele rechten, trial/pakket en persoonlijke werkelijke API-kostenmodus; geen native fallback. Schema/readiness 360 ontbreekt: 503. HTTP 202 geldt ook voor identieke herhaling en bewijst geen voltooide gespreksinhoud. De oorspronkelijke Idempotency-Key van 8–128 veilige tekens wordt met de API-sleutelidentiteit gebonden. Invoer plus bestandsnamen, MIME, volgorde, byteaantallen en hashes bepalen de ontvangst; gewijzigde invoer met dezelfde sleutel geeft 409. Een verloren uploadantwoord wordt uitsluitend na bytecontrole hergebruikt. De worker controleert lease/actor/organisatie/klantrechten en iedere privébron opnieuw, extraheert alle documenten en weigert de gehele voorbereiding als één document geen leesbare tekst heeft. Samengevoegde bron moet minimaal 100 JavaScript-tekeneenheden lang zijn. Pas daarna start dezelfde duurzame gespreksbundel onder een vaste interne aanvraagidentiteit. klaar betekent gespreksstart ontvangen, niet gespreksresultaat klaar. Geen vaste creditprijs of gratis verwerking afgeleid. Status vervalt na zeven dagen; de opruimworker en inhoudsvrije opruimsporen zijn geen bewijs van uitgevoerde verwijdering.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "X-Rapportly-Client-Version",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GesprekDocumentenOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "426": {
            "description": "Ontbrekende of ongeldige X-Rapportly-Client-Version: client_update_required. Dit is een compatibiliteitspoort, geen authenticatie.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/gesprekDocumenten.js",
          "server/jobs/gesprekDocumentenJobs.js",
          "server/jobs/handlers/gesprekDocumentenVoorbereiding.js",
          "server/rapportly_api.js",
          "server/lib/rapportlyClientVersie.js",
          "server/lib/voorbeeldProfielBronnen.js",
          "server/lib/slimGenereren/beleid.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/migrations/360_rapportly_gesprekdocumenten_jobs.sql"
        ],
        "x-schema-status": "gedeeltelijk",
        "x-open-schema": [
          "Canonieke multipart-invoer beschreven; alle legacy scalar-/JSON-normalisatievarianten van de gedeelde gespreksstart zijn niet als invoer-union uitgewerkt."
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/GesprekDocumentenInvoer"
              }
            }
          }
        },
        "x-bronref": "cfe078af"
      }
    },
    "/v1/gesprekken/documenten/jobs": {
      "get": {
        "operationId": "gesprekdocumenten_ontvangst_terugvinden",
        "summary": "gesprekdocumenten ontvangst terugvinden",
        "description": "Geen lijst: vind één ontvangst met dezelfde oorspronkelijke Idempotency-Key en dezelfde API-sleutel, actor en organisatie. Vereist ook de clientversieheader. De sleutel wordt vóór opslagzoeken gehasht met de API-sleutel-ID. Huidig klantleesrecht blijft vereist. Ontbrekend of verlopen geeft 404, opslagfout 503. Geen statusUrl in dit leesantwoord. Het endpoint definieert geen queryfilters of paginering.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "X-Rapportly-Client-Version",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GesprekDocumentenStatus"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "426": {
            "description": "Ontbrekende of ongeldige X-Rapportly-Client-Version: client_update_required. Dit is een compatibiliteitspoort, geen authenticatie.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/gesprekDocumenten.js",
          "server/jobs/gesprekDocumentenJobs.js",
          "server/jobs/handlers/gesprekDocumentenVoorbereiding.js",
          "server/rapportly_api.js",
          "server/lib/rapportlyClientVersie.js",
          "server/lib/voorbeeldProfielBronnen.js",
          "server/lib/slimGenereren/beleid.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/migrations/360_rapportly_gesprekdocumenten_jobs.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "cfe078af"
      }
    },
    "/v1/gesprekken/documenten/jobs/{aanvraagId}": {
      "get": {
        "operationId": "gesprekdocumenten_status_lezen",
        "summary": "gesprekdocumenten status lezen",
        "description": "Lees één aanvraag met actuele resultaten:lezen, clientversieheader, organisatie, oorspronkelijke actor en eventueel huidig klantleesrecht. De handler filtert op actor en organisatie; deze ID-route voegt geen oorspronkelijke API-sleutelvergelijking toe. Ongeldige UUID, ontbrekende of na zeven dagen verlopen aanvraag: 404. Opslagfout 503; uitgeschakelde publieke voorbereiding 503. Geen Idempotency-Key vereist en geen statusUrl in dit antwoord. Bij klaar met gesprek_id de gewone gesprekstatus lezen; niet opnieuw uploaden om op het eindresultaat te wachten.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "X-Rapportly-Client-Version",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
            }
          },
          {
            "name": "aanvraagId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GesprekDocumentenStatus"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "426": {
            "description": "Ontbrekende of ongeldige X-Rapportly-Client-Version: client_update_required. Dit is een compatibiliteitspoort, geen authenticatie.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/gesprekDocumenten.js",
          "server/jobs/gesprekDocumentenJobs.js",
          "server/jobs/handlers/gesprekDocumentenVoorbereiding.js",
          "server/rapportly_api.js",
          "server/lib/rapportlyClientVersie.js",
          "server/lib/voorbeeldProfielBronnen.js",
          "server/lib/slimGenereren/beleid.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/migrations/360_rapportly_gesprekdocumenten_jobs.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "cfe078af"
      }
    },
    "/v1/rapporten/{versieId}/documentconcept": {
      "get": {
        "operationId": "documentconcept_metadata_lezen",
        "summary": "documentconcept metadata lezen",
        "description": "Huidige sleutel-, actor-, organisatie- en rapportversierechten. Bij geen concept 200 met schemaVersie:1/beschikbaar:false. Ongeldige of onzichtbare rapportversie 404, opslagfout 503. Een fout in aanvullende herstelbewijslezing laat bestaande inhoud bereikbaar maar maakt opmaakMogelijk false. ETag staat in de beschikbare JSON-metadata. Geen queryfilters of versiehistorie in deze route.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "versieId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentConceptLeesantwoord"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Structuurbewerking, broncontrole of herstelcontract niet geldig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/documentcontinuiteit/routes.js",
          "server/lib/documentcontinuiteit/store.js",
          "server/lib/documentcontinuiteit/inhoud.js",
          "server/lib/documentcontinuiteit/bewerken.js",
          "server/lib/documentcontinuiteit/opmaak.js",
          "server/lib/documentcontinuiteit/merklogo.js",
          "server/lib/documentcontinuiteit/leesbaarheid.js",
          "server/lib/lettertypeFamilies.js",
          "server/lib/profielBevindingen.js",
          "server/lib/documentBestandsnaam.js",
          "server/lib/publiekeApi/registratie.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/index.js",
          "server/migrations/262_rapportly_documentcontinuiteit.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "cfe078af"
      }
    },
    "/v1/rapporten/{versieId}/documentconcept/inhoud": {
      "get": {
        "operationId": "documentconcept_inhoud_lezen",
        "summary": "documentconcept inhoud lezen",
        "description": "Lees huidige conceptinhoud en aangeboden bewerkbare velden onder actuele rapportrechten. Geen concept geeft 404. ETag is inhoud-ID plus inhoudhash, exact inclusief dubbele aanhalingstekens. Geeft gevalideerde eigen inhoud, geen origineel stijlvoorbeeld of private renderidentiteit. Beschikbaar opgeslagen bronmateriaal mag niet als gecontroleerde uitvoer worden geïnterpreteerd.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "versieId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentConceptInhoudAntwoord"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[a-fA-F0-9-]{36}:[a-f0-9]{64}\"$"
                }
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Structuurbewerking, broncontrole of herstelcontract niet geldig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/documentcontinuiteit/routes.js",
          "server/lib/documentcontinuiteit/store.js",
          "server/lib/documentcontinuiteit/inhoud.js",
          "server/lib/documentcontinuiteit/bewerken.js",
          "server/lib/documentcontinuiteit/opmaak.js",
          "server/lib/documentcontinuiteit/merklogo.js",
          "server/lib/documentcontinuiteit/leesbaarheid.js",
          "server/lib/lettertypeFamilies.js",
          "server/lib/profielBevindingen.js",
          "server/lib/documentBestandsnaam.js",
          "server/lib/publiekeApi/registratie.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/index.js",
          "server/migrations/262_rapportly_documentcontinuiteit.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "cfe078af"
      },
      "put": {
        "operationId": "documentconcept_inhoud_wijzigen",
        "summary": "documentconcept inhoud wijzigen",
        "description": "Totale publieke JSON-body maximaal 100 KiB; interne inhoudslimiet 2 MiB is geen grotere API-uploadtoestemming. Clientversie en Idempotency-Key van 8–128 veilige tekens vereist. Gebruik huidige If-Match inclusief aanhalingstekens. Kies uitsluitend markdown of wijzigingen. Vormvaste/vaste of niet verliesvrij om te zetten inhoud vereist aangeboden structuurvelden; Markdown geeft dan 422. Nieuwe inhoud wordt een afgeleide revisie, origineel en vorige inhoud blijven bestaan. Een exacte herhaling tegen de huidige rij met dezelfde request_key en identieke inhoud kan vóór de If-Matchcontrole terugkeren; geen algemene garantie voor oude sleutels na latere wijzigingen. Andere inhoud met die sleutel geeft 409. Structuur wordt na bewerking volledig opnieuw gevalideerd. Broncontrole_nodig wordt door tekstbewerking niet goedgekeurd. Geen opmaakjob automatisch gestart.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "X-Rapportly-Client-Version",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
            }
          },
          {
            "name": "If-Match",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^\"[a-fA-F0-9-]{36}:[a-f0-9]{64}\"$"
            }
          },
          {
            "name": "versieId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentConceptMetadata"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[a-fA-F0-9-]{36}:[a-f0-9]{64}\"$"
                },
                "description": "Nieuwe opslag zet deze header; een exacte snelle herhaling kan alleen de etag in JSON geven."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "426": {
            "description": "Clientversie ontbreekt of ongeldig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Structuurbewerking, broncontrole of herstelcontract niet geldig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "documenten:wijzigen"
        ],
        "x-bronnen": [
          "server/lib/documentcontinuiteit/routes.js",
          "server/lib/documentcontinuiteit/store.js",
          "server/lib/documentcontinuiteit/inhoud.js",
          "server/lib/documentcontinuiteit/bewerken.js",
          "server/lib/documentcontinuiteit/opmaak.js",
          "server/lib/documentcontinuiteit/merklogo.js",
          "server/lib/documentcontinuiteit/leesbaarheid.js",
          "server/lib/lettertypeFamilies.js",
          "server/lib/profielBevindingen.js",
          "server/lib/documentBestandsnaam.js",
          "server/lib/publiekeApi/registratie.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/index.js",
          "server/migrations/262_rapportly_documentcontinuiteit.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DocumentConceptWijziging"
              }
            }
          }
        },
        "x-bronref": "cfe078af"
      }
    },
    "/v1/rapporten/{versieId}/documentconcept/opmaak": {
      "post": {
        "operationId": "documentconcept_opmaak_aanvragen",
        "summary": "documentconcept opmaak aanvragen",
        "description": "Lege body of geen body. Expliciete opmaak/herstelactie op bestaande inhoud; vereist actuele trial/pakket-, object- en workflowpoort. Bij broncontrole_nodig moet serverbewijs gecontroleerde inhoud kunnen herstellen, anders 422. Een ontbrekende If-Match geeft 428; wijziging geeft 409. Idempotente herstelherhaling gebruikt dezelfde oorspronkelijke ETag en opdrachtcode. Na terminale oude opmaakjob kan de bewuste actie een nieuwe afgeleide inhoudsrevisie maken; oude bestanden worden niet gewist. Een al gekoppelde job wordt hergebruikt. HTTP 202 geeft conceptmetadata, geen algemene job-ID en geen bewijs dat PDF/Word klaar of oorspronkelijke vorm hersteld is. Lees metadata totdat het gewenste bestand beschikbaar is; beperkingen in ontbrekendeVereisten blijven zichtbaar.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "X-Rapportly-Client-Version",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
            }
          },
          {
            "name": "If-Match",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^\"[a-fA-F0-9-]{36}:[a-f0-9]{64}\"$"
            }
          },
          {
            "name": "versieId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentConceptMetadata"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "426": {
            "description": "Clientversie ontbreekt of ongeldig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Structuurbewerking, broncontrole of herstelcontract niet geldig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "documenten:wijzigen"
        ],
        "x-bronnen": [
          "server/lib/documentcontinuiteit/routes.js",
          "server/lib/documentcontinuiteit/store.js",
          "server/lib/documentcontinuiteit/inhoud.js",
          "server/lib/documentcontinuiteit/bewerken.js",
          "server/lib/documentcontinuiteit/opmaak.js",
          "server/lib/documentcontinuiteit/merklogo.js",
          "server/lib/documentcontinuiteit/leesbaarheid.js",
          "server/lib/lettertypeFamilies.js",
          "server/lib/profielBevindingen.js",
          "server/lib/documentBestandsnaam.js",
          "server/lib/publiekeApi/registratie.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/index.js",
          "server/migrations/262_rapportly_documentcontinuiteit.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LegeBody"
              }
            }
          }
        },
        "x-bronref": "cfe078af"
      }
    },
    "/v1/rapporten/{versieId}/documentconcept/download/{formaat}": {
      "get": {
        "operationId": "documentconcept_downloadlink",
        "summary": "documentconcept downloadlink",
        "description": "Tijdelijke privédownloadlink van 120 seconden, geen bytes in dit JSON-antwoord. Alleen pdf/docx; Word vereist bovendien actuele word_download-pakketfunctie. Bestand moet bij huidige inhoudhash en exact afgeleid privépad horen, anders 404. Opslaglinkfout 503. Optionele bestandsnaam is uitsluitend een gesaneerd downloadlabel; huidige revisie/datum worden door de gelezen rij bepaald. Geen vrije opslagpaden. Huidige rapportrechten worden vóór opslagondertekening gecontroleerd; de handler heeft geen tweede rechtenherlezing na linkaanmaak. Geen absolute claim dat oorspronkelijke opmaak beschikbaar is: status en ontbrekende vereisten apart beoordelen.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "formaat",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "pdf",
                "docx"
              ]
            }
          },
          {
            "name": "versieId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "bestandsnaam",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "bestandsnaam": {
                      "type": "string"
                    },
                    "inhoudId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "revisie": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 100
                    },
                    "bijgewerktOp": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "formaat": {
                      "type": "string",
                      "enum": [
                        "pdf",
                        "docx"
                      ]
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "inhoud_beschikbaar",
                        "opmaak_bezig",
                        "gedeeltelijk",
                        "concept_klaar"
                      ]
                    }
                  },
                  "required": [
                    "url",
                    "bestandsnaam",
                    "inhoudId",
                    "revisie",
                    "bijgewerktOp",
                    "formaat",
                    "status"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Structuurbewerking, broncontrole of herstelcontract niet geldig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/documentcontinuiteit/routes.js",
          "server/lib/documentcontinuiteit/store.js",
          "server/lib/documentcontinuiteit/inhoud.js",
          "server/lib/documentcontinuiteit/bewerken.js",
          "server/lib/documentcontinuiteit/opmaak.js",
          "server/lib/documentcontinuiteit/merklogo.js",
          "server/lib/documentcontinuiteit/leesbaarheid.js",
          "server/lib/lettertypeFamilies.js",
          "server/lib/profielBevindingen.js",
          "server/lib/documentBestandsnaam.js",
          "server/lib/publiekeApi/registratie.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/rapportlyApiSleutel.js",
          "server/index.js",
          "server/migrations/262_rapportly_documentcontinuiteit.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "cfe078af"
      }
    },
    "/v1/documentherstel/overzicht": {
      "get": {
        "operationId": "documentherstel_overzicht_lezen",
        "summary": "documentherstel overzicht lezen",
        "description": "Alleen huidige organisatiebeheerder met gebruik:lezen. Vaste periode 30 dagen, geen instelbare queryperiode of paginering. Per rapportversie de hoogste conceptrevisie die in deze periode is bijgewerkt; geen telling van alle revisies. Oorzaken worden per rapportversie uniek geteld en daarna aflopend aantal/code gesorteerd. Statuscategorieën blijven technisch: origineel, concept en gedeeltelijke uitvoer zijn afzonderlijk. Niet-beheerder 403; RPC-fout of niet-conform totaal/status/code/soort 503 document_hersteloverzicht_niet_beschikbaar, nooit stil nul. Geen klantinhoud of herstelmutatie.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentHerstelOverzicht"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "gebruik:lezen"
        ],
        "x-bronnen": [
          "server/lib/documentcontinuiteit/overzicht.js",
          "server/migrations/263_rapportly_documentherstel_overzicht.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "cfe078af"
      }
    },
    "/v1/beeldbank": {
      "get": {
        "operationId": "beeldbank_lezen",
        "summary": "beeldbank lezen",
        "description": "Actuele organisatie en actor; zichtbaar zijn teambeelden en de eigen persoonlijke beelden, zacht verwijderde beelden uitgesloten. Maximaal 500, nieuwste aangemaakt eerst; geen cursor of queryfilter. Readiness vereist schema 294, anders 503. Rolcontextfout valt terug naar lid zonder beheerdersbevoegdheid. Beleid- of gebruiksleesfout 503; een mislukte miniatuurondertekening geeft slechts preview_url:null. gebruikt_in beschrijft actieve stijlprofielen, geen volledige historische gebruiksinventaris.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "beelden": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/BeeldbankBeeld"
                      },
                      "maxItems": 500
                    },
                    "beleid": {
                      "$ref": "#/components/schemas/BeeldbankBeleid"
                    }
                  },
                  "required": [
                    "beelden",
                    "beleid"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "415": {
            "description": "Bestand/onderdeeltype of veilige afbeeldingsdecode ongeschikt: beeld_type_ongeldig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Afbeelding of opslagquotum kan niet worden verwerkt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/beeldbank/routes.js",
          "server/lib/beeldbank/repository.js",
          "server/lib/beeldbank/beeld.js",
          "server/lib/templateV2/contract.js",
          "server/lib/templateV2/veiligheid.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/publiekeApi/registratie.js",
          "server/migrations/292_rapportly_beeldbank.sql",
          "server/migrations/293_rapportly_beeldbank_deling.sql",
          "server/migrations/294_rapportly_beeldbank_engines.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "cfe078af"
      },
      "post": {
        "operationId": "beeldbank_uploaden",
        "summary": "beeldbank uploaden",
        "description": "Eén bestand, alleen naam/deling_scope als tekstvelden. Geen Idempotency-Key- of clientversieheader vereist. Originele naam is fallback als naam leeg/afwezig is. Veilige decode naar PNG en private miniatuur zonder originele metadata, beide tellen in opslagquotum. 201 nieuwe inhoud; 200 als zichtbare bestaande inhoudshash wordt hergebruikt. Een bestaand teambeeld gaat vóór persoonlijke inhoud met dezelfde hash en kan ook bij een persoonlijk verzoek terugkomen: lees deling_scope in de ontvangst. Een eigen persoonlijk beeld wordt niet vanzelf team; een teamupload kan een nieuw teambeeld maken. Geen transactie-ID of exacte requestreplay beloofd. gebruikt_in is in dit uploadantwoord leeg omdat deze route geen gebruiksinventaris ophaalt. Mutaties delen een IP-limiet van 30 per minuut, naast overige API-poorten. Trial/pakket en huidige schrijfrechten blijven vereist.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "beeld": {
                      "$ref": "#/components/schemas/BeeldbankBeeld"
                    }
                  },
                  "required": [
                    "beeld"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "201": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "beeld": {
                      "$ref": "#/components/schemas/BeeldbankBeeld"
                    }
                  },
                  "required": [
                    "beeld"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "415": {
            "description": "Bestand/onderdeeltype of veilige afbeeldingsdecode ongeschikt: beeld_type_ongeldig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Afbeelding of opslagquotum kan niet worden verwerkt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/beeldbank/routes.js",
          "server/lib/beeldbank/repository.js",
          "server/lib/beeldbank/beeld.js",
          "server/lib/templateV2/contract.js",
          "server/lib/templateV2/veiligheid.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/publiekeApi/registratie.js",
          "server/migrations/292_rapportly_beeldbank.sql",
          "server/migrations/293_rapportly_beeldbank_deling.sql",
          "server/migrations/294_rapportly_beeldbank_engines.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "bestand": {
                    "type": "string",
                    "format": "binary",
                    "description": "Eén lokale PNG/JPEG, op magicbytes gecontroleerd. Maximaal 5 MiB en 25 miljoen pixels, iedere zijde maximaal 20000 pixels. Decoder maximaal 5 seconden; genormaliseerde PNG ook maximaal 5 MiB."
                  },
                  "naam": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120,
                    "pattern": "^[^\\u0000-\\u001f\\u007f]*\\S[^\\u0000-\\u001f\\u007f]*$",
                    "description": "Canonieke naam. Native normalisatie zet invoer om naar tekst, verwijdert het paddeel en trimt; daarna maximaal 120 UTF-16-code-eenheden, zonder C0/DEL. Naamconflict geeft 409."
                  },
                  "deling_scope": {
                    "type": "string",
                    "enum": [
                      "persoonlijk",
                      "team"
                    ],
                    "default": "team",
                    "description": "Kies persoonlijk bewust voor een eigen beeld. Weglaten gebruikt team; trim/kleine letters worden genormaliseerd."
                  }
                },
                "required": [
                  "bestand"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "x-bronref": "cfe078af"
      }
    },
    "/v1/beeldbank/instellingen": {
      "put": {
        "operationId": "beeldbank_verwijderbeleid_bewaren",
        "summary": "beeldbank verwijderbeleid bewaren",
        "description": "Alleen actuele teambeheerder; boolean vereist. Bestuurt uitsluitend wie teambeelden mag verwijderen. Persoonlijke beelden blijven alleen voor hun eigenaar zichtbaar/verwijderbaar. Geen Idempotency-Key, ETag of clientversie vereist; dit is huidige waarde opslaan. Onbekende JSON-velden worden door publieke registratie geweigerd. Geen wijziging aan reeds bevroren documentkopieën.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "beleid": {
                      "$ref": "#/components/schemas/BeeldbankBeleid"
                    }
                  },
                  "required": [
                    "beleid"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "415": {
            "description": "Bestand/onderdeeltype of veilige afbeeldingsdecode ongeschikt: beeld_type_ongeldig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Afbeelding of opslagquotum kan niet worden verwerkt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/beeldbank/routes.js",
          "server/lib/beeldbank/repository.js",
          "server/lib/beeldbank/beeld.js",
          "server/lib/templateV2/contract.js",
          "server/lib/templateV2/veiligheid.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/publiekeApi/registratie.js",
          "server/migrations/292_rapportly_beeldbank.sql",
          "server/migrations/293_rapportly_beeldbank_deling.sql",
          "server/migrations/294_rapportly_beeldbank_engines.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "team_verwijderen_alleen_beheer": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "team_verwijderen_alleen_beheer"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "x-bronref": "cfe078af"
      }
    },
    "/v1/beeldbank/{id}": {
      "patch": {
        "operationId": "beeldbank_naam_of_deling_wijzigen",
        "summary": "beeldbank naam of deling wijzigen",
        "description": "Ten minste naam of deling_scope, geen andere publieke JSON-velden. Een zichtbaar teambeeld mag worden hernoemd; daadwerkelijke wijziging van deling_scope vereist de eigenaar. Dezelfde scope blijft zonder eigenaarswijziging staan. Naam wordt getrimd en van padprefix ontdaan; scope wordt getrimd en naar kleine letters gezet. Geen ETag/Idempotency-Key of clientversiecontract. Ontbrekend/onzichtbaar of ongeldige UUID 404, deling door niet-eigenaar 403, naamconflict 409. Ontvangst bevat actuele actieve stijlgebruikslijst.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "beeld": {
                      "$ref": "#/components/schemas/BeeldbankBeeld"
                    }
                  },
                  "required": [
                    "beeld"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "415": {
            "description": "Bestand/onderdeeltype of veilige afbeeldingsdecode ongeschikt: beeld_type_ongeldig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Afbeelding of opslagquotum kan niet worden verwerkt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/beeldbank/routes.js",
          "server/lib/beeldbank/repository.js",
          "server/lib/beeldbank/beeld.js",
          "server/lib/templateV2/contract.js",
          "server/lib/templateV2/veiligheid.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/publiekeApi/registratie.js",
          "server/migrations/292_rapportly_beeldbank.sql",
          "server/migrations/293_rapportly_beeldbank_deling.sql",
          "server/migrations/294_rapportly_beeldbank_engines.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "naam": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120,
                    "pattern": "^[^\\u0000-\\u001f\\u007f]*\\S[^\\u0000-\\u001f\\u007f]*$",
                    "description": "Canonieke naam. Native normalisatie zet invoer om naar tekst, verwijdert het paddeel en trimt; daarna maximaal 120 UTF-16-code-eenheden, zonder C0/DEL. Naamconflict geeft 409."
                  },
                  "deling_scope": {
                    "type": "string",
                    "enum": [
                      "persoonlijk",
                      "team"
                    ]
                  }
                },
                "required": [],
                "additionalProperties": false,
                "minProperties": 1
              }
            }
          }
        },
        "x-bronref": "cfe078af"
      },
      "delete": {
        "operationId": "beeldbank_verwijderen",
        "summary": "beeldbank verwijderen",
        "description": "Bewuste verwijderactie zonder body of extra bevestigingsveld. Eigen persoonlijke beelden door eigenaar; zichtbare teambeelden door leden tenzij huidig beleid beheer vereist. Ongeldige UUID 404; een geldige ontbrekende/onzichtbare of al verwijderde rij geeft ook 204. Zachte verwijdermarkering wordt opgeslagen; private bytes en quotum worden daarna best effort opgeruimd. 204 bewijst geen fysieke purge. Bevroren stijlversies behouden hun eigen kopieën. Geen Idempotency-Key, ETag of clientversie vereist; gewone trial-/pakketpoort voor deze schrijfroute blijft gelden.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Gevoelige antwoorden worden niet publiek gecachet."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "415": {
            "description": "Bestand/onderdeeltype of veilige afbeeldingsdecode ongeschikt: beeld_type_ongeldig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "422": {
            "description": "Afbeelding of opslagquotum kan niet worden verwerkt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "stijlen:beheren"
        ],
        "x-bronnen": [
          "server/lib/beeldbank/routes.js",
          "server/lib/beeldbank/repository.js",
          "server/lib/beeldbank/beeld.js",
          "server/lib/templateV2/contract.js",
          "server/lib/templateV2/veiligheid.js",
          "server/lib/publiekeApi/acties.js",
          "server/lib/publiekeApi/registratie.js",
          "server/migrations/292_rapportly_beeldbank.sql",
          "server/migrations/293_rapportly_beeldbank_deling.sql",
          "server/migrations/294_rapportly_beeldbank_engines.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "cfe078af"
      }
    },
    "/v1/klanten/crm-instellingen/{soort}": {
      "get": {
        "operationId": "crm_instellingen_lezen",
        "summary": "crm instellingen lezen",
        "description": "Lees de kantoorsjablonen of persoonlijke opgeslagen zoekopdrachten. Maximaal 30, geen paginering. De vaste revisie/waarde-envelop bewaart historische JSONwaarden zoals opgeslagen; actuele invoervormen zijn apart benoemd. Storing of ongeldige domeinenvelop geeft 503 crm_vervolg_onbeschikbaar, geen lege succeslijst. Iedere queryparameter geeft 400. Cache-Control private, no-store. Actuele sleutel/actor/delegatie wordt vóór en na de domeinactie gecontroleerd; intrekking tijdens het verzoek kan 403 geven. Volledige API-registratie blijft afhankelijk van de vrijgavevlag en overige algemene poorten.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "soort",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "sjablonen",
                "zoekopdrachten"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CrmInstellingenAntwoord"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/klantcrmVervolg.js",
          "server/lib/publiekeApi/domeinen.js",
          "server/lib/publiekeApi/schemaVoorStart.js",
          "server/lib/klantcrmVervolgLezen.js",
          "server/lib/publiekeApi/leesdelegatie.js",
          "server/migrations/370_rapportly_klantcrm_vervolg.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "c6fd0ca1",
        "x-aanvullende-bronnen": [
          {
            "bronref": "c00e325b",
            "bestand": "server/rapportly_api.js"
          },
          {
            "bronref": "c00e325b",
            "bestand": "server/migrations/370_rapportly_klantcrm_vervolg.sql"
          }
        ],
        "x-query-parameters-toegestaan": []
      }
    },
    "/v1/klanten/{id}/crm-bezoek": {
      "get": {
        "operationId": "crm_bezoek_lezen",
        "summary": "crm bezoek lezen",
        "description": "Lees alleen de actuele bezoekgrens voor klant en sleutelactor, met klantrechten vóór en na lezen. Geen queryparameters. Met RAPPORTLY_CRM_DUURZAAM_SCHRIJVEN=true bevat het antwoord revisie; met de vlag uit blijft de bestaande sinds/tot-vorm zonder revisie bestaan. sinds is de opgeslagen gezien_tot of null, tot de servergrens. Lezen schrijft geen markering en bewijst geen menselijke lees- of goedkeuractie. Gebruik bij een bewuste markering exact revisie en tot uit deze lezing. Cache-Control private, no-store. Bron/readfout geeft503 crm_vervolg_onbeschikbaar.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/CrmBezoekActueleStatus"
                    },
                    {
                      "$ref": "#/components/schemas/CrmBezoekStatusMetRevisie"
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/klantcrmVervolg.js",
          "server/lib/klantcrmVervolgMutaties.js",
          "server/lib/klantcrmVervolgLezen.js",
          "server/lib/publiekeApi/leesdelegatie.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/publiekeApi/domeinen.js",
          "server/lib/rapportlyPrivacy/crmPrivacy.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/migrations/370_rapportly_klantcrm_vervolg.sql",
          "server/migrations/375_rapportly_crm_privacy_vervolg.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "d964db8c",
        "x-aanvullende-bronnen": [
          {
            "bronref": "c00e325b",
            "bestand": "server/rapportly_api.js"
          },
          {
            "bronref": "c00e325b",
            "bestand": "server/migrations/370_rapportly_klantcrm_vervolg.sql"
          }
        ],
        "x-query-parameters-toegestaan": []
      },
      "post": {
        "operationId": "crm_bezoek_bewaren",
        "summary": "crm bezoek bewaren",
        "description": "Bewaar bewust de gelezen bezoekgrens op de huidige revisie. Geen toekomstige tot, automatische tijdkeuze of automatische revisieverhoging. Geen bewijs van menselijke lezing. Ontvangstherhaling geeft de huidige status plus oorspronkelijke ontvangst. Releasekandidaat d964db8c, niet live verklaard. Vereist RAPPORTLY_API_VOLLEDIG en RAPPORTLY_CRM_DUURZAAM_SCHRIJVEN=true, passende crminstelling-v1/crmvervolg-v1 readiness en volledige crmprivacy-v1 readiness uit375; ontbrekend/oud schema503 crm_vervolg_schema_onbeschikbaar. Alleen beschreven bodyvelden, bevestigd:true en Idempotency-Key16–128 met eerste teken letter/cijfer. Iedere queryparameter400. Actuele key/actor/org/pakket/bronrechten vóór en na actie, ook bij replay; verlopen trial402 en offboarding409 crm_privacy_geblokkeerd. Geen automatische retry: bewaar dezelfde oorspronkelijke identiteit/body na antwoordverlies. Stale revisie409 crm_gewijzigd; andere effectieve invoer onder dezelfde code409 crm_vervolg_herhaling_conflict. Geen provider, credits of algemene accountverwijdering. CRM375 sluit aan op bestaande260-klantbevestiging en bestaand365dagen-offboardingbesluit; tenant-runtime blijft apart verplicht.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CrmBezoekBewaarAntwoord"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              },
              "Idempotency-Replayed": {
                "schema": {
                  "const": "true"
                },
                "description": "Alleen bij ontvangst.herhaald:true."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken. crm_gewijzigd, crm_vervolg_herhaling_conflict of crm_privacy_geblokkeerd; geen automatisch herschrijven met nieuwe basis.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar. crm_vervolg_schema_onbeschikbaar of crm_vervolg_onbeschikbaar; een onzekere ontvangst is geen bewijs van niet-opslag.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/klantcrmVervolg.js",
          "server/lib/klantcrmVervolgMutaties.js",
          "server/lib/klantcrmVervolgLezen.js",
          "server/lib/publiekeApi/leesdelegatie.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/publiekeApi/domeinen.js",
          "server/lib/rapportlyPrivacy/crmPrivacy.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/migrations/370_rapportly_klantcrm_vervolg.sql",
          "server/migrations/375_rapportly_crm_privacy_vervolg.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "revisie": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 9007199254740990
                  },
                  "tot": {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,6})?(?:Z|[+-]\\d{2}:\\d{2})$",
                    "description": "Echt kalender-/tijdstip met tijdzone, seconden 00..59, maximaal zes fractiecijfers. Exact de herlezen servergrens gebruiken, geen toekomstig tijdstip."
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "revisie",
                  "tot",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "x-bronref": "d964db8c",
        "x-actie": "crm.bezoek_bewaren",
        "x-release-status": "releasekandidaat; activering en productieproef afzonderlijk vereist",
        "x-query-aanvullingen-toegestaan": false
      }
    },
    "/v1/klanten/crm-werk": {
      "get": {
        "operationId": "crm_werkpagina_lezen",
        "summary": "crm werkpagina lezen",
        "description": "Lees maximaal 10 huidige zichtbare klanten en maximaal 25 open actiepunten per klant. UUID-volgorde, geen deadlinevolgorde. Eerste pagina zonder query; volgende klantenpagina met na=pagina.volgende. Voor meer punten van één klant: klantId plus actiepuntNa=actiepuntenPagina.volgende, zonder na. Alleen deze drie queryvelden, ieder een enkele UUID-string; leeg, array, object en onbekende velden 400. actiepuntNa vereist klantId en verbiedt na. klantId zonder actiepuntNa kan ook met na; die cursor filtert dan de ene klant. Actuele klantrechten en gekoppelde actiepuntbronrechten blijven vereist. Cursors verlenen geen toegang en pinnen geen momentopname. Wijzigingen tussen pagina’s kunnen opnieuw lezen vanaf het begin vereisen; geen volledige organisatie-aggregatie of totaaltelling. Opgeslagen CRM-gegevens hebben een vaste envelop met expliciete open JSONvelden. API-delegatie wordt vóór en na gecontroleerd. Cache-Control private, no-store. Ongeldige invoer 400 crm_vervolg_invoer_ongeldig, ontbrekende klant 404 klant_niet_gevonden, actuele delegatie geweigerd 403 api_leesdelegatie_geweigerd, overige lees-/RPCfouten 503 crm_vervolg_onbeschikbaar. Geen fallback naar de oude onbegrensde reader. Actuele reader controleert vóór lezen crmleespaginas-v1 readiness. Ontbrekende of onzekere beschikbaarheid wordt door deze publieke registrar veilig vertaald naar 503 crm_vervolg_onbeschikbaar; geen terugval naar onbegrensde lijsten.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "na",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "klantId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "actiepuntNa",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CrmWerkPagina"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/klantcrmVervolg.js",
          "server/lib/publiekeApi/domeinen.js",
          "server/lib/publiekeApi/schemaVoorStart.js",
          "server/lib/klantcrmVervolgLezen.js",
          "server/lib/publiekeApi/leesdelegatie.js",
          "server/migrations/370_rapportly_klantcrm_vervolg.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "c6fd0ca1"
      }
    },
    "/v1/klanten/{id}/crm-reacties": {
      "get": {
        "operationId": "crm_reactiepagina_lezen",
        "summary": "crm reactiepagina lezen",
        "description": "Lees maximaal 50 globale reactie-kandidaten voor één klant in UUID-volgorde, gevolgd door actuele deelbaarstukcontrole. Alleen optionele enkele UUID-string na; overige queryvelden 400. Gebruik pagina.volgende als pagina.meer true is, ook als items leeg is. Klantrechten vóór en na de domeinlezing; onderliggende dossierbestanden/rapportversies moeten momenteel leesbaar en deelbaar zijn. Historische reacties op ingetrokken vrijgaven blijven binnen de bestaande kantoorhistorie mogelijk; geen klantportaaltoegang, nieuwe vrijgave, leesmarkering of akkoord door deze GET. API-delegatie wordt vóór en na gecontroleerd. Cache-Control private, no-store. Ongeldige invoer 400 crm_vervolg_invoer_ongeldig, ontbrekende klant 404 klant_niet_gevonden, actuele delegatie geweigerd 403 api_leesdelegatie_geweigerd, overige lees-/RPCfouten 503 crm_vervolg_onbeschikbaar. Geen fallback naar de oude onbegrensde reader. Actuele reader controleert vóór lezen crmleespaginas-v1 readiness. Ontbrekende of onzekere beschikbaarheid wordt door deze publieke registrar veilig vertaald naar 503 crm_vervolg_onbeschikbaar; geen terugval naar onbegrensde lijsten.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "na",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CrmReactiesPagina"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/klantcrmVervolg.js",
          "server/lib/publiekeApi/domeinen.js",
          "server/lib/publiekeApi/schemaVoorStart.js",
          "server/lib/klantcrmVervolgLezen.js",
          "server/lib/publiekeApi/leesdelegatie.js",
          "server/migrations/370_rapportly_klantcrm_vervolg.sql",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "c6fd0ca1"
      }
    },
    "/v1/bulkimports": {
      "post": {
        "operationId": "bulkimport_starten",
        "summary": "bulkimport starten",
        "description": "Start een volledige vaste import van 1–400 rijen. Originele sleutel, organisatie, actor, bulkImportId, Idempotency-Key, volledige oorspronkelijke body en gekozen profielversie zijn gebonden. Bewaar exact dezelfde body inclusief rijvolgorde en dezelfde opdrachtcode bij antwoordverlies; wijzig geen defaults of witruimte en stuur geen resterende deelset. Het server-import-ID is afgeleid en verschilt van bulkImportId. Huidige acteur/pakket, persoonlijke werkelijke kostenmodus, maandplafond, profiel/bron/renderrechten en queue/readiness blijven vereist. Per 40 numeriek gesorteerde rijen wordt een volgende startgroep tien minuten later beschikbaar, verankerd op de eerste ontvangsttijd. Dit reserveert geen vaste voltooiing of vaste prijs. Ontvangst komt vóór private input/queue. Bij een onderbroken upload/planning kunnen al vaste rijen bestaan; dezelfde volledige aanvraag vervolgt uitsluitend nog niet ingeplande rijen en start bestaande mislukte/onzekere jobs niet opnieuw. Tweede talen vereisen huidige pakket-/feature/readiness en vaste ouderbinding. Het oudere aanvullen van ontbrekende taaluitvoer is in deze kandidaat gesloten. Native-only klant-/uploadroutes zijn geen deel van dit bulkcontract. De POST-handler heeft geen afzonderlijke queryafwijzing; gebruik geen queryparameters. Veilige domeinfouten bevatten code; huidige verweigerde toegang 403, binding/native-conflict 409, daglimiet 429 gratis_daglimiet, maandbudget/trial 402 en ontbrekend/onzeker contract 503. Een fout betekent niet dat eerder ingeplande rijen verdwenen zijn. Geen automatische nieuwe import of sleutel na onzeker antwoord. Kandidaatbron a2f438b8 behoudt de gesloten bulkgrens: iedere effectief ingeschakelde tweede taal wordt vóór ontvangst, private opslag, voorStart en queue geweigerd met409 api_bulkimport_taalretentie_niet_vrijgegeven. Dit geldt ook voor herhaling met eerder bevroren secundair beleid. Ontbrekend beleid of inherit kan via kantoorvoorkeur alsnog een tweede taal inschakelen; kies voor nieuwe import beide secundaire uitkomsten expliciet off. Verander bij replay de oorspronkelijke body niet. Geen aanvullingsroute voor ontbrekende oude taaluitvoer. De hele-importbewaargrens, mogelijk over meerdere klanten, is niet vrijgegeven. Primaire bulk zonder tweede taal houdt haar bestaande contract.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PubliekeBulkImportOntvangst"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken. Kandidaatbron a2f438b8 behoudt de gesloten bulkgrens: iedere effectief ingeschakelde tweede taal wordt vóór ontvangst, private opslag, voorStart en queue geweigerd met409 api_bulkimport_taalretentie_niet_vrijgegeven. Dit geldt ook voor herhaling met eerder bevroren secundair beleid. Ontbrekend beleid of inherit kan via kantoorvoorkeur alsnog een tweede taal inschakelen; kies voor nieuwe import beide secundaire uitkomsten expliciet off. Verander bij replay de oorspronkelijke body niet. Geen aanvullingsroute voor ontbrekende oude taaluitvoer. De hele-importbewaargrens, mogelijk over meerdere klanten, is niet vrijgegeven. Primaire bulk zonder tweede taal houdt haar bestaande contract.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "verwerkingen:starten",
          "resultaten:lezen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/bulkImport.js",
          "server/lib/publiekeApi/bulkImportContract.js",
          "server/lib/publiekeApi/bulkImportOntvangst.js",
          "server/lib/bulkImportContract.js",
          "server/lib/bulkImportContext.js",
          "server/lib/bulkImportReadiness.js",
          "server/jobs/adapters/bulkImportInput.js",
          "server/lib/rapportDagcap.js",
          "server/lib/rapportDagcapOnderhoud.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/rapportly_api.js",
          "server/index.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/publiekeApi/registratie.js",
          "server/lib/rapportlyApiSleutel.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PubliekeBulkImportInvoer"
              }
            }
          }
        },
        "x-bronref": "c00e325b",
        "x-aanvullende-bronnen": [
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalRetentieReleasegrens.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalService.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowRunnerRoutes.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalContract.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/bulkTaalProductie.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImport.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImportOntvangst.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/376_rapportly_taal_ouderlevensduur.sql"
          }
        ]
      }
    },
    "/v1/bulkimports/{id}": {
      "get": {
        "operationId": "bulkimport_status_lezen",
        "summary": "bulkimport status lezen",
        "description": "Lees de volledige begrensde importstatus met de oorspronkelijke client-bulkImportId en dezelfde sleutel/actor/organisatie. Niet opdracht_id of een native import-ID gebruiken. Iedere queryparameter of ongeldige UUID geeft 400. Bestaande import wordt onder huidige key/actor/pakket en profielbinding gelezen; per rij huidige dossier-/klant-/bronrechten. Een andere sleutel kan geen import adopteren. Bij ontbrekende eigen ontvangst 404. Geen mutatie, vervolgstart of nieuw creditverbruik door deze status-GET; verlangde taalstatus kan bij ontbrekende schema-/toegangsvoorwaarden weigeren. Veilige domeinfouten bevatten code; huidige verweigerde toegang 403, binding/native-conflict 409, daglimiet 429 gratis_daglimiet, maandbudget/trial 402 en ontbrekend/onzeker contract 503. Een fout betekent niet dat eerder ingeplande rijen verdwenen zijn. Geen automatische nieuwe import of sleutel na onzeker antwoord. Historische tweede-taalstatus geeft geen start-/aanvulrecht. Kandidaatbron a2f438b8 behoudt de gesloten bulkgrens: iedere effectief ingeschakelde tweede taal wordt vóór ontvangst, private opslag, voorStart en queue geweigerd met409 api_bulkimport_taalretentie_niet_vrijgegeven. Dit geldt ook voor herhaling met eerder bevroren secundair beleid. Ontbrekend beleid of inherit kan via kantoorvoorkeur alsnog een tweede taal inschakelen; kies voor nieuwe import beide secundaire uitkomsten expliciet off. Verander bij replay de oorspronkelijke body niet. Geen aanvullingsroute voor ontbrekende oude taaluitvoer. De hele-importbewaargrens, mogelijk over meerdere klanten, is niet vrijgegeven. Primaire bulk zonder tweede taal houdt haar bestaande contract.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PubliekeBulkImportStatus"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "resultaten:lezen",
          "verwerkingen:starten"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/bulkImport.js",
          "server/lib/publiekeApi/bulkImportContract.js",
          "server/lib/publiekeApi/bulkImportOntvangst.js",
          "server/lib/bulkImportContract.js",
          "server/lib/bulkImportContext.js",
          "server/lib/bulkImportReadiness.js",
          "server/jobs/adapters/bulkImportInput.js",
          "server/lib/rapportDagcap.js",
          "server/lib/rapportDagcapOnderhoud.js",
          "server/lib/tweedeUitvoertaal.js",
          "server/rapportly_api.js",
          "server/index.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/publiekeApi/registratie.js",
          "server/lib/rapportlyApiSleutel.js"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "c00e325b",
        "x-query-parameters-toegestaan": [],
        "x-aanvullende-bronnen": [
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalRetentieReleasegrens.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalService.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowRunnerRoutes.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/workflowTaalContract.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/taalProductieContext.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/uitvoer/bulkTaalProductie.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImport.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/lib/publiekeApi/bulkImportOntvangst.js"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql"
          },
          {
            "bronref": "a2f438b8",
            "bestand": "server/migrations/376_rapportly_taal_ouderlevensduur.sql"
          }
        ]
      }
    },
    "/v1/klanten/{id}/portaal": {
      "get": {
        "operationId": "portaal_lezen",
        "summary": "portaal lezen",
        "description": "Lees portaalbasis, adres_basis, zichtbare vrijgaven, laatste aanleveringen en laatste uitnodigingsstatus. Iedere queryparameter geeft 400. Geen leesmarkering, nieuwe uitnodiging, link of provideractie. Het kantoor ziet uitsluitend huidige eigen klant-/stukrechten. Vereist klanten:delen, oorspronkelijke key/actor/organisatie, huidige klant-/bronrechten en volledige API-vrijgave. Kantoorrol bedrijf; een klantlogin of metadatahint is geen kantoorbevoegdheid. Portaal-killswitch geeft 404. Cache-Control private, no-store zodra de klantpoort is bereikt. Deze routes maken de klant-JWT-router niet publiek en geven geen toegang tot onvrijgegeven stukken.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PortaalLeesAntwoord"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer. Mogelijke portaalcode: portaal_invoer_ongeldig, portaal_ontvangst_verplicht, portaal_email_ontbreekt. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht. Mogelijke portaalcode: portaal_actor_geweigerd, portaal_pakket_geweigerd. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar. Mogelijke portaalcode: portaal_niet_gevonden, portaal_stuk_geweigerd. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken. Mogelijke portaalcode: portaal_basis_conflict, portaal_herhaling_conflict, portaal_al_vrijgegeven, portaal_uitnodiging_herstel_verplicht, portaal_identiteit_geweigerd, portaal_bestemming_geweigerd. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt. Mogelijke portaalcode: portaal_basis_verplicht. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar. Mogelijke portaalcode: portaal_opslag_onbeschikbaar, portaal_provider_onbeschikbaar. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:delen"
        ],
        "x-bronnen": [
          "server/lib/klantportaalKantoorRoutes.js",
          "server/lib/klantportaalKantoor.js",
          "server/lib/klantportaalUitnodiging.js",
          "server/lib/klantrechten.js",
          "server/lib/klantmapContact.js",
          "server/rapportly_klantportaal_api.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/publiekeApi/registratie.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/migrations/307_rapportly_klantportaal.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "x-bronref": "c00e325b",
        "x-query-parameters-toegestaan": []
      },
      "delete": {
        "operationId": "portaal_intrekken",
        "summary": "portaal intrekken",
        "description": "Trek portaaltoegang in door actief:false. Behoud authidentiteit, bestaande stukken en uitnodigingshistorie. Dit verwijdert geen authaccount of klantdossier. Na verlopen proefperiode toegestaan, overige huidige rechten blijven nodig. Vereist klanten:delen, oorspronkelijke key/actor/organisatie, huidige klant-/bronrechten en volledige API-vrijgave. Kantoorrol bedrijf; een klantlogin of metadatahint is geen kantoorbevoegdheid. Portaal-killswitch geeft 404. Cache-Control private, no-store zodra de klantpoort is bereikt. Deze routes maken de klant-JWT-router niet publiek en geven geen toegang tot onvrijgegeven stukken. Body gesloten; bevestigd:true en huidige UUID-basis verplicht. Idempotency-Key 16–128 veilige tekens, eerste teken letter/cijfer. Bewaar body en sleutel bij antwoordverlies. Ontbrekende/ongeldige basis geeft 428 portaal_basis_verplicht; gewijzigde basis of gewijzigd herhaalverzoek geeft 409. De mutatiehandler wijst queryparameters niet apart af; gebruik geen query.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PortaalWijzigAntwoord"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer. Mogelijke portaalcode: portaal_invoer_ongeldig, portaal_ontvangst_verplicht, portaal_email_ontbreekt. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht. Mogelijke portaalcode: portaal_actor_geweigerd, portaal_pakket_geweigerd. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar. Mogelijke portaalcode: portaal_niet_gevonden, portaal_stuk_geweigerd. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken. Mogelijke portaalcode: portaal_basis_conflict, portaal_herhaling_conflict, portaal_al_vrijgegeven, portaal_uitnodiging_herstel_verplicht, portaal_identiteit_geweigerd, portaal_bestemming_geweigerd. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt. Mogelijke portaalcode: portaal_basis_verplicht. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar. Mogelijke portaalcode: portaal_opslag_onbeschikbaar, portaal_provider_onbeschikbaar. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:delen"
        ],
        "x-bronnen": [
          "server/lib/klantportaalKantoorRoutes.js",
          "server/lib/klantportaalKantoor.js",
          "server/lib/klantportaalUitnodiging.js",
          "server/lib/klantrechten.js",
          "server/lib/klantmapContact.js",
          "server/rapportly_klantportaal_api.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/publiekeApi/registratie.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/migrations/307_rapportly_klantportaal.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "basis",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "x-bronref": "c00e325b"
      },
      "post": {
        "operationId": "portaal_uitnodigen",
        "summary": "portaal uitnodigen",
        "description": "Bewuste uitnodiging/activering op gelezen basis én adres_basis. Ontvanger komt uitsluitend uit de bestaande klantmap; geen email, afzender, link of redirect in body. Vereist huidig portaalpakket en lopende proefperiode/betaalde toegang, ook op herhaling. Bestemming/white-labelrechten worden vóór auth, mail en koppelen opnieuw bewezen. Een bestaande gekoppelde identiteit kan worden hervat zonder nieuwe mail; metadata geeft nooit ownership. Kantoor/team/partneridentiteiten worden niet als klant geadopteerd. Een externe poging is vóór aanroepen duurzaam onzeker; timeout geeft geen veilige retry. Dezelfde ontvangst start nooit nogmaals auth of mail. Ook een nieuwe sleutel kan een blokkerende onzekere poging niet omzeilen. Mail aangeboden is geen bezorgd. Een link/OTP blijft uitsluitend in de providerhandeling en komt nooit terug in deze API. Vereist klanten:delen, oorspronkelijke key/actor/organisatie, huidige klant-/bronrechten en volledige API-vrijgave. Kantoorrol bedrijf; een klantlogin of metadatahint is geen kantoorbevoegdheid. Portaal-killswitch geeft 404. Cache-Control private, no-store zodra de klantpoort is bereikt. Deze routes maken de klant-JWT-router niet publiek en geven geen toegang tot onvrijgegeven stukken. Body gesloten; bevestigd:true en huidige UUID-basis verplicht. Idempotency-Key 16–128 veilige tekens, eerste teken letter/cijfer. Bewaar body en sleutel bij antwoordverlies. Ontbrekende/ongeldige basis geeft 428 portaal_basis_verplicht; gewijzigde basis of gewijzigd herhaalverzoek geeft 409. De mutatiehandler wijst queryparameters niet apart af; gebruik geen query.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PortaalUitnodigingAntwoord"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer. Mogelijke portaalcode: portaal_invoer_ongeldig, portaal_ontvangst_verplicht, portaal_email_ontbreekt. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht. Mogelijke portaalcode: portaal_actor_geweigerd, portaal_pakket_geweigerd. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar. Mogelijke portaalcode: portaal_niet_gevonden, portaal_stuk_geweigerd. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken. Mogelijke portaalcode: portaal_basis_conflict, portaal_herhaling_conflict, portaal_al_vrijgegeven, portaal_uitnodiging_herstel_verplicht, portaal_identiteit_geweigerd, portaal_bestemming_geweigerd. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt. Mogelijke portaalcode: portaal_basis_verplicht. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar. Mogelijke portaalcode: portaal_opslag_onbeschikbaar, portaal_provider_onbeschikbaar. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "202": {
            "description": "Auth-/mailuitkomst onzeker; lees ontvangst en huidige status. Geen automatische retry met een nieuwe sleutel.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PortaalUitnodigingAntwoord"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:delen"
        ],
        "x-bronnen": [
          "server/lib/klantportaalKantoorRoutes.js",
          "server/lib/klantportaalKantoor.js",
          "server/lib/klantportaalUitnodiging.js",
          "server/lib/klantrechten.js",
          "server/lib/klantmapContact.js",
          "server/rapportly_klantportaal_api.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/publiekeApi/registratie.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/migrations/307_rapportly_klantportaal.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "adres_basis": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "basis",
                  "adres_basis",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "x-bronref": "c00e325b"
      }
    },
    "/v1/klanten/{id}/portaal/uitnodigingen/{aanvraagId}/stoppen": {
      "post": {
        "operationId": "portaal_uitnodiging_stoppen",
        "summary": "portaal uitnodiging stoppen",
        "description": "Stop uitsluitend de oorspronkelijke eigen uitnodigingsintentie vóór gekoppeld. Reeds gekoppeld geeft 409; trek dan portaaltoegang in via DELETE. Stoppen annuleert geen reeds lopende externe aanvraag, verwijdert geen authuser en bewijst geen afwezigheid van mail. Na eerdere externe start blijft blokkeert bestaan voor afzonderlijke beheerdersreconciliatie. Een reeds gestopte intentie kan herhaald:true geven met een nieuwe stopcode; bij dezelfde oorspronkelijke stopcode met gewijzigde basis blijft 409 gelden. Na verlopen proefperiode toegestaan. Vereist klanten:delen, oorspronkelijke key/actor/organisatie, huidige klant-/bronrechten en volledige API-vrijgave. Kantoorrol bedrijf; een klantlogin of metadatahint is geen kantoorbevoegdheid. Portaal-killswitch geeft 404. Cache-Control private, no-store zodra de klantpoort is bereikt. Deze routes maken de klant-JWT-router niet publiek en geven geen toegang tot onvrijgegeven stukken. Body gesloten; bevestigd:true en huidige UUID-basis verplicht. Idempotency-Key 16–128 veilige tekens, eerste teken letter/cijfer. Bewaar body en sleutel bij antwoordverlies. Ontbrekende/ongeldige basis geeft 428 portaal_basis_verplicht; gewijzigde basis of gewijzigd herhaalverzoek geeft 409. De mutatiehandler wijst queryparameters niet apart af; gebruik geen query.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "aanvraagId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ontvangst": {
                      "$ref": "#/components/schemas/PortaalUitnodigingStatus"
                    },
                    "herhaald": {
                      "type": "boolean"
                    },
                    "huidig": {
                      "type": "object",
                      "properties": {
                        "basis": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "actief": {
                          "type": "boolean"
                        },
                        "heeft_toegang": {
                          "type": "boolean"
                        },
                        "email": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "uitgenodigd_op": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "date-time"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "vrijgaven": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              },
                              "soort": {
                                "type": "string",
                                "enum": [
                                  "rapportversie",
                                  "dossierbestand"
                                ]
                              },
                              "object_id": {
                                "type": "string"
                              },
                              "titel": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "vrijgegeven_op": {
                                "type": "string",
                                "format": "date-time"
                              }
                            },
                            "required": [
                              "id",
                              "soort",
                              "object_id",
                              "titel",
                              "vrijgegeven_op"
                            ],
                            "additionalProperties": false,
                            "description": "Actuele niet-ingetrokken vrijgave met huidig bronbewijs. object_id is bij rapportversie een UUID, bij dossierbestand de reeds bestaande opslagidentificatie; geen willekeurige download-URL. Historische titel/objectlengtes worden niet achteraf genormaliseerd."
                          }
                        },
                        "aanleveringen": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                              },
                              "bestandsnaam": {
                                "type": "string"
                              },
                              "soort": {
                                "type": "string",
                                "enum": [
                                  "opname",
                                  "document"
                                ]
                              },
                              "bytes": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "aangeleverd_op": {
                                "type": "string",
                                "format": "date-time"
                              }
                            },
                            "required": [
                              "id",
                              "bestandsnaam",
                              "soort",
                              "bytes",
                              "aangeleverd_op"
                            ],
                            "additionalProperties": false
                          },
                          "maxItems": 50
                        },
                        "adres_basis": {
                          "type": "string",
                          "pattern": "^[a-f0-9]{64}$"
                        },
                        "beschikbaar": {
                          "type": "boolean"
                        },
                        "versiecontrole": {
                          "const": true
                        },
                        "uitnodiging": {
                          "anyOf": [
                            {
                              "$ref": "#/components/schemas/PortaalUitnodigingStatus"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "inlog_email": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "basis",
                        "actief",
                        "heeft_toegang",
                        "email",
                        "uitgenodigd_op",
                        "vrijgaven",
                        "aanleveringen",
                        "adres_basis",
                        "beschikbaar",
                        "versiecontrole",
                        "uitnodiging"
                      ],
                      "additionalProperties": false,
                      "description": "Bij een zojuist bewezen koppeling kan inlog_email aanwezig zijn. Een herhaling kan alleen de huidige toestand zonder dat aanvullende authadres geven."
                    }
                  },
                  "required": [
                    "ontvangst",
                    "herhaald",
                    "huidig"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer. Mogelijke portaalcode: portaal_invoer_ongeldig, portaal_ontvangst_verplicht, portaal_email_ontbreekt. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht. Mogelijke portaalcode: portaal_actor_geweigerd, portaal_pakket_geweigerd. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar. Mogelijke portaalcode: portaal_niet_gevonden, portaal_stuk_geweigerd. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken. Mogelijke portaalcode: portaal_basis_conflict, portaal_herhaling_conflict, portaal_al_vrijgegeven, portaal_uitnodiging_herstel_verplicht, portaal_identiteit_geweigerd, portaal_bestemming_geweigerd. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt. Mogelijke portaalcode: portaal_basis_verplicht. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar. Mogelijke portaalcode: portaal_opslag_onbeschikbaar, portaal_provider_onbeschikbaar. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:delen"
        ],
        "x-bronnen": [
          "server/lib/klantportaalKantoorRoutes.js",
          "server/lib/klantportaalKantoor.js",
          "server/lib/klantportaalUitnodiging.js",
          "server/lib/klantrechten.js",
          "server/lib/klantmapContact.js",
          "server/rapportly_klantportaal_api.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/publiekeApi/registratie.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/migrations/307_rapportly_klantportaal.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "basis",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "x-bronref": "c00e325b"
      }
    },
    "/v1/klanten/{id}/portaal/vrijgaven": {
      "post": {
        "operationId": "portaal_stuk_vrijgeven",
        "summary": "portaal stuk vrijgeven",
        "description": "Geef één bestaand eigen rapport of dossierbestand expliciet vrij. Actueel Pro+-portaalpakket en proefperiode/betaalde toegang vereist, ook bij herhaling. Rapport moet klaar met bestaande PDF zijn; bestand heeft ondersteunde document-/afbeeldingsextensie en is geen opname/audio/transcript. Dossier hoort bij deze klant en alle huidige bronrechten worden bewezen en in dezelfde transactie herlezen. Invoer is geen bewijs van deelbaarheid. Een actieve dubbele vrijgave geeft 409. Deze actie verstuurt geen mail en maakt geen download-URL. Vereist klanten:delen, oorspronkelijke key/actor/organisatie, huidige klant-/bronrechten en volledige API-vrijgave. Kantoorrol bedrijf; een klantlogin of metadatahint is geen kantoorbevoegdheid. Portaal-killswitch geeft 404. Cache-Control private, no-store zodra de klantpoort is bereikt. Deze routes maken de klant-JWT-router niet publiek en geven geen toegang tot onvrijgegeven stukken. Body gesloten; bevestigd:true en huidige UUID-basis verplicht. Idempotency-Key 16–128 veilige tekens, eerste teken letter/cijfer. Bewaar body en sleutel bij antwoordverlies. Ontbrekende/ongeldige basis geeft 428 portaal_basis_verplicht; gewijzigde basis of gewijzigd herhaalverzoek geeft 409. De mutatiehandler wijst queryparameters niet apart af; gebruik geen query.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PortaalWijzigAntwoord"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer. Mogelijke portaalcode: portaal_invoer_ongeldig, portaal_ontvangst_verplicht, portaal_email_ontbreekt. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht. Mogelijke portaalcode: portaal_actor_geweigerd, portaal_pakket_geweigerd. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar. Mogelijke portaalcode: portaal_niet_gevonden, portaal_stuk_geweigerd. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken. Mogelijke portaalcode: portaal_basis_conflict, portaal_herhaling_conflict, portaal_al_vrijgegeven, portaal_uitnodiging_herstel_verplicht, portaal_identiteit_geweigerd, portaal_bestemming_geweigerd. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt. Mogelijke portaalcode: portaal_basis_verplicht. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar. Mogelijke portaalcode: portaal_opslag_onbeschikbaar, portaal_provider_onbeschikbaar. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:delen"
        ],
        "x-bronnen": [
          "server/lib/klantportaalKantoorRoutes.js",
          "server/lib/klantportaalKantoor.js",
          "server/lib/klantportaalUitnodiging.js",
          "server/lib/klantrechten.js",
          "server/lib/klantmapContact.js",
          "server/rapportly_klantportaal_api.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/publiekeApi/registratie.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/migrations/307_rapportly_klantportaal.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "bevestigd": {
                    "const": true
                  },
                  "soort": {
                    "type": "string",
                    "enum": [
                      "rapportversie",
                      "dossierbestand"
                    ]
                  },
                  "object_id": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 400,
                    "pattern": "^(?=.*\\S)[^\\u0000-\\u001f\\u007f]+$",
                    "description": "Bestaande objectidentificatie. String vóór trimmen maximaal 400 UTF-16-eenheden, geen controltekens. Voor rapportversie bovendien UUID v1–8; voor dossierbestand bestaand opslag_pad, geen nieuwe vrije bestemming."
                  },
                  "titel": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 200,
                        "pattern": "^[^\\u0000-\\u001f\\u007f]*$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": [
                  "basis",
                  "bevestigd",
                  "soort",
                  "object_id"
                ],
                "additionalProperties": false,
                "allOf": [
                  {
                    "if": {
                      "properties": {
                        "soort": {
                          "const": "rapportversie"
                        }
                      }
                    },
                    "then": {
                      "properties": {
                        "object_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        }
                      }
                    }
                  }
                ],
                "description": "Titel mag ontbreken, null of leeg zijn; leeg wordt null. Geen automatische inkorting of extra velden. Gebruik uitsluitend identificaties van eigen bestaande stukken."
              }
            }
          }
        },
        "x-bronref": "c00e325b"
      }
    },
    "/v1/klanten/{id}/portaal/vrijgaven/{vrijgaveId}": {
      "delete": {
        "operationId": "portaal_stuk_intrekken",
        "summary": "portaal stuk intrekken",
        "description": "Trek uitsluitend deze eigen actieve vrijgave in. Het oorspronkelijke document blijft bestaan; een herhaalde ontvangen intrekking geeft huidige toestand met oorspronkelijke receipt. Een andere of ontbrekende actieve vrijgave geeft 404. Na verlopen proefperiode toegestaan, overige huidige rechten blijven nodig. Vereist klanten:delen, oorspronkelijke key/actor/organisatie, huidige klant-/bronrechten en volledige API-vrijgave. Kantoorrol bedrijf; een klantlogin of metadatahint is geen kantoorbevoegdheid. Portaal-killswitch geeft 404. Cache-Control private, no-store zodra de klantpoort is bereikt. Deze routes maken de klant-JWT-router niet publiek en geven geen toegang tot onvrijgegeven stukken. Body gesloten; bevestigd:true en huidige UUID-basis verplicht. Idempotency-Key 16–128 veilige tekens, eerste teken letter/cijfer. Bewaar body en sleutel bij antwoordverlies. Ontbrekende/ongeldige basis geeft 428 portaal_basis_verplicht; gewijzigde basis of gewijzigd herhaalverzoek geeft 409. De mutatiehandler wijst queryparameters niet apart af; gebruik geen query.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "vrijgaveId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PortaalWijzigAntwoord"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer. Mogelijke portaalcode: portaal_invoer_ongeldig, portaal_ontvangst_verplicht, portaal_email_ontbreekt. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht. Mogelijke portaalcode: portaal_actor_geweigerd, portaal_pakket_geweigerd. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar. Mogelijke portaalcode: portaal_niet_gevonden, portaal_stuk_geweigerd. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken. Mogelijke portaalcode: portaal_basis_conflict, portaal_herhaling_conflict, portaal_al_vrijgegeven, portaal_uitnodiging_herstel_verplicht, portaal_identiteit_geweigerd, portaal_bestemming_geweigerd. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt. Mogelijke portaalcode: portaal_basis_verplicht. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar. Mogelijke portaalcode: portaal_opslag_onbeschikbaar, portaal_provider_onbeschikbaar. Een fout kan na een eerdere duurzame stap volgen; geen rollback of ongebruikte externe poging afleiden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:delen"
        ],
        "x-bronnen": [
          "server/lib/klantportaalKantoorRoutes.js",
          "server/lib/klantportaalKantoor.js",
          "server/lib/klantportaalUitnodiging.js",
          "server/lib/klantrechten.js",
          "server/lib/klantmapContact.js",
          "server/rapportly_klantportaal_api.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/publiekeApi/registratie.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/migrations/307_rapportly_klantportaal.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "basis": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "basis",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "x-bronref": "c00e325b"
      }
    },
    "/v1/klanten/crm-instellingen/sjablonen": {
      "put": {
        "operationId": "crm_sjablonen_wijzigen",
        "summary": "crm sjablonen wijzigen",
        "description": "Vervang de volledige instellingenlijst op exacte huidige revisie. Geen onbekende velden, stringbooleans of nummercoercie. JSON-verzoek maximaal 100 KiB; daarnaast maximaal 500000 bytes genormaliseerde waarde en de PostgreSQL-JSONtekstgrens. Ontbrekende rij gebruikt revisie 0. De publieke middleware en domeinservice vereisen samen Idempotency-Key 16–128, beginnend met letter/cijfer. De ontvangst bindt oorspronkelijke sleutel/org/actor, soort, revisie en volledige effectieve genormaliseerde inhoud. Identieke ontvangstherhaling wijzigt niets en retourneert de huidige revisie/waarde plus de oorspronkelijke ontvangst; nooit de oude lijst automatisch terugschrijven. Andere effectieve inhoud of soort bij dezelfde code geeft 409. Nieuwe code met verouderde revisie geeft 409 crm_gewijzigd. Lopende proefperiode, crminstelling-v1 readiness en actuele rechten blijven ook bij herhaling vereist. Onzekere transactie/readback of delegatiefout na opslag betekent niet dat niets is gewijzigd: herhaal dezelfde opdracht bij herstelde toegang en lees de huidige toestand. Geen providerstart, nieuw pakket of creditsclaim. De nieuwe receipt wordt atomisch met de bestaande 370-CAS-writer opgeslagen; directe service-DML buiten die writer is geen ontvangstgarantie. Iedere queryparameter geeft 400. Cache-Control private, no-store. Actuele sleutel/actor/delegatie wordt vóór en na de domeinactie gecontroleerd; intrekking tijdens het verzoek kan 403 geven. Volledige API-registratie blijft afhankelijk van de vrijgavevlag en overige algemene poorten. Releasekandidaat d964db8c, niet live verklaard. Vereist RAPPORTLY_API_VOLLEDIG en RAPPORTLY_CRM_DUURZAAM_SCHRIJVEN=true, passende crminstelling-v1/crmvervolg-v1 readiness en volledige crmprivacy-v1 readiness uit375; ontbrekend/oud schema503 crm_vervolg_schema_onbeschikbaar. Alleen beschreven bodyvelden, bevestigd:true en Idempotency-Key16–128 met eerste teken letter/cijfer. Iedere queryparameter400. Actuele key/actor/org/pakket/bronrechten vóór en na actie, ook bij replay; verlopen trial402 en offboarding409 crm_privacy_geblokkeerd. Geen automatische retry: bewaar dezelfde oorspronkelijke identiteit/body na antwoordverlies. Stale revisie409 crm_gewijzigd; andere effectieve invoer onder dezelfde code409 crm_vervolg_herhaling_conflict. Geen provider, credits of algemene accountverwijdering. CRM375 sluit aan op bestaande260-klantbevestiging en bestaand365dagen-offboardingbesluit; tenant-runtime blijft apart verplicht.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CrmInstellingenBewaarAntwoord"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              },
              "Idempotency-Replayed": {
                "schema": {
                  "const": "true"
                },
                "description": "Alleen bij ontvangst.herhaald:true."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer. Domein-/ontvangstcodes: crm_ongeldig, crm_vervolg_invoer_ongeldig. Algemene middlewarefouten kunnen eerder optreden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend. Domein-/ontvangstcodes: rapportly_proefperiode_verlopen. Algemene middlewarefouten kunnen eerder optreden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht. Domein-/ontvangstcodes: crm_vervolg_actor_geweigerd, crm_vervolg_bron_geweigerd, crm_vervolg_pakket_geweigerd, api_leesdelegatie_geweigerd. Algemene middlewarefouten kunnen eerder optreden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken. Domein-/ontvangstcodes: crm_gewijzigd, crm_vervolg_herhaling_conflict. Algemene middlewarefouten kunnen eerder optreden. crm_gewijzigd, crm_vervolg_herhaling_conflict of crm_privacy_geblokkeerd; geen automatisch herschrijven met nieuwe basis.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar. Domein-/ontvangstcodes: rapportly_proefperiodecontrole_onbeschikbaar, crm_vervolg_schema_onbeschikbaar, crm_vervolg_onbeschikbaar. Algemene middlewarefouten kunnen eerder optreden. crm_vervolg_schema_onbeschikbaar of crm_vervolg_onbeschikbaar; een onzekere ontvangst is geen bewijs van niet-opslag.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "teaminstellingen:wijzigen"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/klantcrmVervolg.js",
          "server/lib/klantcrmVervolgMutaties.js",
          "server/lib/klantcrmVervolgLezen.js",
          "server/lib/publiekeApi/leesdelegatie.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/publiekeApi/domeinen.js",
          "server/lib/rapportlyPrivacy/crmPrivacy.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/migrations/370_rapportly_klantcrm_vervolg.sql",
          "server/migrations/375_rapportly_crm_privacy_vervolg.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "revisie": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 2147483646
                  },
                  "waarde": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/CrmInstellingSjabloonNieuw"
                    },
                    "maxItems": 30,
                    "description": "Volledige vervangende lijst. IDs binnen de lijst uniek na UUID-normalisatie. [] wist bewust de lijst."
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "revisie",
                  "waarde",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "x-bronref": "d964db8c",
        "x-aanvullende-bronnen": [
          {
            "bronref": "c00e325b",
            "bestand": "server/rapportly_api.js"
          },
          {
            "bronref": "c00e325b",
            "bestand": "server/migrations/370_rapportly_klantcrm_vervolg.sql"
          }
        ],
        "x-query-parameters-toegestaan": [],
        "x-actie": "crm.sjablonen_wijzigen",
        "x-release-status": "releasekandidaat; activering en productieproef afzonderlijk vereist",
        "x-query-aanvullingen-toegestaan": false
      }
    },
    "/v1/klanten/crm-instellingen/zoekopdrachten": {
      "put": {
        "operationId": "crm_zoekopdrachten_wijzigen",
        "summary": "crm zoekopdrachten wijzigen",
        "description": "Vervang de volledige instellingenlijst op exacte huidige revisie. Geen onbekende velden, stringbooleans of nummercoercie. JSON-verzoek maximaal 100 KiB; daarnaast maximaal 500000 bytes genormaliseerde waarde en de PostgreSQL-JSONtekstgrens. Ontbrekende rij gebruikt revisie 0. De publieke middleware en domeinservice vereisen samen Idempotency-Key 16–128, beginnend met letter/cijfer. De ontvangst bindt oorspronkelijke sleutel/org/actor, soort, revisie en volledige effectieve genormaliseerde inhoud. Identieke ontvangstherhaling wijzigt niets en retourneert de huidige revisie/waarde plus de oorspronkelijke ontvangst; nooit de oude lijst automatisch terugschrijven. Andere effectieve inhoud of soort bij dezelfde code geeft 409. Nieuwe code met verouderde revisie geeft 409 crm_gewijzigd. Lopende proefperiode, crminstelling-v1 readiness en actuele rechten blijven ook bij herhaling vereist. Onzekere transactie/readback of delegatiefout na opslag betekent niet dat niets is gewijzigd: herhaal dezelfde opdracht bij herstelde toegang en lees de huidige toestand. Geen providerstart, nieuw pakket of creditsclaim. De nieuwe receipt wordt atomisch met de bestaande 370-CAS-writer opgeslagen; directe service-DML buiten die writer is geen ontvangstgarantie. Iedere queryparameter geeft 400. Cache-Control private, no-store. Actuele sleutel/actor/delegatie wordt vóór en na de domeinactie gecontroleerd; intrekking tijdens het verzoek kan 403 geven. Volledige API-registratie blijft afhankelijk van de vrijgavevlag en overige algemene poorten. Releasekandidaat d964db8c, niet live verklaard. Vereist RAPPORTLY_API_VOLLEDIG en RAPPORTLY_CRM_DUURZAAM_SCHRIJVEN=true, passende crminstelling-v1/crmvervolg-v1 readiness en volledige crmprivacy-v1 readiness uit375; ontbrekend/oud schema503 crm_vervolg_schema_onbeschikbaar. Alleen beschreven bodyvelden, bevestigd:true en Idempotency-Key16–128 met eerste teken letter/cijfer. Iedere queryparameter400. Actuele key/actor/org/pakket/bronrechten vóór en na actie, ook bij replay; verlopen trial402 en offboarding409 crm_privacy_geblokkeerd. Geen automatische retry: bewaar dezelfde oorspronkelijke identiteit/body na antwoordverlies. Stale revisie409 crm_gewijzigd; andere effectieve invoer onder dezelfde code409 crm_vervolg_herhaling_conflict. Geen provider, credits of algemene accountverwijdering. CRM375 sluit aan op bestaande260-klantbevestiging en bestaand365dagen-offboardingbesluit; tenant-runtime blijft apart verplicht.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CrmInstellingenBewaarAntwoord"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              },
              "Idempotency-Replayed": {
                "schema": {
                  "const": "true"
                },
                "description": "Alleen bij ontvangst.herhaald:true."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer. Domein-/ontvangstcodes: crm_ongeldig, crm_vervolg_invoer_ongeldig. Algemene middlewarefouten kunnen eerder optreden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend. Domein-/ontvangstcodes: rapportly_proefperiode_verlopen. Algemene middlewarefouten kunnen eerder optreden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht. Domein-/ontvangstcodes: crm_vervolg_actor_geweigerd, crm_vervolg_bron_geweigerd, crm_vervolg_pakket_geweigerd, api_leesdelegatie_geweigerd. Algemene middlewarefouten kunnen eerder optreden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken. Domein-/ontvangstcodes: crm_gewijzigd, crm_vervolg_herhaling_conflict. Algemene middlewarefouten kunnen eerder optreden. crm_gewijzigd, crm_vervolg_herhaling_conflict of crm_privacy_geblokkeerd; geen automatisch herschrijven met nieuwe basis.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar. Domein-/ontvangstcodes: rapportly_proefperiodecontrole_onbeschikbaar, crm_vervolg_schema_onbeschikbaar, crm_vervolg_onbeschikbaar. Algemene middlewarefouten kunnen eerder optreden. crm_vervolg_schema_onbeschikbaar of crm_vervolg_onbeschikbaar; een onzekere ontvangst is geen bewijs van niet-opslag.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/klantcrmVervolg.js",
          "server/lib/klantcrmVervolgMutaties.js",
          "server/lib/klantcrmVervolgLezen.js",
          "server/lib/publiekeApi/leesdelegatie.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/publiekeApi/domeinen.js",
          "server/lib/rapportlyPrivacy/crmPrivacy.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/migrations/370_rapportly_klantcrm_vervolg.sql",
          "server/migrations/375_rapportly_crm_privacy_vervolg.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "revisie": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 2147483646
                  },
                  "waarde": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/CrmInstellingZoekopdrachtNieuw"
                    },
                    "maxItems": 30,
                    "description": "Volledige vervangende lijst. IDs binnen de lijst uniek na UUID-normalisatie. [] wist bewust de lijst."
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "revisie",
                  "waarde",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "x-bronref": "d964db8c",
        "x-aanvullende-bronnen": [
          {
            "bronref": "c00e325b",
            "bestand": "server/rapportly_api.js"
          },
          {
            "bronref": "c00e325b",
            "bestand": "server/migrations/370_rapportly_klantcrm_vervolg.sql"
          }
        ],
        "x-query-parameters-toegestaan": [],
        "x-actie": "crm.zoekopdrachten_wijzigen",
        "x-release-status": "releasekandidaat; activering en productieproef afzonderlijk vereist",
        "x-query-aanvullingen-toegestaan": false
      }
    },
    "/v1/klanten/{id}/crm-trajecten": {
      "post": {
        "operationId": "crm_traject_maken",
        "summary": "crm traject maken",
        "description": "Maak één leeg traject/dossier bij de actuele zichtbare klant. HTTP201 nieuw, HTTP200 oorspronkelijke ontvangstherhaling. Ontvangst.revisie is null. Replay controleert het oorspronkelijke dossier opnieuw; verdwenen of ontoegankelijke bron wordt niet opnieuw aangemaakt. Releasekandidaat d964db8c, niet live verklaard. Vereist RAPPORTLY_API_VOLLEDIG en RAPPORTLY_CRM_DUURZAAM_SCHRIJVEN=true, passende crminstelling-v1/crmvervolg-v1 readiness en volledige crmprivacy-v1 readiness uit375; ontbrekend/oud schema503 crm_vervolg_schema_onbeschikbaar. Alleen beschreven bodyvelden, bevestigd:true en Idempotency-Key16–128 met eerste teken letter/cijfer. Iedere queryparameter400. Actuele key/actor/org/pakket/bronrechten vóór en na actie, ook bij replay; verlopen trial402 en offboarding409 crm_privacy_geblokkeerd. Geen automatische retry: bewaar dezelfde oorspronkelijke identiteit/body na antwoordverlies. Stale revisie409 crm_gewijzigd; andere effectieve invoer onder dezelfde code409 crm_vervolg_herhaling_conflict. Geen provider, credits of algemene accountverwijdering. CRM375 sluit aan op bestaande260-klantbevestiging en bestaand365dagen-offboardingbesluit; tenant-runtime blijft apart verplicht.",
        "security": [
          {
            "ApiSleutel": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 16,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CrmTrajectBewaarAntwoord"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              },
              "Idempotency-Replayed": {
                "schema": {
                  "const": "true"
                },
                "description": "Alleen bij ontvangst.herhaald:true."
              }
            }
          },
          "201": {
            "description": "Geslaagd. Een startantwoord bewijst nog geen afgeronde verwerking.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CrmTrajectBewaarAntwoord"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "private, no-store"
                }
              },
              "Idempotency-Replayed": {
                "schema": {
                  "const": "true"
                },
                "description": "Alleen bij ontvangst.herhaald:true."
              }
            }
          },
          "400": {
            "description": "Ongeldige invoer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "401": {
            "description": "Sleutel ontbreekt, ingetrokken of verkeerde omgeving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "402": {
            "description": "Credits of budget ontoereikend.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "403": {
            "description": "Actuele gebruiker, pakket of sleutel mist recht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "404": {
            "description": "Niet aanwezig of niet zichtbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "409": {
            "description": "Conflict: opnieuw lezen; dezelfde idempotentiesleutel niet voor nieuwe invoer hergebruiken. crm_gewijzigd, crm_vervolg_herhaling_conflict of crm_privacy_geblokkeerd; geen automatisch herschrijven met nieuwe basis.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "410": {
            "description": "Ontvangst of bron niet meer beschikbaar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "413": {
            "description": "Upload of totale JSON-body te groot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "423": {
            "description": "Verwerking geblokkeerd door huidige privacytoegang.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "428": {
            "description": "Versievoorwaarde ontbreekt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "429": {
            "description": "Limiet: respecteer Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "500": {
            "description": "Interne handlerfout.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "502": {
            "description": "Afhankelijke verwerking mislukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          },
          "503": {
            "description": "Niet vrijgegeven of niet veilig beschikbaar. crm_vervolg_schema_onbeschikbaar of crm_vervolg_onbeschikbaar; een onzekere ontvangst is geen bewijs van niet-opslag.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fout"
                }
              }
            }
          }
        },
        "x-vereiste-rechten": [
          "klanten:beheren"
        ],
        "x-bronnen": [
          "server/lib/publiekeApi/klantcrmVervolg.js",
          "server/lib/klantcrmVervolgMutaties.js",
          "server/lib/klantcrmVervolgLezen.js",
          "server/lib/publiekeApi/leesdelegatie.js",
          "server/lib/publiekeApi/poorten.js",
          "server/lib/publiekeApi/domeinen.js",
          "server/lib/rapportlyPrivacy/crmPrivacy.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/migrations/370_rapportly_klantcrm_vervolg.sql",
          "server/migrations/375_rapportly_crm_privacy_vervolg.sql"
        ],
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "naam": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 150,
                    "pattern": "\\S",
                    "description": "String, niet uitsluitend witruimte. Lengte wordt vóór trimmen in JavaScript UTF-16-eenheden begrensd; daarna trimmen. Geen afkappen of typecoercie."
                  },
                  "bevestigd": {
                    "const": true
                  }
                },
                "required": [
                  "naam",
                  "bevestigd"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "x-bronref": "d964db8c",
        "x-actie": "crm.traject_maken",
        "x-release-status": "releasekandidaat; activering en productieproef afzonderlijk vereist",
        "x-query-aanvullingen-toegestaan": false
      }
    }
  },
  "components": {
    "securitySchemes": {
      "ApiSleutel": {
        "type": "http",
        "scheme": "bearer",
        "description": "Productiesleutel rply_…, alleen op eigen server bewaren."
      },
      "Gebruikerssessie": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT",
        "description": "Ingelogde gebruikerssessie, geen API-sleutel. Beheerder/eigenaarregels blijven gelden."
      }
    },
    "schemas": {
      "Fout": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string"
          },
          "detail": {
            "type": "string"
          },
          "error": {
            "type": "object",
            "properties": {
              "code": {
                "type": "string"
              },
              "message_key": {
                "type": "string"
              },
              "velden": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            },
            "required": [
              "code",
              "message_key",
              "velden"
            ],
            "additionalProperties": false
          },
          "verwerking_status": {
            "type": "string",
            "enum": [
              "niet_gestart",
              "mislukt",
              "controle_nodig"
            ]
          },
          "verwerking_gestart": {
            "type": "boolean"
          }
        },
        "anyOf": [
          {
            "required": [
              "code"
            ]
          },
          {
            "required": [
              "detail"
            ]
          },
          {
            "required": [
              "error"
            ]
          }
        ],
        "additionalProperties": true,
        "description": "Handlers kunnen alleen code of alleen detail teruggeven; aanvullende foutcontext verschilt per domein. Geen uniform async-foutcontract veronderstellen."
      },
      "Actierechten": {
        "type": "array",
        "items": {
          "type": "string",
          "enum": [
            "stijlen:bronnen_lezen",
            "stijlen:uitgebreid_lezen",
            "stijlen:herstellen",
            "account:lezen",
            "bedrijfsgegevens:wijzigen",
            "voorkeuren:wijzigen",
            "teaminstellingen:wijzigen",
            "teamrollen:wijzigen",
            "sleutels:lezen",
            "resultaten:lezen",
            "gebruik:lezen",
            "bronnen:uploaden",
            "dossiers:beheren",
            "verwerkingen:starten",
            "transcripties:starten",
            "transcripten:wijzigen",
            "opnames:wijzigen",
            "opnames:verwijderen",
            "klanten:beheren",
            "klanten:verwijderen",
            "klanten:delen",
            "stijlen:beheren",
            "documenten:wijzigen",
            "documenten:verwijderen",
            "berichten:verzenden",
            "actiepunten:beheren",
            "workflows:beheren",
            "excel:verwerken",
            "webhooks:beheren",
            "verbindingen:beheren",
            "agenda:lezen",
            "abonnement:lezen",
            "zelfservice:starten",
            "offertes:regelbewijzen"
          ]
        },
        "uniqueItems": true,
        "maxItems": 34
      },
      "LegeBody": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      },
      "Bevestiging": {
        "type": "object",
        "properties": {
          "bevestigd": {
            "const": true
          }
        },
        "required": [
          "bevestigd"
        ],
        "additionalProperties": false
      },
      "Ok": {
        "type": "object",
        "properties": {
          "ok": {
            "const": true
          }
        },
        "required": [
          "ok"
        ],
        "additionalProperties": false
      },
      "DossierNieuw": {
        "type": "object",
        "properties": {
          "naam": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "pattern": "\\S"
          }
        },
        "required": [
          "naam"
        ],
        "additionalProperties": false
      },
      "Dossier": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "naam": {
            "type": "string"
          },
          "klant_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "aangemaakt_op": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "id",
          "naam"
        ],
        "additionalProperties": false
      },
      "GeneratieOpties": {
        "type": "object",
        "properties": {
          "versie": {
            "const": 1
          },
          "route": {
            "type": "string",
            "enum": [
              "automatisch",
              "efficient",
              "uitgebreid"
            ]
          },
          "begeleidendeBrief": {
            "type": "boolean"
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "DocumentStartBasis": {
        "type": "object",
        "properties": {
          "dossierId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "notities": {
            "type": "string",
            "maxLength": 120000
          },
          "stijlprofielId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "tier": {
            "type": "string",
            "enum": [
              "basis",
              "standaard",
              "max"
            ]
          },
          "klantId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "taal": {
            "type": "string",
            "maxLength": 40
          },
          "tweedeTaal": {
            "type": "string",
            "maxLength": 40
          },
          "bronOpnameIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            },
            "maxItems": 50
          },
          "merkstijlKeuze": {
            "type": "string",
            "enum": [
              "automatisch",
              "neutraal"
            ]
          },
          "generatieOpties": {
            "$ref": "#/components/schemas/GeneratieOpties"
          },
          "languagePolicy": {
            "$ref": "#/components/schemas/LanguagePolicy"
          },
          "stijlenV2": {
            "$ref": "#/components/schemas/StijlenV2Document"
          }
        },
        "required": [
          "dossierId"
        ],
        "additionalProperties": false,
        "description": "Bruikbare eenvoudige invoersubset. Geavanceerde opties zijn nog niet als volledig schema beschreven. Totale JSON-body maximaal 100 KiB; de veldlimiet verruimt die niet."
      },
      "DocumentOntvangst": {
        "type": "object",
        "properties": {
          "versie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "status": {
            "type": "string"
          },
          "job_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "creditmodus": {
            "type": "string"
          }
        },
        "required": [
          "versie_id"
        ],
        "additionalProperties": true,
        "description": "Gedeeltelijk startantwoord; native start- en taalvarianten voegen velden toe."
      },
      "GesprekStartBasis": {
        "type": "object",
        "properties": {
          "transcript": {
            "type": "string",
            "minLength": 100,
            "maxLength": 250000
          },
          "titel": {
            "type": "string",
            "maxLength": 200
          },
          "tier": {
            "type": "string",
            "enum": [
              "basis",
              "standaard",
              "max"
            ]
          },
          "klantId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "taal": {
            "type": "string",
            "maxLength": 40
          },
          "tweedeTaal": {
            "type": "string",
            "maxLength": 40
          },
          "opnameId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "generatieOpties": {
            "$ref": "#/components/schemas/GeneratieOpties"
          },
          "languagePolicy": {
            "$ref": "#/components/schemas/LanguagePolicy"
          },
          "stijlenV2": {
            "$ref": "#/components/schemas/StijlenV2Gesprek"
          }
        },
        "required": [
          "transcript"
        ],
        "additionalProperties": false
      },
      "GesprekResultaat": {
        "type": "object",
        "properties": {
          "id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "org_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "titel": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "klantmap": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "naam": {
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "naam"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "gegenereerd_op": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "event": {
            "const": "gesprek.klaar"
          },
          "documenttype": {
            "const": "gespreksbundel"
          },
          "teksten": {
            "type": "object",
            "properties": {
              "verslag": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "interne_notitie": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "klantmail_onderwerp": {
                "type": "string"
              },
              "klantmail_body": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [],
            "additionalProperties": false
          },
          "export_url": {
            "type": "null"
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "RapportResultaat": {
        "type": "object",
        "properties": {
          "id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "org_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "titel": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "klantmap": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "naam": {
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "naam"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "gegenereerd_op": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "event": {
            "const": "rapport.klaar"
          },
          "documenttype": {
            "const": "rapport"
          },
          "versie_nummer": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "teksten": {
            "type": "null"
          },
          "export_url": {
            "anyOf": [
              {
                "type": "string",
                "format": "uri"
              },
              {
                "type": "null"
              }
            ]
          },
          "export_url_docx": {
            "anyOf": [
              {
                "type": "string",
                "format": "uri"
              },
              {
                "type": "null"
              }
            ]
          },
          "export_url_pptx": {
            "anyOf": [
              {
                "type": "string",
                "format": "uri"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "gesprekkenStatus": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "status": {
            "type": "string"
          },
          "resultaat": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GesprekResultaat"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "status",
          "resultaat"
        ],
        "additionalProperties": false,
        "description": "Alleen klaar bevat resultaat. Een andere status bevat null; HTTP 200 op zichzelf bewijst geen succes."
      },
      "rapportenStatus": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "status": {
            "type": "string"
          },
          "resultaat": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RapportResultaat"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "status",
          "resultaat"
        ],
        "additionalProperties": false,
        "description": "Alleen klaar bevat resultaat. Een andere status bevat null; HTTP 200 op zichzelf bewijst geen succes."
      },
      "RapportLijstItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "dossier_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "status": {
            "type": "string"
          },
          "versie_nummer": {
            "type": "integer",
            "minimum": 0
          },
          "aangemaakt_op": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "GesprekLijstItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "titel": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "type": "string"
          },
          "tier": {
            "type": "string"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "afgerond_op": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "KlantLijstItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "naam": {
            "type": "string"
          },
          "aangemaakt_op": {
            "type": "string",
            "format": "date-time"
          },
          "api_revisie": {
            "type": "integer",
            "minimum": 0
          },
          "externe_referentie": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "gearchiveerd": {
            "type": "boolean"
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "rapporten": {
        "type": "object",
        "properties": {
          "rapporten": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RapportLijstItem"
            }
          },
          "limiet": {
            "type": "integer",
            "minimum": 0,
            "maximum": 100
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "maximum": 10000
          },
          "heeft_meer": {
            "type": "boolean"
          }
        },
        "required": [
          "rapporten",
          "limiet",
          "offset",
          "heeft_meer"
        ],
        "additionalProperties": false
      },
      "gesprekken": {
        "type": "object",
        "properties": {
          "gesprekken": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GesprekLijstItem"
            }
          },
          "limiet": {
            "type": "integer",
            "minimum": 0,
            "maximum": 100
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "maximum": 10000
          },
          "heeft_meer": {
            "type": "boolean"
          }
        },
        "required": [
          "gesprekken",
          "limiet",
          "offset",
          "heeft_meer"
        ],
        "additionalProperties": false
      },
      "klanten": {
        "type": "object",
        "properties": {
          "klanten": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/KlantLijstItem"
            }
          },
          "limiet": {
            "type": "integer",
            "minimum": 0,
            "maximum": 100
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "maximum": 10000
          },
          "heeft_meer": {
            "type": "boolean"
          }
        },
        "required": [
          "klanten",
          "limiet",
          "offset",
          "heeft_meer"
        ],
        "additionalProperties": false
      },
      "BronBestand": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "naam": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "grootte_bytes": {
            "type": "integer",
            "minimum": 0
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "items": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BronBestand"
            }
          },
          "limiet": {
            "type": "integer",
            "minimum": 0,
            "maximum": 100
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "maximum": 10000
          },
          "heeft_meer": {
            "type": "boolean"
          }
        },
        "required": [
          "items",
          "limiet",
          "offset",
          "heeft_meer"
        ],
        "additionalProperties": false
      },
      "Opname": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "titel": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "bron": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "duur_seconden": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "transcript_taal": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "heeft_audio": {
            "type": "boolean"
          },
          "audio_bytes": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "audio_verwijderd": {
            "type": "boolean"
          },
          "heeft_transcript": {
            "type": "boolean"
          },
          "gesprek_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "klant_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "id",
          "titel",
          "bron",
          "status",
          "duur_seconden",
          "transcript_taal",
          "heeft_audio",
          "audio_bytes",
          "audio_verwijderd",
          "gesprek_id",
          "klant_id",
          "created_at"
        ],
        "additionalProperties": false
      },
      "TranscriptieStart": {
        "type": "object",
        "properties": {
          "model_id": {
            "type": "string",
            "enum": [
              "melia-1",
              "enhanced"
            ]
          },
          "taal": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^(?:auto|[a-z]{2,3}(?:-[a-z]{2})?)?$",
                "description": "Leeg/null wordt servervoorkeur; kleine letters als canonieke vorm."
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "TranscriptieOntvangst": {
        "type": "object",
        "properties": {
          "transcriptie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "status": {
            "type": "string",
            "enum": [
              "bezig",
              "klaar",
              "mislukt"
            ]
          },
          "model_id": {
            "type": "string"
          }
        },
        "required": [
          "transcriptie_id",
          "status"
        ],
        "additionalProperties": false
      },
      "BudgetReservering": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "run_ref": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "periode": {
            "type": "string",
            "format": "date"
          },
          "gereserveerd": {
            "type": "integer",
            "minimum": 0
          },
          "werkelijk": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "gereserveerd",
              "afgerekend",
              "vrijgegeven"
            ]
          },
          "aangemaakt_op": {
            "type": "string",
            "format": "date-time"
          },
          "afgerond_op": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "Gebruik": {
        "type": "object",
        "properties": {
          "omgeving": {
            "type": "string",
            "enum": [
              "productie",
              "test"
            ]
          },
          "maand": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}$"
          },
          "tijdzone": {
            "const": "UTC"
          },
          "creditbudget_maand": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "gereserveerde_credits": {
            "type": "integer",
            "minimum": 0
          },
          "bestede_credits": {
            "type": "integer",
            "minimum": 0
          },
          "resterende_credits": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "reserveringen": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BudgetReservering"
            },
            "maxItems": 100
          },
          "maximum_getoonde_reserveringen": {
            "const": 100
          },
          "verzoeken": {
            "type": "object",
            "properties": {
              "totaal": {
                "type": "integer",
                "minimum": 0
              },
              "afgerond": {
                "type": "integer",
                "minimum": 0
              },
              "fouten": {
                "type": "integer",
                "minimum": 0
              },
              "afronding_onbevestigd": {
                "type": "integer",
                "minimum": 0
              }
            },
            "required": [],
            "additionalProperties": false
          },
          "bedragen_eenheid": {
            "const": "credits"
          },
          "reservering_toelichting": {
            "type": "string"
          },
          "afrekening_toelichting": {
            "type": "string"
          }
        },
        "required": [
          "omgeving",
          "maand",
          "tijdzone",
          "creditbudget_maand",
          "gereserveerde_credits",
          "bestede_credits",
          "resterende_credits",
          "reserveringen",
          "verzoeken"
        ],
        "additionalProperties": false
      },
      "Verzoek": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "actie": {
            "type": "string"
          },
          "omgeving": {
            "type": "string",
            "enum": [
              "productie",
              "test"
            ]
          },
          "begonnen_op": {
            "type": "string",
            "format": "date-time"
          },
          "afgerond_op": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "http_status": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 599
              },
              {
                "type": "null"
              }
            ]
          },
          "foutcode": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "opdracht_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "VerzoekenLijst": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Verzoek"
            }
          },
          "limiet": {
            "type": "integer",
            "minimum": 0
          },
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "heeft_meer": {
            "type": "boolean"
          }
        },
        "required": [
          "items",
          "limiet",
          "offset",
          "heeft_meer"
        ],
        "additionalProperties": false
      },
      "Actie": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "methode": {
            "type": "string",
            "enum": [
              "GET",
              "POST",
              "PUT",
              "PATCH",
              "DELETE"
            ]
          },
          "pad": {
            "type": "string"
          },
          "recht": {
            "type": "string",
            "enum": [
              "stijlen:bronnen_lezen",
              "stijlen:uitgebreid_lezen",
              "stijlen:herstellen",
              "account:lezen",
              "bedrijfsgegevens:wijzigen",
              "voorkeuren:wijzigen",
              "teaminstellingen:wijzigen",
              "teamrollen:wijzigen",
              "sleutels:lezen",
              "resultaten:lezen",
              "gebruik:lezen",
              "bronnen:uploaden",
              "dossiers:beheren",
              "verwerkingen:starten",
              "transcripties:starten",
              "transcripten:wijzigen",
              "opnames:wijzigen",
              "opnames:verwijderen",
              "klanten:beheren",
              "klanten:verwijderen",
              "klanten:delen",
              "stijlen:beheren",
              "documenten:wijzigen",
              "documenten:verwijderen",
              "berichten:verzenden",
              "actiepunten:beheren",
              "workflows:beheren",
              "excel:verwerken",
              "webhooks:beheren",
              "verbindingen:beheren",
              "agenda:lezen",
              "abonnement:lezen",
              "zelfservice:starten",
              "offertes:regelbewijzen"
            ]
          },
          "soort": {
            "type": "string"
          },
          "invoervelden": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "vereiste_rechten": {
            "$ref": "#/components/schemas/Actierechten"
          },
          "toegestaan_door_sleutel": {
            "type": "boolean"
          },
          "idempotency_key_verplicht": {
            "const": true
          },
          "versiecontrole": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "methode",
          "pad",
          "recht",
          "soort",
          "invoervelden",
          "vereiste_rechten",
          "toegestaan_door_sleutel"
        ],
        "additionalProperties": false
      },
      "SleutelbeleidWijziging": {
        "type": "object",
        "properties": {
          "actie_rechten": {
            "$ref": "#/components/schemas/Actierechten"
          },
          "max_actie_rechten": {
            "$ref": "#/components/schemas/Actierechten"
          },
          "creditbudget_maand": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 1000000000
              },
              {
                "type": "null"
              }
            ]
          },
          "gepauzeerd": {
            "type": "boolean"
          },
          "verloopt_op": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$"
              },
              {
                "type": "null"
              }
            ]
          },
          "omgeving": {
            "type": "string",
            "enum": [
              "productie",
              "test"
            ]
          },
          "mag_rechten_aanpassen": {
            "type": "boolean"
          }
        },
        "required": [],
        "additionalProperties": false,
        "minProperties": 1
      },
      "Sleutelbeleid": {
        "type": "object",
        "properties": {
          "actie_rechten": {
            "$ref": "#/components/schemas/Actierechten"
          },
          "max_actie_rechten": {
            "$ref": "#/components/schemas/Actierechten"
          },
          "creditbudget_maand": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 1000000000
              },
              {
                "type": "null"
              }
            ]
          },
          "gepauzeerd": {
            "type": "boolean"
          },
          "verloopt_op": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$"
              },
              {
                "type": "null"
              }
            ]
          },
          "omgeving": {
            "type": "string",
            "enum": [
              "productie",
              "test"
            ]
          },
          "mag_rechten_aanpassen": {
            "type": "boolean"
          },
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "geactiveerd_op": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "ingetrokken_op": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "beleid_versie": {
            "type": "integer",
            "minimum": 0
          }
        },
        "required": [
          "id",
          "omgeving",
          "beleid_versie"
        ],
        "additionalProperties": false
      },
      "GeneratieplanInvoer": {
        "type": "object",
        "properties": {
          "soort": {
            "type": "string",
            "enum": [
              "rapport",
              "offerte",
              "bundel"
            ]
          },
          "tier": {
            "type": "string",
            "enum": [
              "basis",
              "standaard",
              "max"
            ]
          },
          "invoerBytes": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1000000000
          },
          "bestanden": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1000000000
          },
          "stijlprofielId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "tweedeTaal": {
            "type": "boolean"
          },
          "vasteOfferte": {
            "type": "boolean"
          },
          "offerteVoorstel": {
            "type": "boolean"
          },
          "generatieOpties": {
            "$ref": "#/components/schemas/GeneratieOpties"
          }
        },
        "required": [
          "soort"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "properties": {
                "soort": {
                  "enum": [
                    "rapport",
                    "bundel"
                  ]
                }
              }
            },
            "then": {
              "properties": {
                "vasteOfferte": {
                  "const": false
                },
                "offerteVoorstel": {
                  "const": false
                }
              }
            }
          }
        ]
      },
      "Generatieplan": {
        "type": "object",
        "properties": {
          "versie": {
            "const": 1
          },
          "route": {
            "type": "string",
            "enum": [
              "automatisch",
              "efficient",
              "uitgebreid"
            ]
          },
          "soort": {
            "type": "string",
            "enum": [
              "rapport",
              "offerte",
              "bundel"
            ]
          },
          "routeGekozen": {
            "type": "string",
            "enum": [
              "efficient",
              "uitgebreid"
            ]
          },
          "leidraad": {
            "type": "boolean"
          },
          "eindredactie": {
            "type": "boolean"
          },
          "samenvattingEenmaal": {
            "type": "boolean"
          },
          "broncontrole": {
            "type": "boolean"
          },
          "begeleidendeBrief": {
            "type": "boolean"
          },
          "gecombineerdeFollowup": {
            "type": "boolean"
          },
          "creditmodus": {
            "type": "string",
            "enum": [
              "legacy",
              "persoonlijke_api_kosten"
            ]
          },
          "stappen": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "sleutel": {
                  "type": "string"
                },
                "creditsVan": {
                  "type": "integer",
                  "minimum": 0
                },
                "creditsTot": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "required": [
                "sleutel",
                "creditsVan",
                "creditsTot"
              ],
              "additionalProperties": false
            }
          },
          "onzekerheden": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "tier": {
            "type": "string",
            "enum": [
              "basis",
              "standaard",
              "max"
            ]
          },
          "geraamdOp": {
            "type": "string",
            "format": "date-time"
          },
          "volledig": {
            "type": "boolean"
          },
          "creditsVan": {
            "type": "integer",
            "minimum": 0
          },
          "creditsTot": {
            "type": "integer",
            "minimum": 0
          },
          "grondslag": {
            "const": "werkbegroting_geen_maximum"
          },
          "cachekortingVooraf": {
            "const": false
          },
          "raming": {
            "const": true
          },
          "verwerking_gestart": {
            "const": false
          },
          "credits_afgeboekt": {
            "const": 0
          }
        },
        "required": [
          "creditmodus",
          "stappen",
          "onzekerheden",
          "raming",
          "verwerking_gestart",
          "credits_afgeboekt"
        ],
        "additionalProperties": false
      },
      "Verbinding": {
        "type": "object",
        "properties": {
          "soort": {
            "type": "string",
            "enum": [
              "agenda",
              "mailbox"
            ]
          },
          "provider": {
            "type": "string",
            "enum": [
              "google",
              "gmail",
              "m365"
            ]
          },
          "gekoppeld": {
            "type": "boolean"
          },
          "scope_versie": {
            "anyOf": [
              {
                "type": "integer",
                "enum": [
                  1,
                  2
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "basis": {
            "oneOf": [
              {
                "const": "geen"
              },
              {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              }
            ]
          },
          "verversing_status": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "geen_open_poging",
                  "verwerken",
                  "onzeker"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "opnieuw_toestemming_nodig": {
            "type": "boolean"
          },
          "beschikbaar": {
            "type": "boolean"
          }
        },
        "required": [
          "soort",
          "provider",
          "gekoppeld",
          "basis",
          "beschikbaar"
        ],
        "additionalProperties": false
      },
      "AutorisatieInvoer": {
        "type": "object",
        "properties": {
          "soort": {
            "type": "string",
            "enum": [
              "agenda",
              "mailbox"
            ]
          },
          "provider": {
            "type": "string",
            "enum": [
              "google",
              "gmail",
              "m365"
            ]
          },
          "basis": {
            "oneOf": [
              {
                "const": "geen"
              },
              {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              }
            ]
          },
          "scope_versie": {
            "type": "integer",
            "enum": [
              1,
              2
            ],
            "default": 1
          },
          "bevestigd": {
            "const": true
          }
        },
        "required": [
          "soort",
          "provider",
          "basis",
          "bevestigd"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "properties": {
                "soort": {
                  "const": "agenda"
                }
              }
            },
            "then": {
              "properties": {
                "provider": {
                  "type": "string",
                  "enum": [
                    "google",
                    "m365"
                  ]
                },
                "scope_versie": {
                  "const": 1
                }
              }
            },
            "else": {
              "properties": {
                "provider": {
                  "type": "string",
                  "enum": [
                    "gmail",
                    "m365"
                  ]
                }
              }
            }
          }
        ]
      },
      "Mailbox": {
        "type": "object",
        "properties": {
          "provider": {
            "type": "string",
            "enum": [
              "gmail",
              "m365"
            ]
          },
          "gekoppeld": {
            "type": "boolean"
          },
          "account_email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "beschikbaar": {
            "type": "boolean"
          },
          "send_capable": {
            "type": "boolean"
          },
          "verbinding_basis": {
            "oneOf": [
              {
                "const": "geen"
              },
              {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              }
            ]
          },
          "opnieuw_toestemming_nodig": {
            "type": "boolean"
          },
          "verzendbaar": {
            "type": "boolean"
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "Mailboxvoorkeur": {
        "type": "object",
        "properties": {
          "voorkeur_provider": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "gmail",
                  "m365"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "standaard_provider": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "gmail",
                  "m365"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "type": "string"
          },
          "basis": {
            "oneOf": [
              {
                "const": "geen"
              },
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              }
            ]
          },
          "versiebeheer": {
            "const": true
          },
          "mailboxen": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Mailbox"
            }
          }
        },
        "required": [
          "voorkeur_provider",
          "standaard_provider",
          "status",
          "basis",
          "versiebeheer",
          "mailboxen"
        ],
        "additionalProperties": false
      },
      "Webhook": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "events": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "verwerking.gereed",
                "verwerking.mislukt",
                "mail.geaccepteerd",
                "mail.onzeker",
                "mail.mislukt",
                "mail.afgeleverd"
              ]
            },
            "minItems": 1,
            "maxItems": 6,
            "uniqueItems": true
          },
          "actief": {
            "type": "boolean"
          },
          "aangemaakt_op": {
            "type": "string",
            "format": "date-time"
          },
          "ingetrokken_op": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "url",
          "events",
          "actief",
          "aangemaakt_op",
          "ingetrokken_op"
        ],
        "additionalProperties": false
      },
      "WebhookAflevering": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "abonnement_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "status": {
            "type": "string",
            "enum": [
              "wacht",
              "bezig",
              "geaccepteerd",
              "mislukt",
              "gestopt"
            ]
          },
          "poging": {
            "type": "integer",
            "minimum": 0,
            "maximum": 16
          },
          "http_status": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 100,
                "maximum": 599
              },
              {
                "type": "null"
              }
            ]
          },
          "foutcode": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_]{0,99}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "beschikbaar_op": {
            "type": "string",
            "format": "date-time"
          },
          "afgerond_op": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "abonnement_id",
          "status",
          "poging",
          "http_status",
          "foutcode",
          "beschikbaar_op",
          "afgerond_op"
        ],
        "additionalProperties": false
      },
      "WebhookEvent": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/WebhookJobHistorie"
          },
          {
            "$ref": "#/components/schemas/WebhookMailHistorie"
          }
        ]
      },
      "Taalkeuze": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "inherit",
                  "off"
                ]
              },
              "language": {
                "enum": [
                  null,
                  ""
                ]
              }
            },
            "required": [
              "mode"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "mode": {
                "const": "specific"
              },
              "language": {
                "type": "string",
                "pattern": "^[a-z]{2,3}$",
                "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
              }
            },
            "required": [
              "mode",
              "language"
            ],
            "additionalProperties": false
          }
        ]
      },
      "LanguagePolicy": {
        "type": "object",
        "properties": {
          "primary": {
            "type": "string",
            "pattern": "^[a-z]{2,3}$",
            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
          },
          "secondary": {
            "type": "object",
            "properties": {
              "report": {
                "$ref": "#/components/schemas/Taalkeuze"
              },
              "coverLetter": {
                "$ref": "#/components/schemas/Taalkeuze"
              },
              "conversationReport": {
                "$ref": "#/components/schemas/Taalkeuze"
              },
              "customerEmail": {
                "$ref": "#/components/schemas/Taalkeuze"
              },
              "followUpEmail": {
                "$ref": "#/components/schemas/Taalkeuze"
              }
            },
            "required": [],
            "additionalProperties": false
          }
        },
        "required": [],
        "additionalProperties": false,
        "description": "Alleen uitkomsten van de gekozen bron gebruiken: report/coverLetter bij documenten, conversationReport/customerEmail/followUpEmail bij gesprekken. Legacy taal/tweedeTaal moeten hiermee overeenstemmen."
      },
      "ResolvedLanguages": {
        "type": "object",
        "properties": {
          "primary": {
            "type": "string",
            "pattern": "^[a-z]{2,3}$",
            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
          },
          "secondary": {
            "type": "object",
            "properties": {
              "report": {
                "type": "object",
                "properties": {
                  "requestedMode": {
                    "type": "string",
                    "enum": [
                      "inherit",
                      "off",
                      "specific"
                    ]
                  },
                  "enabled": {
                    "type": "boolean"
                  },
                  "language": {
                    "anyOf": [
                      {
                        "type": "string",
                        "pattern": "^[a-z]{2,3}$",
                        "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "source": {
                    "type": "string",
                    "enum": [
                      "explicit_off",
                      "no_default",
                      "same_as_primary",
                      "legacy",
                      "request",
                      "office_default",
                      "feature_flag",
                      "office_disabled"
                    ]
                  }
                },
                "required": [
                  "requestedMode",
                  "enabled",
                  "language",
                  "source"
                ],
                "additionalProperties": false
              },
              "coverLetter": {
                "type": "object",
                "properties": {
                  "requestedMode": {
                    "type": "string",
                    "enum": [
                      "inherit",
                      "off",
                      "specific"
                    ]
                  },
                  "enabled": {
                    "type": "boolean"
                  },
                  "language": {
                    "anyOf": [
                      {
                        "type": "string",
                        "pattern": "^[a-z]{2,3}$",
                        "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "source": {
                    "type": "string",
                    "enum": [
                      "explicit_off",
                      "no_default",
                      "same_as_primary",
                      "legacy",
                      "request",
                      "office_default",
                      "feature_flag",
                      "office_disabled"
                    ]
                  }
                },
                "required": [
                  "requestedMode",
                  "enabled",
                  "language",
                  "source"
                ],
                "additionalProperties": false
              },
              "conversationReport": {
                "type": "object",
                "properties": {
                  "requestedMode": {
                    "type": "string",
                    "enum": [
                      "inherit",
                      "off",
                      "specific"
                    ]
                  },
                  "enabled": {
                    "type": "boolean"
                  },
                  "language": {
                    "anyOf": [
                      {
                        "type": "string",
                        "pattern": "^[a-z]{2,3}$",
                        "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "source": {
                    "type": "string",
                    "enum": [
                      "explicit_off",
                      "no_default",
                      "same_as_primary",
                      "legacy",
                      "request",
                      "office_default",
                      "feature_flag",
                      "office_disabled"
                    ]
                  }
                },
                "required": [
                  "requestedMode",
                  "enabled",
                  "language",
                  "source"
                ],
                "additionalProperties": false
              },
              "customerEmail": {
                "type": "object",
                "properties": {
                  "requestedMode": {
                    "type": "string",
                    "enum": [
                      "inherit",
                      "off",
                      "specific"
                    ]
                  },
                  "enabled": {
                    "type": "boolean"
                  },
                  "language": {
                    "anyOf": [
                      {
                        "type": "string",
                        "pattern": "^[a-z]{2,3}$",
                        "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "source": {
                    "type": "string",
                    "enum": [
                      "explicit_off",
                      "no_default",
                      "same_as_primary",
                      "legacy",
                      "request",
                      "office_default",
                      "feature_flag",
                      "office_disabled"
                    ]
                  }
                },
                "required": [
                  "requestedMode",
                  "enabled",
                  "language",
                  "source"
                ],
                "additionalProperties": false
              },
              "followUpEmail": {
                "type": "object",
                "properties": {
                  "requestedMode": {
                    "type": "string",
                    "enum": [
                      "inherit",
                      "off",
                      "specific"
                    ]
                  },
                  "enabled": {
                    "type": "boolean"
                  },
                  "language": {
                    "anyOf": [
                      {
                        "type": "string",
                        "pattern": "^[a-z]{2,3}$",
                        "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "source": {
                    "type": "string",
                    "enum": [
                      "explicit_off",
                      "no_default",
                      "same_as_primary",
                      "legacy",
                      "request",
                      "office_default",
                      "feature_flag",
                      "office_disabled"
                    ]
                  }
                },
                "required": [
                  "requestedMode",
                  "enabled",
                  "language",
                  "source"
                ],
                "additionalProperties": false
              }
            },
            "required": [],
            "additionalProperties": false
          }
        },
        "required": [
          "primary",
          "secondary"
        ],
        "additionalProperties": false
      },
      "TaalvariantStatus": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "sourceType": {
            "type": "string",
            "enum": [
              "report",
              "conversation"
            ]
          },
          "sourceId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "language": {
            "type": "string",
            "pattern": "^[a-z]{2,3}$",
            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
          },
          "action": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "credits": {
            "type": "number"
          },
          "outcomes": {
            "type": "object",
            "properties": {
              "report": {
                "type": "object",
                "properties": {
                  "status": {
                    "type": "string"
                  },
                  "contentAvailable": {
                    "type": "boolean"
                  },
                  "artifactId": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "errorCode": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": [
                  "status",
                  "contentAvailable",
                  "artifactId",
                  "errorCode"
                ],
                "additionalProperties": false
              },
              "coverLetter": {
                "type": "object",
                "properties": {
                  "status": {
                    "type": "string"
                  },
                  "contentAvailable": {
                    "type": "boolean"
                  },
                  "artifactId": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "errorCode": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": [
                  "status",
                  "contentAvailable",
                  "artifactId",
                  "errorCode"
                ],
                "additionalProperties": false
              },
              "conversationReport": {
                "type": "object",
                "properties": {
                  "status": {
                    "type": "string"
                  },
                  "contentAvailable": {
                    "type": "boolean"
                  },
                  "artifactId": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "errorCode": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": [
                  "status",
                  "contentAvailable",
                  "artifactId",
                  "errorCode"
                ],
                "additionalProperties": false
              },
              "customerEmail": {
                "type": "object",
                "properties": {
                  "status": {
                    "type": "string"
                  },
                  "contentAvailable": {
                    "type": "boolean"
                  },
                  "artifactId": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "errorCode": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": [
                  "status",
                  "contentAvailable",
                  "artifactId",
                  "errorCode"
                ],
                "additionalProperties": false
              },
              "followUpEmail": {
                "type": "object",
                "properties": {
                  "status": {
                    "type": "string"
                  },
                  "contentAvailable": {
                    "type": "boolean"
                  },
                  "artifactId": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "errorCode": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": [
                  "status",
                  "contentAvailable",
                  "artifactId",
                  "errorCode"
                ],
                "additionalProperties": false
              }
            },
            "required": [],
            "additionalProperties": false
          }
        },
        "required": [
          "id",
          "sourceType",
          "sourceId",
          "language",
          "action",
          "status",
          "credits",
          "outcomes"
        ],
        "additionalProperties": false,
        "description": "Statuswaarden worden door de job opgeslagen. contentAvailable is de expliciete beschikbaarheidsindicator per uitkomst; actief is slechts een selectie op de huidige taalkeuze."
      },
      "StijlenV2Document": {
        "type": "object",
        "properties": {
          "format": {
            "const": "v2"
          },
          "organisatiestijl_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "documentstijl_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "persoonlijk_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "opdracht_regels": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "sleutel": {
                      "type": "string",
                      "enum": [
                        "doelgroep",
                        "toon",
                        "taalniveau",
                        "aanspreekvorm",
                        "opbouw",
                        "terminologie",
                        "bedragen",
                        "brongebruik",
                        "alternatieven",
                        "risicos",
                        "afsluiting"
                      ]
                    },
                    "waarde": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 500,
                      "pattern": "\\S"
                    }
                  },
                  "required": [
                    "sleutel",
                    "waarde"
                  ],
                  "additionalProperties": false
                },
                "maxItems": 30,
                "description": "Elke sleutel hoogstens eenmaal. Waarden worden getrimd; beschermde vakstijlregels blijven leidend."
              },
              {
                "type": "null"
              }
            ]
          },
          "brief_documentstijl_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "format"
        ],
        "additionalProperties": false,
        "description": "brief_documentstijl_id alleen bij rapport met begeleidende brief. Andere soorten weigeren deze selectie."
      },
      "StijlenV2Gesprek": {
        "type": "object",
        "properties": {
          "format": {
            "const": "v2"
          },
          "organisatiestijl_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "documentstijl_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "persoonlijk_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "opdracht_regels": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "sleutel": {
                      "type": "string",
                      "enum": [
                        "doelgroep",
                        "toon",
                        "taalniveau",
                        "aanspreekvorm",
                        "opbouw",
                        "terminologie",
                        "bedragen",
                        "brongebruik",
                        "alternatieven",
                        "risicos",
                        "afsluiting"
                      ]
                    },
                    "waarde": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 500,
                      "pattern": "\\S"
                    }
                  },
                  "required": [
                    "sleutel",
                    "waarde"
                  ],
                  "additionalProperties": false
                },
                "maxItems": 30,
                "description": "Elke sleutel hoogstens eenmaal. Waarden worden getrimd; beschermde vakstijlregels blijven leidend."
              },
              {
                "type": "null"
              }
            ]
          },
          "email_documentstijl_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "format"
        ],
        "additionalProperties": false
      },
      "PresentatieOpties": {
        "type": "object",
        "properties": {
          "max_dias": {
            "oneOf": [
              {
                "type": "integer",
                "minimum": 1,
                "maximum": 200
              },
              {
                "type": "string",
                "pattern": "^(?:[1-9][0-9]?|1[0-9]{2}|200)$"
              },
              {
                "enum": [
                  null,
                  ""
                ]
              }
            ]
          },
          "sprekersnotities": {
            "type": "boolean"
          },
          "secties": {
            "type": "boolean"
          },
          "grafieken": {
            "type": "boolean"
          },
          "taal": {
            "type": "string",
            "pattern": "^[a-z]{2}$"
          },
          "merkstijlKeuze": {
            "type": "string",
            "enum": [
              "automatisch",
              "neutraal"
            ]
          }
        },
        "required": [],
        "additionalProperties": false,
        "description": "max_dias leeg/null betekent flexibel. Booleans blijven booleans; taal wordt naar kleine letters omgezet."
      },
      "Documentformat": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "formatBron": {
                "const": "automatisch"
              },
              "stijlsignaal": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "helder_zakelijk",
                      "warm_persoonlijk",
                      "compact_operationeel",
                      "formeel_controlegericht"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "formatBron"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "formatBron": {
                "const": "universeel"
              },
              "registryVersie": {
                "const": "rapportly-archetypen-v1"
              },
              "archetypeKey": {
                "type": "string",
                "enum": [
                  "raster",
                  "nabij",
                  "werkstaat",
                  "dossier"
                ]
              },
              "documenttype": {
                "type": "string",
                "enum": [
                  "rapport",
                  "gespreksverslag",
                  "offerte"
                ]
              }
            },
            "required": [
              "formatBron",
              "registryVersie",
              "archetypeKey",
              "documenttype"
            ],
            "additionalProperties": false
          }
        ],
        "description": "Vereist een gereed klassiek stijlprofiel. De presentatie gebruikt haar eigen dia-opmaak en accepteert dit veld niet. De automatische route bepaalt documenttype en registry op de server."
      },
      "OfferteHandregel": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "source": {
                "const": "manual"
              },
              "description": {
                "type": "string",
                "minLength": 1,
                "maxLength": 300
              },
              "quantityMilli": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9999000
              },
              "unit": {
                "type": "string",
                "minLength": 1,
                "maxLength": 40
              },
              "vatBasisPoints": {
                "type": "integer",
                "minimum": 0,
                "maximum": 10000
              },
              "humanConfirmed": {
                "const": true
              },
              "priceMode": {
                "const": "fixed"
              },
              "unitPriceCents": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "id",
              "source",
              "description",
              "quantityMilli",
              "unit",
              "vatBasisPoints",
              "humanConfirmed",
              "priceMode",
              "unitPriceCents"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "source": {
                "const": "manual"
              },
              "description": {
                "type": "string",
                "minLength": 1,
                "maxLength": 300
              },
              "quantityMilli": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9999000
              },
              "unit": {
                "type": "string",
                "minLength": 1,
                "maxLength": 40
              },
              "vatBasisPoints": {
                "type": "integer",
                "minimum": 0,
                "maximum": 10000
              },
              "humanConfirmed": {
                "const": true
              },
              "priceMode": {
                "const": "price_on_request"
              },
              "unitPriceCents": {
                "type": "null"
              }
            },
            "required": [
              "id",
              "source",
              "description",
              "quantityMilli",
              "unit",
              "vatBasisPoints",
              "humanConfirmed",
              "priceMode"
            ],
            "additionalProperties": false
          }
        ]
      },
      "OfferteInvoer": {
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "enum": [
              1,
              2
            ]
          },
          "conceptId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "subject": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "conditions": {
            "type": "object",
            "properties": {
              "offerDate": {
                "type": "string",
                "format": "date"
              },
              "validUntil": {
                "type": "string",
                "format": "date"
              },
              "paymentTerms": {
                "type": "string",
                "maxLength": 300
              },
              "deliveryTerms": {
                "type": "string",
                "maxLength": 600
              },
              "additionalNotes": {
                "type": "string",
                "maxLength": 3000
              }
            },
            "required": [
              "offerDate",
              "validUntil"
            ],
            "additionalProperties": false
          },
          "catalog": {
            "type": "object",
            "properties": {
              "catalogusId": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "versionId": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "etag": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              }
            },
            "required": [
              "catalogusId",
              "versionId",
              "etag"
            ],
            "additionalProperties": false
          },
          "workflow": {
            "type": "object",
            "properties": {
              "workflowprofielId": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "versionId": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "versionHash": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              }
            },
            "required": [
              "workflowprofielId",
              "versionId",
              "versionHash"
            ],
            "additionalProperties": false
          },
          "lines": {
            "type": "array",
            "items": {
              "oneOf": [
                {
                  "$ref": "#/components/schemas/OfferteHandregel"
                },
                {
                  "type": "object",
                  "properties": {
                    "source": {
                      "const": "route"
                    },
                    "confirmationToken": {
                      "type": "string",
                      "minLength": 1
                    }
                  },
                  "required": [
                    "source",
                    "confirmationToken"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "source": {
                      "const": "catalog"
                    },
                    "confirmationToken": {
                      "type": "string",
                      "minLength": 1
                    }
                  },
                  "required": [
                    "id",
                    "source",
                    "confirmationToken"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "source": {
                      "const": "catalog"
                    },
                    "productId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "productCode": {
                      "type": "string",
                      "pattern": "^[A-Z0-9][A-Z0-9._-]{0,63}$"
                    },
                    "quantityMilli": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 9999000
                    },
                    "matchType": {
                      "const": "product_picker"
                    },
                    "humanConfirmed": {
                      "const": true
                    }
                  },
                  "required": [
                    "id",
                    "source",
                    "productId",
                    "productCode",
                    "quantityMilli",
                    "matchType",
                    "humanConfirmed"
                  ],
                  "additionalProperties": false
                }
              ]
            },
            "minItems": 1,
            "maxItems": 50
          }
        },
        "required": [
          "schemaVersion",
          "subject",
          "conditions",
          "lines"
        ],
        "additionalProperties": false,
        "description": "Schema 1 catalogusregels gebruiken product_picker; schema 2 catalogusregels gebruiken een serverbevestiging. Catalogusregels vereisen catalog met onveranderlijke versie. Route- en schema-2-catalogusregels vereisen conceptId en een actuele serverbevestiging van dezelfde gebruiker/organisatie/concept. Hergebruik geen tokens tussen concepten. Regel-ID’s uniek; validUntil >= offerDate; prijzen en totalen worden server-side berekend. Geld/hoeveelheid zijn gehele centen/duizendsten, geen floats."
      },
      "RapportStart": {
        "type": "object",
        "properties": {
          "dossierId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "notities": {
            "type": "string",
            "maxLength": 120000
          },
          "stijlprofielId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "tier": {
            "type": "string",
            "enum": [
              "basis",
              "standaard",
              "max"
            ]
          },
          "klantId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "taal": {
            "type": "string",
            "maxLength": 40
          },
          "tweedeTaal": {
            "type": "string",
            "maxLength": 40
          },
          "bronOpnameIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            },
            "maxItems": 50
          },
          "merkstijlKeuze": {
            "type": "string",
            "enum": [
              "automatisch",
              "neutraal"
            ]
          },
          "generatieOpties": {
            "$ref": "#/components/schemas/GeneratieOpties"
          },
          "languagePolicy": {
            "$ref": "#/components/schemas/LanguagePolicy"
          },
          "stijlenV2": {
            "$ref": "#/components/schemas/StijlenV2Document"
          },
          "documentformat": {
            "$ref": "#/components/schemas/Documentformat"
          }
        },
        "required": [
          "dossierId"
        ],
        "additionalProperties": false,
        "description": "Canonieke invoer. Nested normalisatie, eigenaarschap, privacyvrijgave, stijlstatus, bevroren profielversies en bronnen worden opnieuw gecontroleerd. Totale JSON-body maximaal 100 KiB."
      },
      "OfferteStart": {
        "type": "object",
        "properties": {
          "dossierId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "notities": {
            "type": "string",
            "maxLength": 120000
          },
          "stijlprofielId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "tier": {
            "type": "string",
            "enum": [
              "basis",
              "standaard",
              "max"
            ]
          },
          "klantId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "taal": {
            "type": "string",
            "maxLength": 40
          },
          "tweedeTaal": {
            "type": "string",
            "maxLength": 40
          },
          "bronOpnameIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            },
            "maxItems": 50
          },
          "merkstijlKeuze": {
            "type": "string",
            "enum": [
              "automatisch",
              "neutraal"
            ]
          },
          "generatieOpties": {
            "$ref": "#/components/schemas/GeneratieOpties"
          },
          "languagePolicy": {
            "$ref": "#/components/schemas/LanguagePolicy"
          },
          "stijlenV2": {
            "$ref": "#/components/schemas/StijlenV2Document"
          },
          "documentformat": {
            "$ref": "#/components/schemas/Documentformat"
          },
          "offerteInvoer": {
            "$ref": "#/components/schemas/OfferteInvoer"
          }
        },
        "required": [
          "dossierId"
        ],
        "additionalProperties": false,
        "description": "Canonieke invoer. Nested normalisatie, eigenaarschap, privacyvrijgave, stijlstatus, bevroren profielversies en bronnen worden opnieuw gecontroleerd. Totale JSON-body maximaal 100 KiB."
      },
      "PresentatieStart": {
        "type": "object",
        "properties": {
          "dossierId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "notities": {
            "type": "string",
            "maxLength": 120000
          },
          "stijlprofielId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "tier": {
            "type": "string",
            "enum": [
              "basis",
              "standaard",
              "max"
            ]
          },
          "klantId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "taal": {
            "type": "string",
            "maxLength": 40
          },
          "tweedeTaal": {
            "type": "string",
            "maxLength": 40
          },
          "bronOpnameIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            },
            "maxItems": 50
          },
          "merkstijlKeuze": {
            "type": "string",
            "enum": [
              "automatisch",
              "neutraal"
            ]
          },
          "generatieOpties": {
            "$ref": "#/components/schemas/GeneratieOpties"
          },
          "languagePolicy": {
            "$ref": "#/components/schemas/LanguagePolicy"
          },
          "stijlenV2": {
            "$ref": "#/components/schemas/StijlenV2Document"
          },
          "presentatieOpties": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PresentatieOpties"
              },
              {
                "type": "null"
              }
            ]
          },
          "bronRapportVersieId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          }
        },
        "required": [
          "dossierId"
        ],
        "additionalProperties": false,
        "description": "Canonieke invoer. Nested normalisatie, eigenaarschap, privacyvrijgave, stijlstatus, bevroren profielversies en bronnen worden opnieuw gecontroleerd. Totale JSON-body maximaal 100 KiB."
      },
      "GesprekOntvangst": {
        "type": "object",
        "properties": {
          "gesprek_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "creditmodus": {
            "const": "persoonlijke_api_kosten"
          },
          "credits_schatting": {
            "type": "null"
          },
          "credits_afgeboekt": {
            "type": "number"
          },
          "tier": {
            "type": "string",
            "enum": [
              "basis",
              "standaard",
              "max"
            ]
          },
          "lengteband": {
            "type": "string"
          },
          "taal": {
            "type": "string",
            "pattern": "^[a-z]{2,3}$",
            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
          },
          "tweedeTaal": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[a-z]{2,3}$",
                "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
              },
              {
                "type": "null"
              }
            ]
          },
          "requestedLanguagePolicy": {
            "$ref": "#/components/schemas/LanguagePolicy"
          },
          "resolvedLanguages": {
            "$ref": "#/components/schemas/ResolvedLanguages"
          },
          "activeVariantStatuses": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TaalvariantStatus"
            }
          },
          "variantStatuses": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TaalvariantStatus"
            }
          },
          "policyVersion": {
            "type": "integer",
            "minimum": 0
          },
          "policyUpdatedAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "taalbeleidWaarschuwing": {
            "type": "string"
          }
        },
        "required": [
          "gesprek_id",
          "tier",
          "lengteband",
          "taal",
          "tweedeTaal",
          "requestedLanguagePolicy",
          "resolvedLanguages",
          "activeVariantStatuses",
          "variantStatuses",
          "policyVersion",
          "policyUpdatedAt"
        ],
        "additionalProperties": false,
        "description": "Persoonlijke kostenmodus geeft creditmodus + credits_schatting:null; legacy geeft credits_afgeboekt. Taalbeleidwaarschuwing is optioneel. Startstatus is nog geen inhoudelijke voltooiing."
      },
      "Klantmap": {
        "type": "object",
        "properties": {
          "naam": {
            "type": "string",
            "minLength": 1,
            "maxLength": 150,
            "pattern": "^[^\\x00-\\x1f\\x7f]*\\S[^\\x00-\\x1f\\x7f]*$"
          },
          "email": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 254,
                "description": "Leeg wist het adres; anders een geldig adres. De dienst trimt en normaliseert naar kleine letters."
              },
              {
                "type": "null"
              }
            ]
          },
          "taal": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^(?:[a-z]{2,3}(?:-[a-z]{2})?)?$",
                "description": "Leeg/null wist de taal. Geen auto. Hoofdletters worden genormaliseerd."
              },
              {
                "type": "null"
              }
            ]
          },
          "bedrijf": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 180,
                "pattern": "^[^\\x00-\\x1f\\x7f]*$"
              },
              {
                "type": "null"
              }
            ]
          },
          "contactpersoon": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 150,
                "pattern": "^[^\\x00-\\x1f\\x7f]*$"
              },
              {
                "type": "null"
              }
            ]
          },
          "telefoon": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 50,
                "pattern": "^[^\\x00-\\x1f\\x7f]*$"
              },
              {
                "type": "null"
              }
            ]
          },
          "adres": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 250,
                "pattern": "^[^\\x00-\\x1f\\x7f]*$"
              },
              {
                "type": "null"
              }
            ]
          },
          "postcode": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 24,
                "pattern": "^[^\\x00-\\x1f\\x7f]*$"
              },
              {
                "type": "null"
              }
            ]
          },
          "plaats": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 120,
                "pattern": "^[^\\x00-\\x1f\\x7f]*$"
              },
              {
                "type": "null"
              }
            ]
          },
          "land": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 100,
                "pattern": "^[^\\x00-\\x1f\\x7f]*$"
              },
              {
                "type": "null"
              }
            ]
          },
          "externe_referentie": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 200,
                "pattern": "^[^\\x00-\\x1f\\x7f]*$"
              },
              {
                "type": "null"
              }
            ]
          },
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "aangemaakt_op": {
            "type": "string",
            "format": "date-time"
          },
          "gearchiveerd": {
            "type": "boolean"
          },
          "api_revisie": {
            "type": "integer",
            "minimum": 1
          }
        },
        "required": [
          "id",
          "naam",
          "api_revisie"
        ],
        "additionalProperties": false
      },
      "KlantmapOntvangst": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "revisie": {
            "type": "integer",
            "minimum": 1
          },
          "handeling": {
            "type": "string",
            "enum": [
              "aanmaken",
              "wijzigen",
              "verwijderen"
            ]
          },
          "herhaald": {
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "revisie",
          "handeling",
          "herhaald"
        ],
        "additionalProperties": false
      },
      "Spreker": {
        "type": "object",
        "properties": {
          "label": {
            "type": "string"
          },
          "naam": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "label",
          "naam"
        ],
        "additionalProperties": false
      },
      "TranscriptWoord": {
        "type": "object",
        "properties": {
          "tekst": {
            "type": "string"
          },
          "leesteken": {
            "type": "boolean"
          },
          "start": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "eind": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "taal": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "zekerheid": {
            "anyOf": [
              {
                "type": "number",
                "minimum": 0,
                "maximum": 1
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "tekst",
          "leesteken",
          "start",
          "eind",
          "taal",
          "zekerheid"
        ],
        "additionalProperties": false
      },
      "TranscriptSegment": {
        "type": "object",
        "properties": {
          "start": {
            "type": "integer",
            "minimum": 0
          },
          "eind": {
            "type": "integer",
            "minimum": 0
          },
          "tekst": {
            "type": "string"
          },
          "spreker": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "woorden": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TranscriptWoord"
            }
          }
        },
        "required": [
          "start",
          "eind",
          "tekst",
          "spreker"
        ],
        "additionalProperties": false,
        "description": "Tijden in milliseconden; woorden zijn alleen bij rijke transcriptie aanwezig."
      },
      "BibliotheekTreffer": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "type": {
            "type": "string",
            "enum": [
              "document",
              "opname"
            ]
          },
          "titel": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "datum": {
            "type": "string",
            "format": "date-time"
          },
          "klant_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "klantnaam": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "gesprek_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "taal": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "bron": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "heeft_audio": {
            "type": "boolean"
          },
          "fragment": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "type",
          "titel",
          "datum",
          "klant_id",
          "klantnaam",
          "gesprek_id",
          "taal",
          "status",
          "bron",
          "fragment"
        ],
        "additionalProperties": false
      },
      "ZelfserviceAanvraag": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "doel": {
            "type": "string",
            "enum": [
              "abonnement",
              "opslag",
              "white_label",
              "facturatie",
              "credits",
              "automatische_credits",
              "automatische_opslag",
              "sleutels",
              "beveiliging",
              "passkeys",
              "team"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "wacht_op_gebruiker",
              "geopend",
              "verlopen"
            ]
          },
          "verloopt_op": {
            "type": "string",
            "format": "date-time"
          },
          "geopend_op": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "menselijke_handeling_nodig": {
            "const": true
          },
          "uitvoering_bevestigd": {
            "const": false
          },
          "herhaald": {
            "type": "boolean"
          },
          "bevestiging_url": {
            "type": "string",
            "format": "uri"
          }
        },
        "required": [
          "id",
          "doel",
          "status",
          "verloopt_op",
          "geopend_op",
          "menselijke_handeling_nodig",
          "uitvoering_bevestigd"
        ],
        "additionalProperties": false
      },
      "JsonWaarde": {
        "description": "Het domein bewaart verduidelijkingsantwoorden als JSON zonder verdere typebeperking.",
        "oneOf": [
          {
            "type": "string"
          },
          {
            "type": "number"
          },
          {
            "type": "boolean"
          },
          {
            "type": "null"
          },
          {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/JsonWaarde"
            }
          },
          {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/JsonWaarde"
            }
          }
        ]
      },
      "Uitvoeringskeuze": {
        "type": "object",
        "properties": {
          "modelniveau": {
            "type": "string",
            "enum": [
              "basis",
              "standaard",
              "max"
            ]
          },
          "verwerkingsvariant": {
            "type": "string",
            "enum": [
              "basis",
              "zorgvuldig",
              "optimaal"
            ]
          }
        },
        "required": [],
        "additionalProperties": false,
        "description": "Ontbrekende velden worden standaard/ zorgvuldig. Beide waarden worden genormaliseerd."
      },
      "ProcesvoorstelInvoer": {
        "type": "object",
        "properties": {
          "schema_versie": {
            "const": 1
          },
          "standaard_uitvoeringskeuze": {
            "$ref": "#/components/schemas/Uitvoeringskeuze"
          },
          "stappen": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "sleutel": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120,
                  "pattern": "^[a-z0-9][a-z0-9_.-]*$"
                },
                "soort": {
                  "type": "string",
                  "enum": [
                    "bron_verzamelen",
                    "voorbereiden",
                    "gesprek",
                    "genereren",
                    "controleren",
                    "goedkeuren",
                    "leveren",
                    "aanvullen"
                  ]
                },
                "naam": {
                  "type": "string",
                  "maxLength": 200
                },
                "toelichting": {
                  "type": "string",
                  "maxLength": 2000
                }
              },
              "required": [
                "sleutel",
                "soort"
              ],
              "additionalProperties": false
            }
          },
          "bronregels": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "sleutel": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120,
                  "pattern": "^[a-z0-9][a-z0-9_.-]*$"
                },
                "label": {
                  "type": "string",
                  "maxLength": 200
                },
                "verplicht": {
                  "type": "boolean"
                }
              },
              "required": [
                "sleutel"
              ],
              "additionalProperties": false
            }
          },
          "verduidelijkingsvragen": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "sleutel": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120,
                  "pattern": "^[a-z0-9][a-z0-9_.-]*$"
                },
                "vraag": {
                  "type": "string",
                  "maxLength": 1000
                },
                "verplicht": {
                  "type": "boolean"
                }
              },
              "required": [
                "sleutel"
              ],
              "additionalProperties": false
            }
          },
          "inhoudelijke_goedkeuring": {
            "type": "object",
            "properties": {
              "verplicht": {
                "type": "boolean"
              },
              "vier_ogen": {
                "type": "boolean"
              }
            },
            "required": [],
            "additionalProperties": false
          },
          "verschillenbeleid": {
            "type": "object",
            "properties": {
              "intern": {
                "type": "string",
                "enum": [
                  "volledig",
                  "uit"
                ]
              },
              "extern": {
                "type": "string",
                "enum": [
                  "uit",
                  "veilige_samenvatting"
                ]
              }
            },
            "required": [],
            "additionalProperties": false
          },
          "beschikbaar_voor": {
            "type": "string",
            "enum": [
              "alle_plannen",
              "enterprise"
            ]
          }
        },
        "required": [],
        "additionalProperties": false,
        "description": "Canonieke vorm. Sleutels uniek binnen elke lijst. De server trimt/kort tekstvelden in, bepaalt fase en volgorde, en zet ontbrekende lijsten op leeg. Vier ogen vereist verplicht:true en beschikbaar_voor:enterprise. Om een bestaand proces te behouden laat aangepast_procesvoorstel geheel weg; een object vervangt de procesinstellingen."
      },
      "Procesvoorstel": {
        "type": "object",
        "properties": {
          "schema_versie": {
            "const": 1
          },
          "standaard_uitvoeringskeuze": {
            "$ref": "#/components/schemas/Uitvoeringskeuze"
          },
          "stappen": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "sleutel": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120,
                  "pattern": "^[a-z0-9][a-z0-9_.-]*$"
                },
                "soort": {
                  "type": "string",
                  "enum": [
                    "bron_verzamelen",
                    "voorbereiden",
                    "gesprek",
                    "genereren",
                    "controleren",
                    "goedkeuren",
                    "leveren",
                    "aanvullen"
                  ]
                },
                "naam": {
                  "type": "string",
                  "maxLength": 200
                },
                "toelichting": {
                  "type": "string",
                  "maxLength": 2000
                },
                "fase": {
                  "type": "string",
                  "enum": [
                    "voorbereiding",
                    "gesprek",
                    "concept",
                    "goedkeuring",
                    "aanvulling",
                    "definitief"
                  ]
                },
                "volgorde": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "required": [
                "sleutel",
                "soort",
                "naam",
                "toelichting",
                "fase",
                "volgorde"
              ],
              "additionalProperties": false
            }
          },
          "bronregels": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "sleutel": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120,
                  "pattern": "^[a-z0-9][a-z0-9_.-]*$"
                },
                "label": {
                  "type": "string",
                  "maxLength": 200
                },
                "verplicht": {
                  "type": "boolean"
                }
              },
              "required": [
                "sleutel"
              ],
              "additionalProperties": false
            }
          },
          "verduidelijkingsvragen": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "sleutel": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120,
                  "pattern": "^[a-z0-9][a-z0-9_.-]*$"
                },
                "vraag": {
                  "type": "string",
                  "maxLength": 1000
                },
                "verplicht": {
                  "type": "boolean"
                }
              },
              "required": [
                "sleutel"
              ],
              "additionalProperties": false
            }
          },
          "inhoudelijke_goedkeuring": {
            "type": "object",
            "properties": {
              "verplicht": {
                "type": "boolean"
              },
              "vier_ogen": {
                "type": "boolean"
              }
            },
            "required": [],
            "additionalProperties": false
          },
          "verschillenbeleid": {
            "type": "object",
            "properties": {
              "intern": {
                "type": "string",
                "enum": [
                  "volledig",
                  "uit"
                ]
              },
              "extern": {
                "type": "string",
                "enum": [
                  "uit",
                  "veilige_samenvatting"
                ]
              }
            },
            "required": [],
            "additionalProperties": false
          },
          "beschikbaar_voor": {
            "type": "string",
            "enum": [
              "alle_plannen",
              "enterprise"
            ]
          }
        },
        "required": [
          "schema_versie",
          "standaard_uitvoeringskeuze",
          "stappen",
          "bronregels",
          "verduidelijkingsvragen",
          "inhoudelijke_goedkeuring",
          "verschillenbeleid",
          "beschikbaar_voor"
        ],
        "additionalProperties": false
      },
      "Workflowvoorstel": {
        "type": "object",
        "properties": {
          "schema_versie": {
            "const": 1
          },
          "bouwer": {
            "const": "begeleid_b2"
          },
          "voorstel_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "organization_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "workflowprofiel_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "deling_scope": {
            "type": "string",
            "enum": [
              "persoonlijk",
              "team"
            ]
          },
          "eigenaar_user_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "naam": {
            "type": "string",
            "maxLength": 200
          },
          "klantbeschrijving": {
            "type": "string",
            "maxLength": 10000
          },
          "gekoppelde_stijlprofiel_ids": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            },
            "uniqueItems": true
          },
          "procesvoorstel": {
            "$ref": "#/components/schemas/Procesvoorstel"
          },
          "verduidelijkingsvragen": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120
                },
                "vraag_key": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 200
                },
                "parameters": {
                  "type": "object",
                  "additionalProperties": {
                    "$ref": "#/components/schemas/JsonWaarde"
                  }
                },
                "verplicht": {
                  "type": "boolean"
                },
                "antwoord": {
                  "$ref": "#/components/schemas/JsonWaarde"
                },
                "beantwoord": {
                  "type": "boolean"
                }
              },
              "required": [
                "id",
                "vraag_key",
                "parameters",
                "verplicht",
                "antwoord",
                "beantwoord"
              ],
              "additionalProperties": false
            }
          },
          "visueel_voorstel": {
            "type": "object",
            "properties": {
              "richting": {
                "const": "links_naar_rechts"
              },
              "knooppunten": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "soort": {
                      "type": "string",
                      "enum": [
                        "bron_verzamelen",
                        "voorbereiden",
                        "gesprek",
                        "genereren",
                        "controleren",
                        "goedkeuren",
                        "leveren",
                        "aanvullen"
                      ]
                    },
                    "fase": {
                      "type": "string",
                      "enum": [
                        "voorbereiding",
                        "gesprek",
                        "concept",
                        "goedkeuring",
                        "aanvulling",
                        "definitief"
                      ]
                    },
                    "naam": {
                      "type": "string"
                    },
                    "volgorde": {
                      "type": "integer",
                      "minimum": 1
                    }
                  },
                  "required": [
                    "id",
                    "soort",
                    "fase",
                    "naam",
                    "volgorde"
                  ],
                  "additionalProperties": false
                }
              },
              "verbindingen": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "van": {
                      "type": "string"
                    },
                    "naar": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "van",
                    "naar"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "richting",
              "knooppunten",
              "verbindingen"
            ],
            "additionalProperties": false
          },
          "status": {
            "type": "string",
            "enum": [
              "concept",
              "verduidelijking_nodig",
              "klaar_voor_indienen",
              "ingediend",
              "informatie_gevraagd",
              "goedgekeurd",
              "afgewezen"
            ]
          },
          "revisie": {
            "type": "integer",
            "minimum": 1
          },
          "aangemaakt_door": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "aangemaakt_op": {
            "type": "string",
            "format": "date-time"
          },
          "bijgewerkt_op": {
            "type": "string",
            "format": "date-time"
          },
          "bijgewerkt_door": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "ingediend_door": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "ingediend_op": {
            "type": "string",
            "format": "date-time"
          },
          "besluit": {
            "type": "object",
            "properties": {
              "soort": {
                "type": "string",
                "enum": [
                  "informatie_vragen",
                  "afwijzen",
                  "goedkeuren"
                ]
              },
              "actor_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "besloten_op": {
                "type": "string",
                "format": "date-time"
              },
              "reden_code": {
                "type": "string",
                "maxLength": 120
              },
              "workflowprofiel_versie_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "workflowprofiel_versie_hash": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              }
            },
            "required": [
              "soort",
              "actor_id",
              "besloten_op"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "schema_versie",
          "bouwer",
          "voorstel_id",
          "organization_id",
          "workflowprofiel_id",
          "deling_scope",
          "eigenaar_user_id",
          "naam",
          "klantbeschrijving",
          "gekoppelde_stijlprofiel_ids",
          "procesvoorstel",
          "verduidelijkingsvragen",
          "visueel_voorstel",
          "status",
          "revisie",
          "aangemaakt_door",
          "aangemaakt_op",
          "bijgewerkt_op"
        ],
        "additionalProperties": false
      },
      "OrganisatieInstructieVersie": {
        "type": "object",
        "properties": {
          "schema_versie": {
            "const": 1
          },
          "soort": {
            "const": "organisatie_instructie"
          },
          "organization_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "organisatie_instructie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versie_nummer": {
            "type": "integer",
            "minimum": 1
          },
          "immutable": {
            "const": true
          },
          "inhoud_status": {
            "type": "string",
            "enum": [
              "beschikbaar",
              "inhoud_verwijderd"
            ]
          },
          "payload_hash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "versie_hash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "vastgelegd_door": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "vastgelegd_op": {
            "type": "string",
            "format": "date-time"
          },
          "tekst": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 30000
              },
              {
                "type": "null"
              }
            ]
          },
          "inhoud_verwijderd_op": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "inhoud_verwijderbewijs_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "schema_versie",
          "soort",
          "organization_id",
          "organisatie_instructie_id",
          "versie_id",
          "versie_nummer",
          "immutable",
          "inhoud_status",
          "payload_hash",
          "versie_hash",
          "vastgelegd_door",
          "vastgelegd_op",
          "tekst"
        ],
        "additionalProperties": false
      },
      "OrganisatieInstructie": {
        "type": "object",
        "properties": {
          "organisatie_instructie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "organization_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "documenttype": {
            "type": "string",
            "maxLength": 100
          },
          "actief": {
            "type": "boolean"
          },
          "huidige_versie_nummer": {
            "type": "integer",
            "minimum": 0
          },
          "actieve_versie": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/OrganisatieInstructieVersie"
              },
              {
                "type": "null"
              }
            ]
          },
          "aangemaakt_op": {
            "type": "string",
            "format": "date-time"
          },
          "bijgewerkt_op": {
            "type": "string",
            "format": "date-time"
          },
          "etag": {
            "type": "string"
          }
        },
        "required": [
          "organisatie_instructie_id",
          "organization_id",
          "documenttype",
          "actief",
          "huidige_versie_nummer",
          "actieve_versie",
          "aangemaakt_op",
          "bijgewerkt_op"
        ],
        "additionalProperties": false
      },
      "WorkflowprofielVersie": {
        "type": "object",
        "properties": {
          "schema_versie": {
            "const": 1
          },
          "organization_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "workflowprofiel_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versie_nummer": {
            "type": "integer",
            "minimum": 1
          },
          "naam": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "const": "goedgekeurd"
          },
          "immutable": {
            "const": true
          },
          "deling_scope": {
            "type": "string",
            "enum": [
              "persoonlijk",
              "team"
            ]
          },
          "eigenaar_user_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "gekoppelde_stijlprofiel_ids": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          "instellingen": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Procesvoorstel"
              },
              {
                "type": "null"
              }
            ]
          },
          "payload_hash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "versie_hash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "goedgekeurd_door": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "goedgekeurd_op": {
            "type": "string",
            "format": "date-time"
          },
          "inhoud_status": {
            "type": "string",
            "enum": [
              "beschikbaar",
              "inhoud_verwijderd"
            ]
          },
          "inhoud_verwijderd_op": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "inhoud_verwijderbewijs_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "schema_versie",
          "organization_id",
          "workflowprofiel_id",
          "versie_id",
          "versie_nummer",
          "naam",
          "status",
          "immutable",
          "deling_scope",
          "eigenaar_user_id",
          "gekoppelde_stijlprofiel_ids",
          "instellingen",
          "payload_hash",
          "versie_hash",
          "goedgekeurd_door",
          "goedgekeurd_op",
          "inhoud_status",
          "inhoud_verwijderd_op",
          "inhoud_verwijderbewijs_id"
        ],
        "additionalProperties": false
      },
      "TranscriptieStatus": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "status": {
                "const": "bezig"
              },
              "model_id": {
                "type": "string",
                "enum": [
                  "melia-1",
                  "enhanced"
                ]
              }
            },
            "required": [
              "status"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "status": {
                "const": "klaar"
              },
              "model_id": {
                "type": "string",
                "enum": [
                  "melia-1",
                  "enhanced"
                ]
              },
              "transcript": {
                "type": "string"
              },
              "duur_seconden": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "credits_afgeboekt": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "opname_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              }
            },
            "required": [
              "status",
              "transcript",
              "duur_seconden",
              "credits_afgeboekt",
              "opname_id"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "status": {
                "const": "mislukt"
              },
              "model_id": {
                "type": "string",
                "enum": [
                  "melia-1",
                  "enhanced"
                ]
              },
              "foutcode": {
                "type": "string"
              },
              "detail": {
                "type": "string"
              },
              "advies_pakket": {
                "const": "basis"
              },
              "overschrijdingslimiet_credits": {
                "type": "integer",
                "minimum": 0
              }
            },
            "required": [
              "status",
              "foutcode"
            ],
            "additionalProperties": false
          }
        ]
      },
      "TranscriptieTarief": {
        "type": "object",
        "properties": {
          "actief": {
            "type": "boolean"
          },
          "persoonlijke_kostencredits": {
            "type": "boolean"
          },
          "credits_per_begonnen_minuut": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "standaard_model_id": {
            "type": "string",
            "enum": [
              "melia-1",
              "enhanced"
            ]
          },
          "modellen": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "model_id": {
                  "type": "string",
                  "enum": [
                    "melia-1",
                    "enhanced"
                  ]
                },
                "standaard": {
                  "type": "boolean"
                },
                "actief": {
                  "type": "boolean"
                },
                "credits_per_begonnen_minuut": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": 1
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "meertalig": {
                  "type": "boolean"
                },
                "sprekerherkenning": {
                  "const": true
                }
              },
              "required": [
                "model_id",
                "standaard",
                "actief",
                "credits_per_begonnen_minuut",
                "meertalig",
                "sprekerherkenning"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "actief",
          "persoonlijke_kostencredits",
          "credits_per_begonnen_minuut"
        ],
        "additionalProperties": false
      },
      "AccountBedrijf": {
        "type": "object",
        "properties": {
          "basis": {
            "type": "string",
            "pattern": "^[0-9]{1,18}$",
            "description": "Opaque revisie als string, ook \"0\" is geldig. Ongewijzigd terugsturen; niet zelf verhogen."
          },
          "waarde": {
            "type": "object",
            "properties": {
              "contactpersoon": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 200
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "adres": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 200
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "postcode": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 200
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "plaats": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 200
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "telefoon": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 200
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "website": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 200
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "kvk_nummer": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 200
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "branche": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 120
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "offerte_prefix": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 20
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "offerte_geldigheid_dagen": {
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 365
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "offerte_betalingscondities": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 500
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "offerte_btw_pct": {
                "anyOf": [
                  {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 100
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "offerte_volgnummer": {
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 0
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "contactpersoon",
              "adres",
              "postcode",
              "plaats",
              "telefoon",
              "website",
              "kvk_nummer",
              "branche",
              "offerte_prefix",
              "offerte_geldigheid_dagen",
              "offerte_betalingscondities",
              "offerte_btw_pct",
              "offerte_volgnummer"
            ],
            "additionalProperties": false
          },
          "is_beheerder": {
            "type": "boolean"
          }
        },
        "required": [
          "basis",
          "waarde",
          "is_beheerder"
        ],
        "additionalProperties": false
      },
      "AccountSchermtaal": {
        "type": "object",
        "properties": {
          "basis": {
            "type": "string",
            "pattern": "^[0-9]{1,18}$",
            "description": "Opaque revisie als string, ook \"0\" is geldig. Ongewijzigd terugsturen; niet zelf verhogen."
          },
          "waarde": {
            "type": "object",
            "properties": {
              "taal": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 6,
                    "pattern": "^(?:[a-z]{2,3}(?:-[a-z]{2})?)?$"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "taal"
            ],
            "additionalProperties": false
          },
          "is_beheerder": {
            "type": "boolean"
          }
        },
        "required": [
          "basis",
          "waarde",
          "is_beheerder"
        ],
        "additionalProperties": false
      },
      "AccountUitvoertalen": {
        "type": "object",
        "properties": {
          "basis": {
            "type": "string",
            "pattern": "^[0-9]{1,18}$",
            "description": "Opaque revisie als string, ook \"0\" is geldig. Ongewijzigd terugsturen; niet zelf verhogen."
          },
          "waarde": {
            "type": "object",
            "properties": {
              "primaryDefault": {
                "type": "string",
                "pattern": "^(?:auto|[a-z]{2,3})$"
              },
              "secondary": {
                "type": "object",
                "properties": {
                  "enabled": {
                    "type": "boolean"
                  },
                  "defaultLanguage": {
                    "anyOf": [
                      {
                        "type": "string",
                        "pattern": "^[a-z]{2,3}$",
                        "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": [
                  "enabled",
                  "defaultLanguage"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "primaryDefault",
              "secondary"
            ],
            "additionalProperties": false,
            "description": "secondary.enabled:true vereist concrete defaultLanguage. Primaire taal mag auto zijn. capability.available zegt of tweede uitvoertaal in de runtime is vrijgegeven."
          },
          "is_beheerder": {
            "type": "boolean"
          },
          "capability": {
            "type": "object",
            "properties": {
              "available": {
                "type": "boolean"
              }
            },
            "required": [
              "available"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "basis",
          "waarde",
          "is_beheerder",
          "capability"
        ],
        "additionalProperties": false
      },
      "AccountTeamkwaliteit": {
        "type": "object",
        "properties": {
          "basis": {
            "type": "string",
            "pattern": "^[0-9]{1,18}$",
            "description": "Opaque revisie als string, ook \"0\" is geldig. Ongewijzigd terugsturen; niet zelf verhogen."
          },
          "waarde": {
            "type": "object",
            "properties": {
              "org": {
                "type": "object",
                "properties": {
                  "bundel": {
                    "type": "object",
                    "properties": {
                      "tier": {
                        "type": "string",
                        "enum": [
                          "basis",
                          "standaard",
                          "max"
                        ]
                      },
                      "mag_afwijken": {
                        "type": "boolean"
                      }
                    },
                    "required": [
                      "tier",
                      "mag_afwijken"
                    ],
                    "additionalProperties": false
                  },
                  "rapport": {
                    "type": "object",
                    "properties": {
                      "tier": {
                        "type": "string",
                        "enum": [
                          "basis",
                          "standaard",
                          "max"
                        ]
                      },
                      "mag_afwijken": {
                        "type": "boolean"
                      }
                    },
                    "required": [
                      "tier",
                      "mag_afwijken"
                    ],
                    "additionalProperties": false
                  },
                  "offerte": {
                    "type": "object",
                    "properties": {
                      "tier": {
                        "type": "string",
                        "enum": [
                          "basis",
                          "standaard",
                          "max"
                        ]
                      },
                      "mag_afwijken": {
                        "type": "boolean"
                      }
                    },
                    "required": [
                      "tier",
                      "mag_afwijken"
                    ],
                    "additionalProperties": false
                  }
                },
                "required": [],
                "additionalProperties": false
              },
              "eigen": {
                "type": "object",
                "properties": {
                  "bundel": {
                    "type": "string",
                    "enum": [
                      "basis",
                      "standaard",
                      "max"
                    ]
                  },
                  "rapport": {
                    "type": "string",
                    "enum": [
                      "basis",
                      "standaard",
                      "max"
                    ]
                  },
                  "offerte": {
                    "type": "string",
                    "enum": [
                      "basis",
                      "standaard",
                      "max"
                    ]
                  }
                },
                "required": [],
                "additionalProperties": false
              },
              "soorten": {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "bundel",
                    "rapport",
                    "offerte"
                  ]
                },
                "minItems": 3,
                "maxItems": 3
              },
              "effectief": {
                "type": "object",
                "properties": {
                  "bundel": {
                    "type": "object",
                    "properties": {
                      "tier": {
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "basis",
                              "standaard",
                              "max"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "vastgezet": {
                        "type": "boolean"
                      },
                      "bron": {
                        "type": "string",
                        "enum": [
                          "org_vast",
                          "eigen",
                          "org_default",
                          "geen"
                        ]
                      }
                    },
                    "required": [
                      "tier",
                      "vastgezet",
                      "bron"
                    ],
                    "additionalProperties": false
                  },
                  "rapport": {
                    "type": "object",
                    "properties": {
                      "tier": {
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "basis",
                              "standaard",
                              "max"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "vastgezet": {
                        "type": "boolean"
                      },
                      "bron": {
                        "type": "string",
                        "enum": [
                          "org_vast",
                          "eigen",
                          "org_default",
                          "geen"
                        ]
                      }
                    },
                    "required": [
                      "tier",
                      "vastgezet",
                      "bron"
                    ],
                    "additionalProperties": false
                  },
                  "offerte": {
                    "type": "object",
                    "properties": {
                      "tier": {
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "basis",
                              "standaard",
                              "max"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "vastgezet": {
                        "type": "boolean"
                      },
                      "bron": {
                        "type": "string",
                        "enum": [
                          "org_vast",
                          "eigen",
                          "org_default",
                          "geen"
                        ]
                      }
                    },
                    "required": [
                      "tier",
                      "vastgezet",
                      "bron"
                    ],
                    "additionalProperties": false
                  }
                },
                "required": [
                  "bundel",
                  "rapport",
                  "offerte"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "org",
              "eigen",
              "soorten",
              "effectief"
            ],
            "additionalProperties": false
          },
          "is_beheerder": {
            "type": "boolean"
          }
        },
        "required": [
          "basis",
          "waarde",
          "is_beheerder"
        ],
        "additionalProperties": false
      },
      "AccountMijnkwaliteit": {
        "type": "object",
        "properties": {
          "basis": {
            "type": "string",
            "pattern": "^[0-9]{1,18}$",
            "description": "Opaque revisie als string, ook \"0\" is geldig. Ongewijzigd terugsturen; niet zelf verhogen."
          },
          "waarde": {
            "type": "object",
            "properties": {
              "org": {
                "type": "object",
                "properties": {
                  "bundel": {
                    "type": "object",
                    "properties": {
                      "tier": {
                        "type": "string",
                        "enum": [
                          "basis",
                          "standaard",
                          "max"
                        ]
                      },
                      "mag_afwijken": {
                        "type": "boolean"
                      }
                    },
                    "required": [
                      "tier",
                      "mag_afwijken"
                    ],
                    "additionalProperties": false
                  },
                  "rapport": {
                    "type": "object",
                    "properties": {
                      "tier": {
                        "type": "string",
                        "enum": [
                          "basis",
                          "standaard",
                          "max"
                        ]
                      },
                      "mag_afwijken": {
                        "type": "boolean"
                      }
                    },
                    "required": [
                      "tier",
                      "mag_afwijken"
                    ],
                    "additionalProperties": false
                  },
                  "offerte": {
                    "type": "object",
                    "properties": {
                      "tier": {
                        "type": "string",
                        "enum": [
                          "basis",
                          "standaard",
                          "max"
                        ]
                      },
                      "mag_afwijken": {
                        "type": "boolean"
                      }
                    },
                    "required": [
                      "tier",
                      "mag_afwijken"
                    ],
                    "additionalProperties": false
                  }
                },
                "required": [],
                "additionalProperties": false
              },
              "eigen": {
                "type": "object",
                "properties": {
                  "bundel": {
                    "type": "string",
                    "enum": [
                      "basis",
                      "standaard",
                      "max"
                    ]
                  },
                  "rapport": {
                    "type": "string",
                    "enum": [
                      "basis",
                      "standaard",
                      "max"
                    ]
                  },
                  "offerte": {
                    "type": "string",
                    "enum": [
                      "basis",
                      "standaard",
                      "max"
                    ]
                  }
                },
                "required": [],
                "additionalProperties": false
              },
              "soorten": {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "bundel",
                    "rapport",
                    "offerte"
                  ]
                },
                "minItems": 3,
                "maxItems": 3
              },
              "effectief": {
                "type": "object",
                "properties": {
                  "bundel": {
                    "type": "object",
                    "properties": {
                      "tier": {
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "basis",
                              "standaard",
                              "max"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "vastgezet": {
                        "type": "boolean"
                      },
                      "bron": {
                        "type": "string",
                        "enum": [
                          "org_vast",
                          "eigen",
                          "org_default",
                          "geen"
                        ]
                      }
                    },
                    "required": [
                      "tier",
                      "vastgezet",
                      "bron"
                    ],
                    "additionalProperties": false
                  },
                  "rapport": {
                    "type": "object",
                    "properties": {
                      "tier": {
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "basis",
                              "standaard",
                              "max"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "vastgezet": {
                        "type": "boolean"
                      },
                      "bron": {
                        "type": "string",
                        "enum": [
                          "org_vast",
                          "eigen",
                          "org_default",
                          "geen"
                        ]
                      }
                    },
                    "required": [
                      "tier",
                      "vastgezet",
                      "bron"
                    ],
                    "additionalProperties": false
                  },
                  "offerte": {
                    "type": "object",
                    "properties": {
                      "tier": {
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "basis",
                              "standaard",
                              "max"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "vastgezet": {
                        "type": "boolean"
                      },
                      "bron": {
                        "type": "string",
                        "enum": [
                          "org_vast",
                          "eigen",
                          "org_default",
                          "geen"
                        ]
                      }
                    },
                    "required": [
                      "tier",
                      "vastgezet",
                      "bron"
                    ],
                    "additionalProperties": false
                  }
                },
                "required": [
                  "bundel",
                  "rapport",
                  "offerte"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "org",
              "eigen",
              "soorten",
              "effectief"
            ],
            "additionalProperties": false
          },
          "is_beheerder": {
            "type": "boolean"
          }
        },
        "required": [
          "basis",
          "waarde",
          "is_beheerder"
        ],
        "additionalProperties": false
      },
      "AccountTeamrollen": {
        "type": "object",
        "properties": {
          "basis": {
            "type": "string",
            "pattern": "^[0-9]{1,18}$",
            "description": "Opaque revisie als string, ook \"0\" is geldig. Ongewijzigd terugsturen; niet zelf verhogen."
          },
          "waarde": {
            "type": "object",
            "properties": {
              "leden": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "user_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "naam": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "rol": {
                      "type": "string",
                      "enum": [
                        "beheerder",
                        "teamleider",
                        "lid"
                      ]
                    }
                  },
                  "required": [
                    "user_id",
                    "naam",
                    "rol"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "leden"
            ],
            "additionalProperties": false
          },
          "is_beheerder": {
            "type": "boolean"
          }
        },
        "required": [
          "basis",
          "waarde",
          "is_beheerder"
        ],
        "additionalProperties": false
      },
      "KlantInname": {
        "type": "object",
        "properties": {
          "basis": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "actief": {
            "type": "boolean"
          },
          "beschikbaar": {
            "type": "boolean"
          },
          "adres": {
            "anyOf": [
              {
                "type": "string",
                "format": "email"
              },
              {
                "type": "null"
              }
            ]
          },
          "aangemaakt_op": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "laatst_gebruikt_op": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "versiecontrole": {
            "const": true
          }
        },
        "required": [
          "basis",
          "actief",
          "beschikbaar",
          "adres",
          "aangemaakt_op",
          "laatst_gebruikt_op",
          "versiecontrole"
        ],
        "additionalProperties": false
      },
      "TranscriptieOpties": {
        "type": "object",
        "properties": {
          "model": {
            "type": "string",
            "enum": [
              "automatisch",
              "melia-1",
              "enhanced"
            ]
          },
          "woordenlijst": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "content": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 100,
                  "pattern": "^(?!.*[\\r\\n\\u0000])(?=.*\\S).*$"
                },
                "sounds_like": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100,
                    "pattern": "^(?!.*[\\r\\n\\u0000])(?=.*\\S).*$"
                  },
                  "maxItems": 4
                }
              },
              "required": [
                "content"
              ],
              "additionalProperties": false
            },
            "maxItems": 1000
          },
          "stemprofiel_ids": {
            "type": "array",
            "items": {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
            },
            "maxItems": 10,
            "uniqueItems": true
          },
          "stemproef_profiel_id": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [],
        "additionalProperties": false,
        "description": "Ontbrekende model/woordenlijst/stemprofielen worden automatisch/leeg. Woorden of stemprofielen/stemproef vereisen enhanced; expliciet melia-1 daarmee geeft400. Automatisch kiest enhanced bij rijke opties, anders melia-1. Stemproef en stemprofiel_ids zijn niet combineerbaar. Alleen actieve eigen/gedeelde gereed profielen; stemproef uitsluitend eigen, maximaal vier proeven en maximaal50 provideridentifiers totaal."
      },
      "TranscriptieOptiesGenormaliseerd": {
        "type": "object",
        "properties": {
          "model": {
            "type": "string",
            "enum": [
              "automatisch",
              "melia-1",
              "enhanced"
            ]
          },
          "woordenlijst": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "content": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 100,
                  "pattern": "^(?!.*[\\r\\n\\u0000])(?=.*\\S).*$"
                },
                "sounds_like": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100,
                    "pattern": "^(?!.*[\\r\\n\\u0000])(?=.*\\S).*$"
                  },
                  "maxItems": 4
                }
              },
              "required": [
                "content"
              ],
              "additionalProperties": false
            },
            "maxItems": 1000
          },
          "stemprofiel_ids": {
            "type": "array",
            "items": {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
            },
            "maxItems": 10,
            "uniqueItems": true
          },
          "stemproef_profiel_id": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "model",
          "woordenlijst",
          "stemprofiel_ids"
        ],
        "additionalProperties": false
      },
      "TranscriptieVoorkeuren": {
        "type": "object",
        "properties": {
          "model": {
            "type": "string",
            "enum": [
              "automatisch",
              "melia-1",
              "enhanced"
            ]
          },
          "woordenlijst": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "content": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 100,
                  "pattern": "^(?!.*[\\r\\n\\u0000])(?=.*\\S).*$"
                },
                "sounds_like": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100,
                    "pattern": "^(?!.*[\\r\\n\\u0000])(?=.*\\S).*$"
                  },
                  "maxItems": 4
                }
              },
              "required": [
                "content"
              ],
              "additionalProperties": false
            },
            "maxItems": 1000
          },
          "stemprofiel_ids": {
            "type": "array",
            "items": {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
            },
            "maxItems": 10,
            "uniqueItems": true
          },
          "versie": {
            "type": "integer",
            "minimum": 0
          }
        },
        "required": [
          "model",
          "woordenlijst",
          "stemprofiel_ids",
          "versie"
        ],
        "additionalProperties": false
      },
      "Stemprofiel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
          },
          "naam": {
            "type": "string",
            "maxLength": 80
          },
          "model": {
            "const": "enhanced"
          },
          "actief": {
            "type": "boolean"
          },
          "delen_team": {
            "type": "boolean"
          },
          "proeven": {
            "type": "integer",
            "minimum": 0
          },
          "bijgewerkt_op": {
            "type": "string",
            "format": "date-time"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "eigen": {
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "naam",
          "model",
          "actief",
          "delen_team",
          "proeven",
          "bijgewerkt_op",
          "created_at",
          "eigen"
        ],
        "additionalProperties": false
      },
      "CrmGegevens": {
        "type": "object",
        "properties": {
          "opvolging": {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "enum": [
                  "actief",
                  "wacht_klant",
                  "wacht_collega",
                  "afgerond"
                ]
              },
              "volgende": {
                "type": "string",
                "maxLength": 500
              },
              "deadline": {
                "type": "string",
                "maxLength": 10,
                "pattern": "^(?:\\d{4}-\\d{2}-\\d{2})?$",
                "description": "Leeg of werkelijk bestaande kalenderdatum YYYY-MM-DD."
              },
              "verantwoordelijke": {
                "oneOf": [
                  {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  {
                    "const": ""
                  }
                ]
              },
              "actiepuntId": {
                "oneOf": [
                  {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  {
                    "const": ""
                  }
                ]
              }
            },
            "required": [
              "status",
              "volgende",
              "deadline",
              "verantwoordelijke",
              "actiepuntId"
            ],
            "additionalProperties": false
          },
          "contactpersonen": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                },
                "naam": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 150,
                  "pattern": "\\S"
                },
                "rol": {
                  "type": "string",
                  "maxLength": 100
                },
                "email": {
                  "type": "string",
                  "maxLength": 254,
                  "pattern": "^(?:[^\\s@]+@[^\\s@]+\\.[^\\s@]+)?$"
                },
                "telefoon": {
                  "type": "string",
                  "maxLength": 50
                },
                "hoofdcontact": {
                  "type": "boolean"
                }
              },
              "required": [
                "id",
                "naam",
                "rol",
                "email",
                "telefoon",
                "hoofdcontact"
              ],
              "additionalProperties": false
            },
            "maxItems": 30
          },
          "notities": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                },
                "titel": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 150,
                  "pattern": "\\S"
                },
                "tekst": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 5000,
                  "pattern": "\\S"
                },
                "contactmoment": {
                  "type": "boolean"
                },
                "actor": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "datum": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "date-time"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "id",
                "titel",
                "tekst",
                "contactmoment",
                "actor",
                "datum"
              ],
              "additionalProperties": false
            },
            "maxItems": 200
          },
          "checklist": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                },
                "titel": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 150,
                  "pattern": "\\S"
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "gevraagd",
                    "ontvangen",
                    "gecontroleerd"
                  ]
                },
                "bestandId": {
                  "oneOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    {
                      "const": ""
                    }
                  ]
                }
              },
              "required": [
                "id",
                "titel",
                "status",
                "bestandId"
              ],
              "additionalProperties": false
            },
            "maxItems": 100
          },
          "pins": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                },
                "itemId": {
                  "type": "string",
                  "pattern": "^(?:bestand|versie|opname|gesprek|notitie)-[0-9a-fA-F-]{36}$"
                }
              },
              "required": [
                "id",
                "itemId"
              ],
              "additionalProperties": false
            },
            "maxItems": 30
          },
          "definitief": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                },
                "itemId": {
                  "type": "string",
                  "pattern": "^versie-[0-9a-fA-F-]{36}$"
                }
              },
              "required": [
                "id",
                "itemId"
              ],
              "additionalProperties": false
            },
            "maxItems": 100
          }
        },
        "required": [],
        "additionalProperties": false,
        "description": "Alleen reeds opgeslagen onderdelen aanwezig; nieuwe CRM kan leeg zijn. Wijzigen vervangt één onderdeel volledig."
      },
      "LinkOntvangst": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "verloopt_op": {
                "type": "string",
                "format": "date-time"
              },
              "ingetrokken_op": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "herhaald": {
                "type": "boolean"
              },
              "token": {
                "type": "string",
                "description": "Toegangdragend linktoken; niet loggen of in URL-analytics opslaan."
              },
              "url": {
                "type": "string",
                "format": "uri"
              }
            },
            "required": [
              "id",
              "verloopt_op",
              "ingetrokken_op",
              "herhaald",
              "token",
              "url"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "verloopt_op": {
                "type": "string",
                "format": "date-time"
              },
              "ingetrokken_op": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "herhaald": {
                "type": "boolean"
              },
              "status": {
                "type": "string",
                "enum": [
                  "ingetrokken",
                  "verlopen"
                ]
              }
            },
            "required": [
              "id",
              "verloopt_op",
              "ingetrokken_op",
              "herhaald",
              "status"
            ],
            "additionalProperties": false
          }
        ]
      },
      "Briefing": {
        "type": "object",
        "properties": {
          "markdown": {
            "type": "string",
            "minLength": 1
          },
          "suggestievragen": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1
            },
            "maxItems": 5
          },
          "taal": {
            "type": "string"
          },
          "gegenereerd_op": {
            "type": "string",
            "format": "date-time"
          },
          "bron": {
            "type": "string",
            "enum": [
              "nieuw",
              "cache"
            ]
          }
        },
        "required": [
          "markdown",
          "suggestievragen",
          "taal",
          "gegenereerd_op",
          "bron"
        ],
        "additionalProperties": false,
        "description": "Maximaal32000 UTF-8 bytes voor volledig opgeslagen resultaat."
      },
      "Klantverwijdering": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "klantId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "status": {
            "type": "string",
            "enum": [
              "opslag_opruimen",
              "verwijderd"
            ]
          },
          "aantallen": {
            "type": "object",
            "properties": {
              "concepten": {
                "type": "integer",
                "minimum": 0
              },
              "rapporten": {
                "type": "integer",
                "minimum": 0
              },
              "rapportversies": {
                "type": "integer",
                "minimum": 0
              },
              "gesprekken": {
                "type": "integer",
                "minimum": 0
              },
              "opnames": {
                "type": "integer",
                "minimum": 0
              },
              "brondocumenten": {
                "type": "integer",
                "minimum": 0
              },
              "reacties": {
                "type": "integer",
                "minimum": 0
              },
              "bestanden": {
                "type": "integer",
                "minimum": 0
              }
            },
            "required": [
              "concepten",
              "rapporten",
              "rapportversies",
              "gesprekken",
              "opnames",
              "brondocumenten",
              "reacties",
              "bestanden"
            ],
            "additionalProperties": false
          },
          "bestandenResterend": {
            "type": "integer",
            "minimum": 0
          }
        },
        "required": [
          "id",
          "klantId",
          "status",
          "aantallen",
          "bestandenResterend"
        ],
        "additionalProperties": false
      },
      "StijlOcrSchatting": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "basis": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "status": {
            "type": "string",
            "enum": [
              "verwerken",
              "onzeker",
              "klaar",
              "verlopen"
            ]
          },
          "credits_geschat": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "model": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "prijs_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "aangemaakt_op": {
            "type": "string",
            "format": "date-time"
          },
          "verloopt_op": {
            "type": "string",
            "format": "date-time"
          },
          "afgerond_op": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "verwerking_gestart": {
            "const": false
          }
        },
        "required": [
          "id",
          "basis",
          "status",
          "credits_geschat",
          "model",
          "prijs_id",
          "aangemaakt_op",
          "verloopt_op",
          "afgerond_op",
          "verwerking_gestart"
        ],
        "additionalProperties": false
      },
      "StijlHerstelOntvangst": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "operatie": {
            "type": "string",
            "enum": [
              "herstel",
              "ocr"
            ]
          },
          "job_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "job_status": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "type": "string"
          },
          "ocr_status": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "actieve_versie_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "basis": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "aangemaakt_op": {
            "type": "string",
            "format": "date-time"
          },
          "verwerking_gestart": {
            "const": true
          }
        },
        "required": [
          "id",
          "operatie",
          "job_id",
          "job_status",
          "status",
          "ocr_status",
          "actieve_versie_id",
          "basis",
          "aangemaakt_op",
          "verwerking_gestart"
        ],
        "additionalProperties": false
      },
      "StijlMetadata": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "naam": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "soort": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "actief": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "is_standaard": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "deling_scope": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "persoonlijk",
                  "team"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "eigenaar_user_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "actieve_versie_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "naam",
          "soort",
          "status",
          "actief",
          "is_standaard",
          "deling_scope",
          "eigenaar_user_id",
          "actieve_versie_id"
        ],
        "additionalProperties": false
      },
      "InstellingenJsonWaarde": {
        "oneOf": [
          {
            "type": "null"
          },
          {
            "type": "boolean"
          },
          {
            "type": "number"
          },
          {
            "type": "string"
          },
          {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/InstellingenJsonWaarde"
            }
          },
          {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/InstellingenJsonWaarde"
            }
          }
        ]
      },
      "KlassiekeDocumentControle": {
        "type": "object",
        "properties": {
          "sha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "document_preview": {
            "type": "object",
            "properties": {
              "sha256": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "mime": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "byte_size": {
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 0
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "preview_url": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uri"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "sha256",
              "mime",
              "byte_size",
              "preview_url"
            ],
            "additionalProperties": false
          },
          "assets": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "sha256": {
                  "type": "string",
                  "pattern": "^[a-f0-9]{64}$"
                },
                "mime": {
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": [
                        "image/png"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "breedte": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "hoogte": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "toepassingen": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "part": {
                        "type": "string"
                      },
                      "relatie_id": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "part",
                      "relatie_id"
                    ],
                    "additionalProperties": false
                  }
                },
                "preview_url": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uri"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "sha256",
                "mime",
                "breedte",
                "hoogte",
                "toepassingen",
                "preview_url"
              ],
              "additionalProperties": false
            }
          },
          "opmaak_controle": {
            "type": "object",
            "properties": {
              "schema_versie": {
                "const": 1
              },
              "aantal": {
                "type": "integer",
                "minimum": 1,
                "maximum": 100000
              },
              "categorieen": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "string",
                      "enum": [
                        "word_compatibiliteit",
                        "tekstopmaak",
                        "alineaopmaak",
                        "tabelopmaak"
                      ]
                    },
                    "aantal": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 100000
                    }
                  },
                  "required": [
                    "code",
                    "aantal"
                  ],
                  "additionalProperties": false
                },
                "minItems": 1,
                "maxItems": 4
              },
              "inhoud_behouden": {
                "const": true
              },
              "paginageometrie_behouden": {
                "const": true
              }
            },
            "required": [
              "schema_versie",
              "aantal",
              "categorieen",
              "inhoud_behouden",
              "paginageometrie_behouden"
            ],
            "additionalProperties": false
          },
          "lettertype_controle": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "schema_versie": {
                    "const": 1
                  },
                  "word_bronfonts_behouden": {
                    "const": true
                  },
                  "bron_lettertypen": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 100
                    },
                    "maxItems": 100,
                    "uniqueItems": true
                  },
                  "pdf_vervangingen": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "van": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 100
                        },
                        "naar": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 100
                        }
                      },
                      "required": [
                        "van",
                        "naar"
                      ],
                      "additionalProperties": false
                    },
                    "maxItems": 100
                  },
                  "ingesloten_fonts": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "naam": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 100
                        },
                        "variant": {
                          "type": "string",
                          "enum": [
                            "regular",
                            "bold",
                            "italic",
                            "bolditalic"
                          ]
                        },
                        "behouden": {
                          "type": "boolean"
                        },
                        "subsetted": {
                          "type": "boolean"
                        },
                        "reden": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "gedeeltelijk_ingesloten",
                                "insluitrechten_onbekend",
                                "insluiting_bewerken_niet_toegestaan"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "naam",
                        "variant",
                        "behouden",
                        "subsetted",
                        "reden"
                      ],
                      "additionalProperties": false
                    },
                    "maxItems": 200
                  },
                  "pdf_bronfontbeleid": {
                    "const": "beproefde_bronfonts_v1"
                  },
                  "pdf_bronfonts": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 100
                    },
                    "maxItems": 100,
                    "uniqueItems": true
                  }
                },
                "required": [
                  "schema_versie",
                  "word_bronfonts_behouden",
                  "bron_lettertypen",
                  "pdf_vervangingen",
                  "ingesloten_fonts"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "vaste_brontekst": {
            "type": "object",
            "properties": {
              "schema_versie": {
                "const": 1
              },
              "kandidaten": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "sha256": {
                      "type": "string",
                      "pattern": "^[a-f0-9]{64}$"
                    },
                    "tekst": {
                      "type": "string",
                      "minLength": 2,
                      "maxLength": 160
                    },
                    "rol": {
                      "type": "string",
                      "enum": [
                        "koptekst",
                        "voettekst"
                      ]
                    },
                    "paginas": {
                      "type": "array",
                      "items": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 500
                      },
                      "minItems": 2,
                      "maxItems": 500
                    }
                  },
                  "required": [
                    "sha256",
                    "tekst",
                    "rol",
                    "paginas"
                  ],
                  "additionalProperties": false
                },
                "maxItems": 32
              },
              "gekozen_sha256": {
                "type": "array",
                "items": {
                  "type": "string",
                  "pattern": "^[a-f0-9]{64}$"
                },
                "maxItems": 32,
                "uniqueItems": true
              }
            },
            "required": [
              "schema_versie",
              "kandidaten",
              "gekozen_sha256"
            ],
            "additionalProperties": false
          },
          "bronstijl_controle": {
            "type": "object",
            "properties": {
              "verplicht": {
                "const": true
              },
              "bron_type": {
                "const": "pdf"
              },
              "pagina_aantal": {
                "type": "integer",
                "minimum": 0
              },
              "paginaformaten": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "scan_pagina_aantal": {
                "type": "integer",
                "minimum": 0
              }
            },
            "required": [
              "verplicht",
              "bron_type",
              "pagina_aantal",
              "paginaformaten",
              "scan_pagina_aantal"
            ],
            "additionalProperties": false
          },
          "presentatie_controle": {
            "type": "object",
            "properties": {
              "verplicht": {
                "const": false
              },
              "fidelity_niveau": {
                "type": "string",
                "enum": [
                  "native_high",
                  "native_geconverteerd",
                  "visueel_afgeleid"
                ]
              },
              "goedkeuring": {
                "type": "string",
                "enum": [
                  "automatisch",
                  "menselijk"
                ]
              },
              "getrouwheid_score": {
                "anyOf": [
                  {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 1
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "getrouwheid_methode": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "dia_vergelijking_gemaskeerd",
                      "geen_dia_bron",
                      "synthetisch"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "diaformaat": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "aantal_layouts": {
                "type": "integer",
                "minimum": 0
              },
              "aangevulde_rollen": {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "titel",
                    "sectie",
                    "titel_inhoud",
                    "twee_inhoud",
                    "vergelijking",
                    "beeld_tekst",
                    "alleen_titel",
                    "leeg"
                  ]
                }
              },
              "layouts_afgeleid": {
                "type": "boolean"
              },
              "weggelaten_assets": {
                "type": "integer",
                "minimum": 0
              },
              "herstelpogingen": {
                "type": "integer",
                "minimum": 0
              },
              "beperkingen": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 400
                },
                "maxItems": 100
              },
              "status": {
                "type": "string",
                "enum": [
                  "bruikbaar",
                  "direct_bruikbaar"
                ]
              },
              "advies": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "upload_origineel_pptx",
                      "controleer_previews"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "verplicht",
              "fidelity_niveau",
              "goedkeuring",
              "getrouwheid_score",
              "getrouwheid_methode",
              "diaformaat",
              "aantal_layouts",
              "aangevulde_rollen",
              "layouts_afgeleid",
              "weggelaten_assets",
              "herstelpogingen",
              "beperkingen",
              "status",
              "advies"
            ],
            "additionalProperties": false
          },
          "formulier_controle": {
            "type": "object",
            "properties": {
              "verplicht": {
                "const": true
              },
              "veld_aantal": {
                "type": "integer",
                "minimum": 0
              },
              "aanpassingen": {
                "type": "array",
                "items": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^(?:verbetering|invulplek|terugval|keuze):(?:document|header\\d*|footer\\d*|footnotes|endnotes):p\\d{4}(?::\\d{1,6})?$"
                        },
                        "soort": {
                          "const": "keuze"
                        },
                        "toegepast": {
                          "type": "boolean"
                        },
                        "vorm": {
                          "type": "string",
                          "enum": [
                            "vak",
                            "ja_nee"
                          ]
                        },
                        "tekst": {
                          "type": "string",
                          "maxLength": 160
                        }
                      },
                      "required": [
                        "id",
                        "soort",
                        "toegepast",
                        "vorm",
                        "tekst"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^(?:verbetering|invulplek|terugval|keuze):(?:document|header\\d*|footer\\d*|footnotes|endnotes):p\\d{4}(?::\\d{1,6})?$"
                        },
                        "soort": {
                          "const": "verbetering"
                        },
                        "toegepast": {
                          "type": "boolean"
                        },
                        "verschil": {
                          "type": "object",
                          "properties": {
                            "voor": {
                              "type": "string",
                              "maxLength": 41
                            },
                            "origineel": {
                              "type": "string",
                              "maxLength": 400
                            },
                            "nieuw": {
                              "type": "string",
                              "maxLength": 400
                            },
                            "na": {
                              "type": "string",
                              "maxLength": 41
                            }
                          },
                          "required": [
                            "voor",
                            "origineel",
                            "nieuw",
                            "na"
                          ],
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "id",
                        "soort",
                        "toegepast",
                        "verschil"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^(?:verbetering|invulplek|terugval|keuze):(?:document|header\\d*|footer\\d*|footnotes|endnotes):p\\d{4}(?::\\d{1,6})?$"
                        },
                        "soort": {
                          "const": "invulplek"
                        },
                        "toegepast": {
                          "type": "boolean"
                        },
                        "naam": {
                          "type": "string",
                          "maxLength": 160
                        },
                        "vraag": {
                          "type": "string",
                          "maxLength": 160
                        }
                      },
                      "required": [
                        "id",
                        "soort",
                        "toegepast",
                        "naam",
                        "vraag"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^(?:verbetering|invulplek|terugval|keuze):(?:document|header\\d*|footer\\d*|footnotes|endnotes):p\\d{4}(?::\\d{1,6})?$"
                        },
                        "soort": {
                          "const": "terugval"
                        },
                        "toegepast": {
                          "type": "boolean"
                        },
                        "tekst": {
                          "type": "string",
                          "maxLength": 161
                        }
                      },
                      "required": [
                        "id",
                        "soort",
                        "toegepast",
                        "tekst"
                      ],
                      "additionalProperties": false
                    }
                  ]
                },
                "maxItems": 500
              },
              "veldmarkering": {
                "const": true
              }
            },
            "required": [
              "verplicht",
              "veld_aantal",
              "aanpassingen"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "sha256",
          "document_preview",
          "assets"
        ],
        "additionalProperties": false
      },
      "KlassiekePresentatieInzage": {
        "type": "object",
        "properties": {
          "sha256": {
            "type": "null"
          },
          "correcties_mogelijk": {
            "const": true
          },
          "profielversie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "profielversie_nummer": {
            "type": "integer",
            "minimum": 0
          },
          "document_preview": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "sha256": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  },
                  "mime": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "byte_size": {
                    "anyOf": [
                      {
                        "type": "integer",
                        "minimum": 0
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "preview_url": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uri"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": [
                  "sha256",
                  "mime",
                  "byte_size",
                  "preview_url"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "dia_previews": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "nr": {
                  "type": "integer",
                  "minimum": 0
                },
                "layout_id": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[a-f0-9]{64}$"
                },
                "preview_url": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uri"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "breedte": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "hoogte": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "nr",
                "layout_id",
                "sha256",
                "preview_url",
                "breedte",
                "hoogte"
              ],
              "additionalProperties": false
            }
          },
          "assets": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "sha256": {
                  "type": "string",
                  "pattern": "^[a-f0-9]{64}$"
                },
                "mime": {
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": [
                        "image/png"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "breedte": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 30000
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "hoogte": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 30000
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "rol": {
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": [
                        "logo",
                        "decoratie",
                        "achtergrond"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "locatie": {
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": [
                        "master",
                        "layout"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "classificatie": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "bron": {
                          "type": "string",
                          "enum": [
                            "regels",
                            "vision",
                            "menselijk"
                          ]
                        },
                        "label": {
                          "type": "string",
                          "enum": [
                            "logo",
                            "decoratie",
                            "achtergrond"
                          ]
                        },
                        "zekerheid": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 1
                        }
                      },
                      "required": [
                        "bron",
                        "label",
                        "zekerheid"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "opgenomen": {
                  "type": "boolean"
                },
                "weggelaten_reden": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "sha256",
                "mime",
                "breedte",
                "hoogte",
                "rol",
                "locatie",
                "classificatie",
                "opgenomen",
                "weggelaten_reden"
              ],
              "additionalProperties": false
            }
          },
          "presentatie": {
            "type": "object",
            "properties": {
              "fidelity_niveau": {
                "type": "string",
                "enum": [
                  "native_high",
                  "native_geconverteerd",
                  "visueel_afgeleid"
                ]
              },
              "goedkeuring": {
                "type": "string",
                "enum": [
                  "automatisch",
                  "menselijk"
                ]
              },
              "getrouwheid_score": {
                "anyOf": [
                  {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 1
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "getrouwheid_methode": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "dia_vergelijking_gemaskeerd",
                      "geen_dia_bron",
                      "synthetisch"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "diaformaat": {
                "type": "object",
                "properties": {
                  "cx": {
                    "type": "integer",
                    "minimum": 914400,
                    "maximum": 91440000
                  },
                  "cy": {
                    "type": "integer",
                    "minimum": 914400,
                    "maximum": 91440000
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "screen16x9",
                      "screen4x3",
                      "screen16x10",
                      "custom",
                      "A4",
                      "letter",
                      "ledger",
                      "A3",
                      "B4ISO",
                      "B5ISO",
                      "B4JIS",
                      "B5JIS",
                      "hagakiCard",
                      "overhead",
                      "35mm",
                      "banner"
                    ]
                  },
                  "verhouding": {
                    "type": "string",
                    "pattern": "^\\d+:\\d+$"
                  }
                },
                "required": [
                  "cx",
                  "cy",
                  "type",
                  "verhouding"
                ],
                "additionalProperties": false
              },
              "aantal_layouts": {
                "type": "integer",
                "minimum": 0
              },
              "aangevulde_rollen": {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "titel",
                    "sectie",
                    "titel_inhoud",
                    "twee_inhoud",
                    "vergelijking",
                    "beeld_tekst",
                    "alleen_titel",
                    "leeg"
                  ]
                }
              },
              "layouts_afgeleid": {
                "type": "boolean"
              },
              "weggelaten_assets": {
                "type": "integer",
                "minimum": 0
              },
              "herstelpogingen": {
                "type": "integer",
                "minimum": 0
              },
              "beperkingen": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 400
                },
                "maxItems": 100
              },
              "status": {
                "type": "string",
                "enum": [
                  "bruikbaar",
                  "direct_bruikbaar"
                ]
              },
              "advies": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "upload_origineel_pptx",
                      "controleer_previews"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "masters": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "pattern": "^M\\d{3}$"
                    },
                    "theme": {
                      "type": "string",
                      "pattern": "^T\\d{3}$"
                    },
                    "layouts": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "pattern": "^L\\d{3}$"
                      },
                      "minItems": 1
                    }
                  },
                  "required": [
                    "id",
                    "theme",
                    "layouts"
                  ],
                  "additionalProperties": false
                },
                "minItems": 1,
                "maxItems": 8
              },
              "layouts": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "pattern": "^L\\d{3}$"
                    },
                    "rol": {
                      "type": "string",
                      "enum": [
                        "titel",
                        "sectie",
                        "titel_inhoud",
                        "twee_inhoud",
                        "vergelijking",
                        "beeld_tekst",
                        "alleen_titel",
                        "leeg",
                        "afgeleid",
                        "overig"
                      ]
                    },
                    "type": {
                      "type": "string",
                      "maxLength": 40
                    },
                    "master": {
                      "type": "string",
                      "pattern": "^M\\d{3}$"
                    },
                    "afgeleid": {
                      "type": "boolean"
                    },
                    "aangevuld": {
                      "type": "boolean"
                    },
                    "bron_cluster_grootte": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 10000
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "placeholders": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "type": {
                            "type": "string",
                            "enum": [
                              "title",
                              "ctrTitle",
                              "subTitle",
                              "body",
                              "obj",
                              "pic",
                              "tbl",
                              "chart",
                              "ftr",
                              "dt",
                              "sldNum",
                              "sldImg",
                              "hdr",
                              "clipArt",
                              "dgm",
                              "media"
                            ]
                          },
                          "idx": {
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 4294967295
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "tekstcapaciteit": {
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "max_tekens": {
                                    "type": "integer",
                                    "minimum": 1,
                                    "maximum": 20000
                                  },
                                  "max_regels": {
                                    "type": "integer",
                                    "minimum": 1,
                                    "maximum": 200
                                  },
                                  "lijstniveaus": {
                                    "type": "array",
                                    "items": {
                                      "type": "integer",
                                      "minimum": 0,
                                      "maximum": 8
                                    },
                                    "maxItems": 9,
                                    "uniqueItems": true
                                  },
                                  "font_grootte_pt": {
                                    "type": "integer",
                                    "minimum": 4,
                                    "maximum": 200
                                  }
                                },
                                "required": [
                                  "max_tekens",
                                  "max_regels",
                                  "lijstniveaus",
                                  "font_grootte_pt"
                                ],
                                "additionalProperties": false
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": [
                          "type",
                          "idx",
                          "tekstcapaciteit"
                        ],
                        "additionalProperties": false
                      },
                      "maxItems": 64
                    },
                    "preview_url": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uri"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "id",
                    "rol",
                    "type",
                    "master",
                    "afgeleid",
                    "aangevuld",
                    "bron_cluster_grootte",
                    "placeholders",
                    "preview_url"
                  ],
                  "additionalProperties": false
                },
                "minItems": 1,
                "maxItems": 128
              },
              "getrouwheid": {
                "type": "object",
                "properties": {
                  "score": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 1
                  },
                  "methode": {
                    "type": "string",
                    "enum": [
                      "dia_vergelijking_gemaskeerd",
                      "geen_dia_bron",
                      "synthetisch"
                    ]
                  },
                  "gemeten_op": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "per_layout": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "layout_id": {
                          "type": "string",
                          "pattern": "^L\\d{3}$"
                        },
                        "score": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 1
                        },
                        "bron_dias": {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 10000
                        }
                      },
                      "required": [
                        "layout_id",
                        "score",
                        "bron_dias"
                      ],
                      "additionalProperties": false
                    },
                    "maxItems": 128
                  }
                },
                "required": [
                  "score",
                  "methode",
                  "gemeten_op",
                  "per_layout"
                ],
                "additionalProperties": false
              },
              "verwijderd": {
                "type": "object",
                "properties": {
                  "dias": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 1000000
                  },
                  "notities": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 1000000
                  },
                  "opmerkingen": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 1000000
                  },
                  "media": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 1000000
                  },
                  "grafieken": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 1000000
                  },
                  "smartart": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 1000000
                  },
                  "ole": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 1000000
                  },
                  "ingesloten_fonts": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 1000000
                  },
                  "custom_shows": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 1000000
                  },
                  "secties": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 1000000
                  },
                  "beelden_op_dias": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 1000000
                  },
                  "macros": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "dias",
                  "notities",
                  "opmerkingen",
                  "media",
                  "grafieken",
                  "smartart",
                  "ole",
                  "ingesloten_fonts",
                  "custom_shows",
                  "secties",
                  "beelden_op_dias",
                  "macros"
                ],
                "additionalProperties": false
              },
              "lettertypen": {
                "type": "object",
                "properties": {
                  "vereist": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 100
                    },
                    "maxItems": 200
                  },
                  "vervangingen": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "van": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 100
                        },
                        "naar": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 100
                        }
                      },
                      "required": [
                        "van",
                        "naar"
                      ],
                      "additionalProperties": false
                    },
                    "maxItems": 100
                  },
                  "converter_beschikbaar": {
                    "type": "array",
                    "items": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  }
                },
                "required": [
                  "vereist",
                  "vervangingen",
                  "converter_beschikbaar"
                ],
                "additionalProperties": false
              },
              "slots": {
                "type": "object",
                "properties": {
                  "voettekst": {
                    "type": "boolean"
                  },
                  "datum": {
                    "type": "boolean"
                  },
                  "dianummer": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "voettekst",
                  "datum",
                  "dianummer"
                ],
                "additionalProperties": false
              },
              "notitiemaster": {
                "type": "boolean"
              },
              "tabelstijl": {
                "type": "boolean"
              },
              "grafiek": {
                "type": "object",
                "properties": {
                  "toegestaan": {
                    "type": "boolean"
                  },
                  "kleuren": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "pattern": "^[0-9A-F]{6}$"
                    },
                    "minItems": 1,
                    "maxItems": 12
                  }
                },
                "required": [
                  "toegestaan",
                  "kleuren"
                ],
                "additionalProperties": false
              },
              "bron": {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "enum": [
                      "pptx",
                      "potx",
                      "ppsx",
                      "ppt_legacy",
                      "odp",
                      "pdf",
                      "afbeelding",
                      "docx_stijlgids"
                    ]
                  },
                  "route": {
                    "type": "string",
                    "enum": [
                      "native",
                      "geconverteerd",
                      "visueel_afgeleid"
                    ]
                  },
                  "geconverteerd": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "type",
                  "route",
                  "geconverteerd"
                ],
                "additionalProperties": false
              },
              "poorten": {
                "type": "object",
                "properties": {
                  "pptx_structuur_geldig": {
                    "const": true
                  },
                  "dia_inhoud_verwijderd": {
                    "const": true
                  },
                  "bron_tekst_verwijderd": {
                    "const": true
                  },
                  "actieve_inhoud_afwezig": {
                    "const": true
                  },
                  "externe_relaties_afwezig": {
                    "const": true
                  },
                  "media_verwijderd": {
                    "const": true
                  },
                  "diageometrie_bevroren": {
                    "const": true
                  },
                  "layoutcapaciteiten_bevroren": {
                    "const": true
                  },
                  "layoutdekking_compleet": {
                    "const": true
                  },
                  "slots_deterministisch": {
                    "const": true
                  },
                  "assets_gehasht": {
                    "const": true
                  },
                  "merkassets_geclassificeerd": {
                    "const": true
                  },
                  "tekstpassing_bewezen": {
                    "const": true
                  },
                  "getrouwheid_gemeten": {
                    "const": true
                  },
                  "converter_lettertypen_beschikbaar": {
                    "const": true
                  },
                  "themavarianten_exact": {
                    "const": true
                  }
                },
                "required": [
                  "pptx_structuur_geldig",
                  "dia_inhoud_verwijderd",
                  "bron_tekst_verwijderd",
                  "actieve_inhoud_afwezig",
                  "externe_relaties_afwezig",
                  "media_verwijderd",
                  "diageometrie_bevroren",
                  "layoutcapaciteiten_bevroren",
                  "layoutdekking_compleet",
                  "slots_deterministisch",
                  "assets_gehasht",
                  "merkassets_geclassificeerd",
                  "tekstpassing_bewezen",
                  "getrouwheid_gemeten",
                  "converter_lettertypen_beschikbaar",
                  "themavarianten_exact"
                ],
                "additionalProperties": false
              },
              "herkend": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 400
                },
                "maxItems": 100
              },
              "template_sha256": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              }
            },
            "required": [
              "fidelity_niveau",
              "goedkeuring",
              "getrouwheid_score",
              "getrouwheid_methode",
              "diaformaat",
              "aantal_layouts",
              "aangevulde_rollen",
              "layouts_afgeleid",
              "weggelaten_assets",
              "herstelpogingen",
              "beperkingen",
              "status",
              "advies",
              "masters",
              "layouts",
              "getrouwheid",
              "verwijderd",
              "lettertypen",
              "slots",
              "notitiemaster",
              "tabelstijl",
              "grafiek",
              "bron",
              "poorten",
              "herkend",
              "template_sha256"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "sha256",
          "correcties_mogelijk",
          "profielversie_id",
          "profielversie_nummer",
          "document_preview",
          "dia_previews",
          "assets",
          "presentatie"
        ],
        "additionalProperties": false
      },
      "OrganisatieInname": {
        "type": "object",
        "properties": {
          "basis": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "actief": {
            "type": "boolean"
          },
          "allowlist": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "pakket": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "beschikbaar": {
            "type": "boolean"
          },
          "is_beheerder": {
            "type": "boolean"
          },
          "versiecontrole": {
            "const": true
          }
        },
        "required": [
          "basis",
          "actief",
          "allowlist",
          "pakket",
          "beschikbaar",
          "is_beheerder",
          "versiecontrole"
        ],
        "additionalProperties": false
      },
      "StijlmakerOntvangst": {
        "type": "object",
        "properties": {
          "aanvraagId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "bewerking": {
            "type": "string",
            "enum": [
              "voorstellen",
              "voorbeeld"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "uploaden",
              "ontvangen",
              "bezig",
              "klaar",
              "mislukt",
              "verlopen"
            ]
          },
          "code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "aanvraagId",
          "bewerking",
          "status",
          "code"
        ],
        "additionalProperties": false
      },
      "StijlmakerOntwerpInvoer": {
        "type": "object",
        "properties": {
          "versie": {
            "$ref": "#/components/schemas/InstellingenJsonWaarde"
          },
          "bedrijfsnaam": {
            "type": "string",
            "pattern": "^[^\\x00-\\x1f]+$",
            "description": "Na trimmen1–100tekens; ruwe invoer kan omringende spaties bevatten en wordt zo als resultaatmetadata bewaard."
          },
          "layout": {
            "type": "string",
            "enum": [
              "rustig",
              "kader",
              "contrast"
            ]
          },
          "fontset": {
            "type": "string",
            "enum": [
              "modern",
              "persoonlijk",
              "zakelijk"
            ]
          },
          "primair": {
            "type": "string",
            "pattern": "^[A-Fa-f0-9]{6}$"
          },
          "accent": {
            "type": "string",
            "pattern": "^[A-Fa-f0-9]{6}$"
          },
          "logoDataUri": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^data:image/png;base64,[A-Za-z0-9+/=]+$",
                "description": "Optioneel PNG-dataURI. Base64gedeelte maximaal5MiB×1,4tekens; gedecodeerde invoer maximaal5MiB en echte rasterdecode vereist. Worker normaliseert het beeld."
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "bedrijfsnaam",
          "layout",
          "fontset",
          "primair",
          "accent"
        ],
        "additionalProperties": {
          "$ref": "#/components/schemas/InstellingenJsonWaarde"
        },
        "description": "Canoniek ontwerp. Kleuren zijn zes hextekens zonder #; renderer maakt lichte kleuren donkerder. Bedrijfsnaam wordt getrimd. versie en logoDataUri zijn optioneel bij invoer. Aanvullende JSONvelden worden door de renderer genegeerd maar in het asynchrone resultaat teruggekaatst; houd daar geen persoonsgegevens/geheimen in."
      },
      "StijlmakerVoorstellenResultaat": {
        "type": "object",
        "properties": {
          "bevindingen": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "website_kleuren",
                "website_deels",
                "screenshot_kleuren",
                "logo_kleuren",
                "ontwerpvoorstel",
                "lettertypen_voorstel"
              ]
            }
          },
          "voorstellen": {
            "type": "array",
            "prefixItems": [
              {
                "type": "object",
                "properties": {
                  "versie": {
                    "const": 1
                  },
                  "bedrijfsnaam": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100
                  },
                  "layout": {
                    "const": "rustig"
                  },
                  "fontset": {
                    "const": "zakelijk"
                  },
                  "primair": {
                    "type": "string",
                    "pattern": "^[A-Fa-f0-9]{6}$"
                  },
                  "accent": {
                    "type": "string",
                    "pattern": "^[A-Fa-f0-9]{6}$"
                  },
                  "logoDataUri": {
                    "anyOf": [
                      {
                        "type": "string",
                        "pattern": "^data:image/png;base64,[A-Za-z0-9+/=]+$",
                        "description": "Optioneel PNG-dataURI. Base64gedeelte maximaal5MiB×1,4tekens; gedecodeerde invoer maximaal5MiB en echte rasterdecode vereist. Worker normaliseert het beeld."
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "id": {
                    "const": "rustig"
                  }
                },
                "required": [
                  "versie",
                  "bedrijfsnaam",
                  "layout",
                  "fontset",
                  "primair",
                  "accent",
                  "logoDataUri",
                  "id"
                ],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "versie": {
                    "const": 1
                  },
                  "bedrijfsnaam": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100
                  },
                  "layout": {
                    "const": "kader"
                  },
                  "fontset": {
                    "const": "persoonlijk"
                  },
                  "primair": {
                    "type": "string",
                    "pattern": "^[A-Fa-f0-9]{6}$"
                  },
                  "accent": {
                    "type": "string",
                    "pattern": "^[A-Fa-f0-9]{6}$"
                  },
                  "logoDataUri": {
                    "anyOf": [
                      {
                        "type": "string",
                        "pattern": "^data:image/png;base64,[A-Za-z0-9+/=]+$",
                        "description": "Optioneel PNG-dataURI. Base64gedeelte maximaal5MiB×1,4tekens; gedecodeerde invoer maximaal5MiB en echte rasterdecode vereist. Worker normaliseert het beeld."
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "id": {
                    "const": "persoonlijk"
                  }
                },
                "required": [
                  "versie",
                  "bedrijfsnaam",
                  "layout",
                  "fontset",
                  "primair",
                  "accent",
                  "logoDataUri",
                  "id"
                ],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "versie": {
                    "const": 1
                  },
                  "bedrijfsnaam": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100
                  },
                  "layout": {
                    "const": "contrast"
                  },
                  "fontset": {
                    "const": "modern"
                  },
                  "primair": {
                    "type": "string",
                    "pattern": "^[A-Fa-f0-9]{6}$"
                  },
                  "accent": {
                    "type": "string",
                    "pattern": "^[A-Fa-f0-9]{6}$"
                  },
                  "logoDataUri": {
                    "anyOf": [
                      {
                        "type": "string",
                        "pattern": "^data:image/png;base64,[A-Za-z0-9+/=]+$",
                        "description": "Optioneel PNG-dataURI. Base64gedeelte maximaal5MiB×1,4tekens; gedecodeerde invoer maximaal5MiB en echte rasterdecode vereist. Worker normaliseert het beeld."
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "id": {
                    "const": "uitgesproken"
                  }
                },
                "required": [
                  "versie",
                  "bedrijfsnaam",
                  "layout",
                  "fontset",
                  "primair",
                  "accent",
                  "logoDataUri",
                  "id"
                ],
                "additionalProperties": false
              }
            ],
            "minItems": 3,
            "maxItems": 3,
            "items": false
          }
        },
        "required": [
          "bevindingen",
          "voorstellen"
        ],
        "additionalProperties": false
      },
      "StijlmakerVoorbeeldResultaat": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "bestand": {
                "type": "string",
                "contentEncoding": "base64",
                "description": "Downloadbare bytes in base64, geen URL; antwoordJSON maximaal24MiB."
              },
              "naam": {
                "type": "string"
              },
              "soort": {
                "type": "string",
                "enum": [
                  "rapport",
                  "offerte",
                  "email",
                  "gespreksverslag",
                  "formulier",
                  "anders"
                ]
              },
              "uitvoer": {
                "const": "document"
              },
              "ontwerp": {
                "$ref": "#/components/schemas/StijlmakerOntwerpInvoer"
              },
              "ext": {
                "const": "docx"
              },
              "mime": {
                "const": "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
              }
            },
            "required": [
              "bestand",
              "naam",
              "soort",
              "uitvoer",
              "ontwerp",
              "ext",
              "mime"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "bestand": {
                "type": "string",
                "contentEncoding": "base64",
                "description": "Downloadbare bytes in base64, geen URL; antwoordJSON maximaal24MiB."
              },
              "naam": {
                "type": "string"
              },
              "soort": {
                "type": "string",
                "enum": [
                  "presentatie"
                ]
              },
              "uitvoer": {
                "const": "document"
              },
              "ontwerp": {
                "$ref": "#/components/schemas/StijlmakerOntwerpInvoer"
              },
              "ext": {
                "const": "pptx"
              },
              "mime": {
                "const": "application/vnd.openxmlformats-officedocument.presentationml.presentation"
              }
            },
            "required": [
              "bestand",
              "naam",
              "soort",
              "uitvoer",
              "ontwerp",
              "ext",
              "mime"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "bestand": {
                "type": "string",
                "contentEncoding": "base64",
                "description": "Downloadbare bytes in base64, geen URL; antwoordJSON maximaal24MiB."
              },
              "naam": {
                "type": "string"
              },
              "soort": {
                "type": "string",
                "enum": [
                  "excel"
                ]
              },
              "uitvoer": {
                "const": "document"
              },
              "ontwerp": {
                "$ref": "#/components/schemas/StijlmakerOntwerpInvoer"
              },
              "ext": {
                "const": "xlsx"
              },
              "mime": {
                "const": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
              }
            },
            "required": [
              "bestand",
              "naam",
              "soort",
              "uitvoer",
              "ontwerp",
              "ext",
              "mime"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "bestand": {
                "type": "string",
                "contentEncoding": "base64",
                "description": "Downloadbare bytes in base64, geen URL; antwoordJSON maximaal24MiB."
              },
              "naam": {
                "type": "string"
              },
              "soort": {
                "type": "string",
                "enum": [
                  "rapport",
                  "offerte",
                  "email",
                  "gespreksverslag"
                ]
              },
              "uitvoer": {
                "const": "huisstijl"
              },
              "ontwerp": {
                "$ref": "#/components/schemas/StijlmakerOntwerpInvoer"
              },
              "ext": {
                "const": "png"
              },
              "mime": {
                "const": "image/png"
              }
            },
            "required": [
              "bestand",
              "naam",
              "soort",
              "uitvoer",
              "ontwerp",
              "ext",
              "mime"
            ],
            "additionalProperties": false
          }
        ],
        "description": "ontwerp en naam bewaren de originele invoer, dus kunnen afwijken van getrimde bedrijfsnaam, genormaliseerd logo en donkerder kleuren in de gegenereerde bytes. Geen stijlprofielpublicatie."
      },
      "Bronprofiel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "naam": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120
          },
          "omschrijving": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 1000
              },
              {
                "type": "null"
              }
            ]
          },
          "instructie_tekst": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 30000
              },
              {
                "type": "null"
              }
            ]
          },
          "instructie_bestandsnaam": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "voorbeeld_bestandsnaam": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "velden": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "sleutel": {
                  "type": "string",
                  "maxLength": 80
                },
                "naam": {
                  "type": "string",
                  "maxLength": 120
                },
                "vraag": {
                  "type": "string",
                  "maxLength": 500
                },
                "waarom": {
                  "type": "string",
                  "maxLength": 500
                },
                "doel": {
                  "type": "string",
                  "maxLength": 300
                },
                "verplicht": {
                  "type": "boolean"
                }
              },
              "required": [
                "sleutel",
                "naam",
                "vraag",
                "waarom",
                "doel",
                "verplicht"
              ],
              "additionalProperties": false
            },
            "maxItems": 30
          },
          "versie": {
            "type": "integer",
            "minimum": 1
          },
          "status": {
            "type": "string",
            "enum": [
              "bezig",
              "klaar",
              "mislukt"
            ]
          },
          "foutcode": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "aangemaakt_op": {
            "type": "string",
            "format": "date-time"
          },
          "bijgewerkt_op": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "id",
          "naam",
          "omschrijving",
          "instructie_tekst",
          "instructie_bestandsnaam",
          "voorbeeld_bestandsnaam",
          "velden",
          "versie",
          "status",
          "foutcode",
          "aangemaakt_op",
          "bijgewerkt_op"
        ],
        "additionalProperties": false
      },
      "BronprofielStart": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "naam": {
                "type": "string"
              },
              "status": {
                "type": "string",
                "enum": [
                  "bezig",
                  "klaar",
                  "mislukt"
                ]
              },
              "versie": {
                "type": "integer",
                "minimum": 1
              },
              "herhaald": {
                "const": true
              }
            },
            "required": [
              "id",
              "naam",
              "status",
              "versie",
              "herhaald"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "naam": {
                "type": "string"
              },
              "status": {
                "const": "klaar"
              },
              "versie": {
                "type": "integer",
                "minimum": 1
              },
              "herhaald": {
                "const": false
              }
            },
            "required": [
              "id",
              "naam",
              "status",
              "versie",
              "herhaald"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "naam": {
                "type": "string"
              },
              "status": {
                "const": "bezig"
              },
              "herhaald": {
                "const": false
              }
            },
            "required": [
              "id",
              "naam",
              "status",
              "herhaald"
            ],
            "additionalProperties": false
          }
        ]
      },
      "StijlenV2Regel": {
        "type": "object",
        "properties": {
          "sleutel": {
            "type": "string",
            "enum": [
              "doelgroep",
              "toon",
              "taalniveau",
              "aanspreekvorm",
              "opbouw",
              "terminologie",
              "bedragen",
              "brongebruik",
              "alternatieven",
              "risicos",
              "afsluiting"
            ]
          },
          "waarde": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500,
            "pattern": "\\S"
          }
        },
        "required": [
          "sleutel",
          "waarde"
        ],
        "additionalProperties": false
      },
      "StijlenV2Antwoorden": {
        "type": "object",
        "properties": {
          "doelgroep": {
            "type": "string",
            "enum": [
              "klanten",
              "collegas",
              "management"
            ]
          },
          "toon": {
            "type": "string",
            "enum": [
              "persoonlijk",
              "zakelijk",
              "deskundig_begrijpelijk",
              "kort_direct"
            ]
          },
          "uitleg": {
            "type": "string",
            "enum": [
              "kort",
              "gemiddeld",
              "uitgebreid"
            ]
          },
          "vaktermen": {
            "type": "string",
            "enum": [
              "vermijden",
              "uitleggen",
              "bekend"
            ]
          },
          "opbouw": {
            "type": "string",
            "enum": [
              "duidelijke_koppen",
              "verhalend",
              "samenvatting_eerst"
            ]
          },
          "aanspreekvorm": {
            "type": "string",
            "enum": [
              "je",
              "u"
            ]
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "StijlenV2Analyse": {
        "type": "object",
        "properties": {
          "bron": {
            "type": "string",
            "enum": [
              "begeleid",
              "voorbeeld"
            ]
          },
          "voorbeeld_categorie": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "herkend": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "onderdeel": {
                  "type": "string"
                },
                "waarde": {
                  "type": "string"
                }
              },
              "required": [
                "onderdeel",
                "waarde"
              ],
              "additionalProperties": false
            }
          },
          "onzeker": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "onderdeel": {
                  "type": "string"
                },
                "vraag": {
                  "type": "string"
                }
              },
              "required": [
                "onderdeel",
                "vraag"
              ],
              "additionalProperties": false
            }
          },
          "niet_herkend": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [],
        "additionalProperties": false,
        "description": "Opgeslagen/getypeerde analyse. Automatisch samengestelde legacyanalyse heeft niet de 30-items/64-tekenslimiet van handmatige invoer; historische lege analyseobjecten zijn mogelijk."
      },
      "StijlenV2Stijl": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "naam": {
            "type": "string"
          },
          "laag": {
            "type": "string",
            "enum": [
              "persoonlijk",
              "organisatie",
              "document"
            ]
          },
          "document_type": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "rapport",
                  "offerte",
                  "email",
                  "gespreksverslag",
                  "brief",
                  "presentatie"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "actief",
              "bezig"
            ]
          },
          "actief": {
            "type": "boolean"
          },
          "bron": {
            "type": "string",
            "enum": [
              "begeleid",
              "voorbeeld"
            ]
          },
          "bron_stijlprofiel_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "voorbeeld_categorie": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "actieve_versie_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "versie_nummer": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "regels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StijlenV2Regel"
            },
            "maxItems": 30,
            "description": "Unieke sleutel per regel; sleutel en waarde worden getrimd. Handmatig opgegeven regels gaan vóór de uit antwoorden afgeleide regel met dezelfde sleutel."
          },
          "analyse": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/StijlenV2Analyse"
              },
              {
                "type": "null"
              }
            ]
          },
          "antwoorden": {
            "$ref": "#/components/schemas/StijlenV2Antwoorden"
          },
          "kan_bewerken": {
            "type": "boolean"
          },
          "aangemaakt_op": {
            "type": "string",
            "format": "date-time"
          },
          "bijgewerkt_op": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "id",
          "naam",
          "laag",
          "document_type",
          "status",
          "actief",
          "bron",
          "bron_stijlprofiel_id",
          "voorbeeld_categorie",
          "actieve_versie_id",
          "versie_nummer",
          "regels",
          "analyse",
          "antwoorden",
          "kan_bewerken",
          "aangemaakt_op",
          "bijgewerkt_op"
        ],
        "additionalProperties": false
      },
      "StijlenV2VersieHistorie": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versie_nummer": {
            "type": "integer",
            "minimum": 1
          },
          "regels_json": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StijlenV2Regel"
            },
            "maxItems": 30,
            "description": "Unieke sleutel per regel; sleutel en waarde worden getrimd. Handmatig opgegeven regels gaan vóór de uit antwoorden afgeleide regel met dezelfde sleutel."
          },
          "analyse_json": {
            "$ref": "#/components/schemas/StijlenV2Analyse"
          },
          "antwoorden_json": {
            "$ref": "#/components/schemas/StijlenV2Antwoorden"
          },
          "wijzigingsreden": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "aangemaakt_op": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "id",
          "versie_nummer",
          "regels_json",
          "analyse_json",
          "antwoorden_json",
          "wijzigingsreden",
          "aangemaakt_op"
        ],
        "additionalProperties": false
      },
      "StijlenV2Versie": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versie_nummer": {
            "type": "integer",
            "minimum": 1
          },
          "regels_json": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StijlenV2Regel"
            },
            "maxItems": 30,
            "description": "Unieke sleutel per regel; sleutel en waarde worden getrimd. Handmatig opgegeven regels gaan vóór de uit antwoorden afgeleide regel met dezelfde sleutel."
          },
          "analyse_json": {
            "$ref": "#/components/schemas/StijlenV2Analyse"
          },
          "antwoorden_json": {
            "$ref": "#/components/schemas/StijlenV2Antwoorden"
          },
          "wijzigingsreden": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "aangemaakt_op": {
            "type": "string",
            "format": "date-time"
          },
          "organization_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "stijl_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "aangemaakt_door": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          }
        },
        "required": [
          "id",
          "versie_nummer",
          "regels_json",
          "analyse_json",
          "antwoorden_json",
          "wijzigingsreden",
          "aangemaakt_op",
          "organization_id",
          "stijl_id",
          "aangemaakt_door"
        ],
        "additionalProperties": false
      },
      "WebhookJobHistorie": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "event": {
            "type": "string",
            "enum": [
              "verwerking.gereed",
              "verwerking.mislukt"
            ]
          },
          "actie": {
            "type": "string"
          },
          "run_ref": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "job_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "aangemaakt_op": {
            "type": "string",
            "format": "date-time"
          },
          "verloopt_op": {
            "type": "string",
            "format": "date-time"
          },
          "afleveringen": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WebhookAflevering"
            }
          }
        },
        "required": [
          "id",
          "event",
          "actie",
          "run_ref",
          "job_id",
          "aangemaakt_op",
          "verloopt_op",
          "afleveringen"
        ],
        "additionalProperties": false
      },
      "WebhookMailHistorie": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "event": {
            "type": "string",
            "enum": [
              "mail.geaccepteerd",
              "mail.onzeker",
              "mail.mislukt",
              "mail.afgeleverd"
            ]
          },
          "actie": {
            "const": "mail.verzenden"
          },
          "run_ref": {
            "type": "null"
          },
          "job_id": {
            "type": "null"
          },
          "aangemaakt_op": {
            "type": "string",
            "format": "date-time"
          },
          "verloopt_op": {
            "type": "string",
            "format": "date-time"
          },
          "afleveringen": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WebhookAflevering"
            }
          },
          "outbox_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "poging_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "voorbereiding_poging": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "event",
          "actie",
          "run_ref",
          "job_id",
          "aangemaakt_op",
          "verloopt_op",
          "afleveringen",
          "outbox_id",
          "poging_id",
          "voorbereiding_poging"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "properties": {
                "event": {
                  "const": "mail.mislukt"
                }
              }
            },
            "then": {
              "properties": {
                "poging_id": {
                  "type": "null"
                },
                "voorbereiding_poging": {
                  "type": "integer",
                  "minimum": 0
                }
              }
            },
            "else": {
              "properties": {
                "poging_id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                },
                "voorbereiding_poging": {
                  "type": "null"
                }
              }
            }
          }
        ]
      },
      "WebhookJobMelding": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "type": {
            "type": "string",
            "enum": [
              "verwerking.gereed",
              "verwerking.mislukt"
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "data": {
            "type": "object",
            "properties": {
              "run_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "job_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "actie": {
                "type": "string"
              },
              "object_soort": {
                "type": "string",
                "enum": [
                  "gesprek",
                  "rapportversie",
                  "opname",
                  "briefing",
                  "stijltest",
                  "stijlverfijning",
                  "stijlwerkplaats"
                ]
              },
              "object_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              }
            },
            "required": [
              "run_id",
              "job_id",
              "actie",
              "object_soort",
              "object_id"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "id",
          "type",
          "created_at",
          "data"
        ],
        "additionalProperties": false
      },
      "WebhookMailMelding": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "type": {
            "type": "string",
            "enum": [
              "mail.geaccepteerd",
              "mail.onzeker",
              "mail.mislukt",
              "mail.afgeleverd"
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "data": {
            "type": "object",
            "properties": {
              "actie": {
                "const": "mail.verzenden"
              },
              "object_soort": {
                "const": "mail"
              },
              "object_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "outbox_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "poging_id": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "voorbereiding_poging": {
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 0
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "actie",
              "object_soort",
              "object_id",
              "outbox_id",
              "poging_id",
              "voorbereiding_poging"
            ],
            "additionalProperties": false,
            "description": "object_id en outbox_id zijn dezelfde UUID. Deze gelijkheid moet de ontvanger aanvullend controleren. Geen job_id of run_id; geen inhoud, adressen, provider-id of reviewhash."
          }
        },
        "required": [
          "id",
          "type",
          "created_at",
          "data"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "properties": {
                "type": {
                  "const": "mail.mislukt"
                }
              }
            },
            "then": {
              "properties": {
                "data": {
                  "properties": {
                    "poging_id": {
                      "type": "null"
                    },
                    "voorbereiding_poging": {
                      "type": "integer",
                      "minimum": 0
                    }
                  }
                }
              }
            },
            "else": {
              "properties": {
                "data": {
                  "properties": {
                    "poging_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "voorbereiding_poging": {
                      "type": "null"
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "WebhookMelding": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/WebhookJobMelding"
          },
          {
            "$ref": "#/components/schemas/WebhookMailMelding"
          }
        ],
        "description": "HMACv1 over timestamp, punt, event-id, punt en exacte ruwe JSONbytes. Alle vier headers controleren; maximaal vijf minuten tijdsverschil. Event-id duurzaam dedupliceren voordat HTTP2xx wordt gegeven. 2xx bevestigt webhookontvangst en bewijst geen mailaflevering."
      },
      "DocumentformatVoorkeur": {
        "type": "object",
        "properties": {
          "schemaVersie": {
            "const": 1
          },
          "registryVersie": {
            "const": "rapportly-archetypen-v1"
          },
          "archetypeKey": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "raster",
                  "nabij",
                  "werkstaat",
                  "dossier"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "selectieModus": {
            "type": "string",
            "enum": [
              "organisatie",
              "automatisch"
            ]
          },
          "magWijzigen": {
            "type": "boolean"
          },
          "etag": {
            "type": "string",
            "pattern": "^\"documentformat-voorkeur:[a-f0-9]{64}\"$"
          }
        },
        "required": [
          "schemaVersie",
          "registryVersie",
          "archetypeKey",
          "selectieModus",
          "magWijzigen",
          "etag"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "properties": {
                "archetypeKey": {
                  "type": "null"
                }
              }
            },
            "then": {
              "properties": {
                "selectieModus": {
                  "const": "automatisch"
                }
              }
            },
            "else": {
              "properties": {
                "selectieModus": {
                  "const": "organisatie"
                }
              }
            }
          }
        ]
      },
      "ExcelObjectKort": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "parentId": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "soort": {
            "type": "string",
            "enum": [
              "bron",
              "controle",
              "voorbeeld",
              "akkoord",
              "invoer",
              "resultaat"
            ]
          },
          "aangemaaktOp": {
            "type": "string",
            "format": "date-time"
          },
          "inhoudHash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "naam": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "modus": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "sjabloon",
                  "aanvullen"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "opdracht": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "schemaVersie": {
                    "const": 1
                  },
                  "klantId": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "workflow": {
                    "type": "object",
                    "properties": {
                      "profielId": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      "versieId": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      }
                    },
                    "required": [
                      "profielId",
                      "versieId"
                    ],
                    "additionalProperties": false
                  },
                  "instructie": {
                    "type": "string",
                    "maxLength": 4000
                  },
                  "klantZelfUitleggen": {
                    "const": true
                  }
                },
                "required": [
                  "schemaVersie"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "parentId",
          "soort",
          "aangemaaktOp",
          "inhoudHash",
          "opdracht"
        ],
        "additionalProperties": false,
        "description": "Korte onveranderlijke objectmetadata. naam/modus kunnen bij afgeleide objecten ontbreken of bij lijstprojectie null zijn. inhoudHash is niet de downloadbestandhash."
      },
      "ExcelBronvoorstelKort": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "controleId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "status": {
            "type": "string",
            "enum": [
              "concept",
              "bezig",
              "antwoord",
              "klaar",
              "mislukt"
            ]
          },
          "aangemaaktOp": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "id",
          "controleId",
          "status",
          "aangemaaktOp"
        ],
        "additionalProperties": false
      },
      "ExcelVoorstelBron": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^bron-[0-9]+$"
          },
          "soort": {
            "type": "string",
            "enum": [
              "opname",
              "document",
              "tekst"
            ]
          },
          "ref": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "label": {
            "type": "string",
            "minLength": 1,
            "maxLength": 160
          },
          "bronHash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "paginering": {
            "type": "string",
            "enum": [
              "fysiek",
              "document"
            ]
          },
          "paginas": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "deel": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 100
                },
                "tekst": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120000,
                  "pattern": "^[^\u0000]*$"
                }
              },
              "required": [
                "deel",
                "tekst"
              ],
              "additionalProperties": false
            },
            "minItems": 1,
            "maxItems": 100
          }
        },
        "required": [
          "id",
          "soort",
          "label",
          "bronHash",
          "paginering",
          "paginas"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "properties": {
                "soort": {
                  "const": "opname"
                }
              }
            },
            "then": {
              "required": [
                "ref"
              ]
            }
          }
        ],
        "description": "Bewaar persoonsgegevens en bronfragmenten uitsluitend in je eigen bevoegde serveromgeving. Opnames hebben ref; documenten/tekst gebruiken een lokale bron-id. Alle bronnen samen maximaal120000tekens."
      },
      "ExcelBronbewijs": {
        "type": "object",
        "properties": {
          "bronId": {
            "type": "string",
            "pattern": "^bron-[0-9]+$"
          },
          "bronHash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "label": {
            "type": "string",
            "minLength": 1,
            "maxLength": 160
          },
          "paginering": {
            "type": "string",
            "enum": [
              "fysiek",
              "document"
            ]
          },
          "deel": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          },
          "citaat": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500
          },
          "begin": {
            "type": "integer",
            "minimum": 0
          },
          "einde": {
            "type": "integer",
            "minimum": 0
          }
        },
        "required": [
          "bronId",
          "bronHash",
          "label",
          "paginering",
          "deel",
          "citaat",
          "begin",
          "einde"
        ],
        "additionalProperties": false,
        "description": "Letterlijk citaat op begin/einde in de gekozen bronpagina. Bronhash en pagina horen bij de opgeslagen bron; geen vrij door model verzonnen verwijzing."
      },
      "ExcelVeldvoorstellen": {
        "type": "object",
        "additionalProperties": {
          "type": "object",
          "properties": {
            "status": {
              "type": "string",
              "enum": [
                "gevonden",
                "ontbreekt",
                "conflict",
                "ongeldig"
              ]
            },
            "kandidaten": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "waarde": {
                    "oneOf": [
                      {
                        "type": "boolean"
                      },
                      {
                        "type": "number"
                      },
                      {
                        "type": "string",
                        "maxLength": 32767
                      }
                    ]
                  },
                  "bewijzen": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/ExcelBronbewijs"
                    },
                    "minItems": 1,
                    "maxItems": 3
                  }
                },
                "required": [
                  "waarde",
                  "bewijzen"
                ],
                "additionalProperties": false
              },
              "maxItems": 2
            }
          },
          "required": [
            "status",
            "kandidaten"
          ],
          "additionalProperties": false,
          "description": "Type/celvalidatie en letterlijke bewijsdekking zijn gecontroleerd; gebruiker beoordeelt alle kandidaten. Ontbreekt/ongeldig kunnen geen kandidaat bevatten; conflict wordt niet automatisch opgelost."
        },
        "maxProperties": 300,
        "description": "Kaart op bestaande invoercel-id. Alle invoervelden staan erin; ontbrekende modelvelden worden ontbreekt met lege kandidaten. Model selecteert geen extra cellen of formules."
      },
      "ExcelCelValidatie": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "list",
              "whole",
              "decimal",
              "date",
              "textLength"
            ]
          },
          "formulae": {
            "type": "array",
            "items": {
              "oneOf": [
                {
                  "type": "string"
                },
                {
                  "type": "number"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "operator": {
            "type": "string"
          },
          "allowBlank": {
            "type": "boolean"
          },
          "showInputMessage": {
            "type": "boolean"
          },
          "showErrorMessage": {
            "type": "boolean"
          },
          "promptTitle": {
            "type": "string"
          },
          "prompt": {
            "type": "string"
          },
          "errorStyle": {
            "type": "string"
          },
          "errorTitle": {
            "type": "string"
          },
          "error": {
            "type": "string"
          }
        },
        "required": [
          "type",
          "formulae"
        ],
        "additionalProperties": false,
        "description": "Native ExcelJS4.4.0-leesmodel, daarna door de eigen analyse begrensd tot vijf typen. Literal list heeft één geciteerde string; andere formules zijn getallen of als JSON geserialiseerde datums. De rij houdt bestaande fout-/prompthints; definitieve invulvalidatie volgt bij invullen. Een niet-eindig geïmporteerd getal/datum kan in historische JSON null zijn.",
        "x-afgeleid-uit": {
          "pakket": "exceljs@4.4.0",
          "bestand": "lib/xlsx/xform/sheet/data-validations-xform.js",
          "lockbestand": "server/package-lock.json",
          "bronref": "66d3dcaf"
        }
      },
      "ExcelXmlWaarde": {
        "oneOf": [
          {
            "type": "string"
          },
          {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExcelXmlWaarde"
            }
          },
          {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/ExcelXmlWaarde"
            }
          }
        ],
        "description": "XML-parsetekst met attributen onder @-sleutels, elementnodes en herhaalde elementen als arrays. Geen opslagreferentie of HTML-uitvoercontract."
      },
      "ExcelOpenbareAnalyse": {
        "type": "object",
        "properties": {
          "engine": {
            "const": "xlsx_native_v1"
          },
          "capaciteiten": {
            "type": "string",
            "enum": [
              "xlsx_native_v1",
              "xlsx_native_passief_v2",
              "xlsx_native_ruim_v3",
              "xlsx_native_veilig_v4"
            ]
          },
          "bronHash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "datum1904": {
            "type": "boolean"
          },
          "bladen": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "naam": {
                  "type": "string"
                },
                "pad": {
                  "type": "string"
                },
                "verborgen": {
                  "type": "boolean"
                }
              },
              "required": [
                "id",
                "naam",
                "pad",
                "verborgen"
              ],
              "additionalProperties": false
            },
            "minItems": 1,
            "maxItems": 64
          },
          "cellen": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "pattern": "^[1-9][0-9]*:[A-Z]{1,3}[1-9][0-9]*$"
                },
                "blad": {
                  "type": "string",
                  "pattern": "^[1-9][0-9]*$"
                },
                "adres": {
                  "type": "string",
                  "pattern": "^[A-Z]{1,3}[1-9][0-9]{0,6}$"
                },
                "waarde": {
                  "oneOf": [
                    {
                      "type": "string",
                      "maxLength": 32767
                    },
                    {
                      "type": "number"
                    },
                    {
                      "type": "boolean"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "formule": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "bewerkbaar": {
                  "type": "boolean"
                },
                "notatie": {
                  "type": "string"
                },
                "validatie": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/ExcelCelValidatie"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "voorstel": {
                  "type": "string",
                  "enum": [
                    "invoer",
                    "controleren"
                  ]
                }
              },
              "required": [
                "id",
                "blad",
                "adres",
                "waarde",
                "formule",
                "bewerkbaar",
                "notatie",
                "validatie",
                "voorstel"
              ],
              "additionalProperties": false
            },
            "maxItems": 100000
          },
          "vasteOnderdelen": {
            "type": "array",
            "items": {
              "oneOf": [
                {
                  "type": "object",
                  "properties": {
                    "soort": {
                      "type": "string",
                      "enum": [
                        "namen",
                        "getalnotaties"
                      ]
                    },
                    "kolommen": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "required": [
                    "soort",
                    "kolommen"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "soort": {
                      "const": "tabel"
                    },
                    "naam": {
                      "type": "string"
                    },
                    "kolommen": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "required": [
                    "soort",
                    "naam",
                    "kolommen"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "soort": {
                      "const": "afdruktekst"
                    },
                    "blad": {
                      "type": "string"
                    },
                    "inhoud": {
                      "$ref": "#/components/schemas/ExcelXmlWaarde"
                    }
                  },
                  "required": [
                    "soort",
                    "blad",
                    "inhoud"
                  ],
                  "additionalProperties": false
                }
              ]
            }
          },
          "namen": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "naam": {
                  "type": "string"
                },
                "ref": {
                  "type": "string"
                },
                "lokaal": {
                  "type": "string"
                }
              },
              "required": [
                "naam",
                "ref"
              ],
              "additionalProperties": false
            }
          },
          "formuleAantal": {
            "type": "integer",
            "minimum": 0,
            "maximum": 20000
          },
          "passieveOnderdelen": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "soort": {
                  "type": "string",
                  "enum": [
                    "miniatuur",
                    "afbeeldingen",
                    "printerinstellingen",
                    "grafieken",
                    "draaitabellen",
                    "formulierbesturing",
                    "grafiekankers",
                    "tekenobjecten",
                    "afbeeldingsankers",
                    "kopvoetbeelden",
                    "notitieankers",
                    "notities",
                    "auteurs",
                    "opmerkingen"
                  ]
                },
                "aantal": {
                  "type": "integer",
                  "minimum": 0
                },
                "onderdeel": {
                  "type": "string"
                },
                "impact": {
                  "type": "object",
                  "properties": {
                    "aanvullen": {
                      "const": "behouden"
                    },
                    "sjabloon": {
                      "type": "string",
                      "enum": [
                        "controleren",
                        "verwijderen"
                      ]
                    }
                  },
                  "required": [
                    "aanvullen",
                    "sjabloon"
                  ],
                  "additionalProperties": false
                }
              },
              "required": [
                "soort",
                "aantal",
                "onderdeel",
                "impact"
              ],
              "additionalProperties": false
            }
          },
          "compatibiliteit": {
            "type": "object",
            "properties": {
              "versie": {
                "const": 1
              },
              "status": {
                "type": "string",
                "enum": [
                  "volledig",
                  "veilig_behouden",
                  "geconverteerd",
                  "controle_nodig"
                ]
              },
              "onderdelen": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "volledig",
                        "veilig_behouden",
                        "geconverteerd",
                        "controle_nodig"
                      ]
                    },
                    "aantal": {
                      "type": "integer",
                      "minimum": 0
                    }
                  },
                  "required": [
                    "code",
                    "status",
                    "aantal"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "versie",
              "status",
              "onderdelen"
            ],
            "additionalProperties": false
          },
          "limieten": {
            "type": "object",
            "properties": {
              "bestand": {
                "type": "integer",
                "minimum": 0
              },
              "onderdeel": {
                "type": "integer",
                "minimum": 0
              },
              "uitgepakt": {
                "type": "integer",
                "minimum": 0
              },
              "onderdelen": {
                "type": "integer",
                "minimum": 0
              },
              "cellen": {
                "type": "integer",
                "minimum": 0
              },
              "bladen": {
                "type": "integer",
                "minimum": 0
              },
              "velden": {
                "type": "integer",
                "minimum": 0
              },
              "formules": {
                "type": "integer",
                "minimum": 0
              }
            },
            "required": [
              "bestand",
              "onderdeel",
              "uitgepakt",
              "onderdelen",
              "cellen",
              "bladen",
              "velden",
              "formules"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "engine",
          "bronHash",
          "datum1904",
          "bladen",
          "cellen",
          "vasteOnderdelen",
          "namen",
          "formuleAantal"
        ],
        "additionalProperties": false,
        "description": "Getypeerd analyseantwoord zonder interne zipbytes/delen. Oude native v1 kan capaciteiten/passieveOnderdelen/compatibiliteit/limieten weglaten; ruime varianten bevatten limieten. blad.pad is een onderdeel binnen het werkmapzipbestand, geen serveropslagpad. Complete analyse maximaal32MiB voordat zij wordt opgeslagen."
      },
      "ExcelDiagnose": {
        "type": "object",
        "properties": {
          "versie": {
            "const": 1
          },
          "volledig": {
            "type": "boolean"
          },
          "meldingen": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string"
                },
                "categorie": {
                  "type": "string",
                  "enum": [
                    "capaciteit",
                    "bronfout",
                    "externe_afhankelijkheid",
                    "ondersteuning"
                  ]
                },
                "impact": {
                  "type": "object",
                  "properties": {
                    "aanvullen": {
                      "const": "blokkeert"
                    },
                    "sjabloon": {
                      "const": "blokkeert"
                    }
                  },
                  "required": [
                    "aanvullen",
                    "sjabloon"
                  ],
                  "additionalProperties": false
                },
                "vervolgstap": {
                  "type": "string",
                  "enum": [
                    "kleiner_model",
                    "bron_herstellen",
                    "bron_aanleveren",
                    "ondersteund_model"
                  ]
                },
                "aantal": {
                  "type": "integer",
                  "minimum": 0
                },
                "limiet": {
                  "type": "integer",
                  "minimum": 0
                },
                "onderdeel": {
                  "type": "string"
                },
                "blad": {
                  "type": "string"
                },
                "bereik": {
                  "type": "string"
                }
              },
              "required": [
                "code",
                "categorie",
                "impact",
                "vervolgstap"
              ],
              "additionalProperties": false
            },
            "maxItems": 120
          }
        },
        "required": [
          "versie",
          "volledig",
          "meldingen"
        ],
        "additionalProperties": false
      },
      "MailVoorbeeldOutbox": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "status": {
            "type": "string"
          },
          "directe_status": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "onzeker",
                  "geaccepteerd",
                  "handmatig_bevestigd",
                  "gestopt"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "directe_poging": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "bezorgd_op": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "kan_goedkeuren": {
            "type": "boolean"
          },
          "herstel_mogelijk": {
            "type": "boolean"
          },
          "herstel_code": {
            "const": "mail_legacy_herstel_verplicht"
          }
        },
        "required": [
          "id",
          "status",
          "directe_status",
          "directe_poging",
          "bezorgd_op",
          "kan_goedkeuren",
          "herstel_mogelijk"
        ],
        "additionalProperties": false,
        "description": "Status van de gekozen mailsoort. kan_goedkeuren geldt uitsluitend voor een nooit aangeboden rij zonder snapshot/delegatie, nul pogingen, geen providerconcept en status wacht_op_review of geannuleerd. herstel_mogelijk bindt huidige actor en dezelfde snapshotmailsoort. Legacy onzeker zonder snapshot heeft herstel_code; dit bewijst geen veilig automatisch herstel."
      },
      "GecontroleerdMailVoorbeeld": {
        "type": "object",
        "properties": {
          "basis": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$",
            "description": "Exacte basis uit het actuele voorbeeld; de aanvraagcontrole beperkt niet tot één UUID-versie."
          },
          "afzender": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "mailbox_keuze_status": {
            "type": "string",
            "enum": [
              "gekozen",
              "onbeschikbaar",
              "keuze_nodig",
              "enige_mailbox",
              "geen_mailbox"
            ]
          },
          "review_hash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "modus": {
            "type": "string",
            "enum": [
              "concept",
              "review",
              "auto_send"
            ]
          },
          "kanaal": {
            "type": "string",
            "enum": [
              "mailbox",
              "domein"
            ]
          },
          "provider": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "gmail",
                  "m365",
                  "resend"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "ontvanger": {
            "anyOf": [
              {
                "type": "string",
                "format": "email"
              },
              {
                "type": "null"
              }
            ]
          },
          "bcc": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "onderwerp": {
            "type": "string"
          },
          "body": {
            "type": "string"
          },
          "bijlagen": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                },
                "naam": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "naam"
              ],
              "additionalProperties": false
            },
            "maxItems": 100
          },
          "mag_verzenden": {
            "type": "boolean"
          },
          "reden": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "wacht_tot": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "send_capable": {
            "type": "boolean"
          },
          "auto_send_beschikbaar": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "versiecontrole": {
            "const": true
          },
          "mailsoort": {
            "type": "string",
            "enum": [
              "klantmail",
              "followup"
            ]
          },
          "outbox": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/MailVoorbeeldOutbox"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "basis",
          "afzender",
          "mailbox_keuze_status",
          "review_hash",
          "modus",
          "kanaal",
          "provider",
          "ontvanger",
          "bcc",
          "onderwerp",
          "body",
          "bijlagen",
          "mag_verzenden",
          "reden",
          "wacht_tot",
          "send_capable",
          "auto_send_beschikbaar",
          "versiecontrole",
          "mailsoort",
          "outbox"
        ],
        "additionalProperties": false
      },
      "WorkflowRun": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "uitvoering_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "uitvoering_versie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "dossier_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "status": {
            "type": "string",
            "enum": [
              "wacht_op_bevestiging",
              "gereed",
              "starten",
              "verwerken",
              "gepauzeerd",
              "geannuleerd",
              "klaar",
              "herstel_nodig"
            ]
          },
          "versie": {
            "type": "integer",
            "minimum": 1
          },
          "basis": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "bevestigd_op": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "documenttype": {
            "type": "string",
            "enum": [
              "rapport",
              "presentatie",
              "offerte"
            ]
          },
          "offerte_afmaken_mogelijk": {
            "type": "boolean"
          },
          "reden": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "gepauzeerd_door_gebruiker",
                  "geannuleerd_door_gebruiker",
                  "handmatige_controle_verplicht"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "start_hervatten_mogelijk": {
            "type": "boolean"
          },
          "herstel_zonder_provider": {
            "type": "boolean"
          },
          "herstel_mogelijk": {
            "type": "boolean"
          },
          "rapport_versie_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "job_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "job_status": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "opmaak_job_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "opmaak_job_status": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "aangemaakt_op": {
            "type": "string",
            "format": "date-time"
          },
          "bijgewerkt_op": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "id",
          "uitvoering_id",
          "uitvoering_versie_id",
          "dossier_id",
          "status",
          "versie",
          "basis",
          "bevestigd_op",
          "documenttype",
          "offerte_afmaken_mogelijk",
          "reden",
          "start_hervatten_mogelijk",
          "herstel_zonder_provider",
          "herstel_mogelijk",
          "rapport_versie_id",
          "job_id",
          "job_status",
          "opmaak_job_id",
          "opmaak_job_status",
          "aangemaakt_op",
          "bijgewerkt_op"
        ],
        "additionalProperties": false,
        "description": "Duurzaam domeinleesmodel. Runstatus en native jobstatus hebben afzonderlijke betekenis. Geen inhoud, prijs, providersecret of claimtoken. De drie mogelijkheden zijn actuele hints en vervangen geen nieuwe actor-/bron-/versiecontrole. basis is de reviewhash van deze run, niet de uitvoering-ETag."
      },
      "WorkflowRunOntvangst": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "uitvoering_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "uitvoering_versie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "dossier_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "status": {
            "type": "string",
            "enum": [
              "wacht_op_bevestiging",
              "gereed",
              "starten",
              "verwerken",
              "gepauzeerd",
              "geannuleerd",
              "klaar",
              "herstel_nodig"
            ]
          },
          "versie": {
            "type": "integer",
            "minimum": 1
          },
          "basis": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "bevestigd_op": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "documenttype": {
            "type": "string",
            "enum": [
              "rapport",
              "presentatie",
              "offerte"
            ]
          },
          "offerte_afmaken_mogelijk": {
            "type": "boolean"
          },
          "reden": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "gepauzeerd_door_gebruiker",
                  "geannuleerd_door_gebruiker",
                  "handmatige_controle_verplicht"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "start_hervatten_mogelijk": {
            "type": "boolean"
          },
          "herstel_zonder_provider": {
            "type": "boolean"
          },
          "herstel_mogelijk": {
            "type": "boolean"
          },
          "rapport_versie_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "job_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "job_status": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "opmaak_job_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "opmaak_job_status": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "aangemaakt_op": {
            "type": "string",
            "format": "date-time"
          },
          "bijgewerkt_op": {
            "type": "string",
            "format": "date-time"
          },
          "herhaald": {
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "uitvoering_id",
          "uitvoering_versie_id",
          "dossier_id",
          "status",
          "versie",
          "basis",
          "bevestigd_op",
          "documenttype",
          "offerte_afmaken_mogelijk",
          "reden",
          "start_hervatten_mogelijk",
          "herstel_zonder_provider",
          "herstel_mogelijk",
          "rapport_versie_id",
          "job_id",
          "job_status",
          "opmaak_job_id",
          "opmaak_job_status",
          "aangemaakt_op",
          "bijgewerkt_op",
          "herhaald"
        ],
        "additionalProperties": false,
        "description": "Mutatieantwoord met volledige runvorm. Een herhaalde ontvangst kan de historisch opgeslagen toestand bevatten; gebruik GET voor actuele voortgang."
      },
      "WorkflowRunMutatie": {
        "type": "object",
        "properties": {
          "bevestigd": {
            "const": true
          },
          "versie": {
            "type": "integer",
            "minimum": 1,
            "maximum": 9007199254740991
          },
          "basis": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          }
        },
        "required": [
          "bevestigd",
          "versie",
          "basis"
        ],
        "additionalProperties": false
      },
      "WorkflowOfferteVoorwaardenInvoer": {
        "type": "object",
        "properties": {
          "offerDate": {
            "type": "string",
            "format": "date"
          },
          "validUntil": {
            "type": "string",
            "format": "date"
          },
          "paymentTerms": {
            "type": "string",
            "maxLength": 300
          },
          "deliveryTerms": {
            "type": "string",
            "maxLength": 600
          },
          "additionalNotes": {
            "type": "string",
            "maxLength": 3000
          }
        },
        "required": [
          "offerDate",
          "validUntil"
        ],
        "additionalProperties": false,
        "description": "Echte kalenderdatums; validUntil moet op of na offerDate liggen. Tekst wordt NFKC-genormaliseerd en samengevoegde witruimte wordt enkelvoudig."
      },
      "WorkflowOfferteVoorwaarden": {
        "type": "object",
        "properties": {
          "offerDate": {
            "type": "string",
            "format": "date"
          },
          "validUntil": {
            "type": "string",
            "format": "date"
          },
          "paymentTerms": {
            "type": "string",
            "maxLength": 300
          },
          "deliveryTerms": {
            "type": "string",
            "maxLength": 600
          },
          "additionalNotes": {
            "type": "string",
            "maxLength": 3000
          }
        },
        "required": [
          "offerDate",
          "validUntil",
          "paymentTerms",
          "deliveryTerms",
          "additionalNotes"
        ],
        "additionalProperties": false
      },
      "WorkflowOfferteCatalogus": {
        "type": "object",
        "properties": {
          "catalogusId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versionId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "etag": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          }
        },
        "required": [
          "catalogusId",
          "versionId",
          "etag"
        ],
        "additionalProperties": false
      },
      "WorkflowOfferteWerkprofielInvoer": {
        "type": "object",
        "properties": {
          "workflowprofielId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versionId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versionHash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          }
        },
        "required": [
          "workflowprofielId",
          "versionId",
          "versionHash"
        ],
        "additionalProperties": false
      },
      "WorkflowOfferteWerkprofiel": {
        "type": "object",
        "properties": {
          "workflowprofielId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versionId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versionHash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 160
          },
          "version": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000000
          },
          "steps": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120
                },
                "explanation": {
                  "type": "string",
                  "maxLength": 500
                }
              },
              "required": [
                "name",
                "explanation"
              ],
              "additionalProperties": false
            },
            "maxItems": 30
          },
          "sourceRules": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "key": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 100
                },
                "label": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 160
                }
              },
              "required": [
                "key",
                "label"
              ],
              "additionalProperties": false
            },
            "maxItems": 30
          }
        },
        "required": [
          "workflowprofielId",
          "versionId",
          "versionHash",
          "name",
          "version",
          "steps",
          "sourceRules"
        ],
        "additionalProperties": false
      },
      "WorkflowOfferteHandregel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "source": {
            "const": "manual"
          },
          "description": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300
          },
          "quantityMilli": {
            "type": "integer",
            "minimum": 1,
            "maximum": 9999000
          },
          "unit": {
            "type": "string",
            "minLength": 1,
            "maxLength": 40
          },
          "vatBasisPoints": {
            "type": "integer",
            "minimum": 0,
            "maximum": 10000
          },
          "humanConfirmed": {
            "const": true
          },
          "priceMode": {
            "const": "fixed"
          },
          "unitPriceCents": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          }
        },
        "required": [
          "id",
          "source",
          "description",
          "quantityMilli",
          "unit",
          "vatBasisPoints",
          "humanConfirmed",
          "priceMode",
          "unitPriceCents"
        ],
        "additionalProperties": false
      },
      "WorkflowOfferteBewijsInvoer": {
        "type": "object",
        "properties": {
          "schemaVersion": {
            "const": 2
          },
          "conceptId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "subject": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "conditions": {
            "$ref": "#/components/schemas/WorkflowOfferteVoorwaardenInvoer"
          },
          "catalog": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/WorkflowOfferteCatalogus"
              },
              {
                "type": "null"
              }
            ]
          },
          "workflow": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/WorkflowOfferteWerkprofielInvoer"
              },
              {
                "type": "null"
              }
            ]
          },
          "lines": {
            "type": "array",
            "items": {
              "oneOf": [
                {
                  "$ref": "#/components/schemas/WorkflowOfferteHandregel"
                },
                {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "source": {
                      "const": "catalog"
                    },
                    "confirmationToken": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 16384,
                      "writeOnly": true,
                      "description": "Nog geldige echte native bevestiging voor dezelfde actor/organisatie/concept. Alleen tijdens import geopend; nooit teruggegeven. Geen zelfgemaakt voorbeeldtoken als bevoegdheid gebruiken."
                    }
                  },
                  "required": [
                    "id",
                    "source",
                    "confirmationToken"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "source": {
                      "const": "route"
                    },
                    "confirmationToken": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 16384,
                      "writeOnly": true,
                      "description": "Nog geldige echte native bevestiging voor dezelfde actor/organisatie/concept. Alleen tijdens import geopend; nooit teruggegeven. Geen zelfgemaakt voorbeeldtoken als bevoegdheid gebruiken."
                    }
                  },
                  "required": [
                    "source",
                    "confirmationToken"
                  ],
                  "additionalProperties": false
                }
              ]
            },
            "minItems": 1,
            "maxItems": 50,
            "contains": {
              "type": "object",
              "properties": {
                "source": {
                  "type": "string",
                  "enum": [
                    "catalog",
                    "route"
                  ]
                }
              },
              "required": [
                "source"
              ]
            }
          }
        },
        "required": [
          "schemaVersion",
          "conceptId",
          "subject",
          "conditions",
          "lines"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "properties": {
                "lines": {
                  "contains": {
                    "type": "object",
                    "properties": {
                      "source": {
                        "const": "catalog"
                      }
                    },
                    "required": [
                      "source"
                    ]
                  }
                }
              }
            },
            "then": {
              "required": [
                "catalog"
              ],
              "properties": {
                "catalog": {
                  "$ref": "#/components/schemas/WorkflowOfferteCatalogus"
                }
              }
            }
          }
        ],
        "description": "Minstens één catalogus- of routeregel; uitsluitend handmatige offertes gebruiken de afzonderlijke productiekeuze. Alle regels moeten volledig geprijsd zijn, unieke native regel-ID’s hebben en dezelfde conceptidentiteit gebruiken. Native validatie en deterministische totalen blijven leidend."
      },
      "WorkflowOfferteRoutebewijs": {
        "type": "object",
        "properties": {
          "routeId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "departurePointId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "departurePointVersionId": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "kilometerRuleVersionId": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "tripMode": {
            "type": "string",
            "enum": [
              "one_way",
              "return"
            ]
          },
          "providerDistanceMeters": {
            "type": "integer",
            "minimum": 1,
            "maximum": 9007199254740991
          },
          "distanceMeters": {
            "type": "integer",
            "minimum": 1,
            "maximum": 9999000
          },
          "routeCostCents": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "source": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9_.:-]{0,79}$"
          },
          "calculatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "referenceDate": {
            "type": "string",
            "format": "date-time"
          },
          "routeReference": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[a-z0-9][a-z0-9_.:-]{0,79}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "confirmedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "routeId",
          "departurePointId",
          "departurePointVersionId",
          "kilometerRuleVersionId",
          "tripMode",
          "providerDistanceMeters",
          "distanceMeters",
          "routeCostCents",
          "source",
          "calculatedAt",
          "referenceDate",
          "routeReference",
          "confirmedAt"
        ],
        "additionalProperties": false,
        "description": "Gevalideerde routefeiten zonder adresinhoud of ondertekend token. Afstand in meters; quantityMilli is duizendsten van een kilometer. Eenmalige route kan null versie-ID’s hebben."
      },
      "WorkflowOfferteBerekening": {
        "type": "object",
        "properties": {
          "complete": {
            "const": true
          },
          "subtotalCents": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "vatCents": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "totalCents": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "vatBreakdown": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "vatBasisPoints": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 10000
                },
                "vatCents": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                }
              },
              "required": [
                "vatBasisPoints",
                "vatCents"
              ],
              "additionalProperties": false
            },
            "minItems": 1,
            "maxItems": 50
          },
          "unresolvedLineIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            },
            "maxItems": 0
          }
        },
        "required": [
          "complete",
          "subtotalCents",
          "vatCents",
          "totalCents",
          "vatBreakdown",
          "unresolvedLineIds"
        ],
        "additionalProperties": false,
        "description": "Bestaande native gehele-centenberekening. Per regel afronden op subtotaal, daarna BTW; groepen oplopend BTW-tarief. Geen modelbedragen, klantcredits of providerkosten. Complete prijs vereist vóór ontvangst."
      },
      "WorkflowOfferteSnapshot": {
        "type": "object",
        "properties": {
          "schemaVersion": {
            "const": 2
          },
          "conceptId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "subject": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "catalogus": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/WorkflowOfferteCatalogus"
              },
              {
                "type": "null"
              }
            ]
          },
          "workflow": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/WorkflowOfferteWerkprofiel"
              },
              {
                "type": "null"
              }
            ]
          },
          "conditions": {
            "$ref": "#/components/schemas/WorkflowOfferteVoorwaarden"
          },
          "lines": {
            "type": "array",
            "items": {
              "oneOf": [
                {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "description": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 300
                    },
                    "quantityMilli": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 9999000
                    },
                    "unit": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 40
                    },
                    "unitPriceCents": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "vatBasisPoints": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 10000
                    },
                    "priceMode": {
                      "const": "fixed"
                    },
                    "humanConfirmed": {
                      "const": true
                    },
                    "lineSubtotalCents": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "vatCents": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "lineTotalCents": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "source": {
                      "const": "manual"
                    },
                    "productId": {
                      "type": "null"
                    },
                    "productCode": {
                      "type": "null"
                    },
                    "matchType": {
                      "const": "manual"
                    }
                  },
                  "required": [
                    "id",
                    "description",
                    "quantityMilli",
                    "unit",
                    "unitPriceCents",
                    "vatBasisPoints",
                    "priceMode",
                    "humanConfirmed",
                    "lineSubtotalCents",
                    "vatCents",
                    "lineTotalCents",
                    "source",
                    "productId",
                    "productCode",
                    "matchType"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "description": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 300
                    },
                    "quantityMilli": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 9999000
                    },
                    "unit": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 40
                    },
                    "unitPriceCents": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "vatBasisPoints": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 10000
                    },
                    "priceMode": {
                      "const": "fixed"
                    },
                    "humanConfirmed": {
                      "const": true
                    },
                    "lineSubtotalCents": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "vatCents": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "lineTotalCents": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "source": {
                      "const": "catalog"
                    },
                    "productId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "productCode": {
                      "type": "string",
                      "pattern": "^[A-Z0-9][A-Z0-9._-]{0,63}$"
                    },
                    "matchType": {
                      "type": "string",
                      "enum": [
                        "code",
                        "name_or_alias"
                      ]
                    }
                  },
                  "required": [
                    "id",
                    "description",
                    "quantityMilli",
                    "unit",
                    "unitPriceCents",
                    "vatBasisPoints",
                    "priceMode",
                    "humanConfirmed",
                    "lineSubtotalCents",
                    "vatCents",
                    "lineTotalCents",
                    "source",
                    "productId",
                    "productCode",
                    "matchType"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "description": {
                      "const": "Reiskosten"
                    },
                    "quantityMilli": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 9999000
                    },
                    "unit": {
                      "const": "km"
                    },
                    "unitPriceCents": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "vatBasisPoints": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 10000
                    },
                    "priceMode": {
                      "const": "fixed"
                    },
                    "humanConfirmed": {
                      "const": true
                    },
                    "lineSubtotalCents": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "vatCents": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "lineTotalCents": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "source": {
                      "const": "route"
                    },
                    "productId": {
                      "type": "null"
                    },
                    "productCode": {
                      "type": "null"
                    },
                    "matchType": {
                      "const": "route_provider"
                    },
                    "route": {
                      "$ref": "#/components/schemas/WorkflowOfferteRoutebewijs"
                    }
                  },
                  "required": [
                    "id",
                    "description",
                    "quantityMilli",
                    "unit",
                    "unitPriceCents",
                    "vatBasisPoints",
                    "priceMode",
                    "humanConfirmed",
                    "lineSubtotalCents",
                    "vatCents",
                    "lineTotalCents",
                    "source",
                    "productId",
                    "productCode",
                    "matchType",
                    "route"
                  ],
                  "additionalProperties": false
                }
              ]
            },
            "minItems": 1,
            "maxItems": 50
          },
          "calculation": {
            "$ref": "#/components/schemas/WorkflowOfferteBerekening"
          }
        },
        "required": [
          "schemaVersion",
          "subject",
          "catalogus",
          "workflow",
          "conditions",
          "lines",
          "calculation"
        ],
        "additionalProperties": false,
        "description": "Native gevalideerde snapshot. conceptId aanwezig bij catalogus-/routeregels; handmatige productiekeuze heeft dit veld niet. Geen confirmationToken of decodeerbare tokenpayload."
      },
      "WorkflowOfferteBewijsOntvangst": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "bewijs_sha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "uitvoering_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "basis_versie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "offerte_snapshot": {
            "allOf": [
              {
                "$ref": "#/components/schemas/WorkflowOfferteSnapshot"
              },
              {
                "required": [
                  "conceptId"
                ]
              }
            ]
          },
          "herhaald": {
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "bewijs_sha256",
          "uitvoering_id",
          "basis_versie_id",
          "offerte_snapshot",
          "herhaald"
        ],
        "additionalProperties": false
      },
      "UitvoeringKeuzeVast": {
        "type": "object",
        "properties": {
          "modelniveau": {
            "type": "string",
            "enum": [
              "basis",
              "standaard",
              "max"
            ]
          },
          "verwerkingsvariant": {
            "type": "string",
            "enum": [
              "basis",
              "zorgvuldig",
              "optimaal"
            ]
          }
        },
        "required": [
          "modelniveau",
          "verwerkingsvariant"
        ],
        "additionalProperties": false
      },
      "UitvoeringKeuzeadviesVast": {
        "type": "object",
        "properties": {
          "advies_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "advies_hash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "aanbevolen": {
            "$ref": "#/components/schemas/UitvoeringKeuzeVast"
          }
        },
        "required": [
          "advies_id",
          "advies_hash",
          "aanbevolen"
        ],
        "additionalProperties": false
      },
      "UitvoeringAfwijkingsbevestiging": {
        "type": "object",
        "properties": {
          "bevestigd": {
            "const": true
          },
          "advies_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "advies_hash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "keuze": {
            "$ref": "#/components/schemas/UitvoeringKeuzeVast"
          }
        },
        "required": [
          "bevestigd",
          "advies_id",
          "advies_hash",
          "keuze"
        ],
        "additionalProperties": false
      },
      "UitvoeringVoortgang": {
        "type": "object",
        "properties": {
          "fase": {
            "type": "string",
            "enum": [
              "voorbereiding",
              "gesprek",
              "concept",
              "goedkeuring",
              "aanvulling",
              "definitief"
            ]
          },
          "wachttijd_band": {
            "type": "object",
            "properties": {
              "minimum_minuten": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "maximum_minuten": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "bron": {
                "type": "string",
                "enum": [
                  "vaste_fallback",
                  "historisch"
                ]
              },
              "vergelijkbare_geslaagde_runs": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "schattingsbeleid_versie": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "cohort_versie": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              }
            },
            "required": [
              "minimum_minuten",
              "maximum_minuten",
              "bron",
              "vergelijkbare_geslaagde_runs",
              "schattingsbeleid_versie",
              "cohort_versie"
            ],
            "additionalProperties": false,
            "description": "Maximum ten minste minimum. Historische band pas bij minstens30 vergelijkbare geslaagde runs binnen hetzelfde cohort; anders expliciete fallback. Geen exacte voltooiingsbelofte."
          },
          "actieve_tijd_band": {
            "type": "object",
            "properties": {
              "minimum_minuten": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "maximum_minuten": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "bron": {
                "type": "string",
                "enum": [
                  "vaste_fallback",
                  "historisch"
                ]
              },
              "vergelijkbare_geslaagde_runs": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "schattingsbeleid_versie": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "cohort_versie": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              }
            },
            "required": [
              "minimum_minuten",
              "maximum_minuten",
              "bron",
              "vergelijkbare_geslaagde_runs",
              "schattingsbeleid_versie",
              "cohort_versie"
            ],
            "additionalProperties": false,
            "description": "Maximum ten minste minimum. Historische band pas bij minstens30 vergelijkbare geslaagde runs binnen hetzelfde cohort; anders expliciete fallback. Geen exacte voltooiingsbelofte."
          },
          "server_berekend_op": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "fase",
          "wachttijd_band",
          "actieve_tijd_band",
          "server_berekend_op"
        ],
        "additionalProperties": false
      },
      "UitvoeringHistorischeRaming": {
        "type": "object",
        "properties": {
          "bedrag_centen": {
            "const": 0
          },
          "valuta": {
            "const": "EUR"
          },
          "credit_eenheden": {
            "type": "integer",
            "minimum": 1,
            "maximum": 9007199254740991
          },
          "credit_contract_versie": {
            "type": "string",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
          },
          "credit_contract_revisie": {
            "type": "integer",
            "minimum": 1,
            "maximum": 9007199254740991
          },
          "credit_eur": {
            "const": 0.001
          },
          "tarief_bron": {
            "type": "string",
            "enum": [
              "historisch_p75_90_dagen",
              "actief_rapporttarief_fallback"
            ]
          },
          "tarief_referentie": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "tarief_geldig_vanaf": {
            "type": "string",
            "format": "date-time"
          },
          "modelniveau": {
            "type": "string",
            "enum": [
              "basis",
              "standaard",
              "max"
            ]
          },
          "verwerkingsvariant": {
            "type": "string",
            "enum": [
              "basis",
              "zorgvuldig",
              "optimaal"
            ]
          },
          "schatting_steekproef": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          }
        },
        "required": [
          "bedrag_centen",
          "valuta",
          "credit_eenheden",
          "credit_contract_versie",
          "credit_contract_revisie",
          "credit_eur",
          "tarief_bron",
          "tarief_referentie",
          "tarief_geldig_vanaf",
          "modelniveau",
          "verwerkingsvariant",
          "schatting_steekproef"
        ],
        "additionalProperties": false,
        "description": "Bestaande202-snapshotraming voor de rapportcontext; nul afzonderlijke eurofactuur. Geen actuele offerte-/presentatieprijs, reservering of geboekte klantcredits. Native providerkosten en settlement bepalen later de werkelijke kosten. Fallback steekproef0, historische P75 minimaal1."
      },
      "UitvoeringPrivacybewijs": {
        "type": "object",
        "properties": {
          "bewijsversie_id": {
            "type": "string"
          },
          "organization_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "scope_code": {
            "type": "string"
          },
          "provider_code": {
            "type": "string"
          },
          "verwerkingsroute_code": {
            "type": "string"
          },
          "bewijs_hash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          }
        },
        "required": [
          "bewijsversie_id",
          "organization_id",
          "scope_code",
          "provider_code",
          "verwerkingsroute_code",
          "bewijs_hash"
        ],
        "additionalProperties": false
      },
      "UitvoeringBronversie": {
        "type": "object",
        "properties": {
          "bron_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "bron_versie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "sha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "technisch_leesbaar": {
            "type": "boolean"
          },
          "vaste_einddatum": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "bron_id",
          "bron_versie_id",
          "sha256",
          "technisch_leesbaar",
          "vaste_einddatum"
        ],
        "additionalProperties": false
      },
      "UitvoeringBronmanifestItem": {
        "type": "object",
        "properties": {
          "bron_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "bron_versie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "sha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "technisch_leesbaar": {
            "type": "boolean"
          },
          "vaste_einddatum": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          },
          "soort": {
            "type": "string",
            "enum": [
              "origineel_document",
              "gesprek",
              "menselijke_bronhandeling"
            ]
          },
          "status": {
            "type": "string"
          },
          "vastgelegd_op": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "bron_id",
          "bron_versie_id",
          "sha256",
          "technisch_leesbaar",
          "vaste_einddatum",
          "soort",
          "status",
          "vastgelegd_op"
        ],
        "additionalProperties": false
      },
      "UitvoeringBronbevestigingInvoer": {
        "type": "object",
        "properties": {
          "voorbereidingsdocument_versie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "punt_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "pattern": "\\S"
          },
          "handeling": {
            "type": "string",
            "enum": [
              "bevestigd",
              "aangepast",
              "verworpen"
            ]
          },
          "aangepaste_waarde": {
            "$ref": "#/components/schemas/JsonWaarde"
          },
          "bronversie": {
            "$ref": "#/components/schemas/UitvoeringBronversie"
          }
        },
        "required": [
          "voorbereidingsdocument_versie_id",
          "punt_id",
          "handeling",
          "bronversie"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "properties": {
                "handeling": {
                  "const": "aangepast"
                }
              }
            },
            "then": {
              "required": [
                "aangepaste_waarde"
              ],
              "properties": {
                "aangepaste_waarde": {
                  "not": {
                    "type": "null"
                  }
                }
              }
            },
            "else": {
              "properties": {
                "aangepaste_waarde": {
                  "type": "null"
                }
              }
            }
          }
        ],
        "description": "Domein laat iedere niet-null JSONwaarde toe bij aangepast. De bronadapter verifieert actuele voorbereidende versie, punt en exacte bronhash voordat dit bewijs wordt bewaard."
      },
      "UitvoeringBronhandeling": {
        "type": "object",
        "properties": {
          "voorbereidingsdocument_versie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "punt_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "pattern": "\\S"
          },
          "handeling": {
            "type": "string",
            "enum": [
              "bevestigd",
              "aangepast",
              "verworpen"
            ]
          },
          "aangepaste_waarde": {
            "$ref": "#/components/schemas/JsonWaarde"
          },
          "bronversie": {
            "$ref": "#/components/schemas/UitvoeringBronversie"
          },
          "vastgelegd_op": {
            "type": "string",
            "format": "date-time"
          },
          "actor_ref_sha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          }
        },
        "required": [
          "voorbereidingsdocument_versie_id",
          "punt_id",
          "handeling",
          "aangepaste_waarde",
          "bronversie",
          "vastgelegd_op",
          "actor_ref_sha256"
        ],
        "additionalProperties": false
      },
      "UitvoeringBronstijl": {
        "type": "object",
        "properties": {
          "stijlprofiel_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versie_nummer": {
            "type": "integer",
            "minimum": 1,
            "maximum": 9007199254740991
          },
          "versie_hash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          }
        },
        "required": [
          "stijlprofiel_id",
          "versie_id",
          "versie_nummer",
          "versie_hash"
        ],
        "additionalProperties": false
      },
      "UitvoeringDocumentformatInvoer": {
        "type": "object",
        "properties": {
          "formatBron": {
            "const": "universeel"
          },
          "registryVersie": {
            "const": "rapportly-archetypen-v1"
          },
          "archetypeKey": {
            "type": "string",
            "enum": [
              "raster",
              "nabij",
              "werkstaat",
              "dossier"
            ]
          },
          "documenttype": {
            "const": "rapport"
          }
        },
        "required": [
          "formatBron",
          "registryVersie",
          "archetypeKey",
          "documenttype"
        ],
        "additionalProperties": false
      },
      "UitvoeringDocumentformat": {
        "type": "object",
        "properties": {
          "formatBron": {
            "const": "universeel"
          },
          "registryVersie": {
            "const": "rapportly-archetypen-v1"
          },
          "archetypeKey": {
            "type": "string",
            "enum": [
              "raster",
              "nabij",
              "werkstaat",
              "dossier"
            ]
          },
          "documenttype": {
            "const": "rapport"
          },
          "selectieModus": {
            "type": "string",
            "enum": [
              "document",
              "organisatie",
              "automatisch"
            ]
          },
          "selectieReden": {
            "type": "string",
            "enum": [
              "expliciete_documentkeuze",
              "organisatievoorkeur",
              "documenttype",
              "stijlsignaal"
            ]
          },
          "rendererVersie": {
            "const": "rapportly-universeel-v1"
          }
        },
        "required": [
          "formatBron",
          "registryVersie",
          "archetypeKey",
          "documenttype",
          "selectieModus",
          "selectieReden",
          "rendererVersie"
        ],
        "additionalProperties": false
      },
      "UitvoeringBronrapport": {
        "type": "object",
        "properties": {
          "schema_versie": {
            "const": 1
          },
          "rapport_versie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "dossier_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versie_nummer": {
            "type": "integer",
            "minimum": 1,
            "maximum": 9007199254740991
          },
          "stijlprofiel": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/UitvoeringBronstijl"
              },
              {
                "type": "null"
              }
            ]
          },
          "documentformat_selectie": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/UitvoeringDocumentformat"
              },
              {
                "type": "null"
              }
            ]
          },
          "output_identiteit_sha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          }
        },
        "required": [
          "schema_versie",
          "rapport_versie_id",
          "dossier_id",
          "versie_nummer",
          "stijlprofiel",
          "documentformat_selectie",
          "output_identiteit_sha256"
        ],
        "additionalProperties": false,
        "description": "Onveranderlijke inhoudsvrije projectie van klaar Rapportly-rapport. Opslagpaden zitten in de serverhash, niet in deze publieke projectie."
      },
      "UitvoeringWorkflowprofiel": {
        "type": "object",
        "properties": {
          "workflowprofiel_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versie_nummer": {
            "type": "integer",
            "minimum": 1,
            "maximum": 9007199254740991
          },
          "versie_hash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "payload_hash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "gekoppelde_stijlprofiel_ids": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            },
            "uniqueItems": true
          },
          "instellingen": {
            "$ref": "#/components/schemas/Procesvoorstel"
          }
        },
        "required": [
          "workflowprofiel_id",
          "versie_id",
          "versie_nummer",
          "versie_hash",
          "payload_hash",
          "gekoppelde_stijlprofiel_ids",
          "instellingen"
        ],
        "additionalProperties": false
      },
      "UitvoeringOrganisatieInstructie": {
        "type": "object",
        "properties": {
          "organisatie_instructie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versie_nummer": {
            "type": "integer",
            "minimum": 1,
            "maximum": 9007199254740991
          },
          "versie_hash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "payload_hash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "tekst": {
            "type": "string"
          }
        },
        "required": [
          "organisatie_instructie_id",
          "versie_id",
          "versie_nummer",
          "versie_hash",
          "payload_hash",
          "tekst"
        ],
        "additionalProperties": false
      },
      "WorkflowProductiestijlInvoer": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "modus": {
                "const": "neutraal"
              }
            },
            "required": [
              "modus"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "modus": {
                "const": "profiel"
              },
              "profiel_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "versie_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              }
            },
            "required": [
              "modus",
              "profiel_id",
              "versie_id"
            ],
            "additionalProperties": false
          }
        ]
      },
      "WorkflowPresentatieOptiesInvoer": {
        "type": "object",
        "properties": {
          "max_dias": {
            "type": "integer",
            "minimum": 1,
            "maximum": 200
          },
          "sprekersnotities": {
            "type": "boolean"
          },
          "secties": {
            "type": "boolean"
          },
          "grafieken": {
            "type": "boolean"
          }
        },
        "required": [
          "sprekersnotities",
          "secties",
          "grafieken"
        ],
        "additionalProperties": false,
        "description": "Canonieke max_dias-invoer; native normalisatie begrenst de flexibele diawens."
      },
      "WorkflowPresentatieOpties": {
        "type": "object",
        "properties": {
          "max_dias": {
            "type": "integer",
            "minimum": 1,
            "maximum": 200
          },
          "sprekersnotities": {
            "type": "boolean"
          },
          "secties": {
            "type": "boolean"
          },
          "grafieken": {
            "type": "boolean"
          }
        },
        "required": [
          "sprekersnotities",
          "secties",
          "grafieken"
        ],
        "additionalProperties": false
      },
      "WorkflowHandmatigeOfferteInvoer": {
        "type": "object",
        "properties": {
          "schemaVersion": {
            "const": 2
          },
          "subject": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "conditions": {
            "$ref": "#/components/schemas/WorkflowOfferteVoorwaardenInvoer"
          },
          "lines": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkflowOfferteHandregel"
            },
            "minItems": 1,
            "maxItems": 50
          }
        },
        "required": [
          "schemaVersion",
          "subject",
          "conditions",
          "lines"
        ],
        "additionalProperties": false
      },
      "WorkflowProductiekeuzeInvoer": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "documenttype": {
                "const": "rapport"
              },
              "begeleidende_brief": {
                "type": "boolean"
              }
            },
            "required": [
              "documenttype"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "documenttype": {
                "const": "presentatie"
              },
              "stijl": {
                "$ref": "#/components/schemas/WorkflowProductiestijlInvoer"
              },
              "presentatie_opties": {
                "$ref": "#/components/schemas/WorkflowPresentatieOptiesInvoer"
              }
            },
            "required": [
              "documenttype",
              "stijl",
              "presentatie_opties"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "documenttype": {
                "const": "offerte"
              },
              "stijl": {
                "$ref": "#/components/schemas/WorkflowProductiestijlInvoer"
              },
              "offerte_invoer": {
                "$ref": "#/components/schemas/WorkflowHandmatigeOfferteInvoer"
              }
            },
            "required": [
              "documenttype",
              "stijl",
              "offerte_invoer"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "documenttype": {
                "const": "offerte"
              },
              "stijl": {
                "$ref": "#/components/schemas/WorkflowProductiestijlInvoer"
              },
              "offerte_regelbewijs_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              }
            },
            "required": [
              "documenttype",
              "stijl",
              "offerte_regelbewijs_id"
            ],
            "additionalProperties": false
          }
        ],
        "description": "Alleen rapport mag begeleidende_brief bevatten, strikt boolean, standaardfalse. Formulierbron weigerttrue. Presentatie/offerte hebben eigen expliciete neutrale of actieve profielstijl. Handmatige offerte en regelbewijs-ID zijn wederzijds exclusief. Geen taalvervolg/model/provider/prijsvelden."
      },
      "WorkflowDoelRenderIdentiteitGedeeltelijk": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "product_context": {
                "const": "rapportly"
              },
              "stijlprofiel_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "stijlprofiel_naam": {
                "type": "string"
              },
              "soort": {
                "type": "string",
                "enum": [
                  "offerte",
                  "presentatie"
                ]
              },
              "stijlprofiel_versie_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "stijlprofiel_versie": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9007199254740991
              },
              "extractor_versie": {
                "type": "string"
              },
              "renderer_versie": {
                "type": "string"
              },
              "voorbeeld_manifest": {
                "$ref": "#/components/schemas/JsonWaarde",
                "description": "Ongewijzigde voorbeeld_manifest_json uit geselecteerde versie. Historische en enginegebonden nested varianten blijven schema-open."
              },
              "herkenning": {
                "type": "object",
                "properties": {
                  "herkend": {
                    "$ref": "#/components/schemas/JsonWaarde"
                  },
                  "niet_herkend": {
                    "$ref": "#/components/schemas/JsonWaarde"
                  },
                  "betrouwbaarheid": {
                    "$ref": "#/components/schemas/JsonWaarde",
                    "description": "Selectie vereist betrouwbaar:true; volledige historische opslagvorm nog open."
                  }
                },
                "required": [
                  "herkend",
                  "niet_herkend",
                  "betrouwbaarheid"
                ],
                "additionalProperties": false
              },
              "presentatie_opties": {
                "$ref": "#/components/schemas/WorkflowPresentatieOpties"
              },
              "template_engine": {
                "const": "profiel_v1"
              }
            },
            "required": [
              "product_context",
              "stijlprofiel_id",
              "stijlprofiel_naam",
              "soort",
              "stijlprofiel_versie_id",
              "stijlprofiel_versie",
              "extractor_versie",
              "renderer_versie",
              "voorbeeld_manifest",
              "herkenning",
              "template_engine"
            ],
            "additionalProperties": false,
            "allOf": [
              {
                "if": {
                  "properties": {
                    "soort": {
                      "const": "presentatie"
                    }
                  }
                },
                "then": {
                  "required": [
                    "presentatie_opties"
                  ]
                },
                "else": {
                  "not": {
                    "required": [
                      "presentatie_opties"
                    ]
                  }
                }
              }
            ]
          },
          {
            "type": "object",
            "properties": {
              "product_context": {
                "const": "rapportly"
              },
              "stijlprofiel_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "stijlprofiel_naam": {
                "type": "string"
              },
              "soort": {
                "type": "string",
                "enum": [
                  "offerte",
                  "presentatie"
                ]
              },
              "stijlprofiel_versie_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "stijlprofiel_versie": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9007199254740991
              },
              "extractor_versie": {
                "const": "bronstijl-pdf-extractie-v1"
              },
              "renderer_versie": {
                "const": "bronstijl-pdf-v1"
              },
              "voorbeeld_manifest": {
                "$ref": "#/components/schemas/JsonWaarde",
                "description": "Ongewijzigde voorbeeld_manifest_json uit geselecteerde versie. Historische en enginegebonden nested varianten blijven schema-open."
              },
              "herkenning": {
                "type": "object",
                "properties": {
                  "herkend": {
                    "$ref": "#/components/schemas/JsonWaarde"
                  },
                  "niet_herkend": {
                    "$ref": "#/components/schemas/JsonWaarde"
                  },
                  "betrouwbaarheid": {
                    "$ref": "#/components/schemas/JsonWaarde",
                    "description": "Selectie vereist betrouwbaar:true; volledige historische opslagvorm nog open."
                  }
                },
                "required": [
                  "herkend",
                  "niet_herkend",
                  "betrouwbaarheid"
                ],
                "additionalProperties": false
              },
              "presentatie_opties": {
                "$ref": "#/components/schemas/WorkflowPresentatieOpties"
              },
              "template_engine": {
                "const": "pdf_bron_v1"
              },
              "template_schema_versie": {
                "const": 1
              },
              "template_manifest_sha256": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "template_artifact_sha256": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              }
            },
            "required": [
              "product_context",
              "stijlprofiel_id",
              "stijlprofiel_naam",
              "soort",
              "stijlprofiel_versie_id",
              "stijlprofiel_versie",
              "extractor_versie",
              "renderer_versie",
              "voorbeeld_manifest",
              "herkenning",
              "template_engine",
              "template_schema_versie",
              "template_manifest_sha256",
              "template_artifact_sha256"
            ],
            "additionalProperties": false,
            "allOf": [
              {
                "if": {
                  "properties": {
                    "soort": {
                      "const": "presentatie"
                    }
                  }
                },
                "then": {
                  "required": [
                    "presentatie_opties"
                  ]
                },
                "else": {
                  "not": {
                    "required": [
                      "presentatie_opties"
                    ]
                  }
                }
              }
            ]
          },
          {
            "type": "object",
            "properties": {
              "product_context": {
                "const": "rapportly"
              },
              "stijlprofiel_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "stijlprofiel_naam": {
                "type": "string"
              },
              "soort": {
                "type": "string",
                "enum": [
                  "offerte",
                  "presentatie"
                ]
              },
              "stijlprofiel_versie_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "stijlprofiel_versie": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9007199254740991
              },
              "extractor_versie": {
                "const": "voorbeeldprofiel-v2-docx-native"
              },
              "renderer_versie": {
                "const": "voorbeeldprofiel-render-v2-docx-native"
              },
              "voorbeeld_manifest": {
                "$ref": "#/components/schemas/JsonWaarde",
                "description": "Ongewijzigde voorbeeld_manifest_json uit geselecteerde versie. Historische en enginegebonden nested varianten blijven schema-open."
              },
              "herkenning": {
                "type": "object",
                "properties": {
                  "herkend": {
                    "$ref": "#/components/schemas/JsonWaarde"
                  },
                  "niet_herkend": {
                    "$ref": "#/components/schemas/JsonWaarde"
                  },
                  "betrouwbaarheid": {
                    "$ref": "#/components/schemas/JsonWaarde",
                    "description": "Selectie vereist betrouwbaar:true; volledige historische opslagvorm nog open."
                  }
                },
                "required": [
                  "herkend",
                  "niet_herkend",
                  "betrouwbaarheid"
                ],
                "additionalProperties": false
              },
              "presentatie_opties": {
                "$ref": "#/components/schemas/WorkflowPresentatieOpties"
              },
              "template_engine": {
                "const": "docx_native_v1"
              },
              "template_schema_versie": {
                "const": 1
              },
              "template_manifest_sha256": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "template_artifact_sha256": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "template_markdown_capaciteiten": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/WorkflowWordMarkdownCapaciteiten"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "documentformat_selectie": {
                "type": "object",
                "properties": {
                  "formatBron": {
                    "const": "universeel"
                  },
                  "registryVersie": {
                    "const": "rapportly-archetypen-v1"
                  },
                  "archetypeKey": {
                    "type": "string",
                    "enum": [
                      "raster",
                      "nabij",
                      "werkstaat",
                      "dossier"
                    ]
                  },
                  "documenttype": {
                    "const": "offerte"
                  },
                  "selectieModus": {
                    "type": "string",
                    "enum": [
                      "document",
                      "organisatie",
                      "automatisch"
                    ]
                  },
                  "selectieReden": {
                    "type": "string",
                    "enum": [
                      "expliciete_documentkeuze",
                      "organisatievoorkeur",
                      "documenttype",
                      "stijlsignaal"
                    ]
                  },
                  "rendererVersie": {
                    "const": "rapportly-universeel-v1"
                  }
                },
                "required": [
                  "formatBron",
                  "registryVersie",
                  "archetypeKey",
                  "documenttype",
                  "selectieModus",
                  "selectieReden",
                  "rendererVersie"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "product_context",
              "stijlprofiel_id",
              "stijlprofiel_naam",
              "soort",
              "stijlprofiel_versie_id",
              "stijlprofiel_versie",
              "extractor_versie",
              "renderer_versie",
              "voorbeeld_manifest",
              "herkenning",
              "template_engine",
              "template_schema_versie",
              "template_manifest_sha256",
              "template_artifact_sha256",
              "template_markdown_capaciteiten"
            ],
            "additionalProperties": false,
            "allOf": [
              {
                "if": {
                  "properties": {
                    "soort": {
                      "const": "presentatie"
                    }
                  }
                },
                "then": {
                  "required": [
                    "presentatie_opties"
                  ]
                },
                "else": {
                  "not": {
                    "required": [
                      "presentatie_opties"
                    ]
                  }
                }
              },
              {
                "if": {
                  "required": [
                    "documentformat_selectie"
                  ]
                },
                "then": {
                  "properties": {
                    "soort": {
                      "const": "offerte"
                    }
                  }
                }
              }
            ]
          },
          {
            "type": "object",
            "properties": {
              "product_context": {
                "const": "rapportly"
              },
              "stijlprofiel_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "stijlprofiel_naam": {
                "type": "string"
              },
              "soort": {
                "type": "string",
                "enum": [
                  "offerte",
                  "presentatie"
                ]
              },
              "stijlprofiel_versie_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "stijlprofiel_versie": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9007199254740991
              },
              "extractor_versie": {
                "const": "voorbeeldprofiel-v3-pptx-native"
              },
              "renderer_versie": {
                "const": "voorbeeldprofiel-render-v3-pptx-native"
              },
              "voorbeeld_manifest": {
                "$ref": "#/components/schemas/JsonWaarde",
                "description": "Ongewijzigde voorbeeld_manifest_json uit geselecteerde versie. Historische en enginegebonden nested varianten blijven schema-open."
              },
              "herkenning": {
                "type": "object",
                "properties": {
                  "herkend": {
                    "$ref": "#/components/schemas/JsonWaarde"
                  },
                  "niet_herkend": {
                    "$ref": "#/components/schemas/JsonWaarde"
                  },
                  "betrouwbaarheid": {
                    "$ref": "#/components/schemas/JsonWaarde",
                    "description": "Selectie vereist betrouwbaar:true; volledige historische opslagvorm nog open."
                  }
                },
                "required": [
                  "herkend",
                  "niet_herkend",
                  "betrouwbaarheid"
                ],
                "additionalProperties": false
              },
              "presentatie_opties": {
                "$ref": "#/components/schemas/WorkflowPresentatieOpties"
              },
              "template_engine": {
                "const": "pptx_native_v1"
              },
              "template_schema_versie": {
                "const": 1
              },
              "template_manifest_sha256": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "template_artifact_sha256": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "template_layoutcapaciteiten": {
                "$ref": "#/components/schemas/WorkflowPresentatieLayoutcapaciteiten"
              }
            },
            "required": [
              "product_context",
              "stijlprofiel_id",
              "stijlprofiel_naam",
              "soort",
              "stijlprofiel_versie_id",
              "stijlprofiel_versie",
              "extractor_versie",
              "renderer_versie",
              "voorbeeld_manifest",
              "herkenning",
              "template_engine",
              "template_schema_versie",
              "template_manifest_sha256",
              "template_artifact_sha256",
              "template_layoutcapaciteiten"
            ],
            "additionalProperties": false,
            "allOf": [
              {
                "if": {
                  "properties": {
                    "soort": {
                      "const": "presentatie"
                    }
                  }
                },
                "then": {
                  "required": [
                    "presentatie_opties"
                  ]
                },
                "else": {
                  "not": {
                    "required": [
                      "presentatie_opties"
                    ]
                  }
                }
              }
            ]
          }
        ],
        "description": "Vier werkelijke engine-enveloppen uit bouwRenderIdentiteit, met gesloten topniveau en expliciete Word-/PPTX-capaciteiten. De oorspronkelijke naam Gedeeltelijk blijft bewust: voorbeeld_manifest en herkenning komen rechtstreeks uit versieopslag en hun volledige historische schemas zijn nog open. Een Word-manifestfallback kan template_markdown_capaciteiten:null produceren; dit bewijst geen rendergeschiktheid. Profiel- en versie-ID, soort en volledige identiteit worden opnieuw aan de vastgezette workflowkeuze getoetst. Geen cliëntinvoer voor provider, engine of opslagpad."
      },
      "WorkflowOpgeslagenBewijsInvoer": {
        "type": "object",
        "properties": {
          "schemaVersion": {
            "const": 2
          },
          "conceptId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "subject": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "conditions": {
            "$ref": "#/components/schemas/WorkflowOfferteVoorwaardenInvoer"
          },
          "catalog": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/WorkflowOfferteCatalogus"
              },
              {
                "type": "null"
              }
            ]
          },
          "workflow": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/WorkflowOfferteWerkprofielInvoer"
              },
              {
                "type": "null"
              }
            ]
          },
          "lines": {
            "type": "array",
            "items": {
              "oneOf": [
                {
                  "$ref": "#/components/schemas/WorkflowOfferteHandregel"
                },
                {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "source": {
                      "const": "catalog"
                    },
                    "confirmationToken": {
                      "type": "string",
                      "pattern": "^workflow-bewijs:[a-f0-9]{64}$",
                      "description": "Interne SHA-alias; geen geldig native ondertekend token en buiten deze serverbinding onbruikbaar."
                    }
                  },
                  "required": [
                    "id",
                    "source",
                    "confirmationToken"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "source": {
                      "const": "route"
                    },
                    "confirmationToken": {
                      "type": "string",
                      "pattern": "^workflow-bewijs:[a-f0-9]{64}$",
                      "description": "Interne SHA-alias; geen geldig native ondertekend token en buiten deze serverbinding onbruikbaar."
                    }
                  },
                  "required": [
                    "source",
                    "confirmationToken"
                  ],
                  "additionalProperties": false
                }
              ]
            },
            "minItems": 1,
            "maxItems": 50,
            "contains": {
              "type": "object",
              "properties": {
                "source": {
                  "type": "string",
                  "enum": [
                    "catalog",
                    "route"
                  ]
                }
              },
              "required": [
                "source"
              ]
            }
          }
        },
        "required": [
          "schemaVersion",
          "conceptId",
          "subject",
          "conditions",
          "lines"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "properties": {
                "lines": {
                  "contains": {
                    "type": "object",
                    "properties": {
                      "source": {
                        "const": "catalog"
                      }
                    },
                    "required": [
                      "source"
                    ]
                  }
                }
              }
            },
            "then": {
              "required": [
                "catalog"
              ],
              "properties": {
                "catalog": {
                  "$ref": "#/components/schemas/WorkflowOfferteCatalogus"
                }
              }
            }
          }
        ],
        "description": "Canonieke opgeslagen bewijsinvoer met onbruikbare interne aliases. Ruimere oorspronkelijke coercievormen/genegeerde regelvelden nog open."
      },
      "WorkflowProductiekeuzeVast": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "schema_versie": {
                "const": 1
              },
              "bronrapport_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "keuze_sha256": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "documenttype": {
                "const": "rapport"
              },
              "begeleidende_brief": {
                "type": "boolean"
              }
            },
            "required": [
              "schema_versie",
              "bronrapport_id",
              "keuze_sha256",
              "documenttype"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "schema_versie": {
                "const": 1
              },
              "bronrapport_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "keuze_sha256": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "documenttype": {
                "const": "presentatie"
              },
              "stijl": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "modus": {
                        "const": "neutraal"
                      }
                    },
                    "required": [
                      "modus"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "modus": {
                        "const": "profiel"
                      },
                      "profiel_id": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      "versie_id": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      "render_identiteit": {
                        "$ref": "#/components/schemas/WorkflowDoelRenderIdentiteitGedeeltelijk"
                      },
                      "identiteit_sha256": {
                        "type": "string",
                        "pattern": "^[a-f0-9]{64}$"
                      }
                    },
                    "required": [
                      "modus",
                      "profiel_id",
                      "versie_id",
                      "render_identiteit",
                      "identiteit_sha256"
                    ],
                    "additionalProperties": false
                  }
                ]
              },
              "presentatie_opties": {
                "$ref": "#/components/schemas/WorkflowPresentatieOpties"
              }
            },
            "required": [
              "schema_versie",
              "bronrapport_id",
              "keuze_sha256",
              "documenttype",
              "stijl",
              "presentatie_opties"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "schema_versie": {
                "const": 1
              },
              "bronrapport_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "keuze_sha256": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "documenttype": {
                "const": "offerte"
              },
              "stijl": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "modus": {
                        "const": "neutraal"
                      }
                    },
                    "required": [
                      "modus"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "modus": {
                        "const": "profiel"
                      },
                      "profiel_id": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      "versie_id": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      "render_identiteit": {
                        "$ref": "#/components/schemas/WorkflowDoelRenderIdentiteitGedeeltelijk"
                      },
                      "identiteit_sha256": {
                        "type": "string",
                        "pattern": "^[a-f0-9]{64}$"
                      }
                    },
                    "required": [
                      "modus",
                      "profiel_id",
                      "versie_id",
                      "render_identiteit",
                      "identiteit_sha256"
                    ],
                    "additionalProperties": false
                  }
                ]
              },
              "offerte_invoer": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/WorkflowHandmatigeOfferteInvoer"
                  },
                  {
                    "$ref": "#/components/schemas/WorkflowOpgeslagenBewijsInvoer"
                  }
                ]
              },
              "offerte_snapshot": {
                "$ref": "#/components/schemas/WorkflowOfferteSnapshot"
              },
              "offerte_regelbewijs_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "offerte_bewijs_sha256": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              }
            },
            "required": [
              "schema_versie",
              "bronrapport_id",
              "keuze_sha256",
              "documenttype",
              "stijl",
              "offerte_invoer",
              "offerte_snapshot"
            ],
            "additionalProperties": false,
            "dependentRequired": {
              "offerte_regelbewijs_id": [
                "offerte_bewijs_sha256"
              ],
              "offerte_bewijs_sha256": [
                "offerte_regelbewijs_id"
              ]
            }
          }
        ],
        "description": "Onveranderlijke serverkeuze met hash. Canonieke opgeslagen offerte-invoer expliciet getypeerd; gebruik de native offertesnapshot voor prijsreview. Interne aliases verlenen geen tokenbevoegdheid."
      },
      "UitvoeringTransitie": {
        "type": "object",
        "properties": {
          "van_fase": {
            "type": "string",
            "enum": [
              "voorbereiding",
              "gesprek",
              "concept",
              "goedkeuring",
              "aanvulling",
              "definitief"
            ]
          },
          "naar_fase": {
            "type": "string",
            "enum": [
              "voorbereiding",
              "gesprek",
              "concept",
              "goedkeuring",
              "aanvulling",
              "definitief"
            ]
          },
          "reden_code": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 100
              },
              {
                "type": "null"
              }
            ]
          },
          "privacybewijs": {
            "$ref": "#/components/schemas/UitvoeringPrivacybewijs"
          },
          "aangemaakt_op": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "van_fase",
          "naar_fase",
          "reden_code",
          "privacybewijs",
          "aangemaakt_op"
        ],
        "additionalProperties": false
      },
      "UitvoeringSnapshot": {
        "type": "object",
        "properties": {
          "schema_versie": {
            "const": 2
          },
          "organization_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "uitvoering_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "rapport_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versie_nummer": {
            "type": "integer",
            "minimum": 1,
            "maximum": 9007199254740991
          },
          "vorige_versie_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "mutatie_soort": {
            "type": "string",
            "enum": [
              "aangemaakt",
              "run_opdracht",
              "broncontrole",
              "bronbevestiging",
              "transitie"
            ]
          },
          "stijlprofiel": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/UitvoeringBronstijl"
              },
              {
                "type": "null"
              }
            ]
          },
          "rapportversie": {
            "$ref": "#/components/schemas/UitvoeringBronrapport"
          },
          "workflowprofiel": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/UitvoeringWorkflowprofiel"
              },
              {
                "type": "null"
              }
            ]
          },
          "organisatie_instructie": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/UitvoeringOrganisatieInstructie"
              },
              {
                "type": "null"
              }
            ]
          },
          "run_opdracht": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "tekst": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 20000,
                    "pattern": "\\S"
                  }
                },
                "required": [
                  "tekst"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "keuzeadvies": {
            "$ref": "#/components/schemas/UitvoeringKeuzeadviesVast"
          },
          "uitvoeringskeuze": {
            "$ref": "#/components/schemas/UitvoeringKeuzeVast"
          },
          "afwijkingsbevestiging": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/UitvoeringAfwijkingsbevestiging"
              },
              {
                "type": "null"
              }
            ]
          },
          "prijsgevolg": {
            "$ref": "#/components/schemas/UitvoeringHistorischeRaming"
          },
          "privacybewijs": {
            "$ref": "#/components/schemas/UitvoeringPrivacybewijs"
          },
          "outputdatum": {
            "type": "string",
            "format": "date"
          },
          "inhoudsretentie": {
            "type": "object",
            "properties": {
              "policy_code": {
                "const": "p15-c-v1"
              },
              "status": {
                "const": "actief"
              },
              "bewaren_tot": {
                "type": "string",
                "format": "date"
              },
              "archief_tot": {
                "type": "null"
              }
            },
            "required": [
              "policy_code",
              "status",
              "bewaren_tot",
              "archief_tot"
            ],
            "additionalProperties": false
          },
          "geldigheid": {
            "type": "object",
            "properties": {
              "relatieve_geldigheid_dagen": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "geldig_tot": {
                "type": "string",
                "format": "date"
              },
              "beperkende_bronversies": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/UitvoeringBronversie"
                }
              }
            },
            "required": [
              "relatieve_geldigheid_dagen",
              "geldig_tot",
              "beperkende_bronversies"
            ],
            "additionalProperties": false
          },
          "bronmanifest": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UitvoeringBronmanifestItem"
            }
          },
          "bronhandelingen": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UitvoeringBronhandeling"
            }
          },
          "goedkeuring": {
            "type": "null"
          },
          "inhoud_sha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "bronmanifest_sha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "voortgang": {
            "$ref": "#/components/schemas/UitvoeringVoortgang"
          },
          "snapshot_sha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "catalogus_selectie": {
            "type": "object",
            "properties": {
              "catalogus_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "catalogus_versie_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "catalogus_versie_nummer": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9007199254740991
              },
              "catalogus_etag": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              }
            },
            "required": [
              "catalogus_id",
              "catalogus_versie_id",
              "catalogus_versie_nummer",
              "catalogus_etag"
            ],
            "additionalProperties": false
          },
          "documentformat_selectie": {
            "$ref": "#/components/schemas/UitvoeringDocumentformat"
          },
          "productiekeuze": {
            "$ref": "#/components/schemas/WorkflowProductiekeuzeVast"
          },
          "broncontrole": {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "enum": [
                  "geldig",
                  "conflict"
                ]
              },
              "conflictcodes": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "gecontroleerd_op": {
                "type": "string",
                "format": "date-time"
              }
            },
            "required": [
              "status",
              "conflictcodes",
              "gecontroleerd_op"
            ],
            "additionalProperties": false
          },
          "laatste_transitie": {
            "$ref": "#/components/schemas/UitvoeringTransitie"
          }
        },
        "required": [
          "schema_versie",
          "organization_id",
          "uitvoering_id",
          "rapport_id",
          "versie_id",
          "versie_nummer",
          "vorige_versie_id",
          "mutatie_soort",
          "stijlprofiel",
          "rapportversie",
          "workflowprofiel",
          "organisatie_instructie",
          "run_opdracht",
          "keuzeadvies",
          "uitvoeringskeuze",
          "afwijkingsbevestiging",
          "prijsgevolg",
          "privacybewijs",
          "outputdatum",
          "inhoudsretentie",
          "geldigheid",
          "bronmanifest",
          "bronhandelingen",
          "goedkeuring",
          "inhoud_sha256",
          "bronmanifest_sha256",
          "voortgang",
          "snapshot_sha256"
        ],
        "additionalProperties": false,
        "description": "Huidige schema2-producentvorm, inhoud plus exacte bron-/versiehashes. Historische retentie-/goedkeuringsvarianten en enginegebonden doelstijl zijn nog schema-open. Geen bewijs dat opgeslagen inhoud onbeperkt behouden moet blijven."
      },
      "Uitvoering": {
        "type": "object",
        "properties": {
          "schema_versie": {
            "const": 2
          },
          "uitvoering_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "rapport_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "status": {
            "type": "string",
            "enum": [
              "voorbereiding",
              "gesprek",
              "concept",
              "goedkeuring",
              "aanvulling",
              "definitief"
            ]
          },
          "huidige_versie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "huidige_versie_nummer": {
            "type": "integer",
            "minimum": 1,
            "maximum": 9007199254740991
          },
          "etag": {
            "type": "string",
            "pattern": "^\"uitvoering:[a-f0-9-]{36}:[a-f0-9-]{36}:[1-9][0-9]*:[a-f0-9]{64}\"$"
          },
          "voortgang": {
            "$ref": "#/components/schemas/UitvoeringVoortgang"
          },
          "snapshot": {
            "$ref": "#/components/schemas/UitvoeringSnapshot"
          },
          "aangemaakt_op": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "schema_versie",
          "uitvoering_id",
          "rapport_id",
          "status",
          "huidige_versie_id",
          "huidige_versie_nummer",
          "etag",
          "voortgang",
          "snapshot",
          "aangemaakt_op"
        ],
        "additionalProperties": false
      },
      "UitvoeringFout": {
        "type": "object",
        "properties": {
          "error": {
            "type": "object",
            "properties": {
              "code": {
                "type": "string"
              },
              "message_key": {
                "type": "string"
              },
              "request_id": {
                "type": "string"
              },
              "velden": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "actuele_versie_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "actuele_etag": {
                "type": "string"
              }
            },
            "required": [
              "code",
              "message_key",
              "request_id",
              "velden"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "error"
        ],
        "additionalProperties": false
      },
      "WorkflowGeneratiekeuze": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "tier": {
                "type": "string",
                "enum": [
                  "basis",
                  "standaard",
                  "max"
                ]
              },
              "route": {
                "type": "string",
                "enum": [
                  "efficient",
                  "automatisch",
                  "uitgebreid"
                ]
              },
              "taalvervolg": {
                "const": false
              },
              "documenttype": {
                "const": "rapport"
              },
              "begeleidendeBrief": {
                "type": "boolean"
              }
            },
            "required": [
              "tier",
              "route",
              "taalvervolg",
              "documenttype",
              "begeleidendeBrief"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "tier": {
                "type": "string",
                "enum": [
                  "basis",
                  "standaard",
                  "max"
                ]
              },
              "route": {
                "type": "string",
                "enum": [
                  "efficient",
                  "automatisch",
                  "uitgebreid"
                ]
              },
              "taalvervolg": {
                "const": false
              },
              "documenttype": {
                "const": "presentatie"
              },
              "begeleidendeBrief": {
                "const": false
              },
              "stijl": {
                "type": "object",
                "properties": {
                  "modus": {
                    "type": "string",
                    "enum": [
                      "neutraal",
                      "profiel"
                    ]
                  },
                  "profiel_id": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "versie_id": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": [
                  "modus",
                  "profiel_id",
                  "versie_id"
                ],
                "additionalProperties": false
              },
              "presentatie_opties": {
                "$ref": "#/components/schemas/WorkflowPresentatieOpties"
              }
            },
            "required": [
              "tier",
              "route",
              "taalvervolg",
              "documenttype",
              "begeleidendeBrief",
              "stijl",
              "presentatie_opties"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "tier": {
                "type": "string",
                "enum": [
                  "basis",
                  "standaard",
                  "max"
                ]
              },
              "route": {
                "type": "string",
                "enum": [
                  "efficient",
                  "automatisch",
                  "uitgebreid"
                ]
              },
              "taalvervolg": {
                "const": false
              },
              "documenttype": {
                "const": "offerte"
              },
              "begeleidendeBrief": {
                "const": false
              },
              "stijl": {
                "type": "object",
                "properties": {
                  "modus": {
                    "type": "string",
                    "enum": [
                      "neutraal",
                      "profiel"
                    ]
                  },
                  "profiel_id": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "versie_id": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": [
                  "modus",
                  "profiel_id",
                  "versie_id"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "tier",
              "route",
              "taalvervolg",
              "documenttype",
              "begeleidendeBrief",
              "stijl"
            ],
            "additionalProperties": false
          }
        ]
      },
      "WorkflowProductiesnapshot": {
        "type": "object",
        "properties": {
          "schema_versie": {
            "const": 2
          },
          "organization_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "uitvoering_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "rapport_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versie_nummer": {
            "type": "integer",
            "minimum": 1,
            "maximum": 9007199254740991
          },
          "vorige_versie_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "mutatie_soort": {
            "type": "string",
            "enum": [
              "aangemaakt",
              "run_opdracht",
              "broncontrole",
              "bronbevestiging",
              "transitie"
            ]
          },
          "stijlprofiel": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/UitvoeringBronstijl"
              },
              {
                "type": "null"
              }
            ]
          },
          "rapportversie": {
            "$ref": "#/components/schemas/UitvoeringBronrapport"
          },
          "workflowprofiel": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/UitvoeringWorkflowprofiel"
              },
              {
                "type": "null"
              }
            ]
          },
          "organisatie_instructie": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/UitvoeringOrganisatieInstructie"
              },
              {
                "type": "null"
              }
            ]
          },
          "run_opdracht": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "tekst": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 20000,
                    "pattern": "\\S"
                  }
                },
                "required": [
                  "tekst"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "keuzeadvies": {
            "$ref": "#/components/schemas/UitvoeringKeuzeadviesVast"
          },
          "uitvoeringskeuze": {
            "$ref": "#/components/schemas/UitvoeringKeuzeVast"
          },
          "afwijkingsbevestiging": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/UitvoeringAfwijkingsbevestiging"
              },
              {
                "type": "null"
              }
            ]
          },
          "prijsgevolg": {
            "$ref": "#/components/schemas/UitvoeringHistorischeRaming"
          },
          "privacybewijs": {
            "$ref": "#/components/schemas/UitvoeringPrivacybewijs"
          },
          "outputdatum": {
            "type": "string",
            "format": "date"
          },
          "inhoudsretentie": {
            "type": "object",
            "properties": {
              "policy_code": {
                "const": "p15-c-v1"
              },
              "status": {
                "const": "actief"
              },
              "bewaren_tot": {
                "type": "string",
                "format": "date"
              },
              "archief_tot": {
                "type": "null"
              }
            },
            "required": [
              "policy_code",
              "status",
              "bewaren_tot",
              "archief_tot"
            ],
            "additionalProperties": false
          },
          "geldigheid": {
            "type": "object",
            "properties": {
              "relatieve_geldigheid_dagen": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "geldig_tot": {
                "type": "string",
                "format": "date"
              },
              "beperkende_bronversies": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/UitvoeringBronversie"
                }
              }
            },
            "required": [
              "relatieve_geldigheid_dagen",
              "geldig_tot",
              "beperkende_bronversies"
            ],
            "additionalProperties": false
          },
          "bronmanifest": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UitvoeringBronmanifestItem"
            }
          },
          "bronhandelingen": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UitvoeringBronhandeling"
            }
          },
          "goedkeuring": {
            "type": "null"
          },
          "inhoud_sha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "bronmanifest_sha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "voortgang": {
            "$ref": "#/components/schemas/UitvoeringVoortgang"
          },
          "snapshot_sha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "catalogus_selectie": {
            "type": "object",
            "properties": {
              "catalogus_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "catalogus_versie_id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "catalogus_versie_nummer": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9007199254740991
              },
              "catalogus_etag": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              }
            },
            "required": [
              "catalogus_id",
              "catalogus_versie_id",
              "catalogus_versie_nummer",
              "catalogus_etag"
            ],
            "additionalProperties": false
          },
          "documentformat_selectie": {
            "$ref": "#/components/schemas/UitvoeringDocumentformat"
          },
          "productiekeuze": {
            "$ref": "#/components/schemas/WorkflowProductiekeuzeVast"
          },
          "broncontrole": {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "enum": [
                  "geldig",
                  "conflict"
                ]
              },
              "conflictcodes": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "gecontroleerd_op": {
                "type": "string",
                "format": "date-time"
              }
            },
            "required": [
              "status",
              "conflictcodes",
              "gecontroleerd_op"
            ],
            "additionalProperties": false
          },
          "laatste_transitie": {
            "$ref": "#/components/schemas/UitvoeringTransitie"
          },
          "dossier_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          }
        },
        "required": [
          "schema_versie",
          "organization_id",
          "uitvoering_id",
          "rapport_id",
          "versie_id",
          "versie_nummer",
          "vorige_versie_id",
          "mutatie_soort",
          "stijlprofiel",
          "rapportversie",
          "workflowprofiel",
          "organisatie_instructie",
          "run_opdracht",
          "keuzeadvies",
          "uitvoeringskeuze",
          "afwijkingsbevestiging",
          "prijsgevolg",
          "privacybewijs",
          "outputdatum",
          "inhoudsretentie",
          "geldigheid",
          "bronmanifest",
          "bronhandelingen",
          "goedkeuring",
          "inhoud_sha256",
          "bronmanifest_sha256",
          "voortgang",
          "snapshot_sha256",
          "dossier_id"
        ],
        "additionalProperties": false
      },
      "MailboxConceptOntvangst": {
        "type": "object",
        "properties": {
          "aanvraag_id": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$",
            "description": "Exacte basis uit het actuele voorbeeld; de aanvraagcontrole beperkt niet tot één UUID-versie."
          },
          "provider": {
            "type": "string",
            "enum": [
              "m365",
              "gmail"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "aangemaakt",
              "onzeker",
              "gestopt"
            ]
          },
          "basis": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$",
            "description": "Exacte basis uit het actuele voorbeeld; de aanvraagcontrole beperkt niet tot één UUID-versie."
          },
          "language": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[a-zA-Z-]{2,20}$",
                "description": "Optionele bestaande taalvariant. Weglaten kiest de opgeslagen eerste klantmail; null is geen geldige aanvraagwaarde."
              },
              {
                "type": "null"
              }
            ]
          },
          "bijlagen": {
            "type": "integer",
            "minimum": 0,
            "maximum": 100
          },
          "overgeslagen": {
            "const": 0
          },
          "webLink": {
            "type": "string"
          },
          "herstel_verplicht": {
            "type": "boolean"
          },
          "verzending": {
            "const": "niet_aangevraagd"
          }
        },
        "required": [
          "aanvraag_id",
          "provider",
          "status",
          "basis",
          "language",
          "bijlagen",
          "overgeslagen",
          "webLink",
          "herstel_verplicht",
          "verzending"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "oneOf": [
              {
                "properties": {
                  "provider": {
                    "const": "m365"
                  },
                  "webLink": {
                    "const": "https://outlook.office.com/mail/drafts"
                  }
                }
              },
              {
                "properties": {
                  "provider": {
                    "const": "gmail"
                  },
                  "webLink": {
                    "const": "https://mail.google.com/mail/u/0/#drafts"
                  }
                }
              }
            ]
          },
          {
            "oneOf": [
              {
                "properties": {
                  "status": {
                    "const": "aangemaakt"
                  },
                  "herstel_verplicht": {
                    "const": false
                  }
                }
              },
              {
                "properties": {
                  "status": {
                    "type": "string",
                    "enum": [
                      "onzeker",
                      "gestopt"
                    ]
                  },
                  "herstel_verplicht": {
                    "const": true
                  }
                }
              }
            ]
          }
        ],
        "description": "Inhoudsvrije ontvangst, gebonden aan oorspronkelijke actor en API-sleutel. De vaste webLink opent de conceptenmap; geen provider-ID of specifieke concept-URL. Aangemaakt bewijst uitsluitend een opgeslagen providerconcept."
      },
      "MailboxConceptStatus": {
        "type": "object",
        "properties": {
          "versiecontrole": {
            "const": true
          },
          "basis": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$",
            "description": "Exacte basis uit het actuele voorbeeld; de aanvraagcontrole beperkt niet tot één UUID-versie."
          },
          "aanvragen": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MailboxConceptOntvangst"
            },
            "maxItems": 100
          }
        },
        "required": [
          "versiecontrole",
          "basis",
          "aanvragen"
        ],
        "additionalProperties": false,
        "description": "Actuele bronbasis plus maximaal100 nieuwste eigen ontvangsten, binnen deze selectie oplopend op aanmaaktijd. Geen paginering; historische ontvangstbasis kan afwijken van de huidige basis."
      },
      "MailboxConceptAanmaken": {
        "type": "object",
        "properties": {
          "aanvraag_id": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$",
            "description": "Exacte basis uit het actuele voorbeeld; de aanvraagcontrole beperkt niet tot één UUID-versie."
          },
          "basis": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$",
            "description": "Exacte basis uit het actuele voorbeeld; de aanvraagcontrole beperkt niet tot één UUID-versie."
          },
          "bevestigd": {
            "const": true
          },
          "language": {
            "type": "string",
            "pattern": "^[a-zA-Z-]{2,20}$",
            "description": "Optionele bestaande taalvariant. Weglaten kiest de opgeslagen eerste klantmail; null is geen geldige aanvraagwaarde."
          }
        },
        "required": [
          "aanvraag_id",
          "basis",
          "bevestigd"
        ],
        "additionalProperties": false
      },
      "MailboxConceptStoppen": {
        "type": "object",
        "properties": {
          "aanvraag_id": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$",
            "description": "Exacte basis uit het actuele voorbeeld; de aanvraagcontrole beperkt niet tot één UUID-versie."
          },
          "bevestigd": {
            "const": true
          }
        },
        "required": [
          "aanvraag_id",
          "bevestigd"
        ],
        "additionalProperties": false
      },
      "BronTaalKeuze": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "off",
                  "inherit"
                ]
              }
            },
            "required": [
              "mode"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "mode": {
                "const": "specific"
              },
              "language": {
                "type": "string",
                "pattern": "^[a-z]{2,3}$"
              }
            },
            "required": [
              "mode",
              "language"
            ],
            "additionalProperties": false
          }
        ]
      },
      "BronTaalBeleid_conversation": {
        "type": "object",
        "properties": {
          "sourceType": {
            "const": "conversation"
          },
          "sourceId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "language": {
            "type": "string"
          },
          "requestedSecondary": {
            "type": "object",
            "properties": {
              "conversationReport": {
                "$ref": "#/components/schemas/BronTaalKeuze"
              },
              "customerEmail": {
                "$ref": "#/components/schemas/BronTaalKeuze"
              },
              "followUpEmail": {
                "$ref": "#/components/schemas/BronTaalKeuze"
              }
            },
            "required": [
              "conversationReport",
              "customerEmail",
              "followUpEmail"
            ],
            "additionalProperties": false
          },
          "policyVersion": {
            "type": "integer",
            "minimum": 0
          },
          "basis": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "policyUpdatedAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "start_productie_afzonderlijk": {
            "const": true
          }
        },
        "required": [
          "sourceType",
          "sourceId",
          "language",
          "requestedSecondary",
          "policyVersion",
          "basis",
          "policyUpdatedAt",
          "start_productie_afzonderlijk"
        ],
        "additionalProperties": false
      },
      "BronTaalOntvangst_conversation": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "sourceType": {
                "const": "conversation"
              },
              "sourceId": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "language": {
                "type": "string"
              },
              "requestedSecondary": {
                "type": "object",
                "properties": {
                  "conversationReport": {
                    "$ref": "#/components/schemas/BronTaalKeuze"
                  },
                  "customerEmail": {
                    "$ref": "#/components/schemas/BronTaalKeuze"
                  },
                  "followUpEmail": {
                    "$ref": "#/components/schemas/BronTaalKeuze"
                  }
                },
                "required": [
                  "conversationReport",
                  "customerEmail",
                  "followUpEmail"
                ],
                "additionalProperties": false
              },
              "policyVersion": {
                "type": "integer",
                "minimum": 0
              },
              "basis": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "policyUpdatedAt": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "start_productie_afzonderlijk": {
                "const": true
              },
              "herhaald": {
                "const": false
              },
              "changed": {
                "type": "boolean"
              },
              "ontvangenPolicyVersion": {
                "type": "integer",
                "minimum": 0
              },
              "productie_gestart": {
                "const": false
              }
            },
            "required": [
              "sourceType",
              "sourceId",
              "language",
              "requestedSecondary",
              "policyVersion",
              "basis",
              "policyUpdatedAt",
              "start_productie_afzonderlijk",
              "herhaald",
              "changed",
              "ontvangenPolicyVersion",
              "productie_gestart"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "sourceType": {
                "const": "conversation"
              },
              "sourceId": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "language": {
                "type": "string"
              },
              "requestedSecondary": {
                "type": "object",
                "properties": {
                  "conversationReport": {
                    "$ref": "#/components/schemas/BronTaalKeuze"
                  },
                  "customerEmail": {
                    "$ref": "#/components/schemas/BronTaalKeuze"
                  },
                  "followUpEmail": {
                    "$ref": "#/components/schemas/BronTaalKeuze"
                  }
                },
                "required": [
                  "conversationReport",
                  "customerEmail",
                  "followUpEmail"
                ],
                "additionalProperties": false
              },
              "policyVersion": {
                "type": "integer",
                "minimum": 0
              },
              "basis": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "policyUpdatedAt": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "start_productie_afzonderlijk": {
                "const": true
              },
              "herhaald": {
                "const": true
              },
              "ontvangenPolicyVersion": {
                "type": "integer",
                "minimum": 0
              },
              "productie_gestart": {
                "const": false
              }
            },
            "required": [
              "sourceType",
              "sourceId",
              "language",
              "requestedSecondary",
              "policyVersion",
              "basis",
              "policyUpdatedAt",
              "start_productie_afzonderlijk",
              "herhaald",
              "ontvangenPolicyVersion",
              "productie_gestart"
            ],
            "additionalProperties": false
          }
        ]
      },
      "BronTaalBeleid_report": {
        "type": "object",
        "properties": {
          "sourceType": {
            "const": "report"
          },
          "sourceId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "language": {
            "type": "string"
          },
          "requestedSecondary": {
            "type": "object",
            "properties": {
              "report": {
                "$ref": "#/components/schemas/BronTaalKeuze"
              },
              "coverLetter": {
                "$ref": "#/components/schemas/BronTaalKeuze"
              }
            },
            "required": [
              "report",
              "coverLetter"
            ],
            "additionalProperties": false
          },
          "policyVersion": {
            "type": "integer",
            "minimum": 0
          },
          "basis": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "policyUpdatedAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "start_productie_afzonderlijk": {
            "const": true
          }
        },
        "required": [
          "sourceType",
          "sourceId",
          "language",
          "requestedSecondary",
          "policyVersion",
          "basis",
          "policyUpdatedAt",
          "start_productie_afzonderlijk"
        ],
        "additionalProperties": false
      },
      "BronTaalOntvangst_report": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "sourceType": {
                "const": "report"
              },
              "sourceId": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "language": {
                "type": "string"
              },
              "requestedSecondary": {
                "type": "object",
                "properties": {
                  "report": {
                    "$ref": "#/components/schemas/BronTaalKeuze"
                  },
                  "coverLetter": {
                    "$ref": "#/components/schemas/BronTaalKeuze"
                  }
                },
                "required": [
                  "report",
                  "coverLetter"
                ],
                "additionalProperties": false
              },
              "policyVersion": {
                "type": "integer",
                "minimum": 0
              },
              "basis": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "policyUpdatedAt": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "start_productie_afzonderlijk": {
                "const": true
              },
              "herhaald": {
                "const": false
              },
              "changed": {
                "type": "boolean"
              },
              "ontvangenPolicyVersion": {
                "type": "integer",
                "minimum": 0
              },
              "productie_gestart": {
                "const": false
              }
            },
            "required": [
              "sourceType",
              "sourceId",
              "language",
              "requestedSecondary",
              "policyVersion",
              "basis",
              "policyUpdatedAt",
              "start_productie_afzonderlijk",
              "herhaald",
              "changed",
              "ontvangenPolicyVersion",
              "productie_gestart"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "sourceType": {
                "const": "report"
              },
              "sourceId": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "language": {
                "type": "string"
              },
              "requestedSecondary": {
                "type": "object",
                "properties": {
                  "report": {
                    "$ref": "#/components/schemas/BronTaalKeuze"
                  },
                  "coverLetter": {
                    "$ref": "#/components/schemas/BronTaalKeuze"
                  }
                },
                "required": [
                  "report",
                  "coverLetter"
                ],
                "additionalProperties": false
              },
              "policyVersion": {
                "type": "integer",
                "minimum": 0
              },
              "basis": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "policyUpdatedAt": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "start_productie_afzonderlijk": {
                "const": true
              },
              "herhaald": {
                "const": true
              },
              "ontvangenPolicyVersion": {
                "type": "integer",
                "minimum": 0
              },
              "productie_gestart": {
                "const": false
              }
            },
            "required": [
              "sourceType",
              "sourceId",
              "language",
              "requestedSecondary",
              "policyVersion",
              "basis",
              "policyUpdatedAt",
              "start_productie_afzonderlijk",
              "herhaald",
              "ontvangenPolicyVersion",
              "productie_gestart"
            ],
            "additionalProperties": false
          }
        ]
      },
      "TaalProductieMutatie": {
        "type": "object",
        "properties": {
          "basis": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "versie": {
            "type": "integer",
            "minimum": 1,
            "maximum": 9007199254740991
          },
          "bevestigd": {
            "const": true
          }
        },
        "required": [
          "basis",
          "versie",
          "bevestigd"
        ],
        "additionalProperties": false
      },
      "TaalProductieContext_report": {
        "type": "object",
        "properties": {
          "sourceType": {
            "const": "report"
          },
          "sourceId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "language": {
            "type": "string"
          },
          "outcomes": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "report",
                "coverLetter"
              ]
            },
            "uniqueItems": true,
            "maxItems": 2
          },
          "producent": {
            "const": "rapport_vertaling"
          },
          "verwerkt_uitkomsten": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "report",
                "coverLetter"
              ]
            },
            "uniqueItems": true,
            "maxItems": 2
          },
          "kostenmodus": {
            "const": "persoonlijke_werkelijke_api_kosten"
          },
          "basis": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          }
        },
        "required": [
          "sourceType",
          "sourceId",
          "language",
          "outcomes",
          "producent",
          "verwerkt_uitkomsten",
          "kostenmodus",
          "basis"
        ],
        "additionalProperties": false,
        "description": "Actuele beschikbare bronuitkomsten en inhoudsgebonden basis. Rapportproducer verwerkt het rapport en eventuele brief samen; verwerkt_uitkomsten toont die effectieve verzameling. Gesprek heeft null op dat veld. Geen prijs of geboekte credits."
      },
      "TaalProductieContext_conversation": {
        "type": "object",
        "properties": {
          "sourceType": {
            "const": "conversation"
          },
          "sourceId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "language": {
            "type": "string"
          },
          "outcomes": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "conversationReport",
                "customerEmail",
                "followUpEmail"
              ]
            },
            "uniqueItems": true,
            "maxItems": 3
          },
          "producent": {
            "const": "gesprek_vertaling"
          },
          "verwerkt_uitkomsten": {
            "type": "null"
          },
          "kostenmodus": {
            "const": "persoonlijke_werkelijke_api_kosten"
          },
          "basis": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          }
        },
        "required": [
          "sourceType",
          "sourceId",
          "language",
          "outcomes",
          "producent",
          "verwerkt_uitkomsten",
          "kostenmodus",
          "basis"
        ],
        "additionalProperties": false,
        "description": "Actuele beschikbare bronuitkomsten en inhoudsgebonden basis. Rapportproducer verwerkt het rapport en eventuele brief samen; verwerkt_uitkomsten toont die effectieve verzameling. Gesprek heeft null op dat veld. Geen prijs of geboekte credits."
      },
      "GebondenTaalOpdracht": {
        "type": "object",
        "properties": {
          "opdracht_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "sourceType": {
            "type": "string",
            "enum": [
              "report",
              "conversation"
            ]
          },
          "sourceId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "language": {
            "type": "string",
            "pattern": "^[a-z]{2,3}$"
          },
          "outcomes": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "report",
                "coverLetter",
                "conversationReport",
                "customerEmail",
                "followUpEmail"
              ]
            },
            "minItems": 1,
            "maxItems": 3,
            "uniqueItems": true
          },
          "status": {
            "type": "string",
            "enum": [
              "queued",
              "processing",
              "succeeded",
              "failed",
              "refunded"
            ]
          },
          "besturing": {
            "type": "string",
            "enum": [
              "actief",
              "gepauzeerd",
              "geannuleerd"
            ]
          },
          "versie": {
            "type": "integer",
            "minimum": 1
          },
          "basis": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "bron_gewijzigd": {
            "type": "boolean"
          },
          "workflow_gewijzigd": {
            "type": "boolean"
          },
          "doel_rapport_versie_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "herstart_mogelijk": {
            "type": "boolean"
          },
          "pauzeren_mogelijk": {
            "type": "boolean"
          },
          "annuleren_mogelijk": {
            "type": "boolean"
          },
          "hervatten_mogelijk": {
            "type": "boolean"
          },
          "verwerking_beeindigd": {
            "type": "boolean"
          },
          "herstel_nodig": {
            "type": "boolean"
          },
          "herstel_zonder_provider": {
            "type": "boolean",
            "description": "Volledig opgeslagen resultaat of volledige gevalideerde pre-renderinhoud met definitief kostenbewijs. Geen providerretry, geen garantie dat alle huidige herstartvoorwaarden nog gelden."
          },
          "fout_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "startblokkade": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "taalproductie_ouderretentie_niet_vrijgegeven",
                  "taalproductie_ouder_vervallen"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "opdracht_id",
          "sourceType",
          "sourceId",
          "language",
          "outcomes",
          "status",
          "besturing",
          "versie",
          "basis",
          "bron_gewijzigd",
          "workflow_gewijzigd",
          "doel_rapport_versie_id",
          "herstart_mogelijk",
          "pauzeren_mogelijk",
          "annuleren_mogelijk",
          "hervatten_mogelijk",
          "verwerking_beeindigd",
          "herstel_nodig",
          "herstel_zonder_provider",
          "fout_code",
          "startblokkade"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "properties": {
                "sourceType": {
                  "const": "report"
                }
              }
            },
            "then": {
              "properties": {
                "outcomes": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "enum": [
                      "report",
                      "coverLetter"
                    ]
                  },
                  "minItems": 1,
                  "maxItems": 2,
                  "uniqueItems": true
                }
              }
            },
            "else": {
              "properties": {
                "outcomes": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "enum": [
                      "conversationReport",
                      "customerEmail",
                      "followUpEmail"
                    ]
                  },
                  "minItems": 1,
                  "maxItems": 3,
                  "uniqueItems": true
                },
                "doel_rapport_versie_id": {
                  "type": "null"
                }
              }
            }
          },
          {
            "if": {
              "properties": {
                "startblokkade": {
                  "const": "taalproductie_ouderretentie_niet_vrijgegeven"
                }
              }
            },
            "then": {
              "properties": {
                "herstart_mogelijk": {
                  "const": false
                },
                "hervatten_mogelijk": {
                  "const": false
                }
              }
            }
          },
          {
            "if": {
              "properties": {
                "startblokkade": {
                  "const": "taalproductie_ouder_vervallen"
                }
              }
            },
            "then": {
              "properties": {
                "herstart_mogelijk": {
                  "const": false
                },
                "hervatten_mogelijk": {
                  "const": false
                },
                "pauzeren_mogelijk": {
                  "const": false
                },
                "annuleren_mogelijk": {
                  "const": false
                }
              }
            }
          }
        ],
        "description": "Actuele opdrachtstatus; besturing staat los van workerstatus. Mogelijkheidsvlaggen zijn hints en vervangen geen actuele controles. Voor een zelfstandige opdracht is workflow_gewijzigd:false. Geen creditsbedrag, opslagreferentie of providerclaim. De 5edf9824-inhoudreceipt is intern en verschijnt niet als JSON, tekst, kostenlabel of opslagreferentie in dit DTO. Worker-readiness kan taalproductie_herstelschema_onbeschikbaar melden; een geaccepteerde start is geen bewijs van voltooide herstelproductie. Betaald vervolg per afzonderlijke uitkomst is hier niet vrijgegeven. 376-v2: startblokkade is null bij directe of nog actieve workflowbinding, ouderretentiecode bij bulkbinding, ouder_vervallen bij gearchiveerde workflowherkomst. Een null of mogelijkheidsvlag vervangt de actuele schema-/rechten-/kostencontrole niet."
      },
      "GebondenTaalOpdrachtOntvangst": {
        "type": "object",
        "properties": {
          "opdracht_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "sourceType": {
            "type": "string",
            "enum": [
              "report",
              "conversation"
            ]
          },
          "sourceId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "language": {
            "type": "string",
            "pattern": "^[a-z]{2,3}$"
          },
          "outcomes": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "report",
                "coverLetter",
                "conversationReport",
                "customerEmail",
                "followUpEmail"
              ]
            },
            "minItems": 1,
            "maxItems": 3,
            "uniqueItems": true
          },
          "status": {
            "type": "string",
            "enum": [
              "queued",
              "processing",
              "succeeded",
              "failed",
              "refunded"
            ]
          },
          "besturing": {
            "type": "string",
            "enum": [
              "actief",
              "gepauzeerd",
              "geannuleerd"
            ]
          },
          "versie": {
            "type": "integer",
            "minimum": 1
          },
          "basis": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "bron_gewijzigd": {
            "type": "boolean"
          },
          "workflow_gewijzigd": {
            "type": "boolean"
          },
          "doel_rapport_versie_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "herstart_mogelijk": {
            "type": "boolean"
          },
          "pauzeren_mogelijk": {
            "type": "boolean"
          },
          "annuleren_mogelijk": {
            "type": "boolean"
          },
          "hervatten_mogelijk": {
            "type": "boolean"
          },
          "verwerking_beeindigd": {
            "type": "boolean"
          },
          "herstel_nodig": {
            "type": "boolean"
          },
          "herstel_zonder_provider": {
            "type": "boolean",
            "description": "Volledig opgeslagen resultaat of volledige gevalideerde pre-renderinhoud met definitief kostenbewijs. Geen providerretry, geen garantie dat alle huidige herstartvoorwaarden nog gelden."
          },
          "fout_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "herhaald": {
            "type": "boolean"
          },
          "startblokkade": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "taalproductie_ouderretentie_niet_vrijgegeven",
                  "taalproductie_ouder_vervallen"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "opdracht_id",
          "sourceType",
          "sourceId",
          "language",
          "outcomes",
          "status",
          "besturing",
          "versie",
          "basis",
          "bron_gewijzigd",
          "workflow_gewijzigd",
          "doel_rapport_versie_id",
          "herstart_mogelijk",
          "pauzeren_mogelijk",
          "annuleren_mogelijk",
          "hervatten_mogelijk",
          "verwerking_beeindigd",
          "herstel_nodig",
          "herstel_zonder_provider",
          "fout_code",
          "herhaald",
          "startblokkade"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "properties": {
                "sourceType": {
                  "const": "report"
                }
              }
            },
            "then": {
              "properties": {
                "outcomes": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "enum": [
                      "report",
                      "coverLetter"
                    ]
                  },
                  "minItems": 1,
                  "maxItems": 2,
                  "uniqueItems": true
                }
              }
            },
            "else": {
              "properties": {
                "outcomes": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "enum": [
                      "conversationReport",
                      "customerEmail",
                      "followUpEmail"
                    ]
                  },
                  "minItems": 1,
                  "maxItems": 3,
                  "uniqueItems": true
                },
                "doel_rapport_versie_id": {
                  "type": "null"
                }
              }
            }
          },
          {
            "if": {
              "properties": {
                "startblokkade": {
                  "const": "taalproductie_ouderretentie_niet_vrijgegeven"
                }
              }
            },
            "then": {
              "properties": {
                "herstart_mogelijk": {
                  "const": false
                },
                "hervatten_mogelijk": {
                  "const": false
                }
              }
            }
          },
          {
            "if": {
              "properties": {
                "startblokkade": {
                  "const": "taalproductie_ouder_vervallen"
                }
              }
            },
            "then": {
              "properties": {
                "herstart_mogelijk": {
                  "const": false
                },
                "hervatten_mogelijk": {
                  "const": false
                },
                "pauzeren_mogelijk": {
                  "const": false
                },
                "annuleren_mogelijk": {
                  "const": false
                }
              }
            }
          }
        ],
        "description": "Ook een herhaling geeft de huidige opdrachttoestand; herhaald is geen garantie van afgeronde verwerking. De 5edf9824-inhoudreceipt is intern en verschijnt niet als JSON, tekst, kostenlabel of opslagreferentie in dit DTO. Worker-readiness kan taalproductie_herstelschema_onbeschikbaar melden; een geaccepteerde start is geen bewijs van voltooide herstelproductie. Betaald vervolg per afzonderlijke uitkomst is hier niet vrijgegeven. 376-v2: startblokkade is null bij directe of nog actieve workflowbinding, ouderretentiecode bij bulkbinding, ouder_vervallen bij gearchiveerde workflowherkomst. Een null of mogelijkheidsvlag vervangt de actuele schema-/rechten-/kostencontrole niet."
      },
      "ZelfstandigeTaalStartOntvangst": {
        "type": "object",
        "properties": {
          "opdracht_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versie": {
            "type": "integer",
            "minimum": 1
          },
          "basis": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "status": {
            "type": "string",
            "enum": [
              "queued",
              "processing",
              "succeeded",
              "failed",
              "refunded"
            ]
          },
          "herhaald": {
            "type": "boolean"
          },
          "statusUrl": {
            "type": "string",
            "pattern": "^/api/rapportly/v1/taalopdrachten/[a-fA-F0-9-]{36}$"
          }
        },
        "required": [
          "opdracht_id",
          "versie",
          "basis",
          "status",
          "herhaald",
          "statusUrl"
        ],
        "additionalProperties": false,
        "description": "HTTP202, ook bij herhaling. Bevat geen creditsveld; het interne legacycredits:0 bewijst geen gratis productie."
      },
      "WorkflowTaalContext": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "run": {
                "$ref": "#/components/schemas/WorkflowRun"
              },
              "mogelijk": {
                "const": false
              },
              "blokkade": {
                "type": "string",
                "enum": [
                  "workflowrun_resultaat_niet_gereed",
                  "taalproductie_native_doel_niet_ondersteund"
                ]
              },
              "basis": {
                "type": "null"
              },
              "opdrachten": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/GebondenTaalOpdracht"
                },
                "maxItems": 50
              }
            },
            "required": [
              "run",
              "mogelijk",
              "blokkade",
              "basis",
              "opdrachten"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "run": {
                "$ref": "#/components/schemas/WorkflowRun"
              },
              "mogelijk": {
                "const": true
              },
              "blokkade": {
                "type": "null"
              },
              "basis": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "opdrachten": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/GebondenTaalOpdracht"
                },
                "maxItems": 50
              },
              "opdrachten_meer": {
                "type": "boolean"
              },
              "bron": {
                "$ref": "#/components/schemas/TaalProductieContext_report"
              }
            },
            "required": [
              "run",
              "mogelijk",
              "blokkade",
              "basis",
              "opdrachten",
              "opdrachten_meer",
              "bron"
            ],
            "additionalProperties": false
          }
        ]
      },
      "FollowupActiepunt": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "tekst": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500
          },
          "eigenaar": {
            "type": "string",
            "enum": [
              "adviseur",
              "klant"
            ]
          },
          "deadline": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "open",
              "afgerond",
              "vervallen"
            ]
          },
          "volgorde": {
            "type": "integer"
          },
          "bron": {
            "type": "string",
            "enum": [
              "auto",
              "handmatig"
            ]
          },
          "basis": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          }
        },
        "required": [
          "id",
          "tekst",
          "eigenaar",
          "deadline",
          "status",
          "volgorde",
          "bron",
          "basis"
        ],
        "additionalProperties": false
      },
      "BewaardActiepunt": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "tekst": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500
          },
          "eigenaar": {
            "type": "string",
            "enum": [
              "adviseur",
              "klant"
            ]
          },
          "deadline": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "open",
              "afgerond",
              "vervallen"
            ]
          },
          "volgorde": {
            "type": "integer"
          },
          "bron": {
            "type": "string",
            "enum": [
              "auto",
              "handmatig"
            ]
          },
          "basis": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "gesprek_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          }
        },
        "required": [
          "id",
          "tekst",
          "eigenaar",
          "deadline",
          "status",
          "volgorde",
          "bron",
          "basis",
          "gesprek_id"
        ],
        "additionalProperties": false
      },
      "ActiepuntWijziging": {
        "type": "object",
        "properties": {
          "basis": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "tekst": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500,
            "pattern": "^(?![\\s\\S]*\\u0000)(?=[\\s\\S]*\\S)[\\s\\S]+$",
            "description": "Unicodecodepunten, geen NUL of uitsluitend witruimte. Wordt niet afgekapt of getrimd."
          },
          "deadline": {
            "anyOf": [
              {
                "type": "string",
                "format": "date",
                "pattern": "^[1-9][0-9]{3}-[0-9]{2}-[0-9]{2}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "open",
              "afgerond",
              "vervallen"
            ]
          }
        },
        "required": [
          "basis"
        ],
        "additionalProperties": false,
        "anyOf": [
          {
            "required": [
              "tekst"
            ]
          },
          {
            "required": [
              "deadline"
            ]
          },
          {
            "required": [
              "status"
            ]
          }
        ]
      },
      "FollowupWijziging": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "basis": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "mail": {
                "type": "string",
                "minLength": 1,
                "maxLength": 20000,
                "pattern": "^(?![\\s\\S]*\\u0000)(?=[\\s\\S]*\\S)[\\s\\S]+$",
                "description": "Unicodecodepunten, geen NUL of uitsluitend witruimte. Wordt niet afgekapt of getrimd."
              },
              "actiepunten": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "basis": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "tekst": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 500,
                      "pattern": "^(?![\\s\\S]*\\u0000)(?=[\\s\\S]*\\S)[\\s\\S]+$",
                      "description": "Unicodecodepunten, geen NUL of uitsluitend witruimte. Wordt niet afgekapt of getrimd."
                    },
                    "deadline": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date",
                          "pattern": "^[1-9][0-9]{3}-[0-9]{2}-[0-9]{2}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "open",
                        "afgerond",
                        "vervallen"
                      ]
                    },
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    }
                  },
                  "required": [
                    "id",
                    "basis"
                  ],
                  "additionalProperties": false,
                  "anyOf": [
                    {
                      "required": [
                        "tekst"
                      ]
                    },
                    {
                      "required": [
                        "deadline"
                      ]
                    },
                    {
                      "required": [
                        "status"
                      ]
                    }
                  ]
                },
                "maxItems": 100,
                "description": "Alle IDs moeten hoofdletterongevoelig uniek zijn; ieder punt hoort bij hetzelfde gesprek en heeft een eigen actuele basis.",
                "x-unieke-id-hoofdletterongevoelig": true
              }
            },
            "required": [
              "basis",
              "mail"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "actiepunten": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "basis": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "tekst": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 500,
                      "pattern": "^(?![\\s\\S]*\\u0000)(?=[\\s\\S]*\\S)[\\s\\S]+$",
                      "description": "Unicodecodepunten, geen NUL of uitsluitend witruimte. Wordt niet afgekapt of getrimd."
                    },
                    "deadline": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date",
                          "pattern": "^[1-9][0-9]{3}-[0-9]{2}-[0-9]{2}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "open",
                        "afgerond",
                        "vervallen"
                      ]
                    },
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    }
                  },
                  "required": [
                    "id",
                    "basis"
                  ],
                  "additionalProperties": false,
                  "anyOf": [
                    {
                      "required": [
                        "tekst"
                      ]
                    },
                    {
                      "required": [
                        "deadline"
                      ]
                    },
                    {
                      "required": [
                        "status"
                      ]
                    }
                  ]
                },
                "maxItems": 100,
                "description": "Alle IDs moeten hoofdletterongevoelig uniek zijn; ieder punt hoort bij hetzelfde gesprek en heeft een eigen actuele basis.",
                "x-unieke-id-hoofdletterongevoelig": true,
                "minItems": 1
              }
            },
            "required": [
              "actiepunten"
            ],
            "additionalProperties": false
          }
        ]
      },
      "ActiepuntOntvangstBewijs": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "gesprek_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "basis": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "actiepunten": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                },
                "basis": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                }
              },
              "required": [
                "id",
                "basis"
              ],
              "additionalProperties": false
            },
            "maxItems": 100
          }
        },
        "required": [
          "id",
          "gesprek_id",
          "basis",
          "actiepunten"
        ],
        "additionalProperties": false,
        "description": "Historische eerste ontvangst; basiswaarden veranderen bij replay niet."
      },
      "FollowupBewaard": {
        "type": "object",
        "properties": {
          "ok": {
            "const": true
          },
          "ontvangst": {
            "$ref": "#/components/schemas/ActiepuntOntvangstBewijs"
          },
          "herhaald": {
            "type": "boolean"
          },
          "basis": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "actiepunten": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BewaardActiepunt"
            },
            "maxItems": 100
          }
        },
        "required": [
          "ok",
          "ontvangst",
          "herhaald",
          "basis",
          "actiepunten"
        ],
        "additionalProperties": false
      },
      "ActiepuntBewaard": {
        "type": "object",
        "properties": {
          "ok": {
            "const": true
          },
          "ontvangst": {
            "$ref": "#/components/schemas/ActiepuntOntvangstBewijs"
          },
          "herhaald": {
            "type": "boolean"
          },
          "basis": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "actiepunten": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BewaardActiepunt"
            },
            "maxItems": 100
          },
          "actiepunt": {
            "$ref": "#/components/schemas/BewaardActiepunt"
          }
        },
        "required": [
          "ok",
          "ontvangst",
          "herhaald",
          "basis",
          "actiepunten",
          "actiepunt"
        ],
        "additionalProperties": false
      },
      "GesprekFollowup": {
        "type": "object",
        "properties": {
          "basis": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versiecontrole": {
            "const": true
          },
          "gesprek": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "titel": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "status": {
                "type": "string"
              },
              "verslag": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "taal": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "klant_id": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "afgerond_op": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "id",
              "titel",
              "status",
              "verslag",
              "taal",
              "klant_id",
              "afgerond_op"
            ],
            "additionalProperties": false
          },
          "followup": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "mail": {
                    "type": "string"
                  },
                  "onderwerp": {
                    "type": "string"
                  },
                  "body": {
                    "type": "string"
                  },
                  "gegenereerd_op": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "date-time"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "fout": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "bron": {
                    "type": "string",
                    "enum": [
                      "followup",
                      "klantmail"
                    ]
                  }
                },
                "required": [
                  "mail",
                  "onderwerp",
                  "body",
                  "gegenereerd_op",
                  "fout",
                  "bron"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "actiepunten": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FollowupActiepunt"
            }
          },
          "klant": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "naam": {
                    "type": "string"
                  },
                  "email": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "taal": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": [
                  "id",
                  "naam",
                  "email",
                  "taal"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "instellingen": {
            "type": "object",
            "properties": {
              "modus": {
                "type": "string"
              },
              "kanaal_voorkeur": {
                "type": "string"
              }
            },
            "required": [
              "modus",
              "kanaal_voorkeur"
            ],
            "additionalProperties": false
          },
          "outbox": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  "status": {
                    "type": "string"
                  },
                  "ontvanger_email": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "verzonden_op": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "date-time"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "aangemaakt_op": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "directe_status": {
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "onzeker",
                          "geaccepteerd",
                          "handmatig_bevestigd",
                          "gestopt"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "directe_poging": {
                    "anyOf": [
                      {
                        "type": "string",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$",
                        "description": "Exacte basis uit het actuele voorbeeld; de aanvraagcontrole beperkt niet tot één UUID-versie."
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "directe_gestart_op": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "date-time"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "bezorgd_op": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "date-time"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "geopend_op": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "date-time"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "geklikt_op": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "date-time"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "herstel_mogelijk": {
                    "type": "boolean"
                  },
                  "herstel_code": {
                    "const": "mail_legacy_herstel_verplicht"
                  }
                },
                "required": [
                  "id",
                  "status",
                  "ontvanger_email",
                  "verzonden_op",
                  "aangemaakt_op",
                  "directe_status",
                  "directe_poging",
                  "directe_gestart_op",
                  "herstel_mogelijk"
                ],
                "additionalProperties": false,
                "description": "Eigen followup-mailontvangst. Native fallback kan de drie gevolgde tijdstippen weglaten; user_id en goedkeuring_snapshot worden nooit geëxporteerd. Status/handmatig_bevestigd zijn geen afleverbewijs."
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "basis",
          "versiecontrole",
          "gesprek",
          "followup",
          "actiepunten",
          "klant",
          "instellingen",
          "outbox"
        ],
        "additionalProperties": false,
        "description": "Huidig followupscherm, inclusief vertrouwelijke bron-/klantinhoud. Niet-klare gesprekken geven followup:null en actiepunten:[];200 bewijst geen klare generatie."
      },
      "KlantReactieTijdlijn": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "beschikbaar": {
                "const": false
              },
              "items": {
                "type": "array",
                "items": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "outbox_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "gesprek_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "gesprek_titel": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "onderwerp": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "tijdstip": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "id": {
                          "type": "string",
                          "pattern": "^uit-[a-fA-F0-9-]{36}$"
                        },
                        "richting": {
                          "const": "uitgaand"
                        },
                        "status": {
                          "type": "string"
                        },
                        "bezorgd_op": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "date-time"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "geopend_op": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "date-time"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "geklikt_op": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "date-time"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "outbox_id",
                        "gesprek_id",
                        "gesprek_titel",
                        "onderwerp",
                        "tijdstip",
                        "id",
                        "richting",
                        "status",
                        "bezorgd_op",
                        "geopend_op",
                        "geklikt_op"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "outbox_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "gesprek_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "gesprek_titel": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "onderwerp": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "tijdstip": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "richting": {
                          "const": "inkomend"
                        },
                        "body": {
                          "type": "string"
                        },
                        "afzender_status": {
                          "type": "string",
                          "enum": [
                            "geverifieerd",
                            "afwijkend",
                            "mail_loop"
                          ]
                        },
                        "automatische_acties_geblokkeerd": {
                          "type": "boolean"
                        },
                        "gelezen_op": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "date-time"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "bijlagen": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "index": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "naam": {
                                "type": "string"
                              },
                              "mime": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "grootte": {
                                "type": "integer",
                                "minimum": 0
                              }
                            },
                            "required": [
                              "index"
                            ],
                            "additionalProperties": false,
                            "description": "Native veilige bijlagewriter bewaart naam/mime/grootte. Historische JSONprojectie kan ontbrekende velden weglaten; geen intern opslagpad in tijdlijn."
                          }
                        }
                      },
                      "required": [
                        "outbox_id",
                        "gesprek_id",
                        "gesprek_titel",
                        "onderwerp",
                        "tijdstip",
                        "id",
                        "richting",
                        "body",
                        "afzender_status",
                        "automatische_acties_geblokkeerd",
                        "gelezen_op",
                        "bijlagen"
                      ],
                      "additionalProperties": false
                    }
                  ]
                },
                "maxItems": 0
              }
            },
            "required": [
              "beschikbaar",
              "items"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "beschikbaar": {
                "const": true
              },
              "items": {
                "type": "array",
                "items": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "outbox_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "gesprek_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "gesprek_titel": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "onderwerp": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "tijdstip": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "id": {
                          "type": "string",
                          "pattern": "^uit-[a-fA-F0-9-]{36}$"
                        },
                        "richting": {
                          "const": "uitgaand"
                        },
                        "status": {
                          "type": "string"
                        },
                        "bezorgd_op": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "date-time"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "geopend_op": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "date-time"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "geklikt_op": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "date-time"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "outbox_id",
                        "gesprek_id",
                        "gesprek_titel",
                        "onderwerp",
                        "tijdstip",
                        "id",
                        "richting",
                        "status",
                        "bezorgd_op",
                        "geopend_op",
                        "geklikt_op"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "outbox_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "gesprek_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "gesprek_titel": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "onderwerp": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "tijdstip": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        "richting": {
                          "const": "inkomend"
                        },
                        "body": {
                          "type": "string"
                        },
                        "afzender_status": {
                          "type": "string",
                          "enum": [
                            "geverifieerd",
                            "afwijkend",
                            "mail_loop"
                          ]
                        },
                        "automatische_acties_geblokkeerd": {
                          "type": "boolean"
                        },
                        "gelezen_op": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "date-time"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "bijlagen": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "index": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "naam": {
                                "type": "string"
                              },
                              "mime": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "grootte": {
                                "type": "integer",
                                "minimum": 0
                              }
                            },
                            "required": [
                              "index"
                            ],
                            "additionalProperties": false,
                            "description": "Native veilige bijlagewriter bewaart naam/mime/grootte. Historische JSONprojectie kan ontbrekende velden weglaten; geen intern opslagpad in tijdlijn."
                          }
                        }
                      },
                      "required": [
                        "outbox_id",
                        "gesprek_id",
                        "gesprek_titel",
                        "onderwerp",
                        "tijdstip",
                        "id",
                        "richting",
                        "body",
                        "afzender_status",
                        "automatische_acties_geblokkeerd",
                        "gelezen_op",
                        "bijlagen"
                      ],
                      "additionalProperties": false
                    }
                  ]
                },
                "maxItems": 400
              }
            },
            "required": [
              "beschikbaar",
              "items"
            ],
            "additionalProperties": false
          }
        ]
      },
      "RapportVerschilFragment": {
        "type": "object",
        "properties": {
          "vanaf_regel": {
            "type": "integer",
            "minimum": 1
          },
          "tot_regel": {
            "type": "integer",
            "minimum": 0
          },
          "tekst": {
            "type": "string",
            "maxLength": 8000
          },
          "ingekort": {
            "type": "boolean"
          }
        },
        "required": [
          "vanaf_regel",
          "tot_regel",
          "tekst",
          "ingekort"
        ],
        "additionalProperties": false,
        "description": "Nul of meer regels binnen één aaneengesloten verschilblok. Regelnummers zijn1gebaseerd. Bij een zuivere toevoeging/verwijdering kan de lege zijde tot_regel < vanaf_regel hebben. tekst bevat maximaal8000 Unicodecodepunten; ingekort geeft verlies van het restant aan, zonder surrogatepaar door te knippen."
      },
      "RapportRevisieVerschil": {
        "type": "object",
        "properties": {
          "soort": {
            "const": "rapportinhoud"
          },
          "methode": {
            "const": "aaneengesloten_tekstblok"
          },
          "rapport_versie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "van_versie": {
            "type": "integer",
            "minimum": 1
          },
          "naar_versie": {
            "type": "integer",
            "minimum": 2
          },
          "gewijzigd": {
            "type": "boolean"
          },
          "bevat_inhoud": {
            "const": true
          },
          "bronmanifest_vergeleken": {
            "const": false
          },
          "brief_vergeleken": {
            "const": false
          },
          "blok": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "oud": {
                    "$ref": "#/components/schemas/RapportVerschilFragment"
                  },
                  "nieuw": {
                    "$ref": "#/components/schemas/RapportVerschilFragment"
                  }
                },
                "required": [
                  "oud",
                  "nieuw"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "uitvoering_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "run_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          }
        },
        "required": [
          "soort",
          "methode",
          "rapport_versie_id",
          "van_versie",
          "naar_versie",
          "gewijzigd",
          "bevat_inhoud",
          "bronmanifest_vergeleken",
          "brief_vergeleken",
          "blok",
          "uitvoering_id",
          "run_id"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "properties": {
                "gewijzigd": {
                  "const": true
                }
              }
            },
            "then": {
              "properties": {
                "blok": {
                  "type": "object",
                  "properties": {
                    "oud": {
                      "$ref": "#/components/schemas/RapportVerschilFragment"
                    },
                    "nieuw": {
                      "$ref": "#/components/schemas/RapportVerschilFragment"
                    }
                  },
                  "required": [
                    "oud",
                    "nieuw"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "else": {
              "properties": {
                "blok": {
                  "type": "null"
                }
              }
            }
          }
        ],
        "description": "Twee opeenvolgende opgeslagen366rapport_markdownrevisies: naar_versie = van_versie +1. Geen diff van uitvoeringversies of telling van inhoudelijke wijzigingen. Uitvoering-ID en run-ID binden de inhoud aan de gevraagde uitvoering en gekozen eigen run."
      },
      "UitvoeringRapportVerschil": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "beschikbaar": {
                "const": false
              },
              "reden_code": {
                "type": "string",
                "enum": [
                  "beleid_uitgeschakeld",
                  "resultaat_niet_gereed",
                  "documentsoort_niet_aangesloten",
                  "geen_vorige_inhoudsrevisie",
                  "historie_ontbreekt_of_te_groot",
                  "historie_gewijzigd"
                ]
              }
            },
            "required": [
              "beschikbaar",
              "reden_code"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "beschikbaar": {
                "const": true
              },
              "verschil": {
                "$ref": "#/components/schemas/RapportRevisieVerschil"
              }
            },
            "required": [
              "beschikbaar",
              "verschil"
            ],
            "additionalProperties": false
          }
        ]
      },
      "UitvoerHistorieVerschilFragment": {
        "type": "object",
        "properties": {
          "vanaf_regel": {
            "type": "integer",
            "minimum": 1
          },
          "tot_regel": {
            "type": "integer",
            "minimum": 0
          },
          "tekst": {
            "type": "string",
            "maxLength": 8000
          },
          "ingekort": {
            "type": "boolean"
          }
        },
        "required": [
          "vanaf_regel",
          "tot_regel",
          "tekst",
          "ingekort"
        ],
        "additionalProperties": false,
        "description": "Regels zijn 1-gebaseerd. Een lege zijde bij toevoegen/verwijderen heeft tot_regel lager dan vanaf_regel. Maximaal 8000 Unicodecodepunten; ingekort meldt weggelaten fragmenttekst."
      },
      "UitvoerHistorieVerschil": {
        "type": "object",
        "properties": {
          "soort": {
            "const": "uitvoerinhoud"
          },
          "doel_soort": {
            "type": "string",
            "enum": [
              "rapport",
              "gesprek"
            ]
          },
          "anker_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "veld": {
            "type": "string",
            "enum": [
              "rapport_markdown",
              "verslag",
              "interne_mail",
              "klantmail",
              "followup_mail"
            ]
          },
          "van_versie": {
            "type": "integer",
            "minimum": 1,
            "maximum": 999999998
          },
          "naar_versie": {
            "type": "integer",
            "minimum": 2,
            "maximum": 999999999
          },
          "methode": {
            "const": "aaneengesloten_tekstblok"
          },
          "gewijzigd": {
            "type": "boolean"
          },
          "blok": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "oud": {
                    "$ref": "#/components/schemas/UitvoerHistorieVerschilFragment"
                  },
                  "nieuw": {
                    "$ref": "#/components/schemas/UitvoerHistorieVerschilFragment"
                  }
                },
                "required": [
                  "oud",
                  "nieuw"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "bevat_inhoud": {
            "const": true
          },
          "alleen_opgeslagen_historie": {
            "const": true
          }
        },
        "required": [
          "soort",
          "doel_soort",
          "anker_id",
          "veld",
          "van_versie",
          "naar_versie",
          "methode",
          "gewijzigd",
          "blok",
          "bevat_inhoud",
          "alleen_opgeslagen_historie"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "oneOf": [
              {
                "properties": {
                  "doel_soort": {
                    "const": "rapport"
                  },
                  "veld": {
                    "const": "rapport_markdown"
                  }
                }
              },
              {
                "properties": {
                  "doel_soort": {
                    "const": "gesprek"
                  },
                  "veld": {
                    "const": "verslag"
                  }
                }
              },
              {
                "properties": {
                  "doel_soort": {
                    "const": "gesprek"
                  },
                  "veld": {
                    "const": "interne_mail"
                  }
                }
              },
              {
                "properties": {
                  "doel_soort": {
                    "const": "gesprek"
                  },
                  "veld": {
                    "const": "klantmail"
                  }
                }
              },
              {
                "properties": {
                  "doel_soort": {
                    "const": "gesprek"
                  },
                  "veld": {
                    "const": "followup_mail"
                  }
                }
              }
            ]
          },
          {
            "if": {
              "properties": {
                "gewijzigd": {
                  "const": true
                }
              }
            },
            "then": {
              "properties": {
                "blok": {
                  "type": "object",
                  "properties": {
                    "oud": {
                      "$ref": "#/components/schemas/UitvoerHistorieVerschilFragment"
                    },
                    "nieuw": {
                      "$ref": "#/components/schemas/UitvoerHistorieVerschilFragment"
                    }
                  },
                  "required": [
                    "oud",
                    "nieuw"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "else": {
              "properties": {
                "blok": {
                  "type": "null"
                }
              }
            }
          }
        ],
        "description": "Twee bestaande historieversies van hetzelfde anker en veld, van_versie < naar_versie; niet noodzakelijk opeenvolgend. De server bewaakt de onderlinge getalvergelijking. Eén aaneengesloten tekstblok kan ongewijzigde tussenregels bevatten. Geen telling van afzonderlijke wijzigingen, actuele publicatie, verzending, opmaak- of bronvergelijking."
      },
      "UitvoerHistorieVerschilAntwoord": {
        "type": "object",
        "properties": {
          "beschikbaar": {
            "const": true
          },
          "verschil": {
            "$ref": "#/components/schemas/UitvoerHistorieVerschil"
          }
        },
        "required": [
          "beschikbaar",
          "verschil"
        ],
        "additionalProperties": false
      },
      "GesprekDocumentenStatus": {
        "type": "object",
        "properties": {
          "aanvraagId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "status": {
            "type": "string",
            "enum": [
              "uploaden",
              "ontvangen",
              "start_bezig",
              "klaar",
              "mislukt",
              "opruimen"
            ]
          },
          "gesprek_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "code": {
            "type": "string"
          }
        },
        "required": [
          "aanvraagId",
          "status"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "properties": {
                "status": {
                  "const": "mislukt"
                }
              }
            },
            "then": {
              "required": [
                "code"
              ]
            },
            "else": {
              "not": {
                "required": [
                  "code"
                ]
              }
            }
          },
          {
            "if": {
              "properties": {
                "status": {
                  "not": {
                    "const": "klaar"
                  }
                }
              }
            },
            "then": {
              "not": {
                "required": [
                  "gesprek_id"
                ]
              }
            }
          }
        ],
        "description": "Voorbereidingsstatus. klaar betekent dat de duurzame gespreksbundel is gestart; lees daarna de gespreksstatus voor de uiteindelijke inhoud. gesprek_id verschijnt alleen bij klaar en een opgeslagen verwijzing. mislukt bevat code, zo nodig documentverwerking_mislukt."
      },
      "GesprekDocumentenOntvangst": {
        "type": "object",
        "properties": {
          "aanvraagId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "status": {
            "type": "string",
            "enum": [
              "uploaden",
              "ontvangen",
              "start_bezig",
              "klaar",
              "mislukt",
              "opruimen"
            ]
          },
          "gesprek_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "code": {
            "type": "string"
          },
          "statusUrl": {
            "type": "string",
            "pattern": "^/api/rapportly/v1/gesprekken/documenten/jobs/[a-fA-F0-9-]{36}$"
          }
        },
        "required": [
          "aanvraagId",
          "status",
          "statusUrl"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "properties": {
                "status": {
                  "const": "mislukt"
                }
              }
            },
            "then": {
              "required": [
                "code"
              ]
            },
            "else": {
              "not": {
                "required": [
                  "code"
                ]
              }
            }
          },
          {
            "if": {
              "properties": {
                "status": {
                  "not": {
                    "const": "klaar"
                  }
                }
              }
            },
            "then": {
              "not": {
                "required": [
                  "gesprek_id"
                ]
              }
            }
          }
        ]
      },
      "GesprekDocumentenInvoer": {
        "type": "object",
        "properties": {
          "bestanden": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "binary",
              "description": "Per bestand maximaal 50 MiB. Extensies: pdf, docx, doc, txt, md, pptx, potx, ppsx, pptm, potm, ppsm, ppt, pot, pps, odp, otp, png, jpg, jpeg, webp. Bestandsinhoud moet bij het formaat passen. Acceptatie bewijst nog geen geslaagde tekstextractie."
            },
            "minItems": 1,
            "maxItems": 50
          },
          "transcript": {
            "type": "string",
            "description": "Optionele aanvullende gesprekstekst; wordt getrimd en vóór de geëxtraheerde documenten geplaatst."
          },
          "titel": {
            "type": "string",
            "description": "Getrimd; bij leeg gebruikt de dienst de herstelde naam van het eerste bestand."
          },
          "tier": {
            "type": "string",
            "enum": [
              "basis",
              "standaard",
              "max"
            ]
          },
          "klantId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "taal": {
            "type": "string",
            "pattern": "^[a-z]{2,3}$",
            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
          },
          "tweedeTaal": {
            "type": "string",
            "pattern": "^[a-z]{2,3}$",
            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
          },
          "languagePolicy": {
            "type": "string",
            "contentMediaType": "application/json",
            "contentSchema": {
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "primary": {
                      "type": "string",
                      "pattern": "^[a-z]{2,3}$",
                      "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                    },
                    "secondary": {
                      "type": "object",
                      "properties": {
                        "conversationReport": {
                          "$ref": "#/components/schemas/Taalkeuze"
                        },
                        "customerEmail": {
                          "$ref": "#/components/schemas/Taalkeuze"
                        },
                        "followUpEmail": {
                          "$ref": "#/components/schemas/Taalkeuze"
                        }
                      },
                      "required": [],
                      "additionalProperties": false
                    }
                  },
                  "required": [],
                  "additionalProperties": false
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Een multipart-tekstveld met JSON, geen afzonderlijk JSON-onderdeel. Alleen gespreksuitkomsten. Bewaarde beleidskeuze wordt bij de latere gespreksstart verwerkt."
          },
          "generatieOpties": {
            "type": "string",
            "contentMediaType": "application/json",
            "contentSchema": {
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "versie": {
                      "const": 1
                    },
                    "route": {
                      "type": "string",
                      "enum": [
                        "automatisch",
                        "efficient",
                        "uitgebreid"
                      ]
                    },
                    "begeleidendeBrief": {
                      "type": "boolean"
                    },
                    "automatischeRoute": {
                      "type": "string",
                      "enum": [
                        "efficient",
                        "uitgebreid"
                      ]
                    }
                  },
                  "required": [],
                  "additionalProperties": false,
                  "description": "Canonieke invoer van de gedeelde normalisator. versie wordt 1; onbekende route wordt automatisch; begeleidendeBrief alleen bij boolean true. automatischeRoute wordt alleen behouden bij route automatisch. Een gespreksbundel produceert geen rapportbrief."
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Een multipart-tekstveld met JSON, geen afzonderlijk JSON-onderdeel. De gedeelde normalisator bepaalt de opgeslagen generatiekeuze."
          },
          "stijlenV2": {
            "type": "string",
            "contentMediaType": "application/json",
            "contentSchema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/StijlenV2Gesprek"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Een multipart-tekstveld met JSON, geen afzonderlijk JSON-onderdeel. Verslag- en emailstijlcontext worden bij ontvangst afzonderlijk gecontroleerd en bevroren."
          }
        },
        "required": [
          "bestanden"
        ],
        "additionalProperties": false,
        "description": "Canonieke tekstvelden en herhaalde bestanden-onderdelen. Andere tekstvelden worden geweigerd. De genormaliseerde invoer inclusief bevroren stijlcontext mag maximaal 180000 UTF-8-bytes JSON bevatten; dit is geen afzonderlijke tekenlimiet per veld. JSON-parsefout geeft 400, te grote genormaliseerde invoer 413."
      },
      "DocumentConceptOpmaak": {
        "type": "object",
        "properties": {
          "schemaVersie": {
            "const": 1
          },
          "font": {
            "type": "string",
            "enum": [
              "Arial",
              "Calibri",
              "Cambria",
              "Times New Roman",
              "Courier New",
              "Georgia",
              "Verdana",
              "Trebuchet MS",
              "Noto Sans",
              "DejaVu Serif"
            ]
          },
          "fontPunten": {
            "type": "number",
            "minimum": 10,
            "maximum": 14
          },
          "regelafstand": {
            "type": "number",
            "minimum": 1.1,
            "maximum": 1.8
          },
          "accent": {
            "type": "string",
            "pattern": "^#[a-fA-F0-9]{6}$",
            "description": "sRGB-contrast tegen wit minimaal 4,5."
          },
          "tekstkleur": {
            "const": "#202833"
          },
          "margesMm": {
            "type": "object",
            "properties": {
              "boven": {
                "type": "number",
                "minimum": 12,
                "maximum": 30
              },
              "rechts": {
                "type": "number",
                "minimum": 12,
                "maximum": 30
              },
              "onder": {
                "type": "number",
                "minimum": 12,
                "maximum": 30
              },
              "links": {
                "type": "number",
                "minimum": 12,
                "maximum": 30
              }
            },
            "required": [
              "boven",
              "rechts",
              "onder",
              "links"
            ],
            "additionalProperties": false
          },
          "lettertypeAangepast": {
            "type": "boolean"
          },
          "merklogo": {
            "type": "string",
            "maxLength": 700000,
            "pattern": "^data:image/png;base64,[A-Za-z0-9+/]+={0,2}$",
            "description": "Optioneel bevroren PNG-datalogo. Canonieke base64, minimaal 33 bytes, geldige PNG/IHDR en uitsluitend IHDR/IDAT/IEND/pHYs, 1–800 pixels per as. Nooit een externe URL."
          }
        },
        "required": [
          "schemaVersie",
          "font",
          "fontPunten",
          "regelafstand",
          "accent",
          "tekstkleur",
          "margesMm",
          "lettertypeAangepast"
        ],
        "additionalProperties": false
      },
      "DocumentConceptTabelcel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
          },
          "rij": {
            "type": "integer",
            "minimum": 0,
            "maximum": 999
          },
          "kolom": {
            "type": "integer",
            "minimum": 0,
            "maximum": 31
          },
          "rijspan": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000
          },
          "kolomspan": {
            "type": "integer",
            "minimum": 1,
            "maximum": 32
          },
          "kop": {
            "type": "boolean"
          },
          "tekst": {
            "type": "string",
            "maxLength": 500000,
            "pattern": "^[^\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]*$",
            "x-max-utf16-code-eenheden": 500000,
            "description": "Maximaal 500000 JavaScript UTF-16-code-eenheden; tabs en regeleinden zijn toegestaan, overige C0-controlecodes niet."
          },
          "kopIds": {
            "type": "array",
            "items": {
              "type": "string",
              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
            },
            "uniqueItems": true
          },
          "bronIds": {
            "type": "array",
            "items": {
              "type": "string",
              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
            }
          }
        },
        "required": [
          "id",
          "rij",
          "kolom",
          "rijspan",
          "kolomspan",
          "kop",
          "tekst",
          "kopIds",
          "bronIds"
        ],
        "additionalProperties": false,
        "description": "Posities zijn nulgebaseerd. Spans passen binnen het tabelraster, vullen dit volledig en overlappen niet. kopIds verwijzen uniek naar andere kopcellen boven of links die geometrisch aansluiten. IDs zijn in het document uniek; bronIds moeten op documentniveau bestaan."
      },
      "DocumentConceptOnderdeel": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
              },
              "bronIds": {
                "type": "array",
                "items": {
                  "type": "string",
                  "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
                }
              },
              "vast": {
                "type": "boolean"
              },
              "soort": {
                "const": "tekst"
              },
              "tekst": {
                "type": "string",
                "maxLength": 500000,
                "pattern": "^[^\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]*$",
                "x-max-utf16-code-eenheden": 500000,
                "description": "Maximaal 500000 JavaScript UTF-16-code-eenheden; tabs en regeleinden zijn toegestaan, overige C0-controlecodes niet."
              }
            },
            "required": [
              "id",
              "bronIds",
              "vast",
              "soort",
              "tekst"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
              },
              "bronIds": {
                "type": "array",
                "items": {
                  "type": "string",
                  "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
                }
              },
              "vast": {
                "type": "boolean"
              },
              "soort": {
                "const": "kop"
              },
              "tekst": {
                "type": "string",
                "maxLength": 500000,
                "pattern": "^[^\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]*$",
                "x-max-utf16-code-eenheden": 500000,
                "description": "Maximaal 500000 JavaScript UTF-16-code-eenheden; tabs en regeleinden zijn toegestaan, overige C0-controlecodes niet."
              },
              "niveau": {
                "type": "integer",
                "minimum": 1,
                "maximum": 6
              }
            },
            "required": [
              "id",
              "bronIds",
              "vast",
              "soort",
              "tekst",
              "niveau"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
              },
              "bronIds": {
                "type": "array",
                "items": {
                  "type": "string",
                  "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
                }
              },
              "vast": {
                "type": "boolean"
              },
              "soort": {
                "const": "lijst"
              },
              "items": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 500000,
                  "pattern": "^[^\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]*$",
                  "x-max-utf16-code-eenheden": 500000,
                  "description": "Maximaal 500000 JavaScript UTF-16-code-eenheden; tabs en regeleinden zijn toegestaan, overige C0-controlecodes niet."
                },
                "maxItems": 1000
              },
              "genummerd": {
                "type": "boolean"
              },
              "start": {
                "type": "integer",
                "minimum": 1,
                "maximum": 10000
              }
            },
            "required": [
              "id",
              "bronIds",
              "vast",
              "soort",
              "items",
              "genummerd",
              "start"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
              },
              "bronIds": {
                "type": "array",
                "items": {
                  "type": "string",
                  "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
                }
              },
              "vast": {
                "type": "boolean"
              },
              "soort": {
                "const": "lijstpunt"
              },
              "nummer": {
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 10000
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "gekozen": {
                "anyOf": [
                  {
                    "type": "boolean"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "onderdelen": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/DocumentConceptOnderdeel"
                },
                "maxItems": 2000
              }
            },
            "required": [
              "id",
              "bronIds",
              "vast",
              "soort",
              "nummer",
              "gekozen",
              "onderdelen"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
              },
              "bronIds": {
                "type": "array",
                "items": {
                  "type": "string",
                  "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
                }
              },
              "vast": {
                "type": "boolean"
              },
              "soort": {
                "const": "tabel"
              },
              "titel": {
                "type": "string",
                "maxLength": 500000,
                "pattern": "^[^\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]*$",
                "x-max-utf16-code-eenheden": 500000,
                "description": "Maximaal 500000 JavaScript UTF-16-code-eenheden; tabs en regeleinden zijn toegestaan, overige C0-controlecodes niet."
              },
              "rijen": {
                "type": "integer",
                "minimum": 1,
                "maximum": 1000
              },
              "kolommen": {
                "type": "integer",
                "minimum": 1,
                "maximum": 32
              },
              "cellen": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/DocumentConceptTabelcel"
                },
                "maxItems": 32000
              }
            },
            "required": [
              "id",
              "bronIds",
              "vast",
              "soort",
              "titel",
              "rijen",
              "kolommen",
              "cellen"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
              },
              "bronIds": {
                "type": "array",
                "items": {
                  "type": "string",
                  "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
                }
              },
              "vast": {
                "type": "boolean"
              },
              "soort": {
                "const": "groep"
              },
              "titel": {
                "type": "string",
                "maxLength": 500000,
                "pattern": "^[^\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]*$",
                "x-max-utf16-code-eenheden": 500000,
                "description": "Maximaal 500000 JavaScript UTF-16-code-eenheden; tabs en regeleinden zijn toegestaan, overige C0-controlecodes niet."
              },
              "onderdelen": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/DocumentConceptOnderdeel"
                },
                "maxItems": 2000
              }
            },
            "required": [
              "id",
              "bronIds",
              "vast",
              "soort",
              "titel",
              "onderdelen"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
              },
              "bronIds": {
                "type": "array",
                "items": {
                  "type": "string",
                  "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
                }
              },
              "vast": {
                "type": "boolean"
              },
              "soort": {
                "const": "veld"
              },
              "label": {
                "type": "string",
                "maxLength": 500000,
                "pattern": "^[^\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]*$",
                "x-max-utf16-code-eenheden": 500000,
                "description": "Maximaal 500000 JavaScript UTF-16-code-eenheden; tabs en regeleinden zijn toegestaan, overige C0-controlecodes niet.",
                "minLength": 1,
                "allOf": [
                  {
                    "pattern": "\\S"
                  }
                ]
              },
              "waarde": {
                "type": "string",
                "maxLength": 500000,
                "pattern": "^[^\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]*$",
                "x-max-utf16-code-eenheden": 500000,
                "description": "Maximaal 500000 JavaScript UTF-16-code-eenheden; tabs en regeleinden zijn toegestaan, overige C0-controlecodes niet."
              }
            },
            "required": [
              "id",
              "bronIds",
              "vast",
              "soort",
              "label",
              "waarde"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
              },
              "bronIds": {
                "type": "array",
                "items": {
                  "type": "string",
                  "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
                }
              },
              "vast": {
                "type": "boolean"
              },
              "soort": {
                "const": "keuze"
              },
              "label": {
                "type": "string",
                "maxLength": 500000,
                "pattern": "^[^\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]*$",
                "x-max-utf16-code-eenheden": 500000,
                "description": "Maximaal 500000 JavaScript UTF-16-code-eenheden; tabs en regeleinden zijn toegestaan, overige C0-controlecodes niet.",
                "minLength": 1,
                "allOf": [
                  {
                    "pattern": "\\S"
                  }
                ]
              },
              "opties": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "label": {
                      "type": "string",
                      "maxLength": 500000,
                      "pattern": "^[^\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]*$",
                      "x-max-utf16-code-eenheden": 500000,
                      "description": "Maximaal 500000 JavaScript UTF-16-code-eenheden; tabs en regeleinden zijn toegestaan, overige C0-controlecodes niet.",
                      "minLength": 1,
                      "allOf": [
                        {
                          "pattern": "\\S"
                        }
                      ]
                    },
                    "gekozen": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "label",
                    "gekozen"
                  ],
                  "additionalProperties": false
                },
                "minItems": 1,
                "maxItems": 100
              }
            },
            "required": [
              "id",
              "bronIds",
              "vast",
              "soort",
              "label",
              "opties"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
              },
              "bronIds": {
                "type": "array",
                "items": {
                  "type": "string",
                  "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
                }
              },
              "vast": {
                "type": "boolean"
              },
              "soort": {
                "const": "scheiding"
              }
            },
            "required": [
              "id",
              "bronIds",
              "vast",
              "soort"
            ],
            "additionalProperties": false
          }
        ],
        "description": "Recursieve structuur; diepte maximaal 8 vanaf de hoofdonderdelen op diepte 0. De validator bewaakt documentbrede ID-uniciteit en bestaande bronverwijzingen. Vaste onderdelen en kinderen daarvan hebben geen bewerkbare velden."
      },
      "DocumentConceptInhoud": {
        "type": "object",
        "properties": {
          "schemaVersie": {
            "const": 1
          },
          "taal": {
            "type": "string",
            "pattern": "^[a-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"
          },
          "titel": {
            "type": "string",
            "maxLength": 500000,
            "pattern": "^[^\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]*$",
            "x-max-utf16-code-eenheden": 500000,
            "description": "Maximaal 500000 JavaScript UTF-16-code-eenheden; tabs en regeleinden zijn toegestaan, overige C0-controlecodes niet.",
            "minLength": 1,
            "allOf": [
              {
                "pattern": "\\S"
              }
            ]
          },
          "onderdelen": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DocumentConceptOnderdeel"
            },
            "minItems": 1,
            "maxItems": 2000
          },
          "bronIds": {
            "type": "array",
            "items": {
              "type": "string",
              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
            }
          },
          "vereisten": {
            "type": "object",
            "properties": {
              "vorm": {
                "type": "string",
                "enum": [
                  "vrij",
                  "vormvast"
                ]
              },
              "functies": {
                "type": "array",
                "items": {
                  "type": "string",
                  "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
                }
              }
            },
            "required": [
              "vorm",
              "functies"
            ],
            "additionalProperties": false
          },
          "opmaak": {
            "$ref": "#/components/schemas/DocumentConceptOpmaak"
          }
        },
        "required": [
          "schemaVersie",
          "taal",
          "titel",
          "onderdelen",
          "bronIds",
          "vereisten"
        ],
        "additionalProperties": false,
        "description": "Bestaande gevalideerde inhoud, geen vrij uploadcontract. Canoniek gesorteerde JSON maximaal 2 MiB UTF-8. Bronverwijzingen en tabelrelaties worden semantisch gecontroleerd; JSON Schema vervangt die controles niet. Geen originele stijlvoorbeeldinhoud of private opslagidentiteit."
      },
      "DocumentConceptBewerkveld": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "sleutel": {
                "type": "string"
              },
              "label": {
                "type": "string"
              },
              "soort": {
                "const": "tekst"
              },
              "waarde": {
                "type": "string",
                "maxLength": 500000,
                "pattern": "^[^\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]*$",
                "x-max-utf16-code-eenheden": 500000,
                "description": "Maximaal 500000 JavaScript UTF-16-code-eenheden; tabs en regeleinden zijn toegestaan, overige C0-controlecodes niet."
              }
            },
            "required": [
              "sleutel",
              "label",
              "soort",
              "waarde"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "sleutel": {
                "type": "string"
              },
              "label": {
                "type": "string"
              },
              "soort": {
                "const": "keuze"
              },
              "waarde": {
                "type": "boolean"
              }
            },
            "required": [
              "sleutel",
              "label",
              "soort",
              "waarde"
            ],
            "additionalProperties": false
          }
        ]
      },
      "DocumentConceptMetadata": {
        "type": "object",
        "properties": {
          "schemaVersie": {
            "const": 1
          },
          "beschikbaar": {
            "const": true
          },
          "inhoudId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "revisie": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          },
          "etag": {
            "type": "string",
            "pattern": "^\"[a-fA-F0-9-]{36}:[a-f0-9]{64}\"$"
          },
          "status": {
            "type": "string",
            "enum": [
              "inhoud_beschikbaar",
              "opmaak_bezig",
              "gedeeltelijk",
              "concept_klaar"
            ]
          },
          "inhoudStatus": {
            "type": "string",
            "enum": [
              "gecontroleerd",
              "broncontrole_nodig"
            ]
          },
          "bestanden": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "pdf",
                "docx"
              ]
            },
            "maxItems": 2,
            "uniqueItems": true
          },
          "ontbrekendeVereisten": {
            "type": "array",
            "items": {
              "type": "string",
              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
            }
          },
          "bevindingen": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "status": {
                  "const": "let op"
                },
                "klantcontrole": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "const": "voorbeeld_broninhoud"
                    }
                  },
                  "required": [
                    "code"
                  ],
                  "additionalProperties": false
                },
                "onderwerp": {
                  "type": "string"
                },
                "tekst": {
                  "type": "string"
                }
              },
              "required": [
                "status",
                "klantcontrole",
                "onderwerp",
                "tekst"
              ],
              "additionalProperties": false
            },
            "maxItems": 1
          },
          "bewerkbaar": {
            "type": "boolean"
          },
          "bewerkwijze": {
            "type": "string",
            "enum": [
              "markdown",
              "structuur"
            ]
          },
          "opmaakMogelijk": {
            "type": "boolean"
          },
          "controleBereik": {
            "const": "deze_aanvraag"
          },
          "bijgewerktOp": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "schemaVersie",
          "beschikbaar",
          "inhoudId",
          "revisie",
          "etag",
          "status",
          "inhoudStatus",
          "bestanden",
          "ontbrekendeVereisten",
          "bevindingen",
          "bewerkbaar",
          "bewerkwijze",
          "opmaakMogelijk",
          "controleBereik",
          "bijgewerktOp"
        ],
        "additionalProperties": false,
        "description": "Afgeleid concept, los van origineel rapport. Een terminale opmaakjob met status opmaak_bezig wordt getoond als gedeeltelijk als er bestanden zijn, anders inhoud_beschikbaar. bestanden is metadata; download controleert de concrete inhoudsbinding. opmaakMogelijk is een actuele mogelijkheid, geen uitvoeringsbewijs."
      },
      "DocumentConceptLeesantwoord": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "schemaVersie": {
                "const": 1
              },
              "beschikbaar": {
                "const": false
              }
            },
            "required": [
              "schemaVersie",
              "beschikbaar"
            ],
            "additionalProperties": false
          },
          {
            "$ref": "#/components/schemas/DocumentConceptMetadata"
          }
        ]
      },
      "DocumentConceptInhoudAntwoord": {
        "type": "object",
        "properties": {
          "schemaVersie": {
            "const": 1
          },
          "beschikbaar": {
            "const": true
          },
          "inhoudId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "revisie": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          },
          "etag": {
            "type": "string",
            "pattern": "^\"[a-fA-F0-9-]{36}:[a-f0-9]{64}\"$"
          },
          "status": {
            "type": "string",
            "enum": [
              "inhoud_beschikbaar",
              "opmaak_bezig",
              "gedeeltelijk",
              "concept_klaar"
            ]
          },
          "inhoudStatus": {
            "type": "string",
            "enum": [
              "gecontroleerd",
              "broncontrole_nodig"
            ]
          },
          "bestanden": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "pdf",
                "docx"
              ]
            },
            "maxItems": 2,
            "uniqueItems": true
          },
          "ontbrekendeVereisten": {
            "type": "array",
            "items": {
              "type": "string",
              "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,119}$"
            }
          },
          "bevindingen": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "status": {
                  "const": "let op"
                },
                "klantcontrole": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "const": "voorbeeld_broninhoud"
                    }
                  },
                  "required": [
                    "code"
                  ],
                  "additionalProperties": false
                },
                "onderwerp": {
                  "type": "string"
                },
                "tekst": {
                  "type": "string"
                }
              },
              "required": [
                "status",
                "klantcontrole",
                "onderwerp",
                "tekst"
              ],
              "additionalProperties": false
            },
            "maxItems": 1
          },
          "bewerkbaar": {
            "type": "boolean"
          },
          "bewerkwijze": {
            "type": "string",
            "enum": [
              "markdown",
              "structuur"
            ]
          },
          "opmaakMogelijk": {
            "type": "boolean"
          },
          "controleBereik": {
            "const": "deze_aanvraag"
          },
          "bijgewerktOp": {
            "type": "string",
            "format": "date-time"
          },
          "markdown": {
            "type": "string"
          },
          "tekst": {
            "type": "string"
          },
          "inhoud": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/DocumentConceptInhoud"
              },
              {
                "type": "null"
              }
            ]
          },
          "velden": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DocumentConceptBewerkveld"
            }
          }
        },
        "required": [
          "schemaVersie",
          "beschikbaar",
          "inhoudId",
          "revisie",
          "etag",
          "status",
          "inhoudStatus",
          "bestanden",
          "ontbrekendeVereisten",
          "bevindingen",
          "bewerkbaar",
          "bewerkwijze",
          "opmaakMogelijk",
          "controleBereik",
          "bijgewerktOp",
          "markdown",
          "tekst",
          "inhoud",
          "velden"
        ],
        "additionalProperties": false,
        "description": "inhoud is null als alleen bewaarde Markdown beschikbaar is; velden is dan leeg. tekst is de leesbare tekstafleiding of de oorspronkelijke Markdown. Gebruik uitsluitend aangeboden veldsleutels voor structuurwijziging."
      },
      "DocumentConceptWijziging": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "markdown": {
                "type": "string",
                "minLength": 1,
                "pattern": "\\S",
                "description": "Niet leeg, maximaal 2 MiB UTF-8 intern en geen verboden C0-controlecodes. De publieke JSON-parser begrenst de volledige aanvraag eerder tot 100 KiB."
              }
            },
            "required": [
              "markdown"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "wijzigingen": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "sleutel": {
                      "type": "string"
                    },
                    "waarde": {
                      "oneOf": [
                        {
                          "type": "string",
                          "maxLength": 500000,
                          "pattern": "^[^\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]*$",
                          "x-max-utf16-code-eenheden": 500000,
                          "description": "Maximaal 500000 JavaScript UTF-16-code-eenheden; tabs en regeleinden zijn toegestaan, overige C0-controlecodes niet."
                        },
                        {
                          "type": "boolean"
                        }
                      ]
                    }
                  },
                  "required": [
                    "sleutel",
                    "waarde"
                  ],
                  "additionalProperties": false
                },
                "minItems": 1,
                "maxItems": 2000,
                "description": "Iedere sleutel eenmaal, alleen bestaande aangeboden velden en hetzelfde waardetype. Geen willekeurige paden, nieuwe onderdelen, bronverwijzingen of functiewijzigingen."
              }
            },
            "required": [
              "wijzigingen"
            ],
            "additionalProperties": false
          }
        ]
      },
      "DocumentHerstelOverzicht": {
        "type": "object",
        "properties": {
          "schemaVersie": {
            "const": 1
          },
          "periodeDagen": {
            "const": 30
          },
          "totaal": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "statussen": {
            "type": "object",
            "properties": {
              "origineel_gereed": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "concept_gereed": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "deels_beschikbaar": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "verwerking_bezig": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "aanvulling_nodig": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "inhoud_beschikbaar": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "origineel_gereed",
              "concept_gereed",
              "deels_beschikbaar",
              "verwerking_bezig",
              "aanvulling_nodig",
              "inhoud_beschikbaar"
            ],
            "additionalProperties": false
          },
          "oorzaken": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string",
                  "enum": [
                    "document_uitvoer_buiten_pagina",
                    "document_uitvoer_tekst_ontbreekt",
                    "document_uitvoer_tabelrelaties_ongeldig",
                    "document_pdf_ongeldig",
                    "document_docx_ongeldig",
                    "document_pdf_render_mislukt",
                    "document_docx_render_mislukt",
                    "overig"
                  ]
                },
                "aantal": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                }
              },
              "required": [
                "code",
                "aantal"
              ],
              "additionalProperties": false
            },
            "maxItems": 8,
            "description": "Elke oorzaakcode hoogstens eenmaal, aantal per code maximaal totaal. Eén rapport kan meerdere oorzaken hebben, dus de som hoeft niet totaal te zijn."
          },
          "bijgewerktOp": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "schemaVersie",
          "periodeDagen",
          "totaal",
          "statussen",
          "oorzaken",
          "bijgewerktOp"
        ],
        "additionalProperties": false,
        "description": "Som van de zes statustellingen is exact totaal. Iedere telling is een niet-negatief veilig geheel JavaScript-getal. Bevat geen namen, rapportinhoud of rapport-IDs."
      },
      "BeeldbankBeleid": {
        "type": "object",
        "properties": {
          "team_verwijderen_alleen_beheer": {
            "type": "boolean"
          },
          "is_beheerder": {
            "type": "boolean"
          },
          "eigen_rol": {
            "type": "string"
          }
        },
        "required": [
          "team_verwijderen_alleen_beheer",
          "is_beheerder",
          "eigen_rol"
        ],
        "additionalProperties": false
      },
      "BeeldbankBeeld": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "naam": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "pattern": "^[^\\u0000-\\u001f\\u007f]*\\S[^\\u0000-\\u001f\\u007f]*$",
            "description": "Canonieke naam. Native normalisatie zet invoer om naar tekst, verwijdert het paddeel en trimt; daarna maximaal 120 UTF-16-code-eenheden, zonder C0/DEL. Naamconflict geeft 409."
          },
          "mime": {
            "const": "image/png"
          },
          "breedte": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20000
          },
          "hoogte": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20000
          },
          "byte_size": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10485760
          },
          "sha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "preview_url": {
            "anyOf": [
              {
                "type": "string",
                "format": "uri"
              },
              {
                "type": "null"
              }
            ]
          },
          "aangemaakt_op": {
            "type": "string",
            "format": "date-time"
          },
          "gebruikt_in": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "stijlprofiel_id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                },
                "naam": {
                  "type": "string"
                }
              },
              "required": [
                "stijlprofiel_id",
                "naam"
              ],
              "additionalProperties": false
            }
          },
          "deling_scope": {
            "type": "string",
            "enum": [
              "persoonlijk",
              "team"
            ]
          },
          "is_eigenaar": {
            "type": "boolean"
          },
          "kan_delen": {
            "type": "boolean"
          },
          "kan_verwijderen": {
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "naam",
          "mime",
          "breedte",
          "hoogte",
          "byte_size",
          "sha256",
          "preview_url",
          "aangemaakt_op",
          "gebruikt_in",
          "deling_scope",
          "is_eigenaar",
          "kan_delen",
          "kan_verwijderen"
        ],
        "additionalProperties": false,
        "description": "Genormaliseerde PNG zonder originele metadata. Nieuwe upload: breedte × hoogte maximaal 25000000 pixels, elke zijde maximaal 20000, PNG maximaal 5 MiB. Opslagcontract laat bestaande byte_size tot 10 MiB toe. SHA en byte_size horen bij de PNG. preview_url is een private miniatuurlink van 120 seconden en mag null zijn bij ondertekenfout. Geen opslagpad, eigenaar-ID of originele afbeelding in het DTO. gebruikt_in komt alleen uit actieve stijlversies die deze inhoudshash vervangen."
      },
      "DuurzameHergeneratieInvoer": {
        "type": "object",
        "properties": {
          "instructie": {
            "type": "string",
            "minLength": 10,
            "maxLength": 2000,
            "pattern": "\\S",
            "description": "Canonieke getrimde tekst; de native validator meet 10–2000 JavaScript UTF-16-code-eenheden na trimmen."
          },
          "tier": {
            "type": "string",
            "enum": [
              "basis",
              "standaard",
              "max"
            ]
          },
          "basis_versie": {
            "type": "integer",
            "minimum": 1,
            "maximum": 9007199254740991
          }
        },
        "required": [
          "instructie",
          "basis_versie"
        ],
        "additionalProperties": false
      },
      "RapportHergeneratieOntvangen": {
        "type": "object",
        "properties": {
          "taak_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "mutatie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "status": {
            "const": "bezig"
          },
          "creditmodus": {
            "const": "persoonlijke_api_kosten"
          }
        },
        "required": [
          "taak_id",
          "mutatie_id",
          "status",
          "creditmodus"
        ],
        "additionalProperties": false,
        "description": "HTTP 202. Ook reconcile_required zonder terminale response wordt door deze rapportroute nog als bezig getoond. Lees het aparte mutatie-DTO om reconcile_required te onderscheiden. Geen fase, tekst of geboekt creditbedrag in dit antwoord."
      },
      "RapportHergeneratieHerhaaldKlaar": {
        "type": "object",
        "properties": {
          "ok": {
            "const": true
          },
          "versie_nummer": {
            "type": "integer",
            "minimum": 2
          },
          "tier": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "creditmodus": {
            "const": "persoonlijke_api_kosten"
          }
        },
        "required": [
          "ok",
          "versie_nummer",
          "tier",
          "creditmodus"
        ],
        "additionalProperties": false,
        "description": "HTTP 200 met opgeslagen definitieve publicatieontvangst uit SQL 202/366. Bevat geen mutatie_id, taak_id, status of rapportinhoud. tier is de opgeslagen prijssnapshotwaarde en kan null zijn. De API-adapter verwijdert credits_afgeboekt."
      },
      "RapportHergeneratieHerhaaldMislukt": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string"
          },
          "detail": {
            "type": "string"
          },
          "credits_teruggeboekt": {
            "type": "integer",
            "minimum": 0
          },
          "creditmodus": {
            "const": "persoonlijke_api_kosten"
          }
        },
        "required": [
          "code",
          "detail",
          "creditmodus"
        ],
        "additionalProperties": false,
        "description": "Opgeslagen terminale fout na creditrelease. HTTP 402 bij onvoldoende credits/maandplafond, 429 bij dagcap, 409 bij basis/targetconflict, anders 502. Optioneel credits_teruggeboekt is het native mutatiebedrag; geen actueel saldo of nieuwe prijsbelofte."
      },
      "GesprekHergeneratieOntvangst": {
        "type": "object",
        "properties": {
          "mutatie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "taak_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "bezig",
              "klaar",
              "mislukt",
              "controle_nodig"
            ]
          },
          "fase": {
            "type": "string",
            "enum": [
              "ontvangen",
              "schrijven",
              "opslaan"
            ]
          },
          "code": {
            "type": "string",
            "pattern": "^[a-z0-9_]{1,80}$"
          },
          "versie_nummer": {
            "type": "integer",
            "minimum": 1
          },
          "creditmodus": {
            "const": "persoonlijke_api_kosten"
          }
        },
        "required": [
          "mutatie_id",
          "taak_id",
          "status",
          "fase",
          "creditmodus"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "properties": {
                "status": {
                  "not": {
                    "const": "klaar"
                  }
                }
              }
            },
            "then": {
              "not": {
                "required": [
                  "versie_nummer"
                ]
              }
            }
          },
          {
            "if": {
              "properties": {
                "status": {
                  "enum": [
                    "bezig",
                    "klaar"
                  ]
                }
              }
            },
            "then": {
              "not": {
                "required": [
                  "code"
                ]
              }
            }
          }
        ],
        "description": "HTTP 202, ook bij herhaald klaar/mislukt. fase volgt modelstatus: ready→opslaan, started→schrijven, anders ontvangen. reconcile_required of een begonnen model bij failed geeft controle_nodig. code alleen bij failed/reconcile_required en geldig codeformaat. versie_nummer alleen bij succeeded wanneer de opgeslagen response deze bevat. Geen inhoud of providerdata."
      },
      "PubliekeUitvoermutatieStatus": {
        "type": "object",
        "properties": {
          "mutatie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "taak_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "queued",
              "processing",
              "succeeded",
              "failed",
              "reconcile_required"
            ]
          },
          "basis_versie": {
            "type": "integer",
            "minimum": 1
          },
          "versie_nummer": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "creditmodus": {
            "const": "persoonlijke_api_kosten"
          },
          "foutcode": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_]{0,99}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "aangemaakt_op": {
            "type": "string",
            "format": "date-time"
          },
          "afgerond_op": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "mutatie_id",
          "taak_id",
          "status",
          "basis_versie",
          "versie_nummer",
          "creditmodus",
          "foutcode",
          "aangemaakt_op",
          "afgerond_op"
        ],
        "additionalProperties": false,
        "description": "Afzonderlijke publieke statusnamen uit de duurzame opslag. Geen fase, inhoud, providerantwoord, target_id, interne lease of betaald bedrag. versie_nummer is null zolang geen opgeslagen responseversie bestaat."
      },
      "DocumentStartOntvangstActueel": {
        "type": "object",
        "properties": {
          "versie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versie_nummer": {
            "type": "integer",
            "minimum": 1
          },
          "taal": {
            "type": "string",
            "pattern": "^[a-z]{2,3}$",
            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
          },
          "tweedeTaal": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 40,
                "description": "Teruggegeven legacy-invoerwaarde of null; niet automatisch dezelfde waarde als de opgeloste uitkomsttaal."
              },
              {
                "type": "null"
              }
            ]
          },
          "requestedLanguagePolicy": {
            "type": "object",
            "properties": {
              "primary": {
                "type": "string",
                "pattern": "^[a-z]{2,3}$",
                "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
              },
              "secondary": {
                "type": "object",
                "properties": {
                  "report": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "mode": {
                            "type": "string",
                            "enum": [
                              "off",
                              "inherit"
                            ]
                          }
                        },
                        "required": [
                          "mode"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "mode": {
                            "const": "specific"
                          },
                          "language": {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$",
                            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                          }
                        },
                        "required": [
                          "mode",
                          "language"
                        ],
                        "additionalProperties": false
                      }
                    ]
                  },
                  "coverLetter": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "mode": {
                            "type": "string",
                            "enum": [
                              "off",
                              "inherit"
                            ]
                          }
                        },
                        "required": [
                          "mode"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "mode": {
                            "const": "specific"
                          },
                          "language": {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$",
                            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                          }
                        },
                        "required": [
                          "mode",
                          "language"
                        ],
                        "additionalProperties": false
                      }
                    ]
                  }
                },
                "required": [
                  "report",
                  "coverLetter"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "primary",
              "secondary"
            ],
            "additionalProperties": false
          },
          "resolvedLanguages": {
            "type": "object",
            "properties": {
              "primary": {
                "type": "string",
                "pattern": "^[a-z]{2,3}$",
                "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
              },
              "secondary": {
                "type": "object",
                "properties": {
                  "report": {
                    "type": "object",
                    "properties": {
                      "requestedMode": {
                        "type": "string",
                        "enum": [
                          "inherit",
                          "off",
                          "specific"
                        ]
                      },
                      "enabled": {
                        "type": "boolean"
                      },
                      "language": {
                        "anyOf": [
                          {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$",
                            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "explicit_off",
                          "no_default",
                          "same_as_primary",
                          "legacy",
                          "request",
                          "office_default",
                          "feature_flag",
                          "office_disabled"
                        ]
                      }
                    },
                    "required": [
                      "requestedMode",
                      "enabled",
                      "language",
                      "source"
                    ],
                    "additionalProperties": false
                  },
                  "coverLetter": {
                    "type": "object",
                    "properties": {
                      "requestedMode": {
                        "type": "string",
                        "enum": [
                          "inherit",
                          "off",
                          "specific"
                        ]
                      },
                      "enabled": {
                        "type": "boolean"
                      },
                      "language": {
                        "anyOf": [
                          {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$",
                            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "explicit_off",
                          "no_default",
                          "same_as_primary",
                          "legacy",
                          "request",
                          "office_default",
                          "feature_flag",
                          "office_disabled"
                        ]
                      }
                    },
                    "required": [
                      "requestedMode",
                      "enabled",
                      "language",
                      "source"
                    ],
                    "additionalProperties": false
                  },
                  "conversationReport": {
                    "type": "object",
                    "properties": {
                      "requestedMode": {
                        "type": "string",
                        "enum": [
                          "inherit",
                          "off",
                          "specific"
                        ]
                      },
                      "enabled": {
                        "type": "boolean"
                      },
                      "language": {
                        "anyOf": [
                          {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$",
                            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "explicit_off",
                          "no_default",
                          "same_as_primary",
                          "legacy",
                          "request",
                          "office_default",
                          "feature_flag",
                          "office_disabled"
                        ]
                      }
                    },
                    "required": [
                      "requestedMode",
                      "enabled",
                      "language",
                      "source"
                    ],
                    "additionalProperties": false
                  },
                  "customerEmail": {
                    "type": "object",
                    "properties": {
                      "requestedMode": {
                        "type": "string",
                        "enum": [
                          "inherit",
                          "off",
                          "specific"
                        ]
                      },
                      "enabled": {
                        "type": "boolean"
                      },
                      "language": {
                        "anyOf": [
                          {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$",
                            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "explicit_off",
                          "no_default",
                          "same_as_primary",
                          "legacy",
                          "request",
                          "office_default",
                          "feature_flag",
                          "office_disabled"
                        ]
                      }
                    },
                    "required": [
                      "requestedMode",
                      "enabled",
                      "language",
                      "source"
                    ],
                    "additionalProperties": false
                  },
                  "followUpEmail": {
                    "type": "object",
                    "properties": {
                      "requestedMode": {
                        "type": "string",
                        "enum": [
                          "inherit",
                          "off",
                          "specific"
                        ]
                      },
                      "enabled": {
                        "type": "boolean"
                      },
                      "language": {
                        "anyOf": [
                          {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$",
                            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "explicit_off",
                          "no_default",
                          "same_as_primary",
                          "legacy",
                          "request",
                          "office_default",
                          "feature_flag",
                          "office_disabled"
                        ]
                      }
                    },
                    "required": [
                      "requestedMode",
                      "enabled",
                      "language",
                      "source"
                    ],
                    "additionalProperties": false
                  }
                },
                "required": [
                  "report",
                  "coverLetter",
                  "conversationReport",
                  "customerEmail",
                  "followUpEmail"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "primary",
              "secondary"
            ],
            "additionalProperties": false
          },
          "activeVariantStatuses": {
            "const": []
          },
          "variantStatuses": {
            "const": []
          },
          "policyVersion": {
            "type": "integer",
            "minimum": 0
          },
          "policyUpdatedAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "taalbeleidWaarschuwing": {
            "type": "string"
          },
          "creditmodus": {
            "const": "persoonlijke_api_kosten"
          },
          "credits_schatting": {
            "type": "null"
          },
          "tier": {
            "type": "string",
            "enum": [
              "basis",
              "standaard",
              "max"
            ]
          },
          "lengteband": {
            "type": "string",
            "enum": [
              "standaard",
              "lang"
            ]
          },
          "voorbeeldprofiel": {
            "type": "object",
            "properties": {
              "id": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "versie_id": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "id",
              "versie_id"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "versie_id",
          "versie_nummer",
          "taal",
          "tweedeTaal",
          "requestedLanguagePolicy",
          "resolvedLanguages",
          "activeVariantStatuses",
          "variantStatuses",
          "policyVersion",
          "policyUpdatedAt",
          "creditmodus",
          "credits_schatting",
          "tier",
          "lengteband",
          "voorbeeldprofiel"
        ],
        "additionalProperties": false,
        "description": "Huidige publieke Rapportly-start onder persoonlijke werkelijke API-kosten. HTTP 200 bevestigt duurzame ontvangst, geen voltooiing. Geen status/job_id of inhoud. voorbeeldprofiel bevat bij neutrale generatie twee null-IDs; geen verzonnen profiel. Beide variantlijsten zijn hier altijd leeg, ook bij herhaalde start. Gebruik afzonderlijke bron-/taalstatus voor actuele resultaten."
      },
      "OfferteStartOntvangstActueel": {
        "type": "object",
        "properties": {
          "versie_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "versie_nummer": {
            "type": "integer",
            "minimum": 1
          },
          "taal": {
            "type": "string",
            "pattern": "^[a-z]{2,3}$",
            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
          },
          "tweedeTaal": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 40,
                "description": "Teruggegeven legacy-invoerwaarde of null; niet automatisch dezelfde waarde als de opgeloste uitkomsttaal."
              },
              {
                "type": "null"
              }
            ]
          },
          "requestedLanguagePolicy": {
            "type": "object",
            "properties": {
              "primary": {
                "type": "string",
                "pattern": "^[a-z]{2,3}$",
                "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
              },
              "secondary": {
                "type": "object",
                "properties": {
                  "report": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "mode": {
                            "type": "string",
                            "enum": [
                              "off",
                              "inherit"
                            ]
                          }
                        },
                        "required": [
                          "mode"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "mode": {
                            "const": "specific"
                          },
                          "language": {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$",
                            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                          }
                        },
                        "required": [
                          "mode",
                          "language"
                        ],
                        "additionalProperties": false
                      }
                    ]
                  },
                  "coverLetter": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "mode": {
                            "type": "string",
                            "enum": [
                              "off",
                              "inherit"
                            ]
                          }
                        },
                        "required": [
                          "mode"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "mode": {
                            "const": "specific"
                          },
                          "language": {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$",
                            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                          }
                        },
                        "required": [
                          "mode",
                          "language"
                        ],
                        "additionalProperties": false
                      }
                    ]
                  }
                },
                "required": [
                  "report",
                  "coverLetter"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "primary",
              "secondary"
            ],
            "additionalProperties": false
          },
          "resolvedLanguages": {
            "type": "object",
            "properties": {
              "primary": {
                "type": "string",
                "pattern": "^[a-z]{2,3}$",
                "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
              },
              "secondary": {
                "type": "object",
                "properties": {
                  "report": {
                    "type": "object",
                    "properties": {
                      "requestedMode": {
                        "type": "string",
                        "enum": [
                          "inherit",
                          "off",
                          "specific"
                        ]
                      },
                      "enabled": {
                        "type": "boolean"
                      },
                      "language": {
                        "anyOf": [
                          {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$",
                            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "explicit_off",
                          "no_default",
                          "same_as_primary",
                          "legacy",
                          "request",
                          "office_default",
                          "feature_flag",
                          "office_disabled"
                        ]
                      }
                    },
                    "required": [
                      "requestedMode",
                      "enabled",
                      "language",
                      "source"
                    ],
                    "additionalProperties": false
                  },
                  "coverLetter": {
                    "type": "object",
                    "properties": {
                      "requestedMode": {
                        "type": "string",
                        "enum": [
                          "inherit",
                          "off",
                          "specific"
                        ]
                      },
                      "enabled": {
                        "type": "boolean"
                      },
                      "language": {
                        "anyOf": [
                          {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$",
                            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "explicit_off",
                          "no_default",
                          "same_as_primary",
                          "legacy",
                          "request",
                          "office_default",
                          "feature_flag",
                          "office_disabled"
                        ]
                      }
                    },
                    "required": [
                      "requestedMode",
                      "enabled",
                      "language",
                      "source"
                    ],
                    "additionalProperties": false
                  },
                  "conversationReport": {
                    "type": "object",
                    "properties": {
                      "requestedMode": {
                        "type": "string",
                        "enum": [
                          "inherit",
                          "off",
                          "specific"
                        ]
                      },
                      "enabled": {
                        "type": "boolean"
                      },
                      "language": {
                        "anyOf": [
                          {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$",
                            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "explicit_off",
                          "no_default",
                          "same_as_primary",
                          "legacy",
                          "request",
                          "office_default",
                          "feature_flag",
                          "office_disabled"
                        ]
                      }
                    },
                    "required": [
                      "requestedMode",
                      "enabled",
                      "language",
                      "source"
                    ],
                    "additionalProperties": false
                  },
                  "customerEmail": {
                    "type": "object",
                    "properties": {
                      "requestedMode": {
                        "type": "string",
                        "enum": [
                          "inherit",
                          "off",
                          "specific"
                        ]
                      },
                      "enabled": {
                        "type": "boolean"
                      },
                      "language": {
                        "anyOf": [
                          {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$",
                            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "explicit_off",
                          "no_default",
                          "same_as_primary",
                          "legacy",
                          "request",
                          "office_default",
                          "feature_flag",
                          "office_disabled"
                        ]
                      }
                    },
                    "required": [
                      "requestedMode",
                      "enabled",
                      "language",
                      "source"
                    ],
                    "additionalProperties": false
                  },
                  "followUpEmail": {
                    "type": "object",
                    "properties": {
                      "requestedMode": {
                        "type": "string",
                        "enum": [
                          "inherit",
                          "off",
                          "specific"
                        ]
                      },
                      "enabled": {
                        "type": "boolean"
                      },
                      "language": {
                        "anyOf": [
                          {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$",
                            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "explicit_off",
                          "no_default",
                          "same_as_primary",
                          "legacy",
                          "request",
                          "office_default",
                          "feature_flag",
                          "office_disabled"
                        ]
                      }
                    },
                    "required": [
                      "requestedMode",
                      "enabled",
                      "language",
                      "source"
                    ],
                    "additionalProperties": false
                  }
                },
                "required": [
                  "report",
                  "coverLetter",
                  "conversationReport",
                  "customerEmail",
                  "followUpEmail"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "primary",
              "secondary"
            ],
            "additionalProperties": false
          },
          "activeVariantStatuses": {
            "const": []
          },
          "variantStatuses": {
            "const": []
          },
          "policyVersion": {
            "type": "integer",
            "minimum": 0
          },
          "policyUpdatedAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "taalbeleidWaarschuwing": {
            "type": "string"
          },
          "creditmodus": {
            "const": "persoonlijke_api_kosten"
          },
          "credits_schatting": {
            "type": "null"
          },
          "tier": {
            "type": "string",
            "enum": [
              "basis",
              "standaard",
              "max"
            ]
          },
          "lengteband": {
            "type": "string",
            "enum": [
              "standaard",
              "lang"
            ]
          },
          "voorbeeldprofiel": {
            "type": "object",
            "properties": {
              "id": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "versie_id": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "id",
              "versie_id"
            ],
            "additionalProperties": false
          },
          "offerte_snapshot": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "sha256": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              }
            },
            "required": [
              "id",
              "sha256"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "versie_id",
          "versie_nummer",
          "taal",
          "tweedeTaal",
          "requestedLanguagePolicy",
          "resolvedLanguages",
          "activeVariantStatuses",
          "variantStatuses",
          "policyVersion",
          "policyUpdatedAt",
          "creditmodus",
          "credits_schatting",
          "tier",
          "lengteband",
          "voorbeeldprofiel"
        ],
        "additionalProperties": false,
        "description": "Huidige startontvangst plus optioneel gebonden opgeslagen offerte_snapshot bij gestructureerde offerteregels. Het snapshot-ID is geen rapportversie-ID. Een bewaarde offerteclaim kan een historisch antwoord teruggeven; dat oudere opslagcontract is nog niet volledig genormaliseerd."
      },
      "GesprekStartOntvangstActueel": {
        "type": "object",
        "properties": {
          "gesprek_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "taal": {
            "type": "string",
            "pattern": "^[a-z]{2,3}$",
            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
          },
          "tweedeTaal": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 40,
                "description": "Teruggegeven legacy-invoerwaarde of null; niet automatisch dezelfde waarde als de opgeloste uitkomsttaal."
              },
              {
                "type": "null"
              }
            ]
          },
          "requestedLanguagePolicy": {
            "type": "object",
            "properties": {
              "primary": {
                "type": "string",
                "pattern": "^[a-z]{2,3}$",
                "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
              },
              "secondary": {
                "type": "object",
                "properties": {
                  "conversationReport": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "mode": {
                            "type": "string",
                            "enum": [
                              "off",
                              "inherit"
                            ]
                          }
                        },
                        "required": [
                          "mode"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "mode": {
                            "const": "specific"
                          },
                          "language": {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$",
                            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                          }
                        },
                        "required": [
                          "mode",
                          "language"
                        ],
                        "additionalProperties": false
                      }
                    ]
                  },
                  "customerEmail": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "mode": {
                            "type": "string",
                            "enum": [
                              "off",
                              "inherit"
                            ]
                          }
                        },
                        "required": [
                          "mode"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "mode": {
                            "const": "specific"
                          },
                          "language": {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$",
                            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                          }
                        },
                        "required": [
                          "mode",
                          "language"
                        ],
                        "additionalProperties": false
                      }
                    ]
                  },
                  "followUpEmail": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "mode": {
                            "type": "string",
                            "enum": [
                              "off",
                              "inherit"
                            ]
                          }
                        },
                        "required": [
                          "mode"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "mode": {
                            "const": "specific"
                          },
                          "language": {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$",
                            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                          }
                        },
                        "required": [
                          "mode",
                          "language"
                        ],
                        "additionalProperties": false
                      }
                    ]
                  }
                },
                "required": [
                  "conversationReport",
                  "customerEmail",
                  "followUpEmail"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "primary",
              "secondary"
            ],
            "additionalProperties": false
          },
          "resolvedLanguages": {
            "type": "object",
            "properties": {
              "primary": {
                "type": "string",
                "pattern": "^[a-z]{2,3}$",
                "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
              },
              "secondary": {
                "type": "object",
                "properties": {
                  "report": {
                    "type": "object",
                    "properties": {
                      "requestedMode": {
                        "type": "string",
                        "enum": [
                          "inherit",
                          "off",
                          "specific"
                        ]
                      },
                      "enabled": {
                        "type": "boolean"
                      },
                      "language": {
                        "anyOf": [
                          {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$",
                            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "explicit_off",
                          "no_default",
                          "same_as_primary",
                          "legacy",
                          "request",
                          "office_default",
                          "feature_flag",
                          "office_disabled"
                        ]
                      }
                    },
                    "required": [
                      "requestedMode",
                      "enabled",
                      "language",
                      "source"
                    ],
                    "additionalProperties": false
                  },
                  "coverLetter": {
                    "type": "object",
                    "properties": {
                      "requestedMode": {
                        "type": "string",
                        "enum": [
                          "inherit",
                          "off",
                          "specific"
                        ]
                      },
                      "enabled": {
                        "type": "boolean"
                      },
                      "language": {
                        "anyOf": [
                          {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$",
                            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "explicit_off",
                          "no_default",
                          "same_as_primary",
                          "legacy",
                          "request",
                          "office_default",
                          "feature_flag",
                          "office_disabled"
                        ]
                      }
                    },
                    "required": [
                      "requestedMode",
                      "enabled",
                      "language",
                      "source"
                    ],
                    "additionalProperties": false
                  },
                  "conversationReport": {
                    "type": "object",
                    "properties": {
                      "requestedMode": {
                        "type": "string",
                        "enum": [
                          "inherit",
                          "off",
                          "specific"
                        ]
                      },
                      "enabled": {
                        "type": "boolean"
                      },
                      "language": {
                        "anyOf": [
                          {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$",
                            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "explicit_off",
                          "no_default",
                          "same_as_primary",
                          "legacy",
                          "request",
                          "office_default",
                          "feature_flag",
                          "office_disabled"
                        ]
                      }
                    },
                    "required": [
                      "requestedMode",
                      "enabled",
                      "language",
                      "source"
                    ],
                    "additionalProperties": false
                  },
                  "customerEmail": {
                    "type": "object",
                    "properties": {
                      "requestedMode": {
                        "type": "string",
                        "enum": [
                          "inherit",
                          "off",
                          "specific"
                        ]
                      },
                      "enabled": {
                        "type": "boolean"
                      },
                      "language": {
                        "anyOf": [
                          {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$",
                            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "explicit_off",
                          "no_default",
                          "same_as_primary",
                          "legacy",
                          "request",
                          "office_default",
                          "feature_flag",
                          "office_disabled"
                        ]
                      }
                    },
                    "required": [
                      "requestedMode",
                      "enabled",
                      "language",
                      "source"
                    ],
                    "additionalProperties": false
                  },
                  "followUpEmail": {
                    "type": "object",
                    "properties": {
                      "requestedMode": {
                        "type": "string",
                        "enum": [
                          "inherit",
                          "off",
                          "specific"
                        ]
                      },
                      "enabled": {
                        "type": "boolean"
                      },
                      "language": {
                        "anyOf": [
                          {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$",
                            "description": "Concrete genormaliseerde taalcode, geen auto. De dienst trimt en zet hoofdletters om."
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "explicit_off",
                          "no_default",
                          "same_as_primary",
                          "legacy",
                          "request",
                          "office_default",
                          "feature_flag",
                          "office_disabled"
                        ]
                      }
                    },
                    "required": [
                      "requestedMode",
                      "enabled",
                      "language",
                      "source"
                    ],
                    "additionalProperties": false
                  }
                },
                "required": [
                  "report",
                  "coverLetter",
                  "conversationReport",
                  "customerEmail",
                  "followUpEmail"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "primary",
              "secondary"
            ],
            "additionalProperties": false
          },
          "activeVariantStatuses": {
            "const": []
          },
          "variantStatuses": {
            "const": []
          },
          "policyVersion": {
            "type": "integer",
            "minimum": 0
          },
          "policyUpdatedAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "taalbeleidWaarschuwing": {
            "type": "string"
          },
          "creditmodus": {
            "const": "persoonlijke_api_kosten"
          },
          "credits_schatting": {
            "type": "null"
          },
          "tier": {
            "type": "string",
            "enum": [
              "basis",
              "standaard",
              "max"
            ]
          },
          "lengteband": {
            "const": "standaard"
          }
        },
        "required": [
          "gesprek_id",
          "taal",
          "tweedeTaal",
          "requestedLanguagePolicy",
          "resolvedLanguages",
          "activeVariantStatuses",
          "variantStatuses",
          "policyVersion",
          "policyUpdatedAt",
          "creditmodus",
          "credits_schatting",
          "tier",
          "lengteband"
        ],
        "additionalProperties": false,
        "description": "HTTP 200 bevestigt het plannen/hergebruiken van de duurzame gespreksbundel. Geen status, job_id of al_verwerkt. De bronRef-dedupe met al_verwerkt behoort tot interne bronstarts en is niet bereikbaar met de expliciete publieke JSON-invoer. Taalvariantenlijsten zijn altijd leeg in dit startantwoord; lees actuele status apart."
      },
      "WorkflowWordMarkdownCapaciteiten": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "schema_versie": {
                "const": 1
              },
              "kopniveaus": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "enum": [
                    1,
                    2,
                    3
                  ]
                },
                "maxItems": 3,
                "uniqueItems": true,
                "description": "Oplopend. De producent neemt aanwezige kopstijlen over; latere niet-formulierrendercontrole vereist minstens 1 en 2."
              },
              "tabel": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "toegestaan": {
                        "const": false
                      },
                      "kolommen": {
                        "type": "null"
                      }
                    },
                    "required": [
                      "toegestaan",
                      "kolommen"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "toegestaan": {
                        "const": true
                      },
                      "kolommen": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 32
                      }
                    },
                    "required": [
                      "toegestaan",
                      "kolommen"
                    ],
                    "additionalProperties": false
                  }
                ]
              },
              "lijsten": {
                "type": "object",
                "properties": {
                  "onbepaald": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "toegestaan": {
                            "const": false
                          },
                          "niveaus": {
                            "const": []
                          }
                        },
                        "required": [
                          "toegestaan",
                          "niveaus"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "toegestaan": {
                            "const": true
                          },
                          "niveaus": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "properties": {
                                "niveau": {
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 8
                                },
                                "start": {
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 100000
                                }
                              },
                              "required": [
                                "niveau",
                                "start"
                              ],
                              "additionalProperties": false
                            },
                            "minItems": 1,
                            "maxItems": 9
                          }
                        },
                        "required": [
                          "toegestaan",
                          "niveaus"
                        ],
                        "additionalProperties": false,
                        "description": "Niveaus strikt oplopend en uniek. Geen aaneengesloten niveauverplichting; gebruik alleen niveaus uit dit vaste contract."
                      }
                    ]
                  },
                  "genummerd": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "toegestaan": {
                            "const": false
                          },
                          "niveaus": {
                            "const": []
                          }
                        },
                        "required": [
                          "toegestaan",
                          "niveaus"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "toegestaan": {
                            "const": true
                          },
                          "niveaus": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "properties": {
                                "niveau": {
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 8
                                },
                                "start": {
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 100000
                                }
                              },
                              "required": [
                                "niveau",
                                "start"
                              ],
                              "additionalProperties": false
                            },
                            "minItems": 1,
                            "maxItems": 9
                          }
                        },
                        "required": [
                          "toegestaan",
                          "niveaus"
                        ],
                        "additionalProperties": false,
                        "description": "Niveaus strikt oplopend en uniek. Geen aaneengesloten niveauverplichting; gebruik alleen niveaus uit dit vaste contract."
                      }
                    ]
                  }
                },
                "required": [
                  "onbepaald",
                  "genummerd"
                ],
                "additionalProperties": false
              },
              "citaat": {
                "type": "boolean"
              },
              "code_inline": {
                "type": "boolean"
              },
              "code_blok": {
                "type": "boolean"
              },
              "paginabreuk": {
                "const": true
              },
              "links": {
                "const": false
              },
              "afbeeldingen": {
                "const": false
              },
              "html": {
                "const": false
              }
            },
            "required": [
              "schema_versie",
              "kopniveaus",
              "tabel",
              "lijsten",
              "citaat",
              "code_inline",
              "code_blok",
              "paginabreuk",
              "links",
              "afbeeldingen",
              "html"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "schema_versie": {
                "const": 2
              },
              "kopniveaus": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "enum": [
                    1,
                    2,
                    3
                  ]
                },
                "maxItems": 3,
                "uniqueItems": true,
                "description": "Oplopend. De producent neemt aanwezige kopstijlen over; latere niet-formulierrendercontrole vereist minstens 1 en 2."
              },
              "tabel": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "toegestaan": {
                        "const": false
                      },
                      "kolommen": {
                        "type": "null"
                      }
                    },
                    "required": [
                      "toegestaan",
                      "kolommen"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "toegestaan": {
                        "const": true
                      },
                      "kolommen": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 32
                      }
                    },
                    "required": [
                      "toegestaan",
                      "kolommen"
                    ],
                    "additionalProperties": false
                  }
                ]
              },
              "lijsten": {
                "type": "object",
                "properties": {
                  "onbepaald": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "toegestaan": {
                            "const": false
                          },
                          "niveaus": {
                            "const": []
                          }
                        },
                        "required": [
                          "toegestaan",
                          "niveaus"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "toegestaan": {
                            "const": true
                          },
                          "niveaus": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "properties": {
                                "niveau": {
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 8
                                },
                                "start": {
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 100000
                                }
                              },
                              "required": [
                                "niveau",
                                "start"
                              ],
                              "additionalProperties": false
                            },
                            "minItems": 1,
                            "maxItems": 9
                          }
                        },
                        "required": [
                          "toegestaan",
                          "niveaus"
                        ],
                        "additionalProperties": false,
                        "description": "Niveaus strikt oplopend en uniek. Geen aaneengesloten niveauverplichting; gebruik alleen niveaus uit dit vaste contract."
                      }
                    ]
                  },
                  "genummerd": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "toegestaan": {
                            "const": false
                          },
                          "niveaus": {
                            "const": []
                          }
                        },
                        "required": [
                          "toegestaan",
                          "niveaus"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "toegestaan": {
                            "const": true
                          },
                          "niveaus": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "properties": {
                                "niveau": {
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 8
                                },
                                "start": {
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 100000
                                }
                              },
                              "required": [
                                "niveau",
                                "start"
                              ],
                              "additionalProperties": false
                            },
                            "minItems": 1,
                            "maxItems": 9
                          }
                        },
                        "required": [
                          "toegestaan",
                          "niveaus"
                        ],
                        "additionalProperties": false,
                        "description": "Niveaus strikt oplopend en uniek. Geen aaneengesloten niveauverplichting; gebruik alleen niveaus uit dit vaste contract."
                      }
                    ]
                  }
                },
                "required": [
                  "onbepaald",
                  "genummerd"
                ],
                "additionalProperties": false
              },
              "citaat": {
                "type": "boolean"
              },
              "code_inline": {
                "type": "boolean"
              },
              "code_blok": {
                "type": "boolean"
              },
              "paginabreuk": {
                "const": true
              },
              "links": {
                "const": false
              },
              "afbeeldingen": {
                "const": false
              },
              "html": {
                "const": false
              },
              "formulier": {
                "type": "object",
                "properties": {
                  "velden": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^F\\d{4}$"
                        },
                        "naam": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 160,
                          "pattern": "^[^<>\\u0000-\\u001f]+$",
                          "description": "Niet uitsluitend witruimte; bronlimiet in JavaScript UTF-16-eenheden."
                        },
                        "soort": {
                          "const": "keuzevak"
                        }
                      },
                      "required": [
                        "id",
                        "naam"
                      ],
                      "additionalProperties": false
                    },
                    "minItems": 1,
                    "maxItems": 1000,
                    "description": "Volgorde bepaalt ID: F0001, F0002 enzovoort, zonder gaten."
                  },
                  "inhoud_sha256": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  },
                  "instructie_context": {
                    "type": "string",
                    "maxLength": 500000,
                    "description": "UTF-16-limiet uit de bestaande bronvalidator."
                  },
                  "vaste_tekst_ids": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "pattern": "^S\\d{5}$"
                    },
                    "maxItems": 20000,
                    "uniqueItems": true
                  }
                },
                "required": [
                  "velden",
                  "inhoud_sha256",
                  "instructie_context",
                  "vaste_tekst_ids"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "schema_versie",
              "kopniveaus",
              "tabel",
              "lijsten",
              "citaat",
              "code_inline",
              "code_blok",
              "paginabreuk",
              "links",
              "afbeeldingen",
              "html",
              "formulier"
            ],
            "additionalProperties": false
          }
        ],
        "description": "Vaste mogelijkheden van de geselecteerde Word-versie. Schema 2 bevat uitsluitend de formulierprojectie voor inhoudsproductie. Dit is geen aanbod om een volledig nieuw sjabloon of willekeurige formuliertekst aan de workflow te sturen."
      },
      "WorkflowPresentatieLayoutcapaciteiten": {
        "type": "object",
        "properties": {
          "schema_versie": {
            "const": 1
          },
          "diaformaat": {
            "type": "string",
            "pattern": "^\\d+:\\d+$"
          },
          "max_dias": {
            "type": "integer",
            "minimum": 1,
            "maximum": 200
          },
          "notities": {
            "type": "boolean"
          },
          "tabel": {
            "type": "object",
            "properties": {
              "toegestaan": {
                "type": "boolean"
              },
              "max_kolommen": {
                "type": "integer",
                "minimum": 2,
                "maximum": 8
              },
              "max_rijen": {
                "type": "integer",
                "minimum": 3,
                "maximum": 14
              }
            },
            "required": [
              "toegestaan",
              "max_kolommen",
              "max_rijen"
            ],
            "additionalProperties": false
          },
          "grafiek": {
            "type": "object",
            "properties": {
              "toegestaan": {
                "type": "boolean"
              },
              "typen": {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "staaf",
                    "kolom",
                    "lijn",
                    "taart"
                  ]
                },
                "minItems": 1,
                "maxItems": 4,
                "uniqueItems": true
              },
              "max_reeksen": {
                "type": "integer",
                "minimum": 1,
                "maximum": 12
              },
              "max_punten": {
                "type": "integer",
                "minimum": 2,
                "maximum": 50
              }
            },
            "required": [
              "toegestaan",
              "typen",
              "max_reeksen",
              "max_punten"
            ],
            "additionalProperties": false
          },
          "smartart": {
            "const": false
          },
          "afbeeldingen": {
            "const": false
          },
          "links": {
            "const": false
          },
          "html": {
            "const": false
          },
          "markdown_inline": {
            "const": [
              "vet",
              "cursief"
            ]
          },
          "layouts": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "pattern": "^L\\d{3}$"
                },
                "rol": {
                  "type": "string",
                  "enum": [
                    "titel",
                    "sectie",
                    "titel_inhoud",
                    "twee_inhoud",
                    "vergelijking",
                    "beeld_tekst",
                    "alleen_titel",
                    "leeg",
                    "overig"
                  ]
                },
                "vereist": {
                  "oneOf": [
                    {
                      "const": []
                    },
                    {
                      "const": [
                        "titel"
                      ]
                    }
                  ]
                },
                "optioneel": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "enum": [
                      "body",
                      "body2",
                      "ondertitel"
                    ]
                  },
                  "maxItems": 3,
                  "uniqueItems": true
                },
                "titel": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "max_tekens": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 20000
                        }
                      },
                      "required": [
                        "max_tekens"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "ondertitel": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "max_tekens": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 20000
                        }
                      },
                      "required": [
                        "max_tekens"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "body": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "max_bullets": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 9
                        },
                        "max_tekens_per_bullet": {
                          "type": "integer",
                          "minimum": 30,
                          "maximum": 160
                        },
                        "max_tekens": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 20000
                        },
                        "lijstniveaus": {
                          "type": "array",
                          "items": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 8
                          },
                          "minItems": 1,
                          "maxItems": 9,
                          "uniqueItems": true,
                          "description": "Begint bij 0, vervolgens strikt oplopend."
                        }
                      },
                      "required": [
                        "max_bullets",
                        "max_tekens_per_bullet",
                        "max_tekens",
                        "lijstniveaus"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "body2": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "max_bullets": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 9
                        },
                        "max_tekens_per_bullet": {
                          "type": "integer",
                          "minimum": 30,
                          "maximum": 160
                        },
                        "max_tekens": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 20000
                        },
                        "lijstniveaus": {
                          "type": "array",
                          "items": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 8
                          },
                          "minItems": 1,
                          "maxItems": 9,
                          "uniqueItems": true,
                          "description": "Begint bij 0, vervolgens strikt oplopend."
                        }
                      },
                      "required": [
                        "max_bullets",
                        "max_tekens_per_bullet",
                        "max_tekens",
                        "lijstniveaus"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "koppen": {
                  "oneOf": [
                    {
                      "const": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "max_tekens": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 60
                        }
                      },
                      "required": [
                        "max_tekens"
                      ],
                      "additionalProperties": false
                    }
                  ]
                },
                "beeld": {
                  "type": "boolean"
                }
              },
              "required": [
                "id",
                "rol",
                "vereist",
                "optioneel",
                "titel",
                "ondertitel",
                "body",
                "body2",
                "koppen",
                "beeld"
              ],
              "additionalProperties": false,
              "description": "vereist is exact [titel] bij een titelvak, anders leeg. optioneel noemt aanwezige body, body2, ondertitel in die volgorde. body2 en koppen vereisen body; rol overig vereist titel. De huidige producent begrenst koppen tot minstens 4, de bestaande validator accepteert 1–60."
            },
            "minItems": 1,
            "maxItems": 128,
            "description": "Unieke IDs, lexicografisch strikt oplopend; dit zijn layouts, geen reeds gegenereerde dia’s."
          }
        },
        "required": [
          "schema_versie",
          "diaformaat",
          "max_dias",
          "notities",
          "tabel",
          "grafiek",
          "smartart",
          "afbeeldingen",
          "links",
          "html",
          "markdown_inline",
          "layouts"
        ],
        "additionalProperties": false,
        "description": "Expliciet begrensd contract van de PPTX-engine. Huidige producent: max_dias 200; grafiektypen alle vier in bovenstaande volgorde, max_reeksen 4 en max_punten 12. De validator accepteert de getypeerde ruimere grenzen. Bestaande identiteitscontrole accepteert daarnaast de oude max_dias = min(128,max(40,aantal layouts)) als de overige identiteit exact gelijk blijft. Beschikbare layout is geen bewijs dat productie al is uitgevoerd."
      },
      "CrmInstellingSjabloonNieuw": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "naam": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "pattern": "\\S",
            "description": "String, niet uitsluitend witruimte. Lengte wordt vóór trimmen in JavaScript UTF-16-eenheden begrensd; daarna trimmen. Geen afkappen of typecoercie."
          },
          "regels": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                },
                "titel": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 150,
                  "pattern": "\\S",
                  "description": "String, niet uitsluitend witruimte. Lengte wordt vóór trimmen in JavaScript UTF-16-eenheden begrensd; daarna trimmen. Geen afkappen of typecoercie."
                }
              },
              "required": [
                "id",
                "titel"
              ],
              "additionalProperties": false
            },
            "maxItems": 100,
            "description": "IDs binnen deze lijst uniek na omzetting naar kleine letters. Lege lijst toegestaan."
          }
        },
        "required": [
          "id",
          "naam",
          "regels"
        ],
        "additionalProperties": false
      },
      "CrmZoekfiltersInvoer": {
        "type": "object",
        "properties": {
          "soort": {
            "type": "string",
            "enum": [
              "",
              "opnames",
              "gesprekken",
              "mail",
              "bestanden",
              "rapporten",
              "powerpoint",
              "offertes",
              "notities",
              "excel"
            ]
          },
          "vanaf": {
            "oneOf": [
              {
                "const": ""
              },
              {
                "type": "string",
                "format": "date",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
              }
            ],
            "description": "Leeg of echte kalenderdatum; terugomzetting via Date moet exact dezelfde datum opleveren. Geen null."
          },
          "tot": {
            "oneOf": [
              {
                "const": ""
              },
              {
                "type": "string",
                "format": "date",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
              }
            ],
            "description": "Leeg of echte kalenderdatum; terugomzetting via Date moet exact dezelfde datum opleveren. Geen null."
          },
          "definitief": {
            "type": "boolean"
          },
          "traject": {
            "oneOf": [
              {
                "const": ""
              },
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              }
            ]
          }
        },
        "required": [],
        "additionalProperties": false,
        "description": "Afwezige filters en ontbrekende velden krijgen lege strings en definitief:false. Alleen echte booleans. Indien beide datums gevuld zijn: vanaf <= tot. Een traject-UUID vereist bij nieuwe opslag een bestaand, niet verwijderd, actueel leesbaar dossier met klant-/bronrechten."
      },
      "CrmInstellingZoekopdrachtNieuw": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "naam": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "pattern": "\\S",
            "description": "String, niet uitsluitend witruimte. Lengte wordt vóór trimmen in JavaScript UTF-16-eenheden begrensd; daarna trimmen. Geen afkappen of typecoercie."
          },
          "q": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "pattern": "\\S",
            "description": "String, niet uitsluitend witruimte. Lengte wordt vóór trimmen in JavaScript UTF-16-eenheden begrensd; daarna trimmen. Geen afkappen of typecoercie."
          },
          "filters": {
            "$ref": "#/components/schemas/CrmZoekfiltersInvoer"
          }
        },
        "required": [
          "id",
          "naam",
          "q"
        ],
        "additionalProperties": false
      },
      "CrmInstellingZoekopdrachtGenormaliseerd": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "naam": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "pattern": "\\S",
            "description": "String, niet uitsluitend witruimte. Lengte wordt vóór trimmen in JavaScript UTF-16-eenheden begrensd; daarna trimmen. Geen afkappen of typecoercie."
          },
          "q": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "pattern": "\\S",
            "description": "String, niet uitsluitend witruimte. Lengte wordt vóór trimmen in JavaScript UTF-16-eenheden begrensd; daarna trimmen. Geen afkappen of typecoercie."
          },
          "filters": {
            "type": "object",
            "properties": {
              "soort": {
                "type": "string",
                "enum": [
                  "",
                  "opnames",
                  "gesprekken",
                  "mail",
                  "bestanden",
                  "rapporten",
                  "powerpoint",
                  "offertes",
                  "notities",
                  "excel"
                ]
              },
              "vanaf": {
                "oneOf": [
                  {
                    "const": ""
                  },
                  {
                    "type": "string",
                    "format": "date",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                  }
                ],
                "description": "Leeg of echte kalenderdatum; terugomzetting via Date moet exact dezelfde datum opleveren. Geen null."
              },
              "tot": {
                "oneOf": [
                  {
                    "const": ""
                  },
                  {
                    "type": "string",
                    "format": "date",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                  }
                ],
                "description": "Leeg of echte kalenderdatum; terugomzetting via Date moet exact dezelfde datum opleveren. Geen null."
              },
              "definitief": {
                "type": "boolean"
              },
              "traject": {
                "oneOf": [
                  {
                    "const": ""
                  },
                  {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  }
                ]
              }
            },
            "required": [
              "soort",
              "vanaf",
              "tot",
              "definitief",
              "traject"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "id",
          "naam",
          "q",
          "filters"
        ],
        "additionalProperties": false
      },
      "CrmInstellingenOpgeslagenJson": {
        "type": "array",
        "items": {
          "$ref": "#/components/schemas/JsonWaarde"
        },
        "maxItems": 30,
        "description": "Werkelijk opslag-/leescontract: maximaal 30 JSONwaarden. Oudere servicewriters en bestaande opslag worden zonder nested DTO-normalisatie gelezen. Nieuwe sjablonen volgen CrmInstellingSjabloonNieuw, nieuwe zoekopdrachten CrmInstellingZoekopdrachtGenormaliseerd. Geen leeg placeholderobject of claim dat iedere historische rij die nieuwe vorm heeft.",
        "x-huidige-producenten": [
          {
            "$ref": "#/components/schemas/CrmInstellingSjabloonNieuw"
          },
          {
            "$ref": "#/components/schemas/CrmInstellingZoekopdrachtGenormaliseerd"
          }
        ]
      },
      "CrmInstellingenAntwoord": {
        "type": "object",
        "properties": {
          "revisie": {
            "type": "integer",
            "minimum": 0,
            "maximum": 2147483647
          },
          "waarde": {
            "$ref": "#/components/schemas/CrmInstellingenOpgeslagenJson"
          }
        },
        "required": [
          "revisie",
          "waarde"
        ],
        "additionalProperties": false,
        "description": "Actuele instellingen. Nog niet aangemaakt: revisie 0 en waarde:[]. Sjablonen zijn kantoorgebonden; zoekopdrachten horen uitsluitend bij de huidige sleutelactor. Geen actor/eigenaar/organisatie uit query of body."
      },
      "CrmInstellingenOntvangst": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "revisie": {
            "type": "integer",
            "minimum": 1,
            "maximum": 2147483647
          },
          "herhaald": {
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "revisie",
          "herhaald"
        ],
        "additionalProperties": false,
        "description": "Oorspronkelijk ontvangstbewijs. revisie is basisrevisie+1 van die ene wijziging en kan lager zijn dan de huidige revisie in de antwoord-envelop. Geen zoektekst of sjablooninhoud in het ontvangstbewijs."
      },
      "CrmInstellingenBewaarAntwoord": {
        "type": "object",
        "properties": {
          "revisie": {
            "type": "integer",
            "minimum": 0,
            "maximum": 2147483647
          },
          "waarde": {
            "$ref": "#/components/schemas/CrmInstellingenOpgeslagenJson"
          },
          "ontvangst": {
            "$ref": "#/components/schemas/CrmInstellingenOntvangst"
          }
        },
        "required": [
          "revisie",
          "waarde",
          "ontvangst"
        ],
        "additionalProperties": false
      },
      "CrmWerkPagina": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "klant_id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                },
                "klantId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                },
                "naam": {
                  "type": "string"
                },
                "revisie": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 2147483647
                },
                "gegevens": {
                  "type": "object",
                  "properties": {
                    "opvolging": {
                      "$ref": "#/components/schemas/JsonWaarde",
                      "description": "Historisch opgeslagen CRM-JSON, zonder nieuwe nested normalisatie. Afwezige opvolging krijgt {}."
                    },
                    "taken": {
                      "$ref": "#/components/schemas/JsonWaarde",
                      "description": "Historisch opgeslagen CRM-JSON, zonder nieuwe nested normalisatie. Afwezige taken krijgt []."
                    },
                    "checklist": {
                      "$ref": "#/components/schemas/JsonWaarde",
                      "description": "Historisch opgeslagen CRM-JSON, zonder nieuwe nested normalisatie. Afwezige checklist krijgt []."
                    },
                    "toewijzingen": {
                      "$ref": "#/components/schemas/JsonWaarde",
                      "description": "Historisch opgeslagen CRM-JSON, zonder nieuwe nested normalisatie. Afwezige toewijzingen krijgt []."
                    }
                  },
                  "required": [
                    "opvolging",
                    "taken",
                    "checklist",
                    "toewijzingen"
                  ],
                  "additionalProperties": false
                },
                "actiepunten": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      "tekst": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 500
                      },
                      "status": {
                        "const": "open"
                      },
                      "deadline": {
                        "anyOf": [
                          {
                            "type": "string",
                            "format": "date"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "gesprek_id": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                      },
                      "mutatie_basis": {
                        "anyOf": [
                          {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "required": [
                      "id",
                      "tekst",
                      "status",
                      "deadline",
                      "gesprek_id",
                      "mutatie_basis"
                    ],
                    "additionalProperties": false,
                    "description": "Alleen open actiepunten. mutatie_basis komt uit de bestaande rijprojectie en kan null zijn bij ontbrekende historische kolom; geen vervangende basis verzinnen."
                  },
                  "maxItems": 25
                },
                "actiepuntenPagina": {
                  "type": "object",
                  "properties": {
                    "limiet": {
                      "const": 25
                    },
                    "meer": {
                      "type": "boolean"
                    },
                    "volgende": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "limiet",
                    "meer",
                    "volgende"
                  ],
                  "additionalProperties": false,
                  "allOf": [
                    {
                      "if": {
                        "properties": {
                          "meer": {
                            "const": false
                          }
                        }
                      },
                      "then": {
                        "properties": {
                          "volgende": {
                            "type": "null"
                          }
                        }
                      },
                      "else": {
                        "properties": {
                          "volgende": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                          }
                        }
                      }
                    }
                  ],
                  "description": "Cursor uit de begrensde kandidaatselectie vóór aanvullende bronfiltering. Gebruik deze waarde, niet het laatste zichtbare resultaat. Geen totaaltelling of consistente momentopname."
                }
              },
              "required": [
                "klant_id",
                "klantId",
                "naam",
                "revisie",
                "gegevens",
                "actiepunten",
                "actiepuntenPagina"
              ],
              "additionalProperties": false,
              "description": "klant_id en klantId zijn dezelfde UUID. Maximaal 25 kandidaatpunten per klant vóór actuele bronfiltering. Een kortere of lege lijst kan daarom nog een actiepuntenvervolg hebben."
            },
            "maxItems": 10
          },
          "userId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "pagina": {
            "type": "object",
            "properties": {
              "limiet": {
                "const": 10
              },
              "meer": {
                "type": "boolean"
              },
              "volgende": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "volgorde": {
                "const": "id"
              },
              "momentopname": {
                "const": false
              }
            },
            "required": [
              "limiet",
              "meer",
              "volgende",
              "volgorde",
              "momentopname"
            ],
            "additionalProperties": false,
            "allOf": [
              {
                "if": {
                  "properties": {
                    "meer": {
                      "const": false
                    }
                  }
                },
                "then": {
                  "properties": {
                    "volgende": {
                      "type": "null"
                    }
                  }
                },
                "else": {
                  "properties": {
                    "volgende": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    }
                  }
                }
              }
            ],
            "description": "Cursor uit de begrensde kandidaatselectie vóór aanvullende bronfiltering. Gebruik deze waarde, niet het laatste zichtbare resultaat. Geen totaaltelling of consistente momentopname."
          }
        },
        "required": [
          "items",
          "userId",
          "pagina"
        ],
        "additionalProperties": false
      },
      "CrmReactiesPagina": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                },
                "soort": {
                  "type": "string",
                  "enum": [
                    "geopend",
                    "ontvangen",
                    "reactie"
                  ]
                },
                "tekst": {
                  "type": "string",
                  "maxLength": 3000
                },
                "aangemaakt_op": {
                  "type": "string",
                  "format": "date-time"
                },
                "vrijgaveId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                },
                "titel": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "id",
                "soort",
                "tekst",
                "aangemaakt_op",
                "vrijgaveId",
                "titel"
              ],
              "additionalProperties": false,
              "description": "Historische kantoorreactie op een nu leesbaar/deelbaar stuk. Geen bronpad, bron_id of portaalidentiteit in deze projectie. Bestaande ingetrokken vrijgaven kunnen historisch terugkomen; dit heropent geen vrijgave of klantportaaltoegang."
            },
            "maxItems": 50
          },
          "pagina": {
            "type": "object",
            "properties": {
              "limiet": {
                "const": 50
              },
              "meer": {
                "type": "boolean"
              },
              "volgende": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "volgorde": {
                "const": "id"
              },
              "momentopname": {
                "const": false
              }
            },
            "required": [
              "limiet",
              "meer",
              "volgende",
              "volgorde",
              "momentopname"
            ],
            "additionalProperties": false,
            "allOf": [
              {
                "if": {
                  "properties": {
                    "meer": {
                      "const": false
                    }
                  }
                },
                "then": {
                  "properties": {
                    "volgende": {
                      "type": "null"
                    }
                  }
                },
                "else": {
                  "properties": {
                    "volgende": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    }
                  }
                }
              }
            ],
            "description": "Cursor uit de begrensde kandidaatselectie vóór aanvullende bronfiltering. Gebruik deze waarde, niet het laatste zichtbare resultaat. Geen totaaltelling of consistente momentopname."
          }
        },
        "required": [
          "items",
          "pagina"
        ],
        "additionalProperties": false
      },
      "PubliekeBulkImportInvoer": {
        "type": "object",
        "properties": {
          "bevestigd": {
            "const": true
          },
          "bulkImportId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "rijen": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "rijNummer": {
                  "type": "integer",
                  "minimum": 2,
                  "maximum": 100000
                },
                "naam": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 300,
                  "pattern": "\\S",
                  "x-maxUtf8Bytes": 300
                },
                "bronTekst": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 49152,
                  "pattern": "\\S",
                  "x-maxUtf8Bytes": 49152
                }
              },
              "required": [
                "rijNummer",
                "naam",
                "bronTekst"
              ],
              "additionalProperties": false,
              "description": "Echte numerieke unieke rijNummer; geen nummerstring. Tekstlimieten zijn UTF-8-bytes vóór trimmen, niet alleen tekenaantallen. Naam/bronTekst worden daarna getrimd."
            },
            "minItems": 1,
            "maxItems": 400,
            "description": "Unieke rijnummers; verwerking sorteert numeriek. De oorspronkelijke arrayvolgorde blijft wel deel van de volledige verzoekhash. Geen deelset bij hervatten."
          },
          "algemeneInstructie": {
            "type": "string",
            "maxLength": 4000,
            "x-maxUtf8Bytes": 16384,
            "description": "Maximaal 4000 JavaScript UTF-16-eenheden én 16 KiB UTF-8 vóór trimmen. Ontbrekend wordt leeg, geen null."
          },
          "stijlprofielId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "tier": {
            "type": "string",
            "enum": [
              "basis",
              "standaard",
              "max"
            ]
          },
          "languagePolicy": {
            "type": "object",
            "properties": {
              "primary": {
                "type": "string",
                "pattern": "^[a-z]{2,3}$"
              },
              "secondary": {
                "type": "object",
                "properties": {
                  "report": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "mode": {
                            "type": "string",
                            "enum": [
                              "off",
                              "inherit"
                            ]
                          }
                        },
                        "required": [
                          "mode"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "mode": {
                            "const": "specific"
                          },
                          "language": {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$"
                          }
                        },
                        "required": [
                          "mode",
                          "language"
                        ],
                        "additionalProperties": false
                      }
                    ]
                  },
                  "coverLetter": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "mode": {
                            "type": "string",
                            "enum": [
                              "off",
                              "inherit"
                            ]
                          }
                        },
                        "required": [
                          "mode"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "mode": {
                            "const": "specific"
                          },
                          "language": {
                            "type": "string",
                            "pattern": "^[a-z]{2,3}$"
                          }
                        },
                        "required": [
                          "mode",
                          "language"
                        ],
                        "additionalProperties": false
                      }
                    ]
                  }
                },
                "required": [],
                "additionalProperties": false
              }
            },
            "required": [],
            "additionalProperties": false,
            "description": "Ontbrekend beleid gebruikt kantoorresolutie; geen impliciete Nederlandse hoofdtaal in de invoer. Alleen report/coverLetter. Geen null, vrije strings, extra velden of taal bij off/inherit. Het opgeloste beleid wordt bij eerste ontvangst vastgezet. Kandidaatbron a2f438b8 behoudt de gesloten bulkgrens: iedere effectief ingeschakelde tweede taal wordt vóór ontvangst, private opslag, voorStart en queue geweigerd met409 api_bulkimport_taalretentie_niet_vrijgegeven. Dit geldt ook voor herhaling met eerder bevroren secundair beleid. Ontbrekend beleid of inherit kan via kantoorvoorkeur alsnog een tweede taal inschakelen; kies voor nieuwe import beide secundaire uitkomsten expliciet off. Verander bij replay de oorspronkelijke body niet. Geen aanvullingsroute voor ontbrekende oude taaluitvoer. De hele-importbewaargrens, mogelijk over meerdere klanten, is niet vrijgegeven. Primaire bulk zonder tweede taal houdt haar bestaande contract."
          }
        },
        "required": [
          "bevestigd",
          "bulkImportId",
          "rijen",
          "stijlprofielId"
        ],
        "additionalProperties": false,
        "description": "Totale publieke JSON-body blijft maximaal 100 KiB; de individuele rijgrenzen vergroten die niet. Geen actor, klant-ID, provider/model, kostenbedrag, opslagref of queue-ID in de invoer. Actief rapportprofiel verplicht, geen neutrale bulkstijl."
      },
      "PubliekeBulkImportStatus": {
        "type": "object",
        "properties": {
          "contract": {
            "const": "bulkimport-v1"
          },
          "opdracht_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "bulkImportId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "stijlprofielId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "stijlprofielVersieId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "aantal": {
            "type": "integer",
            "minimum": 1,
            "maximum": 400
          },
          "batchGrootte": {
            "const": 40
          },
          "batches": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10
          },
          "rijen": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "rij_nummer": {
                  "type": "integer",
                  "minimum": 2,
                  "maximum": 100000
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "toegang_geweigerd",
                    "klaar",
                    "herstel_verplicht",
                    "mislukt",
                    "verwerken",
                    "rapport_ingepland",
                    "voorbereiden",
                    "rij_ingepland",
                    "nog_te_plannen",
                    "uitvoer_herstel_verplicht",
                    "uitvoer_ontbreekt",
                    "uitvoer_verwerken"
                  ]
                },
                "beschikbaar_op": {
                  "type": "string",
                  "format": "date-time"
                },
                "hoofdrapport_klaar": {
                  "anyOf": [
                    {
                      "type": "boolean"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "taaluitvoer": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "taal": {
                        "type": "string",
                        "pattern": "^[a-z]{2,3}$"
                      },
                      "uitkomsten": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "enum": [
                            "report",
                            "coverLetter"
                          ]
                        },
                        "minItems": 1,
                        "maxItems": 2,
                        "uniqueItems": true
                      },
                      "status": {
                        "type": "string",
                        "enum": [
                          "ontbreekt",
                          "verwerken",
                          "klaar",
                          "herstel_verplicht"
                        ]
                      }
                    },
                    "required": [
                      "taal",
                      "uitkomsten",
                      "status"
                    ],
                    "additionalProperties": false,
                    "description": "Groepering per opgeloste taal, uitkomsten alfabetisch. klaar vereist de gebonden geslaagde taalopdracht én iedere geslaagde uitkomst. Een bestaande ongebonden/native taalopdracht is herstel_verplicht, geen automatisch te vullen gat. Geen taalopdracht-ID of inhoud in dit DTO."
                  },
                  "maxItems": 2
                },
                "rapport_versie_id": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "dossier_id": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "rij_nummer",
                "status",
                "beschikbaar_op",
                "hoofdrapport_klaar",
                "taaluitvoer",
                "rapport_versie_id",
                "dossier_id"
              ],
              "additionalProperties": false,
              "description": "Rijen in oplopend rij_nummer. hoofdrapport_klaar kan door SQL-drie-waardelogica null zijn zolang de gekoppelde jobs/versie ontbreken; alleen true is voltooiingsbewijs. Bij onleesbaar huidig dossier: toegang_geweigerd, geen rapport-/dossier-ID en lege taaluitvoer. beschikbaar_op is het geplande vroegste tijdstip, geen voltooiingsbelofte."
            },
            "minItems": 1,
            "maxItems": 400
          },
          "klaar": {
            "type": "boolean"
          }
        },
        "required": [
          "contract",
          "opdracht_id",
          "bulkImportId",
          "stijlprofielId",
          "stijlprofielVersieId",
          "aantal",
          "batchGrootte",
          "batches",
          "rijen",
          "klaar"
        ],
        "additionalProperties": false,
        "description": "opdracht_id is de servergebonden importidentiteit; bulkImportId is de oorspronkelijk door de client gekozen UUID. Status-GET gebruikt bulkImportId. aantal en rijen horen bij de volledige onveranderlijke ontvangst; batches=ceil(aantal/40). klaar is alleen true als iedere rijstatus klaar is, inclusief verlangde tweede-taaluitvoer. Geen namen, broninhoud, providerantwoord, kostenbedrag of signed URL."
      },
      "PubliekeBulkImportOntvangst": {
        "type": "object",
        "properties": {
          "contract": {
            "const": "bulkimport-v1"
          },
          "opdracht_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "bulkImportId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "stijlprofielId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "stijlprofielVersieId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "aantal": {
            "type": "integer",
            "minimum": 1,
            "maximum": 400
          },
          "batchGrootte": {
            "const": 40
          },
          "batches": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10
          },
          "rijen": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "rij_nummer": {
                  "type": "integer",
                  "minimum": 2,
                  "maximum": 100000
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "toegang_geweigerd",
                    "klaar",
                    "herstel_verplicht",
                    "mislukt",
                    "verwerken",
                    "rapport_ingepland",
                    "voorbereiden",
                    "rij_ingepland",
                    "nog_te_plannen",
                    "uitvoer_herstel_verplicht",
                    "uitvoer_ontbreekt",
                    "uitvoer_verwerken"
                  ]
                },
                "beschikbaar_op": {
                  "type": "string",
                  "format": "date-time"
                },
                "hoofdrapport_klaar": {
                  "anyOf": [
                    {
                      "type": "boolean"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "taaluitvoer": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "taal": {
                        "type": "string",
                        "pattern": "^[a-z]{2,3}$"
                      },
                      "uitkomsten": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "enum": [
                            "report",
                            "coverLetter"
                          ]
                        },
                        "minItems": 1,
                        "maxItems": 2,
                        "uniqueItems": true
                      },
                      "status": {
                        "type": "string",
                        "enum": [
                          "ontbreekt",
                          "verwerken",
                          "klaar",
                          "herstel_verplicht"
                        ]
                      }
                    },
                    "required": [
                      "taal",
                      "uitkomsten",
                      "status"
                    ],
                    "additionalProperties": false,
                    "description": "Groepering per opgeloste taal, uitkomsten alfabetisch. klaar vereist de gebonden geslaagde taalopdracht én iedere geslaagde uitkomst. Een bestaande ongebonden/native taalopdracht is herstel_verplicht, geen automatisch te vullen gat. Geen taalopdracht-ID of inhoud in dit DTO."
                  },
                  "maxItems": 2
                },
                "rapport_versie_id": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "dossier_id": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "rij_nummer",
                "status",
                "beschikbaar_op",
                "hoofdrapport_klaar",
                "taaluitvoer",
                "rapport_versie_id",
                "dossier_id"
              ],
              "additionalProperties": false,
              "description": "Rijen in oplopend rij_nummer. hoofdrapport_klaar kan door SQL-drie-waardelogica null zijn zolang de gekoppelde jobs/versie ontbreken; alleen true is voltooiingsbewijs. Bij onleesbaar huidig dossier: toegang_geweigerd, geen rapport-/dossier-ID en lege taaluitvoer. beschikbaar_op is het geplande vroegste tijdstip, geen voltooiingsbelofte."
            },
            "minItems": 1,
            "maxItems": 400
          },
          "klaar": {
            "type": "boolean"
          },
          "herhaald": {
            "type": "boolean"
          }
        },
        "required": [
          "contract",
          "opdracht_id",
          "bulkImportId",
          "stijlprofielId",
          "stijlprofielVersieId",
          "aantal",
          "batchGrootte",
          "batches",
          "rijen",
          "klaar",
          "herhaald"
        ],
        "additionalProperties": false,
        "description": "HTTP 202, ook bij herhaalde of inmiddels volledig klaargekomen import. herhaald hoort bij de oorspronkelijke ontvangst. 202 op zichzelf bewijst geen complete planning of geslaagde documentproductie."
      },
      "PortaalUitnodigingStatus": {
        "type": "object",
        "properties": {
          "aanvraag_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "status": {
            "type": "string",
            "enum": [
              "klaargezet",
              "auth_onzeker",
              "auth_bekend",
              "mail_onzeker",
              "mail_aangeboden",
              "gekoppeld",
              "gestopt"
            ]
          },
          "herstel_nodig": {
            "type": "boolean"
          },
          "auth_bekend": {
            "type": "boolean"
          },
          "mail_aangeboden": {
            "type": "boolean"
          },
          "gestopt": {
            "type": "boolean"
          }
        },
        "required": [
          "aanvraag_id",
          "status",
          "herstel_nodig",
          "auth_bekend",
          "mail_aangeboden",
          "gestopt"
        ],
        "additionalProperties": false,
        "description": "Technische ontvangst, geen aflever- of menselijk leesbewijs. herstel_nodig is waar zolang niet gekoppeld/gestopt óf een onzekere eerdere poging nog blokkeert; dus ook gestopt kan herstel_nodig:true hebben. Geen auth-ID, provider-ID, link, OTP of berichtinhoud."
      },
      "PortaalHuidigeToestand": {
        "type": "object",
        "properties": {
          "basis": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "actief": {
            "type": "boolean"
          },
          "heeft_toegang": {
            "type": "boolean"
          },
          "email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "uitgenodigd_op": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "vrijgaven": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                },
                "soort": {
                  "type": "string",
                  "enum": [
                    "rapportversie",
                    "dossierbestand"
                  ]
                },
                "object_id": {
                  "type": "string"
                },
                "titel": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "vrijgegeven_op": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "required": [
                "id",
                "soort",
                "object_id",
                "titel",
                "vrijgegeven_op"
              ],
              "additionalProperties": false,
              "description": "Actuele niet-ingetrokken vrijgave met huidig bronbewijs. object_id is bij rapportversie een UUID, bij dossierbestand de reeds bestaande opslagidentificatie; geen willekeurige download-URL. Historische titel/objectlengtes worden niet achteraf genormaliseerd."
            }
          },
          "aanleveringen": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                },
                "bestandsnaam": {
                  "type": "string"
                },
                "soort": {
                  "type": "string",
                  "enum": [
                    "opname",
                    "document"
                  ]
                },
                "bytes": {
                  "type": "integer",
                  "minimum": 0
                },
                "aangeleverd_op": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "required": [
                "id",
                "bestandsnaam",
                "soort",
                "bytes",
                "aangeleverd_op"
              ],
              "additionalProperties": false
            },
            "maxItems": 50
          },
          "adres_basis": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "beschikbaar": {
            "type": "boolean"
          },
          "versiecontrole": {
            "const": true
          }
        },
        "required": [
          "basis",
          "actief",
          "heeft_toegang",
          "email",
          "uitgenodigd_op",
          "vrijgaven",
          "aanleveringen",
          "adres_basis",
          "beschikbaar",
          "versiecontrole"
        ],
        "additionalProperties": false,
        "description": "heeft_toegang betekent alleen dat een authidentiteit is gekoppeld; actief is apart. beschikbaar volgt huidig pakket Pro+ of hoger, maar bewijst geen volledige vrijgave. Vrijgaven aflopend vrijgegeven_op zonder paginering; aanleveringen maximaal 50 nieuwste. basis wijzigt bij relevante klant-/adres-/toegangs- en vrijgavewijzigingen. adres_basis is een opaque hash van huidig adres en gekoppelde identiteit, geen invoeradres."
      },
      "PortaalLeesAntwoord": {
        "type": "object",
        "properties": {
          "basis": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "actief": {
            "type": "boolean"
          },
          "heeft_toegang": {
            "type": "boolean"
          },
          "email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "uitgenodigd_op": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "vrijgaven": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                },
                "soort": {
                  "type": "string",
                  "enum": [
                    "rapportversie",
                    "dossierbestand"
                  ]
                },
                "object_id": {
                  "type": "string"
                },
                "titel": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "vrijgegeven_op": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "required": [
                "id",
                "soort",
                "object_id",
                "titel",
                "vrijgegeven_op"
              ],
              "additionalProperties": false,
              "description": "Actuele niet-ingetrokken vrijgave met huidig bronbewijs. object_id is bij rapportversie een UUID, bij dossierbestand de reeds bestaande opslagidentificatie; geen willekeurige download-URL. Historische titel/objectlengtes worden niet achteraf genormaliseerd."
            }
          },
          "aanleveringen": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                },
                "bestandsnaam": {
                  "type": "string"
                },
                "soort": {
                  "type": "string",
                  "enum": [
                    "opname",
                    "document"
                  ]
                },
                "bytes": {
                  "type": "integer",
                  "minimum": 0
                },
                "aangeleverd_op": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "required": [
                "id",
                "bestandsnaam",
                "soort",
                "bytes",
                "aangeleverd_op"
              ],
              "additionalProperties": false
            },
            "maxItems": 50
          },
          "adres_basis": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "beschikbaar": {
            "type": "boolean"
          },
          "versiecontrole": {
            "const": true
          },
          "inlog_email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "uitnodiging": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PortaalUitnodigingStatus"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "basis",
          "actief",
          "heeft_toegang",
          "email",
          "uitgenodigd_op",
          "vrijgaven",
          "aanleveringen",
          "adres_basis",
          "beschikbaar",
          "versiecontrole",
          "inlog_email",
          "uitnodiging"
        ],
        "additionalProperties": false,
        "description": "Authadres wordt apart gelezen; daarna hercontroleert SQL de huidige sleutel/actor/klant en dezelfde basis. Een gelijktijdige basiswijziging geeft 409, auth-/opslagfout 503."
      },
      "PortaalWijzigAntwoord": {
        "type": "object",
        "properties": {
          "huidig": {
            "$ref": "#/components/schemas/PortaalHuidigeToestand"
          },
          "herhaald": {
            "type": "boolean"
          },
          "ontvangst": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "actie": {
                "type": "string",
                "enum": [
                  "intrekken",
                  "vrijgeven",
                  "vrijgave_intrekken"
                ]
              },
              "basis": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "vrijgave_id": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "id",
              "actie",
              "basis",
              "vrijgave_id"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "huidig",
          "herhaald",
          "ontvangst"
        ],
        "additionalProperties": false,
        "description": "huidig is de actuele toestand; ontvangst.basis hoort bij de oorspronkelijke wijziging en kan daarvan afwijken. Een oude herhaling voert geen eerdere mutatie opnieuw uit."
      },
      "PortaalUitnodigingAntwoord": {
        "type": "object",
        "properties": {
          "ontvangst": {
            "$ref": "#/components/schemas/PortaalUitnodigingStatus"
          },
          "herhaald": {
            "type": "boolean"
          },
          "huidig": {
            "type": "object",
            "properties": {
              "basis": {
                "type": "string",
                "format": "uuid",
                "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
              },
              "actief": {
                "type": "boolean"
              },
              "heeft_toegang": {
                "type": "boolean"
              },
              "email": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "uitgenodigd_op": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "vrijgaven": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "soort": {
                      "type": "string",
                      "enum": [
                        "rapportversie",
                        "dossierbestand"
                      ]
                    },
                    "object_id": {
                      "type": "string"
                    },
                    "titel": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "vrijgegeven_op": {
                      "type": "string",
                      "format": "date-time"
                    }
                  },
                  "required": [
                    "id",
                    "soort",
                    "object_id",
                    "titel",
                    "vrijgegeven_op"
                  ],
                  "additionalProperties": false,
                  "description": "Actuele niet-ingetrokken vrijgave met huidig bronbewijs. object_id is bij rapportversie een UUID, bij dossierbestand de reeds bestaande opslagidentificatie; geen willekeurige download-URL. Historische titel/objectlengtes worden niet achteraf genormaliseerd."
                }
              },
              "aanleveringen": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
                    },
                    "bestandsnaam": {
                      "type": "string"
                    },
                    "soort": {
                      "type": "string",
                      "enum": [
                        "opname",
                        "document"
                      ]
                    },
                    "bytes": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "aangeleverd_op": {
                      "type": "string",
                      "format": "date-time"
                    }
                  },
                  "required": [
                    "id",
                    "bestandsnaam",
                    "soort",
                    "bytes",
                    "aangeleverd_op"
                  ],
                  "additionalProperties": false
                },
                "maxItems": 50
              },
              "adres_basis": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "beschikbaar": {
                "type": "boolean"
              },
              "versiecontrole": {
                "const": true
              },
              "uitnodiging": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/PortaalUitnodigingStatus"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "inlog_email": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "basis",
              "actief",
              "heeft_toegang",
              "email",
              "uitgenodigd_op",
              "vrijgaven",
              "aanleveringen",
              "adres_basis",
              "beschikbaar",
              "versiecontrole",
              "uitnodiging"
            ],
            "additionalProperties": false,
            "description": "Bij een zojuist bewezen koppeling kan inlog_email aanwezig zijn. Een herhaling kan alleen de huidige toestand zonder dat aanvullende authadres geven."
          },
          "onzeker": {
            "const": true
          }
        },
        "required": [
          "ontvangst",
          "herhaald",
          "huidig"
        ],
        "additionalProperties": false,
        "description": "Nieuwe onzekere auth-/mailuitkomst geeft 202 en onzeker:true. Een latere identieke ontvangstherhaling geeft 200 zonder onzeker-veld, maar kan nog een onzekere status/herstel_nodig hebben. HTTP 200 alleen bewijst dus geen koppeling of aflevering."
      },
      "CrmBezoekActueleStatus": {
        "type": "object",
        "properties": {
          "sinds": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "tot": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "sinds",
          "tot"
        ],
        "additionalProperties": false,
        "description": "Bestaande leesvorm zolang de CRM-schrijfvlag uitstaat: geen revisie. De lezing verandert geen markering."
      },
      "CrmBezoekStatusMetRevisie": {
        "type": "object",
        "properties": {
          "sinds": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "tot": {
            "type": "string",
            "format": "date-time"
          },
          "revisie": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          }
        },
        "required": [
          "sinds",
          "tot",
          "revisie"
        ],
        "additionalProperties": false
      },
      "CrmBezoekOntvangst": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "revisie": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "herhaald": {
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "revisie",
          "herhaald"
        ],
        "additionalProperties": false,
        "description": "Historische revisie van deze ene markering. Bij dezelfde gezien_tot hoeft de revisie niet te verhogen. Een oorspronkelijke ontvangst kan ouder zijn dan de huidige status."
      },
      "CrmTrajectOntvangst": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "revisie": {
            "type": "null"
          },
          "herhaald": {
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "revisie",
          "herhaald"
        ],
        "additionalProperties": false
      },
      "CrmBezoekBewaarAntwoord": {
        "type": "object",
        "properties": {
          "sinds": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "tot": {
            "type": "string",
            "format": "date-time"
          },
          "revisie": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "ontvangst": {
            "$ref": "#/components/schemas/CrmBezoekOntvangst"
          }
        },
        "required": [
          "sinds",
          "tot",
          "revisie",
          "ontvangst"
        ],
        "additionalProperties": false
      },
      "CrmTrajectBewaarAntwoord": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
          },
          "klantnaam": {
            "type": "string"
          },
          "ontvangst": {
            "$ref": "#/components/schemas/CrmTrajectOntvangst"
          }
        },
        "required": [
          "id",
          "klantnaam",
          "ontvangst"
        ],
        "additionalProperties": false,
        "description": "id is de aangemaakte bestaande dossier-/trajectidentiteit. Bij replay wordt het huidige dossier onder huidige bronrechten opnieuw gelezen; geen nieuw traject."
      }
    }
  },
  "x-bronstatus": {
    "backend": "66d3dcaf",
    "datum": "2026-10-04",
    "getest": false,
    "gepubliceerd": false,
    "volledige_pariteit": false,
    "selectieve_aanvullingen": [
      {
        "ref": "354bfa39",
        "acties": [
          "inname.status",
          "inname.beheren"
        ]
      },
      {
        "ref": "91a4b1b4",
        "acties": [
          "taalstatus.gesprek",
          "taalstatus.rapport",
          "taalstatus.inhoud"
        ]
      },
      {
        "ref": "cd6dcaf4",
        "acties": [
          "workflowrun.context",
          "workflowrun.start",
          "workflowrun.status",
          "workflowrun.download",
          "workflowrun.herstellen",
          "workflowrun.offerte_regelbewijs"
        ]
      },
      {
        "ref": "579b18e8",
        "acties": [
          "workflowrun.context",
          "uitvoeringen.start",
          "uitvoeringen.opdracht",
          "uitvoeringen.broncontrole",
          "uitvoeringen.bronbevestiging",
          "uitvoeringen.transitie",
          "uitvoeringen.lijst",
          "uitvoeringen.lezen",
          "uitvoeringen.versies",
          "uitvoeringen.versie",
          "uitvoeringen.verschillen"
        ]
      },
      {
        "ref": "25aa00db",
        "acties": [
          "mailconcept.status",
          "mailconcept.stoppen",
          "mailconcept.outlook",
          "mailconcept.gmail"
        ]
      },
      {
        "ref": "45ad97fd",
        "acties": [
          "taalbeleid.gesprek.lezen",
          "taalbeleid.gesprek.wijzigen",
          "taalbeleid.rapport.lezen",
          "taalbeleid.rapport.wijzigen"
        ]
      },
      {
        "ref": "80be4075",
        "acties": [
          "taalstatus.inhoud"
        ]
      },
      {
        "ref": "cfe078af",
        "acties": [
          "taalproductie.gesprek.context",
          "taalproductie.gesprek.start",
          "taalproductie.rapport.context",
          "taalproductie.rapport.start",
          "taalproductie.status",
          "taalproductie.herstart",
          "workflowrun.taalcontext",
          "workflowrun.taalstart",
          "workflowrun.taalstatus",
          "workflowrun.taalherstart",
          "workflowrun.taaldownload",
          "workflowrun.taalpauzeren",
          "workflowrun.taalhervatten",
          "workflowrun.taalannuleren"
        ]
      },
      {
        "ref": "cfe078af",
        "acties": [
          "gesprek.followup",
          "actiepunt.wijzigen",
          "gesprek.followup_wijzigen",
          "klanttijdlijn.lezen",
          "klantreactie.gelezen",
          "klantreactie.bijlage"
        ]
      },
      {
        "ref": "9bab4bc9",
        "acties": [
          "uitvoeringen.verschillen"
        ]
      },
      {
        "ref": "aa6153e5d9d53938c276bc839268ed53aec71002",
        "acties": [
          "uitvoer.verschillen"
        ]
      },
      {
        "ref": "cfe078af",
        "acties": [
          "gesprekdocumenten.start",
          "gesprekdocumenten.ontvangst",
          "gesprekdocumenten.status"
        ]
      },
      {
        "ref": "cfe078af",
        "acties": [
          "documentconcept.lezen",
          "documentconcept.inhoud",
          "documentconcept.wijzigen",
          "documentconcept.opmaak",
          "documentconcept.download"
        ]
      },
      {
        "ref": "cfe078af",
        "acties": [
          "documentherstel.overzicht",
          "beeldbank.lijst",
          "beeldbank.upload",
          "beeldbank.instellingen",
          "beeldbank.wijzigen",
          "beeldbank.verwijderen"
        ]
      },
      {
        "ref": "cfe078af",
        "acties": [
          "uitvoer.hergenereren",
          "uitvoer.mutatiestatus"
        ]
      },
      {
        "ref": "cfe078af",
        "acties": [
          "rapport.start",
          "offerte.start",
          "presentatie.start",
          "gesprek.start"
        ]
      },
      {
        "ref": "cfe078af",
        "acties": [
          "workflowrun.context",
          "uitvoeringen.start",
          "uitvoeringen.opdracht",
          "uitvoeringen.broncontrole",
          "uitvoeringen.bronbevestiging",
          "uitvoeringen.transitie",
          "uitvoeringen.lezen",
          "uitvoeringen.versie"
        ]
      },
      {
        "ref": "c00e325b",
        "acties": [
          "crm.instellingen_lezen",
          "crm.bezoek_lezen",
          "crm.sjablonen_wijzigen",
          "crm.zoekopdrachten_wijzigen"
        ]
      },
      {
        "ref": "c00e325b",
        "acties": [
          "crm.werk_lezen",
          "crm.reacties_lezen",
          "uitvoer.mutatiestatus"
        ]
      },
      {
        "ref": "c00e325b",
        "acties": [
          "bulkimport.start",
          "bulkimport.status"
        ]
      },
      {
        "ref": "c00e325b",
        "acties": [
          "portaal.status",
          "portaal.uitnodigen",
          "portaal.uitnodiging_stoppen",
          "portaal.intrekken",
          "portaal.vrijgeven",
          "portaal.vrijgave_intrekken"
        ]
      },
      {
        "ref": "d964db8c",
        "acties": [
          "crm.bezoek_bewaren",
          "crm.traject_maken",
          "crm.sjablonen_wijzigen",
          "crm.zoekopdrachten_wijzigen",
          "crm.bezoek_lezen"
        ]
      }
    ],
    "schemas_basis": "cb35687c; vervolg handmatig gelezen na integratie 85bee81a; exacte bestandhashes per bron",
    "aanvullende_proefperiodepoort": "b7742838; expliciete intrek/pauze/annuleeruitzonderingen; runnercontract selectief cd6dcaf4"
  },
  "x-releaseprofiel": {
    "bronref": "d964db8c",
    "status": "Releasekandidaat; deze documenten bewijzen geen vlagactivering, migratie-uitvoering of productieproef.",
    "instellingen": {},
    "uitgesloten_acties": {},
    "taal": "Workflowtaal is kandidaat onder376-v2. Direct modelvrij rapport-/briefherstel uit5edf9824 blijft apart; geen nieuwe betaalde uitkomstvervolg- of gesprekuitbreiding. Bulksecondary blijft gesloten.",
    "grens": "Andere feature-, privacy-, pakket-, actor- en objectpoorten blijven beslissend. Dit profiel activeert niets.",
    "vereiste_instellingen": {
      "RAPPORTLY_CRM_DUURZAAM_SCHRIJVEN": true
    },
    "crm_privacy": "375: crmprivacy-v1 met tenant_runtime:apart_verplicht. Geen algemene accountpurgerclaim.",
    "taalbron": "a2f438b8",
    "workflowtaal": "Releasekandidaat a2f438b8 met376-v2, geen productieactivering bewezen. Workflowtaalstart/herstart/hervatting vereist eerst het exacte volledige service-only taalouder-v2 readinessantwoord: herkomst_brongebonden, oudervrijgave en starts_vrijgegeven true; workflow_lifecycle bronlevensduur_202_260; klantplan bestaande_260_bevestiging; nieuwe_bewaartermijn en bulk_vrijgegeven false. Ontbrekend, oud, deels gesloten of onleesbaar schema geeft409 taalproductie_ouderretentie_niet_vrijgegeven vóór receipt/queue/provider. Geen automatische retry of andere key/route om dit te omzeilen. Daarna blijven workflow-/volledige-API-/tweede-taalvlaggen, trial/pakket, huidige oorspronkelijke key/actor/run/bronrechten, bronbasis en persoonlijke werkelijke kosten vereist. Context mogelijk:true is geen volledige starttoestemming.",
    "workflowtaal_readiness_vereist": {
      "contract": "taalouder-v2",
      "herkomst_brongebonden": true,
      "oudervrijgave": true,
      "starts_vrijgegeven": true,
      "workflow_lifecycle": "bronlevensduur_202_260",
      "klantplan": "bestaande_260_bevestiging",
      "nieuwe_bewaartermijn": false,
      "bulk_vrijgegeven": false
    },
    "workflowtaal_bewaargrens": "De bestaande202-expiry/archiefregel kan uitsluitend de volledige terminale en financieel afgeronde ouderketen overdragen naar brongebonden bewijs; broninhoud krijgt geen nieuwe bewaartermijn. Gearchiveerde opdrachten blijven gesloten voor productie/publicatie/wijziging met taalproductie_ouder_vervallen; oude replay maakt geen verdwenen run opnieuw aan. Blijvende API-herkomst verhindert native adoptie. De volledige bronketen blijft onder bestaande260/261-klantbevestiging, actuele fingerprint, holds, platformjobretentie en afzonderlijke opslagafronding vallen. Financiële ledgers/API-runhistorie worden niet gewist. Geen algemene accountpurger of nieuw retentiebesluit.",
    "bulktaal": "Kandidaatbron a2f438b8 behoudt de gesloten bulkgrens: iedere effectief ingeschakelde tweede taal wordt vóór ontvangst, private opslag, voorStart en queue geweigerd met409 api_bulkimport_taalretentie_niet_vrijgegeven. Dit geldt ook voor herhaling met eerder bevroren secundair beleid. Ontbrekend beleid of inherit kan via kantoorvoorkeur alsnog een tweede taal inschakelen; kies voor nieuwe import beide secundaire uitkomsten expliciet off. Verander bij replay de oorspronkelijke body niet. Geen aanvullingsroute voor ontbrekende oude taaluitvoer. De hele-importbewaargrens, mogelijk over meerdere klanten, is niet vrijgegeven. Primaire bulk zonder tweede taal houdt haar bestaande contract."
  },
  "x-bronbestanden": [
    {
      "bestand": "server/lib/klantrechten.js",
      "bronref": "25aa00db",
      "sha256": "4e6abb78b214b93cf52458ae6cd69afbd6022516cbcaa68e13ecd71e7b8c0018"
    },
    {
      "bestand": "server/lib/mailConceptIntent.js",
      "bronref": "25aa00db",
      "sha256": "731838e6c6562ef0e9b22c8cc2cd92cc2e961f34c210d91b7a2d31f0c7231cb1"
    },
    {
      "bestand": "server/lib/mailReadiness.js",
      "bronref": "25aa00db",
      "sha256": "254d2676bd7bcd0c7d7d02fd17051900acac7ccb2cbdd7acea1587ec57959b7b"
    },
    {
      "bestand": "server/lib/publiekeApi/mailConcepten.js",
      "bronref": "25aa00db",
      "sha256": "79f163b7c2c0eac82aeec9b3af4b9d13b65b5294aa053dc86dae8213d011e429"
    },
    {
      "bestand": "server/lib/publiekeApi/poorten.js",
      "bronref": "25aa00db",
      "sha256": "0cb36dd55648d7846eaeab7e37fae41641b7d7aaf98253e8b65eb1cbb84f5b65"
    },
    {
      "bestand": "server/migrations/359_rapportly_api_beleid_en_budget.sql",
      "bronref": "25aa00db",
      "sha256": "72995790ea72d0180104b8de0f44e66e56b4e847283c1422de4f588ab9ad1dac"
    },
    {
      "bestand": "server/rapportly_api.js",
      "bronref": "25aa00db",
      "sha256": "ad6828f602774d3bf375be20dce43f98613f717e0517a7e0f10c8053297ff84a"
    },
    {
      "bestand": "server/ingest/resend_events.js",
      "bronref": "2779d55",
      "sha256": "579f548fabeecf4fdd219764cca919063d63a10c148babbda368af6ff47ec049"
    },
    {
      "bestand": "server/lib/publiekeApi/webhookTransport.js",
      "bronref": "2779d55",
      "sha256": "3feab33fe5076f3b88a8d80597173094bc7d52befe5b27a1247b826854e7d934"
    },
    {
      "bestand": "server/lib/publiekeApi/webhooks.js",
      "bronref": "2779d55",
      "sha256": "e5bfd7519bf2899fd50318cec1576cbd320e464de0174bc3a5c93415e5a7674e"
    },
    {
      "bestand": "server/migrations/359_rapportly_api_beleid_en_budget.sql",
      "bronref": "2779d55",
      "sha256": "ca5ff2d4338d9531d0d0eaa37eaad6abdf66add867860de603f9d7749b38f13b"
    },
    {
      "bestand": "server/lib/orgInnameBeheer.js",
      "bronref": "354bfa39",
      "sha256": "ca2fb2309ae340243a0d432e4cf19e8191e2258cb146738f1f1343bc1be03c87"
    },
    {
      "bestand": "server/lib/publiekeApi/acties.js",
      "bronref": "354bfa39",
      "sha256": "e1edee93531e406bb14c85623edd72b0a277300668b81496b6b1529e5aea3d58"
    },
    {
      "bestand": "server/migrations/359_rapportly_api_beleid_en_budget.sql",
      "bronref": "354bfa39",
      "sha256": "19661c911d810b19b94795cdbbababa68ade49fedad8bf9115b38fdfc83f43c7"
    },
    {
      "bestand": "server/rapportly_api.js",
      "bronref": "354bfa39",
      "sha256": "d92c2dc705a1d6c98c80e24d229100cc0c6458e47fe8a6863c04076578d8e288"
    },
    {
      "bestand": "server/ingest/resend_events.js",
      "bronref": "3897cbd9",
      "sha256": "579f548fabeecf4fdd219764cca919063d63a10c148babbda368af6ff47ec049"
    },
    {
      "bestand": "server/lib/publiekeApi/webhookTransport.js",
      "bronref": "3897cbd9",
      "sha256": "3feab33fe5076f3b88a8d80597173094bc7d52befe5b27a1247b826854e7d934"
    },
    {
      "bestand": "server/lib/publiekeApi/webhooks.js",
      "bronref": "3897cbd9",
      "sha256": "2c9a0025ff9e8c217b3a93c99800ccadd873e36098b17de8089a74f98712e60f"
    },
    {
      "bestand": "server/migrations/359_rapportly_api_beleid_en_budget.sql",
      "bronref": "3897cbd9",
      "sha256": "8c66be6532c19de4c1061f6c0b8dd1b4753e66ade0f24bed189ef84e4b9c1c45"
    },
    {
      "bestand": "server/lib/publiekeApi/poorten.js",
      "bronref": "45ad97fd",
      "sha256": "0cb36dd55648d7846eaeab7e37fae41641b7d7aaf98253e8b65eb1cbb84f5b65"
    },
    {
      "bestand": "server/lib/publiekeApi/taalvariantenSchrijven.js",
      "bronref": "45ad97fd",
      "sha256": "0ec4ddb9945e08705c2be8ea9c25080cca1924d236c19a9b48306d9059579072"
    },
    {
      "bestand": "server/lib/rapportlyApiSleutel.js",
      "bronref": "45ad97fd",
      "sha256": "907034b9a9687a278caa4c6a3d2e558e2dccc1f7a7b8f921d7adfbb7ebaab448"
    },
    {
      "bestand": "server/lib/tweedeUitvoertaal.js",
      "bronref": "45ad97fd",
      "sha256": "4a3769205c25ce36a7824810f37745f4c6287e0af4737a44d9e792312c700315"
    },
    {
      "bestand": "server/lib/uitvoer/kSnapshot.js",
      "bronref": "45ad97fd",
      "sha256": "bb17f566ab39e02ab94de84466dc163718c8b1ea594fa196a4fc05f73c9885bb"
    },
    {
      "bestand": "server/lib/uitvoer/workflowTaalContract.js",
      "bronref": "45ad97fd",
      "sha256": "22a1710c1865b92780eae708b1e87a2a47f3c9f0d07b28f369888a17871a8f44"
    },
    {
      "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql",
      "bronref": "45ad97fd",
      "sha256": "97f16b5ea160d5a77b9e6c57bf3d2130b2fb1f118392e5b00e5a6c2f417793a2"
    },
    {
      "bestand": "server/lib/actiepuntMutaties.js",
      "bronref": "48512877",
      "sha256": "70c5c5a11dd5c9ba1c75e26df7338f075c5402c6fa9625c4b642abb27fe8af8f"
    },
    {
      "bestand": "server/lib/mailGoedkeuring.js",
      "bronref": "48512877",
      "sha256": "aa365cbc48b58ae22219928715ad1dc88917d10a64e77bd8aaacdef9c6706979"
    },
    {
      "bestand": "server/lib/publiekeApi/mail.js",
      "bronref": "48512877",
      "sha256": "06149e75291565194322ef5f375dff24941419f182c6cd9dada6b4ad4223b8e3"
    },
    {
      "bestand": "server/migrations/359_rapportly_api_beleid_en_budget.sql",
      "bronref": "48512877",
      "sha256": "a42aae6eea517024c94d0f3d911927123aaed181facb66e9db1e56b4c394950f"
    },
    {
      "bestand": "server/rapportly_api.js",
      "bronref": "48512877",
      "sha256": "b1b95898db75e9d7abab85d21faaa5a3ff08a16cbe6d9e1546f3171b511c292a"
    },
    {
      "bestand": "server/jobs/adapters/uitvoeringPrivacy.js",
      "bronref": "579b18e8",
      "sha256": "b7fb0521f4c37d6604ebcf7276295f10c1e5cc3dfeafa5ea4b4f6ebd5fb76f3d"
    },
    {
      "bestand": "server/lib/publiekeApi/acties.js",
      "bronref": "579b18e8",
      "sha256": "3658a7c8198cad9ba92791b9d73add55299997203454d71455f6f1c1dbd7cc9f"
    },
    {
      "bestand": "server/lib/publiekeApi/uitvoeringen.js",
      "bronref": "579b18e8",
      "sha256": "7345203b16d307dbdb80d7bf31f75a5d9c43be8331fbdb531106db16ecb797e5"
    },
    {
      "bestand": "server/lib/publiekeApi/workflowBroncontrole.js",
      "bronref": "579b18e8",
      "sha256": "1a6f9f56bb9d58a581e05ba446e45fdb5c6b7bd899cc4496774274c364299bf3"
    },
    {
      "bestand": "server/lib/rapportlyWorkflow/bronpoort.js",
      "bronref": "579b18e8",
      "sha256": "4020fb5172026bf178536d8f51927b90f0cbef9ccebe22a9f2c02edff38b7b05"
    },
    {
      "bestand": "server/lib/uitvoer/kSnapshot.js",
      "bronref": "579b18e8",
      "sha256": "bb17f566ab39e02ab94de84466dc163718c8b1ea594fa196a4fc05f73c9885bb"
    },
    {
      "bestand": "server/lib/uitvoer/productieAdapters/bronnen.js",
      "bronref": "579b18e8",
      "sha256": "9f8e14150c4fe1caf0e2561620e6401ee38d47713009811661e8627f70d16ea6"
    },
    {
      "bestand": "server/lib/uitvoer/productieAdapters/workflow.js",
      "bronref": "579b18e8",
      "sha256": "47c13b46ba9eb3470fa93e660538e2dfecf75889704956a14461c02e939fcad9"
    },
    {
      "bestand": "server/lib/uitvoer/productieIntegratie/catalogusSelectie.js",
      "bronref": "579b18e8",
      "sha256": "988fdb40f46446aeaa9c2749dec67fc36c091cdadcc06bc26d8c48f85095f668"
    },
    {
      "bestand": "server/lib/uitvoer/productieIntegratie/rapportIdentiteit.js",
      "bronref": "579b18e8",
      "sha256": "45f03a92b26522648ed0f8976cdd9a49723b1bffd30211372ffaf980625aac7d"
    },
    {
      "bestand": "server/lib/uitvoer/uitvoeringenRoutes.js",
      "bronref": "579b18e8",
      "sha256": "622f680a81fc857ae7d244613990e0d403bd72852b2db3037dbd634c393bb9c2"
    },
    {
      "bestand": "server/lib/uitvoer/uitvoeringenStore.js",
      "bronref": "579b18e8",
      "sha256": "b1d3868f8b2ddb80f4155e08f80020a5395b20136b83e12f9e667b9150b82f73"
    },
    {
      "bestand": "server/lib/uitvoer/voortgang.js",
      "bronref": "579b18e8",
      "sha256": "4046d12f7ed823859944d79adfcc59cbd53b33f4995cfe3eb781e9b450364b0e"
    },
    {
      "bestand": "server/lib/uitvoer/workflowBriefContract.js",
      "bronref": "579b18e8",
      "sha256": "0cc1f000a87989c5d1c1b12d73d0fc98fe9b0f004a4cc7a00df087213874cf21"
    },
    {
      "bestand": "server/lib/uitvoer/workflowProductiekeuze.js",
      "bronref": "579b18e8",
      "sha256": "19230b4ff7acc17ce05fd6014b978ff6ea35c200b2a3dc0c5ec890c2e609f194"
    },
    {
      "bestand": "server/lib/universele-documentarchetypen/productieRenderer.js",
      "bronref": "579b18e8",
      "sha256": "11a0e61d8754e76a93d98a50203dc2c1918bbf93532bfc772d5c818d0b05df09"
    },
    {
      "bestand": "server/lib/universele-documentarchetypen/uitvoeringSelectie.js",
      "bronref": "579b18e8",
      "sha256": "439a443bc2bd975af3ca1d36a1f47aad1334c99fef8f191217cbc24c96618a95"
    },
    {
      "bestand": "server/migrations/202_rapportly_duurzame_uitvoermutaties.sql",
      "bronref": "579b18e8",
      "sha256": "1793184564bf1e9c12532afc6eac7171626ab1add54ef0b9dc3bc8f75fe2b6e8"
    },
    {
      "bestand": "server/migrations/359_rapportly_api_beleid_en_budget.sql",
      "bronref": "579b18e8",
      "sha256": "a42aae6eea517024c94d0f3d911927123aaed181facb66e9db1e56b4c394950f"
    },
    {
      "bestand": "server/lib/uitvoer/taalHerstelContract.js",
      "bronref": "5edf9824",
      "sha256": "aee74ded72820a55249702bc7d7fe4640664baa91667545b7dda8a97d5b2bb66"
    },
    {
      "bestand": "server/lib/uitvoer/taalProductieContext.js",
      "bronref": "5edf9824",
      "sha256": "f6cc2f2478a4bad7679d1bea64b7b29d9b3f6c16ec3a6d422a8ba0769bb48451"
    },
    {
      "bestand": "server/lib/vertaalRapport.js",
      "bronref": "5edf9824",
      "sha256": "86375ce591bb551536b9df73f602b09186722527d13d9611377812dff1a00a3b"
    },
    {
      "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql",
      "bronref": "5edf9824",
      "sha256": "c202c47bb479e9ec47c10114698011e978bfa4db1073c3a3053f75966024a180"
    },
    {
      "bestand": "server/jobs/handlers/huisstijlSjabloonJob.js",
      "bronref": "61b786b3",
      "sha256": "5ffc5916d008ce68aa21bbe137281eb82fee834970d9d75a3ba3a104233520bc"
    },
    {
      "bestand": "server/jobs/huisstijlSjabloonJobs.js",
      "bronref": "61b786b3",
      "sha256": "f4ee015bf8e7a88e9df4555dccedc219aabcf49a5d0a6fb35df5e538ff9beb0e"
    },
    {
      "bestand": "server/lib/publiekeApi/huisstijl.js",
      "bronref": "61b786b3",
      "sha256": "b9b39be2b7d69e7a31833df2b290c03a5cc5e7d648cfe21de20419b0f5203911"
    },
    {
      "bestand": "server/lib/sjabloon/font.js",
      "bronref": "61b786b3",
      "sha256": "556e3014a97e36d519624315beeba23e6af880ee61545ee7954ae7f2d7176a72"
    },
    {
      "bestand": "server/lib/sjabloon/sanitize.js",
      "bronref": "61b786b3",
      "sha256": "d31316f6ee717d91af76dba7997d6464ebd3f9415c1f21a59f9346cda1ef2ee7"
    },
    {
      "bestand": "server/lib/sjabloonSpec.js",
      "bronref": "61b786b3",
      "sha256": "58d2d76683a8fbe0362d1843b6300b29bfc19fe4e20e4a7f399c4a79aa53c1eb"
    },
    {
      "bestand": "server/migrations/359_rapportly_api_beleid_en_budget.sql",
      "bronref": "61b786b3",
      "sha256": "eb53f4429a5cb3ee38697fd5714a4c52d23b112e73d0ebbf6586c700eee02642"
    },
    {
      "bestand": "server/migrations/362_rapportly_huisstijlsjabloon_jobs.sql",
      "bronref": "61b786b3",
      "sha256": "c207d6f2f4a32e8a5b6c1d2322447590744cce3515edd4e50fec859cbb2e950d"
    },
    {
      "bestand": "server/rapportly_sjabloon_api.js",
      "bronref": "61b786b3",
      "sha256": "8cb230c8ed352f5cb41e578c622058dc00859c931c509b628361e1aa357032f8"
    },
    {
      "bestand": "server/founding_api.js",
      "bronref": "66d3dcaf",
      "sha256": "95bc7a6caeaf9cefba5a0912d306ac152b348eb8e061e50db9d0c6cbf09b9429"
    },
    {
      "bestand": "server/ingest/api_document.js",
      "bronref": "66d3dcaf",
      "sha256": "d870e9cf333884b054dcd60b82594360c9df83bbc964cc57f780ac52af65898b"
    },
    {
      "bestand": "server/jobs/adapters/stijlenV2Test.js",
      "bronref": "66d3dcaf",
      "sha256": "1bb4a5353cc0a1a62819b363934b4250fa02fb6dc48c2a288ad068ce5617cce8"
    },
    {
      "bestand": "server/jobs/briefingJobs.js",
      "bronref": "66d3dcaf",
      "sha256": "09955354e9d9792a38df0efce913c7eec35230109d0bf15ad6d2b6f0e34fccd6"
    },
    {
      "bestand": "server/jobs/bronverwerkingJobs.js",
      "bronref": "66d3dcaf",
      "sha256": "5b05715625de124c703d011e4405db1dc52479e562cb52510e9c6ed4108b36a7"
    },
    {
      "bestand": "server/jobs/handlers/briefingJob.js",
      "bronref": "66d3dcaf",
      "sha256": "9ad87feeff5499c779aea2afa502511efe7bf5c8c16f101d43baa318704dd57a"
    },
    {
      "bestand": "server/jobs/handlers/bronverwerking.js",
      "bronref": "66d3dcaf",
      "sha256": "bcfdda566402bb8103ca93a2016988df3acf82f79f5b4b461651b44a0ffe6a2e"
    },
    {
      "bestand": "server/jobs/handlers/huisstijlSjabloonJob.js",
      "bronref": "66d3dcaf",
      "sha256": "5ffc5916d008ce68aa21bbe137281eb82fee834970d9d75a3ba3a104233520bc"
    },
    {
      "bestand": "server/jobs/handlers/stijlenV2Test.js",
      "bronref": "66d3dcaf",
      "sha256": "d82417500d68ab3669d4149fa5adaf77bb9fdfb7926dc195574dba8191cb4b07"
    },
    {
      "bestand": "server/jobs/huisstijlSjabloonJobs.js",
      "bronref": "66d3dcaf",
      "sha256": "f4ee015bf8e7a88e9df4555dccedc219aabcf49a5d0a6fb35df5e538ff9beb0e"
    },
    {
      "bestand": "server/jobs/stijlVerfijnJobs.js",
      "bronref": "66d3dcaf",
      "sha256": "a875f27cb72631100cb12c91dc680e675bee877343f6eb0b18d7153db5e0e421"
    },
    {
      "bestand": "server/jobs/stijlWerkplaatsOperaties.js",
      "bronref": "66d3dcaf",
      "sha256": "9d7312cbf1b42cf392b64e4ab7c4f6a003eaec6a997ca1018b51835b371ae008"
    },
    {
      "bestand": "server/jobs/stijlWerkplaatsPreviewJobs.js",
      "bronref": "66d3dcaf",
      "sha256": "39eb9a455717e0af6d25fc5db760831e26e352366b394ddc5adb29c19318fc30"
    },
    {
      "bestand": "server/jobs/stijlWerkplaatsVoorstelJobs.js",
      "bronref": "66d3dcaf",
      "sha256": "ab2dc390b0daf79ec6a2b160ccdb520634467e31adab4a2660e180702360a325"
    },
    {
      "bestand": "server/jobs/stijlenV2TestOnderhoud.js",
      "bronref": "66d3dcaf",
      "sha256": "4b6922d71b5a76373d403e9d3e04b2da01a8b92687d5046b8d743445cd5c187e"
    },
    {
      "bestand": "server/jobs/stijlmakerJobs.js",
      "bronref": "66d3dcaf",
      "sha256": "1826812d35cd58f30ff82cf543bc71665aa5afcb3b2a3ee130db64d910be538d"
    },
    {
      "bestand": "server/lib/accountInstellingen.js",
      "bronref": "66d3dcaf",
      "sha256": "f2cef43fe1612fd2e34e9ea42c8fc55046d440bc8c1ae78136cc1d2476499623"
    },
    {
      "bestand": "server/lib/actiepuntMutaties.js",
      "bronref": "66d3dcaf",
      "sha256": "70c5c5a11dd5c9ba1c75e26df7338f075c5402c6fa9625c4b642abb27fe8af8f"
    },
    {
      "bestand": "server/lib/briefing.js",
      "bronref": "66d3dcaf",
      "sha256": "71c1181825846c3af18b675151fd488073bce0e2195fbbc9751a37cc7e725b2a"
    },
    {
      "bestand": "server/lib/bronnen/koppeling.js",
      "bronref": "66d3dcaf",
      "sha256": "a6723dbc73ea17999b839b00cb35da78dec428e19e7a70cd0d60dff2e4c27d01"
    },
    {
      "bestand": "server/lib/bronstijl/identiteit.js",
      "bronref": "66d3dcaf",
      "sha256": "24d78830451be54c6eb8923a370f4c4f0d3c2d62924b1caafe4e98209b551de1"
    },
    {
      "bestand": "server/lib/bronstijl/vasteTeksten.js",
      "bronref": "66d3dcaf",
      "sha256": "9c6e6b2f4116a18c0297c3004f86788d2aeae500cd5286baac58ac35c252c070"
    },
    {
      "bestand": "server/lib/bronstijlBewerking/contract.js",
      "bronref": "66d3dcaf",
      "sha256": "9673b72b107105531a5c815610188ee5a19475701b9d0cba204af5538e5c2a6b"
    },
    {
      "bestand": "server/lib/creditContinuiteit.js",
      "bronref": "66d3dcaf",
      "sha256": "676027b3dfccfbe0d943c13de1fbd2ce7cd3b5e5b1ed8c9e418a4938d8fca2df"
    },
    {
      "bestand": "server/lib/excelSjablonen/body.js",
      "bronref": "66d3dcaf",
      "sha256": "9bc0d21bd8cd865a42d7fb67f4093dacbbd07f26258f21ffa87bb1b7f284734e"
    },
    {
      "bestand": "server/lib/excelSjablonen/bronnen/document.js",
      "bronref": "66d3dcaf",
      "sha256": "13bf36c53c1df571241e6880db04168e75ec41cd80efc6edabd44ced1ea78c9e"
    },
    {
      "bestand": "server/lib/excelSjablonen/bronnen/job.js",
      "bronref": "66d3dcaf",
      "sha256": "3b197232f218eb314d83a5958d28d998c65e4b6644c4a326938c030d3a5ae095"
    },
    {
      "bestand": "server/lib/excelSjablonen/bronnen/privacy.js",
      "bronref": "66d3dcaf",
      "sha256": "8dc13f80268e7bb55f9c7569125da9024e309462bdbb1fdcf2313dba4fa1a7f7"
    },
    {
      "bestand": "server/lib/excelSjablonen/bronnen/router.js",
      "bronref": "66d3dcaf",
      "sha256": "6fb7c227bc103e39b10e10baaaa301fb4348ef3624a438105a3b2b55413c951b"
    },
    {
      "bestand": "server/lib/excelSjablonen/bronnen/store.js",
      "bronref": "66d3dcaf",
      "sha256": "1447615186145280ec91f8d495ca38b97dbec1782e50d89a7b6d89521acb1e6e"
    },
    {
      "bestand": "server/lib/excelSjablonen/bronnen/voorstellen.js",
      "bronref": "66d3dcaf",
      "sha256": "bffc15f33d5a882d0ef318512c4fe9cc38177348ff42cc196c3ab9be39b0363f"
    },
    {
      "bestand": "server/lib/excelSjablonen/contract.js",
      "bronref": "66d3dcaf",
      "sha256": "786899f6df57dcc55aabd7a70e7d3f0c9bb68455c06b2495306061cd9b4a363a"
    },
    {
      "bestand": "server/lib/excelSjablonen/diagnose.js",
      "bronref": "66d3dcaf",
      "sha256": "b5ebe2497b14c3924731c33d0b053ae54d872ca82c9ccd0da4aae106de3440e0"
    },
    {
      "bestand": "server/lib/excelSjablonen/isolate.js",
      "bronref": "66d3dcaf",
      "sha256": "038556096f34f2dbc61b2914f67bbbf526f5b3309c5aa727fbae80f64049024f"
    },
    {
      "bestand": "server/lib/excelSjablonen/job.js",
      "bronref": "66d3dcaf",
      "sha256": "42aec1287e963871b57dd47db7b52b8bc86f086c933086149825c5b7d25c4393"
    },
    {
      "bestand": "server/lib/excelSjablonen/opslagCodec.js",
      "bronref": "66d3dcaf",
      "sha256": "909c8d1c73149791ae6e88966233b36f593c2fb95b98074dec7d6dfdd609750b"
    },
    {
      "bestand": "server/lib/excelSjablonen/pakket.js",
      "bronref": "66d3dcaf",
      "sha256": "da1cac06fac123b601dc5c1e026819e3b7a0a782a1f4d035c8a72918bd2384b4"
    },
    {
      "bestand": "server/lib/excelSjablonen/passief.js",
      "bronref": "66d3dcaf",
      "sha256": "720f7d749b76f715f4798caffd2ea9368d67f50d75fb3ea3b8a33dc94301f44f"
    },
    {
      "bestand": "server/lib/excelSjablonen/store.js",
      "bronref": "66d3dcaf",
      "sha256": "0cea0ab791990b0f9cf34e8c7f174d71d9199f0b3e7d21305073022d250727e3"
    },
    {
      "bestand": "server/lib/excelSjablonen/voorbeeldbeeld.js",
      "bronref": "66d3dcaf",
      "sha256": "dadde76b7c6f1dd3ed44685c4bf4d801b5b53918006fee698ba917d747dcd0d0"
    },
    {
      "bestand": "server/lib/excelSjablonen/voorbereiden.js",
      "bronref": "66d3dcaf",
      "sha256": "a86099fb22458a6fa64680b8c0ebc13e4b2437fffb947bad159a0f6589f339cd"
    },
    {
      "bestand": "server/lib/excelSjablonen/werkmap.js",
      "bronref": "66d3dcaf",
      "sha256": "0da06e053be0ecede29e5fbc5102d39df6bacbd8dfe16194f0b5586703388512"
    },
    {
      "bestand": "server/lib/formulierControleNavigatie.js",
      "bronref": "66d3dcaf",
      "sha256": "121e6c1c993cf84b251cb195f9a0e0cfe1397c5fa43dcb8ebcdd70c26849f5c5"
    },
    {
      "bestand": "server/lib/klantInname.js",
      "bronref": "66d3dcaf",
      "sha256": "fcf37ab5adceb76747fe1cfc3a11285bbe81a1b89df532417c13aa8c700db265"
    },
    {
      "bestand": "server/lib/klantInnameBeheer.js",
      "bronref": "66d3dcaf",
      "sha256": "13ff9bb2f7b5ff1f8e3d0d774eec6e181ef66576f30825b77f281f7bf9577319"
    },
    {
      "bestand": "server/lib/klantcrm.js",
      "bronref": "66d3dcaf",
      "sha256": "c775f63b3e4525d2156f8fdfeedd208beb5bcc43d54ad6beba92e0b6e820ba4c"
    },
    {
      "bestand": "server/lib/klantrechten.js",
      "bronref": "66d3dcaf",
      "sha256": "4e6abb78b214b93cf52458ae6cd69afbd6022516cbcaa68e13ecd71e7b8c0018"
    },
    {
      "bestand": "server/lib/klantverwijdering.js",
      "bronref": "66d3dcaf",
      "sha256": "04de3097db4b235d9331e2d851d65c62602793c3056eff6819957dc5dfa1b76e"
    },
    {
      "bestand": "server/lib/klantzoekbestanden.js",
      "bronref": "66d3dcaf",
      "sha256": "68501bb2dffb5ad24cae56a2e2ea4fd5e68999774f4670f1652f4a9a8a8cac70"
    },
    {
      "bestand": "server/lib/mailGoedkeuring.js",
      "bronref": "66d3dcaf",
      "sha256": "0c81c30852c67324b6121f305bdfc9c63e3caed8623e5f4dadc0650ea4ba0e82"
    },
    {
      "bestand": "server/lib/mailVoorkeurBeheer.js",
      "bronref": "66d3dcaf",
      "sha256": "11c69b8234718df5038f79176b4d7286451cfc4bc80277a049ed013271ef7726"
    },
    {
      "bestand": "server/lib/opnames/opslag.js",
      "bronref": "66d3dcaf",
      "sha256": "c8438c1ffcf70621a3bba1929082b677ddd67a9af1fb9fac70ab4c7223ad18e5"
    },
    {
      "bestand": "server/lib/opnames/werkplek.js",
      "bronref": "66d3dcaf",
      "sha256": "24bd842639584ac718c43ec026d0bacfdf615b9e959320b8f025cd1ee25d92c6"
    },
    {
      "bestand": "server/lib/opslagQuota.js",
      "bronref": "66d3dcaf",
      "sha256": "b68ed133cbed0bfb29874d28fe341805e7707af60413d2273c1a27749fc7bea8"
    },
    {
      "bestand": "server/lib/persoonlijkVerbruik.js",
      "bronref": "66d3dcaf",
      "sha256": "8a5f98b05fab31bac841252d577b577a443d4a726c1f7b17025daf2ff417ea30"
    },
    {
      "bestand": "server/lib/persoonlijkeApiCredits.js",
      "bronref": "66d3dcaf",
      "sha256": "a49cd43b434162be9bf685bd6c7bd2d0e3ccbe405ba2dcee1bab5955c9b6c164"
    },
    {
      "bestand": "server/lib/presentatieV1/archetypeBouwer.js",
      "bronref": "66d3dcaf",
      "sha256": "68817c97381a74f8d013f6f43d2b614b00ce892281fc1df478c3428784b31963"
    },
    {
      "bestand": "server/lib/presentatieV1/contract.js",
      "bronref": "66d3dcaf",
      "sha256": "2916f407b4388d6830932c0688a73c09f4f148bdd4b6d04514d2e6825cd3ccb5"
    },
    {
      "bestand": "server/lib/presentatieV1/inzage.js",
      "bronref": "66d3dcaf",
      "sha256": "c48ad328cb09734116e571a5f28a36fa28ca93bfb322ae8b843474344d21d258"
    },
    {
      "bestand": "server/lib/presentatieV1/pptxCompiler.js",
      "bronref": "66d3dcaf",
      "sha256": "09a46c1b6a9dc431bc52dbb36149024c8e33c7a12786f771c824db8f7bd99f17"
    },
    {
      "bestand": "server/lib/presentatieV1/publicatie.js",
      "bronref": "66d3dcaf",
      "sha256": "17ba8755306aa4144285084f01c7cb1d58224fba8dfc8139f5e9130191f806e9"
    },
    {
      "bestand": "server/lib/presentatieV1/stijllozePresentatie.js",
      "bronref": "66d3dcaf",
      "sha256": "db2f450be374ae63854d1a0f6f6b2faf4caf92bbb787a626853e488979f05a39"
    },
    {
      "bestand": "server/lib/publiekeApi/account.js",
      "bronref": "66d3dcaf",
      "sha256": "cbd53b48d9721cef071ad2550d513a5595c6f520af25b3e783909203f6d7e6a9"
    },
    {
      "bestand": "server/lib/publiekeApi/acties.js",
      "bronref": "66d3dcaf",
      "sha256": "ea50e378a8bb9d6d1cf7a550732f7b3f41810387a434ffea05058eaa3d4d1e09"
    },
    {
      "bestand": "server/lib/publiekeApi/agenda.js",
      "bronref": "66d3dcaf",
      "sha256": "add7cabb236b435621d1862b1e31d40955241d766da66352fa007a6ba8f6747a"
    },
    {
      "bestand": "server/lib/publiekeApi/autorisatie.js",
      "bronref": "66d3dcaf",
      "sha256": "091e4b861f514e4aea88e7de272f2a25781dc1827ef2e08f6a6c2dd9bee6f876"
    },
    {
      "bestand": "server/lib/publiekeApi/briefing.js",
      "bronref": "66d3dcaf",
      "sha256": "8e1940e76bbe3fd4886a5ec8f88173493fa3bc2e083b3533b5e6ba0d61014d93"
    },
    {
      "bestand": "server/lib/publiekeApi/bronprofielen.js",
      "bronref": "66d3dcaf",
      "sha256": "e34fcc42d34e9a7139d29b39fa740ffb65fd3d92e21d15a0437815f8847f02ed"
    },
    {
      "bestand": "server/lib/publiekeApi/domeinen.js",
      "bronref": "66d3dcaf",
      "sha256": "0a52386201dab8418947c5c1b4107e984c5fb4393b3344187d869a99ed79f76e"
    },
    {
      "bestand": "server/lib/publiekeApi/excel.js",
      "bronref": "66d3dcaf",
      "sha256": "d9500ca0e2239ccffeeaa180a2b5609a916b074c37885c6a5b951750c62020fa"
    },
    {
      "bestand": "server/lib/publiekeApi/gebruik.js",
      "bronref": "66d3dcaf",
      "sha256": "6b063e99de7c6b22b22f8550f5712a4b876c024d798deecbeb5c3bdc6bf95c9f"
    },
    {
      "bestand": "server/lib/publiekeApi/generatieplan.js",
      "bronref": "66d3dcaf",
      "sha256": "fd72995e8c975afdb4f8dcf7fb6e08574626688473aa42f9eb86531607996830"
    },
    {
      "bestand": "server/lib/publiekeApi/huisstijl.js",
      "bronref": "66d3dcaf",
      "sha256": "b9b39be2b7d69e7a31833df2b290c03a5cc5e7d648cfe21de20419b0f5203911"
    },
    {
      "bestand": "server/lib/publiekeApi/klantmappen.js",
      "bronref": "66d3dcaf",
      "sha256": "2e35066b0d21425db92a7f4389eab88bb81b8c978dc917990b0b8d39c0ced553"
    },
    {
      "bestand": "server/lib/publiekeApi/links.js",
      "bronref": "66d3dcaf",
      "sha256": "7fe185afb9d60f0c0d07c7959625f97d0d89510a3a35ad85b0ede8699a973956"
    },
    {
      "bestand": "server/lib/publiekeApi/mail.js",
      "bronref": "66d3dcaf",
      "sha256": "06149e75291565194322ef5f375dff24941419f182c6cd9dada6b4ad4223b8e3"
    },
    {
      "bestand": "server/lib/publiekeApi/poorten.js",
      "bronref": "66d3dcaf",
      "sha256": "3fb2d29ef5dac3d7d682795541c1a1a8bb8407c35e6055997c378a27f73889f2"
    },
    {
      "bestand": "server/lib/publiekeApi/rapportRevisie.js",
      "bronref": "66d3dcaf",
      "sha256": "00410c15fbe9b5b45ab381746aec011b0b3d6b541d7301023747dd2ef762a1e8"
    },
    {
      "bestand": "server/lib/publiekeApi/sleutelbeheer.js",
      "bronref": "66d3dcaf",
      "sha256": "1e4179a9d41904a62e6b4b3876099651f1810efb0dc435ad0b5488ac5009bbf8"
    },
    {
      "bestand": "server/lib/publiekeApi/sleutelbeleid.js",
      "bronref": "66d3dcaf",
      "sha256": "229c71ddc05d77aeb6d62fa6daa865c1da94baad59efad8f3de22b87cece4310"
    },
    {
      "bestand": "server/lib/publiekeApi/stemprofielen.js",
      "bronref": "66d3dcaf",
      "sha256": "834508982c39dd286a54c30559306f643401b6af16dcc144ee460b9110dc0736"
    },
    {
      "bestand": "server/lib/publiekeApi/stijlcontrole.js",
      "bronref": "66d3dcaf",
      "sha256": "e1439be9dc1d3934ae6b5f146bd2df196627d4f4199c461a4bf098beb4b00ca7"
    },
    {
      "bestand": "server/lib/publiekeApi/stijlenV2.js",
      "bronref": "66d3dcaf",
      "sha256": "4265ebe0dbb2d0697b0e99003803f64eb343da89a94f9ad0f84d436410f84205"
    },
    {
      "bestand": "server/lib/publiekeApi/stijlherstel.js",
      "bronref": "66d3dcaf",
      "sha256": "d9164cf1d2cb59e31490fc10ef1075587cbdddd33b9e5b117b38a2dcdc0417ac"
    },
    {
      "bestand": "server/lib/publiekeApi/stijlmaker.js",
      "bronref": "66d3dcaf",
      "sha256": "80c820f0e781a182634b619cd2f056f3dca6d1d8a261f12bdff28b6409a19405"
    },
    {
      "bestand": "server/lib/publiekeApi/stijlmetadata.js",
      "bronref": "66d3dcaf",
      "sha256": "1fe95675fb692f880549b9a61cf6145d82e2319c9321469475e6387454ce5797"
    },
    {
      "bestand": "server/lib/publiekeApi/stijlocr.js",
      "bronref": "66d3dcaf",
      "sha256": "6fddff8216680b1d6cb1577063888345c6b00f7d086ce7e61459d332f9d1c84e"
    },
    {
      "bestand": "server/lib/publiekeApi/stijlupload.js",
      "bronref": "66d3dcaf",
      "sha256": "92007a77f028fc3d4b4b3fbdfb6d8d32573b577f43931f500a7916cf604fda32"
    },
    {
      "bestand": "server/lib/publiekeApi/stijlverfijning.js",
      "bronref": "66d3dcaf",
      "sha256": "6aca2a26acca6c20c9a784e18bb4b088d3df10e25bba36c98ac0e5545264f634"
    },
    {
      "bestand": "server/lib/publiekeApi/transcriptie.js",
      "bronref": "66d3dcaf",
      "sha256": "9f05146c79b1fe95c49b0cc6e86bd10bb9fea02cb0977e92bf73283dfe6d4b13"
    },
    {
      "bestand": "server/lib/publiekeApi/uitvoer.js",
      "bronref": "66d3dcaf",
      "sha256": "6543a9a95e733826ee7429802fbc31a9e6f6214db28327c89bc090828046208f"
    },
    {
      "bestand": "server/lib/publiekeApi/verbindingen.js",
      "bronref": "66d3dcaf",
      "sha256": "083d47357fe2740bb43d85a560e7ccc62e7db0a23a3a6b0d68b1f1160b344f75"
    },
    {
      "bestand": "server/lib/publiekeApi/verzoeken.js",
      "bronref": "66d3dcaf",
      "sha256": "b00434a8590c129146c5dc0615fa27ecb4fb2cd0b9fa5b59ca9c73098c27fc59"
    },
    {
      "bestand": "server/lib/publiekeApi/voorBody.js",
      "bronref": "66d3dcaf",
      "sha256": "ff8afa359fd594fda1cd6b91c940b3fc5d290257b52d20538f4d5c04fe549ad7"
    },
    {
      "bestand": "server/lib/publiekeApi/werkplaats.js",
      "bronref": "66d3dcaf",
      "sha256": "563770ea5a607a146655fc8f5fcd1af980da417bb721d9ca1cc56f80bb22674c"
    },
    {
      "bestand": "server/lib/publiekeApi/workflows.js",
      "bronref": "66d3dcaf",
      "sha256": "207aed8291dc071083030338770675c3ddbc23e298e0a6a23f845ef6eed76beb"
    },
    {
      "bestand": "server/lib/publiekeApi/zelfservice.js",
      "bronref": "66d3dcaf",
      "sha256": "aa90e1aa53e2e906247d3e72ddd3e2efeb503618ac58f2cff6ecb8303f930511"
    },
    {
      "bestand": "server/lib/rapportVoorkeuren.js",
      "bronref": "66d3dcaf",
      "sha256": "b5707b46e0fbcd151dea3fae461e711e728d444efbdfb1e391c8a151d49d2d97"
    },
    {
      "bestand": "server/lib/rapportlyApiGeneratie.js",
      "bronref": "66d3dcaf",
      "sha256": "76c5920a57ce26f1f8bd9261f160ce7b6fd788440b78d5582a623c0d96fd7472"
    },
    {
      "bestand": "server/lib/rapportlyApiSleutel.js",
      "bronref": "66d3dcaf",
      "sha256": "907034b9a9687a278caa4c6a3d2e558e2dccc1f7a7b8f921d7adfbb7ebaab448"
    },
    {
      "bestand": "server/lib/rapportlyClientVersie.js",
      "bronref": "66d3dcaf",
      "sha256": "472e7bf5ebeee4ae771fb18dbc5a36eb1237e4ef7c15756b06457e4ae0aa8f1f"
    },
    {
      "bestand": "server/lib/rapportlyK/opslag.js",
      "bronref": "66d3dcaf",
      "sha256": "ccf7b3208b5c8b7c655e1cd12e60441532379fee9d35e152ea83b7faf1c4b091"
    },
    {
      "bestand": "server/lib/rapportlyPakketContract.js",
      "bronref": "66d3dcaf",
      "sha256": "3781168273e3d1c09f95cdc6e3b61571db45e04fc0986ca60dde8f1d3839c20d"
    },
    {
      "bestand": "server/lib/rapportlyPrivacy/contract.js",
      "bronref": "66d3dcaf",
      "sha256": "b4a26551a62d2fb971b5a6efb3c626aa7e34297457f1b9bfddbc5dd54b0bd0cc"
    },
    {
      "bestand": "server/lib/rapportlyPrivacy/repository.js",
      "bronref": "66d3dcaf",
      "sha256": "02d27816da85196cd4489d2ae804af5968dee3d1bca486b07d84dcf95d1e9d2c"
    },
    {
      "bestand": "server/lib/rapportlyProefperiode.js",
      "bronref": "66d3dcaf",
      "sha256": "0ab41bd4f8ca56e72ec427ccea8ea33d98d5ebd6655f00d9aa68866d18221262"
    },
    {
      "bestand": "server/lib/rapportlyWebhooks.js",
      "bronref": "66d3dcaf",
      "sha256": "0efe6298266fcaea9dc7c87ebdf2a94f70ebbae10d6ad1077189dd64e213d17a"
    },
    {
      "bestand": "server/lib/rapportlyWorkflow/configuratie.js",
      "bronref": "66d3dcaf",
      "sha256": "6670fbce084c72bf7495c8bed20f0c5264220f369785ece3238c8ba3567ab623"
    },
    {
      "bestand": "server/lib/rapportlyWorkflow/voorstellen.js",
      "bronref": "66d3dcaf",
      "sha256": "be58e8464edcd4f462d23b8c5352660e5ee2d3310d1cf6630da75eea4fb227e7"
    },
    {
      "bestand": "server/lib/sjabloon/font.js",
      "bronref": "66d3dcaf",
      "sha256": "556e3014a97e36d519624315beeba23e6af880ee61545ee7954ae7f2d7176a72"
    },
    {
      "bestand": "server/lib/sjabloon/sanitize.js",
      "bronref": "66d3dcaf",
      "sha256": "d31316f6ee717d91af76dba7997d6464ebd3f9415c1f21a59f9346cda1ef2ee7"
    },
    {
      "bestand": "server/lib/sjabloonSpec.js",
      "bronref": "66d3dcaf",
      "sha256": "58d2d76683a8fbe0362d1843b6300b29bfc19fe4e20e4a7f399c4a79aa53c1eb"
    },
    {
      "bestand": "server/lib/slimGenereren/planService.js",
      "bronref": "66d3dcaf",
      "sha256": "7bcb23b1c1dd3ae8539fdda2185f444457ccbd748800b20dd6c16c9c202bb522"
    },
    {
      "bestand": "server/lib/slimGenereren/raming.js",
      "bronref": "66d3dcaf",
      "sha256": "3b226b4c584ef9bfc934fe684c6dacc76c127d10bf2ee922f083f6338a86d9f9"
    },
    {
      "bestand": "server/lib/stijlIndeling.js",
      "bronref": "66d3dcaf",
      "sha256": "354232605b68aa250ca297dcbb804be03c05469f155e363c9777c67265da3505"
    },
    {
      "bestand": "server/lib/stijlOnderzoek/contract.js",
      "bronref": "66d3dcaf",
      "sha256": "e65972f19e1c1c2fbe16030cf6c4d5143995f31e58b24e540c25cc1d8cc0fb40"
    },
    {
      "bestand": "server/lib/stijlOnderzoek/excel.js",
      "bronref": "66d3dcaf",
      "sha256": "0b27b4aa1a696e8c900d56d1af0e12b291c07121017e6a2eadea7fc6fae44d67"
    },
    {
      "bestand": "server/lib/stijlOnderzoek/presentatie.js",
      "bronref": "66d3dcaf",
      "sha256": "5e0cedf074dd61578f377baa72c9a904b79161201fe05d9109eb71af74f0ca4e"
    },
    {
      "bestand": "server/lib/stijlOnderzoek/repository.js",
      "bronref": "66d3dcaf",
      "sha256": "24d4e49437e76317aec87deb6c8a2e2b1cfeb25b940320df1eae9776ec687658"
    },
    {
      "bestand": "server/lib/stijlOnderzoek/routes.js",
      "bronref": "66d3dcaf",
      "sha256": "9258c9f00d89c0afb59a23fffec9259258419bade461a5b79e1a11d50fad1a63"
    },
    {
      "bestand": "server/lib/stijlOnderzoek/voorstellen.js",
      "bronref": "66d3dcaf",
      "sha256": "8d32a13cdfa84eb35d082cc6cb8990bf7c33653ab0c98144bd097e1c564f80a7"
    },
    {
      "bestand": "server/lib/stijlenV2/contract.js",
      "bronref": "66d3dcaf",
      "sha256": "cadffce599cfd4a6177b024dd3bd183c9245df8c370a40d5c7feff25d93bbdb2"
    },
    {
      "bestand": "server/lib/stijlenV2/routes.js",
      "bronref": "66d3dcaf",
      "sha256": "e2303df1fff194ed07af480a6f380202d02f5a4192b7aa1b23d125eca8a9d055"
    },
    {
      "bestand": "server/lib/stijlmaker/ontwerp.js",
      "bronref": "66d3dcaf",
      "sha256": "ff102af222f5fa6f4960ed89ea69335b934630fe9d910763cc435caad82b454e"
    },
    {
      "bestand": "server/lib/stijlmaker/voorbeeld.js",
      "bronref": "66d3dcaf",
      "sha256": "ad7584e2b68cb541b4ce97229ed71f43912367990d18ebb19b2646b257fae51a"
    },
    {
      "bestand": "server/lib/stijlmaker/website.js",
      "bronref": "66d3dcaf",
      "sha256": "d6a7e0526c2db938f5f2cc16ef6e4cb930fcd2b0ad3b100da0afa67addc79d50"
    },
    {
      "bestand": "server/lib/stijlprofielAanvraag.js",
      "bronref": "66d3dcaf",
      "sha256": "f757ba3a847bda2809efdbfd19721fc88a6f2601ecdf6dcf22a291f40cfb456f"
    },
    {
      "bestand": "server/lib/stijlprofielAfbeeldingen.js",
      "bronref": "66d3dcaf",
      "sha256": "65ae64dcb5f4c865f9ae002da0cf993b9feb827f0847d06020f00a1766fd2321"
    },
    {
      "bestand": "server/lib/stijlprofielOpmaakMeldingen.js",
      "bronref": "66d3dcaf",
      "sha256": "1d90471c8e79d9feec2f5d146e0bb60242d6123f0020f7c97383e2d6dd6247d6"
    },
    {
      "bestand": "server/lib/stijlprofielVisionPrijs.js",
      "bronref": "66d3dcaf",
      "sha256": "defadf232e72e53d6c03f0f573cfc1c8f0a9546de378bc7b255efd3750be53e1"
    },
    {
      "bestand": "server/lib/stijlprofielWerkplaats.js",
      "bronref": "66d3dcaf",
      "sha256": "39af15c07c8d792b491d4792ff5d2d05bf170eddc53023d17058a69a06fbe5ec"
    },
    {
      "bestand": "server/lib/stijlwerkplaatsLettertypen.js",
      "bronref": "66d3dcaf",
      "sha256": "6429055e5beddd62ad0d664852acae5bc871a50cea38a6b93a1e0a0fc788bb7c"
    },
    {
      "bestand": "server/lib/taal.js",
      "bronref": "66d3dcaf",
      "sha256": "0714b24c85ffeaa1d0028316a602abd43262fd34b04172c6cb74ec3b8eba8a81"
    },
    {
      "bestand": "server/lib/teamGovernance.js",
      "bronref": "66d3dcaf",
      "sha256": "b38747a5e615f43d14afab3c1c2b650ccd2a0b68e2f07980d9afcfd2cc75328f"
    },
    {
      "bestand": "server/lib/templateNavigatie.js",
      "bronref": "66d3dcaf",
      "sha256": "e5bec64c39c9a6deff396e42117c1d84c33bf6a836786d1b9a8831786a38ac43"
    },
    {
      "bestand": "server/lib/templateV2/bronFontContract.js",
      "bronref": "66d3dcaf",
      "sha256": "22cca4ba33a91bf549c2c352617c9ea3d2659252c019931a7a5be462942bef1f"
    },
    {
      "bestand": "server/lib/templateV2/bronFontPdfBewijs.json",
      "bronref": "66d3dcaf",
      "sha256": "ca4055eafd27696b92758b2b3b537a60bf6f605731cfcc8987872ee4bb924b0b"
    },
    {
      "bestand": "server/lib/templateV2/formulierAanpassingen.js",
      "bronref": "66d3dcaf",
      "sha256": "04ffe0808ed09b993be5e2f63e4ddd3b4a0ed859a449b27c9d9384b22f8447cb"
    },
    {
      "bestand": "server/lib/templateV2/passieveOpmaakHerstel.js",
      "bronref": "66d3dcaf",
      "sha256": "052fe8171001a8e05c1c174795f6ee780bf2667535a6678b7782c0610592f46d"
    },
    {
      "bestand": "server/lib/templateV2/veiligheid.js",
      "bronref": "66d3dcaf",
      "sha256": "85a290de196ed8c4d777199f5f024bfc1c9947b4123b33d75dbc6877128cd822"
    },
    {
      "bestand": "server/lib/tenant.js",
      "bronref": "66d3dcaf",
      "sha256": "1c62a72359d46b2c0570b9209f850e09ef3b05019be4a4c1e717feb56670824b"
    },
    {
      "bestand": "server/lib/tierVoorkeuren.js",
      "bronref": "66d3dcaf",
      "sha256": "2039e0e1154058a2953064864087f543cb4d1e7f92595969f35cec8d95668875"
    },
    {
      "bestand": "server/lib/transcriptie/modellen.js",
      "bronref": "66d3dcaf",
      "sha256": "b5fd3f3646bb1ca05fc936d176ce749fd48fd4c5bf0315a64733029a2ce6df09"
    },
    {
      "bestand": "server/lib/transcriptie/speechmaticsProvider.js",
      "bronref": "66d3dcaf",
      "sha256": "5c09e6608380a4b2687f30e234d1656516e8e89739e0a5ea736bc41d0b08d6d4"
    },
    {
      "bestand": "server/lib/uitvoer/gesprekBijsturen.js",
      "bronref": "66d3dcaf",
      "sha256": "4a9642b350a2443af326192c37a59299dfa78342682d8f696fe3381c2948d663"
    },
    {
      "bestand": "server/lib/uitvoer/gesprekMutatie.js",
      "bronref": "66d3dcaf",
      "sha256": "8670d3f1d89a03cd250bfd82663e45bf805a351db232a94747aba6559529df10"
    },
    {
      "bestand": "server/lib/uitvoer/versies.js",
      "bronref": "66d3dcaf",
      "sha256": "460741d970aedc23a0b54fb4bc9861faec121b9f4add8d92fd7995cb2e22f9f0"
    },
    {
      "bestand": "server/lib/universele-documentarchetypen/index.js",
      "bronref": "66d3dcaf",
      "sha256": "51d34682e47e4befd49cc441a907d3cb7fa38c4b85e0ec3c20c77204f0f042f4"
    },
    {
      "bestand": "server/lib/universele-documentarchetypen/voorkeuren.js",
      "bronref": "66d3dcaf",
      "sha256": "9235db9d54fe54a9744ae8406b5e7d1ea8e698ad9b555dfca6152c156e34c501"
    },
    {
      "bestand": "server/lib/voorbeeldProfiel.js",
      "bronref": "66d3dcaf",
      "sha256": "abac60686db435328a474f8994a7a5c2f298bd771052d5b561d26ce1088e3663"
    },
    {
      "bestand": "server/lib/voorbeeldProfielBronnen.js",
      "bronref": "66d3dcaf",
      "sha256": "efc7d81ca08af0067342c152c592f1a3ac73674495eac020fcd8e910d4ac075a"
    },
    {
      "bestand": "server/lib/voorbeeldProfielVerfijning.js",
      "bronref": "66d3dcaf",
      "sha256": "98e47380bb057b07214a315eb73e34d298ce468c00967667f5528ccbd454cb08"
    },
    {
      "bestand": "server/migrations/126_rapportly_documenten.sql",
      "bronref": "66d3dcaf",
      "sha256": "9b4f80ce0668991b80bb860f7fe365045e287985e3840333ecbafa89d98cece5"
    },
    {
      "bestand": "server/migrations/198_rapportly_brondocument_profielen.sql",
      "bronref": "66d3dcaf",
      "sha256": "7c2b160f0dad1346055910d3b61e4fdd545cb7bb632e66b9796aee8851f65081"
    },
    {
      "bestand": "server/migrations/210_rapportly_persoonlijke_api_kostencredits.sql",
      "bronref": "66d3dcaf",
      "sha256": "5fb0c38d19e32a18c54599a850e6707d6ee3c11d89b8b552f6c7f4c9b73bc680"
    },
    {
      "bestand": "server/migrations/246_rapportly_opslagquota_supabase_kosten.sql",
      "bronref": "66d3dcaf",
      "sha256": "d8f592ae61877dac36bfa2a1924df92b2bae8f549b39304e75a60d2c1877140b"
    },
    {
      "bestand": "server/migrations/260_rapportly_klantverwijdering.sql",
      "bronref": "66d3dcaf",
      "sha256": "427fa356d4d861c86f70b68162c3e61430b01abc8726e3e003e4eedcf717ce8f"
    },
    {
      "bestand": "server/migrations/261_rapportly_klantverwijdering_servicerol.sql",
      "bronref": "66d3dcaf",
      "sha256": "12346dad1a7700512d31c6d10ddd044beda0cd2f4f3cf132c3d1c7a5578e2fb5"
    },
    {
      "bestand": "server/migrations/271_rapportly_excel_sjablonen.sql",
      "bronref": "66d3dcaf",
      "sha256": "45979bd186a1f150d25182467286fefb59ca515ef723edad5f10c58e252fea0e"
    },
    {
      "bestand": "server/migrations/274_rapportly_stijlwerkplaats_mastereigenaar.sql",
      "bronref": "66d3dcaf",
      "sha256": "ade67273e87b4489f760a744d021ca24cdcc834ad534ecfa85cbadbf1d2ab736"
    },
    {
      "bestand": "server/migrations/276_rapportly_excel_bronvoorstellen.sql",
      "bronref": "66d3dcaf",
      "sha256": "6a88e5f6602d2e23fe9903b80ccdf9d0b5b24bc0e0e0bad3685a3dee7720b7fc"
    },
    {
      "bestand": "server/migrations/289_rapportly_stijlonderzoek.sql",
      "bronref": "66d3dcaf",
      "sha256": "04405302116e3842f181265dfa2f5e107bdf5419e982e48e87c87406b24f54fb"
    },
    {
      "bestand": "server/migrations/290_rapportly_templatecontrole_digest.sql",
      "bronref": "66d3dcaf",
      "sha256": "0014a69051e4064ddb6232b93e55c1e8b5afb98ef126c42a6799f58200025bf6"
    },
    {
      "bestand": "server/migrations/294_rapportly_beeldbank_engines.sql",
      "bronref": "66d3dcaf",
      "sha256": "21bc3e6f9c22f286e094de6f47ba6ce71d14d7394f3226617db3d93b9386ea20"
    },
    {
      "bestand": "server/migrations/296_rapportly_persoonlijke_opslag.sql",
      "bronref": "66d3dcaf",
      "sha256": "097380a82a9d5a19b7da761de4b2f362d10ca51fbef13a365bbfd94dfcb88cc6"
    },
    {
      "bestand": "server/migrations/299_rapportly_workflowvoorstel_zekere_fout.sql",
      "bronref": "66d3dcaf",
      "sha256": "67e8168ccfe12166f0ab0af02f779d7ee1658c4f33dd6935216eec7614394518"
    },
    {
      "bestand": "server/migrations/316_rapportly_creditcontinuiteit.sql",
      "bronref": "66d3dcaf",
      "sha256": "412f36f34ed95037452d58005c53b02612fe9265d8f7b25654b3946a778090e1"
    },
    {
      "bestand": "server/migrations/321_rapportly_creditvoorschotten.sql",
      "bronref": "66d3dcaf",
      "sha256": "f33c3c29a2acd9f22242dbaf7d5f900ba1d9ee56b05d039174ad5c10f5deaf74"
    },
    {
      "bestand": "server/migrations/335_rapportly_transcript_bewerken.sql",
      "bronref": "66d3dcaf",
      "sha256": "81a83f50df4af7a7e88bbeac569ca5edc960f57b023376a0912311ff3493aa43"
    },
    {
      "bestand": "server/migrations/337_rapportly_opnamewerkplek.sql",
      "bronref": "66d3dcaf",
      "sha256": "d12ba4796a2c78ab45038864577e8dc5efb3ff1a150296a691ec35fb467a2b69"
    },
    {
      "bestand": "server/migrations/338_rapportly_stemprofielen.sql",
      "bronref": "66d3dcaf",
      "sha256": "25d681f4777bd1f10992d731562396153133053fc6eecc55c651b0774fa42fc7"
    },
    {
      "bestand": "server/migrations/342_rapportly_opname_klantrechten.sql",
      "bronref": "66d3dcaf",
      "sha256": "5e1158bac06b316bad3f5887be29cc4ae0fcad9f8dff757b0f886603478aaa86"
    },
    {
      "bestand": "server/migrations/343_rapportly_klantrechten_conflict.sql",
      "bronref": "66d3dcaf",
      "sha256": "76916d5d4f782b575811a29e4e1930e62a34341a655bccac2c80ca265f293743"
    },
    {
      "bestand": "server/migrations/348_rapportly_stijlen_v2.sql",
      "bronref": "66d3dcaf",
      "sha256": "3aa961419681729fee4da4f7afb2158f7bdf4d817b3c6e33123dcba0d3e87762"
    },
    {
      "bestand": "server/migrations/353_rapportly_stijltest_jobquota.sql",
      "bronref": "66d3dcaf",
      "sha256": "0164faf15455093dc0aae0a7a637e22fa03a9898b29f733e7f81e57528b065ef"
    },
    {
      "bestand": "server/migrations/355_rapportly_stijlverfijn_jobs.sql",
      "bronref": "66d3dcaf",
      "sha256": "bf0560cfe391f9226b7f9208d71d002704a0c500302b5e9720bd4b097986e491"
    },
    {
      "bestand": "server/migrations/358_rapportly_bronverwerking_jobs.sql",
      "bronref": "66d3dcaf",
      "sha256": "ff49b69260fc5500e319d2b074a165904b29a4cf7ed33abce727a023a6f6506b"
    },
    {
      "bestand": "server/migrations/359_rapportly_api_beleid_en_budget.sql",
      "bronref": "66d3dcaf",
      "sha256": "ece782f881a156d3e971523541eac17b0da98def30239f6e5a2a944300436f2c"
    },
    {
      "bestand": "server/migrations/361_rapportly_stijlmaker_jobs.sql",
      "bronref": "66d3dcaf",
      "sha256": "61fddea1d3784a6e0bf39b952ea9009db24412ad502fc3a0101c18c8ef3d7613"
    },
    {
      "bestand": "server/migrations/362_rapportly_huisstijlsjabloon_jobs.sql",
      "bronref": "66d3dcaf",
      "sha256": "c207d6f2f4a32e8a5b6c1d2322447590744cce3515edd4e50fec859cbb2e950d"
    },
    {
      "bestand": "server/migrations/363_rapportly_api_klantmutaties.sql",
      "bronref": "66d3dcaf",
      "sha256": "ee4b91a80f2dc21f1e083f19ba28df6896a121efa4058793d0c6888be1620c7e"
    },
    {
      "bestand": "server/migrations/364_rapportly_klantcrm.sql",
      "bronref": "66d3dcaf",
      "sha256": "535c73e1b897d6d783550524921076a8fc998c877fca5a4fbe6a814530b7378d"
    },
    {
      "bestand": "server/migrations/366_rapportly_rapportuitvoer_revisies.sql",
      "bronref": "66d3dcaf",
      "sha256": "d28771e94828d9ab28663efc38b1a2cf9be3f3fd8f2263b17c355e12fb7e0fd7"
    },
    {
      "bestand": "server/migrations/367_rapportly_briefing_verwijderplan.sql",
      "bronref": "66d3dcaf",
      "sha256": "fbf5c0f7204b5ee69cfd8401fa580c5bb240ea0d1590b712e0f420bd5b7b0429"
    },
    {
      "bestand": "server/package-lock.json",
      "bronref": "66d3dcaf",
      "sha256": "814d8d8097d1abefd561b93d72644462198e732117af3a0d01574437bca4f299"
    },
    {
      "bestand": "server/rapportly_aanleverlink_api.js",
      "bronref": "66d3dcaf",
      "sha256": "b207ae7b1079bf40246c2bde54ee94e50c849bb0d08c48443fdc1e5d1c6a5979"
    },
    {
      "bestand": "server/rapportly_agenda_api.js",
      "bronref": "66d3dcaf",
      "sha256": "3b9e952bbaef72e7b55f9f1222aa4b5d3cf09466079cb81af65d3a2b52347f4b"
    },
    {
      "bestand": "server/rapportly_api.js",
      "bronref": "66d3dcaf",
      "sha256": "ac93137a763d5d7128c231056e12ab39fc57787ec4ea92f07083e5bcb4a52513"
    },
    {
      "bestand": "server/rapportly_api_bronnen.js",
      "bronref": "66d3dcaf",
      "sha256": "02b6b180c40cdb7853473842c59665ec1c9184a679428512b2bee65b7e8d0f49"
    },
    {
      "bestand": "server/rapportly_bibliotheek_api.js",
      "bronref": "66d3dcaf",
      "sha256": "d8619d48ecd7e7c9132424fb7a38d63003e8acf8c27f57359143a7751554e513"
    },
    {
      "bestand": "server/rapportly_brondocument_api.js",
      "bronref": "66d3dcaf",
      "sha256": "1fb544f4a88364aef3b487f7f6f91ddf9604756725b97408ce6d493560b776ac"
    },
    {
      "bestand": "server/rapportly_deel_api.js",
      "bronref": "66d3dcaf",
      "sha256": "ee5594fd2ee2a4134dd83ce8640c8c0aa26fad39bd1f01cb60d996db552b01d3"
    },
    {
      "bestand": "server/rapportly_excel_api.js",
      "bronref": "66d3dcaf",
      "sha256": "45bf42a877cfe66ed17899fa52979e260439f0f2b397b4a48ae317eebcadea1a"
    },
    {
      "bestand": "server/rapportly_k_api.js",
      "bronref": "66d3dcaf",
      "sha256": "f7fbea403025ec2980391c40399368b1ffb1068d17115abb222aeb3f96409bdb"
    },
    {
      "bestand": "server/rapportly_klantcrm_api.js",
      "bronref": "66d3dcaf",
      "sha256": "5172fc2b92c610961c857c5b0ea19d4f6a420aa800d0c18e9d44d7e7d94f54d0"
    },
    {
      "bestand": "server/rapportly_klantrechten_api.js",
      "bronref": "66d3dcaf",
      "sha256": "dfa0118a24977cef443535c2222ffb6d463cfd0ae019590f9a2b2373927aaedb"
    },
    {
      "bestand": "server/rapportly_klantverwijdering_api.js",
      "bronref": "66d3dcaf",
      "sha256": "1dc8faed5312645e4f03da05388bd8b419f0a60577c5bbd639bf4a2499cda435"
    },
    {
      "bestand": "server/rapportly_koppel_api.js",
      "bronref": "66d3dcaf",
      "sha256": "677f9933caf181d1721a239f4f131a5efcf22218f83617935395d10453d15a66"
    },
    {
      "bestand": "server/rapportly_koppeling_api.js",
      "bronref": "66d3dcaf",
      "sha256": "298f03ba8f4987ba161dfc807bdd598e18964a3b928e064997a23c9ffd6b39ea"
    },
    {
      "bestand": "server/rapportly_opname_api.js",
      "bronref": "66d3dcaf",
      "sha256": "e96cf6d72fa8c737e4efa0d17741280075a31c3a793d5db67e0a81ff06132365"
    },
    {
      "bestand": "server/rapportly_opnamewerkplek_api.js",
      "bronref": "66d3dcaf",
      "sha256": "168e0fd8c1e9339d713984d5b15dcd902d1df5a1b09ffd8ea3f80253bc8cb18c"
    },
    {
      "bestand": "server/rapportly_productie_api.js",
      "bronref": "66d3dcaf",
      "sha256": "ce602e5298339ca6b0b72e4087a5fc475bd301e002c4a0f697f6780efc0eaa7c"
    },
    {
      "bestand": "server/rapportly_sjabloon_api.js",
      "bronref": "66d3dcaf",
      "sha256": "b78946cc7e647514cd509b47d7adbb2fe17a3f160b7188cc7a7e59f00d96cf6a"
    },
    {
      "bestand": "server/rapportly_stemprofielen_api.js",
      "bronref": "66d3dcaf",
      "sha256": "4a945ed7e11e040282615d1fc8ba5d9740a0380105e17284933a7827c49c09c2"
    },
    {
      "bestand": "server/rapportly_stijlmaker_api.js",
      "bronref": "66d3dcaf",
      "sha256": "7acc22fa98083772c9b8db05921c6714708513896bd787b4d218e8788e37b9e0"
    },
    {
      "bestand": "server/rapportly_team_api.js",
      "bronref": "66d3dcaf",
      "sha256": "5b78ab7668b1ae6a1068e08df5dc7f73aa35eddf176f7d649ff75d791a5ec1da"
    },
    {
      "bestand": "server/rapportly_transcript_bewerken_api.js",
      "bronref": "66d3dcaf",
      "sha256": "9f4057de6d594e07b2a8ff0edf168250910bc9ddaa0312bdb74198d69e1c90ef"
    },
    {
      "bestand": "server/rapportly_transcriptie_api.js",
      "bronref": "66d3dcaf",
      "sha256": "da4ce42fd3a288c91035446f5da1ed04b5825f3c36b98c5b498c63fcac3bf268"
    },
    {
      "bestand": "server/rapportly_uitvoer_api.js",
      "bronref": "66d3dcaf",
      "sha256": "09b86f9109b1312ddb582edaf5de2dbc7e53a01efb5b7f94c1005b97b95e64cd"
    },
    {
      "bestand": "server/jobs/tweedeUitvoertaal.js",
      "bronref": "80be4075",
      "sha256": "c381bda4c7208cd1024ae24ff7969c932b919b6be33f3d070245e67333c10a4b"
    },
    {
      "bestand": "server/lib/klantrechten.js",
      "bronref": "80be4075",
      "sha256": "4e6abb78b214b93cf52458ae6cd69afbd6022516cbcaa68e13ecd71e7b8c0018"
    },
    {
      "bestand": "server/lib/publiekeApi/acties.js",
      "bronref": "80be4075",
      "sha256": "502745ce73c59e8b140d7af64e06a081f755a00db029827c4ee868dfac6c93a6"
    },
    {
      "bestand": "server/lib/publiekeApi/leesdelegatie.js",
      "bronref": "80be4075",
      "sha256": "5268d6730986ada602fda865cc7dd496ea782fe966679273bb0404d07867e970"
    },
    {
      "bestand": "server/lib/publiekeApi/taalbriefLezen.js",
      "bronref": "80be4075",
      "sha256": "f53fbf585f7cc0316c1f3ed373b895630edf8cfc4cf522f8918a692378c2e967"
    },
    {
      "bestand": "server/lib/publiekeApi/taalvariantenLezen.js",
      "bronref": "80be4075",
      "sha256": "bda9635e350f81abf3b378f16752f027f56cfaf2e688b855a1e893e20cae947e"
    },
    {
      "bestand": "server/lib/tweedeUitvoertaal.js",
      "bronref": "80be4075",
      "sha256": "4a3769205c25ce36a7824810f37745f4c6287e0af4737a44d9e792312c700315"
    },
    {
      "bestand": "server/migrations/197_tweede_uitvoertaal.sql",
      "bronref": "80be4075",
      "sha256": "67d4ce8bfade8033de4ae636b44ca63a27de3ec29e9b73f1c62f9734c8fbde71"
    },
    {
      "bestand": "server/rapportly_api.js",
      "bronref": "80be4075",
      "sha256": "ad6828f602774d3bf375be20dce43f98613f717e0517a7e0f10c8053297ff84a"
    },
    {
      "bestand": "server/jobs/tweedeUitvoertaal.js",
      "bronref": "91a4b1b4",
      "sha256": "7c9b32608fdfa898061dca127c75bd2e9e01a10dab6137c3cbb0f04fe114c330"
    },
    {
      "bestand": "server/lib/publiekeApi/acties.js",
      "bronref": "91a4b1b4",
      "sha256": "0ac0b49d4996d4856aaad789f2d9ff57732620776fa87582c14bbb035c5ac508"
    },
    {
      "bestand": "server/lib/publiekeApi/leesdelegatie.js",
      "bronref": "91a4b1b4",
      "sha256": "5268d6730986ada602fda865cc7dd496ea782fe966679273bb0404d07867e970"
    },
    {
      "bestand": "server/lib/publiekeApi/taalvariantenLezen.js",
      "bronref": "91a4b1b4",
      "sha256": "8cbd1846c71111a257c68962b8fea3ae6c83376e833bb41c515c948e907dff84"
    },
    {
      "bestand": "server/lib/tweedeUitvoertaal.js",
      "bronref": "91a4b1b4",
      "sha256": "4a3769205c25ce36a7824810f37745f4c6287e0af4737a44d9e792312c700315"
    },
    {
      "bestand": "server/migrations/197_tweede_uitvoertaal.sql",
      "bronref": "91a4b1b4",
      "sha256": "67d4ce8bfade8033de4ae636b44ca63a27de3ec29e9b73f1c62f9734c8fbde71"
    },
    {
      "bestand": "server/rapportly_api.js",
      "bronref": "91a4b1b4",
      "sha256": "76955ed193db2868c7c476b487c992b89348fa2885837a6c590efd8a02bf6feb"
    },
    {
      "bestand": "server/lib/klantrechten.js",
      "bronref": "9bab4bc9",
      "sha256": "4e6abb78b214b93cf52458ae6cd69afbd6022516cbcaa68e13ecd71e7b8c0018"
    },
    {
      "bestand": "server/lib/uitvoer/productieAdapters/index.js",
      "bronref": "9bab4bc9",
      "sha256": "e4ec71dd362cfc6134623a8d4e9e44739529831f193a1deb995c685509837307"
    },
    {
      "bestand": "server/lib/uitvoer/productieAdapters/verschillen.js",
      "bronref": "9bab4bc9",
      "sha256": "e44432351074a1831c65b9b049ee4d78c52594a867587d99e71ebe350cb562ba"
    },
    {
      "bestand": "server/lib/uitvoer/productieIntegratie/index.js",
      "bronref": "9bab4bc9",
      "sha256": "0056f4257717dbe4c7ebaa8aa6ff24383eac17f6d6900eb64e9d97e32a264442"
    },
    {
      "bestand": "server/lib/uitvoer/rapportOpslag.js",
      "bronref": "9bab4bc9",
      "sha256": "ba01fa2486bdcfc7d4968abcf099e56dd7798c7f1df151f3c20092ef64318e8e"
    },
    {
      "bestand": "server/lib/uitvoer/uitvoeringenRoutes.js",
      "bronref": "9bab4bc9",
      "sha256": "0e4d8f6a3ec2cbef599d5e38f4155f37829c3ca993e3b9cb44bb06e405e16bbe"
    },
    {
      "bestand": "server/lib/uitvoer/workflowDocumentVerschil.js",
      "bronref": "9bab4bc9",
      "sha256": "915edec44d8addaa9769328de989ed99f3aad5de81fb1e6fb8090297540cb7a4"
    },
    {
      "bestand": "server/lib/uitvoer/workflowRunnerStore.js",
      "bronref": "9bab4bc9",
      "sha256": "2007a849511c2b9381f60abee4212cfb6ecd1ee1bf236b212082cd64e850e8ae"
    },
    {
      "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql",
      "bronref": "9bab4bc9",
      "sha256": "7fc3124e7dceba8668a07abb32591f8d4c535e6ba9b241de75e252d4b4344595"
    },
    {
      "bestand": "server/lib/publiekeApi/bulkImport.js",
      "bronref": "a2f438b8",
      "sha256": "cefcacc160f97132614e153a5e5826722f9ad655cfea301a92285a6963b65431"
    },
    {
      "bestand": "server/lib/publiekeApi/bulkImportOntvangst.js",
      "bronref": "a2f438b8",
      "sha256": "1ce44ba2a03772eb1550c5378bc5f19f1b52d4e5957326ededbbe372dba3a17d"
    },
    {
      "bestand": "server/lib/uitvoer/bulkTaalProductie.js",
      "bronref": "a2f438b8",
      "sha256": "ef23f4147b1cee97de9ad9ccfdf56c67768baeb7870538c1adc08d2d6014e5cf"
    },
    {
      "bestand": "server/lib/uitvoer/taalProductieContext.js",
      "bronref": "a2f438b8",
      "sha256": "e742e0b85f1bf75ceb9898b5237539857a5ba773b584ed69c69811b5bf312b6c"
    },
    {
      "bestand": "server/lib/uitvoer/taalRetentieReleasegrens.js",
      "bronref": "a2f438b8",
      "sha256": "5b78c9753c1e3b7cf0cae61c4fe5064d149d71796909a9a9df0af23f49db0156"
    },
    {
      "bestand": "server/lib/uitvoer/workflowRunnerRoutes.js",
      "bronref": "a2f438b8",
      "sha256": "c760c8da4666425c4c07ea990f7d1c0e8a5cf558dd2612109ab0d745c11c4c5c"
    },
    {
      "bestand": "server/lib/uitvoer/workflowTaalContract.js",
      "bronref": "a2f438b8",
      "sha256": "c0a077d016f68e74baa03842b0b2414f67b96b614b86bc16b80288df1ad6139e"
    },
    {
      "bestand": "server/lib/uitvoer/workflowTaalService.js",
      "bronref": "a2f438b8",
      "sha256": "1752548074c0b280333ab5305516f258fd6361a51debe2f2b86772c13351a54d"
    },
    {
      "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql",
      "bronref": "a2f438b8",
      "sha256": "152266d6263605e64c0729209640ae4107e210351c773f03da01b651711d9253"
    },
    {
      "bestand": "server/migrations/376_rapportly_taal_ouderlevensduur.sql",
      "bronref": "a2f438b8",
      "sha256": "fd77a458c3594f45a46f814c26398c600bce6fc4e78798d8231a400a85131d86"
    },
    {
      "bestand": "server/jobs/adapters/uitvoeringPrivacy.js",
      "bronref": "aa6153e5d9d53938c276bc839268ed53aec71002",
      "sha256": "b7fb0521f4c37d6604ebcf7276295f10c1e5cc3dfeafa5ea4b4f6ebd5fb76f3d"
    },
    {
      "bestand": "server/lib/publiekeApi/acties.js",
      "bronref": "aa6153e5d9d53938c276bc839268ed53aec71002",
      "sha256": "53a4c67c685bb629ec1e1bc684babaca5b146c6406e8caf0ade0a85513fb67a8"
    },
    {
      "bestand": "server/lib/publiekeApi/uitvoer.js",
      "bronref": "aa6153e5d9d53938c276bc839268ed53aec71002",
      "sha256": "4436e0408a210b68b3cf2100206b4edab09d19a5a4e459a89ddb422900c64333"
    },
    {
      "bestand": "server/lib/uitvoer/uitvoerHistorieVerschil.js",
      "bronref": "aa6153e5d9d53938c276bc839268ed53aec71002",
      "sha256": "f95e9317c06b54e14153421c58af3727abf782f4952839f7137cdf34dcdf098a"
    },
    {
      "bestand": "server/lib/uitvoer/versies.js",
      "bronref": "aa6153e5d9d53938c276bc839268ed53aec71002",
      "sha256": "460741d970aedc23a0b54fb4bc9861faec121b9f4add8d92fd7995cb2e22f9f0"
    },
    {
      "bestand": "server/lib/uitvoer/workflowDocumentVerschil.js",
      "bronref": "aa6153e5d9d53938c276bc839268ed53aec71002",
      "sha256": "c48f4e54334e73a2f65f4bafacac7f3bfc423484f61a89f48d7e0aa1ebf68c0c"
    },
    {
      "bestand": "server/rapportly_uitvoer_api.js",
      "bronref": "aa6153e5d9d53938c276bc839268ed53aec71002",
      "sha256": "4b8d122b2dfe3d222f7f9178f7dd30568d6dc6e56798c8a6be66c2f14ef548fb"
    },
    {
      "bestand": "server/index.js",
      "bronref": "c00e325b",
      "sha256": "8ca4448c82aca0712ebca28bffc25bd3acbf5c442c8eea62d7a576bd37c8f591"
    },
    {
      "bestand": "server/jobs/adapters/bulkImportInput.js",
      "bronref": "c00e325b",
      "sha256": "c977ecfbbed2414502d984ea55c506499c3808f60366c59875936d5da231c0e7"
    },
    {
      "bestand": "server/jobs/adapters/uitvoerMutatieCredits.js",
      "bronref": "c00e325b",
      "sha256": "4cf8816cdf0f73031e90273e5242458bb3eed6c62363004ab323d583585e1fb1"
    },
    {
      "bestand": "server/jobs/handlers/rapportHergenereren.js",
      "bronref": "c00e325b",
      "sha256": "aacd9e24019bca35d1d3227313a435123595c2ef9035c6c6be863efc32c7040e"
    },
    {
      "bestand": "server/jobs/startIdempotency.js",
      "bronref": "c00e325b",
      "sha256": "851204e0853f9799192a4e5dd42bd1a47f1c32419bd87ba83415176180a66960"
    },
    {
      "bestand": "server/jobs/uitvoerMutatieContract.js",
      "bronref": "c00e325b",
      "sha256": "a524d99364b7f25c778a2e2cd421b7713a58d2bb4461b5eb556d5a160505ee03"
    },
    {
      "bestand": "server/lib/bulkImportContext.js",
      "bronref": "c00e325b",
      "sha256": "52bc711d3984853ca12cd7ca8895150a7852049adc748f45c530a0452b897fd4"
    },
    {
      "bestand": "server/lib/bulkImportContract.js",
      "bronref": "c00e325b",
      "sha256": "6cb6a9f6add44c6298d97256fa5d7a9e0b228359addb4fcd07fd15e5801153ac"
    },
    {
      "bestand": "server/lib/bulkImportReadiness.js",
      "bronref": "c00e325b",
      "sha256": "c9407f3359f881ea9154e9a37e85bf7f9979c5829684af862c07f78bd068211b"
    },
    {
      "bestand": "server/lib/klantmapContact.js",
      "bronref": "c00e325b",
      "sha256": "1a616e954d249270e50353fc6ed334d83a5c638d30c16aa07bde04d087503ab9"
    },
    {
      "bestand": "server/lib/klantportaalKantoor.js",
      "bronref": "c00e325b",
      "sha256": "7a2cc58c31eb7bd0c7fb9978a52ccd55c0d92a49b724d31b903144e7f914cd97"
    },
    {
      "bestand": "server/lib/klantportaalKantoorRoutes.js",
      "bronref": "c00e325b",
      "sha256": "49b3ef8990e7bb962555d8979473e302bf1e79fea131a1ca24e65e7e7b1a5781"
    },
    {
      "bestand": "server/lib/klantportaalUitnodiging.js",
      "bronref": "c00e325b",
      "sha256": "943342fa3ed383e2188f9353888069da5e327f68b3996d77051aa86fd496a6a5"
    },
    {
      "bestand": "server/lib/klantrechten.js",
      "bronref": "c00e325b",
      "sha256": "4e6abb78b214b93cf52458ae6cd69afbd6022516cbcaa68e13ecd71e7b8c0018"
    },
    {
      "bestand": "server/lib/publiekeApi/bulkImport.js",
      "bronref": "c00e325b",
      "sha256": "3fdd337e9dad3fb145f96fee21164f483284600cf9e1aef711771049426b1d40"
    },
    {
      "bestand": "server/lib/publiekeApi/bulkImportContract.js",
      "bronref": "c00e325b",
      "sha256": "e7f675b1fff4d8d57a26040acce627aa9d556400e7f16cdd210400a21b64c0f5"
    },
    {
      "bestand": "server/lib/publiekeApi/bulkImportOntvangst.js",
      "bronref": "c00e325b",
      "sha256": "1bb7e7679fc60b618e8b3c4724f49c382922bbabbc78081a90558f56977a6b81"
    },
    {
      "bestand": "server/lib/publiekeApi/leesdelegatie.js",
      "bronref": "c00e325b",
      "sha256": "5268d6730986ada602fda865cc7dd496ea782fe966679273bb0404d07867e970"
    },
    {
      "bestand": "server/lib/publiekeApi/poorten.js",
      "bronref": "c00e325b",
      "sha256": "0f19c305115abdd754297dbd2126c5a76d3bf1ab5258a75966e0d492e6d9e946"
    },
    {
      "bestand": "server/lib/publiekeApi/registratie.js",
      "bronref": "c00e325b",
      "sha256": "5e7dd4775e5a6b7d9b8b477a9dd26cc47b4c516231222c3cad63e1e88b61ceac"
    },
    {
      "bestand": "server/lib/publiekeApi/uitvoer.js",
      "bronref": "c00e325b",
      "sha256": "59b9118e57005ed18e2ea3bee93314cbdd7812ac63b1196d671c1e06a66975ef"
    },
    {
      "bestand": "server/lib/rapportDagcap.js",
      "bronref": "c00e325b",
      "sha256": "3e25024ca9939d983b62b8455b5eba62d02ae29fe7746cbf12a4c4da8fee4f2b"
    },
    {
      "bestand": "server/lib/rapportDagcapOnderhoud.js",
      "bronref": "c00e325b",
      "sha256": "aa859358b87d97849f08c6a707cc22403c80d6b4eddf0a24c8895f8bb82739ae"
    },
    {
      "bestand": "server/lib/rapportlyApiSleutel.js",
      "bronref": "c00e325b",
      "sha256": "907034b9a9687a278caa4c6a3d2e558e2dccc1f7a7b8f921d7adfbb7ebaab448"
    },
    {
      "bestand": "server/lib/tweedeUitvoertaal.js",
      "bronref": "c00e325b",
      "sha256": "4a3769205c25ce36a7824810f37745f4c6287e0af4737a44d9e792312c700315"
    },
    {
      "bestand": "server/lib/uitvoer/duurzameMutaties.js",
      "bronref": "c00e325b",
      "sha256": "d456152f7b4ac298998ab6094c7a6b5b9b1f3af200a4ce8a5767c22dd71c4ae5"
    },
    {
      "bestand": "server/lib/uitvoer/gesprekBijsturen.js",
      "bronref": "c00e325b",
      "sha256": "4a9642b350a2443af326192c37a59299dfa78342682d8f696fe3381c2948d663"
    },
    {
      "bestand": "server/lib/uitvoer/hergeneratie.js",
      "bronref": "c00e325b",
      "sha256": "36d3833dd499500d7c939efbf7da77f303ead8331435199fbc1875bf4e49cffa"
    },
    {
      "bestand": "server/migrations/202_rapportly_duurzame_uitvoermutaties.sql",
      "bronref": "c00e325b",
      "sha256": "1793184564bf1e9c12532afc6eac7171626ab1add54ef0b9dc3bc8f75fe2b6e8"
    },
    {
      "bestand": "server/migrations/307_rapportly_klantportaal.sql",
      "bronref": "c00e325b",
      "sha256": "9e756e38f86f147fbed517796b9dab2718dd0e3cd54e1f8638adbfa17a9c974a"
    },
    {
      "bestand": "server/migrations/359_rapportly_api_beleid_en_budget.sql",
      "bronref": "c00e325b",
      "sha256": "0199b6f84d749cedc56ef937d5e91e2a31e2e8808e67d88a2f114779f34d7faf"
    },
    {
      "bestand": "server/migrations/366_rapportly_rapportuitvoer_revisies.sql",
      "bronref": "c00e325b",
      "sha256": "d28771e94828d9ab28663efc38b1a2cf9be3f3fd8f2263b17c355e12fb7e0fd7"
    },
    {
      "bestand": "server/migrations/370_rapportly_klantcrm_vervolg.sql",
      "bronref": "c00e325b",
      "sha256": "2b3a02fba45e9797ae09358fad9379cff68dcabb58bc969b5e02617869b3d87f"
    },
    {
      "bestand": "server/rapportly_api.js",
      "bronref": "c00e325b",
      "sha256": "2f123ae077abafcc2793452401bc682cbb974780a487e31780f7fcb3a4deffa1"
    },
    {
      "bestand": "server/rapportly_klantportaal_api.js",
      "bronref": "c00e325b",
      "sha256": "4a995f67eeb4ea5743b7d70d4c89052e729a990554b164c61c7f7cfe3a9deb5d"
    },
    {
      "bestand": "server/rapportly_uitvoer_api.js",
      "bronref": "c00e325b",
      "sha256": "09b86f9109b1312ddb582edaf5de2dbc7e53a01efb5b7f94c1005b97b95e64cd"
    },
    {
      "bestand": "server/lib/klantcrmVervolgLezen.js",
      "bronref": "c6fd0ca1",
      "sha256": "a14f29a9c6925826e8ee3aa59eb20b9d9a34a3d780428ff979f3e0d80641f724"
    },
    {
      "bestand": "server/lib/publiekeApi/domeinen.js",
      "bronref": "c6fd0ca1",
      "sha256": "c9509529dfdd478e5dcfa0911a286a66373df695c026bc5f0ef747b4e2aaf3bf"
    },
    {
      "bestand": "server/lib/publiekeApi/klantcrmVervolg.js",
      "bronref": "c6fd0ca1",
      "sha256": "71b9969c63781f56d3851d4aad0c0adb56e496a7d5bdc54b4e8d8b17a030c3b1"
    },
    {
      "bestand": "server/lib/publiekeApi/leesdelegatie.js",
      "bronref": "c6fd0ca1",
      "sha256": "5268d6730986ada602fda865cc7dd496ea782fe966679273bb0404d07867e970"
    },
    {
      "bestand": "server/lib/publiekeApi/schemaVoorStart.js",
      "bronref": "c6fd0ca1",
      "sha256": "c1548619c422470d23feacc6a8c5f1ec9161c90e8e6dba0b22673ae268a2e32c"
    },
    {
      "bestand": "server/migrations/359_rapportly_api_beleid_en_budget.sql",
      "bronref": "c6fd0ca1",
      "sha256": "00f320c5b21ac2e77e2628c2d1c0640a2bd5f871f78cf5d28583995a3ea22a65"
    },
    {
      "bestand": "server/migrations/370_rapportly_klantcrm_vervolg.sql",
      "bronref": "c6fd0ca1",
      "sha256": "2b3a02fba45e9797ae09358fad9379cff68dcabb58bc969b5e02617869b3d87f"
    },
    {
      "bestand": "server/lib/catalogusproducten/uitvoeringMatch.js",
      "bronref": "cd6dcaf4",
      "sha256": "7ac09ea8df2cdff34339e29b69587b3c88ffa25a73fdcaba6bebe8e39317aded"
    },
    {
      "bestand": "server/lib/offerteRoute.js",
      "bronref": "cd6dcaf4",
      "sha256": "c192ff1f30bca2240ec775d87150ee5806d1b635d50acb3853313d03f1d527bc"
    },
    {
      "bestand": "server/lib/publiekeApi/acties.js",
      "bronref": "cd6dcaf4",
      "sha256": "3658a7c8198cad9ba92791b9d73add55299997203454d71455f6f1c1dbd7cc9f"
    },
    {
      "bestand": "server/lib/publiekeApi/poorten.js",
      "bronref": "cd6dcaf4",
      "sha256": "9f870d6e6dfa82679d58456d3e3898051d066327b0edf819985625b498d86268"
    },
    {
      "bestand": "server/lib/publiekeApi/sleutelbeleid.js",
      "bronref": "cd6dcaf4",
      "sha256": "f2bcb9fbec1e8f667455d775ed58dc510e28fb75f669e94c117beb0668df01c2"
    },
    {
      "bestand": "server/lib/publiekeApi/workflowRunner.js",
      "bronref": "cd6dcaf4",
      "sha256": "fd71c1ce0f5589fc785c93b8ac1505245ec2e71e68e44f9117f94143db4eae1f"
    },
    {
      "bestand": "server/lib/rapportlyApiSleutel.js",
      "bronref": "cd6dcaf4",
      "sha256": "907034b9a9687a278caa4c6a3d2e558e2dccc1f7a7b8f921d7adfbb7ebaab448"
    },
    {
      "bestand": "server/lib/rapportlyOfferteInvoer.js",
      "bronref": "cd6dcaf4",
      "sha256": "40dbc6db3d5dc8100c7100c0e3ea008267d4273f3d6f316b426e3286e303eb10"
    },
    {
      "bestand": "server/lib/uitvoer/kSnapshot.js",
      "bronref": "cd6dcaf4",
      "sha256": "bb17f566ab39e02ab94de84466dc163718c8b1ea594fa196a4fc05f73c9885bb"
    },
    {
      "bestand": "server/lib/uitvoer/rapportOpslag.js",
      "bronref": "cd6dcaf4",
      "sha256": "88ece3d973b7d7691374cc91244b8c5c23c5051e5d55a46f7363eafb1d7e5dc5"
    },
    {
      "bestand": "server/lib/uitvoer/workflowOfferteBewijzen.js",
      "bronref": "cd6dcaf4",
      "sha256": "6b5d2aef20639c8af488087686224a6bde7e862714371b9a9082e5a4c193de42"
    },
    {
      "bestand": "server/lib/uitvoer/workflowOfferteInvoer.js",
      "bronref": "cd6dcaf4",
      "sha256": "14d53dc7d5cc9f383b43e97720e487770c1d5b2f1f06cf6c675f90d805ea0305"
    },
    {
      "bestand": "server/lib/uitvoer/workflowOfferteReceipt.js",
      "bronref": "cd6dcaf4",
      "sha256": "a7bb3af2795361d169e82de2c885be03992cbfd77578d363b9478617757e77d7"
    },
    {
      "bestand": "server/lib/uitvoer/workflowProductiekeuze.js",
      "bronref": "cd6dcaf4",
      "sha256": "7eadee13448e53ed3aa414c39bd2e216d0db94bb6b03f3fd238bb41210d7ec6e"
    },
    {
      "bestand": "server/lib/uitvoer/workflowRunnerContract.js",
      "bronref": "cd6dcaf4",
      "sha256": "8fb8f8688c388e923ae359dfa5fe2623aaa4f319a36e1d1bc11cd0238214ca50"
    },
    {
      "bestand": "server/lib/uitvoer/workflowRunnerDownload.js",
      "bronref": "cd6dcaf4",
      "sha256": "bd909805c8cede9fa37b2a7079863d3629e5d274ac62812bbbad0434fc272265"
    },
    {
      "bestand": "server/lib/uitvoer/workflowRunnerProducent.js",
      "bronref": "cd6dcaf4",
      "sha256": "102d2c0da8375acbc7fb3c36ba5686834fa74612a7394dcf0344ebbc7a151db7"
    },
    {
      "bestand": "server/lib/uitvoer/workflowRunnerRoutes.js",
      "bronref": "cd6dcaf4",
      "sha256": "2fbf003b69eb5cadb9020c64266976b7067a8140dafd4295568d3a27629120b4"
    },
    {
      "bestand": "server/lib/uitvoer/workflowRunnerService.js",
      "bronref": "cd6dcaf4",
      "sha256": "f48f65f7ae62feec48e7eb4af4001339c75c4bf54d1edf2103765bbdb2e7e99c"
    },
    {
      "bestand": "server/lib/uitvoer/workflowRunnerStore.js",
      "bronref": "cd6dcaf4",
      "sha256": "2007a849511c2b9381f60abee4212cfb6ecd1ee1bf236b212082cd64e850e8ae"
    },
    {
      "bestand": "server/migrations/371_rapportly_workflow_uitvoering.sql",
      "bronref": "cd6dcaf4",
      "sha256": "f349230daac6518f30a9f2471362b087954319d4ec1d9a708ba3ae37b7540505"
    },
    {
      "bestand": "server/index.js",
      "bronref": "cfe078af",
      "sha256": "73e37e56a9042b5b24fbc7f397c3a8ea999761424824339bad5df17d1805d1ba"
    },
    {
      "bestand": "server/jobs/adapters/uitvoerMutatieCredits.js",
      "bronref": "cfe078af",
      "sha256": "4cf8816cdf0f73031e90273e5242458bb3eed6c62363004ab323d583585e1fb1"
    },
    {
      "bestand": "server/jobs/adapters/uitvoeringPrivacy.js",
      "bronref": "cfe078af",
      "sha256": "b7fb0521f4c37d6604ebcf7276295f10c1e5cc3dfeafa5ea4b4f6ebd5fb76f3d"
    },
    {
      "bestand": "server/jobs/gesprekDocumentenJobs.js",
      "bronref": "cfe078af",
      "sha256": "d11cb7b14f46752cd42fcbe9b3c87e0093fd5e16411baa2b0a77994abfbcc876"
    },
    {
      "bestand": "server/jobs/handlers/gesprekDocumentenVoorbereiding.js",
      "bronref": "cfe078af",
      "sha256": "e28f300a6594610ea06a19481383b36fd5cbde329624b211f49286d314f74184"
    },
    {
      "bestand": "server/jobs/handlers/rapportHergenereren.js",
      "bronref": "cfe078af",
      "sha256": "2e27ba3d5b5b18cccc187e66698f74a254cef4278d81953d2da6954e5318ae59"
    },
    {
      "bestand": "server/jobs/startIdempotency.js",
      "bronref": "cfe078af",
      "sha256": "851204e0853f9799192a4e5dd42bd1a47f1c32419bd87ba83415176180a66960"
    },
    {
      "bestand": "server/jobs/tweedeUitvoertaal.js",
      "bronref": "cfe078af",
      "sha256": "c381bda4c7208cd1024ae24ff7969c932b919b6be33f3d070245e67333c10a4b"
    },
    {
      "bestand": "server/jobs/uitvoerMutatieContract.js",
      "bronref": "cfe078af",
      "sha256": "a524d99364b7f25c778a2e2cd421b7713a58d2bb4461b5eb556d5a160505ee03"
    },
    {
      "bestand": "server/lib/actiepuntMutaties.js",
      "bronref": "cfe078af",
      "sha256": "70c5c5a11dd5c9ba1c75e26df7338f075c5402c6fa9625c4b642abb27fe8af8f"
    },
    {
      "bestand": "server/lib/beeldbank/beeld.js",
      "bronref": "cfe078af",
      "sha256": "3af0036672d221a5488c9e577478c0cdca85ecadaf789b40321e555145e5b838"
    },
    {
      "bestand": "server/lib/beeldbank/repository.js",
      "bronref": "cfe078af",
      "sha256": "80e8552007f355ba4a29000522726b25fa83a8a806e2bdef2c41addbcd2e2e91"
    },
    {
      "bestand": "server/lib/beeldbank/routes.js",
      "bronref": "cfe078af",
      "sha256": "060a0914e51979711087420f27cf9a57a449004e9efb76ee8e1bbb9d5605828e"
    },
    {
      "bestand": "server/lib/bronstijl/contract.js",
      "bronref": "cfe078af",
      "sha256": "04b296a9602f7e0392a3d209b81aedeb82388fe7bf034ed69d2d333fd47d11e7"
    },
    {
      "bestand": "server/lib/bronstijl/identiteit.js",
      "bronref": "cfe078af",
      "sha256": "24d78830451be54c6eb8923a370f4c4f0d3c2d62924b1caafe4e98209b551de1"
    },
    {
      "bestand": "server/lib/documentBestandsnaam.js",
      "bronref": "cfe078af",
      "sha256": "a716557960153cff817f7d2e55845ba6d1e6708e54e6c7e159041ee2a1fe8424"
    },
    {
      "bestand": "server/lib/documentcontinuiteit/bewerken.js",
      "bronref": "cfe078af",
      "sha256": "386d263825c35b5a4e5e8f91391292f23015a5439e2dbad6792c1fed4cd2f228"
    },
    {
      "bestand": "server/lib/documentcontinuiteit/inhoud.js",
      "bronref": "cfe078af",
      "sha256": "68bf8ea50a921de1f6dfd0a90c4dd557cd5a390c5834fe62ead7e79b75b88f81"
    },
    {
      "bestand": "server/lib/documentcontinuiteit/leesbaarheid.js",
      "bronref": "cfe078af",
      "sha256": "370946e18e9157596e3ad611419573fd978b8289399771acf929e2eaec32e0a4"
    },
    {
      "bestand": "server/lib/documentcontinuiteit/merklogo.js",
      "bronref": "cfe078af",
      "sha256": "4af9e5873f5e2e652376742848e8909ebb92f01defc40c763331d2cd84adb700"
    },
    {
      "bestand": "server/lib/documentcontinuiteit/opmaak.js",
      "bronref": "cfe078af",
      "sha256": "81feb76ba2437cbb85921a5200bb2fcdcd8b421e27543264b0520ff7a2f4739e"
    },
    {
      "bestand": "server/lib/documentcontinuiteit/overzicht.js",
      "bronref": "cfe078af",
      "sha256": "beb08c15564d2b7b052c8a4baeca9955b7f57e013664fb0f91f11fe6cffe3cb1"
    },
    {
      "bestand": "server/lib/documentcontinuiteit/routes.js",
      "bronref": "cfe078af",
      "sha256": "faee6499c1007ee1e4fae5e1c991aca9a5fab2bc8ba4897518f7e20253bf1b57"
    },
    {
      "bestand": "server/lib/documentcontinuiteit/store.js",
      "bronref": "cfe078af",
      "sha256": "956d32ab2c6fa0f84492c341ca8c972187082920b13f59df7d2f7dbd75a803a5"
    },
    {
      "bestand": "server/lib/klantrechten.js",
      "bronref": "cfe078af",
      "sha256": "4e6abb78b214b93cf52458ae6cd69afbd6022516cbcaa68e13ecd71e7b8c0018"
    },
    {
      "bestand": "server/lib/lettertypeFamilies.js",
      "bronref": "cfe078af",
      "sha256": "2ee2802117ae07ff5c2ceb5ed04a52d217df7bcabdbb62a6ec59c99118ad3b49"
    },
    {
      "bestand": "server/lib/mail/klantreacties.js",
      "bronref": "cfe078af",
      "sha256": "c2ece609ebfaaea510ec19b571f88325705e054144ff07a6f4f490b85a13e3f0"
    },
    {
      "bestand": "server/lib/offertenummerIdempotentie.js",
      "bronref": "cfe078af",
      "sha256": "5f70772c9239fa379fcf1059271d8d4836aca60c70e7af9bc9fbb422509f95ea"
    },
    {
      "bestand": "server/lib/presentatieV1/contract.js",
      "bronref": "cfe078af",
      "sha256": "2916f407b4388d6830932c0688a73c09f4f148bdd4b6d04514d2e6825cd3ccb5"
    },
    {
      "bestand": "server/lib/presentatieV1/diaplan.js",
      "bronref": "cfe078af",
      "sha256": "a56e1c076795dd958b5a3fc674c0197fd9aa1b6a2419393f65d1a79f955bba72"
    },
    {
      "bestand": "server/lib/presentatieV1/identiteit.js",
      "bronref": "cfe078af",
      "sha256": "69dfbcf6c9256c355abba43e17280d827ca557f2f78307c42d915e1f9dc2993e"
    },
    {
      "bestand": "server/lib/profielBevindingen.js",
      "bronref": "cfe078af",
      "sha256": "c13487b257f7178d3dafce7ebae6119ccd3af3cd15d228af123bf25d9ecdfce5"
    },
    {
      "bestand": "server/lib/publiekeApi/acties.js",
      "bronref": "cfe078af",
      "sha256": "faa0813b343e2e6bcd434e67df8bbcaf8fed7b0c4152a2b424fa32688140da37"
    },
    {
      "bestand": "server/lib/publiekeApi/gesprekDocumenten.js",
      "bronref": "cfe078af",
      "sha256": "f6422a6021d0d72693905d7d1709ace70497ab93a6a877670964a07592926616"
    },
    {
      "bestand": "server/lib/publiekeApi/poorten.js",
      "bronref": "cfe078af",
      "sha256": "0f19c305115abdd754297dbd2126c5a76d3bf1ab5258a75966e0d492e6d9e946"
    },
    {
      "bestand": "server/lib/publiekeApi/registratie.js",
      "bronref": "cfe078af",
      "sha256": "5e7dd4775e5a6b7d9b8b477a9dd26cc47b4c516231222c3cad63e1e88b61ceac"
    },
    {
      "bestand": "server/lib/publiekeApi/taalvariantenSchrijven.js",
      "bronref": "cfe078af",
      "sha256": "0ec4ddb9945e08705c2be8ea9c25080cca1924d236c19a9b48306d9059579072"
    },
    {
      "bestand": "server/lib/publiekeApi/uitvoer.js",
      "bronref": "cfe078af",
      "sha256": "6543a9a95e733826ee7429802fbc31a9e6f6214db28327c89bc090828046208f"
    },
    {
      "bestand": "server/lib/publiekeApi/uitvoeringen.js",
      "bronref": "cfe078af",
      "sha256": "7345203b16d307dbdb80d7bf31f75a5d9c43be8331fbdb531106db16ecb797e5"
    },
    {
      "bestand": "server/lib/publiekeApi/workflowBroncontrole.js",
      "bronref": "cfe078af",
      "sha256": "1a6f9f56bb9d58a581e05ba446e45fdb5c6b7bd899cc4496774274c364299bf3"
    },
    {
      "bestand": "server/lib/rapportlyApiGeneratie.js",
      "bronref": "cfe078af",
      "sha256": "d8312c4a63def3022b0b95f8cc937bf824a7096288cbe1e473eb6645aa751c7d"
    },
    {
      "bestand": "server/lib/rapportlyApiSleutel.js",
      "bronref": "cfe078af",
      "sha256": "907034b9a9687a278caa4c6a3d2e558e2dccc1f7a7b8f921d7adfbb7ebaab448"
    },
    {
      "bestand": "server/lib/rapportlyClientVersie.js",
      "bronref": "cfe078af",
      "sha256": "472e7bf5ebeee4ae771fb18dbc5a36eb1237e4ef7c15756b06457e4ae0aa8f1f"
    },
    {
      "bestand": "server/lib/rapportlyOfferteInvoer.js",
      "bronref": "cfe078af",
      "sha256": "40dbc6db3d5dc8100c7100c0e3ea008267d4273f3d6f316b426e3286e303eb10"
    },
    {
      "bestand": "server/lib/rapportlyPrijs.js",
      "bronref": "cfe078af",
      "sha256": "fe82e9939c874fd1d075d8d9696ef9cbf03b5873be3d71851249ae584315d693"
    },
    {
      "bestand": "server/lib/rapportlyWorkflow/bronpoort.js",
      "bronref": "cfe078af",
      "sha256": "4020fb5172026bf178536d8f51927b90f0cbef9ccebe22a9f2c02edff38b7b05"
    },
    {
      "bestand": "server/lib/slimGenereren/beleid.js",
      "bronref": "cfe078af",
      "sha256": "8157926ec4ccd5a71dcbb8caec83fe1dd9cc795f7c1fd61200763f3a5017124e"
    },
    {
      "bestand": "server/lib/stijlenV2/routes.js",
      "bronref": "cfe078af",
      "sha256": "e2303df1fff194ed07af480a6f380202d02f5a4192b7aa1b23d125eca8a9d055"
    },
    {
      "bestand": "server/lib/stijllozeRapportuitvoering.js",
      "bronref": "cfe078af",
      "sha256": "402979b242637e9696f5a39cbb9d421153f7ba5acde1955fd120fee76f61e81c"
    },
    {
      "bestand": "server/lib/templateV2/contract.js",
      "bronref": "cfe078af",
      "sha256": "520caee1b6375c1fd88bff74dabdc1aed0354671d9d2df84705fcf2c8ed87a7c"
    },
    {
      "bestand": "server/lib/templateV2/formulierPlan.js",
      "bronref": "cfe078af",
      "sha256": "e02d7f4c76539e88b5b615374d1fc848d07ec31bfad28fe22f947ab7eddb2b2e"
    },
    {
      "bestand": "server/lib/templateV2/markdownCapabilities.js",
      "bronref": "cfe078af",
      "sha256": "7d6cb3c70dfa936a77fcf7a305daf6d57d32a1098d1a46202d9c9faa9323a3a7"
    },
    {
      "bestand": "server/lib/templateV2/veiligheid.js",
      "bronref": "cfe078af",
      "sha256": "85a290de196ed8c4d777199f5f024bfc1c9947b4123b33d75dbc6877128cd822"
    },
    {
      "bestand": "server/lib/tweedeUitvoertaal.js",
      "bronref": "cfe078af",
      "sha256": "4a3769205c25ce36a7824810f37745f4c6287e0af4737a44d9e792312c700315"
    },
    {
      "bestand": "server/lib/uitvoer/duurzameMutaties.js",
      "bronref": "cfe078af",
      "sha256": "d456152f7b4ac298998ab6094c7a6b5b9b1f3af200a4ce8a5767c22dd71c4ae5"
    },
    {
      "bestand": "server/lib/uitvoer/gesprekBijsturen.js",
      "bronref": "cfe078af",
      "sha256": "4a9642b350a2443af326192c37a59299dfa78342682d8f696fe3381c2948d663"
    },
    {
      "bestand": "server/lib/uitvoer/hergeneratie.js",
      "bronref": "cfe078af",
      "sha256": "36d3833dd499500d7c939efbf7da77f303ead8331435199fbc1875bf4e49cffa"
    },
    {
      "bestand": "server/lib/uitvoer/kSnapshot.js",
      "bronref": "cfe078af",
      "sha256": "bb17f566ab39e02ab94de84466dc163718c8b1ea594fa196a4fc05f73c9885bb"
    },
    {
      "bestand": "server/lib/uitvoer/productieAdapters/bronnen.js",
      "bronref": "cfe078af",
      "sha256": "9f8e14150c4fe1caf0e2561620e6401ee38d47713009811661e8627f70d16ea6"
    },
    {
      "bestand": "server/lib/uitvoer/productieAdapters/workflow.js",
      "bronref": "cfe078af",
      "sha256": "47c13b46ba9eb3470fa93e660538e2dfecf75889704956a14461c02e939fcad9"
    },
    {
      "bestand": "server/lib/uitvoer/productieIntegratie/catalogusSelectie.js",
      "bronref": "cfe078af",
      "sha256": "988fdb40f46446aeaa9c2749dec67fc36c091cdadcc06bc26d8c48f85095f668"
    },
    {
      "bestand": "server/lib/uitvoer/productieIntegratie/rapportIdentiteit.js",
      "bronref": "cfe078af",
      "sha256": "45f03a92b26522648ed0f8976cdd9a49723b1bffd30211372ffaf980625aac7d"
    },
    {
      "bestand": "server/lib/uitvoer/rapportOpslag.js",
      "bronref": "cfe078af",
      "sha256": "e2af42ab81af264ce0a8f16871f4cf5e06c7176c61e414f861f4507e7409ca46"
    },
    {
      "bestand": "server/lib/uitvoer/taalProductieContext.js",
      "bronref": "cfe078af",
      "sha256": "4bb601f2a98e1df1375f5818296508517a579e9ec4a555e6ee0820764631f481"
    },
    {
      "bestand": "server/lib/uitvoer/uitvoeringenRoutes.js",
      "bronref": "cfe078af",
      "sha256": "622f680a81fc857ae7d244613990e0d403bd72852b2db3037dbd634c393bb9c2"
    },
    {
      "bestand": "server/lib/uitvoer/uitvoeringenStore.js",
      "bronref": "cfe078af",
      "sha256": "b1d3868f8b2ddb80f4155e08f80020a5395b20136b83e12f9e667b9150b82f73"
    },
    {
      "bestand": "server/lib/uitvoer/voortgang.js",
      "bronref": "cfe078af",
      "sha256": "4046d12f7ed823859944d79adfcc59cbd53b33f4995cfe3eb781e9b450364b0e"
    },
    {
      "bestand": "server/lib/uitvoer/workflowBriefContract.js",
      "bronref": "cfe078af",
      "sha256": "7b926578c96041e2935efe826bbb15729500d7f8cb2363bef7c6b4f788890a45"
    },
    {
      "bestand": "server/lib/uitvoer/workflowProductiekeuze.js",
      "bronref": "cfe078af",
      "sha256": "19230b4ff7acc17ce05fd6014b978ff6ea35c200b2a3dc0c5ec890c2e609f194"
    },
    {
      "bestand": "server/lib/uitvoer/workflowRunnerProducent.js",
      "bronref": "cfe078af",
      "sha256": "669db215b27e47e311e49c6e6edf27227038d80d27a634ff3c8cc0545452a82b"
    },
    {
      "bestand": "server/lib/uitvoer/workflowRunnerRoutes.js",
      "bronref": "cfe078af",
      "sha256": "c760c8da4666425c4c07ea990f7d1c0e8a5cf558dd2612109ab0d745c11c4c5c"
    },
    {
      "bestand": "server/lib/uitvoer/workflowRunnerService.js",
      "bronref": "cfe078af",
      "sha256": "4e6ae49ee8517c8ea2b402a1cf9b3b717fd845b232d55da4dee5c0ab18d6ecbd"
    },
    {
      "bestand": "server/lib/uitvoer/workflowTaalContract.js",
      "bronref": "cfe078af",
      "sha256": "22a1710c1865b92780eae708b1e87a2a47f3c9f0d07b28f369888a17871a8f44"
    },
    {
      "bestand": "server/lib/uitvoer/workflowTaalService.js",
      "bronref": "cfe078af",
      "sha256": "5d7cc8f9f6f9dfe3ec525e8865bc01a2bfc3a71b43b98e9acf1c6c6feff4d5c9"
    },
    {
      "bestand": "server/lib/universele-documentarchetypen/index.js",
      "bronref": "cfe078af",
      "sha256": "51d34682e47e4befd49cc441a907d3cb7fa38c4b85e0ec3c20c77204f0f042f4"
    },
    {
      "bestand": "server/lib/universele-documentarchetypen/productieRenderer.js",
      "bronref": "cfe078af",
      "sha256": "11a0e61d8754e76a93d98a50203dc2c1918bbf93532bfc772d5c818d0b05df09"
    },
    {
      "bestand": "server/lib/universele-documentarchetypen/templateV2Adapter.js",
      "bronref": "cfe078af",
      "sha256": "8c1faf2ce6d2cff83ea5dfda9a8fd66547e0b000989579e787a028e25c7c455d"
    },
    {
      "bestand": "server/lib/universele-documentarchetypen/uitvoeringSelectie.js",
      "bronref": "cfe078af",
      "sha256": "439a443bc2bd975af3ca1d36a1f47aad1334c99fef8f191217cbc24c96618a95"
    },
    {
      "bestand": "server/lib/voorbeeldProfiel.js",
      "bronref": "cfe078af",
      "sha256": "abac60686db435328a474f8994a7a5c2f298bd771052d5b561d26ce1088e3663"
    },
    {
      "bestand": "server/lib/voorbeeldProfielBronnen.js",
      "bronref": "cfe078af",
      "sha256": "efc7d81ca08af0067342c152c592f1a3ac73674495eac020fcd8e910d4ac075a"
    },
    {
      "bestand": "server/lib/voorbeeldProfielSelectie.js",
      "bronref": "cfe078af",
      "sha256": "3cc1d613d4a9b6c0c11bb93a32f87d551162c66e79d7eea7c3d014eb39e402c6"
    },
    {
      "bestand": "server/migrations/169_rapportly_followup.sql",
      "bronref": "cfe078af",
      "sha256": "718773ac6b2a20ddd4bc89cff022015a09df1b269a58bc5e9b1429d9db5084df"
    },
    {
      "bestand": "server/migrations/196_rapportly_klantreacties.sql",
      "bronref": "cfe078af",
      "sha256": "1ba45140556a789dae37e6a4618912fd2908f2f21dfbfe807222b403226ec08c"
    },
    {
      "bestand": "server/migrations/202_rapportly_duurzame_uitvoermutaties.sql",
      "bronref": "cfe078af",
      "sha256": "1793184564bf1e9c12532afc6eac7171626ab1add54ef0b9dc3bc8f75fe2b6e8"
    },
    {
      "bestand": "server/migrations/262_rapportly_documentcontinuiteit.sql",
      "bronref": "cfe078af",
      "sha256": "9316b0ef99d5857531a4bacfc0ef45689382df3c5dd0f1cff2247e24f68b6b06"
    },
    {
      "bestand": "server/migrations/263_rapportly_documentherstel_overzicht.sql",
      "bronref": "cfe078af",
      "sha256": "73e377edc2762e4f76f86e817919fd09cbb946a6b9d63864244df57f2644079d"
    },
    {
      "bestand": "server/migrations/292_rapportly_beeldbank.sql",
      "bronref": "cfe078af",
      "sha256": "db814e75158246b86374afa79fe2b9a4e553a0d37dc996bb4833a6973d3cedc3"
    },
    {
      "bestand": "server/migrations/293_rapportly_beeldbank_deling.sql",
      "bronref": "cfe078af",
      "sha256": "e61e9f3f3aae4737a376a43f9e4d0f4a0e5b63a55bb1624414bd418adfef6859"
    },
    {
      "bestand": "server/migrations/294_rapportly_beeldbank_engines.sql",
      "bronref": "cfe078af",
      "sha256": "21bc3e6f9c22f286e094de6f47ba6ce71d14d7394f3226617db3d93b9386ea20"
    },
    {
      "bestand": "server/migrations/359_rapportly_api_beleid_en_budget.sql",
      "bronref": "cfe078af",
      "sha256": "81f5ac8c5d7927274e169ddf0e870b997d0c51e622bc6a90bea87270f9541804"
    },
    {
      "bestand": "server/migrations/360_rapportly_gesprekdocumenten_jobs.sql",
      "bronref": "cfe078af",
      "sha256": "747ebeaa5e2e09786d081329f9284c25497667cc94e1e54a32fe40f663e660a3"
    },
    {
      "bestand": "server/migrations/366_rapportly_rapportuitvoer_revisies.sql",
      "bronref": "cfe078af",
      "sha256": "d28771e94828d9ab28663efc38b1a2cf9be3f3fd8f2263b17c355e12fb7e0fd7"
    },
    {
      "bestand": "server/migrations/372_rapportly_workflow_uitvoering.sql",
      "bronref": "cfe078af",
      "sha256": "d45f7fcb4062bed6a28b0eefdf48fb6df121cc0aa54ab69867adffaef8e51bdd"
    },
    {
      "bestand": "server/rapportly_api.js",
      "bronref": "cfe078af",
      "sha256": "8a02d5c5a2103535d25fc81e40b4f54657de2a1125939df4dc56124b38db5217"
    },
    {
      "bestand": "server/rapportly_uitvoer_api.js",
      "bronref": "cfe078af",
      "sha256": "09b86f9109b1312ddb582edaf5de2dbc7e53a01efb5b7f94c1005b97b95e64cd"
    },
    {
      "bestand": "server/lib/klantcrmVervolgLezen.js",
      "bronref": "d964db8c",
      "sha256": "a14f29a9c6925826e8ee3aa59eb20b9d9a34a3d780428ff979f3e0d80641f724"
    },
    {
      "bestand": "server/lib/klantcrmVervolgMutaties.js",
      "bronref": "d964db8c",
      "sha256": "9ab1274f6448b565618cb1768f431b8f59cc12381b1e626889f6c348520cbabb"
    },
    {
      "bestand": "server/lib/publiekeApi/domeinen.js",
      "bronref": "d964db8c",
      "sha256": "c9509529dfdd478e5dcfa0911a286a66373df695c026bc5f0ef747b4e2aaf3bf"
    },
    {
      "bestand": "server/lib/publiekeApi/klantcrmVervolg.js",
      "bronref": "d964db8c",
      "sha256": "71b9969c63781f56d3851d4aad0c0adb56e496a7d5bdc54b4e8d8b17a030c3b1"
    },
    {
      "bestand": "server/lib/publiekeApi/leesdelegatie.js",
      "bronref": "d964db8c",
      "sha256": "5268d6730986ada602fda865cc7dd496ea782fe966679273bb0404d07867e970"
    },
    {
      "bestand": "server/lib/publiekeApi/poorten.js",
      "bronref": "d964db8c",
      "sha256": "0f19c305115abdd754297dbd2126c5a76d3bf1ab5258a75966e0d492e6d9e946"
    },
    {
      "bestand": "server/lib/rapportlyPrivacy/crmPrivacy.js",
      "bronref": "d964db8c",
      "sha256": "e05df9ee6e21193627b9c52d3cb5141e200568d9aab1386aacf249309f737e87"
    },
    {
      "bestand": "server/migrations/359_rapportly_api_beleid_en_budget.sql",
      "bronref": "d964db8c",
      "sha256": "0559232a89b5d28109e1a3a35d5988f5d29acf1289796b07eabc32003e408df9"
    },
    {
      "bestand": "server/migrations/370_rapportly_klantcrm_vervolg.sql",
      "bronref": "d964db8c",
      "sha256": "2b3a02fba45e9797ae09358fad9379cff68dcabb58bc969b5e02617869b3d87f"
    },
    {
      "bestand": "server/migrations/375_rapportly_crm_privacy_vervolg.sql",
      "bronref": "d964db8c",
      "sha256": "aefc40020f7f2a17412dfda235a0cd6c6932ff37268a44e1aba193abff01ef38"
    },
    {
      "bestand": "server/lib/publiekeApi/poorten.js",
      "bronref": "b7742838",
      "sha256": "de08f32159a7e228830a0c205df041b6186c6f86b7b806c479e146a6790201b5"
    }
  ],
  "x-proefperiode": {
    "bron": [
      "server/lib/publiekeApi/poorten.js",
      "server/lib/tenant.js"
    ],
    "schrijven": "Na verlopen proefperiode vereist nieuw werk actieve betaalde toegang; HTTP402 rapportly_proefperiode_verlopen. Onleesbare bron503 rapportly_proefperiodecontrole_onbeschikbaar.",
    "bronref": "b7742838",
    "uitzonderingen": [
      "GET en als lezen geregistreerde POSTs (raming/voorbeeld)",
      "zelfservice.aanvragen",
      "verbindingen.ontkoppelen",
      "webhooks.intrekken",
      "portaal.intrekken",
      "portaal.vrijgave_intrekken",
      "workflowrun.pauzeren",
      "workflowrun.annuleren",
      "mail.herstellen uitsluitend stoppen/als_verzonden",
      "mailconcept.stoppen; selectieve bron c141e025",
      "workflowrun.taalpauzeren; selectieve bron cfe078af",
      "workflowrun.taalannuleren; selectieve bron cfe078af"
    ],
    "grens": "Overige verwijderingen/wijzigingen zijn geen algemene uitzondering. Andere sleutel-, actor-, object-, pakket- en featurepoorten blijven gelden."
  },
  "webhooks": {
    "rapportlyMelding": {
      "post": {
        "operationId": "ontvang_rapportly_webhook",
        "summary": "Ontvang op het eigen HTTPS-adres een ondertekende technische melding",
        "description": "Dit is een inkomend verzoek aan de eigen ontvanger, geen Rapportly API-route. mail.onzeker wordt minimaal twee minuten uitgesteld en hercontroleert de huidige poging vóór HTTP. mail.geaccepteerd betekent provideracceptatie; mail.afgeleverd vereist ondertekend Resend email.delivered-bewijs dat bij de eigen Resendproviderbinding hoort. Gmail/M365 en handmatig bevestigen leveren geen afleverclaim. Events kunnen dubbel en buiten volgorde aankomen; lees actuele status opnieuw. Bron3897cbd9, nog niet getest of gepubliceerd.",
        "security": [],
        "parameters": [
          {
            "name": "X-Rapportly-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "verwerking.gereed",
                "verwerking.mislukt",
                "mail.geaccepteerd",
                "mail.onzeker",
                "mail.mislukt",
                "mail.afgeleverd"
              ]
            }
          },
          {
            "name": "X-Rapportly-Event-Id",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-8][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
            }
          },
          {
            "name": "X-Rapportly-Timestamp",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[1-9][0-9]{0,11}$"
            }
          },
          {
            "name": "X-Rapportly-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^v1=[a-f0-9]{64}$"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookMelding"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Duurzaam ontvangen of reeds verwerkt; geen tweede vervolgtaak."
          },
          "202": {
            "description": "Event-id en vervolgtaak duurzaam in dezelfde transactie opgeslagen."
          },
          "204": {
            "description": "Duurzaam ontvangen, zonder antwoordbody."
          },
          "401": {
            "description": "Handtekening, tijdvenster of getypeerde envelop geweigerd."
          }
        },
        "x-bronref": "3897cbd9",
        "x-bronnen": [
          "server/lib/publiekeApi/webhooks.js",
          "server/migrations/359_rapportly_api_beleid_en_budget.sql",
          "server/ingest/resend_events.js",
          "server/lib/publiekeApi/webhookTransport.js"
        ],
        "x-max-raw-body-bytes": 32768,
        "x-schema-status": "uitgewerkt-broncontract",
        "x-open-schema": []
      }
    }
  }
}
