{"openapi":"3.1.0","components":{"schemas":{"ApiDocs":{"type":"object","properties":{"entity":{"type":"string"},"spec":{"type":"string"},"admin":{"type":"string"}}},"AtomicLong":{"type":"object","properties":{"value":{"type":"integer","format":"int64"},"andIncrement":{"type":"integer","format":"int64"},"andDecrement":{"type":"integer","format":"int64"},"plain":{"type":"integer","format":"int64"},"opaque":{"type":"integer","format":"int64"},"acquire":{"type":"integer","format":"int64"},"release":{"type":"integer","format":"int64"}}},"Charset":{"type":"object","properties":{"name":{"type":"string"},"aliases":{"type":"array","items":{"type":"string"}},"aliasSet":{"type":"array","uniqueItems":true,"items":{"type":"string"}},"registered":{"type":"boolean"}}},"EngineImpl":{"type":"object","properties":{"sectionHelperFactories":{"type":"object","additionalProperties":{"type":"object","properties":{"defaultAliases":{"type":"array","items":{"type":"string"}},"parameters":{"$ref":"#/components/schemas/ParametersInfo"},"blockLabels":{"type":"array","items":{"type":"string"}}}}},"sectionHelperFunc":{"$ref":"#/components/schemas/FunctionStringSectionHelperFactoryObject"},"valueResolvers":{"type":"array","items":{"$ref":"#/components/schemas/ValueResolver"}},"namespaceResolvers":{"type":"array","items":{"$ref":"#/components/schemas/NamespaceResolver"}},"evaluator":{"$ref":"#/components/schemas/Evaluator"},"templates":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/Template"}},"locators":{"type":"array","items":{"$ref":"#/components/schemas/TemplateLocator"}},"resultMappers":{"type":"array","items":{"$ref":"#/components/schemas/ResultMapper"}},"idGenerator":{"$ref":"#/components/schemas/AtomicLong"},"parserHooks":{"type":"array","items":{"$ref":"#/components/schemas/ParserHook"}},"initializers":{"type":"array","items":{"$ref":"#/components/schemas/Initializer"}},"removeStandaloneLines":{"type":"boolean"},"timeout":{"type":"integer","format":"int64"},"useAsyncTimeout":{"type":"boolean"},"traceManager":{"$ref":"#/components/schemas/TraceManagerImpl"},"parserConfigurator":{"$ref":"#/components/schemas/ParserConfigurator"},"templateInstanceInitializers":{"type":"array","items":{"$ref":"#/components/schemas/Initializer"}}}},"Entity":{"type":"object","properties":{"resource":{"type":"string"},"entityApiPath":{"type":"string"},"identifier":{"type":"string"},"keyFields":{"type":"array","items":{"type":"string"}},"fields":{"type":"array","items":{"$ref":"#/components/schemas/Field"}}}},"Evaluator":{"type":"object"},"Expression":{"type":"object","properties":{"namespace":{"type":"string"},"parts":{"type":"array","items":{"$ref":"#/components/schemas/Part"}},"literal":{"type":"boolean"},"literalValue":{},"origin":{"$ref":"#/components/schemas/Origin"},"generatedId":{"type":"integer","format":"int32"}}},"Field":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string"},"required":{"type":"boolean"},"allowedValues":{"type":"array","items":{"type":"string"}}}},"FunctionStringSectionHelperFactoryObject":{"type":"object"},"Initializer":{"type":"object"},"Links":{"type":"object","properties":{"contractYaml":{"type":"string"},"contractJson":{"type":"string"},"productYaml":{"type":"string"},"productJson":{"type":"string"},"entityApi":{"type":"string"},"swaggerUi":{"type":"string"},"openapi":{"type":"string"},"apiDocs":{"$ref":"#/components/schemas/ApiDocs"},"health":{"type":"string"}}},"Locale":{"type":"object","properties":{"language":{"type":"string"},"script":{"type":"string"},"country":{"type":"string"},"variant":{"type":"string"},"extensionKeys":{"type":"array","uniqueItems":true,"items":{"type":"string","format":"char"}},"unicodeLocaleAttributes":{"type":"array","uniqueItems":true,"items":{"type":"string"}},"unicodeLocaleKeys":{"type":"array","uniqueItems":true,"items":{"type":"string"}},"ISO3Language":{"type":"string"},"ISO3Country":{"type":"string"},"displayLanguage":{"type":"string"},"displayScript":{"type":"string"},"displayCountry":{"type":"string"},"displayVariant":{"type":"string"},"displayName":{"type":"string"}}},"NamespaceResolver":{"type":"object","properties":{"priority":{"type":"integer","format":"int32"},"namespace":{"type":"string"}}},"Origin":{"type":"object","properties":{"line":{"type":"integer","format":"int32"},"lineCharacterStart":{"type":"integer","format":"int32"},"lineCharacterEnd":{"type":"integer","format":"int32"},"templateId":{"type":"string"},"templateGeneratedId":{"type":"string"},"variant":{"anyOf":[{"$ref":"#/components/schemas/Variant"},{"type":"null"}]},"sourceUri":{"type":["string","null"],"format":"uri"},"synthetic":{"type":"boolean"}}},"Parameter":{"type":"object","properties":{"name":{"type":"string"},"defaultValue":{"type":"string"},"optional":{"type":"boolean"},"valuePredicate":{"$ref":"#/components/schemas/PredicateString"}}},"ParameterDeclaration":{"type":"object","properties":{"typeInfo":{"type":"string"},"key":{"type":"string"},"defaultValue":{"$ref":"#/components/schemas/Expression"},"origin":{"$ref":"#/components/schemas/Origin"}}},"ParametersInfo":{"type":"array","items":{"type":"array","items":{"$ref":"#/components/schemas/Parameter"}}},"ParserConfigurator":{"type":"object"},"ParserHook":{"type":"object"},"Part":{"type":"object","properties":{"name":{"type":"string"},"typeInfo":{"type":"string"},"virtualMethod":{"type":"boolean"}}},"PredicateString":{"type":"object"},"ProblemDetails":{"description":"Fehlerobjekt nach RFC 9457 (application/problem+json). Bei Validierungsfehlern (400/422) trägt das Feld violations die Einzelverstöße.","type":"object","properties":{"type":{"type":"string","description":"Kategorie-URI des Fehlertyps (RFC 9457); \"about:blank\" wenn nicht kategorisiert. Feature-spezifische URIs werden feature-seitig dokumentiert.","examples":["about:blank"]},"title":{"type":"string","description":"Kurzer, menschenlesbarer Titel des Fehlers.","examples":["Validierung fehlgeschlagen"]},"status":{"type":"integer","format":"int32","description":"HTTP-Statuscode des Fehlers.","examples":[422]},"detail":{"type":"string","description":"Erläuterung dieses konkreten Vorkommens.","examples":["Der Datensatz verletzt im Contract deklarierte Regeln"]},"violations":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"Einzelverstöße. Entity-Schemafehler tragen den Schlüssel field, Fachregel-Verstöße den Schlüssel rule, Dokument-Schemaverstöße (ODCS/ODPS gegen JSON-Schema) den Schlüssel path, jeweils mit message.","examples":[[{"rule":"meldepflicht-konsistenz","message":"Bei kategorie=meldepflichtig muss meldepflichtig=true sein"}]]}}},"ResultMapper":{"type":"object","properties":{"priority":{"type":"integer","format":"int32"}}},"SectionBlock":{"type":"object","properties":{"origin":{"$ref":"#/components/schemas/Origin"},"id":{"type":"string"},"label":{"type":"string"},"parameters":{"type":"object","additionalProperties":{"type":"string"}},"expressions":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/Expression"}},"nodes":{"type":"array","items":{"$ref":"#/components/schemas/TemplateNode"}},"positionalParameters":{"type":"array","items":{"type":"string"}},"empty":{"type":"boolean"},"paramDeclarations":{"type":"array","items":{"$ref":"#/components/schemas/ParameterDeclaration"}}}},"SectionHelper":{"type":"object"},"SectionNode":{"type":"object","properties":{"constant":{"type":"boolean"},"section":{"type":"boolean"},"text":{"type":"boolean"},"expression":{"type":"boolean"},"name":{"type":"string"},"blocks":{"type":"array","items":{"$ref":"#/components/schemas/SectionBlock"}},"helper":{"$ref":"#/components/schemas/SectionHelper"},"origin":{"$ref":"#/components/schemas/Origin"},"traceLevel":{"type":"boolean"},"engine":{"$ref":"#/components/schemas/EngineImpl"},"expressions":{"type":"array","items":{"$ref":"#/components/schemas/Expression"}},"parameterDeclarations":{"type":"array","items":{"$ref":"#/components/schemas/ParameterDeclaration"}}}},"ServiceIndex":{"type":"object","properties":{"service":{"type":"string"},"title":{"type":"string"},"version":{"type":"string"},"entity":{"$ref":"#/components/schemas/Entity"},"links":{"$ref":"#/components/schemas/Links"}}},"Template":{"type":"object","properties":{"expressions":{"type":"array","items":{"$ref":"#/components/schemas/Expression"}},"generatedId":{"type":"string"},"id":{"type":"string"},"variant":{"anyOf":[{"$ref":"#/components/schemas/Variant"},{"type":"null"}]},"parameterDeclarations":{"type":"array","items":{"$ref":"#/components/schemas/ParameterDeclaration"}},"fragmentIds":{"type":"array","uniqueItems":true,"items":{"type":"string"}},"fragment":{"type":"boolean"},"nodes":{"type":"array","items":{"$ref":"#/components/schemas/TemplateNode"}},"rootNode":{"$ref":"#/components/schemas/SectionNode"},"source":{"type":["string","null"],"format":"uri"}}},"TemplateInstance":{"type":"object","properties":{"timeout":{"type":"integer","format":"int64"},"template":{"$ref":"#/components/schemas/Template"}}},"TemplateLocator":{"type":"object","properties":{"priority":{"type":"integer","format":"int32"}}},"TemplateNode":{"type":"object","properties":{"expressions":{"type":"array","items":{"$ref":"#/components/schemas/Expression"}},"parameterDeclarations":{"type":"array","items":{"$ref":"#/components/schemas/ParameterDeclaration"}},"origin":{"$ref":"#/components/schemas/Origin"},"constant":{"type":"boolean"},"section":{"type":"boolean"},"text":{"type":"boolean"},"expression":{"type":"boolean"}}},"TraceListener":{"type":"object"},"TraceManagerImpl":{"type":"object","properties":{"listeners":{"type":"array","items":{"$ref":"#/components/schemas/TraceListener"}}}},"ValueResolver":{"type":"object","properties":{"priority":{"type":"integer","format":"int32"},"supportedProperties":{"type":"array","uniqueItems":true,"items":{"type":"string"}},"supportedMethods":{"type":"array","uniqueItems":true,"items":{"type":"string"}}}},"Variant":{"type":"object","properties":{"locale":{"$ref":"#/components/schemas/Locale"},"contentType":{"type":"string"},"encoding":{"$ref":"#/components/schemas/Charset"},"hashCode":{"type":"integer","format":"int32"},"mediaType":{"type":"string"},"charset":{"$ref":"#/components/schemas/Charset"}}}},"securitySchemes":{"SecurityScheme":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Authentication"}}},"tags":[{"name":"Entity API","description":"Lesen und Schreiben der Fachdatensätze. Repräsentation als JSON:API (Default) oder Flat-JSON (Accept: application/json). Struktur und Validierung kommen generisch aus dem ODCS-Contract; Schreibzugriffe prüfen Schema und Fachregeln (parsebar, aber regelwidrig → 422). Schreiben ist append-only versioniert."}],"paths":{"/krise":{"get":{"summary":"Collection der aktiven Datensätze (filter-/sortier-/paginierbar)","description":"Liefert die aktiven Datensätze. JSON:API-Dokument ({data:[…], meta:{total,page}}) oder Flat-JSON-Array (Accept: application/json). Query: filter[feld]([gt|lt|gte|lte]), sort (-=absteigend), page[number]/page[size] (max 100), fields[type] (Sparse Fieldsets). Filter-/Sortier-/fields-Felder müssen Contract-Felder oder meta.(status|version|created) sein.Hinweis: meta.total/page liefert nur die JSON:API-Repräsentation; Flat-JSON ist ein reines Array ohne Paginierungs-Metadaten.","tags":["Entity API"],"responses":{"200":{"description":"Gefilterte/sortierte/paginierte Liste (JSON:API oder Flat-JSON).","content":{"application/vnd.api+json":{},"application/json":{"schema":{}}}},"400":{"description":"Ungültiger Query-Parameter (unbekanntes Feld, unzulässiger Bereichsoperator).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Unbekannter Contract-Slug.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"post":{"summary":"Datensatz anlegen (Neuanlage, Version 1)","description":"Legt einen neuen Datensatz als Version 1 an. Die BOID wird serverseitig deterministisch aus dem Fachschlüssel-Set (primaryKey-Felder) abgeleitet — kein boid im Body. Existiert die abgeleitete BOID schon, ist es ein Konflikt (409); für eine neue Version PUT auf die BOID nutzen.","tags":["Entity API"],"requestBody":{"description":"Fachdaten gemäß ODCS-Schema (ohne boid).","content":{"application/json":{"examples":{"gueltig":{"value":{"bezeichnung":"Schweinepest","kategorie":"meldepflichtig","meldepflichtig":true,"erfasstAm":"2026-05-28T10:00:00"}}},"schema":{"type":"object","additionalProperties":{}}}},"required":true},"responses":{"201":{"description":"Datensatz angelegt; Repräsentation der Version 1."},"409":{"description":"Datensatz mit dieser BOID existiert bereits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"422":{"description":"Schemaverletzung (Pflichtfeld/Typ/Enum) oder Fachregel-Verstoß (quality.rules[], JMESPath); Quelle in violations[]: field = Schema, rule = Fachregel.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"400":{"description":"Bad Request"}}}},"/krise/{id}":{"put":{"summary":"Neue Version eines Datensatzes (Komplettersatz, append-only)","description":"Ersetzt den Datensatz vollständig und legt eine neue Version an; vorige Versionen bleiben als Historie erhalten (append-only). {id} muss eine BOID (UUID) sein. Optimistic Locking: If-Match mit dem aktuellen ETag (Version) ist Pflicht — erst GET/HEAD für den ETag, dann PUT. Veraltete Version → 412, fehlender Header → 428.","tags":["Entity API"],"parameters":[{"description":"BOID (UUID) des zu ersetzenden Datensatzes","name":"id","in":"path","required":true,"schema":{"type":"string"}},{"description":"Aktueller ETag (Version) des Datensatzes, z. B. \"3\". Pflicht: erst GET/HEAD für den ETag, dann PUT mit diesem If-Match.","in":"header","name":"If-Match","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"Vollständige Fachdaten der neuen Version gemäß ODCS-Schema.","content":{"application/json":{"examples":{"gueltig":{"value":{"bezeichnung":"Schweinepest","kategorie":"meldepflichtig","meldepflichtig":true,"erfasstAm":"2026-05-28T10:00:00"}}},"schema":{"type":"object","additionalProperties":{}}}},"required":true},"responses":{"200":{"description":"Neue Version angelegt; deren Repräsentation.","content":{"application/vnd.api+json":{},"application/json":{"schema":{}}}},"400":{"description":"Ungültiger If-Match-Header (malformt, schwach oder Wildcard).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Kein Datensatz zu dieser BOID.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"412":{"description":"If-Match-Version ist nicht die aktuelle (Optimistic Locking).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"428":{"description":"If-Match-Header fehlt (Vorbedingung erforderlich).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"422":{"description":"Schemaverletzung (Pflichtfeld/Typ/Enum) oder Fachregel-Verstoß (quality.rules[], JMESPath); Quelle in violations[]: field = Schema, rule = Fachregel.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"head":{"summary":"Existenz-/Aktivitätsprüfung (200 aktiv, 410 abgelöst, 404 unbekannt) per BOID-UUID oder Identitäts-URN","description":"Prüft ohne Body, ob ein Datensatz existiert und ob er aktiv oder bereits abgelöst ist.","tags":["Entity API"],"parameters":[{"description":"BOID (UUID) oder fachliche Identitäts-URN","name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Datensatz existiert und ist aktiv.","content":{"application/json":{"schema":{}}}},"410":{"description":"Datensatz existiert, ist aber abgelöst (superseded)."},"404":{"description":"Kein Datensatz zu dieser BOID/URN bzw. unbekannter Slug."}}},"get":{"summary":"Aktuelle Version eines Datensatzes (per BOID-UUID oder Identitäts-URN)","description":"Liefert die aktuelle Version eines Datensatzes. Das {id}-Segment ist entweder die BOID (UUID) oder eine fachliche Identitäts-URN, die mandantenstrippend per UUIDv5 in die BOID umgerechnet wird.","tags":["Entity API"],"parameters":[{"description":"BOID (UUID) oder fachliche Identitäts-URN","example":"Schweinepest","name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Aktuelle Version des Datensatzes.","content":{"application/vnd.api+json":{},"application/json":{"schema":{}}}},"404":{"description":"Kein Datensatz zu dieser BOID/URN bzw. unbekannter Slug.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/krise/{id}/versions":{"get":{"summary":"Alle Versionen eines Datensatzes","description":"Liefert die vollständige Versionshistorie eines Datensatzes (aktive + abgelöste).","tags":["Entity API"],"parameters":[{"description":"BOID (UUID) des Datensatzes","name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Liste aller Versionen.","content":{"application/vnd.api+json":{},"application/json":{"schema":{}}}},"404":{"description":"Kein Datensatz zu dieser BOID.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/krise/{id}/versions/{n}":{"get":{"summary":"Bestimmte Version eines Datensatzes","description":"Liefert eine konkrete Version eines Datensatzes per 1-basierter Versionsnummer.","tags":["Entity API"],"parameters":[{"description":"BOID (UUID) des Datensatzes","name":"id","in":"path","required":true,"schema":{"type":"string"}},{"description":"1-basierte Versionsnummer","example":1,"name":"n","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Die angeforderte Version des Datensatzes.","content":{"application/vnd.api+json":{},"application/json":{"schema":{}}}},"404":{"description":"Kein Datensatz zu dieser BOID oder keine solche Version.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}}},"info":{"title":"Krise (Tierseuchenkrise)","version":"1.0.0","description":"Referenzimplementierung eines DP-Blueprint-Datendienstes. Walking Skeleton: implementierter Slice + 501-Stubs."}}