{"openapi":"3.1.0","info":{"title":"Agenten-API","version":"v1","description":"Schreibgeschützte Produktdaten für Kaufentscheidungen. Bestellungen laufen nur über die Website. Rate-Limit standardmäßig 60 Anfragen pro Minute."},"servers":[{"url":"https://www.meinbwshop.de"}],"paths":{"/agent-api/v1/products":{"get":{"operationId":"searchProducts","summary":"Produkte suchen","description":"Volltext und Filter über die bestehende Shop-Suche. material ist nicht filterbar. in_stock meint lieferbar inklusive Vorbestellung. price_from ist der niedrigste und price_to der höchste aktuelle Verkaufspreis der Varianten, brutto inkl. MwSt. Dieselbe Spanne filtert und sortiert. Ein Treffer passt, wenn sein Preisbereich den Filter schneidet. min_price über max_price ergibt 400. price_asc sortiert nach price_from, price_desc nach price_to, bei Gleichstand nach group_id. Nur sort=relevance darf nach Textrelevanz ordnen.","parameters":[{"$ref":"#/components/parameters/lang"},{"name":"q","in":"query","schema":{"type":"string","maxLength":200}},{"name":"category","in":"query","schema":{"type":"string"},"description":"Slug oder ID, kommagetrennt"},{"name":"color","in":"query","schema":{"type":"string"}},{"name":"brand","in":"query","schema":{"type":"string"}},{"name":"min_price","in":"query","schema":{"type":"number"},"description":"Inklusiv. Die Gruppe passt, wenn price_to mindestens diesem Betrag entspricht."},{"name":"max_price","in":"query","schema":{"type":"number"},"description":"Inklusiv. Die Gruppe passt, wenn price_from höchstens diesem Betrag entspricht. Liegt min_price darüber, ist die Anfrage 400."},{"name":"in_stock","in":"query","schema":{"type":"boolean"}},{"name":"sort","in":"query","schema":{"type":"string","enum":["relevance","price_asc","price_desc","newest"]},"description":"price_asc sortiert nach price_from aufsteigend, price_desc nach price_to absteigend, Gleichstand nach group_id. relevance bleibt die Textreihenfolge, der Preisfilter gilt davor."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":50,"default":20}},{"name":"cursor","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Antwort","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductSearch"}}}},"400":{"description":"Fehler nach RFC 9457","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Fehler nach RFC 9457","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/agent-api/v1/products/{sku}":{"get":{"operationId":"getProduct","summary":"Produktgruppe laden","description":"Varianten-SKU oder Vater-SKU. Öffentliche Bewertungen und Zubehör-SKUs, keine Kundendaten. Varianten-stock enthält quantity_available, stock_capped und low_stock. Im Produktfeed heißt das Feld stock.stock_capped; stock.capped ist deprecated.","parameters":[{"$ref":"#/components/parameters/lang"},{"name":"sku","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Antwort","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductDetail"}}}},"400":{"description":"Fehler nach RFC 9457","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Fehler nach RFC 9457","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Fehler nach RFC 9457","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/agent-api/v1/availability":{"get":{"operationId":"getAvailability","summary":"Bestand prüfen","description":"Echtzeit-Lesezugriff. quantity_available ist gekappt. stock_capped und low_stock haben dieselbe Bedeutung wie im Produktfeed. can_fulfill nutzt den echten Bestand und bei leerem Lager die Vorbestellmenge. backorder_possible ist immer false. Im Feed ist stock.capped deprecated.","parameters":[{"$ref":"#/components/parameters/lang"},{"name":"sku","in":"query","required":true,"schema":{"type":"string"}},{"name":"qty","in":"query","schema":{"type":"integer","minimum":1,"maximum":999}}],"responses":{"200":{"description":"Antwort","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Availability"}}}},"400":{"description":"Fehler nach RFC 9457","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Fehler nach RFC 9457","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/agent-api/v1/shipping-quote":{"get":{"operationId":"getShippingQuote","summary":"Versandkosten anfragen","description":"Dieselbe Warenkorb-Versandlogik. PLZ wird nicht berechnet. Selbstabholung entfällt. delivery_days ist nur die Transitzeit der Versandklasse. Unbekannte SKU ergibt 422.","parameters":[{"$ref":"#/components/parameters/lang"},{"name":"country","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":2}},{"name":"zip","in":"query","schema":{"type":"string"}},{"name":"items","in":"query","required":true,"schema":{"type":"string"},"description":"SKU:Menge, kommagetrennt"}],"responses":{"200":{"description":"Antwort","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShippingQuote"}}}},"400":{"description":"Fehler nach RFC 9457","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Fehler nach RFC 9457","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Fehler nach RFC 9457","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/agent-api/v1/policies":{"get":{"operationId":"getPolicies","summary":"Rechtstexte und Verkäufer","description":"Texte aus den Footer-Seiten des Shops. section liefert den Plaintext in full_text.","parameters":[{"$ref":"#/components/parameters/lang"},{"name":"section","in":"query","schema":{"type":"string","enum":["return","withdrawal","shipping","payment","terms"]}}],"responses":{"200":{"description":"Antwort","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Policies"}}}},"400":{"description":"Fehler nach RFC 9457","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Fehler nach RFC 9457","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}}},"components":{"parameters":{"lang":{"name":"lang","in":"query","schema":{"type":"string","enum":["de","en","es","pl","fr"],"default":"de"}}},"schemas":{"Problem":{"type":"object","required":["type","title","status","detail","instance"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}}},"Money":{"type":"object","properties":{"amount":{"type":"number"},"currency":{"type":"string","const":"EUR"}}},"AgentStock":{"type":"object","properties":{"quantity_available":{"type":"integer","minimum":0,"description":"Gekappter Bestand."},"stock_capped":{"type":"boolean","description":"true, wenn der echte Bestand über der Kappung liegt."},"low_stock":{"type":"boolean","description":"true, wenn der ungekappte Bestand größer als 0 und höchstens der Schwellenwert ist."}}},"FeedStock":{"description":"Bestand im Produktfeed. stock_capped ist der Feldname. capped ist deprecated und wird später entfernt.","allOf":[{"$ref":"#/components/schemas/AgentStock"},{"type":"object","properties":{"capped":{"type":"boolean","deprecated":true,"description":"deprecated, spätere Entfernung. Alias von stock_capped."}}}]},"ProductSearch":{"type":"object"},"ProductDetail":{"type":"object","properties":{"variants":{"type":"array","items":{"type":"object","properties":{"stock":{"$ref":"#/components/schemas/AgentStock"}}}}}},"Availability":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"quantity_available":{"type":"integer","minimum":0},"stock_capped":{"type":"boolean"},"low_stock":{"type":"boolean","description":"Dieselbe Definition wie im Produktfeed."}}}}}},"ShippingQuote":{"type":"object"},"Policies":{"type":"object"}}}}