{"openapi":"3.1.0","info":{"title":"BasketBooster Recommender API","description":"Product recommendations, search and Shop-the-Look for online stores. This reference covers the public integration surface: the /v1 widget API (publishable pk_ keys), catalog push and the integration API (X-API-Key). Guides: /llms.txt · MCP server for AI assistants: /mcp","version":"3.0.0"},"paths":{"/v1/widget-config":{"options":{"tags":["widget"],"summary":"Widget Preflight","operationId":"widget_preflight_v1_widget_config_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"get":{"tags":["widget"],"summary":"Get Widget Config Public","description":"Resolved appearance config for a widget, keyed by the publishable key. Preflight-free\n(key + type in the query string). Returns defaults for an unknown/unset type so the\nwidget always has something to render with.","operationId":"get_widget_config_public_v1_widget_config_get","parameters":[{"name":"type","in":"query","required":false,"schema":{"type":"string","default":"recs","title":"Type"}},{"name":"key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"}},{"name":"x-pub-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Pub-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/shop-the-look/analyze":{"options":{"tags":["widget"],"summary":"Widget Preflight","operationId":"widget_preflight_v1_shop_the_look_analyze_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["widget"],"summary":"Widget Shop The Look Analyze","description":"On-the-fly Shop-the-Look: a shopper uploads a photo, we detect → segment → match\nand return hotspots without persisting. Posts base64 as text/plain (preflight-free).","operationId":"widget_shop_the_look_analyze_v1_shop_the_look_analyze_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"}},{"name":"x-pub-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Pub-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/looks":{"options":{"tags":["widget"],"summary":"Widget Preflight","operationId":"widget_preflight_v1_looks_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"get":{"tags":["widget"],"summary":"Widget Looks","description":"Published Shop-the-Look for a product page (non-Shopify storefront widget).\n\nReturns the most recent published look whose anchor matches `item_id`, or null.","operationId":"widget_looks_v1_looks_get","parameters":[{"name":"item_id","in":"query","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"}},{"name":"x-pub-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Pub-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/search/image":{"options":{"tags":["widget"],"summary":"Widget Preflight","operationId":"widget_preflight_v1_search_image_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["widget"],"summary":"Widget Search Image","description":"Search by image (upload/snap a photo → visually similar products). The widget\nposts a base64 image as a text/plain JSON body to stay preflight-free, mirroring\n/v1/events. The TypeSense admin key never leaves the backend.","operationId":"widget_search_image_v1_search_image_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"}},{"name":"x-pub-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Pub-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/search":{"options":{"tags":["widget"],"summary":"Widget Preflight","operationId":"widget_preflight_v1_search_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"get":{"tags":["widget"],"summary":"Widget Search","description":"Typo-tolerant keyword search (non-Shopify storefront widget). Preflight-free:\nkey + params live in the query string, so the browser sends no preflight.","operationId":"widget_search_v1_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"num","in":"query","required":false,"schema":{"type":"integer","default":12,"title":"Num"}},{"name":"in_stock","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"In Stock"}},{"name":"key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"}},{"name":"x-pub-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Pub-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orders":{"options":{"tags":["widget"],"summary":"Widget Preflight","operationId":"widget_preflight_v1_orders_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["widget"],"summary":"Sync a single order","description":"Ingest one completed order in a single call — the real-time complement to the\nCSV order-history upload. Each line item becomes a `buy` signal for the\nrecommendation engine and the co-purchase (Frequently-Bought-Together) model,\nplus an event-log row for revenue attribution.\n\nIdempotent per `order_id`: redeliveries within 7 days are acknowledged with\n`duplicate: true` and ingested nothing. Never metered or billing-degraded —\nlike `/v1/events`, order data continuity always wins.","operationId":"sync_order_v1_orders_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"}},{"name":"x-pub-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Pub-Key"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/events":{"options":{"tags":["widget"],"summary":"Widget Preflight","operationId":"widget_preflight_v1_events_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["widget"],"summary":"Post Event","operationId":"post_event_v1_events_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"}},{"name":"x-pub-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Pub-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/trending":{"options":{"tags":["widget"],"summary":"Widget Preflight","operationId":"widget_preflight_v1_trending_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"get":{"tags":["widget"],"summary":"Get Trending","description":"Non-personalised \"trending now\" list — the engine's ranking (popular/trending/hot per\nthe merchant's config), shaped by category merch rules, with catalog backfill. Preflight-\nfree (key + num in the query string). `user_id` (the widget session id) is only used\nfor the A/B holdout — trending itself is not personalised.","operationId":"get_trending_v1_trending_get","parameters":[{"name":"num","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Num"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"}},{"name":"x-pub-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Pub-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/recommendations":{"options":{"tags":["widget"],"summary":"Widget Preflight","operationId":"widget_preflight_v1_recommendations_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"get":{"tags":["widget"],"summary":"Get Recommendations","operationId":"get_recommendations_v1_recommendations_get","parameters":[{"name":"item_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Item Id"}},{"name":"item_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Item Ids"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"customer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer Id"}},{"name":"num","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Num"}},{"name":"source","in":"query","required":false,"schema":{"type":"string","default":"mix","title":"Source"}},{"name":"key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"}},{"name":"x-pub-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Pub-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/forecast/summary":{"get":{"tags":["widget"],"summary":"Store demand forecast","description":"The store-level daily demand forecast (secret API key or pk_).\n\n`target_mode` says what `p50` counts: `units` or `order_lines` (stores whose\norder stream carries no per-line quantity). Populated by the nightly run —\nempty until the merchant enables the Demand add-on in the dashboard.","operationId":"forecast_summary_v1_forecast_summary_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"}},{"name":"x-pub-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Pub-Key"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/forecast/items/{item_id}":{"get":{"tags":["widget"],"summary":"Item demand forecast","description":"One product's daily demand forecast with the p10–p90 band and the method\nthat produced it (`lgbm` model vs statistical fallback).","operationId":"forecast_item_v1_forecast_items__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"}},{"name":"x-pub-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Pub-Key"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/items":{"post":{"tags":["catalog"],"summary":"Upsert Items Endpoint","operationId":"upsert_items_endpoint_v1_items_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/items/{item_id}":{"delete":{"tags":["catalog"],"summary":"Delete Item Endpoint","operationId":"delete_item_endpoint_v1_items__item_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integration/widget-config":{"get":{"tags":["integration"],"summary":"Integration Get Widget Config","operationId":"integration_get_widget_config_integration_widget_config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"type","in":"query","required":false,"schema":{"type":"string","default":"recs","title":"Type"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["integration"],"summary":"Integration Put Widget Config","description":"Partial update: provided settings keys are merged over the saved config.\n\nUnlike the dashboard designer (which always submits the full form), plugins\ntypically change one thing (e.g. layout), so unset fields must not reset the\nrest of the appearance.","operationId":"integration_put_widget_config_integration_widget_config_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"type","in":"query","required":false,"schema":{"type":"string","default":"recs","title":"Type"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationWidgetConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integration/recommender-settings":{"get":{"tags":["integration"],"summary":"Integration Get Recommender Settings","operationId":"integration_get_recommender_settings_integration_recommender_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["integration"],"summary":"Integration Put Recommender Settings","description":"Merchant recommendation knobs, settable from a store plugin.\n\nMirrors the dashboard: rec_num is the widget's default count (1–20, PATCH\n/recommender/config); allow_repeat_recommendations is whether a customer's\nalready-bought items may be recommended again (same EngineConfig field the\ntuning panel writes — Gorse applies it as enable_replacement, hot-applied on\nthe live instance).","operationId":"integration_put_recommender_settings_integration_recommender_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationRecommenderSettings"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integration/connect":{"post":{"tags":["integration"],"summary":"Integration Connect","description":"Plugin self-identification: called by a store plugin on key save / test connection.\n\nRecords which platform the store runs (so the dashboard setup hub can skip the\nmanual-catalog steps) and stamps the first-connected time. Never overwrites a\n*different* explicitly chosen platform — a merchant who picked \"custom\" in the\ndashboard keeps that choice unless they change it there.","operationId":"integration_connect_integration_connect_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ConnectRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integration/engines/init":{"post":{"tags":["integration"],"summary":"Integration Init Engines","description":"Provision the account's recommendation engines (idempotent).\n\nMirrors the dashboard's /recommender/engines/init so store plugins can\ncomplete onboarding without a dashboard login.","operationId":"integration_init_engines_integration_engines_init_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/EnginesInitRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integration/sync-engines":{"post":{"tags":["integration"],"summary":"Integration Sync Engines","description":"Queue a full push of the catalog to the account's recommendation engine.","operationId":"integration_sync_engines_integration_sync_engines_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integration/train":{"post":{"tags":["integration"],"summary":"Integration Train","description":"Manually trigger engine training (for testing / after a bulk import).","operationId":"integration_train_integration_train_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"engine","in":"query","required":false,"schema":{"enum":["buy","browse","both","complementary"],"type":"string","default":"both","title":"Engine"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integration/status":{"get":{"tags":["integration"],"summary":"Integration Status","description":"Compact recommender status for plugin settings pages and the Shopify app.","operationId":"integration_status_integration_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/orders/upload":{"post":{"tags":["orders"],"summary":"Upload Orders","operationId":"upload_orders_orders_upload_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_orders_orders_upload_post"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/widget/v1/search-{store_domain}.js":{"get":{"tags":["widget"],"summary":"Search Widget Js","operationId":"search_widget_js_widget_v1_search__store_domain__js_get","parameters":[{"name":"store_domain","in":"path","required":true,"schema":{"type":"string","title":"Store Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/widget/v1/look-{store_domain}.js":{"get":{"tags":["widget"],"summary":"Look Widget Js","operationId":"look_widget_js_widget_v1_look__store_domain__js_get","parameters":[{"name":"store_domain","in":"path","required":true,"schema":{"type":"string","title":"Store Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/widget/v1/{store_domain}.js":{"get":{"tags":["widget"],"summary":"Widget Js","operationId":"widget_js_widget_v1__store_domain__js_get","parameters":[{"name":"store_domain","in":"path","required":true,"schema":{"type":"string","title":"Store Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/plugin/basketbooster-recommender.zip":{"get":{"tags":["widget"],"summary":"Woocommerce Plugin Zip","description":"The current WooCommerce plugin, zipped from this image's sources — linked\nfrom the dashboard setup hub and the public install docs.","operationId":"woocommerce_plugin_zip_plugin_basketbooster_recommender_zip_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/llms.txt":{"get":{"tags":["docs"],"summary":"Llms Txt","description":"Index of our AI-readable documentation (llms.txt convention).","operationId":"llms_txt_llms_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/docs-md/{slug}.md":{"get":{"tags":["docs"],"summary":"Doc Markdown","description":"One documentation page as raw markdown.","operationId":"doc_markdown_docs_md__slug__md_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Serve Index","operationId":"serve_index__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Body_upload_orders_orders_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_orders_orders_upload_post"},"ConnectRequest":{"properties":{"platform":{"type":"string","enum":["woocommerce","opencart","prestashop","magento","custom"],"title":"Platform","default":"woocommerce"},"plugin_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plugin Version"},"store_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Store Url"}},"type":"object","title":"ConnectRequest"},"EnginesInitRequest":{"properties":{"store_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Store Url"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"}},"type":"object","title":"EnginesInitRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IntegrationRecommenderSettings":{"properties":{"rec_num":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rec Num"},"allow_repeat_recommendations":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Repeat Recommendations"}},"type":"object","title":"IntegrationRecommenderSettings"},"IntegrationWidgetConfigUpdate":{"properties":{"settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Settings"},"custom_css":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Css"},"scoped":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Scoped"}},"type":"object","title":"IntegrationWidgetConfigUpdate"},"ItemIn":{"properties":{"id":{"type":"string","title":"Id"},"sku":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sku"},"title":{"type":"string","title":"Title","default":""},"product_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Url"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price"},"availability":{"type":"string","title":"Availability","default":"in_stock"},"stock_qty":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Stock Qty"},"cost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cost"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories","default":[]},"category_ids":{"items":{"type":"string"},"type":"array","title":"Category Ids","default":[]},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"available_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Available From"},"available_until":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Available Until"}},"type":"object","required":["id"],"title":"ItemIn","description":"One catalog item. Undeclared fields are dropped, so every column the\ningestion layer understands has to be listed here — `stock_qty` and the\navailability window arrive from the Woo plugin, `sku` from any feed that\nkeys products by a code of its own."},"ItemsRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ItemIn"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"ItemsRequest"},"OrderIn":{"properties":{"order_id":{"type":"string","maxLength":255,"minLength":1,"title":"Order Id"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id","description":"Customer id, if known."},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id","description":"Widget session id — links the order to the browse session."},"currency":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Currency"},"items":{"items":{"$ref":"#/components/schemas/OrderLineIn"},"type":"array","maxItems":100,"minItems":1,"title":"Items"}},"type":"object","required":["order_id","items"],"title":"OrderIn"},"OrderLineIn":{"properties":{"item_id":{"type":"string","maxLength":255,"minLength":1,"title":"Item Id"},"quantity":{"type":"integer","minimum":1.0,"title":"Quantity","default":1},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price","description":"Unit price."},"total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total","description":"Line revenue; defaults to price × quantity."}},"type":"object","required":["item_id"],"title":"OrderLineIn"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}