{"openapi":"3.1.0","info":{"title":"IFFLAND DIREKT – Agent & Webshop API","summary":"Maschinenlesbare B2B-Bestell-, Kalkulations-, Preflight- und Auftragsstatus-Schnittstelle für Wahlplakate (DIN A1/A0), FoldUp-Displays, A-Aufsteller, Hartschaumplatten, SK-Folien, Aluverbundplatten, Kartonwabenplatten, PP-Wabenkammerplatten und PP-Hohlkammerplatten der IFFLAND GmbH.","description":"\n## Überblick & Nordstern (KI-Agenten-Tür)\n\nWillkommen an der offiziellen API-Schnittstelle von **IFFLAND DIREKT** (IFFLAND GmbH, Gelnhausen – *The Printing People*).\nÜber diese Spezifikation können KI-Agenten (**Claude, ChatGPT, Gemini, Voice-Agents, MCP-Clients**) sowie berechtigte Kunden-Integrationen:\n\n1. **Katalog, Staffelpreise, Versandkosten & Stanzvorlagen abfragen** (`Katalog & Preise`)\n2. **Druckdaten (PDF) vorab prüfen (Preflight: DPI & Stanzkontur / 10 Bohrlöcher)** (`Druckdaten, Preflight & Freigabe`)\n3. **Verbindliche Bestellungen (inkl. Mehr-Motiv- & Mehr-Adressen-Verteilplan) nach ausdrücklicher Kundenfreigabe auslösen** (`Bestellung & Auftragsstatus`)\n4. **Auftragsstatus, Vorausrechnung (PDF), Bestellbestätigung (PDF) und IWS-ERP-Ticket abrufen** (`Bestellung & Auftragsstatus`)\n5. **Kundenkonten, Adressbücher und kundenspezifische Konditionen verwalten** (`Kundenkonto & Authentifizierung`)\n\n---\n\n## Verbindliche Geschäfts- & Sicherheitsregeln (Scope gem. Schritt 1)\n\n* **Zwei Agententypen:**\n  * **(A) Kunden-Agent:** Authentifiziert über delegiertes Kunden-Session-Token (`Bearer` / `X-Customer-Token`). Sieht eigene gespeicherte Adressen, Bestellhistorie und ggf. vereinbarte Zahlungsarten.\n  * **(B) Öffentlicher Assistent / Gast-Agent:** Sieht offizielle Listen- und Staffelpreise. Bestellt im Gast-/Vorkasse-Modus mit vollständiger Rechnungs- und Identitätsangabe.\n* **Bestell- & Zahlungsmodell:**\n  * Jede Bestellung über `POST /api/wahlplakate/order` ist **verbindlich** und erfordert eine gültige Auftraggeber-/Rechnungsadresse, E-Mail-Adresse, Telefonnummer sowie die Bestätigung des B2B-Widerrufsausschlusses (`widerruf_accepted: true`).\n  * Standard-Zahlungsart für Gast- und Agenten-Bestellungen ist **Vorkasse per Banküberweisung (`payment_method: \"vorkasse\"`)**. Nach Bestelleingang wird sofort eine **Vorausrechnung (`VR-{order_no}`)** mit IBAN/BIC bereitgestellt.\n  * **Produktions-Gate:** Die gewählte Produktions- und Lieferzeit (`lt_tier`: `10` Standard 10 Werktage, `5` Schnell 5 Werktage, `3-4` Priority 3–4 Werktage oder `2-3` Express 2–3 Werktage Mo–Fr) startet bei Vorkasse erst nach serverseitig bestätigtem Zahlungseingang (`payment_received: true`).\n* **Tagging von Agenten-Bestellungen:**\n  * Agenten setzen bei Bestellungen `order_channel: \"agent\"` sowie das Objekt `agent_meta` (z. B. `agent_name`, `agent_id`, `consent_confirmed: true`), damit agent-originierte Aufträge im System getrennt gezählt und ausgewertet werden.\n* **Strikt untersagt (Serverseitig erzwungen):**\n  * Kein anonymes Bestellen (Pflichtfeld- & Adressprüfung).\n  * Keine Zahlungskartendaten im Klartext.\n  * Kein Zugriff auf fremde Aufträge oder Kundendaten ohne gültiges zweckgebundenes Token (`upload` / `approval` / `customer`).\n  * Keine Preis- oder Konditionsmanipulation durch den Client (Preise werden ausschließlich serverseitig berechnet; ein mitgesendetes `payment_received: true` oder `order_no` wird ignoriert).\n","version":"1.0.0"},"paths":{"/api/wahlplakate/catalog":{"get":{"summary":"Versionierten Komplettkatalog (14 Produkte / 9 Kategorien) + Staffel-/m²-Preise + Preislogik in einem Call abrufen (Schritt 6)","description":"Stabile, versionierte Datenquelle (`schema_version: 1.0.0`) für KI-Agenten und MCP-Server anstelle von HTML-Scraping. Liefert alle 14 Produkte in 9 Kategorien (`A1`, `A0`, `FOLDUP_65`, `FOLDUP_85`, `FOLDUP_100`, `AUFSTELLER_A1`, `AUFSTELLER_A3`, `AUFSTELLER_QUER`, `HARTSCHAUM`, `SK_FOLIE`, `ALUVERBUND`, `KARTONWABE`, `PP_WABE`, `PP_HOHLKAMMER`) samt technischen Vorgaben, Konfigurationsoptionen, Live-Staffel- und Quadratmeterpreisen, Prospektspender-Aufschlägen, Lieferzeit-Optionen (`lt_tiers`), Versandregeln und der exakten Kalkulationsformel in einem einzigen Call.","operationId":"get_machine_readable_catalog","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optionale Filterung nach Produktkategorie ('wahlplakate', 'foldup', 'aufsteller', 'hartschaum', 'aluverbund', 'sk_folie', 'kartonwabe', 'pp_wabe' oder 'pp_hohlkammer'). Ohne Angabe werden alle Kategorien zurückgegeben.","title":"Category"},"description":"Optionale Filterung nach Produktkategorie ('wahlplakate', 'foldup', 'aufsteller', 'hartschaum', 'aluverbund', 'sk_folie', 'kartonwabe', 'pp_wabe' oder 'pp_hohlkammer'). Ohne Angabe werden alle Kategorien zurückgegeben."}],"responses":{"200":{"description":"Erfolgreiche Antwort.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogResponse"}}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Katalog & Preise"]}},"/api/wahlplakate/pricing":{"get":{"summary":"Staffelpreise, Maß-Kalkulator & Versandkosten abrufen","description":"Liefert die aktuellen Netto-Staffelpreise für Wahlplakate (`A1`, `A0`), FoldUp-Displays (`FOLDUP_65`, `FOLDUP_85`, `FOLDUP_100`), A-Aufsteller (`AUFSTELLER_A1`, `AUFSTELLER_A3`, `AUFSTELLER_QUER`) sowie die m²-Staffeln für Hartschaumplatten (`HARTSCHAUM`), Selbstklebefolien (`SK_FOLIE`), Aluverbundplatten (`ALUVERBUND`), Kartonwabenplatten (`KARTONWABE`), PP-Wabenkammerplatten (`PP_WABE`) und PP-Hohlkammerplatten (`PP_HOHLKAMMER`).\n\n**Einzelpreis- & Maß-Kalkulation:** Werden die Query-Parameter `format` und `qty` übergeben (z. B. `?format=A1&qty=200` oder `?format=HARTSCHAUM&qty=10&width_mm=594&height_mm=841&staerke_mm=3`), berechnet der Endpunkt direkt den exakten Netto-Stückpreis (`unit_price`) für diese Konfiguration.","operationId":"get_pricing_catalog","parameters":[{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"description":"Optionaler Produktformat-Filter für gezielte Einzelpreis-Abfrage (`A1`, `A0`, `FOLDUP_65`, `FOLDUP_85`, `FOLDUP_100`, `AUFSTELLER_A1`, `AUFSTELLER_A3`, `AUFSTELLER_QUER`, `HARTSCHAUM`, `SK_FOLIE`, `ALUVERBUND`, `KARTONWABE`, `PP_WABE`, `PP_HOHLKAMMER`)."},{"name":"qty","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Qty"},"description":"Optionale Gesamtstückzahl (`>= 1`) zur direkten Berechnung des Staffel-Stückpreises (`unit_price`) in Verbindung mit `format`."},{"name":"orient","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Orient"},"description":"Optionale Ausrichtung (`hoch`, `quer`) bzw. FoldUp-Ausstattungsvariante (`basis`, `a6`, `a5`, `vk`, `a6_vk`, `a5_vk`, `a6_a6`, `a5_a5`)."},{"name":"motifs","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Optional: Anzahl der Druckmotive (Standard: 1). Ab dem 2. Motiv für A1/A0 +20,00 € netto.","title":"Motifs"},"description":"Optional: Anzahl der Druckmotive (Standard: 1). Ab dem 2. Motiv für A1/A0 +20,00 € netto."},{"name":"addresses","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Optional: Anzahl der Lieferadressen (Standard: 1). Ohne split-Parameter wird die Menge gleichmäßig aufgeteilt.","title":"Addresses"},"description":"Optional: Anzahl der Lieferadressen (Standard: 1). Ohne split-Parameter wird die Menge gleichmäßig aufgeteilt."},{"name":"split","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional: Kommagetrennte Mengenverteilung je Lieferadresse (z. B. '34,33,33' oder '51,48,1').","title":"Split"},"description":"Optional: Kommagetrennte Mengenverteilung je Lieferadresse (z. B. '34,33,33' oder '51,48,1')."},{"name":"lt_tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional: Produktionszeit-Stufe in Werktagen Mo–Fr ('10' Standard 0%, '5' Schnell +20%, '3-4' Priority +30%, '2-3' Express +100%).","title":"Lt Tier"},"description":"Optional: Produktionszeit-Stufe in Werktagen Mo–Fr ('10' Standard 0%, '5' Schnell +20%, '3-4' Priority +30%, '2-3' Express +100%)."},{"name":"width_mm","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Width Mm"},"description":"Optional bei `HARTSCHAUM`, `SK_FOLIE`, `ALUVERBUND`, `KARTONWABE`, `PP_WABE`, `PP_HOHLKAMMER`: Wunschbreite in mm (z. B. `594`)."},{"name":"height_mm","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Height Mm"},"description":"Optional bei `HARTSCHAUM`, `SK_FOLIE`, `ALUVERBUND`, `KARTONWABE`, `PP_WABE`, `PP_HOHLKAMMER`: Wunschhöhe in mm (z. B. `841`)."},{"name":"staerke_mm","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Staerke Mm"},"description":"Optional bei `HARTSCHAUM` (2, 3, 5, 10 mm), `ALUVERBUND` (2, 3 mm), `KARTONWABE` (10, 16 mm), `PP_WABE` (3.3 mm) oder `PP_HOHLKAMMER` (3 mm): Materialstärke in mm."},{"name":"farbe","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Farbe"},"description":"Optional bei `SK_FOLIE` (`weiss`, `transparent`) bzw. `KARTONWABE` (`weiss_kraft`)."},{"name":"kleber","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kleber"},"description":"Optional bei `SK_FOLIE`: Klebertyp (`abloesbar` oder `permanent`)."},{"name":"einsatz","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Einsatz"},"description":"Optional bei `SK_FOLIE`: Einsatzbereich (`innen` oder `aussen`)."},{"name":"druckseiten","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Druckseiten"},"description":"Optional bei KALK-Produkten: Druckseiten (`4/0` einseitig, `4/4` beidseitig, `0/0` unbedruckt)."},{"name":"zuschnitt","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zuschnitt"},"description":"Optional bei KALK-Produkten: Zuschnitt-Variante (`rechteck`, `rechteck_gerundet`, `konturschnitt`)."},{"name":"laminierung","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Laminierung"},"description":"Optional bei `SK_FOLIE`: Schutzlaminat (`ohne`, `matt`, `glaenzend`)."},{"name":"bohrungen","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bohrungen"},"description":"Optional bei Plattenprodukten (`HARTSCHAUM`, `ALUVERBUND`, `KARTONWABE`, `PP_WABE`, `PP_HOHLKAMMER`): Bohrungen (`ohne`, `4_ecken`, `6_bohrungen`, `10_loch`, `individuell`)."}],"responses":{"200":{"description":"Erfolgreiche Antwort.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingResponse"}}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate-Limit überschritten (Schutz gegen Spam und Scraping; siehe Header `Retry-After` in Sekunden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Katalog & Preise"]}},"/api/wahlplakate/quote":{"get":{"summary":"Öffentliche Mehr-Motiv- & Mehr-Adressen-Preiskalkulation (Read-Only Quote)","description":"Öffentlicher Read-Only Kalkulator (ohne API-Key) für Einzel- und Mehr-Motiv-/Mehr-Adressen-Konfigurationen (z. B. `?format=A1&qty=100&motifs=2&addresses=3` oder `&split=51,48,1`). Liefert `quote_id`, `is_binding_order: false`, `motifs_breakdown`, `deliveries_breakdown`, Netto, MwSt. und Brutto.","operationId":"get_public_quote","parameters":[{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"description":"Optionaler Produktformat-Filter für gezielte Einzelpreis-Abfrage (`A1`, `A0`, `FOLDUP_65`, `FOLDUP_85`, `FOLDUP_100`, `AUFSTELLER_A1`, `AUFSTELLER_A3`, `AUFSTELLER_QUER`, `HARTSCHAUM`, `SK_FOLIE`, `ALUVERBUND`, `KARTONWABE`, `PP_WABE`, `PP_HOHLKAMMER`)."},{"name":"qty","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Qty"},"description":"Optionale Gesamtstückzahl (`>= 1`) zur direkten Berechnung des Staffel-Stückpreises (`unit_price`) in Verbindung mit `format`."},{"name":"orient","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Orient"},"description":"Optionale Ausrichtung (`hoch`, `quer`) bzw. FoldUp-Ausstattungsvariante (`basis`, `a6`, `a5`, `vk`, `a6_vk`, `a5_vk`, `a6_a6`, `a5_a5`)."},{"name":"motifs","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Optional: Anzahl der Druckmotive (Standard: 1). Ab dem 2. Motiv für A1/A0 +20,00 € netto.","title":"Motifs"},"description":"Optional: Anzahl der Druckmotive (Standard: 1). Ab dem 2. Motiv für A1/A0 +20,00 € netto."},{"name":"addresses","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Optional: Anzahl der Lieferadressen (Standard: 1). Ohne split-Parameter wird die Menge gleichmäßig aufgeteilt.","title":"Addresses"},"description":"Optional: Anzahl der Lieferadressen (Standard: 1). Ohne split-Parameter wird die Menge gleichmäßig aufgeteilt."},{"name":"split","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional: Kommagetrennte Mengenverteilung je Lieferadresse (z. B. '34,33,33' oder '51,48,1').","title":"Split"},"description":"Optional: Kommagetrennte Mengenverteilung je Lieferadresse (z. B. '34,33,33' oder '51,48,1')."},{"name":"lt_tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional: Produktionszeit-Stufe in Werktagen Mo–Fr ('10' Standard 0%, '5' Schnell +20%, '3-4' Priority +30%, '2-3' Express +100%).","title":"Lt Tier"},"description":"Optional: Produktionszeit-Stufe in Werktagen Mo–Fr ('10' Standard 0%, '5' Schnell +20%, '3-4' Priority +30%, '2-3' Express +100%)."},{"name":"width_mm","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Width Mm"},"description":"Optional bei `HARTSCHAUM`, `SK_FOLIE`, `ALUVERBUND`, `KARTONWABE`, `PP_WABE`, `PP_HOHLKAMMER`: Wunschbreite in mm (z. B. `594`)."},{"name":"height_mm","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Height Mm"},"description":"Optional bei `HARTSCHAUM`, `SK_FOLIE`, `ALUVERBUND`, `KARTONWABE`, `PP_WABE`, `PP_HOHLKAMMER`: Wunschhöhe in mm (z. B. `841`)."},{"name":"staerke_mm","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Staerke Mm"},"description":"Optional bei `HARTSCHAUM` (2, 3, 5, 10 mm), `ALUVERBUND` (2, 3 mm), `KARTONWABE` (10, 16 mm), `PP_WABE` (3.3 mm) oder `PP_HOHLKAMMER` (3 mm): Materialstärke in mm."},{"name":"farbe","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Farbe"},"description":"Optional bei `SK_FOLIE` (`weiss`, `transparent`) bzw. `KARTONWABE` (`weiss_kraft`)."},{"name":"kleber","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kleber"},"description":"Optional bei `SK_FOLIE`: Klebertyp (`abloesbar` oder `permanent`)."},{"name":"einsatz","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Einsatz"},"description":"Optional bei `SK_FOLIE`: Einsatzbereich (`innen` oder `aussen`)."},{"name":"druckseiten","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Druckseiten"},"description":"Optional bei KALK-Produkten: Druckseiten (`4/0` einseitig, `4/4` beidseitig, `0/0` unbedruckt)."},{"name":"zuschnitt","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zuschnitt"},"description":"Optional bei KALK-Produkten: Zuschnitt-Variante (`rechteck`, `rechteck_gerundet`, `konturschnitt`)."},{"name":"laminierung","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Laminierung"},"description":"Optional bei `SK_FOLIE`: Schutzlaminat (`ohne`, `matt`, `glaenzend`)."},{"name":"bohrungen","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bohrungen"},"description":"Optional bei Plattenprodukten (`HARTSCHAUM`, `ALUVERBUND`, `KARTONWABE`, `PP_WABE`, `PP_HOHLKAMMER`): Bohrungen (`ohne`, `4_ecken`, `6_bohrungen`, `10_loch`, `individuell`)."}],"responses":{"200":{"description":"Erfolgreiche Antwort.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingResponse"}}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate-Limit überschritten (Schutz gegen Spam und Scraping; siehe Header `Retry-After` in Sekunden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Katalog & Preise"]},"post":{"summary":"Verbindliche Warenkorb-Kalkulation mit Motiven & Lieferaufteilung ohne Bestellauslösung","description":"Berechnet aus `format`, `total_quantity`, `motifs: [{\"id\": \"motiv_1\", \"quantity\": 60}, ...]` und `deliveries: [{\"address_id\": \"a1\", \"quantity\": 34}, ...]` (oder `split`) den exakten Gesamtpreis inkl. Staffel-Pooling (`poster_a1_pool` / `poster_a0_pool`), Motivwechselpauschale (`+25,00 €` netto ab 2. Motiv) und je Lieferadresse berechneter Versandart (DHL Paket ≤50 Stk. A1 vs. Spedition >50 Stk.). Erzeugt keine Bestellung (`is_binding_order: false`).","operationId":"calculate_public_quote","responses":{"200":{"description":"Erfolgreiche Antwort.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingResponse"}}}},"429":{"description":"Rate-Limit überschritten (Schutz gegen Spam und Scraping; siehe Header `Retry-After` in Sekunden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Katalog & Preise"]}},"/api/wahlplakate/agent-sandbox/verify":{"get":{"summary":"Öffentlicher Read-Only End-to-End Selbsttest (MCP JSON-RPC + 3-Phasen-Checkout + Datenkonsistenz)","description":"Führt einen gefahrlosen, nicht-persistierten Live-Selbsttest des MCP-Servers (`initialize`, `tools/list`, `preise_berechnen`, Write-Guard `401 AUTH_REQUIRED`), des 3-Phasen-Checkouts (`Quote -> Dry-Run Draft -> Confirm-Guards`) und der kanalübergreifenden Produktdatenkonsistenz (`Ø 5,0 mm`, `14` Produkte, `0` undefinierte Security-Schemas) aus.","operationId":"verify_agent_sandbox_end_to_end","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"tags":["KI-Agenten & MCP"]}},"/api/wahlplakate/stanzen":{"get":{"summary":"Alle 1:1-Stanzvorlagen & Standskizzen auflisten","description":"Listet alle offiziellen 1:1-Stanzvorlagen und Datenblätter (Wahlplakate DIN A1/A0 mit 10-Loch-Bohrbild, FoldUp-Displays inkl. Dispenser-Varianten sowie A-Aufsteller) mit Endformat-, Beschnitt- und Download-Angaben auf.","operationId":"list_die_templates","responses":{"200":{"description":"Erfolgreiche Antwort.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StanzenListResponse"}}}}},"tags":["Katalog & Preise"]}},"/api/wahlplakate/stanzen/{filename}":{"get":{"summary":"Einzelne Stanzvorlage als PDF herunterladen","description":"Lädt eine einzelne offizielle 1:1-Stanzvorlage (z. B. `WPA1_Stanze_Bohrung.pdf`) als PDF herunter.","operationId":"download_die_template_pdf","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"},"description":"Dateiname der offiziellen PDF-Stanzvorlage (z. B. `WPA1_Stanze_Bohrung.pdf` oder `WPA0_Stanze_Bohrung.pdf`)."},{"name":"inline","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Inline"},"description":"Steuert den Content-Disposition-Header (`0` = Datei-Download `attachment`, `1` = Direktanzeige `inline` im Browser)."}],"responses":{"200":{"description":"PDF-Datei der Stanzvorlage (`application/pdf`).","content":{"application/pdf":{}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Angeforderte Stanzvorlage existiert nicht.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Katalog & Preise"]}},"/api/wahlplakate/stanzen-alle.zip":{"get":{"summary":"Stanzvorlagen-Paket einer Produktgruppe als ZIP herunterladen","description":"Lädt alle Stanzvorlagen der gewählten Produktgruppe (`group`: `wahlplakate`, `foldup`, `aufsteller` oder `all`) gesammelt als ZIP-Archiv herunter.","operationId":"download_all_die_templates_zip","parameters":[{"name":"group","in":"query","required":false,"schema":{"type":"string","default":"wahlplakate","title":"Group"},"description":"Produktgruppe für das Stanzvorlagen-ZIP-Paket (`wahlplakate`, `foldup`, `aufsteller` oder `all`)."}],"responses":{"200":{"description":"ZIP-Archiv mit allen PDF-Stanzvorlagen (`application/zip`).","content":{"application/zip":{}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Ungültiger `group`-Parameter (erlaubt: `wahlplakate`, `foldup`, `aufsteller`, `all`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Katalog & Preise"]}},"/api/wahlplakate/agent-order/draft":{"post":{"summary":"Phase 1: Unverbindlichen Agenten-Bestell-Entwurf (Quote/Draft) erstellen (Schritt 11)","description":"Erstellt einen unverbindlichen, serverseitig kalkulierten Bestell-Entwurf (`draft_id`) für KI-Agenten (erfordert Scope `bestellung:entwurf`). Prüft Rechnungs-/Lieferadressen und Kontaktdaten, berechnet den verbindlichen Endpreis und liefert `draft_id`, `quote_hash` sowie `consent_summary_text` zur ausdrücklichen Freigabe durch den Kunden. Löst noch KEINE verbindliche Bestellung aus.","operationId":"create_agent_order_draft","parameters":[{"name":"mode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional: 'sandbox' für kostenlosen, zustandsbehafteten Agenten-Sandbox-Modus ohne API-Key.","title":"Mode"},"description":"Optional: 'sandbox' für kostenlosen, zustandsbehafteten Agenten-Sandbox-Modus ohne API-Key."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpBestellungEntwurfInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Ungültige Anfrage oder fehlende geschäftliche Pflichtangaben (z. B. fehlende Rechnungsadresse, ungültiges Format, unzulässiger Query-Token).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Fehlender oder ungültiger Agenten-API-Key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Fehlender Scope `bestellung:entwurf`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Bestellung & Auftragsstatus","Agenten-Zugang & Auth"],"security":[{"AgentScopedApiKey":[]},{"CustomerBearerToken":[]}]}},"/api/wahlplakate/agent-order/confirm":{"post":{"summary":"Phase 2: Bestell-Entwurf mit Zustimmungs-Nachweis & Idempotenz-Schlüssel verbindlich bestätigen (Schritt 11)","description":"Wandelt einen Bestell-Entwurf (`draft_id`) aus Phase 1 in eine verbindliche Bestellung auf Rechnung/Vorkasse um (erfordert Scope `bestellung:bestaetigen`). Erzwingt `confirmed_by_user: true`, exakte Preis-Übereinstimmung (`confirmed_gross_total`), einen belegbaren Zustimmungs-Nachweis (`consent_statement`) sowie einen `idempotency_key` gegen Doppel-Sends und versendet automatisch die Bestätigungs-E-Mail an die Rechnungsadresse.","operationId":"confirm_agent_order_draft","parameters":[{"name":"mode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional: 'sandbox' zum Simulieren einer Testbestätigung eines Sandbox-Entwurfs (`drf_sbx_...`).","title":"Mode"},"description":"Optional: 'sandbox' zum Simulieren einer Testbestätigung eines Sandbox-Entwurfs (`drf_sbx_...`)."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpBestellungBestaetigenInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Ungültige Anfrage oder fehlende geschäftliche Pflichtangaben (z. B. fehlende Rechnungsadresse, ungültiges Format, unzulässiger Query-Token).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Fehlender oder ungültiger Agenten-API-Key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Fehlender Scope `bestellung:bestaetigen` oder fremder Entwurf.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Entwurf (`draft_id`) nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotenz-Konflikt oder Entwurf bereits mit anderem Schlüssel bestätigt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Bestellung & Auftragsstatus","Agenten-Zugang & Auth"],"security":[{"AgentScopedApiKey":[]},{"CustomerBearerToken":[]}]}},"/api/wahlplakate/order":{"post":{"summary":"Verbindliche Bestellung anlegen (nach Kundenfreigabe)","description":"Legt einen verbindlichen Druckauftrag (Einzel- oder Sammelauftrag mit Verteilplan) an.\n\n**Pflichtvoraussetzungen:**\n- Gültige `email` und `phone` des Auftraggebers.\n- `widerruf_accepted: true` (Bestätigung der Sonderanfertigung nach Kundenspezifikation).\n- Mindestens eine vollständige Auftraggeber-/Rechnungsadresse (`auftraggeber: true`) mit Name, Straße, PLZ und Ort.\n- Mindestens ein Motiv in `motifs` mit positiver Stückzahl (`qty >= 1`) und zugeordneter Lieferadresse.\n- Bei Agenten-Bestellungen: `order_channel: \"agent\"` und `agent_meta.consent_confirmed: true`.\n\n**Rückgabe:** Serverseitig vergebene `order_no`, Bankverbindung für Vorkasse sowie ein `upload_token` (256-Bit) für den Abruf von Vorausrechnung, Bestellbestätigung und für den Druckdaten-Upload.","operationId":"create_order","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderCreateRequest"}}}},"responses":{"200":{"description":"Erfolgreiche Antwort.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderCreateResponse"}}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Ungültige Anfrage oder fehlende geschäftliche Pflichtangaben (z. B. fehlende Rechnungsadresse, ungültiges Format, unzulässiger Query-Token).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Konflikt bei der Auftragsanlage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate-Limit überschritten (Schutz gegen Spam und Scraping; siehe Header `Retry-After` in Sekunden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Bestellung & Auftragsstatus"]}},"/api/wahlplakate/order/{order_no}":{"get":{"summary":"Auftragsstatus, Positionen & Summen abrufen","description":"Liefert den aktuellen kaufmännischen Status, Zahlungsstatus (`payment_received`), Lieferzeit-Status (`lt_clock_running`, `lt_overall`), Druckdaten-Status (`artwork_status`), Produktionsstatus sowie alle Motive und berechneten Gesamtsummen (`totals`).\n\n**Authentifizierung:** Erfordert das auftragsgebundene `upload_token` oder `approval_token` (per Header `X-Order-Token`, `Authorization: Bearer <token>` oder Query `?token=...`).","operationId":"get_order_status","security":[{"OrderTokenHeader":[]},{"CustomerBearerToken":[]},{"OrderTokenQuery":[]}],"parameters":[{"name":"order_no","in":"path","required":true,"schema":{"type":"string","title":"Order No"},"description":"Eindeutige Auftragsnummer des EasyOrder-Auftrags (z. B. `49450`)."},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"},"description":"Zweckgebundenes Auftrags-Token (`upload_token` oder `approval_token`) bzw. temporäres Preflight-Token bei `/temp-proof/{token}.jpg`."}],"responses":{"200":{"description":"Erfolgreiche Antwort.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderStatusResponse"}}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Zugriff verweigert: Gültiges Auftrags-Token erforderlich.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Auftrag nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Bestellung & Auftragsstatus"]}},"/api/wahlplakate/order/{order_no}/vorausrechnung.pdf":{"get":{"summary":"Vorausrechnung (Vorkasse) als DIN-5008-PDF abrufen","description":"Erzeugt und liefert die offizielle Vorausrechnung (`VR-{order_no}`) nach IFFLAND-Standard (DIN 5008) inklusive IBAN/BIC, Verwendungszweck, Netto-/MwSt.-/Bruttobetrag und Hinweis zum Lieferzeit-Start.","operationId":"download_proforma_invoice_pdf","security":[{"OrderTokenHeader":[]},{"CustomerBearerToken":[]},{"OrderTokenQuery":[]}],"parameters":[{"name":"order_no","in":"path","required":true,"schema":{"type":"string","title":"Order No"},"description":"Eindeutige Auftragsnummer des EasyOrder-Auftrags (z. B. `49450`)."},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"},"description":"Zweckgebundenes Auftrags-Token (`upload_token` oder `approval_token`) bzw. temporäres Preflight-Token bei `/temp-proof/{token}.jpg`."}],"responses":{"200":{"description":"Vorausrechnung als PDF (`application/pdf`).","content":{"application/pdf":{}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Zugriff verweigert: Gültiges Auftrags-Token erforderlich.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Auftrag nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Bestellung & Auftragsstatus"]}},"/api/wahlplakate/order/{order_no}/bestellbestaetigung.pdf":{"get":{"summary":"Kaufmännische Bestellbestätigung als DIN-5008-PDF abrufen","description":"Liefert die kaufmännische Bestellbestätigung inkl. Positionsübersicht, Verteilplan und Teilrechnungs-Aufteilung als PDF.","operationId":"download_order_confirmation_pdf","security":[{"OrderTokenHeader":[]},{"CustomerBearerToken":[]},{"OrderTokenQuery":[]}],"parameters":[{"name":"order_no","in":"path","required":true,"schema":{"type":"string","title":"Order No"},"description":"Eindeutige Auftragsnummer des EasyOrder-Auftrags (z. B. `49450`)."},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"},"description":"Zweckgebundenes Auftrags-Token (`upload_token` oder `approval_token`) bzw. temporäres Preflight-Token bei `/temp-proof/{token}.jpg`."}],"responses":{"200":{"description":"Bestellbestätigung als PDF (`application/pdf`).","content":{"application/pdf":{}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Zugriff verweigert: Gültiges Auftrags-Token erforderlich.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Auftrag nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Bestellung & Auftragsstatus"]}},"/api/wahlplakate/order/{order_no}/pdf":{"get":{"summary":"Bestellübersicht als PDF abrufen (Kurzpfad)","description":"Kurzpfad-Alias für `/api/wahlplakate/order/{order_no}/bestellbestaetigung.pdf`.","operationId":"download_order_summary_pdf","security":[{"OrderTokenHeader":[]},{"CustomerBearerToken":[]},{"OrderTokenQuery":[]}],"parameters":[{"name":"order_no","in":"path","required":true,"schema":{"type":"string","title":"Order No"},"description":"Eindeutige Auftragsnummer des EasyOrder-Auftrags (z. B. `49450`)."},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"},"description":"Zweckgebundenes Auftrags-Token (`upload_token` oder `approval_token`) bzw. temporäres Preflight-Token bei `/temp-proof/{token}.jpg`."}],"responses":{"200":{"description":"Bestellbestätigung als PDF (`application/pdf`).","content":{"application/pdf":{}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Zugriff verweigert.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Auftrag nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Bestellung & Auftragsstatus"]}},"/api/wahlplakate/order/{order_no}/auftragsbestaetigung.pdf":{"get":{"summary":"Verbindliche Auftragsbestätigung (AB) mit Liefertermin als PDF abrufen","description":"Liefert die offizielle Auftragsbestätigung (`AB-{order_no}`) inklusive bestätigtem Liefertermin (`LT Versand abgehend`) als PDF.","operationId":"download_official_ab_pdf","security":[{"OrderTokenHeader":[]},{"CustomerBearerToken":[]},{"OrderTokenQuery":[]}],"parameters":[{"name":"order_no","in":"path","required":true,"schema":{"type":"string","title":"Order No"},"description":"Eindeutige Auftragsnummer des EasyOrder-Auftrags (z. B. `49450`)."},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"},"description":"Zweckgebundenes Auftrags-Token (`upload_token` oder `approval_token`) bzw. temporäres Preflight-Token bei `/temp-proof/{token}.jpg`."}],"responses":{"200":{"description":"Auftragsbestätigung als PDF (`application/pdf`).","content":{"application/pdf":{}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Zugriff verweigert.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Auftrag nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Bestellung & Auftragsstatus"]}},"/api/wahlplakate/order/{order_no}/freigabeprotokoll.pdf":{"get":{"summary":"Signiertes Druckfreigabe-Protokoll als PDF abrufen","description":"Liefert das verbindliche Druckfreigabe-Protokoll (`FP-{order_no}`) inkl. Softproof-Miniaturen und SHA-256-Prüfsummen als PDF.","operationId":"download_approval_protocol_pdf","security":[{"OrderTokenHeader":[]},{"CustomerBearerToken":[]},{"OrderTokenQuery":[]}],"parameters":[{"name":"order_no","in":"path","required":true,"schema":{"type":"string","title":"Order No"},"description":"Eindeutige Auftragsnummer des EasyOrder-Auftrags (z. B. `49450`)."},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"},"description":"Zweckgebundenes Auftrags-Token (`upload_token` oder `approval_token`) bzw. temporäres Preflight-Token bei `/temp-proof/{token}.jpg`."}],"responses":{"200":{"description":"Freigabeprotokoll als PDF (`application/pdf`).","content":{"application/pdf":{}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Zugriff verweigert.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Auftrag nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Bestellung & Auftragsstatus"]}},"/api/wahlplakate/order/{order_no}/iws-ticket.json":{"get":{"summary":"Strukturiertes IWS-Pro / CIM-ERP JobTicket als JSON abrufen","description":"Liefert das strukturierte IWS-Pro JobTicket (`orderHeader`, `positions`, `deliveryAddresses`, `billingSplit`) im JSON-Format.","operationId":"download_iws_jobticket_json","security":[{"OrderTokenHeader":[]},{"CustomerBearerToken":[]},{"OrderTokenQuery":[]}],"parameters":[{"name":"order_no","in":"path","required":true,"schema":{"type":"string","title":"Order No"},"description":"Eindeutige Auftragsnummer des EasyOrder-Auftrags (z. B. `49450`)."},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"},"description":"Zweckgebundenes Auftrags-Token (`upload_token` oder `approval_token`) bzw. temporäres Preflight-Token bei `/temp-proof/{token}.jpg`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Zugriff verweigert.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Auftrag nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Bestellung & Auftragsstatus"]}},"/api/wahlplakate/order/{order_no}/iws-ticket.xml":{"get":{"summary":"Strukturiertes IWS-Pro / CIM-ERP JobTicket als XML abrufen","description":"Liefert das typisierte IWS-Pro JobTicket (`_0G0TO_XML_{Bestellcode}.xml`) für die direkte CIM-ERP-Übergabe.","operationId":"download_iws_jobticket_xml","security":[{"OrderTokenHeader":[]},{"CustomerBearerToken":[]},{"OrderTokenQuery":[]}],"parameters":[{"name":"order_no","in":"path","required":true,"schema":{"type":"string","title":"Order No"},"description":"Eindeutige Auftragsnummer des EasyOrder-Auftrags (z. B. `49450`)."},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"},"description":"Zweckgebundenes Auftrags-Token (`upload_token` oder `approval_token`) bzw. temporäres Preflight-Token bei `/temp-proof/{token}.jpg`."}],"responses":{"200":{"description":"IWS-JobTicket als XML (`application/xml`).","content":{"application/xml":{}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Zugriff verweigert.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Auftrag nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Bestellung & Auftragsstatus"]}},"/api/wahlplakate/preflight":{"post":{"summary":"Vorab-Datencheck (DPI & 10-Loch-Softproof) für eine Druckdatei ausführen","operationId":"run_artwork_preflight","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_preflight_upload_api_wahlplakate_preflight_post"}}},"required":true},"responses":{"200":{"description":"Erfolgreiche Antwort.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightResponse"}}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Ungültige oder beschädigte Druckdatei.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Druckdaten, Preflight & Freigabe"],"description":"Prüft eine hochgeladene PDF-/Bilddatei vorab auf Auflösung (DPI), Seitenverhältnis und Beschnitt und erzeugt ein Softproof-Vorschaubild mit eingezeichneten Bohrlöchern bzw. Stanzkonturen.\n\nDas zurückgegebene `file_token` kann direkt bei `POST /api/wahlplakate/order` in `motifs[].fileToken` referenziert werden."}},"/api/wahlplakate/temp-proof/{token}.jpg":{"get":{"summary":"Temporäres Softproof-Vorschaubild aus dem Vorab-Preflight abrufen","operationId":"get_temp_preflight_proof","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"},"description":"Zweckgebundenes Auftrags-Token (`upload_token` oder `approval_token`) bzw. temporäres Preflight-Token bei `/temp-proof/{token}.jpg`."}],"responses":{"200":{"description":"Softproof-Vorschaubild (`image/jpeg`).","content":{"image/jpeg":{}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Softproof nicht gefunden oder abgelaufen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Druckdaten, Preflight & Freigabe"],"description":"Liefert das generierte JPEG-Softproof-Bild zu einem `file_token` aus `POST /api/wahlplakate/preflight`."}},"/api/wahlplakate/upload/{order_no}/{motif_id}":{"post":{"summary":"Druckdatei (PDF) zu einem Motiv eines bestehenden Auftrags hochladen","description":"Lädt die finale Druckdatei für das Motiv `{motif_id}` (z. B. `m1`) des Auftrags `{order_no}` hoch, prüft DPI und Stanzkontur/Bohrlöcher, berechnet den SHA-256-Hash und speichert den Softproof.\n\n**Sicherheit:** Erfordert zwingend ein gültiges `upload_token` (ein reines `approval_token` wird abgelehnt). Sobald der Auftrag bereits für den Druck freigegeben wurde (`upload_locked: true`), antwortet der Endpunkt mit `409 Conflict`.","operationId":"upload_order_motif_artwork","security":[{"OrderTokenHeader":[]},{"CustomerBearerToken":[]},{"OrderTokenQuery":[]}],"parameters":[{"name":"order_no","in":"path","required":true,"schema":{"type":"string","title":"Order No"},"description":"Eindeutige Auftragsnummer des EasyOrder-Auftrags (z. B. `49450`)."},{"name":"motif_id","in":"path","required":true,"schema":{"type":"string","title":"Motif Id"},"description":"Motiv-Kennung innerhalb des Auftrags (z. B. `m1`, `m2`)."},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"},"description":"Zweckgebundenes Auftrags-Token (`upload_token` oder `approval_token`) bzw. temporäres Preflight-Token bei `/temp-proof/{token}.jpg`."}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_wahlplakat_motif_api_wahlplakate_upload__order_no___motif_id__post"}}}},"responses":{"200":{"description":"Erfolgreiche Antwort.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadMotifResponse"}}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Ungültige Druckdatei.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Zugriff verweigert: Gültiges `upload_token` erforderlich.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Upload gesperrt, da für diesen Auftrag bereits die verbindliche Druckfreigabe erteilt wurde.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Druckdaten, Preflight & Freigabe"]}},"/api/wahlplakate/proof/{order_no}/{motif_id}.jpg":{"get":{"summary":"Softproof-Vorschaubild eines Auftrags-Motivs abrufen","description":"Liefert das generierte Softproof-Bild (inkl. 10 Bohrlöcher / Stanzkontur) für das Motiv `{motif_id}`.","operationId":"get_order_motif_proof","security":[{"OrderTokenHeader":[]},{"CustomerBearerToken":[]},{"OrderTokenQuery":[]}],"parameters":[{"name":"order_no","in":"path","required":true,"schema":{"type":"string","title":"Order No"},"description":"Eindeutige Auftragsnummer des EasyOrder-Auftrags (z. B. `49450`)."},{"name":"motif_id","in":"path","required":true,"schema":{"type":"string","title":"Motif Id"},"description":"Motiv-Kennung innerhalb des Auftrags (z. B. `m1`, `m2`)."},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"},"description":"Zweckgebundenes Auftrags-Token (`upload_token` oder `approval_token`) bzw. temporäres Preflight-Token bei `/temp-proof/{token}.jpg`."}],"responses":{"200":{"description":"Softproof-Bild (`image/jpeg`).","content":{"image/jpeg":{}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Zugriff verweigert.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Proof-Bild nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Druckdaten, Preflight & Freigabe"]}},"/api/wahlplakate/approve/{order_no}":{"post":{"summary":"Verbindliche Druckfreigabe für einen Auftrag erteilen","description":"Erteilt die verbindliche Druckfreigabe für alle Motive des Auftrags `{order_no}`.\n\nErzeugt ein kryptografisch verkettetes SHA-256-Freigabe-Manifest, sperrt weitere Datei-Uploads (`upload_locked: true`) und erstellt das Freigabeprotokoll-PDF.\n\n**Sicherheit:** Erfordert zwingend ein gültiges `approval_token` (ein `upload_token` reicht nicht aus).","operationId":"approve_order_for_production","security":[{"OrderTokenHeader":[]},{"CustomerBearerToken":[]},{"OrderTokenQuery":[]}],"parameters":[{"name":"order_no","in":"path","required":true,"schema":{"type":"string","title":"Order No"},"description":"Eindeutige Auftragsnummer des EasyOrder-Auftrags (z. B. `49450`)."},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"},"description":"Zweckgebundenes Auftrags-Token (`upload_token` oder `approval_token`) bzw. temporäres Preflight-Token bei `/temp-proof/{token}.jpg`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveOrderRequest"}}}},"responses":{"200":{"description":"Erfolgreiche Antwort.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveOrderResponse"}}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Freigabe nicht möglich (z. B. fehlende Druckdaten).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Zugriff verweigert: Gültiges `approval_token` erforderlich.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Auftrag nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Druckdaten, Preflight & Freigabe"]}},"/api/wahlplakate/stanzen/upload":{"post":{"summary":"Stanzvorlagen-PDF aktualisieren (Authentifiziert)","description":"Gehärteter Upload-Endpunkt für PDF-Stanzvorlagen. Erfordert einen gültigen Login oder ein aktives Session-/Upload-Token VOR der Dateiprüfung und validiert PDF-Magic-Bytes (`%PDF-`) sowie die maximale Dateigröße (25 MB).","operationId":"upload_custom_die_template","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_api_wp_upload_stanze_api_wahlplakate_stanzen_upload_post"}}}},"responses":{"200":{"description":"Erfolgreiche Antwort.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StanzeUploadResponse"}}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Fehlende Parameter, ungültige PDF-Signatur oder Datei zu groß.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Nicht autorisiert: Gültiger Login oder Token erforderlich.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"CustomerBearerToken":[]},{"CustomerTokenHeader":[]},{"OrderTokenHeader":[]}],"tags":["Druckdaten, Preflight & Freigabe"]}},"/api/wahlplakate/customer/register":{"post":{"summary":"Neues Kundenkonto registrieren","description":"Registriert ein neues B2B-Kundenkonto (oder wandelt ein bestehendes Gastprofil um) und gibt ein 256-Bit Session-Token sowie ein `HttpOnly`-Cookie zurück.","operationId":"register_customer_account","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerRegisterRequest"}}}},"responses":{"200":{"description":"Erfolgreiche Antwort.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerAuthResponse"}}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Ungültige E-Mail, zu kurzes Passwort (< 8 Zeichen) oder Konto existiert bereits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate-Limit überschritten (Schutz gegen Spam und Scraping; siehe Header `Retry-After` in Sekunden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Kundenkonto & Authentifizierung"]}},"/api/wahlplakate/customer/login":{"post":{"summary":"Kunden-Login (Session-Token für Kunden-Agenten)","description":"Authentifiziert ein bestehendes Kundenkonto mit E-Mail und Passwort (geschützt gegen User-Enumeration und Brute-Force) und liefert ein widerrufbares 256-Bit Session-Token (`token`).","operationId":"login_customer_account","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerLoginRequest"}}}},"responses":{"200":{"description":"Erfolgreiche Antwort.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerAuthResponse"}}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"E-Mail oder Passwort ist falsch (generische Meldung ohne User-Enumeration).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate-Limit überschritten (Schutz gegen Spam und Scraping; siehe Header `Retry-After` in Sekunden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Kundenkonto & Authentifizierung"]}},"/api/wahlplakate/customer/logout":{"post":{"summary":"Kunden-Session abmelden & Token widerrufen","description":"Entwertet das aktive Kunden-Session-Token serverseitig und löscht das Sitzungs-Cookie.","operationId":"logout_customer_account","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload"}}}},"responses":{"200":{"description":"Erfolgreich abgemeldet."},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Kundenkonto & Authentifizierung"],"security":[{"CustomerBearerToken":[]},{"CustomerTokenHeader":[]},{"CustomerSessionCookie":[]}]}},"/api/wahlplakate/customer/me":{"get":{"summary":"Eigenes Kundenprofil, Adressbuch & Bestellhistorie abrufen","description":"Liefert Stammdaten, hinterlegte Zahlungsart, Adressbuch und Bestellhistorie des authentifizierten Kunden.\n\n**Sicherheitsrichtlinie:** Die Übergabe des Session-Tokens im URL-Query-String (`?token=...`) ist strikt untersagt und wird mit `400 Bad Request` abgewiesen. Bitte ausschließlich `Authorization: Bearer <token>`, `X-Customer-Token` oder das `HttpOnly`-Session-Cookie verwenden.","operationId":"get_current_customer_profile","responses":{"200":{"description":"Erfolgreiche Antwort.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerProfileResponse"}}}},"400":{"description":"Sicherheitsverstoß: Auth-Token im URL-Query-String übergeben.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Kundensitzung nicht gefunden oder abgelaufen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Kundenkonto & Authentifizierung"],"security":[{"CustomerBearerToken":[]},{"CustomerTokenHeader":[]},{"CustomerSessionCookie":[]}]}},"/api/wahlplakate/customer/addresses":{"post":{"summary":"Adressbuch des Kundenkontos aktualisieren","description":"Speichert oder aktualisiert die Liefer- und Rechnungsadressen im Adressbuch des angemeldeten Kunden.","operationId":"update_customer_addresses","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerAddressesUpdateRequest"}}}},"responses":{"200":{"description":"Erfolgreiche Antwort.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerProfileResponse"}}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Nicht angemeldet oder Token ungültig.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Kundenkonto & Authentifizierung"],"security":[{"CustomerBearerToken":[]},{"CustomerTokenHeader":[]},{"CustomerSessionCookie":[]}]}},"/api/wahlplakate/customer/profile":{"post":{"summary":"Stammdaten & Rechnungseinstellungen des Kundenkontos speichern","description":"Aktualisiert Firmenname, Ansprechpartner, USt-IdNr., Rechnungs-E-Mail, bevorzugte Zahlungsart oder Passwort.","operationId":"update_customer_profile","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerProfileUpdateRequest"}}}},"responses":{"200":{"description":"Erfolgreiche Antwort.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerProfileResponse"}}}},"422":{"description":"Ungültige oder unvollständige Eingabedaten (kompakte Validierungsmeldung ohne interne Stackdetails).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Ungültige Profildaten.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Nicht angemeldet oder Token ungültig.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Kundenkonto & Authentifizierung"],"security":[{"CustomerBearerToken":[]},{"CustomerTokenHeader":[]},{"CustomerSessionCookie":[]}]}},"/api/wahlplakate/agent-auth/spec":{"get":{"summary":"Agenten-Auth-Konzept & Scope-Matrix abrufen (Schritt 3)","description":"Liefert die maschinenlesbare Dokumentation des Agenten-Authentifizierungsmodells (`iff_ak_live_<key_id>_<secret>`), der beiden Agententypen (`guest_agent`, `customer_agent`) und der 5 Scopes (`katalog:lesen`, `bestellung:entwurf`, `upload`, `bestellung:bestaetigen`, `konditionen:eigene`).","operationId":"get_agent_auth_spec","responses":{"200":{"description":"Erfolgreiche Antwort.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentAuthSpecResponse"}}}}},"tags":["Kundenkonto & Authentifizierung"]}},"/api/wahlplakate/agent-auth/whoami":{"get":{"summary":"Eigenen Agenten-API-Key & zugewiesene Scopes prüfen","description":"Validiert den übergebenen Agenten-API-Key (`X-Agent-Key: iff_ak_live_...` oder `Authorization: Bearer iff_ak_live_...`) und gibt Agententyp (`guest_agent` oder `customer_agent`), freigeschaltete Scopes und ggf. die verknüpfte `customer_id` zurück.","operationId":"verify_current_agent_key","responses":{"200":{"description":"Erfolgreiche Antwort.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentKeyWhoamiResponse"}}}},"401":{"description":"Kein oder ungültiger/widerrufener Agenten-API-Key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Agenten-Tür ist per Kill-Switch deaktiviert.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Kundenkonto & Authentifizierung"],"security":[{"AgentScopedApiKey":[]},{"CustomerBearerToken":[]}]}},"/health":{"get":{"summary":"System- & API-Verfügbarkeit prüfen","operationId":"get_system_health","responses":{"200":{"description":"Erfolgreiche Antwort.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}},"tags":["System & Health"],"description":"Schneller Health-Check für Monitoring und Agenten-Verbindungsprüfung."}}},"components":{"schemas":{"Body_api_wp_upload_stanze_api_wahlplakate_stanzen_upload_post":{"properties":{"key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key","description":"Eindeutiger Stanzvorlagen-Schlüssel (z. B. `A1_hoch`, `A0_quer`, `FOLDUP_85_basis`)."},"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File","description":"Hochzuladende Druckdatei (PDF bevorzugt; beim Vorab-Preflight auch hochauflösendes JPEG/PNG möglich)."},"token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token","description":"Optionales Authentifizierungs- oder Upload-Token (falls nicht bereits im Header übergeben)."}},"type":"object","title":"Body_api_wp_upload_stanze_api_wahlplakate_stanzen_upload_post"},"Body_preflight_upload_api_wahlplakate_preflight_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File","description":"Hochzuladende Druckdatei (PDF bevorzugt; beim Vorab-Preflight auch hochauflösendes JPEG/PNG möglich)."},"format":{"type":"string","title":"Format","default":"A1","description":"Ziel-Produktformat (`A1`, `A0`, `FOLDUP_65`, `FOLDUP_85`, `FOLDUP_100`, `AUFSTELLER_A1`, `AUFSTELLER_A3`, `AUFSTELLER_QUER`, `HARTSCHAUM`, `SK_FOLIE`, `ALUVERBUND`, `KARTONWABE`, `PP_WABE`, `PP_HOHLKAMMER`)."},"orient":{"type":"string","title":"Orient","default":"hoch","description":"Ziel-Ausrichtung (`hoch` oder `quer`) bzw. FoldUp-Ausstattungsvariante (`basis`, `a6`, `a5`, `vk`, `a6_vk`, `a5_vk`)."},"width_mm":{"type":"number","title":"Width Mm","default":0.0,"description":"Optionale Wunschbreite in mm bei Freiform-/Platten-/Folienprodukten."},"height_mm":{"type":"number","title":"Height Mm","default":0.0,"description":"Optionale Wunschhöhe in mm bei Freiform-/Platten-/Folienprodukten."},"zuschnitt":{"type":"string","title":"Zuschnitt","default":"rechteck","description":"Optionale Zuschnitt-Variante (`rechteck`, `rechteck_gerundet`, `konturschnitt`)."},"bohrungen":{"type":"string","title":"Bohrungen","default":"ohne","description":"Optionale Bohrungs-Variante (`ohne`, `4_ecken`, `6_bohrungen`, `10_loch`, `individuell`)."}},"type":"object","required":["file"],"title":"Body_preflight_upload_api_wahlplakate_preflight_post"},"Body_upload_wahlplakat_motif_api_wahlplakate_upload__order_no___motif_id__post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File","description":"Hochzuladende Druckdatei (PDF bevorzugt; beim Vorab-Preflight auch hochauflösendes JPEG/PNG möglich)."},"format":{"type":"string","title":"Format","default":"A1","description":"Ziel-Produktformat (`A1`, `A0`, `FOLDUP_65`, `FOLDUP_85`, `FOLDUP_100`, `AUFSTELLER_A1`, `AUFSTELLER_A3`, `AUFSTELLER_QUER`, `HARTSCHAUM`, `SK_FOLIE`, `ALUVERBUND`, `KARTONWABE`, `PP_WABE`, `PP_HOHLKAMMER`)."},"orient":{"type":"string","title":"Orient","default":"hoch","description":"Ziel-Ausrichtung (`hoch` oder `quer`) bzw. FoldUp-Ausstattungsvariante (`basis`, `a6`, `a5`, `vk`, `a6_vk`, `a5_vk`)."}},"type":"object","required":["file"],"title":"Body_upload_wahlplakat_motif_api_wahlplakate_upload__order_no___motif_id__post"},"ErrorResponse":{"description":"Standardisiertes Fehlerobjekt für alle öffentlichen und geschützten Endpunkte.","properties":{"detail":{"description":"Klare, menschen- und agentenlesbare Beschreibung des Fehlers (ohne interne Stacktraces).","examples":["Bitte geben Sie eine gültige E-Mail-Adresse für die Bestellbestätigung und Druckfreigabe an."],"title":"Detail","type":"string"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"PriceTierItem":{"properties":{"min":{"description":"Mindeststückzahl der gesamten Format-Auflage ab der dieser Staffelpreis gilt.","examples":[100],"title":"Min","type":"integer"},"price":{"description":"Netto-Stückpreis in EUR zzgl. 19 % MwSt.","examples":[2.5],"title":"Price","type":"number"}},"required":["min","price"],"title":"PriceTierItem","type":"object"},"ShippingPricesInfo":{"properties":{"pkg_a1":{"description":"Versandpauschale netto (EUR) für ein Standardpaket (nur DIN A1, bis 100 Stk. je Lieferadresse).","examples":[9.2],"title":"Pkg A1","type":"number"},"pkg_a0":{"description":"Versandpauschale netto (EUR) für ein Großpaket (sobald mind. 1× DIN A0 enthalten ist, bis 100 Plakate Äquivalent).","examples":[16.1],"title":"Pkg A0","type":"number"},"pal":{"description":"Versandpauschale netto (EUR) für Palettenversand per Spedition (ab > 100 DIN-A1-Äquivalenten an einer Lieferadresse).","examples":[65.0],"title":"Pal","type":"number"}},"required":["pkg_a1","pkg_a0","pal"],"title":"ShippingPricesInfo","type":"object"},"PricingResponse":{"description":"Vollständige öffentliche Preis- und Versandmatrix oder gezielte Einzelpreis-Antwort.","properties":{"status":{"const":"ok","default":"ok","description":"Status der Abfrage.","title":"Status","type":"string"},"tiers_a1":{"anyOf":[{"items":{"$ref":"#/components/schemas/PriceTierItem"},"type":"array"},{"type":"null"}],"default":null,"description":"Staffelpreise (netto in EUR/Stk.) für Wahlplakate DIN A1 (594 × 841 mm, 3,0 mm PP-Hohlkammer).","title":"Tiers A1"},"tiers_a0":{"anyOf":[{"items":{"$ref":"#/components/schemas/PriceTierItem"},"type":"array"},{"type":"null"}],"default":null,"description":"Staffelpreise (netto in EUR/Stk.) für Wahlplakate DIN A0 (841 × 1189 mm, 3,0 mm PP-Hohlkammer).","title":"Tiers A0"},"extra_motif_fee":{"default":15.0,"description":"Netto-Gebühr (EUR) je weiterem aktiven Motivwechsel bei Wahlplakaten (1. Motiv ist inklusive).","examples":[15.0],"title":"Extra Motif Fee","type":"number"},"shipping":{"$ref":"#/components/schemas/ShippingPricesInfo","description":"Netto-Versandpauschalen je Lieferadresse."},"foldup_base_prices":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"default":null,"description":"Netto-Komplettset-Basispreise (inkl. Standardversand) für FoldUp-Displays (`FOLDUP_65`, `FOLDUP_85`, `FOLDUP_100`).","examples":[{"FOLDUP_100":119.0,"FOLDUP_65":102.0,"FOLDUP_85":109.0}],"title":"Foldup Base Prices"},"foldup_dispenser_surcharges":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"default":null,"description":"Netto-Aufpreise je FoldUp-Ausstattungsvariante (`basis`, `a6`, `a5`, `vk`, `a6_vk`, `a5_vk`, `a6_a6`, `a5_a5`).","examples":[{"a5":10.0,"a5_vk":14.99,"a6":10.0,"a6_vk":14.99,"basis":0.0,"vk":10.0}],"title":"Foldup Dispenser Surcharges"},"aufsteller_tiers":{"anyOf":[{"additionalProperties":{"items":{"$ref":"#/components/schemas/PriceTierItem"},"type":"array"},"type":"object"},{"type":"null"}],"default":null,"description":"Staffelpreise (netto in EUR/Stk.) für freistehende A-Aufsteller (`AUFSTELLER_A1`, `AUFSTELLER_A3`, `AUFSTELLER_QUER`).","title":"Aufsteller Tiers"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Angefragtes Produktformat (nur bei Einzelpreis-Abfrage mit `?format=...&qty=...`).","examples":["A1"],"title":"Format"},"orient":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Angefragte Ausrichtung/Variante (nur bei Einzelpreis-Abfrage).","examples":["hoch"],"title":"Orient"},"qty":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Angefragte Menge (nur bei Einzelpreis-Abfrage).","examples":[100],"title":"Qty"},"unit_price":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Berechneter Netto-Stückpreis in EUR für die angefragte Menge (nur bei Einzelpreis-Abfrage).","examples":[3.16],"title":"Unit Price"},"motifs_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Anzahl der Druckmotive in der Kalkulation (Standard: 1).","examples":[2],"title":"Motifs Count"},"addresses_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Anzahl der Lieferadressen in der Kalkulation (Standard: 1).","examples":[3],"title":"Addresses Count"},"address_quantities":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"default":null,"description":"Mengenaufteilung je Lieferadresse.","examples":[[34,33,33]],"title":"Address Quantities"},"print_net":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Netto-Druckpreis über die Gesamtmenge aller Motive.","examples":[316.0],"title":"Print Net"},"motif_fee_net":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Netto-Motivwechselgebühr (ab dem 2. Motiv bei A1/A0 je +20,00 €).","examples":[20.0],"title":"Motif Fee Net"},"shipping_net":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Netto-Versandkosten gesamt über alle Lieferadressen.","examples":[40.5],"title":"Shipping Net"},"total_net":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Netto-Gesamtbetrag inkl. Druck, Motivwechsel und Versand.","examples":[376.5],"title":"Total Net"},"vat_19":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"19 % gesetzliche Mehrwertsteuer in EUR.","examples":[71.54],"title":"Vat 19"},"total_gross":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Brutto-Gesamtbetrag inkl. 19 % MwSt. in EUR.","examples":[448.04],"title":"Total Gross"},"updated_at":{"description":"Zeitstempel der letzten Preisaktualisierung.","examples":["03.11.2026 14:00"],"title":"Updated At","type":"string"}},"required":["shipping","updated_at"],"title":"PricingResponse","type":"object"},"StanzeTemplateItem":{"properties":{"key":{"description":"Eindeutiger Vorlagen-Schlüssel (z. B. `A1_hoch`, `A0_quer`, `FOLDUP_85_basis`, `AUFSTELLER_A1_hoch`).","examples":["A1_hoch"],"title":"Key","type":"string"},"group":{"default":"wahlplakate","description":"Zugehörige Produktgruppe.","enum":["wahlplakate","foldup","aufsteller"],"title":"Group","type":"string"},"format":{"description":"Produktformat-Code.","examples":["A1"],"title":"Format","type":"string"},"orient":{"description":"Ausrichtung bzw. Ausstattungsvariante.","examples":["hoch"],"title":"Orient","type":"string"},"title":{"description":"Anzeigename der Stanzvorlage.","examples":["DIN A1 Hochformat (594 × 841 mm)"],"title":"Title","type":"string"},"filename":{"description":"Dateiname zum Abruf über `/api/wahlplakate/stanzen/{filename}`.","examples":["WPA1_Stanze_Bohrung.pdf"],"title":"Filename","type":"string"},"trim_mm":{"description":"Endformat [Breite, Höhe] in Millimetern.","examples":[[594.0,841.0]],"items":{"type":"number"},"title":"Trim Mm","type":"array"},"bleed_mm":{"default":3.0,"description":"Erforderlicher umlaufender Beschnitt in mm.","examples":[3.0],"title":"Bleed Mm","type":"number"},"holes":{"default":10,"description":"Anzahl der vorgestanzten Bohrlöcher (10 bei Wahlplakaten).","examples":[10],"title":"Holes","type":"integer"},"download_url":{"description":"Relativer Pfad zum direkten PDF-Download.","examples":["/api/wahlplakate/stanzen/WPA1_Stanze_Bohrung.pdf"],"title":"Download Url","type":"string"}},"required":["key","format","orient","title","filename","trim_mm","download_url"],"title":"StanzeTemplateItem","type":"object"},"StanzenListResponse":{"properties":{"stanzen":{"description":"Liste aller verfügbaren 1:1-Stanzvorlagen und Standskizzen.","items":{"$ref":"#/components/schemas/StanzeTemplateItem"},"title":"Stanzen","type":"array"}},"required":["stanzen"],"title":"StanzenListResponse","type":"object"},"AddressItem":{"additionalProperties":true,"description":"Liefer-, Rechnungs- oder Auftraggeberanschrift innerhalb eines Auftrags.","properties":{"id":{"description":"Lokale Adress-ID zur Referenzierung im Verteilplan (`rows[].addr`) und in der Rechnungszuordnung (`billing`).","examples":["a1"],"title":"Id","type":"string"},"name":{"description":"Firmenname, Parteiverband, Verein oder vollständiger Name.","examples":["Stadtverband Musterstadt"],"title":"Name","type":"string"},"person":{"default":"","description":"Ansprechpartner / z. Hd. (optional).","examples":["Max Mustermann"],"title":"Person","type":"string"},"phone":{"default":"","description":"Telefonnummer für Rückfragen / Speditionsavis.","examples":["+49 6051 97200"],"title":"Phone","type":"string"},"street":{"description":"Straße und Hausnummer (Pflichtfeld).","examples":["Schönauer Weg 25"],"title":"Street","type":"string"},"zip":{"description":"Postleitzahl (Pflichtfeld).","examples":["63571"],"title":"Zip","type":"string"},"city":{"description":"Ort / Stadt (Pflichtfeld).","examples":["Gelnhausen"],"title":"City","type":"string"},"note":{"default":"","description":"Optionaler Adresszusatz, Kostenstelle oder Lieferhinweis.","examples":["Anlieferung Tor 2"],"title":"Note","type":"string"},"auftraggeber":{"default":false,"description":"Markiert diese Adresse als Haupt-Auftraggeber (Vertragspartner). Genau eine Adresse muss `auftraggeber=true` sein.","title":"Auftraggeber","type":"boolean"},"liefer":{"default":true,"description":"Markiert diese Adresse als auswählbare Lieferadresse im Verteilplan.","title":"Liefer","type":"boolean"},"rechnung":{"default":true,"description":"Markiert diese Adresse als möglichen Rechnungsempfänger.","title":"Rechnung","type":"boolean"}},"required":["id","name","street","zip","city"],"title":"AddressItem","type":"object"},"DistributionRow":{"additionalProperties":true,"description":"Einzelne Verteilzeile eines Motivs: Welche Stückzahl geht an welche Lieferadresse.","properties":{"id":{"default":"r1","description":"Lokale Zeilen-ID.","examples":["r1"],"title":"Id","type":"string"},"addr":{"description":"ID (`AddressItem.id`) der Ziel-Lieferadresse aus `addresses`.","examples":["a1"],"title":"Addr","type":"string"},"qty":{"description":"Bestellmenge (Stückzahl >= 1) dieses Motivs für diese Lieferadresse.","examples":[100],"title":"Qty","type":"integer"}},"required":["addr","qty"],"title":"DistributionRow","type":"object"},"MotifOrderItem":{"additionalProperties":true,"description":"Ein einzelnes Druckmotiv innerhalb einer Bestellung inklusive Format und Verteilplan.","properties":{"id":{"default":"m1","description":"Lokale Motiv-ID (`m1`, `m2`, ...).","examples":["m1"],"title":"Id","type":"string"},"name":{"description":"Eindeutiger Motivname zur Identifikation auf Packlisten und im Freigabeprotokoll.","examples":["Kandidatenplakat Hauptwahl"],"title":"Name","type":"string"},"format":{"default":"A1","description":"Produktformat-Code (`A1`, `A0`, `FOLDUP_65`, `FOLDUP_85`, `FOLDUP_100`, `AUFSTELLER_A1`, `AUFSTELLER_A3`, `AUFSTELLER_QUER`, `HARTSCHAUM`, `SK_FOLIE`, `ALUVERBUND`, `KARTONWABE`, `PP_WABE`, `PP_HOHLKAMMER`).","enum":["A1","A0","FOLDUP_65","FOLDUP_85","FOLDUP_100","AUFSTELLER_A1","AUFSTELLER_A3","AUFSTELLER_QUER","HARTSCHAUM","SK_FOLIE","ALUVERBUND","KARTONWABE","PP_WABE","PP_HOHLKAMMER"],"examples":["A1"],"title":"Format","type":"string"},"orient":{"default":"hoch","description":"Ausrichtung (`hoch`/`quer` bei Plakaten & Aufstellern) bzw. Dispenser-Ausstattung bei FoldUp.","enum":["hoch","quer","basis","a6","a5","vk","a6_vk","a5_vk","a6_a6","a5_a5","a6x2","a5x2","vkx2"],"examples":["hoch"],"title":"Orient","type":"string"},"width_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Optional bei `HARTSCHAUM`, `SK_FOLIE`, `ALUVERBUND`, `KARTONWABE`, `PP_WABE`, `PP_HOHLKAMMER`: Wunschbreite in mm (z. B. 594).","title":"Width Mm"},"height_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Optional bei `HARTSCHAUM`, `SK_FOLIE`, `ALUVERBUND`, `KARTONWABE`, `PP_WABE`, `PP_HOHLKAMMER`: Wunschhöhe in mm (z. B. 841).","title":"Height Mm"},"staerke_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Optional bei `HARTSCHAUM` (2, 3, 5, 10 mm), `ALUVERBUND` (2, 3 mm), `KARTONWABE` (10, 16 mm), `PP_WABE` (3.3 mm) oder `PP_HOHLKAMMER` (3 mm): Materialstärke in mm.","title":"Staerke Mm"},"farbe":{"anyOf":[{"enum":["weiss","transparent","weiss_kraft"],"type":"string"},{"type":"null"}],"default":null,"description":"Optional bei `SK_FOLIE` (`weiss`, `transparent`) oder `KARTONWABE` (`weiss_kraft`).","title":"Farbe"},"kleber":{"anyOf":[{"enum":["abloesbar","permanent"],"type":"string"},{"type":"null"}],"default":null,"description":"Optional bei `SK_FOLIE`: Kleber (`abloesbar` oder `permanent`).","title":"Kleber"},"einsatz":{"anyOf":[{"enum":["innen","aussen"],"type":"string"},{"type":"null"}],"default":null,"description":"Optional bei `SK_FOLIE`: Einsatzbereich (`innen` / Hinterglas oder `aussen`).","title":"Einsatz"},"druckseiten":{"anyOf":[{"enum":["4/0","4/4","0/0"],"type":"string"},{"type":"null"}],"default":null,"description":"Optional bei KALK-Produkten: `4/0` einseitig, `4/4` beidseitig (bei SK-Folie inkl. 3× Weiß-Sperrschicht), `0/0` unbedruckt.","title":"Druckseiten"},"zuschnitt":{"anyOf":[{"enum":["rechteck","rechteck_gerundet","konturschnitt"],"type":"string"},{"type":"null"}],"default":null,"description":"Optional bei KALK-Produkten: Zuschnittart (`rechteck`, `rechteck_gerundet`, `konturschnitt`).","title":"Zuschnitt"},"laminierung":{"anyOf":[{"enum":["ohne","matt","glaenzend"],"type":"string"},{"type":"null"}],"default":null,"description":"Optional bei `SK_FOLIE`: Schutzlaminat (`ohne`, `matt`, `glaenzend`).","title":"Laminierung"},"bohrungen":{"anyOf":[{"enum":["ohne","4_ecken","6_bohrungen","10_loch","10","individuell"],"type":"string"},{"type":"null"}],"default":null,"description":"Optional bei Plattenprodukten (`HARTSCHAUM`, `ALUVERBUND`, `KARTONWABE`, `PP_WABE`, `PP_HOHLKAMMER`): Bohrungen (`ohne`, `4_ecken`, `6_bohrungen`, `10_loch` bei PP-Hohlkammer, `individuell`).","title":"Bohrungen"},"rows":{"description":"Verteilplan-Zeilen (mindestens eine Zeile mit `qty >= 1` und gültiger Lieferadresse `addr`).","items":{"$ref":"#/components/schemas/DistributionRow"},"title":"Rows","type":"array"},"fileName":{"default":"","description":"Dateiname der hochgeladenen Druckdatei (falls bereits vorab per `/api/wahlplakate/preflight` geprüft).","examples":["plakat_a1.pdf"],"title":"Filename","type":"string"},"fileToken":{"default":"","description":"Vom Preflight-Endpunkt zurückgegebenes `file_token` zur direkten Übernahme der geprüften PDF-Datei.","examples":[""],"title":"Filetoken","type":"string"},"billing":{"default":"","description":"Optionale abweichende Rechnungsadresse (`AddressItem.id`) für dieses Motiv (Teilrechnung).","examples":[""],"title":"Billing","type":"string"}},"required":["name","rows"],"title":"MotifOrderItem","type":"object"},"AgentMetaInfo":{"additionalProperties":true,"description":"Metadaten zur Kennzeichnung und Nachvollziehbarkeit von KI-Agenten-Bestellungen (Schritt 1).","properties":{"agent_name":{"default":"","description":"Name des aufrufenden KI-Agenten oder Assistenten (z. B. `Claude`, `ChatGPT`, `Gemini`, `VoiceBot`).","examples":["Claude"],"title":"Agent Name","type":"string"},"agent_id":{"default":"","description":"Optionale Kennung des Agenten-Keys oder Clients.","examples":["agent-claude-prod-01"],"title":"Agent Id","type":"string"},"consent_confirmed":{"default":false,"description":"Bestätigt, dass der menschliche Nutzer die Zusammenfassung (Artikel, Gesamtpreis, Rechnungsadresse) ausdrücklich zur verbindlichen Bestellung freigegeben hat.","examples":[true],"title":"Consent Confirmed","type":"boolean"},"consent_reference":{"default":"","description":"Optionaler Zeitstempel oder Hash/Referenz der ausdrücklichen Nutzer-Zustimmung.","examples":["2026-11-02T20:15:00Z"],"title":"Consent Reference","type":"string"},"idempotency_key":{"default":"","description":"Optionaler Idempotenz-Schlüssel gegen versehentliches doppeltes Absenden.","examples":["ord-req-20261102-001"],"title":"Idempotency Key","type":"string"}},"title":"AgentMetaInfo","type":"object"},"OrderCreateRequest":{"additionalProperties":true,"description":"Anfrage-Payload zum verbindlichen Anlegen eines EasyOrder-Auftrags (`POST /api/wahlplakate/order`).","example":{"addresses":[{"auftraggeber":true,"city":"Gelnhausen","id":"a1","liefer":true,"name":"Ortsverband Musterstadt","person":"Erika Muster","phone":"+49 6051 97200","rechnung":true,"street":"Hauptstraße 10","zip":"63571"}],"agent_meta":{"agent_name":"Claude","consent_confirmed":true,"consent_reference":"2026-11-02T20:15:00Z"},"email":"bestellung@musterverband.de","lt_tier":"10","motifs":[{"format":"A1","id":"m1","name":"Motiv 1 – Hauptwahl","orient":"hoch","rows":[{"addr":"a1","id":"r1","qty":200}]}],"order_channel":"agent","payment_method":"vorkasse","phone":"+49 6051 97200","widerruf_accepted":true},"properties":{"email":{"default":"","description":"E-Mail-Adresse des Auftraggebers für Bestellbestätigung, Vorausrechnung, Upload-Link und Druckfreigabe (Pflichtfeld).","title":"Email","type":"string"},"phone":{"default":"","description":"Telefonnummer des Auftraggebers für Rückfragen der Druckvorstufe und Speditionsavis (Pflichtfeld, mind. 5 Ziffern).","title":"Phone","type":"string"},"widerruf_accepted":{"default":false,"description":"Pflichtbestätigung (`true`), dass es sich um individuell nach Kundenspezifikation gefertigte Druckprodukte handelt (kein Widerrufsrecht nach § 312g Abs. 2 Nr. 1 BGB / B2B).","title":"Widerruf Accepted","type":"boolean"},"payment_method":{"default":"vorkasse","description":"Zahlungsart. Für Gastbesteller und Fremd-Agenten wird serverseitig immer `vorkasse` (Vorausrechnung vor Produktionsstart) verwendet.","enum":["vorkasse","rechnung"],"title":"Payment Method","type":"string"},"lt_tier":{"default":"10","description":"Gewählte Produktions- & Lieferzeit in Werktagen (Mo–Fr): '10' (Standard 10 Werktage +0 %), '5' (Schnell 5 Werktage +20 %), '3-4' (Priority 3–4 Werktage +30 %), '2-3' (Express 2–3 Werktage +100 %).","enum":["10","5","3-4","2-3"],"title":"Lt Tier","type":"string"},"addresses":{"description":"Adressliste des Auftrags. Muss mindestens eine vollständige Auftraggeber-Adresse (`auftraggeber: true`) und alle im Verteilplan genutzten Lieferadressen enthalten.","items":{"$ref":"#/components/schemas/AddressItem"},"title":"Addresses","type":"array"},"motifs":{"description":"Liste der bestellten Motive (mindestens 1 Motiv mit Gesamtauflage >= 1).","items":{"$ref":"#/components/schemas/MotifOrderItem"},"title":"Motifs","type":"array"},"order_billing":{"default":"","description":"Optionale `AddressItem.id` einer abweichenden Haupt-Rechnungsadresse.","title":"Order Billing","type":"string"},"customer_token":{"default":"","description":"Optionales Kunden-Session-Token bei Bestellung über ein bestehendes Kundenkonto.","title":"Customer Token","type":"string"},"order_channel":{"default":"web","description":"Ursprungskanal der Bestellung (`web` für Browser-Shop, `agent` / `mcp` / `voice` für KI-Agenten-Bestellungen zur Kanal-Messung).","enum":["web","agent","mcp","voice"],"title":"Order Channel","type":"string"},"agent_meta":{"anyOf":[{"$ref":"#/components/schemas/AgentMetaInfo"},{"type":"null"}],"default":null,"description":"Optionale Agenten- & Consent-Metadaten bei Bestellungen über die KI-Agenten-Tür."},"website_url_hp":{"default":"","description":"Honeypot-Feld zum Bot-Schutz (muss leer bleiben).","title":"Website Url Hp","type":"string"}},"required":["email","phone","widerruf_accepted","addresses","motifs"],"title":"OrderCreateRequest","type":"object"},"BankDetailsInfo":{"properties":{"holder":{"default":"IFFLAND GmbH","description":"Kontoinhaber.","title":"Holder","type":"string"},"bank":{"default":"Kreissparkasse Gelnhausen","description":"Kreditinstitut.","title":"Bank","type":"string"},"iban":{"description":"IBAN für die Vorkasse-Überweisung.","examples":["DE89 5075 0094 0000 0123 45"],"title":"Iban","type":"string"},"bic":{"description":"BIC des Kreditinstituts.","examples":["HELADEF1GEL"],"title":"Bic","type":"string"}},"required":["iban","bic"],"title":"BankDetailsInfo","type":"object"},"OrderCreateResponse":{"description":"Antwort nach erfolgreicher Auftragserstellung inkl. serverseitig vergebener Auftragsnummer und Upload-Token.","properties":{"status":{"const":"ok","default":"ok","description":"Bestätigt die erfolgreiche Anlage.","title":"Status","type":"string"},"order_no":{"description":"Serverseitig vergebene, eindeutige Auftragsnummer.","examples":["49450"],"title":"Order No","type":"string"},"customer_id":{"default":"","description":"Zugeordnete Kundennummer (z. B. `K-1004`).","examples":["K-1004"],"title":"Customer Id","type":"string"},"checkout_mode":{"default":"guest","description":"Verwendeter Checkout-Modus (`guest` oder `account`).","title":"Checkout Mode","type":"string"},"payment_method":{"default":"vorkasse","description":"Verbindlich gesetzte Zahlungsart.","enum":["vorkasse","rechnung"],"title":"Payment Method","type":"string"},"payment_received":{"default":false,"description":"Zahlungsstatus (bei neuer Bestellung initial immer `false`).","title":"Payment Received","type":"boolean"},"payment_status":{"description":"Textueller Zahlungsstatus.","examples":["Wartet auf Zahlungseingang (Vorkasse)"],"title":"Payment Status","type":"string"},"lt_clock_running":{"default":false,"description":"Gibt an, ob die Lieferzeit-Uhr bereits läuft (`false` bei offener Vorkasse, `true` nach Zahlungseingang).","title":"Lt Clock Running","type":"boolean"},"lt_overall":{"description":"Voraussichtlicher Liefertermin Versand abgehend ab Werk.","examples":["16.11.2026"],"title":"Lt Overall","type":"string"},"bank_details":{"$ref":"#/components/schemas/BankDetailsInfo","description":"Bankverbindung für die Vorauszahlung."},"upload_token":{"description":"Kryptografisches 256-Bit Auftrags-Token (`upload`-Scope) zum Abruf des Auftragsstatus, der PDFs und zum Druckdaten-Upload.","title":"Upload Token","type":"string"},"upload_url":{"description":"Direkter Link zur Kunden-Upload-Maske für diesen Auftrag.","title":"Upload Url","type":"string"},"customer_token":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Neu ausgestelltes Kunden-Session-Token (nur falls gleichzeitig ein Kundenkonto angelegt wurde).","title":"Customer Token"}},"required":["order_no","payment_status","lt_overall","bank_details","upload_token","upload_url"],"title":"OrderCreateResponse","type":"object"},"OrderTotalsSummary":{"additionalProperties":true,"properties":{"net_total":{"description":"Gesamtbetrag netto in EUR.","examples":[465.0],"title":"Net Total","type":"number"},"vat_total":{"description":"Gesetzliche Umsatzsteuer (19 %) in EUR.","examples":[88.35],"title":"Vat Total","type":"number"},"gross_total":{"description":"Gesamtbetrag brutto (inkl. 19 % MwSt.) in EUR.","examples":[553.35],"title":"Gross Total","type":"number"},"freight":{"description":"Versandkosten netto in EUR.","examples":[18.4],"title":"Freight","type":"number"},"extra_motif_fee_total":{"default":0.0,"description":"Summe der Motivwechsel-Gebühren netto in EUR.","examples":[0.0],"title":"Extra Motif Fee Total","type":"number"}},"required":["net_total","vat_total","gross_total","freight"],"title":"OrderTotalsSummary","type":"object"},"OrderStatusResponse":{"additionalProperties":true,"description":"Auftragsdetails und Echtzeit-Status (`GET /api/wahlplakate/order/{order_no}`).","properties":{"order_no":{"description":"Auftragsnummer.","examples":["49450"],"title":"Order No","type":"string"},"created_at":{"default":"","description":"Erstellungszeitpunkt des Auftrags.","examples":["02.11.2026 20:15"],"title":"Created At","type":"string"},"commercial_status":{"default":"Bestellt","description":"Kaufmännischer Status (`Bestellt`, `Bestätigt`, `Geändert`).","title":"Commercial Status","type":"string"},"artwork_status":{"default":"Offen","description":"Druckdaten-Status (`Offen`, `Hochgeladen`, `Freigabe angefordert`, `Freigegeben`).","title":"Artwork Status","type":"string"},"production_status":{"default":"Vorbereitet","description":"Produktionsstatus (`Vorbereitet`, `Ausgeschossen`, `Produziert`, `Versendet`).","title":"Production Status","type":"string"},"payment_method":{"default":"vorkasse","description":"Zahlungsart (`vorkasse` oder `rechnung`).","title":"Payment Method","type":"string"},"payment_received":{"default":false,"description":"Gibt an, ob der Zahlungseingang bestätigt wurde.","title":"Payment Received","type":"boolean"},"payment_status":{"default":"","description":"Lesbarer Zahlungsstatus.","title":"Payment Status","type":"string"},"lt_clock_running":{"default":false,"description":"Gibt an, ob die Produktions-/Lieferzeit bereits läuft.","title":"Lt Clock Running","type":"boolean"},"lt_overall":{"default":"","description":"Liefertermin Versand abgehend ab Werk.","title":"Lt Overall","type":"string"},"approved":{"default":false,"description":"Gibt an, ob die verbindliche Druckfreigabe bereits erteilt wurde.","title":"Approved","type":"boolean"},"upload_locked":{"default":false,"description":"Gibt an, ob der Druckdaten-Upload nach erteilter Freigabe gesperrt ist.","title":"Upload Locked","type":"boolean"},"order_channel":{"default":"web","description":"Ursprungskanal (`web`, `agent`, `mcp`, `voice`).","title":"Order Channel","type":"string"},"motifs":{"description":"Liste der Motive inklusive Upload- und Proof-Status.","items":{"additionalProperties":true,"type":"object"},"title":"Motifs","type":"array"},"addresses":{"description":"Hinterlegte Liefer- und Rechnungsadressen.","items":{"additionalProperties":true,"type":"object"},"title":"Addresses","type":"array"},"totals":{"anyOf":[{"$ref":"#/components/schemas/OrderTotalsSummary"},{"additionalProperties":true,"type":"object"}],"description":"Serverseitig berechnete Gesamtsummen (Netto, MwSt., Brutto, Fracht).","title":"Totals"}},"required":["order_no"],"title":"OrderStatusResponse","type":"object"},"PreflightResponse":{"additionalProperties":true,"description":"Ergebnis des sofortigen PDF-Vorab-Datenchecks (`POST /api/wahlplakate/preflight`).","properties":{"is_valid":{"default":true,"description":"Gibt an, ob die Datei drucktechnisch lesbar ist.","title":"Is Valid","type":"boolean"},"file_token":{"description":"Temporäres Token der geprüften Datei (kann bei `POST /api/wahlplakate/order` in `motifs[].fileToken` übergeben werden).","title":"File Token","type":"string"},"filename":{"description":"Ursprünglicher Dateiname.","title":"Filename","type":"string"},"dpi":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"default":null,"description":"Ermittelte effektive Bildauflösung im Zielformat (DPI).","examples":[300],"title":"Dpi"},"dpi_status":{"default":"optimal","description":"Bewertung der Auflösung (`optimal` >= 150 DPI, `ok` >= 100 DPI, `warn` < 100 DPI).","enum":["optimal","ok","warn","low","error"],"title":"Dpi Status","type":"string"},"is_vector":{"default":false,"description":"`true`, wenn die PDF reine Vektorgrafik ohne Rasterbilder enthält.","title":"Is Vector","type":"boolean"},"proof_url":{"description":"URL zum generierten Softproof-Vorschaubild (inkl. eingezeichneter Bohrlöcher / Stanzkontur).","title":"Proof Url","type":"string"}},"required":["file_token","filename","proof_url"],"title":"PreflightResponse","type":"object"},"UploadMotifResponse":{"additionalProperties":true,"description":"Ergebnis des Druckdaten-Uploads zu einem bestehenden Auftrag (`POST /api/wahlplakate/upload/{order_no}/{motif_id}`).","properties":{"is_valid":{"default":true,"description":"Gibt an, ob die hochgeladene Druckdatei gültig ist.","title":"Is Valid","type":"boolean"},"order_no":{"description":"Auftragsnummer.","title":"Order No","type":"string"},"motif_id":{"description":"Motiv-ID (`m1`, `m2`, ...).","title":"Motif Id","type":"string"},"filename":{"description":"Gespeicherter Dateiname.","title":"Filename","type":"string"},"sha256":{"default":"","description":"Kryptografischer SHA-256-Hash der hochgeladenen Druckdatei.","title":"Sha256","type":"string"},"dpi":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"default":null,"description":"Ermittelte Auflösung in DPI.","title":"Dpi"},"dpi_status":{"default":"optimal","description":"Auflösungs-Bewertung.","title":"Dpi Status","type":"string"},"proof_url":{"description":"Tokenisierte URL zum Softproof-Bild dieses Motivs.","title":"Proof Url","type":"string"}},"required":["order_no","motif_id","filename","proof_url"],"title":"UploadMotifResponse","type":"object"},"ApproveOrderRequest":{"additionalProperties":true,"description":"Payload zur verbindlichen Druckfreigabe (`POST /api/wahlplakate/approve/{order_no}`).","properties":{"approver_name":{"default":"","description":"Vollständiger Name der freigebenden Person (wird im kryptografischen Freigabe-Manifest und im Freigabeprotokoll-PDF dokumentiert).","examples":["Max Mustermann"],"title":"Approver Name","type":"string"},"token":{"default":"","description":"Optionales `approval_token` (falls nicht bereits per Header `X-Order-Token` oder Query übergeben).","title":"Token","type":"string"}},"title":"ApproveOrderRequest","type":"object"},"ApproveOrderResponse":{"properties":{"status":{"const":"ok","default":"ok","description":"Status der Druckfreigabe.","title":"Status","type":"string"},"order_no":{"description":"Auftragsnummer.","title":"Order No","type":"string"},"approved":{"default":true,"description":"Bestätigt die verbindliche Druckfreigabe.","title":"Approved","type":"boolean"},"approved_at":{"description":"Zeitstempel der Freigabe.","examples":["02.11.2026 20:30"],"title":"Approved At","type":"string"},"approved_by":{"description":"Name der freigebenden Person.","title":"Approved By","type":"string"},"artwork_status":{"default":"Freigegeben","description":"Neuer Druckdaten-Status.","title":"Artwork Status","type":"string"},"upload_locked":{"default":true,"description":"Bestätigt, dass weitere Datei-Uploads für diesen Auftrag gesperrt sind.","title":"Upload Locked","type":"boolean"},"manifest_sha256":{"description":"SHA-256-Prüfsumme des signierten Freigabe-Manifests.","title":"Manifest Sha256","type":"string"},"manifest_version":{"default":1,"description":"Versionsnummer des Freigabe-Manifests.","title":"Manifest Version","type":"integer"}},"required":["order_no","approved_at","approved_by","manifest_sha256"],"title":"ApproveOrderResponse","type":"object"},"StanzeUploadResponse":{"additionalProperties":true,"properties":{"status":{"default":"ok","description":"Status des Stanzvorlagen-Uploads.","title":"Status","type":"string"},"key":{"description":"Schlüssel der aktualisierten Stanzvorlage.","title":"Key","type":"string"},"filename":{"description":"Gespeicherter Dateiname.","title":"Filename","type":"string"}},"required":["key","filename"],"title":"StanzeUploadResponse","type":"object"},"CustomerRegisterRequest":{"additionalProperties":true,"description":"Registrierung eines neuen Kundenkontos (`POST /api/wahlplakate/customer/register`).","properties":{"email":{"default":"","description":"E-Mail-Adresse des Kundenkontos (Login-Kennung).","examples":["kunde@beispiel.de"],"title":"Email","type":"string"},"password":{"default":"","description":"Passwort (mindestens 8 Zeichen).","examples":["SicheresPasswort2026!"],"title":"Password","type":"string"},"name":{"default":"","description":"Firmenname, Verband oder Vor- und Nachname.","examples":["Muster GmbH"],"title":"Name","type":"string"},"phone":{"default":"","description":"Telefonnummer.","examples":["+49 6051 97200"],"title":"Phone","type":"string"},"addresses":{"description":"Optionale initiale Adressliste für das Adressbuch.","items":{"$ref":"#/components/schemas/AddressItem"},"title":"Addresses","type":"array"}},"required":["email","password","name"],"title":"CustomerRegisterRequest","type":"object"},"CustomerLoginRequest":{"additionalProperties":true,"description":"Anmeldung an einem bestehenden Kundenkonto (`POST /api/wahlplakate/customer/login`).","properties":{"email":{"default":"","description":"Registrierte E-Mail-Adresse.","examples":["kunde@beispiel.de"],"title":"Email","type":"string"},"password":{"default":"","description":"Passwort des Kundenkontos.","examples":["SicheresPasswort2026!"],"title":"Password","type":"string"}},"required":["email","password"],"title":"CustomerLoginRequest","type":"object"},"CustomerProfileInfo":{"additionalProperties":true,"properties":{"customer_id":{"description":"Kundennummer (z. B. `K-1001`).","examples":["K-1001"],"title":"Customer Id","type":"string"},"email":{"description":"E-Mail-Adresse.","title":"Email","type":"string"},"name":{"default":"","description":"Name / Firma.","title":"Name","type":"string"},"phone":{"default":"","description":"Telefonnummer.","title":"Phone","type":"string"},"preferred_payment_method":{"default":"vorkasse","description":"Hinterlegte Standard-Zahlungsart (`vorkasse` oder `rechnung`).","title":"Preferred Payment Method","type":"string"},"addresses":{"description":"Gespeichertes Adressbuch des Kunden.","items":{"additionalProperties":true,"type":"object"},"title":"Addresses","type":"array"},"orders":{"description":"Bisherige Bestellungen des Kunden.","items":{"additionalProperties":true,"type":"object"},"title":"Orders","type":"array"}},"required":["customer_id","email"],"title":"CustomerProfileInfo","type":"object"},"CustomerAuthResponse":{"properties":{"status":{"const":"ok","default":"ok","description":"Status der Authentifizierung.","title":"Status","type":"string"},"token":{"description":"256-Bit Session-Token zur Übergabe im Header `Authorization: Bearer <token>` oder `X-Customer-Token`.","title":"Token","type":"string"},"customer":{"$ref":"#/components/schemas/CustomerProfileInfo","description":"Kundenprofil inklusive Adressbuch und Bestellhistorie."}},"required":["token","customer"],"title":"CustomerAuthResponse","type":"object"},"CustomerProfileResponse":{"properties":{"status":{"const":"ok","default":"ok","description":"Status der Profilabfrage.","title":"Status","type":"string"},"customer":{"$ref":"#/components/schemas/CustomerProfileInfo","description":"Aktuelles Kundenprofil."}},"required":["customer"],"title":"CustomerProfileResponse","type":"object"},"CustomerAddressesUpdateRequest":{"additionalProperties":true,"properties":{"addresses":{"description":"Zu speichernde Adressbuch-Einträge.","items":{"$ref":"#/components/schemas/AddressItem"},"title":"Addresses","type":"array"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional aktualisierte Telefonnummer.","title":"Phone"},"token":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optionales Kunden-Session-Token (empfohlen via Header `Authorization: Bearer`).","title":"Token"}},"title":"CustomerAddressesUpdateRequest","type":"object"},"CustomerProfileUpdateRequest":{"additionalProperties":true,"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Firmenname / Name.","title":"Name"},"person":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Ansprechpartner.","title":"Person"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Telefonnummer.","title":"Phone"},"street":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Straße & Hausnummer.","title":"Street"},"zip":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Postleitzahl.","title":"Zip"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Ort.","title":"City"},"preferred_payment_method":{"anyOf":[{"enum":["vorkasse","rechnung"],"type":"string"},{"type":"null"}],"default":null,"description":"Bevorzugte Zahlungsart.","title":"Preferred Payment Method"},"billing_email":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Abweichende E-Mail für elektronischen Rechnungsversand.","title":"Billing Email"},"vat_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Umsatzsteuer-Identifikationsnummer (z. B. `DE123456789`).","title":"Vat Id"},"cost_center":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Standard-Kostenstelle / Bestellreferenz.","title":"Cost Center"},"new_password":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optionales neues Passwort (mind. 8 Zeichen).","title":"New Password"}},"title":"CustomerProfileUpdateRequest","type":"object"},"HealthResponse":{"properties":{"status":{"const":"ok","default":"ok","description":"Systemstatus.","title":"Status","type":"string"},"version":{"default":"0.6","description":"Aktuelle API-Version.","title":"Version","type":"string"}},"title":"HealthResponse","type":"object"},"AgentAuthSpecResponse":{"additionalProperties":true,"description":"Maschinenlesbare Spezifikation des Agenten-Auth-Konzepts und der 5 Scopes (Schritt 3).","properties":{"status":{"const":"ok","default":"ok","description":"Status.","title":"Status","type":"string"},"step":{"description":"Bezeichnung des Umsetzungsbausteins.","title":"Step","type":"string"},"auth_model":{"additionalProperties":true,"description":"Technisches Auth-Modell (`scoped_agent_api_key`, Präfix `iff_ak_live_`, Header, SHA-256-Speicherung, Einzel-Widerruf).","title":"Auth Model","type":"object"},"agent_types":{"additionalProperties":true,"description":"Definition der zwei Agententypen (`guest_agent` und `customer_agent`) und ihrer zulässigen Scopes.","title":"Agent Types","type":"object"},"scopes":{"description":"Vollständige Definition der 5 Scopes (`katalog:lesen`, `bestellung:entwurf`, `upload`, `bestellung:bestaetigen`, `konditionen:eigene`).","items":{"additionalProperties":true,"type":"object"},"title":"Scopes","type":"array"}},"required":["step","auth_model","agent_types","scopes"],"title":"AgentAuthSpecResponse","type":"object"},"AgentKeyWhoamiResponse":{"description":"Antwort der Key-Selbstprüfung (`/api/wahlplakate/agent-auth/whoami`).","properties":{"status":{"const":"ok","default":"ok","description":"Status.","title":"Status","type":"string"},"agent_key":{"additionalProperties":true,"description":"Metadaten des geprüften Agenten-Keys (`key_id`, `name`, `agent_type`, `customer_id`, `scopes`, `rate_limit_per_min`, `is_active`).","title":"Agent Key","type":"object"}},"required":["agent_key"],"title":"AgentKeyWhoamiResponse","type":"object"},"CatalogResponse":{"additionalProperties":true,"description":"Maschinenlesbarer, versionierter Komplettkatalog inkl. Preislogik (Schritt 6).","properties":{"status":{"const":"ok","default":"ok","description":"Status.","title":"Status","type":"string"},"schema_version":{"default":"1.0.0","description":"Semantische Version des Katalog-JSON-Schemas.","title":"Schema Version","type":"string"},"catalog_version":{"default":"2026.11-v1","description":"Aktuelle Katalog-Version.","title":"Catalog Version","type":"string"},"updated_at":{"default":"","description":"Zeitpunkt der letzten Preisaktualisierung.","title":"Updated At","type":"string"},"currency":{"default":"EUR","description":"Währung (`EUR`).","title":"Currency","type":"string"},"prices_are_net":{"default":true,"description":"Alle Basis- und Staffelpreise sind Netto-Preise zzgl. MwSt.","title":"Prices Are Net","type":"boolean"},"vat_rate_pct":{"default":19.0,"description":"Mehrwertsteuersatz in Prozent (`19.0`).","title":"Vat Rate Pct","type":"number"},"pricing_context":{"additionalProperties":true,"description":"Informationen zum aktiven Preiskontext (`public_list_prices` vs. `customer_agent_conditions`).","title":"Pricing Context","type":"object"},"categories":{"description":"Alle 9 Produktkategorien (`wahlplakate`, `foldup`, `aufsteller`, `hartschaum`, `sk_folie`, `aluverbund`, `kartonwabe`, `pp_wabe`, `pp_hohlkammer`).","items":{"additionalProperties":true,"type":"object"},"title":"Categories","type":"array"},"products":{"description":"Alle 14 Produkte mit Abmessungen, Druckdatenvorgaben, Konfigurationsoptionen, Orientierungen und vollständigen Staffel-/Quadratmeterpreisen.","items":{"additionalProperties":true,"type":"object"},"title":"Products","type":"array"},"lead_time_tiers":{"description":"Lieferzeit-Optionen (`10`, `5`, `3-4`, `2-3` Werktage Mo–Fr) inkl. Express-Faktoren.","items":{"additionalProperties":true,"type":"object"},"title":"Lead Time Tiers","type":"array"},"shipping_rules":{"additionalProperties":true,"description":"Versandkosten-Regeln je Lieferadresse.","title":"Shipping Rules","type":"object"},"calculation_logic":{"additionalProperties":{"type":"string"},"description":"Schritt-für-Schritt-Formel zur exakten Auftragskalkulation.","title":"Calculation Logic","type":"object"}},"required":["pricing_context","categories","products","lead_time_tiers","shipping_rules","calculation_logic"],"title":"CatalogResponse","type":"object"},"McpDraftAddressItem":{"additionalProperties":false,"description":"Einzelne Rechnungs- bzw. Lieferadresse für `bestellung_entwurf`.","properties":{"id":{"default":"a1","description":"Adress-Kennung innerhalb des Auftrags (z. B. 'a1').","title":"Id","type":"string"},"name":{"description":"Organisation, Kreisverband, Firma oder vollständiger Name (z. B. 'KV Gelnhausen').","minLength":2,"title":"Name","type":"string"},"person":{"description":"Ansprechpartner Vor- und Nachname (z. B. 'Max Mustermann').","minLength":2,"title":"Person","type":"string"},"street":{"description":"Straße und Hausnummer (z. B. 'Schönauer Weg 25').","minLength":3,"title":"Street","type":"string"},"zip":{"description":"5-stellige deutsche Postleitzahl (z. B. '63571').","pattern":"^\\d{5}$","title":"Zip","type":"string"},"city":{"description":"Ort (z. B. 'Gelnhausen').","minLength":2,"title":"City","type":"string"}},"required":["name","person","street","zip","city"],"title":"McpDraftAddressItem","type":"object"},"McpDraftDistributionRow":{"additionalProperties":false,"description":"Liefermengen-Zuordnung eines Motivs zu einer Adresse.","properties":{"addr":{"default":"a1","description":"Referenz auf die Adress-ID aus `addresses` (z. B. 'a1').","title":"Addr","type":"string"},"qty":{"description":"Stückzahl für diese Lieferadresse (>= 1).","minimum":1,"title":"Qty","type":"integer"}},"required":["qty"],"title":"McpDraftDistributionRow","type":"object"},"McpDraftMotifItem":{"additionalProperties":false,"description":"Einzelnes Druckmotiv / Produktposition für `bestellung_entwurf`.","properties":{"id":{"default":"m1","description":"Motiv-Kennung innerhalb des Auftrags (z. B. 'm1').","title":"Id","type":"string"},"name":{"default":"Motiv 1","description":"Bezeichnung des Motivs (z. B. 'Kandidatenplakat A1').","title":"Name","type":"string"},"format":{"default":"A1","description":"Produktformat ('A1', 'A0', 'FOLDUP_65', 'FOLDUP_85', 'FOLDUP_100', 'AUFSTELLER_A1', 'AUFSTELLER_A3', 'AUFSTELLER_QUER', 'HARTSCHAUM', 'SK_FOLIE', 'ALUVERBUND', 'KARTONWABE', 'PP_WABE', 'PP_HOHLKAMMER').","title":"Format","type":"string"},"orient":{"default":"hoch","description":"Ausrichtung ('hoch' oder 'quer') bzw. FoldUp-Variante ('basis', 'a6', 'a5', 'vk', ...).","title":"Orient","type":"string"},"billing":{"default":"a1","description":"Rechnungsadress-ID aus `addresses` (Standard: 'a1').","title":"Billing","type":"string"},"qty":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Gesamtstückzahl dieses Motivs (falls nur 1 Lieferadresse verwendet wird; alternativ `rows` angeben).","title":"Qty"},"rows":{"anyOf":[{"items":{"$ref":"#/components/schemas/McpDraftDistributionRow"},"type":"array"},{"type":"null"}],"default":null,"description":"Optionaler Verteilplan auf eine oder mehrere Lieferadressen (`[{\"addr\": \"a1\", \"qty\": 200}]`).","title":"Rows"},"width_mm":{"anyOf":[{"minimum":50,"type":"number"},{"type":"null"}],"default":null,"description":"Optional bei 'HARTSCHAUM', 'SK_FOLIE', 'ALUVERBUND', 'KARTONWABE', 'PP_WABE', 'PP_HOHLKAMMER': Wunschbreite in mm (Standard: 594 mm).","title":"Width Mm"},"height_mm":{"anyOf":[{"minimum":50,"type":"number"},{"type":"null"}],"default":null,"description":"Optional bei 'HARTSCHAUM', 'SK_FOLIE', 'ALUVERBUND', 'KARTONWABE', 'PP_WABE', 'PP_HOHLKAMMER': Wunschhöhe in mm (Standard: 841 mm).","title":"Height Mm"},"staerke_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Optional bei 'HARTSCHAUM' (2, 3, 5, 10 mm), 'ALUVERBUND' (2, 3 mm), 'KARTONWABE' (10, 16 mm), 'PP_WABE' (3.3 mm) oder 'PP_HOHLKAMMER' (3 mm): Materialstärke in mm.","title":"Staerke Mm"},"farbe":{"anyOf":[{"enum":["weiss","transparent","weiss_kraft"],"type":"string"},{"type":"null"}],"default":null,"description":"Optional bei 'SK_FOLIE' ('weiss' oder 'transparent') bzw. 'KARTONWABE' ('weiss_kraft').","title":"Farbe"},"kleber":{"anyOf":[{"enum":["abloesbar","permanent"],"type":"string"},{"type":"null"}],"default":null,"description":"Optional bei 'SK_FOLIE': Kleber ('abloesbar' oder 'permanent').","title":"Kleber"},"einsatz":{"anyOf":[{"enum":["innen","aussen"],"type":"string"},{"type":"null"}],"default":null,"description":"Optional bei 'SK_FOLIE': Einsatzbereich ('innen' für Innen/Hinterglas oder 'aussen').","title":"Einsatz"},"druckseiten":{"anyOf":[{"enum":["4/0","4/4","0/0"],"type":"string"},{"type":"null"}],"default":null,"description":"Optional bei KALK-Produkten: '4/0' einseitig, '4/4' beidseitig (bei SK_FOLIE inkl. 3× Weiß-Sperrschicht), '0/0' unbedruckt.","title":"Druckseiten"},"zuschnitt":{"anyOf":[{"enum":["rechteck","rechteck_gerundet","konturschnitt"],"type":"string"},{"type":"null"}],"default":null,"description":"Optional bei KALK-Produkten: 'rechteck', 'rechteck_gerundet' oder 'konturschnitt'.","title":"Zuschnitt"},"laminierung":{"anyOf":[{"enum":["ohne","matt","glaenzend"],"type":"string"},{"type":"null"}],"default":null,"description":"Optional bei 'SK_FOLIE': Schutzlaminat ('ohne', 'matt', 'glaenzend').","title":"Laminierung"},"bohrungen":{"anyOf":[{"enum":["ohne","4_ecken","6_bohrungen","10_loch","10","individuell"],"type":"string"},{"type":"null"}],"default":null,"description":"Optional bei Plattenprodukten ('HARTSCHAUM', 'ALUVERBUND', 'KARTONWABE', 'PP_WABE', 'PP_HOHLKAMMER'): Bohrungen ('ohne', '4_ecken', '6_bohrungen', '10_loch' bei PP_HOHLKAMMER, 'individuell').","title":"Bohrungen"},"material_thickness_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Optional bei generischen Plattenprodukten (Alias für staerke_mm): Materialstärke in mm (z. B. 3, 5, 10).","title":"Material Thickness Mm"},"custom_width_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Optional bei generischen Wunschformaten (Alias für width_mm): Breite in mm.","title":"Custom Width Mm"},"custom_height_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Optional bei generischen Wunschformaten (Alias für height_mm): Höhe in mm.","title":"Custom Height Mm"},"cut_mode":{"anyOf":[{"enum":["standard_stanze","4stg_formatschnitt","freiform_konturschnitt"],"type":"string"},{"type":"null"}],"default":null,"description":"Optionaler Zuschnitt-/Stanzmodus ('standard_stanze', '4stg_formatschnitt' oder 'freiform_konturschnitt').","title":"Cut Mode"}},"title":"McpDraftMotifItem","type":"object"},"McpBestellungEntwurfInput":{"additionalProperties":false,"description":"Input-Schema für das MCP-Tool `bestellung_entwurf` (Schritt 11 – Phase 1: Unverbindlicher Bestell-Entwurf).","properties":{"email":{"description":"Gültige Rechnungs- und Bestätigungs-E-Mail-Adresse des Kunden.","title":"Email","type":"string"},"phone":{"description":"Telefonnummer des Kunden für Rückfragen und Speditionsavis (mind. 5 Ziffern).","title":"Phone","type":"string"},"addresses":{"description":"Mindestens eine vollständige Rechnungs-/Lieferadresse (Name, Ansprechpartner, Straße, 5-stellige PLZ, Ort).","items":{"$ref":"#/components/schemas/McpDraftAddressItem"},"minItems":1,"title":"Addresses","type":"array"},"motifs":{"description":"Mindestens ein Druckmotiv bzw. eine Produktposition mit Format und Stückzahl.","items":{"$ref":"#/components/schemas/McpDraftMotifItem"},"minItems":1,"title":"Motifs","type":"array"},"lt_tier":{"default":"10","description":"Lieferzeit-Option: '10' (Standard 10 Werktage +0 %), '5' (Schnell 5 Werktage +20 %), '3-4' (Priority 3–4 Werktage +30 %), '2-3' (Express 2–3 Werktage +100 %).","enum":["10","5","3-4","2-3"],"title":"Lt Tier","type":"string"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optionale Bestell- oder Lieferhinweise.","title":"Notes"},"po_number":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optionale Bestell-/Referenznummer des Kunden.","title":"Po Number"}},"required":["email","phone","addresses","motifs"],"title":"McpBestellungEntwurfInput","type":"object"},"McpBestellungBestaetigenInput":{"additionalProperties":false,"description":"Input-Schema für das MCP-Tool `bestellung_bestaetigen` bzw. `bestellung_anlegen` (Schritt 11 – Phase 2: Verbindliche Bestellung mit Zustimmungs-Nachweis).","properties":{"draft_id":{"description":"Die `draft_id` (z. B. 'drf_...') aus Phase 1 (`bestellung_entwurf`). Ohne vorherigen Entwurf ist keine Bestellung möglich.","title":"Draft Id","type":"string"},"idempotency_key":{"description":"Eindeutiger Idempotenz-Schlüssel gegen Doppel-Sends (z. B. UUID). Wiederholte Aufrufe mit demselben Schlüssel erzeugen keinen zweiten Auftrag.","maxLength":128,"minLength":4,"title":"Idempotency Key","type":"string"},"confirmed_by_user":{"description":"Muss zwingend `true` sein: Belegt, dass der menschliche Kunde dem Gesamtpreis und der Zahlungsart Vorkasse ausdrücklich zugestimmt hat.","title":"Confirmed By User","type":"boolean"},"confirmed_gross_total":{"description":"Vom Kunden bestätigter Brutto-Gesamtbetrag in EUR (muss exakt mit `totals.gross_total` aus `bestellung_entwurf` übereinstimmen).","exclusiveMinimum":0,"title":"Confirmed Gross Total","type":"number"},"consent_statement":{"description":"Belegbarer Nachweis/Wortlaut der Kunden-Zustimmung (mind. 5 Zeichen, z. B. Zitat der Nutzerfreigabe oder AP2-Consent-Referenz).","minLength":5,"title":"Consent Statement","type":"string"},"consent_protocol":{"default":"explicit_user_confirmation","description":"Art des Zustimmungs-Nachweises (z. B. 'explicit_user_confirmation' oder 'AP2').","title":"Consent Protocol","type":"string"}},"required":["draft_id","idempotency_key","confirmed_by_user","confirmed_gross_total","consent_statement"],"title":"McpBestellungBestaetigenInput","type":"object"}},"securitySchemes":{"AgentScopedApiKey":{"type":"apiKey","in":"header","name":"X-Agent-Key","description":"Widerrufbarer, mit Scopes versehener Agenten-API-Key (`iff_ak_live_<key_id>_<secret>`). Kann auch via `Authorization: Bearer iff_ak_live_...` übergeben werden. Verfügbare Scopes: `katalog:lesen`, `bestellung:entwurf`, `upload`, `bestellung:bestaetigen`, `konditionen:eigene` (nur für `customer_agent`)."},"CustomerBearerToken":{"type":"http","scheme":"bearer","description":"Delegiertes Kunden-Session-Token (aus `/api/wahlplakate/customer/login` oder `/register`) oder zweckgebundenes Auftrags-Token (`upload_token` / `approval_token`)."},"CustomerTokenHeader":{"type":"apiKey","in":"header","name":"X-Customer-Token","description":"Alternativer Header für das Kunden-Session-Token."},"OrderTokenHeader":{"type":"apiKey","in":"header","name":"X-Order-Token","description":"Zweckgebundenes 256-Bit Auftrags-Token (`upload_token` oder `approval_token`) für Auftragsabruf, PDF-Downloads, Upload und Druckfreigabe."},"OrderTokenQuery":{"type":"apiKey","in":"query","name":"token","description":"Auftrags-Token als Query-Parameter für direkte PDF-/Bild-Links (NICHT zulässig für `/api/wahlplakate/customer/me`)."},"CustomerSessionCookie":{"type":"apiKey","in":"cookie","name":"iffland_customer_session","description":"HttpOnly-/Secure-Session-Cookie für Browser-Clients."}}},"tags":[{"name":"Katalog & Preise","description":"Abruf der aktuellen Staffelpreise (Wahlplakate DIN A1/A0, FoldUp-Displays, A-Aufsteller), Motivwechsel- & Versandpauschalen sowie der offiziellen 1:1-Stanzvorlagen (PDF/ZIP)."},{"name":"Bestellung & Auftragsstatus","description":"Verbindliche Auftragserfassung (Einzel- oder Sammelauftrag mit Verteilplan), Abfrage des Echtzeit-Auftragsstatus sowie Download von Vorausrechnung, Bestellbestätigung, Auftragsbestätigung (AB), Freigabeprotokoll und IWS-JobTicket."},{"name":"Druckdaten, Preflight & Freigabe","description":"Automatisierter PDF-Vorab-Datencheck (DPI-Auflösung, Format, 10-Loch-Bohrbild / Stanzkontur), nachträglicher Druckdaten-Upload pro Motiv und verbindliche Druckfreigabe durch den Kunden."},{"name":"Kundenkonto & Authentifizierung","description":"Registrierung, Login, Logout, Profil- und Adressbuchverwaltung für wiederkehrende Kunden und authentifizierte Kunden-Agenten (Token via `Authorization: Bearer` oder `X-Customer-Token`)."},{"name":"System & Health","description":"Verfügbarkeits- und Versionsprüfung der IFFLAND DIREKT-Plattform."}]}