[{"data":1,"prerenderedAt":3885},["ShallowReactive",2],{"nav-en":3,"learn-chrome-ph":592,"doc-\u002Fph\u002Fdocs\u002Fai-and-api\u002Fapi\u002Frecommendations":690,"mdc--dp0obm-key":3874},[4],{"title":5,"path":6,"stem":7,"children":8,"page":11},"Docs","\u002Fdocs","docs",[9,81,269,470,553],{"title":10,"draft":11,"path":12,"stem":13,"children":14},"Overview",false,"\u002Fdocs\u002Foverview","docs\u002F01.overview\u002Findex",[15,16,41,66],{"title":10,"path":12,"stem":13,"draft":11},{"title":17,"draft":11,"path":18,"stem":19,"children":20,"page":11},"Get started","\u002Fdocs\u002Foverview\u002Fget-started","docs\u002F01.overview\u002F01.get-started",[21,26,31,36],{"title":22,"path":23,"stem":24,"draft":11,"icon":25},"What is DataGlass","\u002Fdocs\u002Foverview\u002Fget-started\u002Fwhat-is-dataglass","docs\u002F01.overview\u002F01.get-started\u002F01.what-is-dataglass","i-material-symbols-info-rounded",{"title":27,"path":28,"stem":29,"draft":11,"icon":30},"Quick start","\u002Fdocs\u002Foverview\u002Fget-started\u002Fquick-start","docs\u002F01.overview\u002F01.get-started\u002F02.quick-start","i-material-symbols-rocket-launch-rounded",{"title":32,"path":33,"stem":34,"draft":11,"icon":35},"Supported platforms","\u002Fdocs\u002Foverview\u002Fget-started\u002Fsupported-platforms","docs\u002F01.overview\u002F01.get-started\u002F03.supported-platforms","i-material-symbols-grid-view-rounded",{"title":37,"path":38,"stem":39,"draft":11,"icon":40},"Connecting shops","\u002Fdocs\u002Foverview\u002Fget-started\u002Fconnecting-shops","docs\u002F01.overview\u002F01.get-started\u002F04.connecting-shops","i-material-symbols-link-rounded",{"title":42,"draft":11,"path":43,"stem":44,"children":45,"page":11},"Foundations","\u002Fdocs\u002Foverview\u002Ffoundations","docs\u002F01.overview\u002F02.foundations",[46,51,56,61],{"title":47,"path":48,"stem":49,"draft":11,"icon":50},"This shop vs Unified view","\u002Fdocs\u002Foverview\u002Ffoundations\u002Fthis-shop-vs-unified","docs\u002F01.overview\u002F02.foundations\u002F01.this-shop-vs-unified","i-material-symbols-layers-rounded",{"title":52,"path":53,"stem":54,"draft":11,"icon":55},"COGS and their role","\u002Fdocs\u002Foverview\u002Ffoundations\u002Fcogs-and-their-role","docs\u002F01.overview\u002F02.foundations\u002F02.cogs-and-their-role","i-material-symbols-payments-rounded",{"title":57,"path":58,"stem":59,"draft":11,"icon":60},"What's in your margin","\u002Fdocs\u002Foverview\u002Ffoundations\u002Fideal-vs-realized-margin","docs\u002F01.overview\u002F02.foundations\u002F03.ideal-vs-realized-margin","i-material-symbols-compare-arrows-rounded",{"title":62,"path":63,"stem":64,"draft":11,"icon":65},"True ROAS","\u002Fdocs\u002Foverview\u002Ffoundations\u002Ftrue-roas","docs\u002F01.overview\u002F02.foundations\u002F04.true-roas","i-material-symbols-ad-group-rounded",{"title":67,"draft":11,"path":68,"stem":69,"children":70,"page":11},"Explore","\u002Fdocs\u002Foverview\u002Fexplore","docs\u002F01.overview\u002F03.explore",[71,76],{"title":72,"path":73,"stem":74,"draft":11,"icon":75},"Pricing","\u002Fdocs\u002Foverview\u002Fexplore\u002Fpricing","docs\u002F01.overview\u002F03.explore\u002F01.pricing","i-material-symbols-sell-rounded",{"title":77,"path":78,"stem":79,"draft":11,"to":80},"Releases","\u002Fdocs\u002Foverview\u002Fexplore\u002Freleases","docs\u002F01.overview\u002F03.explore\u002F02.releases","\u002Freleases",{"title":82,"draft":11,"path":83,"stem":84,"children":85},"Features","\u002Fdocs\u002Ffeatures","docs\u002F02.features\u002Findex",[86,87,117,167,208,230,250],{"title":10,"path":83,"stem":84,"draft":11},{"title":88,"draft":11,"path":89,"stem":90,"children":91,"page":11},"Shops","\u002Fdocs\u002Ffeatures\u002Fshops","docs\u002F02.features\u002F01.shops",[92,97,102,107,112],{"title":93,"path":94,"stem":95,"draft":11,"icon":96},"Shop overview","\u002Fdocs\u002Ffeatures\u002Fshops\u002Fshop-overview","docs\u002F02.features\u002F01.shops\u002F01.shop-overview","i-material-symbols-space-dashboard-rounded",{"title":98,"path":99,"stem":100,"draft":11,"icon":101},"Understanding the numbers","\u002Fdocs\u002Ffeatures\u002Fshops\u002Funderstanding-the-numbers","docs\u002F02.features\u002F01.shops\u002F02.understanding-the-numbers","i-material-symbols-help-rounded",{"title":103,"path":104,"stem":105,"draft":11,"icon":106},"Attribution & dedup","\u002Fdocs\u002Ffeatures\u002Fshops\u002Fattribution-and-dedup","docs\u002F02.features\u002F01.shops\u002F03.attribution-and-dedup","i-material-symbols-call-merge-rounded",{"title":108,"path":109,"stem":110,"draft":11,"icon":111},"Shop health","\u002Fdocs\u002Ffeatures\u002Fshops\u002Fshop-health","docs\u002F02.features\u002F01.shops\u002F04.shop-health","i-material-symbols-monitor-heart-rounded",{"title":113,"path":114,"stem":115,"draft":11,"icon":116},"Shop settings and sync","\u002Fdocs\u002Ffeatures\u002Fshops\u002Fshop-settings-and-sync","docs\u002F02.features\u002F01.shops\u002F05.shop-settings-and-sync","i-material-symbols-settings-rounded",{"title":118,"draft":11,"path":119,"stem":120,"children":121,"page":11},"Products","\u002Fdocs\u002Ffeatures\u002Fproducts","docs\u002F02.features\u002F02.products",[122,127,132,137,142,147,152,157,162],{"title":123,"path":124,"stem":125,"draft":11,"icon":126},"Product table","\u002Fdocs\u002Ffeatures\u002Fproducts\u002Fproduct-table","docs\u002F02.features\u002F02.products\u002F01.product-table","i-material-symbols-deployed-code-rounded",{"title":128,"path":129,"stem":130,"draft":11,"icon":131},"Unified products","\u002Fdocs\u002Ffeatures\u002Fproducts\u002Funified-products","docs\u002F02.features\u002F02.products\u002F02.unified-products","i-material-symbols-dashboard-customize-rounded",{"title":133,"path":134,"stem":135,"draft":11,"icon":136},"Matching and merging products","\u002Fdocs\u002Ffeatures\u002Fproducts\u002Fmatching-and-merging","docs\u002F02.features\u002F02.products\u002F03.matching-and-merging","i-material-symbols-merge-rounded",{"title":138,"path":139,"stem":140,"draft":11,"icon":141},"Bulk edit (Excel)","\u002Fdocs\u002Ffeatures\u002Fproducts\u002Fbulk-edit-excel","docs\u002F02.features\u002F02.products\u002F04.bulk-edit-excel","i-material-symbols-grid-on-rounded",{"title":143,"path":144,"stem":145,"draft":11,"icon":146},"Inventory and reorder","\u002Fdocs\u002Ffeatures\u002Fproducts\u002Finventory-and-reorder","docs\u002F02.features\u002F02.products\u002F05.inventory-and-reorder","i-material-symbols-inventory-2-rounded",{"title":148,"path":149,"stem":150,"draft":11,"icon":151},"Stock sync","\u002Fdocs\u002Ffeatures\u002Fproducts\u002Fstock-sync","docs\u002F02.features\u002F02.products\u002F06.stock-sync","i-material-symbols-sync-rounded",{"title":153,"path":154,"stem":155,"draft":11,"icon":156},"Commission","\u002Fdocs\u002Ffeatures\u002Fproducts\u002Fcommission","docs\u002F02.features\u002F02.products\u002F07.commission","i-material-symbols-price-change-rounded",{"title":158,"path":159,"stem":160,"draft":11,"icon":161},"Auto bump","\u002Fdocs\u002Ffeatures\u002Fproducts\u002Fauto-bump","docs\u002F02.features\u002F02.products\u002F08.auto-bump","i-material-symbols-trending-up-rounded",{"title":163,"path":164,"stem":165,"draft":11,"icon":166},"Margin spread","\u002Fdocs\u002Ffeatures\u002Fproducts\u002Fmargin-spread","docs\u002F02.features\u002F02.products\u002F09.margin-spread","i-material-symbols-straighten-rounded",{"title":168,"draft":11,"path":169,"stem":170,"children":171},"Financial breakdown","\u002Fdocs\u002Ffeatures\u002Ffinancial-breakdown","docs\u002F02.features\u002F03.financial-breakdown\u002Findex",[172,173,178,183,188,193,198,203],{"title":10,"path":169,"stem":170,"draft":11},{"title":174,"path":175,"stem":176,"draft":11,"icon":177},"Simulate and draft edit","\u002Fdocs\u002Ffeatures\u002Ffinancial-breakdown\u002Fsimulate-and-draft-edit","docs\u002F02.features\u002F03.financial-breakdown\u002F01.simulate-and-draft-edit","i-material-symbols-science-rounded",{"title":179,"path":180,"stem":181,"draft":11,"icon":182},"Set margin","\u002Fdocs\u002Ffeatures\u002Ffinancial-breakdown\u002Fset-margin","docs\u002F02.features\u002F03.financial-breakdown\u002F02.set-margin","i-material-symbols-tune-rounded",{"title":184,"path":185,"stem":186,"draft":11,"icon":187},"Margin optimizer","\u002Fdocs\u002Ffeatures\u002Ffinancial-breakdown\u002Fmargin-optimizer","docs\u002F02.features\u002F03.financial-breakdown\u002F03.margin-optimizer","i-material-symbols-instant-mix-rounded",{"title":189,"path":190,"stem":191,"draft":11,"icon":192},"Price elasticity","\u002Fdocs\u002Ffeatures\u002Ffinancial-breakdown\u002Fprice-elasticity","docs\u002F02.features\u002F03.financial-breakdown\u002F04.price-elasticity","i-material-symbols-show-chart-rounded",{"title":194,"path":195,"stem":196,"draft":11,"icon":197},"Product calculator","\u002Fdocs\u002Ffeatures\u002Ffinancial-breakdown\u002Fproduct-calculator","docs\u002F02.features\u002F03.financial-breakdown\u002F05.product-calculator","i-material-symbols-calculate-rounded",{"title":199,"path":200,"stem":201,"draft":11,"icon":202},"Product history","\u002Fdocs\u002Ffeatures\u002Ffinancial-breakdown\u002Fproduct-history","docs\u002F02.features\u002F03.financial-breakdown\u002F06.product-history","i-material-symbols-history-rounded",{"title":204,"path":205,"stem":206,"draft":11,"icon":207},"Net profit & hidden cost","\u002Fdocs\u002Ffeatures\u002Ffinancial-breakdown\u002Fnet-profit-and-hidden-cost","docs\u002F02.features\u002F03.financial-breakdown\u002F07.net-profit-and-hidden-cost","i-material-symbols-visibility-off-rounded",{"title":72,"draft":11,"path":209,"stem":210,"children":211,"page":11},"\u002Fdocs\u002Ffeatures\u002Fpricing","docs\u002F02.features\u002F04.pricing",[212,216,221,226],{"title":213,"path":214,"stem":215,"draft":11,"icon":141},"Price Edit","\u002Fdocs\u002Ffeatures\u002Fpricing\u002Fprice-edit","docs\u002F02.features\u002F04.pricing\u002F01.price-edit",{"title":217,"path":218,"stem":219,"draft":11,"icon":220},"Price increase whitelist","\u002Fdocs\u002Ffeatures\u002Fpricing\u002Fprice-increase-whitelist","docs\u002F02.features\u002F04.pricing\u002F02.price-increase-whitelist","i-lucide-badge-check",{"title":222,"path":223,"stem":224,"draft":11,"icon":225},"Requesting whitelist approval","\u002Fdocs\u002Ffeatures\u002Fpricing\u002Frequest-whitelist-approval","docs\u002F02.features\u002F04.pricing\u002F03.request-whitelist-approval","i-lucide-mail",{"title":227,"path":228,"stem":229,"draft":11,"icon":75},"Price tiers","\u002Fdocs\u002Ffeatures\u002Fpricing\u002Fprice-tiers","docs\u002F02.features\u002F04.pricing\u002F04.price-tiers",{"title":231,"draft":11,"path":232,"stem":233,"children":234},"Campaign simulator","\u002Fdocs\u002Ffeatures\u002Fcampaign-simulator","docs\u002F02.features\u002F05.campaign-simulator\u002Findex",[235,236,241,246],{"title":10,"path":232,"stem":233,"draft":11},{"title":237,"path":238,"stem":239,"draft":11,"icon":240},"Campaign phases","\u002Fdocs\u002Ffeatures\u002Fcampaign-simulator\u002Fphase-model","docs\u002F02.features\u002F05.campaign-simulator\u002F01.phase-model","i-material-symbols-timeline-rounded",{"title":242,"path":243,"stem":244,"draft":11,"icon":245},"Ads planning","\u002Fdocs\u002Ffeatures\u002Fcampaign-simulator\u002Fads-planning","docs\u002F02.features\u002F05.campaign-simulator\u002F02.ads-planning","i-material-symbols-ads-click-rounded",{"title":247,"path":248,"stem":249,"draft":11,"icon":60},"Counterfactual","\u002Fdocs\u002Ffeatures\u002Fcampaign-simulator\u002Fcounterfactual","docs\u002F02.features\u002F05.campaign-simulator\u002F03.counterfactual",{"title":251,"draft":11,"path":252,"stem":253,"children":254,"page":11},"Orders","\u002Fdocs\u002Ffeatures\u002Forders","docs\u002F02.features\u002F06.orders",[255,259,264],{"title":251,"path":256,"stem":257,"draft":11,"icon":258},"\u002Fdocs\u002Ffeatures\u002Forders\u002Forders","docs\u002F02.features\u002F06.orders\u002F01.orders","i-material-symbols-receipt-long-rounded",{"title":260,"path":261,"stem":262,"draft":11,"icon":263},"Reconciliation","\u002Fdocs\u002Ffeatures\u002Forders\u002Freconciliation","docs\u002F02.features\u002F06.orders\u002F02.reconciliation","i-material-symbols-balance",{"title":265,"path":266,"stem":267,"draft":11,"icon":268},"Shipping labels","\u002Fdocs\u002Ffeatures\u002Forders\u002Fshipping-labels","docs\u002F02.features\u002F06.orders\u002F03.shipping-labels","i-material-symbols-local-shipping-rounded",{"title":270,"draft":11,"path":271,"stem":272,"children":273},"Growth","\u002Fdocs\u002Fgrowth","docs\u002F03.growth\u002Findex",[274,275,298,362,386],{"title":10,"path":271,"stem":272,"draft":11},{"title":276,"draft":11,"path":277,"stem":278,"children":279,"page":11},"Actions","\u002Fdocs\u002Fgrowth\u002Factions","docs\u002F03.growth\u002F01.actions",[280,285,289,294],{"title":281,"path":282,"stem":283,"draft":11,"icon":284},"What are Actions","\u002Fdocs\u002Fgrowth\u002Factions\u002Fwhat-are-actions","docs\u002F03.growth\u002F01.actions\u002F01.what-are-actions","i-material-symbols-app-spark-rounded",{"title":286,"path":287,"stem":288,"draft":11},"Action flow","\u002Fdocs\u002Fgrowth\u002Factions\u002Faction-flow","docs\u002F03.growth\u002F01.actions\u002F02.action-flow",{"title":290,"path":291,"stem":292,"draft":11,"icon":293},"Deployed and dismissed","\u002Fdocs\u002Fgrowth\u002Factions\u002Fdeployed-and-dismissed","docs\u002F03.growth\u002F01.actions\u002F03.deployed-and-dismissed","i-material-symbols-published-with-changes-rounded",{"title":295,"path":296,"stem":297,"draft":11,"icon":197},"How Results are calculated","\u002Fdocs\u002Fgrowth\u002Factions\u002Fresults","docs\u002F03.growth\u002F01.actions\u002F04.results",{"title":299,"draft":11,"path":300,"stem":301,"children":302,"icon":304},"Action types","\u002Fdocs\u002Fgrowth\u002Faction-types","docs\u002F03.growth\u002F02.action-types\u002Findex",[303,305,310,315,319,324,329,334,339,343,348,353,358],{"title":10,"path":300,"stem":301,"draft":11,"icon":304},"i-material-symbols-format-list-bulleted-rounded",{"title":306,"path":307,"stem":308,"draft":11,"icon":309},"Price buffer","\u002Fdocs\u002Fgrowth\u002Faction-types\u002Fprice-buffer","docs\u002F03.growth\u002F02.action-types\u002F01.price-buffer","i-material-symbols-money-range-rounded",{"title":311,"path":312,"stem":313,"draft":11,"icon":314},"Commission adjust","\u002Fdocs\u002Fgrowth\u002Faction-types\u002Fcommission-adjust","docs\u002F03.growth\u002F02.action-types\u002F02.commission-adjust","i-material-symbols-percent-discount-rounded",{"title":316,"path":317,"stem":318,"draft":11,"icon":106},"Variant merge","\u002Fdocs\u002Fgrowth\u002Faction-types\u002Fvariant-merge","docs\u002F03.growth\u002F02.action-types\u002F03.variant-merge",{"title":320,"path":321,"stem":322,"draft":11,"icon":323},"Target ROAS","\u002Fdocs\u002Fgrowth\u002Faction-types\u002Ftarget-roas","docs\u002F03.growth\u002F02.action-types\u002F04.target-roas","i-material-symbols-target",{"title":325,"path":326,"stem":327,"draft":11,"icon":328},"Bundle Deal","\u002Fdocs\u002Fgrowth\u002Faction-types\u002Fbundle-deal","docs\u002F03.growth\u002F02.action-types\u002F05.bundle-deal","i-material-symbols-category-rounded",{"title":330,"path":331,"stem":332,"draft":11,"icon":333},"Product Boost","\u002Fdocs\u002Fgrowth\u002Faction-types\u002Fproduct-boost","docs\u002F03.growth\u002F02.action-types\u002F06.product-boost","i-material-symbols-electric-bolt-rounded",{"title":335,"path":336,"stem":337,"draft":11,"icon":338},"Campaign Enrollment","\u002Fdocs\u002Fgrowth\u002Faction-types\u002Fcampaign-enrollment","docs\u002F03.growth\u002F02.action-types\u002F07.campaign-enrollment","i-material-symbols-play-arrow-rounded",{"title":340,"path":341,"stem":342,"draft":11,"icon":245},"Ad Adjustment","\u002Fdocs\u002Fgrowth\u002Faction-types\u002Fad-adjustment","docs\u002F03.growth\u002F02.action-types\u002F08.ad-adjustment",{"title":344,"path":345,"stem":346,"draft":11,"icon":347},"SEO","\u002Fdocs\u002Fgrowth\u002Faction-types\u002Fseo","docs\u002F03.growth\u002F02.action-types\u002F09.seo","i-material-symbols-category-search-rounded",{"title":349,"path":350,"stem":351,"draft":11,"icon":352},"Add-on Deal","\u002Fdocs\u002Fgrowth\u002Faction-types\u002Fadd-on-deal","docs\u002F03.growth\u002F02.action-types\u002F10.add-on-deal","i-material-symbols-add-box-rounded",{"title":354,"path":355,"stem":356,"draft":11,"icon":357},"Stock Up","\u002Fdocs\u002Fgrowth\u002Faction-types\u002Fstock-up","docs\u002F03.growth\u002F02.action-types\u002F11.stock-up","i-material-symbols-inventory-rounded",{"title":359,"path":360,"stem":361,"draft":11,"icon":323},"TikTok Target ROAS","\u002Fdocs\u002Fgrowth\u002Faction-types\u002Ftiktok-target-roas","docs\u002F03.growth\u002F02.action-types\u002F12.tiktok-target-roas",{"title":363,"draft":11,"path":364,"stem":365,"children":366,"page":11},"Ads","\u002Fdocs\u002Fgrowth\u002Fads","docs\u002F03.growth\u002F03.ads",[367,372,376,381],{"title":368,"path":369,"stem":370,"draft":11,"icon":371},"Reading the Sankey","\u002Fdocs\u002Fgrowth\u002Fads\u002Freading-the-sankey","docs\u002F03.growth\u002F03.ads\u002F01.reading-the-sankey","i-material-symbols-schema-rounded",{"title":373,"path":374,"stem":375,"draft":11,"icon":60},"Cannibalization","\u002Fdocs\u002Fgrowth\u002Fads\u002Fcannibalization","docs\u002F03.growth\u002F03.ads\u002F02.cannibalization",{"title":377,"path":378,"stem":379,"draft":11,"icon":380},"Meta (Facebook) Ads","\u002Fdocs\u002Fgrowth\u002Fads\u002Fmeta-ads","docs\u002F03.growth\u002F03.ads\u002F03.meta-ads","i-simple-icons-meta",{"title":382,"path":383,"stem":384,"draft":11,"icon":385},"CPAS profit","\u002Fdocs\u002Fgrowth\u002Fads\u002Fcpas-profit","docs\u002F03.growth\u002F03.ads\u002F04.cpas-profit","i-material-symbols-hub-rounded",{"title":387,"draft":11,"path":388,"stem":389,"children":390,"icon":65},"Optimization groups","\u002Fdocs\u002Fgrowth\u002Foptimization-groups","docs\u002F03.growth\u002F04.optimization-groups\u002Findex",[391,392,397,402,407,412,416,421,426,431,436,441,445,450,455,460,465],{"title":10,"path":388,"stem":389,"draft":11,"icon":65},{"title":393,"path":394,"stem":395,"draft":11,"icon":396},"Planning your groups","\u002Fdocs\u002Fgrowth\u002Foptimization-groups\u002Fplanning-your-groups","docs\u002F03.growth\u002F04.optimization-groups\u002F00.planning-your-groups","i-lucide-boxes",{"title":398,"path":399,"stem":400,"draft":11,"icon":401},"Creating a group","\u002Fdocs\u002Fgrowth\u002Foptimization-groups\u002Fcreating-a-group","docs\u002F03.growth\u002F04.optimization-groups\u002F01.creating-a-group","i-lucide-plus",{"title":403,"path":404,"stem":405,"draft":11,"icon":406},"Global settings","\u002Fdocs\u002Fgrowth\u002Foptimization-groups\u002Fglobal-settings","docs\u002F03.growth\u002F04.optimization-groups\u002F02.global-settings","i-lucide-settings-2",{"title":408,"path":409,"stem":410,"draft":11,"icon":411},"Budget and limits","\u002Fdocs\u002Fgrowth\u002Foptimization-groups\u002Fbudget-and-limits","docs\u002F03.growth\u002F04.optimization-groups\u002F03.budget-and-limits","i-lucide-wallet",{"title":270,"path":413,"stem":414,"draft":11,"icon":415},"\u002Fdocs\u002Fgrowth\u002Foptimization-groups\u002Fgrowth","docs\u002F03.growth\u002F04.optimization-groups\u002F04.growth","i-lucide-trending-up",{"title":417,"path":418,"stem":419,"draft":11,"icon":420},"Choosing an objective","\u002Fdocs\u002Fgrowth\u002Foptimization-groups\u002Fchoosing-an-objective","docs\u002F03.growth\u002F04.optimization-groups\u002F05.choosing-an-objective","i-lucide-target",{"title":422,"path":423,"stem":424,"draft":11,"icon":425},"Constraints","\u002Fdocs\u002Fgrowth\u002Foptimization-groups\u002Fconstraints","docs\u002F03.growth\u002F04.optimization-groups\u002F06.constraints","i-lucide-shield-check",{"title":427,"path":428,"stem":429,"draft":11,"icon":430},"Distribution","\u002Fdocs\u002Fgrowth\u002Foptimization-groups\u002Fallocation-preference","docs\u002F03.growth\u002F04.optimization-groups\u002F07.allocation-preference","i-lucide-sliders-horizontal",{"title":432,"path":433,"stem":434,"draft":11,"icon":435},"Pacing and rebalancing","\u002Fdocs\u002Fgrowth\u002Foptimization-groups\u002Fpacing-and-rebalancing","docs\u002F03.growth\u002F04.optimization-groups\u002F08.pacing-and-rebalancing","i-lucide-clock",{"title":437,"path":438,"stem":439,"draft":11,"icon":440},"The month plan","\u002Fdocs\u002Fgrowth\u002Foptimization-groups\u002Fmonthly-plan","docs\u002F03.growth\u002F04.optimization-groups\u002F09.monthly-plan","i-lucide-calendar-days",{"title":442,"path":443,"stem":444,"draft":11,"icon":435},"The Timeline schedule","\u002Fdocs\u002Fgrowth\u002Foptimization-groups\u002Fschedule","docs\u002F03.growth\u002F04.optimization-groups\u002F10.schedule",{"title":446,"path":447,"stem":448,"draft":11,"icon":449},"Automation rules","\u002Fdocs\u002Fgrowth\u002Foptimization-groups\u002Fautomation","docs\u002F03.growth\u002F04.optimization-groups\u002F11.automation","i-lucide-workflow",{"title":451,"path":452,"stem":453,"draft":11,"icon":454},"Managing campaigns in a group","\u002Fdocs\u002Fgrowth\u002Foptimization-groups\u002Fmanaging-campaigns","docs\u002F03.growth\u002F04.optimization-groups\u002F12.managing-campaigns","i-lucide-list-checks",{"title":456,"path":457,"stem":458,"draft":11,"icon":459},"How the run works","\u002Fdocs\u002Fgrowth\u002Foptimization-groups\u002Fdaily-run","docs\u002F03.growth\u002F04.optimization-groups\u002F13.daily-run","i-lucide-refresh-cw",{"title":461,"path":462,"stem":463,"draft":11,"icon":464},"When the ads model is updating","\u002Fdocs\u002Fgrowth\u002Foptimization-groups\u002Fmodel-training","docs\u002F03.growth\u002F04.optimization-groups\u002F14.model-training","i-lucide-brain-circuit",{"title":466,"path":467,"stem":468,"draft":11,"icon":469},"Glossary","\u002Fdocs\u002Fgrowth\u002Foptimization-groups\u002Fglossary","docs\u002F03.growth\u002F04.optimization-groups\u002F16.glossary","i-lucide-book-a",{"title":471,"draft":11,"path":472,"stem":473,"children":474},"AI and API","\u002Fdocs\u002Fai-and-api","docs\u002F04.ai-and-api\u002Findex",[475,476,518],{"title":10,"path":472,"stem":473,"draft":11},{"title":477,"draft":11,"path":478,"stem":479,"children":480,"icon":482},"AI assistants","\u002Fdocs\u002Fai-and-api\u002Fassistants","docs\u002F04.ai-and-api\u002F01.assistants\u002Findex",[481,483,488,493,498,503,508,513],{"title":10,"path":478,"stem":479,"draft":11,"icon":482},"i-material-symbols-smart-toy-rounded",{"title":484,"path":485,"stem":486,"draft":11,"icon":487},"Connect to ChatGPT","\u002Fdocs\u002Fai-and-api\u002Fassistants\u002Fconnect-chatgpt","docs\u002F04.ai-and-api\u002F01.assistants\u002F01.connect-chatgpt","i-simple-icons-openai",{"title":489,"path":490,"stem":491,"draft":11,"icon":492},"Connect to Claude","\u002Fdocs\u002Fai-and-api\u002Fassistants\u002Fconnect-claude","docs\u002F04.ai-and-api\u002F01.assistants\u002F02.connect-claude","i-simple-icons-claude",{"title":494,"path":495,"stem":496,"draft":11,"icon":497},"Native playbooks","\u002Fdocs\u002Fai-and-api\u002Fassistants\u002Fplaybooks","docs\u002F04.ai-and-api\u002F01.assistants\u002F03.playbooks","i-material-symbols-route-rounded",{"title":499,"path":500,"stem":501,"draft":11,"icon":502},"Prompt library","\u002Fdocs\u002Fai-and-api\u002Fassistants\u002Fprompt-library","docs\u002F04.ai-and-api\u002F01.assistants\u002F04.prompt-library","i-material-symbols-forum-rounded",{"title":504,"path":505,"stem":506,"draft":11,"icon":507},"MCP tool catalog","\u002Fdocs\u002Fai-and-api\u002Fassistants\u002Ftool-catalog","docs\u002F04.ai-and-api\u002F01.assistants\u002F05.tool-catalog","i-material-symbols-build-rounded",{"title":509,"path":510,"stem":511,"draft":11,"icon":512},"Permissions and safety","\u002Fdocs\u002Fai-and-api\u002Fassistants\u002Fusage-and-safety","docs\u002F04.ai-and-api\u002F01.assistants\u002F06.usage-and-safety","i-material-symbols-health-and-safety-rounded",{"title":514,"path":515,"stem":516,"draft":11,"icon":517},"Worked MCP examples","\u002Fdocs\u002Fai-and-api\u002Fassistants\u002Fworked-examples","docs\u002F04.ai-and-api\u002F01.assistants\u002F07.worked-examples","i-material-symbols-menu-book-rounded",{"title":519,"draft":11,"path":520,"stem":521,"children":522,"page":11},"API","\u002Fdocs\u002Fai-and-api\u002Fapi","docs\u002F04.ai-and-api\u002F02.api",[523,528,533,538,543,548],{"title":524,"path":525,"stem":526,"draft":11,"icon":527},"Getting started","\u002Fdocs\u002Fai-and-api\u002Fapi\u002Fgetting-started","docs\u002F04.ai-and-api\u002F02.api\u002F01.getting-started","i-material-symbols-key-rounded",{"title":529,"path":530,"stem":531,"draft":11,"icon":532},"API security & limits","\u002Fdocs\u002Fai-and-api\u002Fapi\u002Fsecurity","docs\u002F04.ai-and-api\u002F02.api\u002F02.security","i-material-symbols-verified-user-rounded",{"title":534,"path":535,"stem":536,"draft":11,"icon":537},"Endpoints: products & orders","\u002Fdocs\u002Fai-and-api\u002Fapi\u002Fproducts-and-orders","docs\u002F04.ai-and-api\u002F02.api\u002F03.products-and-orders","i-material-symbols-package-2-rounded",{"title":539,"path":540,"stem":541,"draft":11,"icon":542},"Endpoints: financial breakdown","\u002Fdocs\u002Fai-and-api\u002Fapi\u002Ffinancial-breakdown","docs\u002F04.ai-and-api\u002F02.api\u002F04.financial-breakdown","i-material-symbols-account-balance-rounded",{"title":544,"path":545,"stem":546,"draft":11,"icon":547},"Endpoints: raw platform data","\u002Fdocs\u002Fai-and-api\u002Fapi\u002Fplatform-data","docs\u002F04.ai-and-api\u002F02.api\u002F05.platform-data","i-material-symbols-database-rounded",{"title":549,"path":550,"stem":551,"draft":11,"icon":552},"Endpoints: Actions & recommendations","\u002Fdocs\u002Fai-and-api\u002Fapi\u002Frecommendations","docs\u002F04.ai-and-api\u002F02.api\u002F06.recommendations","i-material-symbols-recommend-rounded",{"title":554,"draft":11,"path":555,"stem":556,"children":557},"Administration","\u002Fdocs\u002Fadministration","docs\u002F05.administration\u002Findex",[558,559,579],{"title":10,"path":555,"stem":556,"draft":11},{"title":560,"draft":11,"path":561,"stem":562,"children":563,"page":11},"Team and access","\u002Fdocs\u002Fadministration\u002Fteam-and-access","docs\u002F05.administration\u002F01.team-and-access",[564,569,574],{"title":565,"path":566,"stem":567,"draft":11,"icon":568},"Team & roles","\u002Fdocs\u002Fadministration\u002Fteam-and-access\u002Fteam-and-roles","docs\u002F05.administration\u002F01.team-and-access\u002F01.team-and-roles","i-material-symbols-group-rounded",{"title":570,"path":571,"stem":572,"draft":11,"icon":573},"Adding teammates","\u002Fdocs\u002Fadministration\u002Fteam-and-access\u002Fadding-teammates","docs\u002F05.administration\u002F01.team-and-access\u002F02.adding-teammates","i-material-symbols-person-add-rounded",{"title":575,"path":576,"stem":577,"draft":11,"icon":578},"Managing access","\u002Fdocs\u002Fadministration\u002Fteam-and-access\u002Fmanaging-access","docs\u002F05.administration\u002F01.team-and-access\u002F03.managing-access","i-material-symbols-admin-panel-settings-rounded",{"title":580,"draft":11,"path":581,"stem":582,"children":583,"page":11},"Account","\u002Fdocs\u002Fadministration\u002Faccount","docs\u002F05.administration\u002F02.account",[584,588],{"title":585,"path":586,"stem":587,"draft":11,"icon":385},"Open Platform","\u002Fdocs\u002Fadministration\u002Faccount\u002Fopen-platform","docs\u002F05.administration\u002F02.account\u002F01.open-platform",{"title":589,"path":590,"stem":591,"draft":11,"icon":258},"VAT","\u002Fdocs\u002Fadministration\u002Faccount\u002Fvat","docs\u002F05.administration\u002F02.account\u002F02.vat",{"id":593,"docsPage":594,"docsSidebar":605,"docsTabs":607,"extension":609,"footer":610,"header":669,"localeSwitch":685,"meta":687,"stem":688,"__hash__":689},"chrome_en\u002Fen\u002Fchrome.yml",{"onThisPage":595,"copyPage":596,"copied":597,"copyMenu":598,"copyMarkdownLink":599,"linkCopied":600,"viewMarkdown":601,"openChatGpt":602,"openClaude":603,"platforms":604},"On this page","Copy page","Copied","More copy options","Copy Markdown link","Copied to clipboard","View as Markdown","Open in ChatGPT","Open in Claude","Works on",{"label":606},"Docs sidebar",{"ariaLabel":608},"Docs sections","yml",{"ariaLabel":611,"columns":612,"legal":649,"quote":650,"askAi":653},"Footer",[613,625,631,639],{"label":67,"children":614},[615,616,619,622],{"label":5,"to":6},{"label":617,"to":618},"Use cases","\u002Fuse-cases",{"label":620,"to":621},"Training","\u002Ftraining",{"label":623,"to":624},"Resources","\u002Fresources",{"label":626,"children":627},"Build",[628,629,630],{"label":477,"to":478},{"label":519,"to":525},{"label":585,"to":586},{"label":632,"children":633},"Updates",[634,635],{"label":77,"to":80},{"label":636,"to":637,"target":638},"Blog","https:\u002F\u002Fwww.dataglasslabs.com\u002Fblog","_blank",{"label":640,"children":641},"DataGlass",[642,645,648],{"label":643,"to":644,"target":638},"Open DataGlass","https:\u002F\u002Fapp.dataglasslabs.com",{"label":646,"to":647,"target":638},"Website","https:\u002F\u002Fwww.dataglasslabs.com",{"label":72,"to":73},"DataGlass Labs. All rights reserved.",{"text":651,"caption":652},"Measure what you keep, and then grow what you measure.","The DataGlass team",{"label":654,"prompt":655,"assistants":656},"Ask AI about DataGlass","I want to learn how to use DataGlass, a decision engine for Shopee, Lazada and TikTok Shop sellers that optimizes ads, pricing and promotions for true profit. Use web search to read the DataGlass docs at https:\u002F\u002Flearn.dataglasslabs.com\u002Fdocs (with an agent-readable summary at https:\u002F\u002Flearn.dataglasslabs.com\u002Fllms.txt), then explain what DataGlass does, how to get started and which guides to read first.",[657,661,665],{"label":658,"icon":659,"url":660},"ChatGPT","chatgpt","https:\u002F\u002Fchatgpt.com\u002F?prompt={prompt}",{"label":662,"icon":663,"url":664},"Claude","claude","https:\u002F\u002Fclaude.ai\u002Fnew?q={prompt}",{"label":666,"icon":667,"url":668},"Perplexity","perplexity","https:\u002F\u002Fwww.perplexity.ai\u002Fsearch?q={prompt}",{"sections":670,"navLabel":683,"openApp":643,"search":684},[671,674,675,677,679,681],{"key":672,"label":673},"home","Home",{"key":7,"label":5},{"key":676,"label":617},"use-cases",{"key":678,"label":620},"training",{"key":680,"label":77},"releases",{"key":682,"label":623},"resources","Sections","Start searching",{"label":686},"Region and language",{},"en\u002Fchrome","mobUs3s2Zj3jKhQlnWk_tray3mh7L0ptp0ZGYXlK4NA",{"id":691,"title":549,"body":692,"description":3866,"draft":11,"draftReason":3867,"extension":3868,"layout":3867,"meta":3869,"navigation":3870,"path":550,"platforms":3867,"rawbody":3871,"seo":3872,"stem":551,"__hash__":3873},"docs_en\u002Fdocs\u002F04.ai-and-api\u002F02.api\u002F06.recommendations.md",{"type":693,"value":694,"toc":3850},"minimark",[695,711,718,723,1035,1069,1141,1145,1278,1310,1336,1407,1491,1495,1612,1633,1656,1720,1723,1816,1820,1919,1942,1994,1998,2143,2164,2191,2255,2318,2321,2433,2554,2683,2706,2727,2731,2858,2932,3003,3007,3113,3141,3173,3177,3260,3329,3395,3399,3547,3699],[696,697,698,699,702,703,705,706,710],"p",{},"In DataGlass, ",[700,701,276],"a",{"href":282}," are profit-improving recommendations the engine generates. These endpoints let you read them — the recommendation list, per-item details, dedup checks (does this product already have an active recommendation?), and what-if previews. See ",[700,704,524],{"href":525}," for auth and ",[700,707,709],{"href":708},"\u002Fdocs\u002Fai-and-api\u002Fapi\u002Fgetting-started#conventions","Conventions",". All read-only — applying or deploying an Action requires the DataGlass app.",[712,713,715],"callout",{"icon":714},"i-lucide-mouse-pointer-click",[696,716,717],{},"Click any endpoint to expand its parameters, request body, and response.",[719,720,722],"h2",{"id":721},"recommendations-general","Recommendations (general)",[724,725,729,732,738,744,900,909,1029],"api-endpoint",{"method":726,"path":727,"summary":728},"POST","\u002Fapi\u002Frecommendation\u002Ffetch","List all recommendation types",[696,730,731],{},"Fetches your active recommendations across all types (pricing, ads, inventory), newest first. Each carries its type, shop, status, expected uplift, and risk metrics. Use this to populate the main Actions dashboard, or filter by shop\u002Fregion\u002Fplatform\u002Ftype.",[696,733,734],{},[735,736,737],"strong",{},"Request body",[696,739,740],{},[741,742,743],"code",{},"RecommendationFilter",[745,746,747,766],"table",{},[748,749,750],"thead",{},[751,752,753,757,760,763],"tr",{},[754,755,756],"th",{},"Field",[754,758,759],{},"Type",[754,761,762],{},"Required",[754,764,765],{},"Description",[767,768,769,786,832,872,886],"tbody",{},[751,770,771,777,780,783],{},[772,773,774],"td",{},[741,775,776],{},"shopId",[772,778,779],{},"integer",[772,781,782],{},"no",[772,784,785],{},"Filter by shop",[751,787,788,793,796,798],{},[772,789,790],{},[741,791,792],{},"recommendationType",[772,794,795],{},"string",[772,797,782],{},[772,799,800,801,804,805,804,808,804,811,804,814,804,817,804,820,804,823,804,826,804,829],{},"e.g. ",[741,802,803],{},"price_buffer_discount",", ",[741,806,807],{},"bundle_deal",[741,809,810],{},"commission_adjust",[741,812,813],{},"product_boost",[741,815,816],{},"ads",[741,818,819],{},"ads_target_roas",[741,821,822],{},"ads_target_roas_gms",[741,824,825],{},"campaign_enrollment",[741,827,828],{},"tiktok_ads_budget",[741,830,831],{},"tiktok_ads_target_roas",[751,833,834,839,841,843],{},[772,835,836],{},[741,837,838],{},"status",[772,840,795],{},[772,842,782],{},[772,844,800,845,804,848,804,851,804,854,804,857,804,860,804,863,804,866,804,869],{},[741,846,847],{},"proposed",[741,849,850],{},"approved",[741,852,853],{},"executing",[741,855,856],{},"paused",[741,858,859],{},"completed",[741,861,862],{},"failed",[741,864,865],{},"stopped",[741,867,868],{},"rolled_back",[741,870,871],{},"rejected",[751,873,874,879,881,883],{},[772,875,876],{},[741,877,878],{},"recommendationId",[772,880,779],{},[772,882,782],{},[772,884,885],{},"Fetch a single recommendation by id",[751,887,888,893,895,897],{},[772,889,890],{},[741,891,892],{},"experimentId",[772,894,779],{},[772,896,782],{},[772,898,899],{},"Filter by experiment id",[696,901,902,905,906],{},[735,903,904],{},"Response"," — Array of ",[741,907,908],{},"Recommendation",[745,910,911,921],{},[748,912,913],{},[751,914,915,917,919],{},[754,916,756],{},[754,918,759],{},[754,920,765],{},[767,922,923,934,945,957,968,979,992,1004,1016],{},[751,924,925,929,931],{},[772,926,927],{},[741,928,878],{},[772,930,779],{},[772,932,933],{},"Recommendation id",[751,935,936,940,942],{},[772,937,938],{},[741,939,776],{},[772,941,779],{},[772,943,944],{},"Shop id",[751,946,947,952,954],{},[772,948,949],{},[741,950,951],{},"platform",[772,953,795],{},[772,955,956],{},"Platform",[751,958,959,963,965],{},[772,960,961],{},[741,962,792],{},[772,964,795],{},[772,966,967],{},"The type (see filter values above)",[751,969,970,974,976],{},[772,971,972],{},[741,973,838],{},[772,975,795],{},[772,977,978],{},"Lifecycle state",[751,980,981,986,989],{},[772,982,983],{},[741,984,985],{},"confidence",[772,987,988],{},"number",[772,990,991],{},"Confidence (0–1, higher = more certain)",[751,993,994,999,1001],{},[772,995,996],{},[741,997,998],{},"expectedUpliftValue",[772,1000,988],{},[772,1002,1003],{},"Estimated profit impact",[751,1005,1006,1011,1013],{},[772,1007,1008],{},[741,1009,1010],{},"riskScore",[772,1012,988],{},[772,1014,1015],{},"Risk score (0–1)",[751,1017,1018,1023,1026],{},[772,1019,1020],{},[741,1021,1022],{},"validUntil",[772,1024,1025],{},"string (date)",[772,1027,1028],{},"Expiry",[696,1030,1031],{},[1032,1033,1034],"em",{},"…and more — see the full schema in the OpenAPI spec.",[724,1036,1039,1042,1050],{"method":726,"path":1037,"summary":1038},"\u002Fapi\u002Frecommendation\u002Ffetch-failed","List failed recommendations",[696,1040,1041],{},"Returns recommendations whose apply operation failed, paired with the captured failure reason. The failure is terminal (the recommendation is dismissed).",[696,1043,1044,1046,1047,1049],{},[735,1045,737],{}," — ",[741,1048,743],{}," (same fields as above).",[696,1051,1052,905,1054,1057,1058,1060,1061,1064,1065,1068],{},[735,1053,904],{},[741,1055,1056],{},"FailedRecommendation"," — all ",[741,1059,908],{}," fields plus ",[741,1062,1063],{},"failureReason"," (string) and ",[741,1066,1067],{},"failedAt"," (date).",[724,1070,1073,1076,1080,1085,1114],{"method":726,"path":1071,"summary":1072},"\u002Fapi\u002Frecommendation\u002Fstate-change-log\u002Ffetch","Recommendation status audit trail",[696,1074,1075],{},"Returns the state-change log for a recommendation — every transition (proposed → approved → executing → completed, or paused\u002Fstopped\u002Frolled_back\u002Frejected), who triggered it, and any captured reason.",[696,1077,1078],{},[735,1079,737],{},[696,1081,1082],{},[741,1083,1084],{},"RecommendationStateChangeLogFilter",[745,1086,1087,1099],{},[748,1088,1089],{},[751,1090,1091,1093,1095,1097],{},[754,1092,756],{},[754,1094,759],{},[754,1096,762],{},[754,1098,765],{},[767,1100,1101],{},[751,1102,1103,1107,1109,1111],{},[772,1104,1105],{},[741,1106,878],{},[772,1108,779],{},[772,1110,782],{},[772,1112,1113],{},"Recommendation to audit (omit → empty result)",[696,1115,1116,905,1118,1121,1122,804,1125,804,1128,804,1131,804,1134,804,1137,1140],{},[735,1117,904],{},[741,1119,1120],{},"RecommendationStateChangeLog"," — entries with ",[741,1123,1124],{},"fromStatus",[741,1126,1127],{},"toStatus",[741,1129,1130],{},"changedBy",[741,1132,1133],{},"reason",[741,1135,1136],{},"metadata",[741,1138,1139],{},"createdAt",".",[719,1142,1144],{"id":1143},"price-buffer-discount","Price-buffer discount",[724,1146,1149,1156,1160,1165,1252],{"method":726,"path":1147,"summary":1148},"\u002Fapi\u002Frecommendation\u002Fprice-buffer-discount\u002Ffetch","List price-buffer recommendations",[696,1150,1151,1152,1155],{},"Fetches price-buffer (margin-defence) recommendations for Shopee or TikTok — each protects your margin against fee\u002Fcost increases by recommending a price change. Returns a summary per recommendation; call ",[741,1153,1154],{},"\u002Fitems"," for per-product detail.",[696,1157,1158],{},[735,1159,737],{},[696,1161,1162],{},[741,1163,1164],{},"FetchPriceBufferDiscountRecommendationsRequest",[745,1166,1167,1179],{},[748,1168,1169],{},[751,1170,1171,1173,1175,1177],{},[754,1172,756],{},[754,1174,759],{},[754,1176,762],{},[754,1178,765],{},[767,1180,1181,1194,1206,1220,1239],{},[751,1182,1183,1187,1189,1191],{},[772,1184,1185],{},[741,1186,878],{},[772,1188,779],{},[772,1190,782],{},[772,1192,1193],{},"Fetch a single recommendation",[751,1195,1196,1200,1202,1204],{},[772,1197,1198],{},[741,1199,776],{},[772,1201,779],{},[772,1203,782],{},[772,1205,785],{},[751,1207,1208,1213,1215,1217],{},[772,1209,1210],{},[741,1211,1212],{},"region",[772,1214,795],{},[772,1216,782],{},[772,1218,1219],{},"Filter by region",[751,1221,1222,1226,1228,1230],{},[772,1223,1224],{},[741,1225,951],{},[772,1227,795],{},[772,1229,782],{},[772,1231,1232,1235,1236],{},[741,1233,1234],{},"shopee"," or ",[741,1237,1238],{},"tiktok_shop",[751,1240,1241,1245,1247,1249],{},[772,1242,1243],{},[741,1244,838],{},[772,1246,795],{},[772,1248,782],{},[772,1250,1251],{},"Filter by status",[696,1253,1254,905,1256,1046,1259,804,1261,804,1263,804,1265,804,1267,804,1269,1271,1272,1275,1276],{},[735,1255,904],{},[741,1257,1258],{},"PriceBufferDiscountRecommendationResponse",[741,1260,878],{},[741,1262,776],{},[741,1264,1212],{},[741,1266,951],{},[741,1268,838],{},[741,1270,998],{},", plus a nested ",[741,1273,1274],{},"items"," summary. ",[1032,1277,1034],{},[724,1279,1282,1285,1290],{"method":726,"path":1280,"summary":1281},"\u002Fapi\u002Frecommendation\u002Fprice-buffer-discount\u002Fitems\u002Ffetch","Per-item price-buffer details",[696,1283,1284],{},"Expands recommendations to per-item detail: current\u002Fproposed\u002Fpromotion prices, discount %, the protection reason, and buyer-price impact.",[696,1286,1287,1289],{},[735,1288,737],{}," — Array of recommendation ids (integer; max 500).",[696,1291,1292,905,1294,1046,1297,804,1299,1302,1303,1305,1306,1309],{},[735,1293,904],{},[741,1295,1296],{},"PriceBufferDiscountRecommendationItemResponse",[741,1298,878],{},[741,1300,1301],{},"itemId",", unit count, current\u002Fproposed\u002Fpromotion prices, discount %, ",[741,1304,1133],{}," (e.g. fee_increase, cost_increase), ",[741,1307,1308],{},"buyerPriceDelta",", and cost-breakdown fields.",[724,1311,1314,1317,1321],{"method":726,"path":1312,"summary":1313},"\u002Fapi\u002Frecommendation\u002Fprice-buffer-discount\u002Fmodels\u002Ffetch","Per-model price-buffer prices",[696,1315,1316],{},"Per-variant (model) price breakdown for the recommended items: current\u002Fproposed\u002Fpromotion prices and buyer-price delta.",[696,1318,1319,1289],{},[735,1320,737],{},[696,1322,1323,905,1325,1046,1328,804,1330,804,1332,1335],{},[735,1324,904],{},[741,1326,1327],{},"PriceBufferDiscountRecommendationModelResponse",[741,1329,878],{},[741,1331,1301],{},[741,1333,1334],{},"modelId",", current\u002Fproposed\u002Fpromotion price, discount %, buyer-price delta.",[724,1337,1340,1343,1347,1352,1396],{"method":726,"path":1338,"summary":1339},"\u002Fapi\u002Frecommendation\u002Fprice-buffer-discount\u002Fcheck-dedup","Which items already have active recommendations",[696,1341,1342],{},"Returns which of the given item ids already have an active (non-rejected) price-buffer recommendation, so a UI can pre-filter them from a \"generate new\" flow.",[696,1344,1345],{},[735,1346,737],{},[696,1348,1349],{},[741,1350,1351],{},"CheckPriceBufferDiscountDedupRequest",[745,1353,1354,1366],{},[748,1355,1356],{},[751,1357,1358,1360,1362,1364],{},[754,1359,756],{},[754,1361,759],{},[754,1363,762],{},[754,1365,765],{},[767,1367,1368,1381],{},[751,1369,1370,1374,1376,1379],{},[772,1371,1372],{},[741,1373,776],{},[772,1375,779],{},[772,1377,1378],{},"yes",[772,1380,944],{},[751,1382,1383,1388,1391,1393],{},[772,1384,1385],{},[741,1386,1387],{},"itemIds",[772,1389,1390],{},"array",[772,1392,1378],{},[772,1394,1395],{},"Item ids to check (max 500)",[696,1397,1398,1046,1400,1403,1404,1406],{},[735,1399,904],{},[741,1401,1402],{},"Set\u003CLong>"," — the subset of ",[741,1405,1387],{}," that already have an active recommendation (empty = all available).",[724,1408,1411,1414,1418,1423,1481],{"method":726,"path":1409,"summary":1410},"\u002Fapi\u002Frecommendation\u002Fprice-buffer-discount\u002Fcheck-dedup-by-platform","Platform-neutral dedup check",[696,1412,1413],{},"Platform-neutral dedup: pass platform-native item ids (e.g. TikTok product ids as strings) instead of numeric Shopee item ids.",[696,1415,1416],{},[735,1417,737],{},[696,1419,1420],{},[741,1421,1422],{},"CheckPriceBufferDiscountPlatformDedupRequest",[745,1424,1425,1437],{},[748,1426,1427],{},[751,1428,1429,1431,1433,1435],{},[754,1430,756],{},[754,1432,759],{},[754,1434,762],{},[754,1436,765],{},[767,1438,1439,1451,1467],{},[751,1440,1441,1445,1447,1449],{},[772,1442,1443],{},[741,1444,776],{},[772,1446,779],{},[772,1448,1378],{},[772,1450,944],{},[751,1452,1453,1457,1459,1461],{},[772,1454,1455],{},[741,1456,951],{},[772,1458,795],{},[772,1460,1378],{},[772,1462,1463,1235,1465],{},[741,1464,1234],{},[741,1466,1238],{},[751,1468,1469,1474,1476,1478],{},[772,1470,1471],{},[741,1472,1473],{},"platformItemIds",[772,1475,1390],{},[772,1477,1378],{},[772,1479,1480],{},"Platform-native item ids (max 500)",[696,1482,1483,1046,1485,1403,1488,1490],{},[735,1484,904],{},[741,1486,1487],{},"Set\u003CString>",[741,1489,1473],{}," that already have an active recommendation.",[719,1492,1494],{"id":1493},"bundle-deal","Bundle deal",[724,1496,1499,1508,1512,1517,1594],{"method":726,"path":1497,"summary":1498},"\u002Fapi\u002Frecommendation\u002Fbundle-deal\u002Ffetch","List bundle-deal recommendations",[696,1500,1501,1502,1235,1505,1507],{},"Fetches Shopee bundle-deal recommendations — product groupings to offer as a bundle to lift basket size and AOV. Returns a summary per recommendation; call ",[741,1503,1504],{},"\u002Fdetails",[741,1506,1154],{}," for expanded data.",[696,1509,1510],{},[735,1511,737],{},[696,1513,1514],{},[741,1515,1516],{},"BundleDealRecommendationFilter",[745,1518,1519,1531],{},[748,1520,1521],{},[751,1522,1523,1525,1527,1529],{},[754,1524,756],{},[754,1526,759],{},[754,1528,762],{},[754,1530,765],{},[767,1532,1533,1545,1557,1569,1582],{},[751,1534,1535,1539,1541,1543],{},[772,1536,1537],{},[741,1538,878],{},[772,1540,779],{},[772,1542,782],{},[772,1544,1193],{},[751,1546,1547,1551,1553,1555],{},[772,1548,1549],{},[741,1550,776],{},[772,1552,779],{},[772,1554,782],{},[772,1556,785],{},[751,1558,1559,1563,1565,1567],{},[772,1560,1561],{},[741,1562,1212],{},[772,1564,795],{},[772,1566,782],{},[772,1568,1219],{},[751,1570,1571,1575,1577,1579],{},[772,1572,1573],{},[741,1574,951],{},[772,1576,795],{},[772,1578,782],{},[772,1580,1581],{},"Filter by platform",[751,1583,1584,1588,1590,1592],{},[772,1585,1586],{},[741,1587,838],{},[772,1589,795],{},[772,1591,782],{},[772,1593,1251],{},[696,1595,1596,905,1598,1046,1601,804,1603,804,1605,804,1607,1609,1610],{},[735,1597,904],{},[741,1599,1600],{},"BundleDealRecommendation",[741,1602,878],{},[741,1604,776],{},[741,1606,1212],{},[741,1608,838],{},", expected uplift, and the bundle structure. ",[1032,1611,1034],{},[724,1613,1616,1619,1623],{"method":726,"path":1614,"summary":1615},"\u002Fapi\u002Frecommendation\u002Fbundle-deal\u002Fdetails\u002Ffetch","Bundle-deal details",[696,1617,1618],{},"Expands bundle recommendations: full bundle structure (items, variants, per-item pricing) and rationale.",[696,1620,1621,1289],{},[735,1622,737],{},[696,1624,1625,905,1627,1046,1630,1632],{},[735,1626,904],{},[741,1628,1629],{},"BundleDealRecommendationDetail",[741,1631,878],{},", bundle name\u002Fdescription, bundled items with prices\u002Fdiscounts, expected basket impact, reason.",[724,1634,1637,1640,1644],{"method":726,"path":1635,"summary":1636},"\u002Fapi\u002Frecommendation\u002Fbundle-deal\u002Fitems\u002Ffetch","Per-item bundle details",[696,1638,1639],{},"Per-item details within bundles: current vs bundled price, discount, margin impact, and contribution to uplift.",[696,1641,1642,1289],{},[735,1643,737],{},[696,1645,1646,905,1648,1046,1651,804,1653,1655],{},[735,1647,904],{},[741,1649,1650],{},"BundleDealRecommendationItem",[741,1652,878],{},[741,1654,1301],{},", current\u002Fbundled price, discount %, estimated sales lift, margin delta.",[724,1657,1660,1663,1667,1672,1712],{"method":726,"path":1658,"summary":1659},"\u002Fapi\u002Frecommendation\u002Fbundle-deal\u002Fcheck-dedup","Which products already have bundle recommendations",[696,1661,1662],{},"Returns which item ids already have an active bundle-deal recommendation.",[696,1664,1665],{},[735,1666,737],{},[696,1668,1669],{},[741,1670,1671],{},"CheckBundleDealDedupRequest",[745,1673,1674,1686],{},[748,1675,1676],{},[751,1677,1678,1680,1682,1684],{},[754,1679,756],{},[754,1681,759],{},[754,1683,762],{},[754,1685,765],{},[767,1687,1688,1700],{},[751,1689,1690,1694,1696,1698],{},[772,1691,1692],{},[741,1693,776],{},[772,1695,779],{},[772,1697,1378],{},[772,1699,944],{},[751,1701,1702,1706,1708,1710],{},[772,1703,1704],{},[741,1705,1387],{},[772,1707,1390],{},[772,1709,1378],{},[772,1711,1395],{},[696,1713,1714,1046,1716,1403,1718,1490],{},[735,1715,904],{},[741,1717,1402],{},[741,1719,1387],{},[719,1721,311],{"id":1722},"commission-adjust",[724,1724,1727,1730,1734,1739,1792],{"method":726,"path":1725,"summary":1726},"\u002Fapi\u002Frecommendation\u002Fcommission-adjust\u002Ffetch","List commission-adjust actions",[696,1728,1729],{},"Fetches margin-defence actions for a Shopee shop facing an upcoming commission-rate increase. Each recommends a discount-trim or price-raise per item\u002Fvariant to preserve the protected margin.",[696,1731,1732],{},[735,1733,737],{},[696,1735,1736],{},[741,1737,1738],{},"CommissionAdjustShopRequest",[745,1740,1741,1753],{},[748,1742,1743],{},[751,1744,1745,1747,1749,1751],{},[754,1746,756],{},[754,1748,759],{},[754,1750,762],{},[754,1752,765],{},[767,1754,1755,1767,1780],{},[751,1756,1757,1761,1763,1765],{},[772,1758,1759],{},[741,1760,776],{},[772,1762,779],{},[772,1764,1378],{},[772,1766,944],{},[751,1768,1769,1773,1775,1777],{},[772,1770,1771],{},[741,1772,1212],{},[772,1774,795],{},[772,1776,1378],{},[772,1778,1779],{},"Region code",[751,1781,1782,1786,1788,1790],{},[772,1783,1784],{},[741,1785,838],{},[772,1787,795],{},[772,1789,782],{},[772,1791,1251],{},[696,1793,1794,905,1796,1046,1799,804,1801,804,1803,804,1805,804,1807,804,1810,1813,1814],{},[735,1795,904],{},[741,1797,1798],{},"CommissionAdjustActionResponse",[741,1800,878],{},[741,1802,776],{},[741,1804,1212],{},[741,1806,838],{},[741,1808,1809],{},"commissionEffectiveDate",[741,1811,1812],{},"protectedMarginPct",", impacted items with margin snapshot and estimated profit impact, and per-model recommended lever. ",[1032,1815,1034],{},[719,1817,1819],{"id":1818},"product-boost","Product boost",[724,1821,1824,1830,1834,1839,1903],{"method":726,"path":1822,"summary":1823},"\u002Fapi\u002Frecommendation\u002Fboost\u002Ffetch","List product-boost recommendations",[696,1825,1826,1827,1829],{},"Fetches Shopee product-boost recommendations — which products to boost in search\u002Ffeed to increase visibility and sales. Call ",[741,1828,1154],{}," for the full product list.",[696,1831,1832],{},[735,1833,737],{},[696,1835,1836],{},[741,1837,1838],{},"BoostRecommendationFilter",[745,1840,1841,1853],{},[748,1842,1843],{},[751,1844,1845,1847,1849,1851],{},[754,1846,756],{},[754,1848,759],{},[754,1850,762],{},[754,1852,765],{},[767,1854,1855,1867,1879,1891],{},[751,1856,1857,1861,1863,1865],{},[772,1858,1859],{},[741,1860,878],{},[772,1862,779],{},[772,1864,782],{},[772,1866,1193],{},[751,1868,1869,1873,1875,1877],{},[772,1870,1871],{},[741,1872,776],{},[772,1874,779],{},[772,1876,782],{},[772,1878,785],{},[751,1880,1881,1885,1887,1889],{},[772,1882,1883],{},[741,1884,1212],{},[772,1886,795],{},[772,1888,782],{},[772,1890,1219],{},[751,1892,1893,1897,1899,1901],{},[772,1894,1895],{},[741,1896,838],{},[772,1898,795],{},[772,1900,782],{},[772,1902,1251],{},[696,1904,1905,905,1907,1046,1910,804,1912,804,1914,804,1916,1918],{},[735,1906,904],{},[741,1908,1909],{},"BoostRecommendation",[741,1911,878],{},[741,1913,776],{},[741,1915,1212],{},[741,1917,838],{},", expected uplift, and the nested product list.",[724,1920,1923,1926,1930],{"method":726,"path":1921,"summary":1922},"\u002Fapi\u002Frecommendation\u002Fboost\u002Fitems\u002Ffetch","Products in a boost recommendation",[696,1924,1925],{},"Expands boost recommendations to the product list, current metrics, and expected uplift.",[696,1927,1928,1289],{},[735,1929,737],{},[696,1931,1932,905,1934,1046,1937,804,1939,1941],{},[735,1933,904],{},[741,1935,1936],{},"BoostRecommendationItem",[741,1938,878],{},[741,1940,1301],{},", current sales\u002Fprofit, expected sales uplift %, estimated profit impact, and ranking.",[724,1943,1946,1949,1953,1958,1986],{"method":726,"path":1944,"summary":1945},"\u002Fapi\u002Frecommendation\u002Fboost\u002Fcheck-dedup","Does the shop have an active boost recommendation?",[696,1947,1948],{},"Returns true if the shop already has a non-rejected boost recommendation — so a UI can gate the \"Create new\" control.",[696,1950,1951],{},[735,1952,737],{},[696,1954,1955],{},[741,1956,1957],{},"CheckBoostDedupRequest",[745,1959,1960,1972],{},[748,1961,1962],{},[751,1963,1964,1966,1968,1970],{},[754,1965,756],{},[754,1967,759],{},[754,1969,762],{},[754,1971,765],{},[767,1973,1974],{},[751,1975,1976,1980,1982,1984],{},[772,1977,1978],{},[741,1979,776],{},[772,1981,779],{},[772,1983,1378],{},[772,1985,944],{},[696,1987,1988,1046,1990,1993],{},[735,1989,904],{},[741,1991,1992],{},"boolean"," — true if an active boost recommendation exists.",[719,1995,1997],{"id":1996},"shopee-ads","Shopee ads",[724,1999,2002,2010,2014,2019,2125],{"method":726,"path":2000,"summary":2001},"\u002Fapi\u002Frecommendation\u002Fads\u002Ffetch","List Shopee ads recommendations",[696,2003,2004,2005,1235,2007,1507],{},"Fetches Shopee single-campaign ads recommendations — budget and bid adjustments to optimize ad-spend ROI. Each targets a specific campaign. Call ",[741,2006,1504],{},[741,2008,2009],{},"\u002Fkeywords",[696,2011,2012],{},[735,2013,737],{},[696,2015,2016],{},[741,2017,2018],{},"ShopeeAdsRecommendationFilter",[745,2020,2021,2033],{},[748,2022,2023],{},[751,2024,2025,2027,2029,2031],{},[754,2026,756],{},[754,2028,759],{},[754,2030,762],{},[754,2032,765],{},[767,2034,2035,2047,2059,2071,2083,2097,2111],{},[751,2036,2037,2041,2043,2045],{},[772,2038,2039],{},[741,2040,878],{},[772,2042,779],{},[772,2044,782],{},[772,2046,1193],{},[751,2048,2049,2053,2055,2057],{},[772,2050,2051],{},[741,2052,776],{},[772,2054,779],{},[772,2056,782],{},[772,2058,785],{},[751,2060,2061,2065,2067,2069],{},[772,2062,2063],{},[741,2064,1212],{},[772,2066,795],{},[772,2068,782],{},[772,2070,1219],{},[751,2072,2073,2077,2079,2081],{},[772,2074,2075],{},[741,2076,838],{},[772,2078,795],{},[772,2080,782],{},[772,2082,1251],{},[751,2084,2085,2090,2092,2094],{},[772,2086,2087],{},[741,2088,2089],{},"campaignId",[772,2091,779],{},[772,2093,782],{},[772,2095,2096],{},"Filter by Shopee campaign id",[751,2098,2099,2104,2106,2108],{},[772,2100,2101],{},[741,2102,2103],{},"adsActionType",[772,2105,795],{},[772,2107,782],{},[772,2109,2110],{},"e.g. budget_adjust, keyword_change",[751,2112,2113,2118,2120,2122],{},[772,2114,2115],{},[741,2116,2117],{},"includeHistory",[772,2119,1992],{},[772,2121,782],{},[772,2123,2124],{},"Include rejected\u002Fcompleted (default false → active only)",[696,2126,2127,905,2129,1046,2132,804,2134,804,2136,804,2138,2140,2141],{},[735,2128,904],{},[741,2130,2131],{},"ShopeeAdsRecommendation",[741,2133,878],{},[741,2135,776],{},[741,2137,2089],{},[741,2139,838],{},", current vs proposed budget\u002Fbids, expected ROAS\u002FROI uplift. ",[1032,2142,1034],{},[724,2144,2147,2150,2154],{"method":726,"path":2145,"summary":2146},"\u002Fapi\u002Frecommendation\u002Fads\u002Fdetails\u002Ffetch","Ads recommendation details",[696,2148,2149],{},"Expands a campaign ads recommendation: current vs proposed performance (spend, sales, ROAS), reason, confidence, and risk.",[696,2151,2152,1289],{},[735,2153,737],{},[696,2155,2156,905,2158,1046,2161,2163],{},[735,2157,904],{},[741,2159,2160],{},"ShopeeAdsRecommendationDetailResponse",[741,2162,878],{},", current\u002Fproposed budget\u002Fbid\u002Fspend\u002Fsales\u002FROAS, expected uplift %, reason, confidence, risk.",[724,2165,2168,2171,2175],{"method":726,"path":2166,"summary":2167},"\u002Fapi\u002Frecommendation\u002Fads\u002Fkeywords\u002Ffetch","Ads keyword changes",[696,2169,2170],{},"For keyword-optimization recommendations: the keywords to add\u002Fmodify\u002Fremove and their estimated impact on relevance and CPC.",[696,2172,2173,1289],{},[735,2174,737],{},[696,2176,2177,905,2179,1046,2182,804,2184,804,2187,2190],{},[735,2178,904],{},[741,2180,2181],{},"ShopeeAdsRecommendationKeywordChange",[741,2183,878],{},[741,2185,2186],{},"keyword",[741,2188,2189],{},"action"," (add\u002Fmodify\u002Fremove), current\u002Fproposed bid, estimated CPC impact, relevance score.",[724,2192,2195,2198,2202,2207,2248],{"method":726,"path":2193,"summary":2194},"\u002Fapi\u002Frecommendation\u002Fads\u002Fcheck-dedup","Does the campaign have an active recommendation?",[696,2196,2197],{},"Returns true if the campaign already has a non-rejected ads recommendation.",[696,2199,2200],{},[735,2201,737],{},[696,2203,2204],{},[741,2205,2206],{},"CheckAdsDedupRequest",[745,2208,2209,2221],{},[748,2210,2211],{},[751,2212,2213,2215,2217,2219],{},[754,2214,756],{},[754,2216,759],{},[754,2218,762],{},[754,2220,765],{},[767,2222,2223,2235],{},[751,2224,2225,2229,2231,2233],{},[772,2226,2227],{},[741,2228,776],{},[772,2230,779],{},[772,2232,1378],{},[772,2234,944],{},[751,2236,2237,2241,2243,2245],{},[772,2238,2239],{},[741,2240,2089],{},[772,2242,779],{},[772,2244,782],{},[772,2246,2247],{},"Shopee campaign id (omit → checks all campaigns)",[696,2249,2250,1046,2252,2254],{},[735,2251,904],{},[741,2253,1992],{}," — true if an active recommendation exists for the campaign.",[724,2256,2259,2262,2266,2270,2311],{"method":726,"path":2257,"summary":2258},"\u002Fapi\u002Frecommendation\u002Fads\u002Fcheck-actionable","Is the ads recommendation still actionable?",[696,2260,2261],{},"Returns true if the recommendation is in a state that can be applied\u002Fresumed (proposed\u002Fpaused), false if it's mid-flight or terminal — so a UI can show a refresh prompt.",[696,2263,2264],{},[735,2265,737],{},[696,2267,2268],{},[741,2269,2206],{},[745,2271,2272,2284],{},[748,2273,2274],{},[751,2275,2276,2278,2280,2282],{},[754,2277,756],{},[754,2279,759],{},[754,2281,762],{},[754,2283,765],{},[767,2285,2286,2298],{},[751,2287,2288,2292,2294,2296],{},[772,2289,2290],{},[741,2291,776],{},[772,2293,779],{},[772,2295,1378],{},[772,2297,944],{},[751,2299,2300,2304,2306,2308],{},[772,2301,2302],{},[741,2303,2089],{},[772,2305,779],{},[772,2307,782],{},[772,2309,2310],{},"Shopee campaign id",[696,2312,2313,1046,2315,2317],{},[735,2314,904],{},[741,2316,1992],{}," — true if the recommendation can be applied\u002Fresumed.",[719,2319,320],{"id":2320},"target-roas",[724,2322,2325,2328,2332,2336,2414],{"method":726,"path":2323,"summary":2324},"\u002Fapi\u002Frecommendation\u002Fads\u002Ftarget-roas\u002Ffetch","List target-ROAS recommendations",[696,2326,2327],{},"Fetches margin-based target-ROAS recommendations for Shopee GMV-Max product campaigns. Each derives a ROAS target from product margin, break-even, and your desired net margin. Returns the recommendation plus current detail.",[696,2329,2330],{},[735,2331,737],{},[696,2333,2334],{},[741,2335,2018],{},[745,2337,2338,2350],{},[748,2339,2340],{},[751,2341,2342,2344,2346,2348],{},[754,2343,756],{},[754,2345,759],{},[754,2347,762],{},[754,2349,765],{},[767,2351,2352,2364,2377,2389,2401],{},[751,2353,2354,2358,2360,2362],{},[772,2355,2356],{},[741,2357,878],{},[772,2359,779],{},[772,2361,782],{},[772,2363,1193],{},[751,2365,2366,2370,2372,2374],{},[772,2367,2368],{},[741,2369,776],{},[772,2371,779],{},[772,2373,782],{},[772,2375,2376],{},"Filter by shop (required for list)",[751,2378,2379,2383,2385,2387],{},[772,2380,2381],{},[741,2382,1212],{},[772,2384,795],{},[772,2386,782],{},[772,2388,1219],{},[751,2390,2391,2395,2397,2399],{},[772,2392,2393],{},[741,2394,838],{},[772,2396,795],{},[772,2398,782],{},[772,2400,1251],{},[751,2402,2403,2407,2409,2411],{},[772,2404,2405],{},[741,2406,2089],{},[772,2408,779],{},[772,2410,782],{},[772,2412,2413],{},"Filter by campaign",[696,2415,2416,905,2418,1046,2421,2424,2425,2428,2429,2432],{},[735,2417,904],{},[741,2419,2420],{},"TargetRoasRecommendationView",[741,2422,2423],{},"recommendation"," (full object), ",[741,2426,2427],{},"detail"," (current\u002Fproposed\u002Fbreak-even ROAS, margin %), and ",[741,2430,2431],{},"editedByUser"," flag.",[724,2434,2437,2440,2444,2449,2531],{"method":726,"path":2435,"summary":2436},"\u002Fapi\u002Frecommendation\u002Fads\u002Ftarget-roas\u002Fpreview","Preview margin → target ROAS",[696,2438,2439],{},"Given a product margin and desired net margin, returns break-even ROAS and recommended target ROAS (and optionally the implied margin for a desired ROAS). No writes — backs the margin\u002FROAS slider.",[696,2441,2442],{},[735,2443,737],{},[696,2445,2446],{},[741,2447,2448],{},"TargetRoasPreviewRequest",[745,2450,2451,2463],{},[748,2452,2453],{},[751,2454,2455,2457,2459,2461],{},[754,2456,756],{},[754,2458,759],{},[754,2460,762],{},[754,2462,765],{},[767,2464,2465,2477,2489,2503,2517],{},[751,2466,2467,2471,2473,2475],{},[772,2468,2469],{},[741,2470,776],{},[772,2472,779],{},[772,2474,1378],{},[772,2476,944],{},[751,2478,2479,2483,2485,2487],{},[772,2480,2481],{},[741,2482,1212],{},[772,2484,795],{},[772,2486,1378],{},[772,2488,1779],{},[751,2490,2491,2496,2498,2500],{},[772,2492,2493],{},[741,2494,2495],{},"margin",[772,2497,988],{},[772,2499,782],{},[772,2501,2502],{},"Product margin (0–1, e.g. 0.15)",[751,2504,2505,2510,2512,2514],{},[772,2506,2507],{},[741,2508,2509],{},"targetMargin",[772,2511,988],{},[772,2513,782],{},[772,2515,2516],{},"Desired net margin after ad spend (default: margin\u002F2)",[751,2518,2519,2524,2526,2528],{},[772,2520,2521],{},[741,2522,2523],{},"desiredRoas",[772,2525,988],{},[772,2527,782],{},[772,2529,2530],{},"A specific ROAS target → returns implied margin",[696,2532,2533,1046,2535,1046,2538,804,2541,804,2544,804,2547,2550,2551,1140],{},[735,2534,904],{},[741,2536,2537],{},"TargetRoasPreviewResponse",[741,2539,2540],{},"breakEvenRoas",[741,2542,2543],{},"recommendedRoasTarget",[741,2545,2546],{},"targetMarginInfeasible",[741,2548,2549],{},"impliedMarginForDesiredRoas",", and a human-readable ",[741,2552,2553],{},"explanation",[724,2555,2558,2561,2565,2570,2664],{"method":726,"path":2556,"summary":2557},"\u002Fapi\u002Frecommendation\u002Fads\u002Ftarget-roas\u002Fpreview-profit","Preview target profit → target ROAS",[696,2559,2560],{},"Money-based sibling of preview: given a margin, absolute target profit, and ad spend, returns break-even ROAS and recommended target ROAS. No writes.",[696,2562,2563],{},[735,2564,737],{},[696,2566,2567],{},[741,2568,2569],{},"TargetProfitPreviewRequest",[745,2571,2572,2584],{},[748,2573,2574],{},[751,2575,2576,2578,2580,2582],{},[754,2577,756],{},[754,2579,759],{},[754,2581,762],{},[754,2583,765],{},[767,2585,2586,2598,2610,2624,2638,2651],{},[751,2587,2588,2592,2594,2596],{},[772,2589,2590],{},[741,2591,776],{},[772,2593,779],{},[772,2595,1378],{},[772,2597,944],{},[751,2599,2600,2604,2606,2608],{},[772,2601,2602],{},[741,2603,1212],{},[772,2605,795],{},[772,2607,1378],{},[772,2609,1779],{},[751,2611,2612,2617,2619,2621],{},[772,2613,2614],{},[741,2615,2616],{},"targetProfit",[772,2618,988],{},[772,2620,1378],{},[772,2622,2623],{},"Target absolute profit",[751,2625,2626,2631,2633,2635],{},[772,2627,2628],{},[741,2629,2630],{},"adSpend",[772,2632,988],{},[772,2634,1378],{},[772,2636,2637],{},"Ad spend over which profit is measured",[751,2639,2640,2644,2646,2648],{},[772,2641,2642],{},[741,2643,2495],{},[772,2645,988],{},[772,2647,782],{},[772,2649,2650],{},"Product margin",[751,2652,2653,2657,2659,2661],{},[772,2654,2655],{},[741,2656,2523],{},[772,2658,988],{},[772,2660,782],{},[772,2662,2663],{},"A specific ROAS → returns implied profit",[696,2665,2666,1046,2668,1046,2671,804,2673,804,2675,804,2678,804,2681,1140],{},[735,2667,904],{},[741,2669,2670],{},"TargetProfitPreviewResponse",[741,2672,2540],{},[741,2674,2543],{},[741,2676,2677],{},"targetProfitInfeasible",[741,2679,2680],{},"impliedProfitForDesiredRoas",[741,2682,2553],{},[724,2684,2687,2690,2697],{"method":726,"path":2685,"summary":2686},"\u002Fapi\u002Frecommendation\u002Fads\u002Ftarget-roas-gms\u002Ffetch","List GMS target-ROAS recommendations",[696,2688,2689],{},"Same as target-ROAS fetch, for Shopee GMS (GMV-Max shop) campaigns.",[696,2691,2692,1046,2694,2696],{},[735,2693,737],{},[741,2695,2018],{}," (same fields as target-roas\u002Ffetch).",[696,2698,2699,905,2701,2703,2704,2432],{},[735,2700,904],{},[741,2702,2420],{}," — recommendation + current detail + ",[741,2705,2431],{},[724,2707,2710,2713,2720],{"method":726,"path":2708,"summary":2709},"\u002Fapi\u002Frecommendation\u002Fads\u002Ftarget-roas-gms\u002Fpreview","Preview margin → target ROAS (GMS)",[696,2711,2712],{},"The margin → target-ROAS preview for GMS campaigns. No writes.",[696,2714,2715,1046,2717,2719],{},[735,2716,737],{},[741,2718,2448],{}," (same fields as target-roas\u002Fpreview).",[696,2721,2722,1046,2724,2726],{},[735,2723,904],{},[741,2725,2537],{}," — break-even and recommended ROAS, feasibility, and explanation.",[719,2728,2730],{"id":2729},"campaign-enrollment","Campaign enrollment",[724,2732,2735,2738,2742,2747,2840],{"method":726,"path":2733,"summary":2734},"\u002Fapi\u002Frecommendation\u002Fshopee\u002Fcampaign-enrollment\u002Feligibility","Check enrollment eligibility for a variant",[696,2736,2737],{},"A price simulator for Shopee campaign enrollment: returns the lowest discounted price that keeps your target margin, whether it beats the 90-day low (Shopee's floor), and the full fee breakdown at that price. No writes.",[696,2739,2740],{},[735,2741,737],{},[696,2743,2744],{},[741,2745,2746],{},"CampaignEnrollmentEligibilityRequest",[745,2748,2749,2761],{},[748,2750,2751],{},[751,2752,2753,2755,2757,2759],{},[754,2754,756],{},[754,2756,759],{},[754,2758,762],{},[754,2760,765],{},[767,2762,2763,2775,2787,2800,2813,2826],{},[751,2764,2765,2769,2771,2773],{},[772,2766,2767],{},[741,2768,776],{},[772,2770,779],{},[772,2772,1378],{},[772,2774,944],{},[751,2776,2777,2781,2783,2785],{},[772,2778,2779],{},[741,2780,1212],{},[772,2782,795],{},[772,2784,1378],{},[772,2786,1779],{},[751,2788,2789,2793,2795,2797],{},[772,2790,2791],{},[741,2792,1301],{},[772,2794,779],{},[772,2796,1378],{},[772,2798,2799],{},"Shopee item id",[751,2801,2802,2806,2808,2810],{},[772,2803,2804],{},[741,2805,1334],{},[772,2807,779],{},[772,2809,782],{},[772,2811,2812],{},"Variant id (omit for single-variant)",[751,2814,2815,2819,2821,2823],{},[772,2816,2817],{},[741,2818,2509],{},[772,2820,988],{},[772,2822,782],{},[772,2824,2825],{},"Override target margin (default: min(shop margin, 0.10))",[751,2827,2828,2833,2835,2837],{},[772,2829,2830],{},[741,2831,2832],{},"cogs",[772,2834,988],{},[772,2836,782],{},[772,2838,2839],{},"Override COGS (uses inferred if omitted)",[696,2841,2842,1046,2844,1046,2847,2849,2850,2853,2854,2857],{},[735,2843,904],{},[741,2845,2846],{},"CampaignEnrollmentEligibilityResponse",[741,2848,838],{}," (ELIGIBLE, NOT_LOWEST_IN_90D, INELIGIBLE_RATING, COGS_UNKNOWN, MARGIN_INFEASIBLE), ",[741,2851,2852],{},"recommendedDiscountedPrice",", current price, ",[741,2855,2856],{},"minPrice90d",", discount amount\u002F%, target\u002Fshop\u002Fachieved margins, COGS + source, rating, cost breakdown, and explanation.",[724,2859,2862,2865,2869,2874,2914],{"method":726,"path":2860,"summary":2861},"\u002Fapi\u002Frecommendation\u002Fshopee\u002Fcampaign-enrollment\u002Feligibility\u002Flist","List enrollment eligibility pool",[696,2863,2864],{},"Returns the pre-computed eligibility pool for a shop (one row per item\u002Fmodel), refreshed hourly and on COGS write — browse every product's status and recommended discounted price without a per-item re-check.",[696,2866,2867],{},[735,2868,737],{},[696,2870,2871],{},[741,2872,2873],{},"CampaignEnrollmentShopRequest",[745,2875,2876,2888],{},[748,2877,2878],{},[751,2879,2880,2882,2884,2886],{},[754,2881,756],{},[754,2883,759],{},[754,2885,762],{},[754,2887,765],{},[767,2889,2890,2902],{},[751,2891,2892,2896,2898,2900],{},[772,2893,2894],{},[741,2895,776],{},[772,2897,779],{},[772,2899,1378],{},[772,2901,944],{},[751,2903,2904,2908,2910,2912],{},[772,2905,2906],{},[741,2907,1212],{},[772,2909,795],{},[772,2911,1378],{},[772,2913,1779],{},[696,2915,2916,905,2918,1046,2921,804,2923,804,2925,804,2927,2853,2929,2931],{},[735,2917,904],{},[741,2919,2920],{},"ShopeeCampaignEnrollmentEligibility",[741,2922,1301],{},[741,2924,1334],{},[741,2926,838],{},[741,2928,2852],{},[741,2930,2856],{},", discount %, margins, COGS, rating, and fee breakdown.",[724,2933,2936,2939,2943,2947,2987],{"method":726,"path":2934,"summary":2935},"\u002Fapi\u002Frecommendation\u002Fshopee\u002Fcampaign-enrollment\u002Ffetch","Fetch active enrollment recommendation",[696,2937,2938],{},"Returns the shop-level campaign-join recommendation with its enrollable variants (the full export payload).",[696,2940,2941],{},[735,2942,737],{},[696,2944,2945],{},[741,2946,2873],{},[745,2948,2949,2961],{},[748,2950,2951],{},[751,2952,2953,2955,2957,2959],{},[754,2954,756],{},[754,2956,759],{},[754,2958,762],{},[754,2960,765],{},[767,2962,2963,2975],{},[751,2964,2965,2969,2971,2973],{},[772,2966,2967],{},[741,2968,776],{},[772,2970,779],{},[772,2972,1378],{},[772,2974,944],{},[751,2976,2977,2981,2983,2985],{},[772,2978,2979],{},[741,2980,1212],{},[772,2982,795],{},[772,2984,1378],{},[772,2986,1779],{},[696,2988,2989,905,2991,1046,2994,804,2996,804,2998,3000,3001],{},[735,2990,904],{},[741,2992,2993],{},"CampaignEnrollmentActionResponse",[741,2995,878],{},[741,2997,776],{},[741,2999,1212],{},", and enrollable variants with prices, discounts, and fee breakdown. ",[1032,3002,1034],{},[719,3004,3006],{"id":3005},"tiktok-ads","TikTok ads",[724,3008,3011,3014,3018,3023,3100],{"method":726,"path":3009,"summary":3010},"\u002Fapi\u002Frecommendation\u002Ftiktok\u002Fads\u002Fbudget\u002Ffetch","List TikTok budget recommendations",[696,3012,3013],{},"Fetches budget-adjust recommendations for budget-constrained TikTok GMV Max campaigns — an optimal daily budget to maximize profit given the constraint. Returns the recommendation plus current detail.",[696,3015,3016],{},[735,3017,737],{},[696,3019,3020],{},[741,3021,3022],{},"TikTokAdsRecommendationFilter",[745,3024,3025,3037],{},[748,3026,3027],{},[751,3028,3029,3031,3033,3035],{},[754,3030,756],{},[754,3032,759],{},[754,3034,762],{},[754,3036,765],{},[767,3038,3039,3051,3063,3075,3087],{},[751,3040,3041,3045,3047,3049],{},[772,3042,3043],{},[741,3044,878],{},[772,3046,779],{},[772,3048,782],{},[772,3050,1193],{},[751,3052,3053,3057,3059,3061],{},[772,3054,3055],{},[741,3056,776],{},[772,3058,779],{},[772,3060,782],{},[772,3062,2376],{},[751,3064,3065,3069,3071,3073],{},[772,3066,3067],{},[741,3068,1212],{},[772,3070,795],{},[772,3072,782],{},[772,3074,1219],{},[751,3076,3077,3081,3083,3085],{},[772,3078,3079],{},[741,3080,838],{},[772,3082,795],{},[772,3084,782],{},[772,3086,1251],{},[751,3088,3089,3093,3095,3097],{},[772,3090,3091],{},[741,3092,2089],{},[772,3094,795],{},[772,3096,782],{},[772,3098,3099],{},"Filter by TikTok campaign id",[696,3101,3102,905,3104,1046,3107,3109,3110,3112],{},[735,3103,904],{},[741,3105,3106],{},"TikTokBudgetRecommendationView",[741,3108,2423],{}," (full object) and ",[741,3111,2427],{}," (current\u002Fproposed daily budget in ad-account currency, shop-currency equivalents, optimizer context).",[724,3114,3117,3120,3127],{"method":726,"path":3115,"summary":3116},"\u002Fapi\u002Frecommendation\u002Ftiktok\u002Fads\u002Ftarget-roas\u002Ffetch","List TikTok target-ROAS recommendations",[696,3118,3119],{},"Fetches margin-based target-ROAS recommendations for TikTok GMV Max campaigns (Minimum-ROAS bidding). Returns the recommendation plus current detail.",[696,3121,3122,1046,3124,3126],{},[735,3123,737],{},[741,3125,3022],{}," (same fields as budget\u002Ffetch).",[696,3128,3129,905,3131,1046,3134,2424,3136,3138,3139,2432],{},[735,3130,904],{},[741,3132,3133],{},"TikTokTargetRoasRecommendationView",[741,3135,2423],{},[741,3137,2427],{}," (current\u002Fproposed ROI target, break-even ROAS, margin %), and ",[741,3140,2431],{},[724,3142,3145,3148,3167],{"method":726,"path":3143,"summary":3144},"\u002Fapi\u002Frecommendation\u002Ftiktok\u002Fads\u002Ftarget-roas\u002Fpreview","Preview margin → target ROAS (TikTok)",[696,3146,3147],{},"The margin → target-ROAS preview for TikTok. No writes.",[696,3149,3150,1046,3152,3154,3155,804,3157,3159,3160,804,3162,804,3164,3166],{},[735,3151,737],{},[741,3153,2448],{}," (",[741,3156,776],{},[741,3158,1212],{}," required; ",[741,3161,2495],{},[741,3163,2509],{},[741,3165,2523],{}," optional).",[696,3168,3169,1046,3171,2726],{},[735,3170,904],{},[741,3172,2537],{},[719,3174,3176],{"id":3175},"ads-portfolio","Ads portfolio",[724,3178,3181,3184,3189,3230],{"method":726,"path":3179,"summary":3180},"\u002Fapi\u002Frecommendation\u002Fads\u002Fportfolio\u002Ffetch","Fetch a shop's ads portfolio",[696,3182,3183],{},"Returns the current ads portfolio (if any) for a shop — the campaigns grouped for joint budget optimization, portfolio-level metrics, and allocation mode.",[696,3185,3186],{},[735,3187,3188],{},"Query parameters",[745,3190,3191,3204],{},[748,3192,3193],{},[751,3194,3195,3198,3200,3202],{},[754,3196,3197],{},"Name",[754,3199,759],{},[754,3201,762],{},[754,3203,765],{},[767,3205,3206,3218],{},[751,3207,3208,3212,3214,3216],{},[772,3209,3210],{},[741,3211,776],{},[772,3213,779],{},[772,3215,1378],{},[772,3217,944],{},[751,3219,3220,3224,3226,3228],{},[772,3221,3222],{},[741,3223,1212],{},[772,3225,795],{},[772,3227,1378],{},[772,3229,1779],{},[696,3231,3232,1046,3234,3237,3238,804,3241,804,3243,804,3245,804,3248,804,3251,804,3254,804,3257,1140],{},[735,3233,904],{},[741,3235,3236],{},"AdsPortfolio"," (or null) — ",[741,3239,3240],{},"portfolioId",[741,3242,776],{},[741,3244,1212],{},[741,3246,3247],{},"campaigns",[741,3249,3250],{},"portfolioStatus",[741,3252,3253],{},"totalBudget",[741,3255,3256],{},"performanceMetrics",[741,3258,3259],{},"mode",[724,3261,3264,3267,3271,3276,3305],{"method":726,"path":3262,"summary":3263},"\u002Fapi\u002Frecommendation\u002Fads\u002Fportfolio\u002Fcampaigns\u002Ffetch","Fetch campaigns in a portfolio",[696,3265,3266],{},"Returns the campaigns added to a portfolio: id, name, current daily budget, and optimizer status.",[696,3268,3269],{},[735,3270,737],{},[696,3272,3273],{},[741,3274,3275],{},"FetchPortfolioCampaignsRequest",[745,3277,3278,3290],{},[748,3279,3280],{},[751,3281,3282,3284,3286,3288],{},[754,3283,756],{},[754,3285,759],{},[754,3287,762],{},[754,3289,765],{},[767,3291,3292],{},[751,3293,3294,3298,3300,3302],{},[772,3295,3296],{},[741,3297,3240],{},[772,3299,779],{},[772,3301,1378],{},[772,3303,3304],{},"Portfolio id",[696,3306,3307,905,3309,1046,3312,804,3314,804,3317,804,3320,804,3323,804,3326,1140],{},[735,3308,904],{},[741,3310,3311],{},"AdsPortfolioCampaign",[741,3313,2089],{},[741,3315,3316],{},"campaignName",[741,3318,3319],{},"currentDailyBudget",[741,3321,3322],{},"currency",[741,3324,3325],{},"optimizerStatus",[741,3327,3328],{},"addedAt",[724,3330,3333,3336,3340,3369],{"method":726,"path":3331,"summary":3332},"\u002Fapi\u002Frecommendation\u002Fads\u002Fportfolio\u002Fallocations\u002Ffetch","Preview portfolio budget allocations",[696,3334,3335],{},"Returns the per-campaign budget allocation a portfolio recommendation suggests — how much of the total budget to give each campaign to maximize overall profit. For preview before apply.",[696,3337,3338],{},[735,3339,3188],{},[745,3341,3342,3354],{},[748,3343,3344],{},[751,3345,3346,3348,3350,3352],{},[754,3347,3197],{},[754,3349,759],{},[754,3351,762],{},[754,3353,765],{},[767,3355,3356],{},[751,3357,3358,3362,3364,3366],{},[772,3359,3360],{},[741,3361,878],{},[772,3363,779],{},[772,3365,1378],{},[772,3367,3368],{},"Portfolio recommendation id",[696,3370,3371,905,3373,1046,3376,804,3378,804,3380,804,3382,804,3385,804,3388,804,3390,804,3393,1140],{},[735,3372,904],{},[741,3374,3375],{},"AdsPortfolioAllocation",[741,3377,2089],{},[741,3379,3316],{},[741,3381,3319],{},[741,3383,3384],{},"recommendedDailyBudget",[741,3386,3387],{},"budgetDelta",[741,3389,3322],{},[741,3391,3392],{},"expectedRoiUplift",[741,3394,985],{},[719,3396,3398],{"id":3397},"policy","Policy",[724,3400,3403,3406,3410,3415,3514],{"method":726,"path":3401,"summary":3402},"\u002Fapi\u002Fpolicy\u002Fexperiments\u002Ffetch","Fetch policy experiments",[696,3404,3405],{},"Returns experiments (A\u002FB and multivariate tests) tied to recommendations and policies — each tracks expected uplift, dates, and a performance time series.",[696,3407,3408],{},[735,3409,737],{},[696,3411,3412],{},[741,3413,3414],{},"PolicyExperimentFilter",[745,3416,3417,3429],{},[748,3418,3419],{},[751,3420,3421,3423,3425,3427],{},[754,3422,756],{},[754,3424,759],{},[754,3426,762],{},[754,3428,765],{},[767,3430,3431,3444,3456,3468,3480,3500],{},[751,3432,3433,3437,3439,3441],{},[772,3434,3435],{},[741,3436,892],{},[772,3438,779],{},[772,3440,782],{},[772,3442,3443],{},"Fetch a single experiment",[751,3445,3446,3450,3452,3454],{},[772,3447,3448],{},[741,3449,776],{},[772,3451,779],{},[772,3453,782],{},[772,3455,785],{},[751,3457,3458,3462,3464,3466],{},[772,3459,3460],{},[741,3461,1212],{},[772,3463,795],{},[772,3465,782],{},[772,3467,1219],{},[751,3469,3470,3474,3476,3478],{},[772,3471,3472],{},[741,3473,951],{},[772,3475,795],{},[772,3477,782],{},[772,3479,1581],{},[751,3481,3482,3486,3488,3490],{},[772,3483,3484],{},[741,3485,838],{},[772,3487,795],{},[772,3489,782],{},[772,3491,3492,804,3495,804,3497],{},[741,3493,3494],{},"active",[741,3496,859],{},[741,3498,3499],{},"cancelled",[751,3501,3502,3507,3509,3511],{},[772,3503,3504],{},[741,3505,3506],{},"name",[772,3508,795],{},[772,3510,782],{},[772,3512,3513],{},"Substring match on experiment name",[696,3515,3516,905,3518,1046,3521,804,3523,804,3525,804,3527,804,3529,804,3531,804,3534,804,3536,804,3538,804,3541,3544,3545],{},[735,3517,904],{},[741,3519,3520],{},"PolicyExperiment",[741,3522,892],{},[741,3524,776],{},[741,3526,1212],{},[741,3528,951],{},[741,3530,3506],{},[741,3532,3533],{},"description",[741,3535,838],{},[741,3537,998],{},[741,3539,3540],{},"startedAt",[741,3542,3543],{},"endedAt",". ",[1032,3546,1034],{},[724,3548,3551,3557,3561,3566,3673],{"method":726,"path":3549,"summary":3550},"\u002Fapi\u002Fpolicy\u002Fpolicies\u002Ffetch","Fetch policies",[696,3552,3553,3554,1140],{},"Returns policies — the levers and feature gates that govern which recommendations are generated, how they're applied, and when they expire. Parameters live in the history; call ",[741,3555,3556],{},"\u002Fhistory\u002Ffetch",[696,3558,3559],{},[735,3560,737],{},[696,3562,3563],{},[741,3564,3565],{},"PolicyFilter",[745,3567,3568,3580],{},[748,3569,3570],{},[751,3571,3572,3574,3576,3578],{},[754,3573,756],{},[754,3575,759],{},[754,3577,762],{},[754,3579,765],{},[767,3581,3582,3596,3608,3620,3639,3653],{},[751,3583,3584,3589,3591,3593],{},[772,3585,3586],{},[741,3587,3588],{},"policyId",[772,3590,779],{},[772,3592,782],{},[772,3594,3595],{},"Fetch a single policy",[751,3597,3598,3602,3604,3606],{},[772,3599,3600],{},[741,3601,776],{},[772,3603,779],{},[772,3605,782],{},[772,3607,785],{},[751,3609,3610,3614,3616,3618],{},[772,3611,3612],{},[741,3613,1212],{},[772,3615,795],{},[772,3617,782],{},[772,3619,1219],{},[751,3621,3622,3626,3628,3630],{},[772,3623,3624],{},[741,3625,951],{},[772,3627,795],{},[772,3629,782],{},[772,3631,3632,804,3634,804,3636],{},[741,3633,1234],{},[741,3635,1238],{},[741,3637,3638],{},"lazada",[751,3640,3641,3646,3648,3650],{},[772,3642,3643],{},[741,3644,3645],{},"isActive",[772,3647,1992],{},[772,3649,782],{},[772,3651,3652],{},"Filter by active status",[751,3654,3655,3659,3661,3663],{},[772,3656,3657],{},[741,3658,838],{},[772,3660,795],{},[772,3662,782],{},[772,3664,3665,804,3667,804,3670],{},[741,3666,3494],{},[741,3668,3669],{},"inactive",[741,3671,3672],{},"deprecated",[696,3674,3675,905,3677,1046,3679,804,3681,804,3683,804,3685,804,3687,804,3689,804,3691,804,3694,804,3696,1140],{},[735,3676,904],{},[741,3678,3398],{},[741,3680,3588],{},[741,3682,776],{},[741,3684,1212],{},[741,3686,951],{},[741,3688,3645],{},[741,3690,838],{},[741,3692,3693],{},"currentHistoryId",[741,3695,1139],{},[741,3697,3698],{},"updatedAt",[724,3700,3703,3706,3710,3715,3812],{"method":726,"path":3701,"summary":3702},"\u002Fapi\u002Fpolicy\u002Fpolicies\u002Fhistory\u002Ffetch","Fetch policy history",[696,3704,3705],{},"Returns the audit trail for a policy: each version of its parameters, when it was valid, which experiment it was tied to, and who changed it.",[696,3707,3708],{},[735,3709,737],{},[696,3711,3712],{},[741,3713,3714],{},"PolicyHistoryFilter",[745,3716,3717,3729],{},[748,3718,3719],{},[751,3720,3721,3723,3725,3727],{},[754,3722,756],{},[754,3724,759],{},[754,3726,762],{},[754,3728,765],{},[767,3730,3731,3744,3758,3772,3784,3798],{},[751,3732,3733,3737,3739,3741],{},[772,3734,3735],{},[741,3736,3588],{},[772,3738,779],{},[772,3740,1378],{},[772,3742,3743],{},"Policy to fetch history for",[751,3745,3746,3751,3753,3755],{},[772,3747,3748],{},[741,3749,3750],{},"isCurrent",[772,3752,1992],{},[772,3754,782],{},[772,3756,3757],{},"Only the current version",[751,3759,3760,3765,3767,3769],{},[772,3761,3762],{},[741,3763,3764],{},"version",[772,3766,779],{},[772,3768,782],{},[772,3770,3771],{},"A specific version number",[751,3773,3774,3778,3780,3782],{},[772,3775,3776],{},[741,3777,892],{},[772,3779,779],{},[772,3781,782],{},[772,3783,899],{},[751,3785,3786,3791,3793,3795],{},[772,3787,3788],{},[741,3789,3790],{},"validFromGte",[772,3792,1025],{},[772,3794,782],{},[772,3796,3797],{},"Valid-from ≥ this date",[751,3799,3800,3805,3807,3809],{},[772,3801,3802],{},[741,3803,3804],{},"validFromLt",[772,3806,1025],{},[772,3808,782],{},[772,3810,3811],{},"Valid-from \u003C this date",[696,3813,3814,905,3816,1046,3819,804,3822,804,3824,804,3827,3830,3831,804,3833,804,3836,804,3839,804,3841,804,3843,804,3845,804,3848,1140],{},[735,3815,904],{},[741,3817,3818],{},"PolicyHistory",[741,3820,3821],{},"policyHistoryId",[741,3823,3588],{},[741,3825,3826],{},"controller",[741,3828,3829],{},"params"," (JSON), ",[741,3832,3764],{},[741,3834,3835],{},"validFrom",[741,3837,3838],{},"validTo",[741,3840,3750],{},[741,3842,892],{},[741,3844,1130],{},[741,3846,3847],{},"changeReason",[741,3849,1139],{},{"title":3851,"searchDepth":3852,"depth":3852,"links":3853},"",3,[3854,3856,3857,3858,3859,3860,3861,3862,3863,3864,3865],{"id":721,"depth":3855,"text":722},2,{"id":1143,"depth":3855,"text":1144},{"id":1493,"depth":3855,"text":1494},{"id":1722,"depth":3855,"text":311},{"id":1818,"depth":3855,"text":1819},{"id":1996,"depth":3855,"text":1997},{"id":2320,"depth":3855,"text":320},{"id":2729,"depth":3855,"text":2730},{"id":3005,"depth":3855,"text":3006},{"id":3175,"depth":3855,"text":3176},{"id":3397,"depth":3855,"text":3398},"Read the profit-improving Actions the engine generates — pricing, ads, bundles, boosts, campaigns, and policies.",null,"md",{},{"icon":552},"---\ntitle: \"Endpoints: Actions & recommendations\"\ndescription: Read the profit-improving Actions the engine generates — pricing, ads, bundles, boosts, campaigns, and policies.\nnavigation:\n  icon: i-material-symbols-recommend-rounded\n---\n\nIn DataGlass, [Actions](\u002Fdocs\u002Fgrowth\u002Factions\u002Fwhat-are-actions) are profit-improving recommendations the engine generates. These endpoints let you read them — the recommendation list, per-item details, dedup checks (does this product already have an active recommendation?), and what-if previews. See [Getting started](\u002Fdocs\u002Fai-and-api\u002Fapi\u002Fgetting-started) for auth and [Conventions](\u002Fdocs\u002Fai-and-api\u002Fapi\u002Fgetting-started#conventions). All read-only — applying or deploying an Action requires the DataGlass app.\n\n::callout{icon=\"i-lucide-mouse-pointer-click\"}\nClick any endpoint to expand its parameters, request body, and response.\n::\n\n## Recommendations (general)\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Ffetch\" summary=\"List all recommendation types\"}\nFetches your active recommendations across all types (pricing, ads, inventory), newest first. Each carries its type, shop, status, expected uplift, and risk metrics. Use this to populate the main Actions dashboard, or filter by shop\u002Fregion\u002Fplatform\u002Ftype.\n\n**Request body**\n\n`RecommendationFilter`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `shopId` | integer | no | Filter by shop |\n| `recommendationType` | string | no | e.g. `price_buffer_discount`, `bundle_deal`, `commission_adjust`, `product_boost`, `ads`, `ads_target_roas`, `ads_target_roas_gms`, `campaign_enrollment`, `tiktok_ads_budget`, `tiktok_ads_target_roas` |\n| `status` | string | no | e.g. `proposed`, `approved`, `executing`, `paused`, `completed`, `failed`, `stopped`, `rolled_back`, `rejected` |\n| `recommendationId` | integer | no | Fetch a single recommendation by id |\n| `experimentId` | integer | no | Filter by experiment id |\n\n**Response** — Array of `Recommendation`\n\n| Field | Type | Description |\n|---|---|---|\n| `recommendationId` | integer | Recommendation id |\n| `shopId` | integer | Shop id |\n| `platform` | string | Platform |\n| `recommendationType` | string | The type (see filter values above) |\n| `status` | string | Lifecycle state |\n| `confidence` | number | Confidence (0–1, higher = more certain) |\n| `expectedUpliftValue` | number | Estimated profit impact |\n| `riskScore` | number | Risk score (0–1) |\n| `validUntil` | string (date) | Expiry |\n\n*…and more — see the full schema in the OpenAPI spec.*\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Ffetch-failed\" summary=\"List failed recommendations\"}\nReturns recommendations whose apply operation failed, paired with the captured failure reason. The failure is terminal (the recommendation is dismissed).\n\n**Request body** — `RecommendationFilter` (same fields as above).\n\n**Response** — Array of `FailedRecommendation` — all `Recommendation` fields plus `failureReason` (string) and `failedAt` (date).\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fstate-change-log\u002Ffetch\" summary=\"Recommendation status audit trail\"}\nReturns the state-change log for a recommendation — every transition (proposed → approved → executing → completed, or paused\u002Fstopped\u002Frolled_back\u002Frejected), who triggered it, and any captured reason.\n\n**Request body**\n\n`RecommendationStateChangeLogFilter`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `recommendationId` | integer | no | Recommendation to audit (omit → empty result) |\n\n**Response** — Array of `RecommendationStateChangeLog` — entries with `fromStatus`, `toStatus`, `changedBy`, `reason`, `metadata`, `createdAt`.\n::\n\n## Price-buffer discount\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fprice-buffer-discount\u002Ffetch\" summary=\"List price-buffer recommendations\"}\nFetches price-buffer (margin-defence) recommendations for Shopee or TikTok — each protects your margin against fee\u002Fcost increases by recommending a price change. Returns a summary per recommendation; call `\u002Fitems` for per-product detail.\n\n**Request body**\n\n`FetchPriceBufferDiscountRecommendationsRequest`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `recommendationId` | integer | no | Fetch a single recommendation |\n| `shopId` | integer | no | Filter by shop |\n| `region` | string | no | Filter by region |\n| `platform` | string | no | `shopee` or `tiktok_shop` |\n| `status` | string | no | Filter by status |\n\n**Response** — Array of `PriceBufferDiscountRecommendationResponse` — `recommendationId`, `shopId`, `region`, `platform`, `status`, `expectedUpliftValue`, plus a nested `items` summary. *…and more — see the full schema in the OpenAPI spec.*\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fprice-buffer-discount\u002Fitems\u002Ffetch\" summary=\"Per-item price-buffer details\"}\nExpands recommendations to per-item detail: current\u002Fproposed\u002Fpromotion prices, discount %, the protection reason, and buyer-price impact.\n\n**Request body** — Array of recommendation ids (integer; max 500).\n\n**Response** — Array of `PriceBufferDiscountRecommendationItemResponse` — `recommendationId`, `itemId`, unit count, current\u002Fproposed\u002Fpromotion prices, discount %, `reason` (e.g. fee_increase, cost_increase), `buyerPriceDelta`, and cost-breakdown fields.\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fprice-buffer-discount\u002Fmodels\u002Ffetch\" summary=\"Per-model price-buffer prices\"}\nPer-variant (model) price breakdown for the recommended items: current\u002Fproposed\u002Fpromotion prices and buyer-price delta.\n\n**Request body** — Array of recommendation ids (integer; max 500).\n\n**Response** — Array of `PriceBufferDiscountRecommendationModelResponse` — `recommendationId`, `itemId`, `modelId`, current\u002Fproposed\u002Fpromotion price, discount %, buyer-price delta.\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fprice-buffer-discount\u002Fcheck-dedup\" summary=\"Which items already have active recommendations\"}\nReturns which of the given item ids already have an active (non-rejected) price-buffer recommendation, so a UI can pre-filter them from a \"generate new\" flow.\n\n**Request body**\n\n`CheckPriceBufferDiscountDedupRequest`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `shopId` | integer | yes | Shop id |\n| `itemIds` | array | yes | Item ids to check (max 500) |\n\n**Response** — `Set\u003CLong>` — the subset of `itemIds` that already have an active recommendation (empty = all available).\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fprice-buffer-discount\u002Fcheck-dedup-by-platform\" summary=\"Platform-neutral dedup check\"}\nPlatform-neutral dedup: pass platform-native item ids (e.g. TikTok product ids as strings) instead of numeric Shopee item ids.\n\n**Request body**\n\n`CheckPriceBufferDiscountPlatformDedupRequest`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `shopId` | integer | yes | Shop id |\n| `platform` | string | yes | `shopee` or `tiktok_shop` |\n| `platformItemIds` | array | yes | Platform-native item ids (max 500) |\n\n**Response** — `Set\u003CString>` — the subset of `platformItemIds` that already have an active recommendation.\n::\n\n## Bundle deal\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fbundle-deal\u002Ffetch\" summary=\"List bundle-deal recommendations\"}\nFetches Shopee bundle-deal recommendations — product groupings to offer as a bundle to lift basket size and AOV. Returns a summary per recommendation; call `\u002Fdetails` or `\u002Fitems` for expanded data.\n\n**Request body**\n\n`BundleDealRecommendationFilter`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `recommendationId` | integer | no | Fetch a single recommendation |\n| `shopId` | integer | no | Filter by shop |\n| `region` | string | no | Filter by region |\n| `platform` | string | no | Filter by platform |\n| `status` | string | no | Filter by status |\n\n**Response** — Array of `BundleDealRecommendation` — `recommendationId`, `shopId`, `region`, `status`, expected uplift, and the bundle structure. *…and more — see the full schema in the OpenAPI spec.*\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fbundle-deal\u002Fdetails\u002Ffetch\" summary=\"Bundle-deal details\"}\nExpands bundle recommendations: full bundle structure (items, variants, per-item pricing) and rationale.\n\n**Request body** — Array of recommendation ids (integer; max 500).\n\n**Response** — Array of `BundleDealRecommendationDetail` — `recommendationId`, bundle name\u002Fdescription, bundled items with prices\u002Fdiscounts, expected basket impact, reason.\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fbundle-deal\u002Fitems\u002Ffetch\" summary=\"Per-item bundle details\"}\nPer-item details within bundles: current vs bundled price, discount, margin impact, and contribution to uplift.\n\n**Request body** — Array of recommendation ids (integer; max 500).\n\n**Response** — Array of `BundleDealRecommendationItem` — `recommendationId`, `itemId`, current\u002Fbundled price, discount %, estimated sales lift, margin delta.\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fbundle-deal\u002Fcheck-dedup\" summary=\"Which products already have bundle recommendations\"}\nReturns which item ids already have an active bundle-deal recommendation.\n\n**Request body**\n\n`CheckBundleDealDedupRequest`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `shopId` | integer | yes | Shop id |\n| `itemIds` | array | yes | Item ids to check (max 500) |\n\n**Response** — `Set\u003CLong>` — the subset of `itemIds` that already have an active recommendation.\n::\n\n## Commission adjust\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fcommission-adjust\u002Ffetch\" summary=\"List commission-adjust actions\"}\nFetches margin-defence actions for a Shopee shop facing an upcoming commission-rate increase. Each recommends a discount-trim or price-raise per item\u002Fvariant to preserve the protected margin.\n\n**Request body**\n\n`CommissionAdjustShopRequest`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `shopId` | integer | yes | Shop id |\n| `region` | string | yes | Region code |\n| `status` | string | no | Filter by status |\n\n**Response** — Array of `CommissionAdjustActionResponse` — `recommendationId`, `shopId`, `region`, `status`, `commissionEffectiveDate`, `protectedMarginPct`, impacted items with margin snapshot and estimated profit impact, and per-model recommended lever. *…and more — see the full schema in the OpenAPI spec.*\n::\n\n## Product boost\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fboost\u002Ffetch\" summary=\"List product-boost recommendations\"}\nFetches Shopee product-boost recommendations — which products to boost in search\u002Ffeed to increase visibility and sales. Call `\u002Fitems` for the full product list.\n\n**Request body**\n\n`BoostRecommendationFilter`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `recommendationId` | integer | no | Fetch a single recommendation |\n| `shopId` | integer | no | Filter by shop |\n| `region` | string | no | Filter by region |\n| `status` | string | no | Filter by status |\n\n**Response** — Array of `BoostRecommendation` — `recommendationId`, `shopId`, `region`, `status`, expected uplift, and the nested product list.\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fboost\u002Fitems\u002Ffetch\" summary=\"Products in a boost recommendation\"}\nExpands boost recommendations to the product list, current metrics, and expected uplift.\n\n**Request body** — Array of recommendation ids (integer; max 500).\n\n**Response** — Array of `BoostRecommendationItem` — `recommendationId`, `itemId`, current sales\u002Fprofit, expected sales uplift %, estimated profit impact, and ranking.\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fboost\u002Fcheck-dedup\" summary=\"Does the shop have an active boost recommendation?\"}\nReturns true if the shop already has a non-rejected boost recommendation — so a UI can gate the \"Create new\" control.\n\n**Request body**\n\n`CheckBoostDedupRequest`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `shopId` | integer | yes | Shop id |\n\n**Response** — `boolean` — true if an active boost recommendation exists.\n::\n\n## Shopee ads\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fads\u002Ffetch\" summary=\"List Shopee ads recommendations\"}\nFetches Shopee single-campaign ads recommendations — budget and bid adjustments to optimize ad-spend ROI. Each targets a specific campaign. Call `\u002Fdetails` or `\u002Fkeywords` for expanded data.\n\n**Request body**\n\n`ShopeeAdsRecommendationFilter`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `recommendationId` | integer | no | Fetch a single recommendation |\n| `shopId` | integer | no | Filter by shop |\n| `region` | string | no | Filter by region |\n| `status` | string | no | Filter by status |\n| `campaignId` | integer | no | Filter by Shopee campaign id |\n| `adsActionType` | string | no | e.g. budget_adjust, keyword_change |\n| `includeHistory` | boolean | no | Include rejected\u002Fcompleted (default false → active only) |\n\n**Response** — Array of `ShopeeAdsRecommendation` — `recommendationId`, `shopId`, `campaignId`, `status`, current vs proposed budget\u002Fbids, expected ROAS\u002FROI uplift. *…and more — see the full schema in the OpenAPI spec.*\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fads\u002Fdetails\u002Ffetch\" summary=\"Ads recommendation details\"}\nExpands a campaign ads recommendation: current vs proposed performance (spend, sales, ROAS), reason, confidence, and risk.\n\n**Request body** — Array of recommendation ids (integer; max 500).\n\n**Response** — Array of `ShopeeAdsRecommendationDetailResponse` — `recommendationId`, current\u002Fproposed budget\u002Fbid\u002Fspend\u002Fsales\u002FROAS, expected uplift %, reason, confidence, risk.\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fads\u002Fkeywords\u002Ffetch\" summary=\"Ads keyword changes\"}\nFor keyword-optimization recommendations: the keywords to add\u002Fmodify\u002Fremove and their estimated impact on relevance and CPC.\n\n**Request body** — Array of recommendation ids (integer; max 500).\n\n**Response** — Array of `ShopeeAdsRecommendationKeywordChange` — `recommendationId`, `keyword`, `action` (add\u002Fmodify\u002Fremove), current\u002Fproposed bid, estimated CPC impact, relevance score.\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fads\u002Fcheck-dedup\" summary=\"Does the campaign have an active recommendation?\"}\nReturns true if the campaign already has a non-rejected ads recommendation.\n\n**Request body**\n\n`CheckAdsDedupRequest`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `shopId` | integer | yes | Shop id |\n| `campaignId` | integer | no | Shopee campaign id (omit → checks all campaigns) |\n\n**Response** — `boolean` — true if an active recommendation exists for the campaign.\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fads\u002Fcheck-actionable\" summary=\"Is the ads recommendation still actionable?\"}\nReturns true if the recommendation is in a state that can be applied\u002Fresumed (proposed\u002Fpaused), false if it's mid-flight or terminal — so a UI can show a refresh prompt.\n\n**Request body**\n\n`CheckAdsDedupRequest`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `shopId` | integer | yes | Shop id |\n| `campaignId` | integer | no | Shopee campaign id |\n\n**Response** — `boolean` — true if the recommendation can be applied\u002Fresumed.\n::\n\n## Target ROAS\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fads\u002Ftarget-roas\u002Ffetch\" summary=\"List target-ROAS recommendations\"}\nFetches margin-based target-ROAS recommendations for Shopee GMV-Max product campaigns. Each derives a ROAS target from product margin, break-even, and your desired net margin. Returns the recommendation plus current detail.\n\n**Request body**\n\n`ShopeeAdsRecommendationFilter`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `recommendationId` | integer | no | Fetch a single recommendation |\n| `shopId` | integer | no | Filter by shop (required for list) |\n| `region` | string | no | Filter by region |\n| `status` | string | no | Filter by status |\n| `campaignId` | integer | no | Filter by campaign |\n\n**Response** — Array of `TargetRoasRecommendationView` — `recommendation` (full object), `detail` (current\u002Fproposed\u002Fbreak-even ROAS, margin %), and `editedByUser` flag.\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fads\u002Ftarget-roas\u002Fpreview\" summary=\"Preview margin → target ROAS\"}\nGiven a product margin and desired net margin, returns break-even ROAS and recommended target ROAS (and optionally the implied margin for a desired ROAS). No writes — backs the margin\u002FROAS slider.\n\n**Request body**\n\n`TargetRoasPreviewRequest`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `shopId` | integer | yes | Shop id |\n| `region` | string | yes | Region code |\n| `margin` | number | no | Product margin (0–1, e.g. 0.15) |\n| `targetMargin` | number | no | Desired net margin after ad spend (default: margin\u002F2) |\n| `desiredRoas` | number | no | A specific ROAS target → returns implied margin |\n\n**Response** — `TargetRoasPreviewResponse` — `breakEvenRoas`, `recommendedRoasTarget`, `targetMarginInfeasible`, `impliedMarginForDesiredRoas`, and a human-readable `explanation`.\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fads\u002Ftarget-roas\u002Fpreview-profit\" summary=\"Preview target profit → target ROAS\"}\nMoney-based sibling of preview: given a margin, absolute target profit, and ad spend, returns break-even ROAS and recommended target ROAS. No writes.\n\n**Request body**\n\n`TargetProfitPreviewRequest`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `shopId` | integer | yes | Shop id |\n| `region` | string | yes | Region code |\n| `targetProfit` | number | yes | Target absolute profit |\n| `adSpend` | number | yes | Ad spend over which profit is measured |\n| `margin` | number | no | Product margin |\n| `desiredRoas` | number | no | A specific ROAS → returns implied profit |\n\n**Response** — `TargetProfitPreviewResponse` — `breakEvenRoas`, `recommendedRoasTarget`, `targetProfitInfeasible`, `impliedProfitForDesiredRoas`, `explanation`.\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fads\u002Ftarget-roas-gms\u002Ffetch\" summary=\"List GMS target-ROAS recommendations\"}\nSame as target-ROAS fetch, for Shopee GMS (GMV-Max shop) campaigns.\n\n**Request body** — `ShopeeAdsRecommendationFilter` (same fields as target-roas\u002Ffetch).\n\n**Response** — Array of `TargetRoasRecommendationView` — recommendation + current detail + `editedByUser` flag.\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fads\u002Ftarget-roas-gms\u002Fpreview\" summary=\"Preview margin → target ROAS (GMS)\"}\nThe margin → target-ROAS preview for GMS campaigns. No writes.\n\n**Request body** — `TargetRoasPreviewRequest` (same fields as target-roas\u002Fpreview).\n\n**Response** — `TargetRoasPreviewResponse` — break-even and recommended ROAS, feasibility, and explanation.\n::\n\n## Campaign enrollment\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fshopee\u002Fcampaign-enrollment\u002Feligibility\" summary=\"Check enrollment eligibility for a variant\"}\nA price simulator for Shopee campaign enrollment: returns the lowest discounted price that keeps your target margin, whether it beats the 90-day low (Shopee's floor), and the full fee breakdown at that price. No writes.\n\n**Request body**\n\n`CampaignEnrollmentEligibilityRequest`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `shopId` | integer | yes | Shop id |\n| `region` | string | yes | Region code |\n| `itemId` | integer | yes | Shopee item id |\n| `modelId` | integer | no | Variant id (omit for single-variant) |\n| `targetMargin` | number | no | Override target margin (default: min(shop margin, 0.10)) |\n| `cogs` | number | no | Override COGS (uses inferred if omitted) |\n\n**Response** — `CampaignEnrollmentEligibilityResponse` — `status` (ELIGIBLE, NOT_LOWEST_IN_90D, INELIGIBLE_RATING, COGS_UNKNOWN, MARGIN_INFEASIBLE), `recommendedDiscountedPrice`, current price, `minPrice90d`, discount amount\u002F%, target\u002Fshop\u002Fachieved margins, COGS + source, rating, cost breakdown, and explanation.\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fshopee\u002Fcampaign-enrollment\u002Feligibility\u002Flist\" summary=\"List enrollment eligibility pool\"}\nReturns the pre-computed eligibility pool for a shop (one row per item\u002Fmodel), refreshed hourly and on COGS write — browse every product's status and recommended discounted price without a per-item re-check.\n\n**Request body**\n\n`CampaignEnrollmentShopRequest`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `shopId` | integer | yes | Shop id |\n| `region` | string | yes | Region code |\n\n**Response** — Array of `ShopeeCampaignEnrollmentEligibility` — `itemId`, `modelId`, `status`, `recommendedDiscountedPrice`, current price, `minPrice90d`, discount %, margins, COGS, rating, and fee breakdown.\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fshopee\u002Fcampaign-enrollment\u002Ffetch\" summary=\"Fetch active enrollment recommendation\"}\nReturns the shop-level campaign-join recommendation with its enrollable variants (the full export payload).\n\n**Request body**\n\n`CampaignEnrollmentShopRequest`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `shopId` | integer | yes | Shop id |\n| `region` | string | yes | Region code |\n\n**Response** — Array of `CampaignEnrollmentActionResponse` — `recommendationId`, `shopId`, `region`, and enrollable variants with prices, discounts, and fee breakdown. *…and more — see the full schema in the OpenAPI spec.*\n::\n\n## TikTok ads\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Ftiktok\u002Fads\u002Fbudget\u002Ffetch\" summary=\"List TikTok budget recommendations\"}\nFetches budget-adjust recommendations for budget-constrained TikTok GMV Max campaigns — an optimal daily budget to maximize profit given the constraint. Returns the recommendation plus current detail.\n\n**Request body**\n\n`TikTokAdsRecommendationFilter`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `recommendationId` | integer | no | Fetch a single recommendation |\n| `shopId` | integer | no | Filter by shop (required for list) |\n| `region` | string | no | Filter by region |\n| `status` | string | no | Filter by status |\n| `campaignId` | string | no | Filter by TikTok campaign id |\n\n**Response** — Array of `TikTokBudgetRecommendationView` — `recommendation` (full object) and `detail` (current\u002Fproposed daily budget in ad-account currency, shop-currency equivalents, optimizer context).\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Ftiktok\u002Fads\u002Ftarget-roas\u002Ffetch\" summary=\"List TikTok target-ROAS recommendations\"}\nFetches margin-based target-ROAS recommendations for TikTok GMV Max campaigns (Minimum-ROAS bidding). Returns the recommendation plus current detail.\n\n**Request body** — `TikTokAdsRecommendationFilter` (same fields as budget\u002Ffetch).\n\n**Response** — Array of `TikTokTargetRoasRecommendationView` — `recommendation` (full object), `detail` (current\u002Fproposed ROI target, break-even ROAS, margin %), and `editedByUser` flag.\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Ftiktok\u002Fads\u002Ftarget-roas\u002Fpreview\" summary=\"Preview margin → target ROAS (TikTok)\"}\nThe margin → target-ROAS preview for TikTok. No writes.\n\n**Request body** — `TargetRoasPreviewRequest` (`shopId`, `region` required; `margin`, `targetMargin`, `desiredRoas` optional).\n\n**Response** — `TargetRoasPreviewResponse` — break-even and recommended ROAS, feasibility, and explanation.\n::\n\n## Ads portfolio\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fads\u002Fportfolio\u002Ffetch\" summary=\"Fetch a shop's ads portfolio\"}\nReturns the current ads portfolio (if any) for a shop — the campaigns grouped for joint budget optimization, portfolio-level metrics, and allocation mode.\n\n**Query parameters**\n\n| Name | Type | Required | Description |\n|---|---|---|---|\n| `shopId` | integer | yes | Shop id |\n| `region` | string | yes | Region code |\n\n**Response** — `AdsPortfolio` (or null) — `portfolioId`, `shopId`, `region`, `campaigns`, `portfolioStatus`, `totalBudget`, `performanceMetrics`, `mode`.\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fads\u002Fportfolio\u002Fcampaigns\u002Ffetch\" summary=\"Fetch campaigns in a portfolio\"}\nReturns the campaigns added to a portfolio: id, name, current daily budget, and optimizer status.\n\n**Request body**\n\n`FetchPortfolioCampaignsRequest`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `portfolioId` | integer | yes | Portfolio id |\n\n**Response** — Array of `AdsPortfolioCampaign` — `campaignId`, `campaignName`, `currentDailyBudget`, `currency`, `optimizerStatus`, `addedAt`.\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Frecommendation\u002Fads\u002Fportfolio\u002Fallocations\u002Ffetch\" summary=\"Preview portfolio budget allocations\"}\nReturns the per-campaign budget allocation a portfolio recommendation suggests — how much of the total budget to give each campaign to maximize overall profit. For preview before apply.\n\n**Query parameters**\n\n| Name | Type | Required | Description |\n|---|---|---|---|\n| `recommendationId` | integer | yes | Portfolio recommendation id |\n\n**Response** — Array of `AdsPortfolioAllocation` — `campaignId`, `campaignName`, `currentDailyBudget`, `recommendedDailyBudget`, `budgetDelta`, `currency`, `expectedRoiUplift`, `confidence`.\n::\n\n## Policy\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Fpolicy\u002Fexperiments\u002Ffetch\" summary=\"Fetch policy experiments\"}\nReturns experiments (A\u002FB and multivariate tests) tied to recommendations and policies — each tracks expected uplift, dates, and a performance time series.\n\n**Request body**\n\n`PolicyExperimentFilter`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `experimentId` | integer | no | Fetch a single experiment |\n| `shopId` | integer | no | Filter by shop |\n| `region` | string | no | Filter by region |\n| `platform` | string | no | Filter by platform |\n| `status` | string | no | `active`, `completed`, `cancelled` |\n| `name` | string | no | Substring match on experiment name |\n\n**Response** — Array of `PolicyExperiment` — `experimentId`, `shopId`, `region`, `platform`, `name`, `description`, `status`, `expectedUpliftValue`, `startedAt`, `endedAt`. *…and more — see the full schema in the OpenAPI spec.*\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Fpolicy\u002Fpolicies\u002Ffetch\" summary=\"Fetch policies\"}\nReturns policies — the levers and feature gates that govern which recommendations are generated, how they're applied, and when they expire. Parameters live in the history; call `\u002Fhistory\u002Ffetch`.\n\n**Request body**\n\n`PolicyFilter`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `policyId` | integer | no | Fetch a single policy |\n| `shopId` | integer | no | Filter by shop |\n| `region` | string | no | Filter by region |\n| `platform` | string | no | `shopee`, `tiktok_shop`, `lazada` |\n| `isActive` | boolean | no | Filter by active status |\n| `status` | string | no | `active`, `inactive`, `deprecated` |\n\n**Response** — Array of `Policy` — `policyId`, `shopId`, `region`, `platform`, `isActive`, `status`, `currentHistoryId`, `createdAt`, `updatedAt`.\n::\n\n::api-endpoint{method=\"POST\" path=\"\u002Fapi\u002Fpolicy\u002Fpolicies\u002Fhistory\u002Ffetch\" summary=\"Fetch policy history\"}\nReturns the audit trail for a policy: each version of its parameters, when it was valid, which experiment it was tied to, and who changed it.\n\n**Request body**\n\n`PolicyHistoryFilter`\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `policyId` | integer | yes | Policy to fetch history for |\n| `isCurrent` | boolean | no | Only the current version |\n| `version` | integer | no | A specific version number |\n| `experimentId` | integer | no | Filter by experiment id |\n| `validFromGte` | string (date) | no | Valid-from ≥ this date |\n| `validFromLt` | string (date) | no | Valid-from \u003C this date |\n\n**Response** — Array of `PolicyHistory` — `policyHistoryId`, `policyId`, `controller`, `params` (JSON), `version`, `validFrom`, `validTo`, `isCurrent`, `experimentId`, `changedBy`, `changeReason`, `createdAt`.\n::\n",{"title":549,"description":3866},"9XcAzmt94vmhu6Oul4MeiqG6a04MJyk8rgQo43RaL48",{"data":3875,"body":3876},{},{"type":3877,"children":3878},"root",[3879],{"type":3880,"tag":696,"props":3881,"children":3882},"element",{},[3883],{"type":3884,"value":3866},"text",1792785193241]