[{"data":1,"prerenderedAt":2264},["ShallowReactive",2],{"nav-en":3,"learn-chrome-id":592,"doc-\u002Fid\u002Fdocs\u002Fai-and-api\u002Fassistants\u002Fusage-and-safety":690,"mdc-muer7u-key":2253},[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":509,"body":692,"description":2245,"draft":11,"draftReason":2246,"extension":2247,"layout":2246,"meta":2248,"navigation":2249,"path":510,"platforms":2246,"rawbody":2250,"seo":2251,"stem":511,"__hash__":2252},"docs_en\u002Fdocs\u002F04.ai-and-api\u002F01.assistants\u002F06.usage-and-safety.md",{"type":693,"value":694,"toc":2220},"minimark",[695,703,709,714,751,755,977,980,987,991,997,1004,1020,1027,1031,1034,1047,1050,1054,1074,1077,1081,1084,1139,1146,1150,1159,1163,1174,1185,1189,1192,1196,1210,1214,1277,1287,1306,1310,1363,1366,1370,1422,1426,1433,1436,1440,1470,1482,1486,1544,1547,1551,1574,1578,1599,1603,1635,1638,1695,1820,1823,1836,1843,1847,1850,1882,1995,1999,2118,2122,2125,2175,2178,2182,2216],[696,697,698,702],"p",{},[699,700,701],"strong",{},"A DataGlass MCP connector starts read-only and stays read-only until you approve a write scope, and each scope unlocks one domain only."," Since 3 August 2026 the connector is write-capable: an assistant that holds the right scope can apply a price-tier draft, change an ad group's budget, write COGS, cancel an order, or ship a package. Nothing is granted by default, every scope is approved by you on the consent screen, and every tool that reaches a marketplace announces itself as destructive so your assistant asks before it runs.",[704,705,706],"callout",{"icon":425},[696,707,708],{},"Older DataGlass documentation described the connector as read-only. That was accurate until 3 August 2026 and is no longer true. This page is the current contract.",[710,711,713],"h2",{"id":712},"the-dataglass-mcp-permission-model-in-four-layers","The DataGlass MCP permission model in four layers",[715,716,717,724,730,745],"ol",{},[718,719,720,723],"li",{},[699,721,722],{},"Default deny."," A newly issued connector carries only the read baseline. It can report, compare, diagnose, recommend, and simulate. It cannot change anything.",[718,725,726,729],{},[699,727,728],{},"Per-domain write scopes."," Write ability arrives only through an OAuth scope you approve, and each scope covers one domain. A seller can let an agent manage ad spend without letting it touch prices.",[718,731,732,735,736,740,741,744],{},[699,733,734],{},"Destructive-tool confirmation."," Every mutating tool advertises ",[737,738,739],"code",{},"readOnlyHint=false"," and ",[737,742,743],{},"destructiveHint=true",", which is what makes Claude and ChatGPT prompt before executing. The tool's own description spells out what changes and, where one exists, names the preview or read-back tool to run first.",[718,746,747,750],{},[699,748,749],{},"Mediated writes only."," Write tools go through DataGlass's own pricing, ads, catalog, and fulfilment flows — the ones that compute the resulting margin and record a rollback state. Raw marketplace passthroughs are not exposed as tools at all.",[710,752,754],{"id":753},"the-nine-per-domain-write-scopes","The nine per-domain write scopes",[756,757,758,774],"table",{},[759,760,761],"thead",{},[762,763,764,768,771],"tr",{},[765,766,767],"th",{},"Scope",[765,769,770],{},"What it unlocks",[765,772,773],{},"Representative tools",[775,776,777,803,827,851,875,896,917,938,959],"tbody",{},[762,778,779,785,788],{},[780,781,782],"td",{},[737,783,784],{},"PAT_PRICING_WRITE",[780,786,787],{},"Price-tier drafts, target-margin applies, margin-defense and price-buffer moves",[780,789,790,793,794,793,797,793,800],{},[737,791,792],{},"apply_price_tier_draft",", ",[737,795,796],{},"apply_shopee_target_margin",[737,798,799],{},"apply_margin_defense_action",[737,801,802],{},"rollback_price_tier_draft",[762,804,805,810,813],{},[780,806,807],{},[737,808,809],{},"PAT_ADS_WRITE",[780,811,812],{},"Ads optimization groups, budgets, target ROAS, boosts",[780,814,815,793,818,793,821,793,824],{},[737,816,817],{},"create_ads_group",[737,819,820],{},"disable_ads_group_optimization",[737,822,823],{},"apply_shopee_target_roas",[737,825,826],{},"apply_tiktok_ad_budget",[762,828,829,834,837],{},[780,830,831],{},[737,832,833],{},"PAT_CATALOG_WRITE",[780,835,836],{},"COGS, stock, titles, canonical links, product creation",[780,838,839,793,842,793,845,793,848],{},[737,840,841],{},"apply_shopee_cogs",[737,843,844],{},"apply_shopee_stock",[737,846,847],{},"create_canonical_product",[737,849,850],{},"copy_product_to_shops",[762,852,853,858,861],{},[780,854,855],{},[737,856,857],{},"PAT_RETURNS_WRITE",[780,859,860],{},"Return and refund decisions",[780,862,863,793,866,793,869,793,872],{},[737,864,865],{},"approve_tiktok_return",[737,867,868],{},"reject_tiktok_return",[737,870,871],{},"decide_lazada_refund",[737,873,874],{},"confirm_shopee_return",[762,876,877,882,885],{},[780,878,879],{},[737,880,881],{},"PAT_ORDERS_WRITE",[780,883,884],{},"Order-level actions and documents",[780,886,887,793,890,793,893],{},[737,888,889],{},"cancel_shopee_order",[737,891,892],{},"split_shopee_order",[737,894,895],{},"set_shopee_order_note",[762,897,898,903,906],{},[780,899,900],{},[737,901,902],{},"PAT_LOGISTICS_WRITE",[780,904,905],{},"Packages, shipping, airway bills",[780,907,908,793,911,793,914],{},[737,909,910],{},"ship_tiktok_package",[737,912,913],{},"batch_ship_tiktok_packages",[737,915,916],{},"print_shopee_airway_bills",[762,918,919,924,927],{},[780,920,921],{},[737,922,923],{},"PAT_RECOMMENDATION_WRITE",[780,925,926],{},"Acting on DataGlass Actions",[780,928,929,793,932,793,935],{},[737,930,931],{},"reject_recommendation",[737,933,934],{},"stop_recommendation",[737,936,937],{},"rollback_recommendation",[762,939,940,945,948],{},[780,941,942],{},[737,943,944],{},"PAT_INVENTORY_WRITE",[780,946,947],{},"Alerts, purchase orders, stock-sync settings",[780,949,950,793,953,793,956],{},[737,951,952],{},"acknowledge_inventory_alert",[737,954,955],{},"log_purchase_order",[737,957,958],{},"set_shopee_stock_sync",[762,960,961,966,969],{},[780,962,963],{},[737,964,965],{},"PAT_REPORTS_WRITE",[780,967,968],{},"Ads performance report authoring",[780,970,971,793,974],{},[737,972,973],{},"generate_ads_performance_report",[737,975,976],{},"publish_ads_report_workspace",[696,978,979],{},"Return and refund decisions sit behind their own scope rather than riding along with orders or logistics, because they move real money and the platform will not reverse them.",[696,981,982,983,986],{},"Granting a write scope never widens your DataGlass role. The ",[737,984,985],{},"PAT_*"," scopes unlock the agent write gate only; organization permissions, shop-ownership guards, and the sensitive-financial rules all still run on every call exactly as they do in the app.",[710,988,990],{"id":989},"mediated-writes-versus-raw-marketplace-passthroughs","Mediated writes versus raw marketplace passthroughs",[696,992,993,996],{},[699,994,995],{},"The connector writes through DataGlass, never straight through to a marketplace API."," This is the architectural line that decides which capabilities exist as tools at all.",[696,998,999,1000,1003],{},"A ",[699,1001,1002],{},"mediated"," path — a price-tier draft, a target-margin apply, a recommendation apply — computes the resulting margin before it acts, records a draft or rollback state, and converges with the rest of the pricing product, so the number you see in DataGlass and the number the buyer sees agree afterwards. These are the paths exposed as tools.",[696,1005,999,1006,1009,1010,793,1013,793,1016,1019],{},[699,1007,1008],{},"raw passthrough"," — ",[737,1011,1012],{},"updatePrice",[737,1014,1015],{},"addDiscount",[737,1017,1018],{},"updateStock",", and the voucher, bundle-deal, flexi-combo, and free-shipping partner calls — pushes a value at the marketplace and returns. DataGlass would then hold one price and the marketplace another. Those handlers exist for the app's own use but are deliberately not agent-reachable.",[696,1021,1022,1023,1026],{},"The honest consequence: ",[699,1024,1025],{},"vouchers, bundle deals, flexi-combo, and free-shipping campaigns have no mediated equivalent, so those capabilities are simply absent from the agent surface."," An assistant cannot create or edit them for you at any scope. Do them in the app or in Seller Center.",[710,1028,1030],{"id":1029},"tools-that-create-live-marketplace-listings","Tools that create live marketplace listings",[696,1032,1033],{},"Two catalog tools call the platforms' own create-product APIs and produce listings buyers can see:",[1035,1036,1037,1042],"ul",{},[718,1038,1039,1041],{},[737,1040,847],{}," creates a new live listing on every selected Shopee, Lazada, and TikTok shop, then binds them to one shared canonical product.",[718,1043,1044,1046],{},[737,1045,850],{}," re-creates an existing listing as a new live listing on each target shop, including a different platform.",[696,1048,1049],{},"Both are labelled destructive for that reason. Neither is a canonical-row-only operation. Read the full payload back — shops, title, price, stock — before you approve one.",[710,1051,1053],{"id":1052},"two-profitability-lists-withheld-from-the-agent-surface","Two profitability lists withheld from the agent surface",[696,1055,1056,1057,1060,1061,1064,1065,1069,1070,1073],{},"The Shopee ",[699,1058,1059],{},"price-tier review queue"," and the ",[699,1062,1063],{},"campaigns-losing-by-profit-adjusted-ROAS"," list were deliberately withdrawn from the tool surface on 3 August 2026. Membership in either result set ",[1066,1067,1068],"em",{},"is"," the financial signal: being in the queue means margin sits below the floor, and being in the losing list means true profit is negative. Shading the values would still leak that to a team member without ",[737,1071,1072],{},"VIEW_SENSITIVE_FINANCIAL",", and a tool would make it enumerable across every shop in one call.",[696,1075,1076],{},"Both still work inside the DataGlass app and over the REST API, under the usual page permissions. Only the agent surface is narrower.",[710,1078,1080],{"id":1079},"api-keys-from-the-app-are-read-only-oauth-connectors-carry-the-scopes-you-approve","API keys from the app are read-only; OAuth connectors carry the scopes you approve",[696,1082,1083],{},"There are two ways to hand DataGlass credentials to an agent, and they differ:",[756,1085,1086,1099],{},[759,1087,1088],{},[762,1089,1090,1093,1096],{},[765,1091,1092],{},"Credential",[765,1094,1095],{},"How it is issued",[765,1097,1098],{},"Write ability",[775,1100,1101,1118],{},[762,1102,1103,1109,1112],{},[780,1104,1105,1106],{},"API key from ",[699,1107,1108],{},"Settings → API keys",[780,1110,1111],{},"The in-app UI, which has no scope picker",[780,1113,1114,1117],{},[699,1115,1116],{},"Read-only by construction"," — the key is created with the read baseline and nothing else",[762,1119,1120,1126,1133],{},[780,1121,1122,1125],{},[699,1123,1124],{},"OAuth connector"," in ChatGPT or Claude",[780,1127,1128,1129,1132],{},"The ",[737,1130,1131],{},"\u002Fconnect"," consent screen",[780,1134,1135,1136,1138],{},"Exactly the ",[737,1137,985],{}," scopes shown on that screen and approved by you",[696,1140,1141,1142,1145],{},"So a ",[737,1143,1144],{},"dg_pat_"," token you pasted into a script cannot write, even though the connector you approved in Claude might. When someone reports that \"the API is read-only,\" this is usually the distinction they mean.",[710,1147,1149],{"id":1148},"what-the-plan-decides-for-mcp-and-api-keys","What the plan decides for MCP and API keys",[696,1151,1152,1153,1158],{},"Connecting an assistant over MCP is included in every plan. What the plan decides is what a tool may reach: a tool that reads or changes a Pro feature (Actions, ads optimization groups and automation, bid timing, price elasticity) answers a caller below Pro with a plan-denied response rather than a tool result. Creating a Personal Access Token (an API key) requires ",[699,1154,1155],{},[737,1156,1157],{},"PlanTier.PRO",". Do not describe API keys, or every MCP tool, as included in every plan.",[710,1160,1162],{"id":1161},"rate-limits-and-the-fail-closed-rule-for-write-capable-keys","Rate limits and the fail-closed rule for write-capable keys",[696,1164,1165,1166,1169,1170,1173],{},"Each key is throttled at ",[699,1167,1168],{},"60 requests burst, 1 request per second sustained",", keyed per key so one runaway agent cannot starve your dashboard. An MCP tool's internal fan-out does not consume extra tokens; the outer ",[737,1171,1172],{},"\u002Fmcp"," call already spent one.",[696,1175,1176,1177,1180,1181,1184],{},"When the limiter itself is unavailable, the behaviour splits by capability. A ",[699,1178,1179],{},"read-only key fails open"," — the token was already validated, and an outage should not take reads down. A ",[699,1182,1183],{},"write-capable key fails closed",", because an unthrottled agent looping over a mutating tool changes live prices and ad spend, which is not a cost worth paying to keep reads up.",[710,1186,1188],{"id":1187},"tenant-isolation-across-the-api-key-surface","Tenant isolation across the API-key surface",[696,1190,1191],{},"A full trace of every API-key-reachable endpoint — 625 handlers — found no cross-tenant read and no cross-tenant write. Every tool call is dispatched as an authenticated request carrying your own token, so ownership guards run exactly as they do for a request from the app.",[710,1193,1195],{"id":1194},"sensitive-financial-shading-survives-the-agent-boundary","Sensitive financial shading survives the agent boundary",[696,1197,1198,1199,1201,1202,1205,1206,1209],{},"A value hidden by ",[737,1200,1072],{}," arrives at the assistant as the string ",[737,1203,1204],{},"\"***\""," — or ",[737,1207,1208],{},"null"," for an object or list — not as a real number. Render it as a locked field. Do not coerce it to zero, do not treat it as missing data, and do not retry around the permission. Where ordering itself would disclose a shaded value, the sort is stripped too.",[710,1211,1213],{"id":1212},"production-endpoints","Production endpoints",[756,1215,1216,1226],{},[759,1217,1218],{},[762,1219,1220,1223],{},[765,1221,1222],{},"Purpose",[765,1224,1225],{},"URL",[775,1227,1228,1237,1247,1257,1267],{},[762,1229,1230,1233],{},[780,1231,1232],{},"DataGlass application",[780,1234,1235],{},[737,1236,644],{},[762,1238,1239,1242],{},[780,1240,1241],{},"Connector consent",[780,1243,1244],{},[737,1245,1246],{},"https:\u002F\u002Fapp.dataglasslabs.com\u002Fconnect",[762,1248,1249,1252],{},[780,1250,1251],{},"Plan and billing recovery",[780,1253,1254],{},[737,1255,1256],{},"https:\u002F\u002Fapp.dataglasslabs.com\u002Fopen\u002Fbilling",[762,1258,1259,1262],{},[780,1260,1261],{},"MCP endpoint",[780,1263,1264],{},[737,1265,1266],{},"https:\u002F\u002Fprod-api.dataglasslabs.com\u002Fmcp",[762,1268,1269,1272],{},[780,1270,1271],{},"OAuth metadata",[780,1273,1274],{},[737,1275,1276],{},"https:\u002F\u002Fprod-api.dataglasslabs.com\u002F.well-known\u002F...",[696,1278,1279,1280,1283,1284,1286],{},"Product-search results can contain relative links such as ",[737,1281,1282],{},"\u002Fproducts?canonicalId=123",". Resolve them against ",[737,1285,644],{},", never against the API origin.",[696,1288,1289,1290,1293,1294,1297,1298,1301,1302,1305],{},"There is ",[699,1291,1292],{},"no public OpenAPI spec",". An ",[737,1295,1296],{},"agent"," spec is generated internally at ",[737,1299,1300],{},"\u002Fv3\u002Fapi-docs\u002Fagent"," from the live access rules, but it is IP-allowlisted and returns 404 to the public internet. Runtime ",[737,1303,1304],{},"tools\u002Flist"," is the machine-readable contract for a connected assistant.",[710,1307,1309],{"id":1308},"business-terms-used-in-answers","Business terms used in answers",[756,1311,1312,1322],{},[759,1313,1314],{},[762,1315,1316,1319],{},[765,1317,1318],{},"Term",[765,1320,1321],{},"Meaning",[775,1323,1324,1332,1339,1347,1355],{},[762,1325,1326,1329],{},[780,1327,1328],{},"Realized profit",[780,1330,1331],{},"Settled, cancellation-adjusted profit from marketplace financial data",[762,1333,1334,1336],{},[780,1335,62],{},[780,1337,1338],{},"Ads return after relevant COGS, fees, returns, and cancellation adjustments",[762,1340,1341,1344],{},[780,1342,1343],{},"Payout",[780,1345,1346],{},"Money actually settled by a marketplace; it is not the same as profit",[762,1348,1349,1352],{},[780,1350,1351],{},"Estimated COGS",[780,1353,1354],{},"A DataGlass inference used when an explicit product cost is missing",[762,1356,1357,1360],{},[780,1358,1359],{},"Recommendation",[780,1361,1362],{},"A suggested action, reviewable in DataGlass and applicable through a tool when the recommendation write scope is granted",[696,1364,1365],{},"Do not promise live marketplace data or guaranteed future results.",[710,1367,1369],{"id":1368},"assistant-workflow-for-a-dataglass-question","Assistant workflow for a DataGlass question",[715,1371,1372,1390,1396,1407,1410,1413,1416,1419],{},[718,1373,1374,1375,1378,1379,793,1382,1385,1386,1389],{},"Discover the selected shop using the matching ",[737,1376,1377],{},"list_*_shops"," tool. Never invent ",[737,1380,1381],{},"shopId",[737,1383,1384],{},"sellerId",", or ",[737,1387,1388],{},"region",".",[718,1391,1392,1393,1389],{},"For \"how is my shop?\" or \"what changed?\", begin with ",[737,1394,1395],{},"diagnose_shop",[718,1397,1398,1399,1402,1403,1406],{},"Read ",[737,1400,1401],{},"signals[]"," and follow a signal's ",[737,1404,1405],{},"suggestedTool"," only when the question needs that evidence.",[718,1408,1409],{},"Compare like-for-like periods and state the window and local currency.",[718,1411,1412],{},"Lead with the largest business driver, then show up to three supporting facts and a next step.",[718,1414,1415],{},"State when COGS is inferred, recent settlement is incomplete, a field is permission-shaded, or the result is simulated.",[718,1417,1418],{},"Before any write, name the tool, the exact objects it will touch, and the current-versus-proposed values — then wait for an explicit go-ahead.",[718,1420,1421],{},"After a write, say what actually changed and name the rollback or revert tool if one exists.",[710,1423,1425],{"id":1424},"language-for-read-results-versus-writes","Language for read results versus writes",[696,1427,1428,1429,1432],{},"Use \"preview,\" \"simulate,\" \"recommend,\" or \"review in DataGlass\" for anything the assistant has only read or modelled. Say \"applied,\" \"updated,\" \"cancelled,\" or \"shipped\" ",[699,1430,1431],{},"only after a write tool returned successfully"," — and name the tool that did it. Claiming a change that did not happen, and failing to report one that did, are equally serious errors.",[696,1434,1435],{},"Note that \"rollback\" rarely means undo. A price rollback issues a fresh set of platform writes to restore the captured pre-apply prices; buyers see prices change again. Some actions — a cancelled Shopee order, an accepted TikTok return — cannot be reversed at all.",[710,1437,1439],{"id":1438},"identifiers","Identifiers",[1035,1441,1442,1454,1464,1467],{},[718,1443,1444,1445,793,1448,1385,1451,1389],{},"Get shop IDs and regions from ",[737,1446,1447],{},"list_shopee_shops",[737,1449,1450],{},"list_lazada_shops",[737,1452,1453],{},"list_tiktok_shops",[718,1455,1456,1457,793,1460,1463],{},"Use canonical product IDs only after ",[737,1458,1459],{},"search",[737,1461,1462],{},"list_products",", or another product result returns them.",[718,1465,1466],{},"Do not infer a marketplace from the shape of an ID.",[718,1468,1469],{},"TikTok shop, campaign, advertiser, product, and SKU IDs can exceed JavaScript's safe integer range. Preserve them as opaque strings from browser to MCP and back.",[696,1471,1472,1474,1475,1478,1479,1481],{},[737,1473,1395],{}," currently derives its schema from a Kotlin ",[737,1476,1477],{},"Long"," path value. Pass a TikTok shop ID exactly as returned by ",[737,1480,1453],{},". If a strict host cannot preserve it without numeric coercion, use the TikTok-specific financial overview tools.",[710,1483,1485],{"id":1484},"dates-and-comparisons","Dates and comparisons",[756,1487,1488,1498],{},[759,1489,1490],{},[762,1491,1492,1495],{},[765,1493,1494],{},"Value",[765,1496,1497],{},"Format",[775,1499,1500,1510,1528,1536],{},[762,1501,1502,1505],{},[780,1503,1504],{},"Human calendar date",[780,1506,1507],{},[737,1508,1509],{},"YYYY-MM-DD",[762,1511,1512,1522],{},[780,1513,1514,1515,1518,1519],{},"Conversion ",[737,1516,1517],{},"datadateFrom"," \u002F ",[737,1520,1521],{},"datadateTo",[780,1523,1524,1527],{},[737,1525,1526],{},"YYYYMMDD"," integer",[762,1529,1530,1533],{},[780,1531,1532],{},"Timestamp",[780,1534,1535],{},"ISO 8601",[762,1537,1538,1541],{},[780,1539,1540],{},"Default comparison",[780,1542,1543],{},"Immediately preceding period of equal length",[696,1545,1546],{},"Payout tools filter by payout or settlement date, not order date. Recent realized values can be incomplete while marketplace settlement is pending; show a settlement-lag note instead of treating the latest decline as final.",[710,1548,1550],{"id":1549},"money-vat-and-cogs","Money, VAT, and COGS",[1035,1552,1553,1556,1562,1568,1571],{},[718,1554,1555],{},"Money uses the shop's local currency. Do not sum unlike currencies without explaining the rollup.",[718,1557,1558,1561],{},[737,1559,1560],{},"includeVat=false"," is the normal forward-VAT view unless the user asks otherwise.",[718,1563,1564,1567],{},[737,1565,1566],{},"includeInferredCogs=true"," fills missing COGS with DataGlass's estimate.",[718,1569,1570],{},"Label ranked loss-makers and simulations that depend on inferred costs.",[718,1572,1573],{},"Writing COGS changes every profit and margin number for the affected products, historical reports included. Preview it first.",[710,1575,1577],{"id":1576},"pagination-and-call-cost","Pagination and call cost",[1035,1579,1580,1583,1589,1596],{},[718,1581,1582],{},"Begin with counts, diagnostics, or top and bottom summaries when they answer the question.",[718,1584,1585,1586,1588],{},"Use ",[737,1587,1459],{}," before a broad catalog list when the user gives a product name, SKU, model SKU, or listing ID.",[718,1590,1591,1592,1595],{},"For cursor results, pass the response's ",[737,1593,1594],{},"nextCursor"," values into the next call.",[718,1597,1598],{},"Fetch more pages only for exhaustive output or when the decision truly requires it.",[710,1600,1602],{"id":1601},"oauth-consent-contract","OAuth consent contract",[696,1604,1605,1606,1608,1609,1612,1613,793,1616,793,1619,1612,1622,793,1625,793,1628,1631,1632,1389],{},"The MCP host starts OAuth at the API domain. After validation, DataGlass redirects the browser to ",[737,1607,1246],{}," with ",[737,1610,1611],{},"client_id",", optional ",[737,1614,1615],{},"client_name",[737,1617,1618],{},"redirect_uri",[737,1620,1621],{},"scope",[737,1623,1624],{},"state",[737,1626,1627],{},"code_challenge",[737,1629,1630],{},"code_challenge_method=S256",", and optional ",[737,1633,1634],{},"resource",[696,1636,1637],{},"The consent page must:",[715,1639,1640,1643,1653,1659,1662,1668,1675,1685,1692],{},[718,1641,1642],{},"Preserve every query parameter across sign-in and return the user to the exact consent URL.",[718,1644,1645,1646,1652],{},"Show the read baseline plus ",[699,1647,1648,1649,1651],{},"every requested ",[737,1650,985],{}," write scope, named in plain language",", so the user can see which domains the client will be able to change.",[718,1654,1655,1656,1658],{},"Display the validated ",[737,1657,1615],{}," when present without implying DataGlass owns the client.",[718,1660,1661],{},"Require an explicit allow or deny decision.",[718,1663,1664,1665,1389],{},"POST snake-case fields to ",[737,1666,1667],{},"https:\u002F\u002Fprod-api.dataglasslabs.com\u002Fapi\u002Foauth\u002Fconsent",[718,1669,1670,1671,1674],{},"Send the DataGlass JWT in ",[737,1672,1673],{},"Authorization: Bearer ...","; the endpoint intentionally ignores the ambient access-token cookie to prevent consent CSRF.",[718,1676,1585,1677,1680,1681,1684],{},[737,1678,1679],{},"approve: true"," for allow and ",[737,1682,1683],{},"approve: false"," for deny.",[718,1686,1687,1688,1691],{},"Navigate only to ",[737,1689,1690],{},"data.redirectTo"," returned by the backend.",[718,1693,1694],{},"Clear pending consent state after navigation or cancellation.",[1696,1697,1702],"pre",{"className":1698,"code":1699,"language":1700,"meta":1701,"style":1701},"language-json shiki shiki-themes github-light","{\n  \"client_id\": \"...\",\n  \"redirect_uri\": \"...\",\n  \"scope\": \"...\",\n  \"state\": \"...\",\n  \"code_challenge\": \"...\",\n  \"code_challenge_method\": \"S256\",\n  \"resource\": \"...\",\n  \"approve\": true\n}\n","json","",[737,1703,1704,1713,1730,1742,1754,1766,1778,1791,1803,1814],{"__ignoreMap":1701},[1705,1706,1709],"span",{"class":1707,"line":1708},"line",1,[1705,1710,1712],{"class":1711},"sgsFI","{\n",[1705,1714,1716,1720,1723,1727],{"class":1707,"line":1715},2,[1705,1717,1719],{"class":1718},"sYu0t","  \"client_id\"",[1705,1721,1722],{"class":1711},": ",[1705,1724,1726],{"class":1725},"sYBdl","\"...\"",[1705,1728,1729],{"class":1711},",\n",[1705,1731,1733,1736,1738,1740],{"class":1707,"line":1732},3,[1705,1734,1735],{"class":1718},"  \"redirect_uri\"",[1705,1737,1722],{"class":1711},[1705,1739,1726],{"class":1725},[1705,1741,1729],{"class":1711},[1705,1743,1745,1748,1750,1752],{"class":1707,"line":1744},4,[1705,1746,1747],{"class":1718},"  \"scope\"",[1705,1749,1722],{"class":1711},[1705,1751,1726],{"class":1725},[1705,1753,1729],{"class":1711},[1705,1755,1757,1760,1762,1764],{"class":1707,"line":1756},5,[1705,1758,1759],{"class":1718},"  \"state\"",[1705,1761,1722],{"class":1711},[1705,1763,1726],{"class":1725},[1705,1765,1729],{"class":1711},[1705,1767,1769,1772,1774,1776],{"class":1707,"line":1768},6,[1705,1770,1771],{"class":1718},"  \"code_challenge\"",[1705,1773,1722],{"class":1711},[1705,1775,1726],{"class":1725},[1705,1777,1729],{"class":1711},[1705,1779,1781,1784,1786,1789],{"class":1707,"line":1780},7,[1705,1782,1783],{"class":1718},"  \"code_challenge_method\"",[1705,1785,1722],{"class":1711},[1705,1787,1788],{"class":1725},"\"S256\"",[1705,1790,1729],{"class":1711},[1705,1792,1794,1797,1799,1801],{"class":1707,"line":1793},8,[1705,1795,1796],{"class":1718},"  \"resource\"",[1705,1798,1722],{"class":1711},[1705,1800,1726],{"class":1725},[1705,1802,1729],{"class":1711},[1705,1804,1806,1809,1811],{"class":1707,"line":1805},9,[1705,1807,1808],{"class":1718},"  \"approve\"",[1705,1810,1722],{"class":1711},[1705,1812,1813],{"class":1718},"true\n",[1705,1815,1817],{"class":1707,"line":1816},10,[1705,1818,1819],{"class":1711},"}\n",[696,1821,1822],{},"Consent copy should state both halves — what the client reads, and what it may change:",[1824,1825,1826],"blockquote",{},[696,1827,1828,1829,1832,1833,1835],{},"Connect DataGlass to ",[737,1830,1831],{},"{clientName}","? ",[737,1834,1831],{}," will be able to read analytics for the shops available to your DataGlass account, including products, orders, profit, ads, recommendations, and inventory. If you also approve the write permissions listed above, it will be able to change those things in your shops.",[696,1837,1838,1839,1842],{},"When no write scope is requested, say so plainly and label the button ",[699,1840,1841],{},"Allow read-only access",". When one or more is requested, the button must not claim read-only access.",[710,1844,1846],{"id":1845},"response-design","Response design",[696,1848,1849],{},"A useful answer follows this order:",[715,1851,1852,1858,1864,1870,1876],{},[718,1853,1854,1857],{},[699,1855,1856],{},"Scope:"," shop and platform, date range, comparison, and currency.",[718,1859,1860,1863],{},[699,1861,1862],{},"Headline:"," the most important conclusion in one sentence.",[718,1865,1866,1869],{},[699,1867,1868],{},"Evidence:"," no more than three key metrics or ranked drivers initially.",[718,1871,1872,1875],{},[699,1873,1874],{},"Confidence:"," COGS coverage, settlement lag, permissions, or simulation assumptions.",[718,1877,1878,1881],{},[699,1879,1880],{},"Next step:"," a follow-up question, another simulation, a proposed write, or a DataGlass deep link.",[756,1883,1884,1894],{},[759,1885,1886],{},[762,1887,1888,1891],{},[765,1889,1890],{},"Result",[765,1892,1893],{},"Recommended presentation",[775,1895,1896,1904,1912,1920,1928,1936,1944,1952,1959,1967,1975,1987],{},[762,1897,1898,1901],{},[780,1899,1900],{},"Shop list",[780,1902,1903],{},"Selectable rows grouped by marketplace",[762,1905,1906,1909],{},[780,1907,1908],{},"Health diagnostic",[780,1910,1911],{},"Headline plus severity-tagged signal cards",[762,1913,1914,1917],{},[780,1915,1916],{},"Period comparison",[780,1918,1919],{},"KPI values with absolute and percentage delta",[762,1921,1922,1925],{},[780,1923,1924],{},"Product or campaign ranking",[780,1926,1927],{},"Sortable table with best and worst emphasis",[762,1929,1930,1933],{},[780,1931,1932],{},"Profit and loss breakdown",[780,1934,1935],{},"Waterfall or stacked cost list",[762,1937,1938,1941],{},[780,1939,1940],{},"Simulation",[780,1942,1943],{},"Current values beside the proposed scenario",[762,1945,1946,1949],{},[780,1947,1948],{},"Reorder plan",[780,1950,1951],{},"SKU table with urgency and inbound stock",[762,1953,1954,1956],{},[780,1955,1359],{},[780,1957,1958],{},"Card with rationale, review link, and the apply tool if a scope allows it",[762,1960,1961,1964],{},[780,1962,1963],{},"Proposed write",[780,1965,1966],{},"Current versus proposed values, the exact objects affected, and the rollback path",[762,1968,1969,1972],{},[780,1970,1971],{},"Completed write",[780,1973,1974],{},"What changed, the tool that changed it, and how to revert",[762,1976,1977,1984],{},[780,1978,1979,1981,1982],{},[737,1980,1204],{}," or sensitive ",[737,1983,1208],{},[780,1985,1986],{},"Locked field with a permission explanation",[762,1988,1989,1992],{},[780,1990,1991],{},"Tool error",[780,1993,1994],{},"Inline recovery state, not an empty-data state",[710,1996,1998],{"id":1997},"error-recovery","Error recovery",[756,2000,2001,2011],{},[759,2002,2003],{},[762,2004,2005,2008],{},[765,2006,2007],{},"Condition",[765,2009,2010],{},"User-facing behavior",[775,2012,2013,2021,2029,2037,2051,2059,2067,2079,2087,2098,2106],{},[762,2014,2015,2018],{},[780,2016,2017],{},"401 or revoked token",[780,2019,2020],{},"\"Reconnect DataGlass to continue.\" Start OAuth again.",[762,2022,2023,2026],{},[780,2024,2025],{},"403 on a read",[780,2027,2028],{},"\"This account cannot access that shop or resource.\" Do not restart OAuth automatically.",[762,2030,2031,2034],{},[780,2032,2033],{},"403 on a write tool",[780,2035,2036],{},"The connector lacks that domain's write scope. Name the missing scope and offer to reconnect with it, or point to the app.",[762,2038,2039,2042],{},[780,2040,2041],{},"Plan denied",[780,2043,2044,2045,1389],{},"Explain that this tool needs the Pro plan and link to ",[2046,2047,2050],"a",{"href":1256,"rel":2048},[2049],"nofollow","billing",[762,2052,2053,2056],{},[780,2054,2055],{},"Trial ending",[780,2057,2058],{},"Show the server reminder once in a non-blocking notice.",[762,2060,2061,2064],{},[780,2062,2063],{},"Trial or subscription ended",[780,2065,2066],{},"Show the server message and billing recovery link.",[762,2068,2069,2072],{},[780,2070,2071],{},"429",[780,2073,2074,2075,2078],{},"Respect ",[737,2076,2077],{},"Retry-After"," and tell the user when another request is available. A write-capable key can also see 429 during a limiter outage, by design.",[762,2080,2081,2084],{},[780,2082,2083],{},"Empty list",[780,2085,2086],{},"Confirm shop, region, dates, authorization, and data timing before concluding there was no activity.",[762,2088,2089,2092],{},[780,2090,2091],{},"Invalid TikTok ID",[780,2093,2094,2095,2097],{},"Re-resolve with ",[737,2096,1453],{}," and preserve the ID as a string.",[762,2099,2100,2103],{},[780,2101,2102],{},"Missing COGS",[780,2104,2105],{},"Show estimated or missing cost instead of zero.",[762,2107,2108,2111],{},[780,2109,2110],{},"Partial write result",[780,2112,2113,2114,2117],{},"Some tools return per-target ",[737,2115,2116],{},"failures"," rather than throwing. Report the successes and the failures separately.",[710,2119,2121],{"id":2120},"prompt-and-connector-analytics","Prompt and connector analytics",[696,2123,2124],{},"Track stable prompt-pack identifiers instead of raw prompt text. Useful events include:",[1035,2126,2127,2148,2163,2169],{},[718,2128,2129,740,2132,1608,2135,793,2138,793,2141,1631,2144,2147],{},[737,2130,2131],{},"mcp_prompt_impression",[737,2133,2134],{},"mcp_prompt_selected",[737,2136,2137],{},"prompt_pack",[737,2139,2140],{},"scenario",[737,2142,2143],{},"surface",[737,2145,2146],{},"platform",";",[718,2149,2150,793,2153,793,2156,2159,2160,2147],{},[737,2151,2152],{},"mcp_connector_started",[737,2154,2155],{},"mcp_connector_allowed",[737,2157,2158],{},"mcp_connector_denied",", and ",[737,2161,2162],{},"mcp_connector_failed",[718,2164,2165,2168],{},[737,2166,2167],{},"mcp_answer_followup_selected"," with a follow-up type;",[718,2170,2171,2174],{},[737,2172,2173],{},"mcp_deep_link_opened"," with a route category, never raw financial content.",[696,2176,2177],{},"Never log OAuth codes, PKCE values, access or refresh tokens, buyer information, raw prompts containing order details, or tool responses.",[710,2179,2181],{"id":2180},"adding-a-prompt-to-the-library","Adding a prompt to the library",[715,2183,2184,2187,2196,2199,2202,2205,2208,2211],{},[718,2185,2186],{},"Choose one business outcome and the matching prompt pack.",[718,2188,2189,2190,2193,2194,1389],{},"Confirm the required capability exists in the ",[2046,2191,2192],{"href":505},"tool catalog"," and runtime ",[737,2195,1304],{},[718,2197,2198],{},"Write at least three scenarios: broad assessment, focused investigation, and decision or next action. Add a comparison or data-quality case when distinct.",[718,2200,2201],{},"State which scope the prompt needs. If it can be answered read-only, say so; if it ends in a write, name the tool and the scope.",[718,2203,2204],{},"Verify every ID in the prompt can be discovered rather than guessed.",[718,2206,2207],{},"Define empty, permission-shaded, plan-denied, missing-scope, and incomplete-data behavior.",[718,2209,2210],{},"Test every platform claimed by the prompt.",[718,2212,2213,2214,1389],{},"Keep product links on ",[737,2215,644],{},[2217,2218,2219],"style",{},"html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":1701,"searchDepth":1732,"depth":1732,"links":2221},[2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244],{"id":712,"depth":1715,"text":713},{"id":753,"depth":1715,"text":754},{"id":989,"depth":1715,"text":990},{"id":1029,"depth":1715,"text":1030},{"id":1052,"depth":1715,"text":1053},{"id":1079,"depth":1715,"text":1080},{"id":1148,"depth":1715,"text":1149},{"id":1161,"depth":1715,"text":1162},{"id":1187,"depth":1715,"text":1188},{"id":1194,"depth":1715,"text":1195},{"id":1212,"depth":1715,"text":1213},{"id":1308,"depth":1715,"text":1309},{"id":1368,"depth":1715,"text":1369},{"id":1424,"depth":1715,"text":1425},{"id":1438,"depth":1715,"text":1439},{"id":1484,"depth":1715,"text":1485},{"id":1549,"depth":1715,"text":1550},{"id":1576,"depth":1715,"text":1577},{"id":1601,"depth":1715,"text":1602},{"id":1845,"depth":1715,"text":1846},{"id":1997,"depth":1715,"text":1998},{"id":2120,"depth":1715,"text":2121},{"id":2180,"depth":1715,"text":2181},"How the DataGlass MCP connector's permission model works — read-only by default, per-domain write scopes, destructive-tool confirmation, mediated-not-raw writes, and what stays out of reach.",null,"md",{},{"icon":512},"---\ntitle: Permissions and safety\ndescription: How the DataGlass MCP connector's permission model works — read-only by default, per-domain write scopes, destructive-tool confirmation, mediated-not-raw writes, and what stays out of reach.\nnavigation:\n  icon: i-material-symbols-health-and-safety-rounded\n---\n\n**A DataGlass MCP connector starts read-only and stays read-only until you approve a write scope, and each scope unlocks one domain only.** Since 3 August 2026 the connector is write-capable: an assistant that holds the right scope can apply a price-tier draft, change an ad group's budget, write COGS, cancel an order, or ship a package. Nothing is granted by default, every scope is approved by you on the consent screen, and every tool that reaches a marketplace announces itself as destructive so your assistant asks before it runs.\n\n::callout{icon=\"i-lucide-shield-check\"}\nOlder DataGlass documentation described the connector as read-only. That was accurate until 3 August 2026 and is no longer true. This page is the current contract.\n::\n\n## The DataGlass MCP permission model in four layers\n\n1. **Default deny.** A newly issued connector carries only the read baseline. It can report, compare, diagnose, recommend, and simulate. It cannot change anything.\n2. **Per-domain write scopes.** Write ability arrives only through an OAuth scope you approve, and each scope covers one domain. A seller can let an agent manage ad spend without letting it touch prices.\n3. **Destructive-tool confirmation.** Every mutating tool advertises `readOnlyHint=false` and `destructiveHint=true`, which is what makes Claude and ChatGPT prompt before executing. The tool's own description spells out what changes and, where one exists, names the preview or read-back tool to run first.\n4. **Mediated writes only.** Write tools go through DataGlass's own pricing, ads, catalog, and fulfilment flows — the ones that compute the resulting margin and record a rollback state. Raw marketplace passthroughs are not exposed as tools at all.\n\n## The nine per-domain write scopes\n\n| Scope | What it unlocks | Representative tools |\n| --- | --- | --- |\n| `PAT_PRICING_WRITE` | Price-tier drafts, target-margin applies, margin-defense and price-buffer moves | `apply_price_tier_draft`, `apply_shopee_target_margin`, `apply_margin_defense_action`, `rollback_price_tier_draft` |\n| `PAT_ADS_WRITE` | Ads optimization groups, budgets, target ROAS, boosts | `create_ads_group`, `disable_ads_group_optimization`, `apply_shopee_target_roas`, `apply_tiktok_ad_budget` |\n| `PAT_CATALOG_WRITE` | COGS, stock, titles, canonical links, product creation | `apply_shopee_cogs`, `apply_shopee_stock`, `create_canonical_product`, `copy_product_to_shops` |\n| `PAT_RETURNS_WRITE` | Return and refund decisions | `approve_tiktok_return`, `reject_tiktok_return`, `decide_lazada_refund`, `confirm_shopee_return` |\n| `PAT_ORDERS_WRITE` | Order-level actions and documents | `cancel_shopee_order`, `split_shopee_order`, `set_shopee_order_note` |\n| `PAT_LOGISTICS_WRITE` | Packages, shipping, airway bills | `ship_tiktok_package`, `batch_ship_tiktok_packages`, `print_shopee_airway_bills` |\n| `PAT_RECOMMENDATION_WRITE` | Acting on DataGlass Actions | `reject_recommendation`, `stop_recommendation`, `rollback_recommendation` |\n| `PAT_INVENTORY_WRITE` | Alerts, purchase orders, stock-sync settings | `acknowledge_inventory_alert`, `log_purchase_order`, `set_shopee_stock_sync` |\n| `PAT_REPORTS_WRITE` | Ads performance report authoring | `generate_ads_performance_report`, `publish_ads_report_workspace` |\n\nReturn and refund decisions sit behind their own scope rather than riding along with orders or logistics, because they move real money and the platform will not reverse them.\n\nGranting a write scope never widens your DataGlass role. The `PAT_*` scopes unlock the agent write gate only; organization permissions, shop-ownership guards, and the sensitive-financial rules all still run on every call exactly as they do in the app.\n\n## Mediated writes versus raw marketplace passthroughs\n\n**The connector writes through DataGlass, never straight through to a marketplace API.** This is the architectural line that decides which capabilities exist as tools at all.\n\nA **mediated** path — a price-tier draft, a target-margin apply, a recommendation apply — computes the resulting margin before it acts, records a draft or rollback state, and converges with the rest of the pricing product, so the number you see in DataGlass and the number the buyer sees agree afterwards. These are the paths exposed as tools.\n\nA **raw passthrough** — `updatePrice`, `addDiscount`, `updateStock`, and the voucher, bundle-deal, flexi-combo, and free-shipping partner calls — pushes a value at the marketplace and returns. DataGlass would then hold one price and the marketplace another. Those handlers exist for the app's own use but are deliberately not agent-reachable.\n\nThe honest consequence: **vouchers, bundle deals, flexi-combo, and free-shipping campaigns have no mediated equivalent, so those capabilities are simply absent from the agent surface.** An assistant cannot create or edit them for you at any scope. Do them in the app or in Seller Center.\n\n## Tools that create live marketplace listings\n\nTwo catalog tools call the platforms' own create-product APIs and produce listings buyers can see:\n\n- `create_canonical_product` creates a new live listing on every selected Shopee, Lazada, and TikTok shop, then binds them to one shared canonical product.\n- `copy_product_to_shops` re-creates an existing listing as a new live listing on each target shop, including a different platform.\n\nBoth are labelled destructive for that reason. Neither is a canonical-row-only operation. Read the full payload back — shops, title, price, stock — before you approve one.\n\n## Two profitability lists withheld from the agent surface\n\nThe Shopee **price-tier review queue** and the **campaigns-losing-by-profit-adjusted-ROAS** list were deliberately withdrawn from the tool surface on 3 August 2026. Membership in either result set *is* the financial signal: being in the queue means margin sits below the floor, and being in the losing list means true profit is negative. Shading the values would still leak that to a team member without `VIEW_SENSITIVE_FINANCIAL`, and a tool would make it enumerable across every shop in one call.\n\nBoth still work inside the DataGlass app and over the REST API, under the usual page permissions. Only the agent surface is narrower.\n\n## API keys from the app are read-only; OAuth connectors carry the scopes you approve\n\nThere are two ways to hand DataGlass credentials to an agent, and they differ:\n\n| Credential | How it is issued | Write ability |\n| --- | --- | --- |\n| API key from **Settings → API keys** | The in-app UI, which has no scope picker | **Read-only by construction** — the key is created with the read baseline and nothing else |\n| **OAuth connector** in ChatGPT or Claude | The `\u002Fconnect` consent screen | Exactly the `PAT_*` scopes shown on that screen and approved by you |\n\nSo a `dg_pat_` token you pasted into a script cannot write, even though the connector you approved in Claude might. When someone reports that \"the API is read-only,\" this is usually the distinction they mean.\n\n## What the plan decides for MCP and API keys\n\nConnecting an assistant over MCP is included in every plan. What the plan decides is what a tool may reach: a tool that reads or changes a Pro feature (Actions, ads optimization groups and automation, bid timing, price elasticity) answers a caller below Pro with a plan-denied response rather than a tool result. Creating a Personal Access Token (an API key) requires **`PlanTier.PRO`**. Do not describe API keys, or every MCP tool, as included in every plan.\n\n## Rate limits and the fail-closed rule for write-capable keys\n\nEach key is throttled at **60 requests burst, 1 request per second sustained**, keyed per key so one runaway agent cannot starve your dashboard. An MCP tool's internal fan-out does not consume extra tokens; the outer `\u002Fmcp` call already spent one.\n\nWhen the limiter itself is unavailable, the behaviour splits by capability. A **read-only key fails open** — the token was already validated, and an outage should not take reads down. A **write-capable key fails closed**, because an unthrottled agent looping over a mutating tool changes live prices and ad spend, which is not a cost worth paying to keep reads up.\n\n## Tenant isolation across the API-key surface\n\nA full trace of every API-key-reachable endpoint — 625 handlers — found no cross-tenant read and no cross-tenant write. Every tool call is dispatched as an authenticated request carrying your own token, so ownership guards run exactly as they do for a request from the app.\n\n## Sensitive financial shading survives the agent boundary\n\nA value hidden by `VIEW_SENSITIVE_FINANCIAL` arrives at the assistant as the string `\"***\"` — or `null` for an object or list — not as a real number. Render it as a locked field. Do not coerce it to zero, do not treat it as missing data, and do not retry around the permission. Where ordering itself would disclose a shaded value, the sort is stripped too.\n\n## Production endpoints\n\n| Purpose | URL |\n| --- | --- |\n| DataGlass application | `https:\u002F\u002Fapp.dataglasslabs.com` |\n| Connector consent | `https:\u002F\u002Fapp.dataglasslabs.com\u002Fconnect` |\n| Plan and billing recovery | `https:\u002F\u002Fapp.dataglasslabs.com\u002Fopen\u002Fbilling` |\n| MCP endpoint | `https:\u002F\u002Fprod-api.dataglasslabs.com\u002Fmcp` |\n| OAuth metadata | `https:\u002F\u002Fprod-api.dataglasslabs.com\u002F.well-known\u002F...` |\n\nProduct-search results can contain relative links such as `\u002Fproducts?canonicalId=123`. Resolve them against `https:\u002F\u002Fapp.dataglasslabs.com`, never against the API origin.\n\nThere is **no public OpenAPI spec**. An `agent` spec is generated internally at `\u002Fv3\u002Fapi-docs\u002Fagent` from the live access rules, but it is IP-allowlisted and returns 404 to the public internet. Runtime `tools\u002Flist` is the machine-readable contract for a connected assistant.\n\n## Business terms used in answers\n\n| Term | Meaning |\n| --- | --- |\n| Realized profit | Settled, cancellation-adjusted profit from marketplace financial data |\n| True ROAS | Ads return after relevant COGS, fees, returns, and cancellation adjustments |\n| Payout | Money actually settled by a marketplace; it is not the same as profit |\n| Estimated COGS | A DataGlass inference used when an explicit product cost is missing |\n| Recommendation | A suggested action, reviewable in DataGlass and applicable through a tool when the recommendation write scope is granted |\n\nDo not promise live marketplace data or guaranteed future results.\n\n## Assistant workflow for a DataGlass question\n\n1. Discover the selected shop using the matching `list_*_shops` tool. Never invent `shopId`, `sellerId`, or `region`.\n2. For \"how is my shop?\" or \"what changed?\", begin with `diagnose_shop`.\n3. Read `signals[]` and follow a signal's `suggestedTool` only when the question needs that evidence.\n4. Compare like-for-like periods and state the window and local currency.\n5. Lead with the largest business driver, then show up to three supporting facts and a next step.\n6. State when COGS is inferred, recent settlement is incomplete, a field is permission-shaded, or the result is simulated.\n7. Before any write, name the tool, the exact objects it will touch, and the current-versus-proposed values — then wait for an explicit go-ahead.\n8. After a write, say what actually changed and name the rollback or revert tool if one exists.\n\n## Language for read results versus writes\n\nUse \"preview,\" \"simulate,\" \"recommend,\" or \"review in DataGlass\" for anything the assistant has only read or modelled. Say \"applied,\" \"updated,\" \"cancelled,\" or \"shipped\" **only after a write tool returned successfully** — and name the tool that did it. Claiming a change that did not happen, and failing to report one that did, are equally serious errors.\n\nNote that \"rollback\" rarely means undo. A price rollback issues a fresh set of platform writes to restore the captured pre-apply prices; buyers see prices change again. Some actions — a cancelled Shopee order, an accepted TikTok return — cannot be reversed at all.\n\n## Identifiers\n\n- Get shop IDs and regions from `list_shopee_shops`, `list_lazada_shops`, or `list_tiktok_shops`.\n- Use canonical product IDs only after `search`, `list_products`, or another product result returns them.\n- Do not infer a marketplace from the shape of an ID.\n- TikTok shop, campaign, advertiser, product, and SKU IDs can exceed JavaScript's safe integer range. Preserve them as opaque strings from browser to MCP and back.\n\n`diagnose_shop` currently derives its schema from a Kotlin `Long` path value. Pass a TikTok shop ID exactly as returned by `list_tiktok_shops`. If a strict host cannot preserve it without numeric coercion, use the TikTok-specific financial overview tools.\n\n## Dates and comparisons\n\n| Value | Format |\n| --- | --- |\n| Human calendar date | `YYYY-MM-DD` |\n| Conversion `datadateFrom` \u002F `datadateTo` | `YYYYMMDD` integer |\n| Timestamp | ISO 8601 |\n| Default comparison | Immediately preceding period of equal length |\n\nPayout tools filter by payout or settlement date, not order date. Recent realized values can be incomplete while marketplace settlement is pending; show a settlement-lag note instead of treating the latest decline as final.\n\n## Money, VAT, and COGS\n\n- Money uses the shop's local currency. Do not sum unlike currencies without explaining the rollup.\n- `includeVat=false` is the normal forward-VAT view unless the user asks otherwise.\n- `includeInferredCogs=true` fills missing COGS with DataGlass's estimate.\n- Label ranked loss-makers and simulations that depend on inferred costs.\n- Writing COGS changes every profit and margin number for the affected products, historical reports included. Preview it first.\n\n## Pagination and call cost\n\n- Begin with counts, diagnostics, or top and bottom summaries when they answer the question.\n- Use `search` before a broad catalog list when the user gives a product name, SKU, model SKU, or listing ID.\n- For cursor results, pass the response's `nextCursor` values into the next call.\n- Fetch more pages only for exhaustive output or when the decision truly requires it.\n\n## OAuth consent contract\n\nThe MCP host starts OAuth at the API domain. After validation, DataGlass redirects the browser to `https:\u002F\u002Fapp.dataglasslabs.com\u002Fconnect` with `client_id`, optional `client_name`, `redirect_uri`, `scope`, optional `state`, `code_challenge`, `code_challenge_method=S256`, and optional `resource`.\n\nThe consent page must:\n\n1. Preserve every query parameter across sign-in and return the user to the exact consent URL.\n2. Show the read baseline plus **every requested `PAT_*` write scope, named in plain language**, so the user can see which domains the client will be able to change.\n3. Display the validated `client_name` when present without implying DataGlass owns the client.\n4. Require an explicit allow or deny decision.\n5. POST snake-case fields to `https:\u002F\u002Fprod-api.dataglasslabs.com\u002Fapi\u002Foauth\u002Fconsent`.\n6. Send the DataGlass JWT in `Authorization: Bearer ...`; the endpoint intentionally ignores the ambient access-token cookie to prevent consent CSRF.\n7. Use `approve: true` for allow and `approve: false` for deny.\n8. Navigate only to `data.redirectTo` returned by the backend.\n9. Clear pending consent state after navigation or cancellation.\n\n```json\n{\n  \"client_id\": \"...\",\n  \"redirect_uri\": \"...\",\n  \"scope\": \"...\",\n  \"state\": \"...\",\n  \"code_challenge\": \"...\",\n  \"code_challenge_method\": \"S256\",\n  \"resource\": \"...\",\n  \"approve\": true\n}\n```\n\nConsent copy should state both halves — what the client reads, and what it may change:\n\n> Connect DataGlass to `{clientName}`? `{clientName}` will be able to read analytics for the shops available to your DataGlass account, including products, orders, profit, ads, recommendations, and inventory. If you also approve the write permissions listed above, it will be able to change those things in your shops.\n\nWhen no write scope is requested, say so plainly and label the button **Allow read-only access**. When one or more is requested, the button must not claim read-only access.\n\n## Response design\n\nA useful answer follows this order:\n\n1. **Scope:** shop and platform, date range, comparison, and currency.\n2. **Headline:** the most important conclusion in one sentence.\n3. **Evidence:** no more than three key metrics or ranked drivers initially.\n4. **Confidence:** COGS coverage, settlement lag, permissions, or simulation assumptions.\n5. **Next step:** a follow-up question, another simulation, a proposed write, or a DataGlass deep link.\n\n| Result | Recommended presentation |\n| --- | --- |\n| Shop list | Selectable rows grouped by marketplace |\n| Health diagnostic | Headline plus severity-tagged signal cards |\n| Period comparison | KPI values with absolute and percentage delta |\n| Product or campaign ranking | Sortable table with best and worst emphasis |\n| Profit and loss breakdown | Waterfall or stacked cost list |\n| Simulation | Current values beside the proposed scenario |\n| Reorder plan | SKU table with urgency and inbound stock |\n| Recommendation | Card with rationale, review link, and the apply tool if a scope allows it |\n| Proposed write | Current versus proposed values, the exact objects affected, and the rollback path |\n| Completed write | What changed, the tool that changed it, and how to revert |\n| `\"***\"` or sensitive `null` | Locked field with a permission explanation |\n| Tool error | Inline recovery state, not an empty-data state |\n\n## Error recovery\n\n| Condition | User-facing behavior |\n| --- | --- |\n| 401 or revoked token | \"Reconnect DataGlass to continue.\" Start OAuth again. |\n| 403 on a read | \"This account cannot access that shop or resource.\" Do not restart OAuth automatically. |\n| 403 on a write tool | The connector lacks that domain's write scope. Name the missing scope and offer to reconnect with it, or point to the app. |\n| Plan denied | Explain that this tool needs the Pro plan and link to [billing](https:\u002F\u002Fapp.dataglasslabs.com\u002Fopen\u002Fbilling). |\n| Trial ending | Show the server reminder once in a non-blocking notice. |\n| Trial or subscription ended | Show the server message and billing recovery link. |\n| 429 | Respect `Retry-After` and tell the user when another request is available. A write-capable key can also see 429 during a limiter outage, by design. |\n| Empty list | Confirm shop, region, dates, authorization, and data timing before concluding there was no activity. |\n| Invalid TikTok ID | Re-resolve with `list_tiktok_shops` and preserve the ID as a string. |\n| Missing COGS | Show estimated or missing cost instead of zero. |\n| Partial write result | Some tools return per-target `failures` rather than throwing. Report the successes and the failures separately. |\n\n## Prompt and connector analytics\n\nTrack stable prompt-pack identifiers instead of raw prompt text. Useful events include:\n\n- `mcp_prompt_impression` and `mcp_prompt_selected` with `prompt_pack`, `scenario`, `surface`, and optional `platform`;\n- `mcp_connector_started`, `mcp_connector_allowed`, `mcp_connector_denied`, and `mcp_connector_failed`;\n- `mcp_answer_followup_selected` with a follow-up type;\n- `mcp_deep_link_opened` with a route category, never raw financial content.\n\nNever log OAuth codes, PKCE values, access or refresh tokens, buyer information, raw prompts containing order details, or tool responses.\n\n## Adding a prompt to the library\n\n1. Choose one business outcome and the matching prompt pack.\n2. Confirm the required capability exists in the [tool catalog](\u002Fdocs\u002Fai-and-api\u002Fassistants\u002Ftool-catalog) and runtime `tools\u002Flist`.\n3. Write at least three scenarios: broad assessment, focused investigation, and decision or next action. Add a comparison or data-quality case when distinct.\n4. State which scope the prompt needs. If it can be answered read-only, say so; if it ends in a write, name the tool and the scope.\n5. Verify every ID in the prompt can be discovered rather than guessed.\n6. Define empty, permission-shaded, plan-denied, missing-scope, and incomplete-data behavior.\n7. Test every platform claimed by the prompt.\n8. Keep product links on `https:\u002F\u002Fapp.dataglasslabs.com`.\n",{"title":509,"description":2245},"8ueeLkathyRzcExVsi_DDM4gpYrE0nw_xYSKMJJ8R4c",{"data":2254,"body":2255},{},{"type":2256,"children":2257},"root",[2258],{"type":2259,"tag":696,"props":2260,"children":2261},"element",{},[2262],{"type":2263,"value":2245},"text",1792785224670]