{"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":"Admin API","description":"Betriebsendpunkte: Voll-Export und Bulk-Import der Datensätze (implementiert), sowie Re-Validierung, Purge, Reconciliation, Merge, Issues und Audit (im Walking Skeleton als 501-Stub). Import prüft pro Satz die Contract-Regeln."}],"paths":{"/admin/audit/export":{"get":{"summary":"Audit-Log-Export (Stub)","description":"Im Referenz-Datendienst noch nicht implementiert (Walking-Skeleton-Stub).","tags":["Admin API"],"responses":{"501":{"description":"Nicht implementiert."}}}},"/admin/entities/merge":{"post":{"summary":"Entity-Merge (Stub)","description":"Im Referenz-Datendienst noch nicht implementiert (Walking-Skeleton-Stub).","tags":["Admin API"],"responses":{"501":{"description":"Nicht implementiert."}}}},"/admin/entities/{boid}":{"delete":{"summary":"Anlassbezogene Löschung (Stub)","description":"Im Referenz-Datendienst noch nicht implementiert (Walking-Skeleton-Stub).","tags":["Admin API"],"parameters":[{"name":"boid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"501":{"description":"Nicht implementiert."}}}},"/admin/export":{"get":{"summary":"Vollständiger Export der Datensätze","description":"Liefert alle Datensätze als {records:[…]}; jeder Satz ist ein Export-Envelope (boid/version/status/erstelltAm/createdAt/data). createdAt trägt die stabile Erstanlage, damit ein Restore meta.created erhält. Mit includeHistory=true auch abgelöste Versionen. Das Ergebnis-Array eignet sich direkt als Body für POST /admin/import.","tags":["Admin API"],"parameters":[{"description":"Auch abgelöste (superseded) Versionen exportieren","name":"includeHistory","in":"query","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Export-Dokument {records:[…]}.","content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/admin/import":{"post":{"summary":"Import von Datensätzen (bare JSON-Array; Verstöße pro Satz nach RFC 9457 begründet)","description":"Importiert ein nacktes Array von Export-Envelopes. Pflichtfelder je Satz: boid, version, status, erstelltAm, data; optional createdAt (stabile Erstanlage — fehlt es, wird erstelltAm verwendet, Alt-Export-Kompatibilität). Jeder Satz wird gegen Envelope-Struktur, das aktuelle Schema und die Contract-Regeln geprüft. **Partielle Annahme (#83):** gültige Sätze werden importiert, verworfene tragen pro Satz eine RFC-9457-Begründung (status 400 = ungültiger Envelope, 422 = Schema-/Fachregel-Verstoß) mit violations[] und 0-basiertem index. Antwort: {imported, rejected:[{index, status, title, violations}]}. Ein malformter Request-Body (kein JSON-Array) liefert 400 problem+json. **Modus (#86):** mode=validate (Default) prüft Schema + Regeln; mode=restore umgeht die inhaltliche Validierung (nur Envelope-Strukturprüfung) für verbatim-Restore (Exit-Strategie / Disaster-Recovery, damit ein alter Export auch nach Contract-Verschärfung zurückspielbar bleibt). AuthZ: Import ist maintain-pflichtig (@RequiresAccess MAINTAIN, beide Modi); eine spätere Verschärfung von mode=restore auf die admin-Stufe ist ein möglicher Folgeschritt. Hinweis: boid wird wie geliefert gespeichert (keine Neuberechnung).","tags":["Admin API"],"parameters":[{"description":"Import-Modus: validate (Default, prüft Schema + Regeln) oder restore (verbatim, nur Envelope-Struktur).","schema":{"default":"validate","enum":["validate","restore"]},"name":"mode","in":"query"}],"requestBody":{"description":"Array von Export-Envelopes.","content":{"application/json":{"examples":{"import":{"value":[{"boid":"11111111-1111-1111-1111-111111111111","version":1,"status":"active","erstelltAm":"2026-05-28T10:00:00Z","createdAt":"2026-05-28T10:00:00Z","data":{"bezeichnung":"Tollwut","kategorie":"meldepflichtig","meldepflichtig":true,"erfasstAm":"2026-05-28T10:00:00"}}]}},"schema":{"type":"array","items":{"type":"object","additionalProperties":{}}}}},"required":true},"responses":{"200":{"description":"Import-Ergebnis {imported, rejected:[{index, status, title, violations}]}. Verworfene Sätze (ungültiger Envelope 400, Schema-/Fachregel-Verstoß 422) stehen mit Begründung in rejected[].","content":{"application/json":{"schema":{}}}},"400":{"description":"Request-Body ist kein wohlgeformtes JSON-Array oder mode ist unbekannt.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/admin/integrations/export":{"get":{"summary":"Integrations-Export (Stub)","description":"Im Referenz-Datendienst noch nicht implementiert (Walking-Skeleton-Stub).","tags":["Admin API"],"responses":{"501":{"description":"Nicht implementiert."}}}},"/admin/issues":{"get":{"summary":"Offene Notification-Issues (Stub)","description":"Im Referenz-Datendienst noch nicht implementiert (Walking-Skeleton-Stub).","tags":["Admin API"],"responses":{"501":{"description":"Nicht implementiert."}}}},"/admin/issues/{id}":{"get":{"summary":"Einzel-Issue (Stub)","description":"Im Referenz-Datendienst noch nicht implementiert (Walking-Skeleton-Stub).","tags":["Admin API"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"501":{"description":"Nicht implementiert."}}}},"/admin/issues/{id}/acknowledge":{"post":{"summary":"Issue bestätigen (Stub)","description":"Im Referenz-Datendienst noch nicht implementiert (Walking-Skeleton-Stub).","tags":["Admin API"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"501":{"description":"Nicht implementiert."}}}},"/admin/mandanten/{mandantId}":{"delete":{"summary":"Mandanten-Schema vernichten (Stub)","description":"Im Referenz-Datendienst noch nicht implementiert (Walking-Skeleton-Stub).","tags":["Admin API"],"parameters":[{"name":"mandantId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"501":{"description":"Nicht implementiert."}}}},"/admin/purge":{"post":{"summary":"Purge-Job (Stub)","description":"Im Referenz-Datendienst noch nicht implementiert (Walking-Skeleton-Stub).","tags":["Admin API"],"responses":{"501":{"description":"Nicht implementiert."}}}},"/admin/purge/{jobId}":{"get":{"summary":"Purge-Status (Stub)","description":"Im Referenz-Datendienst noch nicht implementiert (Walking-Skeleton-Stub).","tags":["Admin API"],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"501":{"description":"Nicht implementiert."}}}},"/admin/reconcile":{"post":{"summary":"Reconciliation-Job (Stub)","description":"Im Referenz-Datendienst noch nicht implementiert (Walking-Skeleton-Stub).","tags":["Admin API"],"responses":{"501":{"description":"Nicht implementiert."}}}},"/admin/reconcile/{jobId}":{"get":{"summary":"Reconciliation-Status (Stub)","description":"Im Referenz-Datendienst noch nicht implementiert (Walking-Skeleton-Stub).","tags":["Admin API"],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"501":{"description":"Nicht implementiert."}}}},"/admin/revalidate":{"post":{"summary":"Re-Validierungs-Job (Stub)","description":"Im Referenz-Datendienst noch nicht implementiert (Walking-Skeleton-Stub).","tags":["Admin API"],"responses":{"501":{"description":"Nicht implementiert.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/admin/revalidate/{jobId}":{"get":{"summary":"Re-Validierungs-Status (Stub)","description":"Im Referenz-Datendienst noch nicht implementiert (Walking-Skeleton-Stub).","tags":["Admin API"],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"501":{"description":"Nicht implementiert."}}}}},"info":{"title":"Unternehmer","version":"1.0.0","description":"Referenzimplementierung eines DP-Blueprint-Datendienstes. Walking Skeleton: implementierter Slice + 501-Stubs."}}