[{"data":1,"prerenderedAt":6196},["ShallowReactive",2],{"navigation_docs":3,"-docs-guides-commerce-model-a-catalog":2399},[4,82,446,500,736,2117],{"title":5,"path":6,"stem":7,"children":8},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002Fgetting-started\u002Findex",[9,10,17,23,30,37,44,51,57,63,69,75],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13,"children":14,"icon":16},"Apps and Sites","\u002Fdocs\u002Fgetting-started\u002Fapps-and-sites","docs\u002Fgetting-started\u002Fapps-and-sites\u002Findex",[15],{"title":11,"path":12,"stem":13,"icon":16},"i-lucide-columns-2",{"title":18,"path":19,"stem":20,"children":21},"Architecture Overview","\u002Fdocs\u002Fgetting-started\u002Farchitecture","docs\u002Fgetting-started\u002Farchitecture\u002Findex",[22],{"title":18,"path":19,"stem":20},{"title":24,"path":25,"stem":26,"children":27,"icon":29},"Bring an existing frontend","\u002Fdocs\u002Fgetting-started\u002Fbring-an-existing-frontend","docs\u002Fgetting-started\u002Fbring-an-existing-frontend\u002Findex",[28],{"title":24,"path":25,"stem":26,"icon":29},"i-lucide-arrow-right-left",{"title":31,"path":32,"stem":33,"children":34,"icon":36},"Concepts","\u002Fdocs\u002Fgetting-started\u002Fconcepts","docs\u002Fgetting-started\u002Fconcepts\u002Findex",[35],{"title":31,"path":32,"stem":33,"icon":36},"i-lucide-shapes",{"title":38,"path":39,"stem":40,"children":41,"icon":43},"Frontend stacks","\u002Fdocs\u002Fgetting-started\u002Ffrontend-stacks","docs\u002Fgetting-started\u002Ffrontend-stacks\u002Findex",[42],{"title":38,"path":39,"stem":40,"icon":43},"i-lucide-layers",{"title":45,"path":46,"stem":47,"children":48,"icon":50},"Get Help","\u002Fdocs\u002Fgetting-started\u002Fget-help","docs\u002Fgetting-started\u002Fget-help\u002Findex",[49],{"title":45,"path":46,"stem":47,"icon":50},"i-lucide-life-buoy",{"title":52,"path":53,"stem":54,"children":55},"Glossary","\u002Fdocs\u002Fgetting-started\u002Fglossary","docs\u002Fgetting-started\u002Fglossary\u002Findex",[56],{"title":52,"path":53,"stem":54},{"title":58,"path":59,"stem":60,"children":61},"Platform Overview","\u002Fdocs\u002Fgetting-started\u002Fplatform-overview","docs\u002Fgetting-started\u002Fplatform-overview\u002Findex",[62],{"title":58,"path":59,"stem":60},{"title":64,"path":65,"stem":66,"children":67},"Prerequisites","\u002Fdocs\u002Fgetting-started\u002Fprerequisites","docs\u002Fgetting-started\u002Fprerequisites\u002Findex",[68],{"title":64,"path":65,"stem":66},{"title":70,"path":71,"stem":72,"children":73},"Your First App in 15 Minutes","\u002Fdocs\u002Fgetting-started\u002Fquick-start","docs\u002Fgetting-started\u002Fquick-start\u002Findex",[74],{"title":70,"path":71,"stem":72},{"title":76,"path":77,"stem":78,"children":79,"icon":81},"Security and trust","\u002Fdocs\u002Fgetting-started\u002Fsecurity-and-trust","docs\u002Fgetting-started\u002Fsecurity-and-trust\u002Findex",[80],{"title":76,"path":77,"stem":78,"icon":81},"i-lucide-shield-check",{"title":83,"path":84,"stem":85,"children":86},"Guides","\u002Fdocs\u002Fguides","docs\u002Fguides\u002Findex",[87,88,151,249,256,310,364,391],{"title":83,"path":84,"stem":85},{"title":89,"path":90,"stem":91,"children":92,"icon":94},"Build an App","\u002Fdocs\u002Fguides\u002Fapps","docs\u002Fguides\u002Fapps\u002Findex",[93,95,102,109,116,123,130,137,144],{"title":89,"path":90,"stem":91,"icon":94},"i-lucide-layout-grid",{"title":96,"path":97,"stem":98,"children":99,"icon":101},"Give your App a Cockpit screen","\u002Fdocs\u002Fguides\u002Fapps\u002Fadd-a-cockpit-screen","docs\u002Fguides\u002Fapps\u002Fadd-a-cockpit-screen\u002Findex",[100],{"title":96,"path":97,"stem":98,"icon":101},"i-lucide-layout-dashboard",{"title":103,"path":104,"stem":105,"children":106,"icon":108},"Add a data model","\u002Fdocs\u002Fguides\u002Fapps\u002Fadd-a-data-model","docs\u002Fguides\u002Fapps\u002Fadd-a-data-model\u002Findex",[107],{"title":103,"path":104,"stem":105,"icon":108},"i-lucide-database",{"title":110,"path":111,"stem":112,"children":113,"icon":115},"Build your first App","\u002Fdocs\u002Fguides\u002Fapps\u002Fbuild-your-first-app","docs\u002Fguides\u002Fapps\u002Fbuild-your-first-app\u002Findex",[114],{"title":110,"path":111,"stem":112,"icon":115},"i-lucide-hammer",{"title":117,"path":118,"stem":119,"children":120,"icon":122},"Deploy and verify an App","\u002Fdocs\u002Fguides\u002Fapps\u002Fdeploy-with-the-cli","docs\u002Fguides\u002Fapps\u002Fdeploy-with-the-cli\u002Findex",[121],{"title":117,"path":118,"stem":119,"icon":122},"i-lucide-square-terminal",{"title":124,"path":125,"stem":126,"children":127,"icon":129},"Publish a business event from your App","\u002Fdocs\u002Fguides\u002Fapps\u002Fpublish-a-business-event","docs\u002Fguides\u002Fapps\u002Fpublish-a-business-event\u002Findex",[128],{"title":124,"path":125,"stem":126,"icon":129},"i-lucide-megaphone",{"title":131,"path":132,"stem":133,"children":134,"icon":136},"Publish on the Marketplace","\u002Fdocs\u002Fguides\u002Fapps\u002Fpublish-on-the-marketplace","docs\u002Fguides\u002Fapps\u002Fpublish-on-the-marketplace\u002Findex",[135],{"title":131,"path":132,"stem":133,"icon":136},"i-lucide-store",{"title":138,"path":139,"stem":140,"children":141,"icon":143},"React to events and run scheduled work in your App","\u002Fdocs\u002Fguides\u002Fapps\u002Freact-to-events-and-run-scheduled-work","docs\u002Fguides\u002Fapps\u002Freact-to-events-and-run-scheduled-work\u002Findex",[142],{"title":138,"path":139,"stem":140,"icon":143},"i-lucide-timer",{"title":145,"path":146,"stem":147,"children":148,"icon":150},"Ship a schema change","\u002Fdocs\u002Fguides\u002Fapps\u002Fship-a-schema-change","docs\u002Fguides\u002Fapps\u002Fship-a-schema-change\u002Findex",[149],{"title":145,"path":146,"stem":147,"icon":150},"i-lucide-git-branch",{"title":152,"path":153,"stem":154,"children":155,"icon":157},"Set up selling","\u002Fdocs\u002Fguides\u002Fcommerce","docs\u002Fguides\u002Fcommerce\u002Findex",[156,158,165,172,179,186,193,200,207,214,221,228,235,242],{"title":152,"path":153,"stem":154,"icon":157},"i-lucide-shopping-cart",{"title":159,"path":160,"stem":161,"children":162,"icon":164},"Set up B2B pricing","\u002Fdocs\u002Fguides\u002Fcommerce\u002Fb2b-pricing","docs\u002Fguides\u002Fcommerce\u002Fb2b-pricing\u002Findex",[163],{"title":159,"path":160,"stem":161,"icon":164},"i-lucide-circle-dollar-sign",{"title":166,"path":167,"stem":168,"children":169,"icon":171},"Give buyer staff the right permissions","\u002Fdocs\u002Fguides\u002Fcommerce\u002Fbuyer-permissions","docs\u002Fguides\u002Fcommerce\u002Fbuyer-permissions\u002Findex",[170],{"title":166,"path":167,"stem":168,"icon":171},"i-lucide-user-cog",{"title":173,"path":174,"stem":175,"children":176,"icon":178},"Confirm invoice payments","\u002Fdocs\u002Fguides\u002Fcommerce\u002Fconfirm-invoice-payments","docs\u002Fguides\u002Fcommerce\u002Fconfirm-invoice-payments\u002Findex",[177],{"title":173,"path":174,"stem":175,"icon":178},"i-lucide-receipt",{"title":180,"path":181,"stem":182,"children":183,"icon":185},"Model a catalog with attributes, families and variants","\u002Fdocs\u002Fguides\u002Fcommerce\u002Fmodel-a-catalog","docs\u002Fguides\u002Fcommerce\u002Fmodel-a-catalog\u002Findex",[184],{"title":180,"path":181,"stem":182,"icon":185},"i-lucide-boxes",{"title":187,"path":188,"stem":189,"children":190,"icon":192},"Order and quote numbers","\u002Fdocs\u002Fguides\u002Fcommerce\u002Fnumber-ranges","docs\u002Fguides\u002Fcommerce\u002Fnumber-ranges\u002Findex",[191],{"title":187,"path":188,"stem":189,"icon":192},"i-lucide-hash",{"title":194,"path":195,"stem":196,"children":197,"icon":199},"Manage product images and documents","\u002Fdocs\u002Fguides\u002Fcommerce\u002Fproduct-media","docs\u002Fguides\u002Fcommerce\u002Fproduct-media\u002Findex",[198],{"title":194,"path":195,"stem":196,"icon":199},"i-lucide-image",{"title":201,"path":202,"stem":203,"children":204,"icon":206},"Run promotions and voucher codes","\u002Fdocs\u002Fguides\u002Fcommerce\u002Fpromotions-and-vouchers","docs\u002Fguides\u002Fcommerce\u002Fpromotions-and-vouchers\u002Findex",[205],{"title":201,"path":202,"stem":203,"icon":206},"i-lucide-ticket-percent",{"title":208,"path":209,"stem":210,"children":211,"icon":213},"Set up purchase approvals","\u002Fdocs\u002Fguides\u002Fcommerce\u002Fpurchase-approvals","docs\u002Fguides\u002Fcommerce\u002Fpurchase-approvals\u002Findex",[212],{"title":208,"path":209,"stem":210,"icon":213},"i-lucide-stamp",{"title":215,"path":216,"stem":217,"children":218,"icon":220},"Turn an accepted quote into an order","\u002Fdocs\u002Fguides\u002Fcommerce\u002Fquotes-to-orders","docs\u002Fguides\u002Fcommerce\u002Fquotes-to-orders\u002Findex",[219],{"title":215,"path":216,"stem":217,"icon":220},"i-lucide-handshake",{"title":222,"path":223,"stem":224,"children":225,"icon":227},"Build categories from rules","\u002Fdocs\u002Fguides\u002Fcommerce\u002Frule-based-categories","docs\u002Fguides\u002Fcommerce\u002Frule-based-categories\u002Findex",[226],{"title":222,"path":223,"stem":224,"icon":227},"i-lucide-list-filter",{"title":229,"path":230,"stem":231,"children":232,"icon":234},"Ship, cancel and return an order","\u002Fdocs\u002Fguides\u002Fcommerce\u002Fship-cancel-and-return","docs\u002Fguides\u002Fcommerce\u002Fship-cancel-and-return\u002Findex",[233],{"title":229,"path":230,"stem":231,"icon":234},"i-lucide-package-check",{"title":236,"path":237,"stem":238,"children":239,"icon":241},"Set up shipping rates and tax","\u002Fdocs\u002Fguides\u002Fcommerce\u002Fshipping-rates","docs\u002Fguides\u002Fcommerce\u002Fshipping-rates\u002Findex",[240],{"title":236,"path":237,"stem":238,"icon":241},"i-lucide-truck",{"title":243,"path":244,"stem":245,"children":246,"icon":248},"Connect a payment provider and take a test payment","\u002Fdocs\u002Fguides\u002Fcommerce\u002Ftest-payments","docs\u002Fguides\u002Fcommerce\u002Ftest-payments\u002Findex",[247],{"title":243,"path":244,"stem":245,"icon":248},"i-lucide-credit-card",{"title":250,"path":251,"stem":252,"children":253,"icon":255},"Start from an example","\u002Fdocs\u002Fguides\u002Fexamples","docs\u002Fguides\u002Fexamples\u002Findex",[254],{"title":250,"path":251,"stem":252,"icon":255},"i-lucide-folder-code",{"title":257,"path":258,"stem":259,"children":260,"icon":262},"Connect a system","\u002Fdocs\u002Fguides\u002Fintegrations","docs\u002Fguides\u002Fintegrations\u002Findex",[261,263,269,276,283,289,296,303],{"title":257,"path":258,"stem":259,"icon":262},"i-lucide-plug",{"title":264,"path":265,"stem":266,"children":267,"icon":29},"Connect a procurement system by punchout","\u002Fdocs\u002Fguides\u002Fintegrations\u002Fconnect-by-punchout","docs\u002Fguides\u002Fintegrations\u002Fconnect-by-punchout\u002Findex",[268],{"title":264,"path":265,"stem":266,"icon":29},{"title":270,"path":271,"stem":272,"children":273,"icon":275},"Hand an order to the ERP","\u002Fdocs\u002Fguides\u002Fintegrations\u002Fhand-an-order-to-the-erp","docs\u002Fguides\u002Fintegrations\u002Fhand-an-order-to-the-erp\u002Findex",[274],{"title":270,"path":271,"stem":272,"icon":275},"i-lucide-arrow-left-right",{"title":277,"path":278,"stem":279,"children":280,"icon":282},"Import a BMECAT catalog","\u002Fdocs\u002Fguides\u002Fintegrations\u002Fimport-a-bmecat-catalog","docs\u002Fguides\u002Fintegrations\u002Fimport-a-bmecat-catalog\u002Findex",[281],{"title":277,"path":278,"stem":279,"icon":282},"i-lucide-package-plus",{"title":284,"path":285,"stem":286,"children":287,"icon":50},"Keep an Integration Studio workflow running","\u002Fdocs\u002Fguides\u002Fintegrations\u002Fkeep-a-workflow-running","docs\u002Fguides\u002Fintegrations\u002Fkeep-a-workflow-running\u002Findex",[288],{"title":284,"path":285,"stem":286,"icon":50},{"title":290,"path":291,"stem":292,"children":293,"icon":295},"Receive platform events at your own endpoint","\u002Fdocs\u002Fguides\u002Fintegrations\u002Freceive-platform-events","docs\u002Fguides\u002Fintegrations\u002Freceive-platform-events\u002Findex",[294],{"title":290,"path":291,"stem":292,"icon":295},"i-lucide-webhook",{"title":297,"path":298,"stem":299,"children":300,"icon":302},"Recover abandoned carts with a workflow","\u002Fdocs\u002Fguides\u002Fintegrations\u002Frecover-abandoned-carts","docs\u002Fguides\u002Fintegrations\u002Frecover-abandoned-carts\u002Findex",[301],{"title":297,"path":298,"stem":299,"icon":302},"i-lucide-mail-check",{"title":304,"path":305,"stem":306,"children":307,"icon":309},"Send low-stock alerts to the ERP","\u002Fdocs\u002Fguides\u002Fintegrations\u002Fsend-low-stock-alerts-to-the-erp","docs\u002Fguides\u002Fintegrations\u002Fsend-low-stock-alerts-to-the-erp\u002Findex",[308],{"title":304,"path":305,"stem":306,"icon":309},"i-lucide-bell-ring",{"title":311,"path":312,"stem":313,"children":314,"icon":316},"Operate & go live","\u002Fdocs\u002Fguides\u002Foperate","docs\u002Fguides\u002Foperate\u002Findex",[315,317,323,330,337,344,351,357],{"title":311,"path":312,"stem":313,"icon":316},"i-lucide-activity",{"title":318,"path":319,"stem":320,"children":321,"icon":81},"Answer a customer's security questionnaire","\u002Fdocs\u002Fguides\u002Foperate\u002Fanswer-a-security-questionnaire","docs\u002Fguides\u002Foperate\u002Fanswer-a-security-questionnaire\u002Findex",[322],{"title":318,"path":319,"stem":320,"icon":81},{"title":324,"path":325,"stem":326,"children":327,"icon":329},"Debug a failed request","\u002Fdocs\u002Fguides\u002Foperate\u002Fdebug-a-failed-request","docs\u002Fguides\u002Foperate\u002Fdebug-a-failed-request\u002Findex",[328],{"title":324,"path":325,"stem":326,"icon":329},"i-lucide-bug",{"title":331,"path":332,"stem":333,"children":334,"icon":336},"Go live with a project","\u002Fdocs\u002Fguides\u002Foperate\u002Fgo-live-checklist","docs\u002Fguides\u002Foperate\u002Fgo-live-checklist\u002Findex",[335],{"title":331,"path":332,"stem":333,"icon":336},"i-lucide-list-checks",{"title":338,"path":339,"stem":340,"children":341,"icon":343},"Migrate from an existing shop","\u002Fdocs\u002Fguides\u002Foperate\u002Fmigrate-from-an-existing-shop","docs\u002Fguides\u002Foperate\u002Fmigrate-from-an-existing-shop\u002Findex",[342],{"title":338,"path":339,"stem":340,"icon":343},"i-lucide-route",{"title":345,"path":346,"stem":347,"children":348,"icon":350},"Size a launch","\u002Fdocs\u002Fguides\u002Foperate\u002Fplan-for-limits","docs\u002Fguides\u002Foperate\u002Fplan-for-limits\u002Findex",[349],{"title":345,"path":346,"stem":347,"icon":350},"i-lucide-gauge",{"title":352,"path":353,"stem":354,"children":355,"icon":336},"Script a bulk change","\u002Fdocs\u002Fguides\u002Foperate\u002Fscript-a-bulk-change","docs\u002Fguides\u002Foperate\u002Fscript-a-bulk-change\u002Findex",[356],{"title":352,"path":353,"stem":354,"icon":336},{"title":358,"path":359,"stem":360,"children":361,"icon":363},"Stay current","\u002Fdocs\u002Fguides\u002Foperate\u002Fstay-current","docs\u002Fguides\u002Foperate\u002Fstay-current\u002Findex",[362],{"title":358,"path":359,"stem":360,"icon":363},"i-lucide-refresh-cw",{"title":365,"path":366,"stem":367,"children":368,"icon":370},"Plan before you build","\u002Fdocs\u002Fguides\u002Fplan","docs\u002Fguides\u002Fplan\u002Findex",[369,371,378,385],{"title":365,"path":366,"stem":367,"icon":370},"i-lucide-map",{"title":372,"path":373,"stem":374,"children":375,"icon":377},"Choose a system of record","\u002Fdocs\u002Fguides\u002Fplan\u002Fchoose-a-system-of-record","docs\u002Fguides\u002Fplan\u002Fchoose-a-system-of-record\u002Findex",[376],{"title":372,"path":373,"stem":374,"icon":377},"i-lucide-network",{"title":379,"path":380,"stem":381,"children":382,"icon":384},"Choose an event surface","\u002Fdocs\u002Fguides\u002Fplan\u002Fchoose-an-event-surface","docs\u002Fguides\u002Fplan\u002Fchoose-an-event-surface\u002Findex",[383],{"title":379,"path":380,"stem":381,"icon":384},"i-lucide-signpost",{"title":386,"path":387,"stem":388,"children":389,"icon":343},"Choose where the logic goes","\u002Fdocs\u002Fguides\u002Fplan\u002Fchoose-where-the-logic-goes","docs\u002Fguides\u002Fplan\u002Fchoose-where-the-logic-goes\u002Findex",[390],{"title":386,"path":387,"stem":388,"icon":343},{"title":392,"path":393,"stem":394,"children":395,"icon":397},"Build a storefront","\u002Fdocs\u002Fguides\u002Fstorefronts","docs\u002Fguides\u002Fstorefronts\u002Findex",[396,398,405,412,419,426,432,439],{"title":392,"path":393,"stem":394,"icon":397},"i-lucide-paintbrush",{"title":399,"path":400,"stem":401,"children":402,"icon":404},"Brand a Theme with design tokens","\u002Fdocs\u002Fguides\u002Fstorefronts\u002Fbrand-with-tokens","docs\u002Fguides\u002Fstorefronts\u002Fbrand-with-tokens\u002Findex",[403],{"title":399,"path":400,"stem":401,"icon":404},"i-lucide-palette",{"title":406,"path":407,"stem":408,"children":409,"icon":411},"Build a block","\u002Fdocs\u002Fguides\u002Fstorefronts\u002Fbuild-a-block","docs\u002Fguides\u002Fstorefronts\u002Fbuild-a-block\u002Findex",[410],{"title":406,"path":407,"stem":408,"icon":411},"i-lucide-blocks",{"title":413,"path":414,"stem":415,"children":416,"icon":418},"Build your first Theme","\u002Fdocs\u002Fguides\u002Fstorefronts\u002Fbuild-your-first-theme","docs\u002Fguides\u002Fstorefronts\u002Fbuild-your-first-theme\u002Findex",[417],{"title":413,"path":414,"stem":415,"icon":418},"i-lucide-layout-template",{"title":420,"path":421,"stem":422,"children":423,"icon":425},"Connect your own frontend","\u002Fdocs\u002Fguides\u002Fstorefronts\u002Fconnect-a-frontend","docs\u002Fguides\u002Fstorefronts\u002Fconnect-a-frontend\u002Findex",[424],{"title":420,"path":421,"stem":422,"icon":425},"i-lucide-plug-zap",{"title":427,"path":428,"stem":429,"children":430,"icon":363},"Refresh price caches when a price list changes","\u002Fdocs\u002Fguides\u002Fstorefronts\u002Frefresh-price-caches","docs\u002Fguides\u002Fstorefronts\u002Frefresh-price-caches\u002Findex",[431],{"title":427,"path":428,"stem":429,"icon":363},{"title":433,"path":434,"stem":435,"children":436,"icon":438},"Reorder and quick order","\u002Fdocs\u002Fguides\u002Fstorefronts\u002Freorder-and-quick-order","docs\u002Fguides\u002Fstorefronts\u002Freorder-and-quick-order\u002Findex",[437],{"title":433,"path":434,"stem":435,"icon":438},"i-lucide-repeat",{"title":440,"path":441,"stem":442,"children":443,"icon":445},"Sign a buyer in from your server","\u002Fdocs\u002Fguides\u002Fstorefronts\u002Fsign-a-buyer-in","docs\u002Fguides\u002Fstorefronts\u002Fsign-a-buyer-in\u002Findex",[444],{"title":440,"path":441,"stem":442,"icon":445},"i-lucide-log-in",{"title":447,"path":448,"stem":449,"children":450},"SDKs","\u002Fdocs\u002Fsdks","docs\u002Fsdks\u002Findex",[451,452,458,464,470,476,482,488,494],{"title":447,"path":448,"stem":449},{"title":453,"path":454,"stem":455,"children":456},"App SDK","\u002Fdocs\u002Fsdks\u002Fapp-sdk","docs\u002Fsdks\u002Fapp-sdk\u002Findex",[457],{"title":453,"path":454,"stem":455},{"title":459,"path":460,"stem":461,"children":462},"CLI","\u002Fdocs\u002Fsdks\u002Fcli","docs\u002Fsdks\u002Fcli\u002Findex",[463],{"title":459,"path":460,"stem":461},{"title":465,"path":466,"stem":467,"children":468},"Design systems","\u002Fdocs\u002Fsdks\u002Fdesign-systems","docs\u002Fsdks\u002Fdesign-systems\u002Findex",[469],{"title":465,"path":466,"stem":467},{"title":471,"path":472,"stem":473,"children":474},"Integration Node SDK","\u002Fdocs\u002Fsdks\u002Fintegration-nodes","docs\u002Fsdks\u002Fintegration-nodes\u002Findex",[475],{"title":471,"path":472,"stem":473},{"title":477,"path":478,"stem":479,"children":480},"Node SDK","\u002Fdocs\u002Fsdks\u002Fnode","docs\u002Fsdks\u002Fnode\u002Findex",[481],{"title":477,"path":478,"stem":479},{"title":483,"path":484,"stem":485,"children":486},"PHP SDK","\u002Fdocs\u002Fsdks\u002Fphp","docs\u002Fsdks\u002Fphp\u002Findex",[487],{"title":483,"path":484,"stem":485},{"title":489,"path":490,"stem":491,"children":492,"icon":150},"Versioning","\u002Fdocs\u002Fsdks\u002Fversioning","docs\u002Fsdks\u002Fversioning\u002Findex",[493],{"title":489,"path":490,"stem":491,"icon":150},{"title":495,"path":496,"stem":497,"children":498},"Web \u002F JavaScript SDK","\u002Fdocs\u002Fsdks\u002Fweb","docs\u002Fsdks\u002Fweb\u002Findex",[499],{"title":495,"path":496,"stem":497},{"title":501,"path":502,"stem":503,"children":504},"Services","\u002Fdocs\u002Fservices","docs\u002Fservices\u002Findex",[505,506,542,549,579,585,609,616,670,718],{"title":501,"path":502,"stem":503},{"title":507,"path":508,"stem":509,"children":510},"API usage","\u002Fdocs\u002Fservices\u002Fapi-usage","docs\u002Fservices\u002Fapi-usage\u002Findex",[511,512,518,524,530,536],{"title":507,"path":508,"stem":509},{"title":513,"path":514,"stem":515,"children":516},"Errors","\u002Fdocs\u002Fservices\u002Fapi-usage\u002Ferrors","docs\u002Fservices\u002Fapi-usage\u002Ferrors\u002Findex",[517],{"title":513,"path":514,"stem":515},{"title":519,"path":520,"stem":521,"children":522},"Retries & idempotency","\u002Fdocs\u002Fservices\u002Fapi-usage\u002Fidempotency","docs\u002Fservices\u002Fapi-usage\u002Fidempotency\u002Findex",[523],{"title":519,"path":520,"stem":521},{"title":525,"path":526,"stem":527,"children":528},"Pagination & filtering","\u002Fdocs\u002Fservices\u002Fapi-usage\u002Fpagination","docs\u002Fservices\u002Fapi-usage\u002Fpagination\u002Findex",[529],{"title":525,"path":526,"stem":527},{"title":531,"path":532,"stem":533,"children":534},"Rate limits","\u002Fdocs\u002Fservices\u002Fapi-usage\u002Frate-limits","docs\u002Fservices\u002Fapi-usage\u002Frate-limits\u002Findex",[535],{"title":531,"path":532,"stem":533},{"title":537,"path":538,"stem":539,"children":540},"Versioning & stability","\u002Fdocs\u002Fservices\u002Fapi-usage\u002Fversioning","docs\u002Fservices\u002Fapi-usage\u002Fversioning\u002Findex",[541],{"title":537,"path":538,"stem":539},{"title":543,"path":544,"stem":545,"children":546,"icon":548},"Record history","\u002Fdocs\u002Fservices\u002Faudit","docs\u002Fservices\u002Faudit\u002Findex",[547],{"title":543,"path":544,"stem":545,"icon":548},"i-lucide-history",{"title":550,"path":551,"stem":552,"children":553},"Authentication","\u002Fdocs\u002Fservices\u002Fauth","docs\u002Fservices\u002Fauth\u002Findex",[554,555,561,567,573],{"title":550,"path":551,"stem":552},{"title":556,"path":557,"stem":558,"children":559},"API keys","\u002Fdocs\u002Fservices\u002Fauth\u002Fapi-keys","docs\u002Fservices\u002Fauth\u002Fapi-keys\u002Findex",[560],{"title":556,"path":557,"stem":558},{"title":562,"path":563,"stem":564,"children":565},"Multi-factor authentication","\u002Fdocs\u002Fservices\u002Fauth\u002Fmfa","docs\u002Fservices\u002Fauth\u002Fmfa\u002Findex",[566],{"title":562,"path":563,"stem":564},{"title":568,"path":569,"stem":570,"children":571},"Social sign-in","\u002Fdocs\u002Fservices\u002Fauth\u002Foauth2","docs\u002Fservices\u002Fauth\u002Foauth2\u002Findex",[572],{"title":568,"path":569,"stem":570},{"title":574,"path":575,"stem":576,"children":577},"Sessions","\u002Fdocs\u002Fservices\u002Fauth\u002Fsessions","docs\u002Fservices\u002Fauth\u002Fsessions\u002Findex",[578],{"title":574,"path":575,"stem":576},{"title":580,"path":581,"stem":582,"children":583},"Avatars","\u002Fdocs\u002Fservices\u002Favatars","docs\u002Fservices\u002Favatars\u002Findex",[584],{"title":580,"path":581,"stem":582},{"title":586,"path":587,"stem":588,"children":589},"Events","\u002Fdocs\u002Fservices\u002Fevents","docs\u002Fservices\u002Fevents\u002Findex",[590,591,597,603],{"title":586,"path":587,"stem":588},{"title":592,"path":593,"stem":594,"children":595},"Consuming events","\u002Fdocs\u002Fservices\u002Fevents\u002Fconsuming-events","docs\u002Fservices\u002Fevents\u002Fconsuming-events\u002Findex",[596],{"title":592,"path":593,"stem":594},{"title":598,"path":599,"stem":600,"children":601},"Event catalog","\u002Fdocs\u002Fservices\u002Fevents\u002Fevent-catalog","docs\u002Fservices\u002Fevents\u002Fevent-catalog\u002Findex",[602],{"title":598,"path":599,"stem":600},{"title":604,"path":605,"stem":606,"children":607},"Event types","\u002Fdocs\u002Fservices\u002Fevents\u002Fevent-types","docs\u002Fservices\u002Fevents\u002Fevent-types\u002Findex",[608],{"title":604,"path":605,"stem":606},{"title":610,"path":611,"stem":612,"children":613,"icon":615},"Locale","\u002Fdocs\u002Fservices\u002Flocale","docs\u002Fservices\u002Flocale\u002Findex",[614],{"title":610,"path":611,"stem":612,"icon":615},"i-lucide-globe",{"title":617,"path":618,"stem":619,"children":620},"Network","\u002Fdocs\u002Fservices\u002Fnetwork","docs\u002Fservices\u002Fnetwork\u002Findex",[621,622,628,634,640,646,652,658,664],{"title":617,"path":618,"stem":619},{"title":623,"path":624,"stem":625,"children":626},"Caching","\u002Fdocs\u002Fservices\u002Fnetwork\u002Fcaching","docs\u002Fservices\u002Fnetwork\u002Fcaching\u002Findex",[627],{"title":623,"path":624,"stem":625},{"title":629,"path":630,"stem":631,"children":632},"Content delivery (CDN)","\u002Fdocs\u002Fservices\u002Fnetwork\u002Fcdn","docs\u002Fservices\u002Fnetwork\u002Fcdn\u002Findex",[633],{"title":629,"path":630,"stem":631},{"title":635,"path":636,"stem":637,"children":638},"Compression","\u002Fdocs\u002Fservices\u002Fnetwork\u002Fcompression","docs\u002Fservices\u002Fnetwork\u002Fcompression\u002Findex",[639],{"title":635,"path":636,"stem":637},{"title":641,"path":642,"stem":643,"children":644},"DDoS mitigation","\u002Fdocs\u002Fservices\u002Fnetwork\u002Fddos","docs\u002Fservices\u002Fnetwork\u002Fddos\u002Findex",[645],{"title":641,"path":642,"stem":643},{"title":647,"path":648,"stem":649,"children":650},"Edge network","\u002Fdocs\u002Fservices\u002Fnetwork\u002Fedges","docs\u002Fservices\u002Fnetwork\u002Fedges\u002Findex",[651],{"title":647,"path":648,"stem":649},{"title":653,"path":654,"stem":655,"children":656},"Endpoints","\u002Fdocs\u002Fservices\u002Fnetwork\u002Fendpoints","docs\u002Fservices\u002Fnetwork\u002Fendpoints\u002Findex",[657],{"title":653,"path":654,"stem":655},{"title":659,"path":660,"stem":661,"children":662},"Transport Layer Security (TLS)","\u002Fdocs\u002Fservices\u002Fnetwork\u002Ftls","docs\u002Fservices\u002Fnetwork\u002Ftls\u002Findex",[663],{"title":659,"path":660,"stem":661},{"title":665,"path":666,"stem":667,"children":668},"Web application firewall (WAF)","\u002Fdocs\u002Fservices\u002Fnetwork\u002Fwaf","docs\u002Fservices\u002Fnetwork\u002Fwaf\u002Findex",[669],{"title":665,"path":666,"stem":667},{"title":671,"path":672,"stem":673,"children":674},"Storage","\u002Fdocs\u002Fservices\u002Fstorage","docs\u002Fservices\u002Fstorage\u002Findex",[675,676,682,688,694,700,706,712],{"title":671,"path":672,"stem":673},{"title":677,"path":678,"stem":679,"children":680},"Folders","\u002Fdocs\u002Fservices\u002Fstorage\u002Fbuckets","docs\u002Fservices\u002Fstorage\u002Fbuckets\u002Findex",[681],{"title":677,"path":678,"stem":679},{"title":683,"path":684,"stem":685,"children":686},"Signed URLs and access","\u002Fdocs\u002Fservices\u002Fstorage\u002Ffile-tokens","docs\u002Fservices\u002Fstorage\u002Ffile-tokens\u002Findex",[687],{"title":683,"path":684,"stem":685},{"title":689,"path":690,"stem":691,"children":692},"Serve and transform images","\u002Fdocs\u002Fservices\u002Fstorage\u002Fimages","docs\u002Fservices\u002Fstorage\u002Fimages\u002Findex",[693],{"title":689,"path":690,"stem":691},{"title":695,"path":696,"stem":697,"children":698},"3D assets","\u002Fdocs\u002Fservices\u002Fstorage\u002Fmodel-viewer","docs\u002Fservices\u002Fstorage\u002Fmodel-viewer\u002Findex",[699],{"title":695,"path":696,"stem":697},{"title":701,"path":702,"stem":703,"children":704},"Access control and visibility","\u002Fdocs\u002Fservices\u002Fstorage\u002Fpermissions","docs\u002Fservices\u002Fstorage\u002Fpermissions\u002Findex",[705],{"title":701,"path":702,"stem":703},{"title":707,"path":708,"stem":709,"children":710},"Quick start","\u002Fdocs\u002Fservices\u002Fstorage\u002Fquick-start","docs\u002Fservices\u002Fstorage\u002Fquick-start\u002Findex",[711],{"title":707,"path":708,"stem":709},{"title":713,"path":714,"stem":715,"children":716},"Upload and manage files","\u002Fdocs\u002Fservices\u002Fstorage\u002Fupload-download","docs\u002Fservices\u002Fstorage\u002Fupload-download\u002Findex",[717],{"title":713,"path":714,"stem":715},{"title":719,"path":720,"stem":721,"children":722},"Webhooks","\u002Fdocs\u002Fservices\u002Fwebhooks","docs\u002Fservices\u002Fwebhooks\u002Findex",[723,724,730],{"title":719,"path":720,"stem":721},{"title":725,"path":726,"stem":727,"children":728},"Delivery","\u002Fdocs\u002Fservices\u002Fwebhooks\u002Fdelivery","docs\u002Fservices\u002Fwebhooks\u002Fdelivery\u002Findex",[729],{"title":725,"path":726,"stem":727},{"title":731,"path":732,"stem":733,"children":734},"Security","\u002Fdocs\u002Fservices\u002Fwebhooks\u002Fsecurity","docs\u002Fservices\u002Fwebhooks\u002Fsecurity\u002Findex",[735],{"title":731,"path":732,"stem":733},{"title":737,"path":738,"stem":739,"children":740},"Studios","\u002Fdocs\u002Fstudios","docs\u002Fstudios\u002Findex",[741,742,748,913,1264,1583,1765],{"title":737,"path":738,"stem":739},{"title":743,"path":744,"stem":745,"children":746},"AI Studio","\u002Fdocs\u002Fstudios\u002Fai","docs\u002Fstudios\u002Fai\u002Findex",[747],{"title":743,"path":744,"stem":745},{"title":749,"path":750,"stem":751,"children":752,"icon":754},"Analytics Studio","\u002Fdocs\u002Fstudios\u002Fanalytics","docs\u002Fstudios\u002Fanalytics\u002Findex",[753,755,798,835,841,859,889],{"title":749,"path":750,"stem":751,"icon":754},"i-lucide-chart-column",{"title":756,"path":757,"stem":758,"children":759,"icon":761},"Make your app's data analyzable","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fanalytics-json","docs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Findex",[760,762,768,774,780,786,792],{"title":756,"path":757,"stem":758,"icon":761},"i-lucide-table-2",{"title":763,"path":764,"stem":765,"children":766},"Column locators","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Fcolumn-locators","docs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Fcolumn-locators\u002Findex",[767],{"title":763,"path":764,"stem":765},{"title":769,"path":770,"stem":771,"children":772},"Declaring a view","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Fdeclaring-a-view","docs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Fdeclaring-a-view\u002Findex",[773],{"title":769,"path":770,"stem":771},{"title":775,"path":776,"stem":777,"children":778},"Example","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Fexample","docs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Fexample\u002Findex",[779],{"title":775,"path":776,"stem":777},{"title":781,"path":782,"stem":783,"children":784},"Semantic roles","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Fsemantic-roles","docs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Fsemantic-roles\u002Findex",[785],{"title":781,"path":782,"stem":783},{"title":787,"path":788,"stem":789,"children":790},"Tenant isolation","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Ftenant-isolation","docs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Ftenant-isolation\u002Findex",[791],{"title":787,"path":788,"stem":789},{"title":793,"path":794,"stem":795,"children":796},"The contract","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Fthe-contract","docs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Fthe-contract\u002Findex",[797],{"title":793,"path":794,"stem":795},{"title":799,"path":800,"stem":801,"children":802,"icon":804},"Stream commerce activity","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fevents","docs\u002Fstudios\u002Fanalytics\u002Fevents\u002Findex",[803,805,811,817,823,829],{"title":799,"path":800,"stem":801,"icon":804},"i-lucide-radio",{"title":806,"path":807,"stem":808,"children":809},"Delivery guarantees","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fevents\u002Fdelivery-guarantees","docs\u002Fstudios\u002Fanalytics\u002Fevents\u002Fdelivery-guarantees\u002Findex",[810],{"title":806,"path":807,"stem":808},{"title":812,"path":813,"stem":814,"children":815},"Event types for reporting","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fevents\u002Fevent-types-for-reporting","docs\u002Fstudios\u002Fanalytics\u002Fevents\u002Fevent-types-for-reporting\u002Findex",[816],{"title":812,"path":813,"stem":814},{"title":818,"path":819,"stem":820,"children":821},"Register an endpoint","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fevents\u002Fregister-an-endpoint","docs\u002Fstudios\u002Fanalytics\u002Fevents\u002Fregister-an-endpoint\u002Findex",[822],{"title":818,"path":819,"stem":820},{"title":824,"path":825,"stem":826,"children":827},"The event stream","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fevents\u002Fthe-event-stream","docs\u002Fstudios\u002Fanalytics\u002Fevents\u002Fthe-event-stream\u002Findex",[828],{"title":824,"path":825,"stem":826},{"title":830,"path":831,"stem":832,"children":833},"Verify a delivery","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fevents\u002Fverify-a-delivery","docs\u002Fstudios\u002Fanalytics\u002Fevents\u002Fverify-a-delivery\u002Findex",[834],{"title":830,"path":831,"stem":832},{"title":836,"path":837,"stem":838,"children":839,"icon":29},"Getting data out","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fgetting-data-out","docs\u002Fstudios\u002Fanalytics\u002Fgetting-data-out\u002Findex",[840],{"title":836,"path":837,"stem":838,"icon":29},{"title":842,"path":843,"stem":844,"children":845,"icon":336},"Limits and what's next","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Flimits","docs\u002Fstudios\u002Fanalytics\u002Flimits\u002Findex",[846,847,853],{"title":842,"path":843,"stem":844,"icon":336},{"title":848,"path":849,"stem":850,"children":851},"Designing for what's coming","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Flimits\u002Fdesigning-for-whats-coming","docs\u002Fstudios\u002Fanalytics\u002Flimits\u002Fdesigning-for-whats-coming\u002Findex",[852],{"title":848,"path":849,"stem":850},{"title":854,"path":855,"stem":856,"children":857},"What does not exist yet","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Flimits\u002Fwhat-does-not-exist-yet","docs\u002Fstudios\u002Fanalytics\u002Flimits\u002Fwhat-does-not-exist-yet\u002Findex",[858],{"title":854,"path":855,"stem":856},{"title":860,"path":861,"stem":862,"children":863,"icon":108},"Build your own reporting store","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fown-store","docs\u002Fstudios\u002Fanalytics\u002Fown-store\u002Findex",[864,865,871,877,883],{"title":860,"path":861,"stem":862,"icon":108},{"title":866,"path":867,"stem":868,"children":869},"Backfill","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fown-store\u002Fbackfill","docs\u002Fstudios\u002Fanalytics\u002Fown-store\u002Fbackfill\u002Findex",[870],{"title":866,"path":867,"stem":868},{"title":872,"path":873,"stem":874,"children":875},"Incremental sync","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fown-store\u002Fincremental-sync","docs\u002Fstudios\u002Fanalytics\u002Fown-store\u002Fincremental-sync\u002Findex",[876],{"title":872,"path":873,"stem":874},{"title":878,"path":879,"stem":880,"children":881},"Modelling","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fown-store\u002Fmodelling","docs\u002Fstudios\u002Fanalytics\u002Fown-store\u002Fmodelling\u002Findex",[882],{"title":878,"path":879,"stem":880},{"title":884,"path":885,"stem":886,"children":887},"Pull versus push","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fown-store\u002Fpull-vs-push","docs\u002Fstudios\u002Fanalytics\u002Fown-store\u002Fpull-vs-push\u002Findex",[888],{"title":884,"path":885,"stem":886},{"title":890,"path":891,"stem":892,"children":893,"icon":754},"What the tenant sees","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fwhat-the-tenant-sees","docs\u002Fstudios\u002Fanalytics\u002Fwhat-the-tenant-sees\u002Findex",[894,895,901,907],{"title":890,"path":891,"stem":892,"icon":754},{"title":896,"path":897,"stem":898,"children":899},"Cohorts","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fwhat-the-tenant-sees\u002Fcohorts","docs\u002Fstudios\u002Fanalytics\u002Fwhat-the-tenant-sees\u002Fcohorts\u002Findex",[900],{"title":896,"path":897,"stem":898},{"title":902,"path":903,"stem":904,"children":905},"Datasets and charts","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fwhat-the-tenant-sees\u002Fdatasets-and-charts","docs\u002Fstudios\u002Fanalytics\u002Fwhat-the-tenant-sees\u002Fdatasets-and-charts\u002Findex",[906],{"title":902,"path":903,"stem":904},{"title":908,"path":909,"stem":910,"children":911},"Studio overview","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fwhat-the-tenant-sees\u002Fstudio-overview","docs\u002Fstudios\u002Fanalytics\u002Fwhat-the-tenant-sees\u002Fstudio-overview\u002Findex",[912],{"title":908,"path":909,"stem":910},{"title":914,"path":915,"stem":916,"children":917},"App Studio","\u002Fdocs\u002Fstudios\u002Fapps","docs\u002Fstudios\u002Fapps\u002Findex",[918,919,955,1025,1096,1114,1180],{"title":914,"path":915,"stem":916},{"title":920,"path":921,"stem":922,"children":923,"icon":101},"Admin UI","\u002Fdocs\u002Fstudios\u002Fapps\u002Fadmin-ui","docs\u002Fstudios\u002Fapps\u002Fadmin-ui\u002Findex",[924,925,931,937,943,949],{"title":920,"path":921,"stem":922,"icon":101},{"title":926,"path":927,"stem":928,"children":929},"How the Cockpit renders","\u002Fdocs\u002Fstudios\u002Fapps\u002Fadmin-ui\u002Fhow-cockpit-renders","docs\u002Fstudios\u002Fapps\u002Fadmin-ui\u002Fhow-cockpit-renders\u002Findex",[930],{"title":926,"path":927,"stem":928},{"title":932,"path":933,"stem":934,"children":935},"Preview locally","\u002Fdocs\u002Fstudios\u002Fapps\u002Fadmin-ui\u002Fpreview-locally","docs\u002Fstudios\u002Fapps\u002Fadmin-ui\u002Fpreview-locally\u002Findex",[936],{"title":932,"path":933,"stem":934},{"title":938,"path":939,"stem":940,"children":941},"Reading settings","\u002Fdocs\u002Fstudios\u002Fapps\u002Fadmin-ui\u002Freading-settings","docs\u002Fstudios\u002Fapps\u002Fadmin-ui\u002Freading-settings\u002Findex",[942],{"title":938,"path":939,"stem":940},{"title":944,"path":945,"stem":946,"children":947},"Settings","\u002Fdocs\u002Fstudios\u002Fapps\u002Fadmin-ui\u002Fsettings","docs\u002Fstudios\u002Fapps\u002Fadmin-ui\u002Fsettings\u002Findex",[948],{"title":944,"path":945,"stem":946},{"title":950,"path":951,"stem":952,"children":953},"Vocabularies","\u002Fdocs\u002Fstudios\u002Fapps\u002Fadmin-ui\u002Fvocabularies","docs\u002Fstudios\u002Fapps\u002Fadmin-ui\u002Fvocabularies\u002Findex",[954],{"title":950,"path":951,"stem":952},{"title":956,"path":957,"stem":958,"children":959,"icon":343},"Your app's API","\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi","docs\u002Fstudios\u002Fapps\u002Fapi\u002Findex",[960,961,966,972,978,984,990,995,1001,1007,1013,1019],{"title":956,"path":957,"stem":958,"icon":343},{"title":623,"path":962,"stem":963,"children":964},"\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi\u002Fcaching","docs\u002Fstudios\u002Fapps\u002Fapi\u002Fcaching\u002Findex",[965],{"title":623,"path":962,"stem":963},{"title":967,"path":968,"stem":969,"children":970},"Calling another app","\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi\u002Fcalling-another-app","docs\u002Fstudios\u002Fapps\u002Fapi\u002Fcalling-another-app\u002Findex",[971],{"title":967,"path":968,"stem":969},{"title":973,"path":974,"stem":975,"children":976},"Capabilities","\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi\u002Fcapabilities","docs\u002Fstudios\u002Fapps\u002Fapi\u002Fcapabilities\u002Findex",[977],{"title":973,"path":974,"stem":975},{"title":979,"path":980,"stem":981,"children":982},"Capability reference","\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi\u002Fcapability-reference","docs\u002Fstudios\u002Fapps\u002Fapi\u002Fcapability-reference\u002Findex",[983],{"title":979,"path":980,"stem":981},{"title":985,"path":986,"stem":987,"children":988},"CRUD","\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi\u002Fcrud","docs\u002Fstudios\u002Fapps\u002Fapi\u002Fcrud\u002Findex",[989],{"title":985,"path":986,"stem":987},{"title":513,"path":991,"stem":992,"children":993},"\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi\u002Ferrors","docs\u002Fstudios\u002Fapps\u002Fapi\u002Ferrors\u002Findex",[994],{"title":513,"path":991,"stem":992},{"title":996,"path":997,"stem":998,"children":999},"Overriding a capability","\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi\u002Foverriding-a-capability","docs\u002Fstudios\u002Fapps\u002Fapi\u002Foverriding-a-capability\u002Findex",[1000],{"title":996,"path":997,"stem":998},{"title":1002,"path":1003,"stem":1004,"children":1005},"Pagination and filtering","\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi\u002Fpagination-and-filtering","docs\u002Fstudios\u002Fapps\u002Fapi\u002Fpagination-and-filtering\u002Findex",[1006],{"title":1002,"path":1003,"stem":1004},{"title":1008,"path":1009,"stem":1010,"children":1011},"Published OpenAPI","\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi\u002Fpublished-openapi","docs\u002Fstudios\u002Fapps\u002Fapi\u002Fpublished-openapi\u002Findex",[1012],{"title":1008,"path":1009,"stem":1010},{"title":1014,"path":1015,"stem":1016,"children":1017},"The router","\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi\u002Frouter","docs\u002Fstudios\u002Fapps\u002Fapi\u002Frouter\u002Findex",[1018],{"title":1014,"path":1015,"stem":1016},{"title":1020,"path":1021,"stem":1022,"children":1023},"Tags","\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi\u002Ftags","docs\u002Fstudios\u002Fapps\u002Fapi\u002Ftags\u002Findex",[1024],{"title":1020,"path":1021,"stem":1022},{"title":1026,"path":1027,"stem":1028,"children":1029,"icon":108},"Data model","\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Findex",[1030,1031,1037,1043,1049,1055,1061,1067,1073,1079,1085,1090],{"title":1026,"path":1027,"stem":1028,"icon":108},{"title":1032,"path":1033,"stem":1034,"children":1035},"Adapters","\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fadapters","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fadapters\u002Findex",[1036],{"title":1032,"path":1033,"stem":1034},{"title":1038,"path":1039,"stem":1040,"children":1041},"Column types","\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fcolumn-types","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fcolumn-types\u002Findex",[1042],{"title":1038,"path":1039,"stem":1040},{"title":1044,"path":1045,"stem":1046,"children":1047},"Cross-app lookups","\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fcross-app-lookups","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fcross-app-lookups\u002Findex",[1048],{"title":1044,"path":1045,"stem":1046},{"title":1050,"path":1051,"stem":1052,"children":1053},"Migrations","\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fmigrations","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fmigrations\u002Findex",[1054],{"title":1050,"path":1051,"stem":1052},{"title":1056,"path":1057,"stem":1058,"children":1059},"Projections","\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fprojections","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fprojections\u002Findex",[1060],{"title":1056,"path":1057,"stem":1058},{"title":1062,"path":1063,"stem":1064,"children":1065},"Relationships","\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model\u002Frelationships","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Frelationships\u002Findex",[1066],{"title":1062,"path":1063,"stem":1064},{"title":1068,"path":1069,"stem":1070,"children":1071},"Schema reference","\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fschema-reference","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fschema-reference\u002Findex",[1072],{"title":1068,"path":1069,"stem":1070},{"title":1074,"path":1075,"stem":1076,"children":1077},"Scoping","\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fscoping","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fscoping\u002Findex",[1078],{"title":1074,"path":1075,"stem":1076},{"title":1080,"path":1081,"stem":1082,"children":1083},"search.json reference","\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fsearch-json","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fsearch-json\u002Findex",[1084],{"title":1080,"path":1081,"stem":1082},{"title":787,"path":1086,"stem":1087,"children":1088},"\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model\u002Ftenant-isolation","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Ftenant-isolation\u002Findex",[1089],{"title":787,"path":1086,"stem":1087},{"title":1091,"path":1092,"stem":1093,"children":1094},"The typed client","\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model\u002Ftyped-client","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Ftyped-client\u002Findex",[1095],{"title":1091,"path":1092,"stem":1093},{"title":1097,"path":1098,"stem":1099,"children":1100},"Getting started","\u002Fdocs\u002Fstudios\u002Fapps\u002Fgetting-started","docs\u002Fstudios\u002Fapps\u002Fgetting-started\u002Findex",[1101,1102,1108],{"title":1097,"path":1098,"stem":1099},{"title":1103,"path":1104,"stem":1105,"children":1106},"App model","\u002Fdocs\u002Fstudios\u002Fapps\u002Fgetting-started\u002Fapp-model","docs\u002Fstudios\u002Fapps\u002Fgetting-started\u002Fapp-model\u002Findex",[1107],{"title":1103,"path":1104,"stem":1105},{"title":1109,"path":1110,"stem":1111,"children":1112},"App isolation","\u002Fdocs\u002Fstudios\u002Fapps\u002Fgetting-started\u002Fisolation","docs\u002Fstudios\u002Fapps\u002Fgetting-started\u002Fisolation\u002Findex",[1113],{"title":1109,"path":1110,"stem":1111},{"title":1115,"path":1116,"stem":1117,"children":1118,"icon":185},"Platform services","\u002Fdocs\u002Fstudios\u002Fapps\u002Fplatform-services","docs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Findex",[1119,1120,1126,1132,1138,1144,1150,1156,1162,1168,1174],{"title":1115,"path":1116,"stem":1117,"icon":185},{"title":1121,"path":1122,"stem":1123,"children":1124},"Entity access","\u002Fdocs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fentity-access","docs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fentity-access\u002Findex",[1125],{"title":1121,"path":1122,"stem":1123},{"title":1127,"path":1128,"stem":1129,"children":1130},"Events you emit","\u002Fdocs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fevents-you-emit","docs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fevents-you-emit\u002Findex",[1131],{"title":1127,"path":1128,"stem":1129},{"title":1133,"path":1134,"stem":1135,"children":1136},"Events you receive","\u002Fdocs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fevents-you-receive","docs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fevents-you-receive\u002Findex",[1137],{"title":1133,"path":1134,"stem":1135},{"title":1139,"path":1140,"stem":1141,"children":1142},"Not yet proven","\u002Fdocs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fnot-yet-proven","docs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fnot-yet-proven\u002Findex",[1143],{"title":1139,"path":1140,"stem":1141},{"title":1145,"path":1146,"stem":1147,"children":1148},"Outbound HTTP","\u002Fdocs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Foutbound-http","docs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Foutbound-http\u002Findex",[1149],{"title":1145,"path":1146,"stem":1147},{"title":1151,"path":1152,"stem":1153,"children":1154},"Permissions","\u002Fdocs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fpermissions","docs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fpermissions\u002Findex",[1155],{"title":1151,"path":1152,"stem":1153},{"title":1157,"path":1158,"stem":1159,"children":1160},"Person permissions","\u002Fdocs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fperson-permissions","docs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fperson-permissions\u002Findex",[1161],{"title":1157,"path":1158,"stem":1159},{"title":1163,"path":1164,"stem":1165,"children":1166},"Scheduled work","\u002Fdocs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fscheduled-work","docs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fscheduled-work\u002Findex",[1167],{"title":1163,"path":1164,"stem":1165},{"title":1169,"path":1170,"stem":1171,"children":1172},"Tenant identity","\u002Fdocs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Ftenant-identity","docs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Ftenant-identity\u002Findex",[1173],{"title":1169,"path":1170,"stem":1171},{"title":1175,"path":1176,"stem":1177,"children":1178},"Tracing","\u002Fdocs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Ftracing","docs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Ftracing\u002Findex",[1179],{"title":1175,"path":1176,"stem":1177},{"title":1181,"path":1182,"stem":1183,"children":1184,"icon":1186},"Ship and operate","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Findex",[1185,1187,1193,1199,1205,1211,1217,1223,1229,1235,1241,1247,1253,1259],{"title":1181,"path":1182,"stem":1183,"icon":1186},"i-lucide-rocket",{"title":1188,"path":1189,"stem":1190,"children":1191},"Billing","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fbilling","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fbilling\u002Findex",[1192],{"title":1188,"path":1189,"stem":1190},{"title":1194,"path":1195,"stem":1196,"children":1197},"Consent","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fconsent","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fconsent\u002Findex",[1198],{"title":1194,"path":1195,"stem":1196},{"title":1200,"path":1201,"stem":1202,"children":1203},"Dependencies","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fdependencies","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fdependencies\u002Findex",[1204],{"title":1200,"path":1201,"stem":1202},{"title":1206,"path":1207,"stem":1208,"children":1209},"Deploying","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fdeploying","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fdeploying\u002Findex",[1210],{"title":1206,"path":1207,"stem":1208},{"title":1212,"path":1213,"stem":1214,"children":1215},"Manifest reference","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fmanifest-reference","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fmanifest-reference\u002Findex",[1216],{"title":1212,"path":1213,"stem":1214},{"title":1218,"path":1219,"stem":1220,"children":1221},"Operating","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Foperating","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Foperating\u002Findex",[1222],{"title":1218,"path":1219,"stem":1220},{"title":1224,"path":1225,"stem":1226,"children":1227},"Pairing a frontend","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fpairing-a-frontend","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fpairing-a-frontend\u002Findex",[1228],{"title":1224,"path":1225,"stem":1226},{"title":1230,"path":1231,"stem":1232,"children":1233},"Private or Marketplace","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fprivate-vs-marketplace","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fprivate-vs-marketplace\u002Findex",[1234],{"title":1230,"path":1231,"stem":1232},{"title":1236,"path":1237,"stem":1238,"children":1239},"Publish and install","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fpublish-and-install","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fpublish-and-install\u002Findex",[1240],{"title":1236,"path":1237,"stem":1238},{"title":1242,"path":1243,"stem":1244,"children":1245},"Testing","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Ftesting","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Ftesting\u002Findex",[1246],{"title":1242,"path":1243,"stem":1244},{"title":1248,"path":1249,"stem":1250,"children":1251},"Validate","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fvalidate","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fvalidate\u002Findex",[1252],{"title":1248,"path":1249,"stem":1250},{"title":1254,"path":1255,"stem":1256,"children":1257},"Verifying live","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fverifying-live","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fverifying-live\u002Findex",[1258],{"title":1254,"path":1255,"stem":1256},{"title":489,"path":1260,"stem":1261,"children":1262},"\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fversioning","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fversioning\u002Findex",[1263],{"title":489,"path":1260,"stem":1261},{"title":1265,"path":1266,"stem":1267,"children":1268,"icon":1270},"Commerce Studio","\u002Fdocs\u002Fstudios\u002Fcommerce","docs\u002Fstudios\u002Fcommerce\u002Findex",[1269,1271,1343,1403,1452,1457,1510,1564],{"title":1265,"path":1266,"stem":1267,"icon":1270},"i-lucide-shopping-bag",{"title":1272,"path":1273,"stem":1274,"children":1275,"icon":1277},"Build an app","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Findex",[1276,1278,1284,1290,1296,1302,1308,1314,1320,1326,1332,1337],{"title":1272,"path":1273,"stem":1274,"icon":1277},"i-lucide-puzzle",{"title":1279,"path":1280,"stem":1281,"children":1282},"Actions and writes","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Factions-and-writes","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Factions-and-writes\u002Findex",[1283],{"title":1279,"path":1280,"stem":1281},{"title":1285,"path":1286,"stem":1287,"children":1288},"cockpit.json reference","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fcockpit-json-reference","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fcockpit-json-reference\u002Findex",[1289],{"title":1285,"path":1286,"stem":1287},{"title":1291,"path":1292,"stem":1293,"children":1294},"Detail views","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fdetail-views","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fdetail-views\u002Findex",[1295],{"title":1291,"path":1292,"stem":1293},{"title":1297,"path":1298,"stem":1299,"children":1300},"Forms","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fforms","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fforms\u002Findex",[1301],{"title":1297,"path":1298,"stem":1299},{"title":1303,"path":1304,"stem":1305,"children":1306},"From manifest to installed","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Ffrom-manifest-to-installed","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Ffrom-manifest-to-installed\u002Findex",[1307],{"title":1303,"path":1304,"stem":1305},{"title":1309,"path":1310,"stem":1311,"children":1312},"How it renders","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fhow-it-renders","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fhow-it-renders\u002Findex",[1313],{"title":1309,"path":1310,"stem":1311},{"title":1315,"path":1316,"stem":1317,"children":1318},"List views","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Flist-views","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Flist-views\u002Findex",[1319],{"title":1315,"path":1316,"stem":1317},{"title":1321,"path":1322,"stem":1323,"children":1324},"Navigation","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fnavigation","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fnavigation\u002Findex",[1325],{"title":1321,"path":1322,"stem":1323},{"title":1327,"path":1328,"stem":1329,"children":1330},"Permissions and scope","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fpermissions-and-scope","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fpermissions-and-scope\u002Findex",[1331],{"title":1327,"path":1328,"stem":1329},{"title":932,"path":1333,"stem":1334,"children":1335},"\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fpreview-locally","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fpreview-locally\u002Findex",[1336],{"title":932,"path":1333,"stem":1334},{"title":1338,"path":1339,"stem":1340,"children":1341},"Widgets","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fwidgets","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fwidgets\u002Findex",[1342],{"title":1338,"path":1339,"stem":1340},{"title":1344,"path":1345,"stem":1346,"children":1347,"icon":1349},"Catalog","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcatalog","docs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Findex",[1348,1350,1356,1362,1368,1374,1379,1385,1391,1397],{"title":1344,"path":1345,"stem":1346,"icon":1349},"i-lucide-package",{"title":1351,"path":1352,"stem":1353,"children":1354},"Assets","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fassets","docs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fassets\u002Findex",[1355],{"title":1351,"path":1352,"stem":1353},{"title":1357,"path":1358,"stem":1359,"children":1360},"Associations","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fassociations","docs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fassociations\u002Findex",[1361],{"title":1357,"path":1358,"stem":1359},{"title":1363,"path":1364,"stem":1365,"children":1366},"Categories","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fcategories","docs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fcategories\u002Findex",[1367],{"title":1363,"path":1364,"stem":1365},{"title":1369,"path":1370,"stem":1371,"children":1372},"Completeness","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fcompleteness","docs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fcompleteness\u002Findex",[1373],{"title":1369,"path":1370,"stem":1371},{"title":1026,"path":1375,"stem":1376,"children":1377},"\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fdata-model","docs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fdata-model\u002Findex",[1378],{"title":1026,"path":1375,"stem":1376},{"title":1380,"path":1381,"stem":1382,"children":1383},"Import and export","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fimport-and-export","docs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fimport-and-export\u002Findex",[1384],{"title":1380,"path":1381,"stem":1382},{"title":1386,"path":1387,"stem":1388,"children":1389},"Languages and locale codes","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Flanguages-and-locale-codes","docs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Flanguages-and-locale-codes\u002Findex",[1390],{"title":1386,"path":1387,"stem":1388},{"title":1392,"path":1393,"stem":1394,"children":1395},"Products","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fproducts","docs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fproducts\u002Findex",[1396],{"title":1392,"path":1393,"stem":1394},{"title":1398,"path":1399,"stem":1400,"children":1401},"References","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Freferences","docs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Freferences\u002Findex",[1402],{"title":1398,"path":1399,"stem":1400},{"title":1404,"path":1405,"stem":1406,"children":1407,"icon":1409},"Customers","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcustomers","docs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Findex",[1408,1410,1416,1422,1428,1434,1440,1446],{"title":1404,"path":1405,"stem":1406,"icon":1409},"i-lucide-building-2",{"title":1411,"path":1412,"stem":1413,"children":1414},"Contacts","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Fcontacts","docs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Fcontacts\u002Findex",[1415],{"title":1411,"path":1412,"stem":1413},{"title":1417,"path":1418,"stem":1419,"children":1420},"Organizations","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Forganizations","docs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Forganizations\u002Findex",[1421],{"title":1417,"path":1418,"stem":1419},{"title":1423,"path":1424,"stem":1425,"children":1426},"Roles and permissions","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Froles-and-permissions","docs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Froles-and-permissions\u002Findex",[1427],{"title":1423,"path":1424,"stem":1425},{"title":1429,"path":1430,"stem":1431,"children":1432},"Sales reps","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Fsales-reps","docs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Fsales-reps\u002Findex",[1433],{"title":1429,"path":1430,"stem":1431},{"title":1435,"path":1436,"stem":1437,"children":1438},"Segments","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Fsegments","docs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Fsegments\u002Findex",[1439],{"title":1435,"path":1436,"stem":1437},{"title":1441,"path":1442,"stem":1443,"children":1444},"Storefront accounts","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Fstorefront-accounts","docs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Fstorefront-accounts\u002Findex",[1445],{"title":1441,"path":1442,"stem":1443},{"title":1447,"path":1448,"stem":1449,"children":1450},"Value lists","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Fvalue-lists","docs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Fvalue-lists\u002Findex",[1451],{"title":1447,"path":1448,"stem":1449},{"title":1097,"path":1453,"stem":1454,"children":1455,"icon":1186},"\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fgetting-started","docs\u002Fstudios\u002Fcommerce\u002Fgetting-started\u002Findex",[1456],{"title":1097,"path":1453,"stem":1454,"icon":1186},{"title":1458,"path":1459,"stem":1460,"children":1461,"icon":615},"Markets and pricing","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing","docs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Findex",[1462,1463,1469,1475,1481,1487,1493,1499,1504],{"title":1458,"path":1459,"stem":1460,"icon":615},{"title":1464,"path":1465,"stem":1466,"children":1467},"Carriers and tracking","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fcarriers-and-tracking","docs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fcarriers-and-tracking\u002Findex",[1468],{"title":1464,"path":1465,"stem":1466},{"title":1470,"path":1471,"stem":1472,"children":1473},"Channels","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fchannels","docs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fchannels\u002Findex",[1474],{"title":1470,"path":1471,"stem":1472},{"title":1476,"path":1477,"stem":1478,"children":1479},"Markets","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fmarkets","docs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fmarkets\u002Findex",[1480],{"title":1476,"path":1477,"stem":1478},{"title":1482,"path":1483,"stem":1484,"children":1485},"Payment lifecycle","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fpayment-lifecycle","docs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fpayment-lifecycle\u002Findex",[1486],{"title":1482,"path":1483,"stem":1484},{"title":1488,"path":1489,"stem":1490,"children":1491},"Payment methods","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fpayment-methods","docs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fpayment-methods\u002Findex",[1492],{"title":1488,"path":1489,"stem":1490},{"title":1494,"path":1495,"stem":1496,"children":1497},"Price lists","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fprice-lists","docs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fprice-lists\u002Findex",[1498],{"title":1494,"path":1495,"stem":1496},{"title":944,"path":1500,"stem":1501,"children":1502},"\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fsettings","docs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fsettings\u002Findex",[1503],{"title":944,"path":1500,"stem":1501},{"title":1505,"path":1506,"stem":1507,"children":1508},"Shipping rates","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fshipping-rates","docs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fshipping-rates\u002Findex",[1509],{"title":1505,"path":1506,"stem":1507},{"title":1511,"path":1512,"stem":1513,"children":1514,"icon":1516},"Orders","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Forders","docs\u002Fstudios\u002Fcommerce\u002Forders\u002Findex",[1515,1517,1523,1529,1535,1541,1547,1552,1558],{"title":1511,"path":1512,"stem":1513,"icon":1516},"i-lucide-receipt-text",{"title":1518,"path":1519,"stem":1520,"children":1521},"Carts","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Forders\u002Fcarts","docs\u002Fstudios\u002Fcommerce\u002Forders\u002Fcarts\u002Findex",[1522],{"title":1518,"path":1519,"stem":1520},{"title":1524,"path":1525,"stem":1526,"children":1527},"Documents","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Forders\u002Fdocuments","docs\u002Fstudios\u002Fcommerce\u002Forders\u002Fdocuments\u002Findex",[1528],{"title":1524,"path":1525,"stem":1526},{"title":1530,"path":1531,"stem":1532,"children":1533},"Events and comments","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Forders\u002Fevents-and-comments","docs\u002Fstudios\u002Fcommerce\u002Forders\u002Fevents-and-comments\u002Findex",[1534],{"title":1530,"path":1531,"stem":1532},{"title":1536,"path":1537,"stem":1538,"children":1539},"Number ranges","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Forders\u002Fnumber-ranges","docs\u002Fstudios\u002Fcommerce\u002Forders\u002Fnumber-ranges\u002Findex",[1540],{"title":1536,"path":1537,"stem":1538},{"title":1542,"path":1543,"stem":1544,"children":1545},"Order lists","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Forders\u002Forder-lists","docs\u002Fstudios\u002Fcommerce\u002Forders\u002Forder-lists\u002Findex",[1546],{"title":1542,"path":1543,"stem":1544},{"title":1511,"path":1548,"stem":1549,"children":1550},"\u002Fdocs\u002Fstudios\u002Fcommerce\u002Forders\u002Forders","docs\u002Fstudios\u002Fcommerce\u002Forders\u002Forders\u002Findex",[1551],{"title":1511,"path":1548,"stem":1549},{"title":1553,"path":1554,"stem":1555,"children":1556},"Returns","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Forders\u002Freturns","docs\u002Fstudios\u002Fcommerce\u002Forders\u002Freturns\u002Findex",[1557],{"title":1553,"path":1554,"stem":1555},{"title":1559,"path":1560,"stem":1561,"children":1562},"Stock","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Forders\u002Fstock","docs\u002Fstudios\u002Fcommerce\u002Forders\u002Fstock\u002Findex",[1563],{"title":1559,"path":1560,"stem":1561},{"title":1565,"path":1566,"stem":1567,"children":1568,"icon":1570},"Procurement","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fprocurement","docs\u002Fstudios\u002Fcommerce\u002Fprocurement\u002Findex",[1569,1571,1577],{"title":1565,"path":1566,"stem":1567,"icon":1570},"i-lucide-clipboard-check",{"title":1572,"path":1573,"stem":1574,"children":1575},"Cost centers","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fprocurement\u002Fcost-centers","docs\u002Fstudios\u002Fcommerce\u002Fprocurement\u002Fcost-centers\u002Findex",[1576],{"title":1572,"path":1573,"stem":1574},{"title":1578,"path":1579,"stem":1580,"children":1581,"icon":29},"Punchout","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fprocurement\u002Fpunchout","docs\u002Fstudios\u002Fcommerce\u002Fprocurement\u002Fpunchout\u002Findex",[1582],{"title":1578,"path":1579,"stem":1580,"icon":29},{"title":1584,"path":1585,"stem":1586,"children":1587},"Integration Studio","\u002Fdocs\u002Fstudios\u002Fintegration-studio","docs\u002Fstudios\u002Fintegration-studio\u002Findex",[1588,1589,1626,1663,1693,1698,1728],{"title":1584,"path":1585,"stem":1586},{"title":1590,"path":1591,"stem":1592,"children":1593,"icon":1595},"Build the workflow","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fbuild","docs\u002Fstudios\u002Fintegration-studio\u002Fbuild\u002Findex",[1594,1596,1602,1608,1614,1620],{"title":1590,"path":1591,"stem":1592,"icon":1595},"i-lucide-workflow",{"title":1597,"path":1598,"stem":1599,"children":1600},"Expressions","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fbuild\u002Fexpressions","docs\u002Fstudios\u002Fintegration-studio\u002Fbuild\u002Fexpressions\u002Findex",[1601],{"title":1597,"path":1598,"stem":1599},{"title":1603,"path":1604,"stem":1605,"children":1606},"Node catalog","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fbuild\u002Fnode-catalog","docs\u002Fstudios\u002Fintegration-studio\u002Fbuild\u002Fnode-catalog\u002Findex",[1607],{"title":1603,"path":1604,"stem":1605},{"title":1609,"path":1610,"stem":1611,"children":1612},"Node configuration","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fbuild\u002Fnode-configuration","docs\u002Fstudios\u002Fintegration-studio\u002Fbuild\u002Fnode-configuration\u002Findex",[1613],{"title":1609,"path":1610,"stem":1611},{"title":1615,"path":1616,"stem":1617,"children":1618},"Templates","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fbuild\u002Ftemplates","docs\u002Fstudios\u002Fintegration-studio\u002Fbuild\u002Ftemplates\u002Findex",[1619],{"title":1615,"path":1616,"stem":1617},{"title":1621,"path":1622,"stem":1623,"children":1624},"The workflow document","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fbuild\u002Fworkflow-model","docs\u002Fstudios\u002Fintegration-studio\u002Fbuild\u002Fworkflow-model\u002Findex",[1625],{"title":1621,"path":1622,"stem":1623},{"title":1627,"path":1628,"stem":1629,"children":1630,"icon":1632},"Connect the systems","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fconnect","docs\u002Fstudios\u002Fintegration-studio\u002Fconnect\u002Findex",[1631,1633,1639,1645,1651,1657],{"title":1627,"path":1628,"stem":1629,"icon":1632},"i-lucide-key-round",{"title":1634,"path":1635,"stem":1636,"children":1637},"Credentials","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fconnect\u002Fcredentials","docs\u002Fstudios\u002Fintegration-studio\u002Fconnect\u002Fcredentials\u002Findex",[1638],{"title":1634,"path":1635,"stem":1636},{"title":1640,"path":1641,"stem":1642,"children":1643},"File transfer","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fconnect\u002Ffiles","docs\u002Fstudios\u002Fintegration-studio\u002Fconnect\u002Ffiles\u002Findex",[1644],{"title":1640,"path":1641,"stem":1642},{"title":1646,"path":1647,"stem":1648,"children":1649},"OAuth","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fconnect\u002Foauth","docs\u002Fstudios\u002Fintegration-studio\u002Fconnect\u002Foauth\u002Findex",[1650],{"title":1646,"path":1647,"stem":1648},{"title":1652,"path":1653,"stem":1654,"children":1655},"Reaching Revenue Cloud","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fconnect\u002Freaching-revenue-cloud","docs\u002Fstudios\u002Fintegration-studio\u002Fconnect\u002Freaching-revenue-cloud\u002Findex",[1656],{"title":1652,"path":1653,"stem":1654},{"title":1658,"path":1659,"stem":1660,"children":1661},"Secrets","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fconnect\u002Fsecrets","docs\u002Fstudios\u002Fintegration-studio\u002Fconnect\u002Fsecrets\u002Findex",[1662],{"title":1658,"path":1659,"stem":1660},{"title":1664,"path":1665,"stem":1666,"children":1667,"icon":1349},"Extend the Studio","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fextend","docs\u002Fstudios\u002Fintegration-studio\u002Fextend\u002Findex",[1668,1669,1675,1681,1687],{"title":1664,"path":1665,"stem":1666,"icon":1349},{"title":1670,"path":1671,"stem":1672,"children":1673},"Custom nodes","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fextend\u002Fcustom-nodes","docs\u002Fstudios\u002Fintegration-studio\u002Fextend\u002Fcustom-nodes\u002Findex",[1674],{"title":1670,"path":1671,"stem":1672},{"title":1676,"path":1677,"stem":1678,"children":1679},"Dynamic behaviour","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fextend\u002Fdynamic-behaviour","docs\u002Fstudios\u002Fintegration-studio\u002Fextend\u002Fdynamic-behaviour\u002Findex",[1680],{"title":1676,"path":1677,"stem":1678},{"title":1682,"path":1683,"stem":1684,"children":1685},"Package manifest","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fextend\u002Fpackage-manifest","docs\u002Fstudios\u002Fintegration-studio\u002Fextend\u002Fpackage-manifest\u002Findex",[1686],{"title":1682,"path":1683,"stem":1684},{"title":1688,"path":1689,"stem":1690,"children":1691},"Registration","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fextend\u002Fregistration","docs\u002Fstudios\u002Fintegration-studio\u002Fextend\u002Fregistration\u002Findex",[1692],{"title":1688,"path":1689,"stem":1690},{"title":1097,"path":1694,"stem":1695,"children":1696,"icon":1186},"\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fgetting-started","docs\u002Fstudios\u002Fintegration-studio\u002Fgetting-started\u002Findex",[1697],{"title":1097,"path":1694,"stem":1695,"icon":1186},{"title":1699,"path":1700,"stem":1701,"children":1702,"icon":316},"Run, watch, recover","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Foperate","docs\u002Fstudios\u002Fintegration-studio\u002Foperate\u002Findex",[1703,1704,1710,1716,1722],{"title":1699,"path":1700,"stem":1701,"icon":316},{"title":1705,"path":1706,"stem":1707,"children":1708},"Missed runs","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Foperate\u002Fdead-letters","docs\u002Fstudios\u002Fintegration-studio\u002Foperate\u002Fdead-letters\u002Findex",[1709],{"title":1705,"path":1706,"stem":1707},{"title":1711,"path":1712,"stem":1713,"children":1714},"Failure handling","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Foperate\u002Ffailure-handling","docs\u002Fstudios\u002Fintegration-studio\u002Foperate\u002Ffailure-handling\u002Findex",[1715],{"title":1711,"path":1712,"stem":1713},{"title":1717,"path":1718,"stem":1719,"children":1720},"Revisions and audit","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Foperate\u002Frevisions-and-audit","docs\u002Fstudios\u002Fintegration-studio\u002Foperate\u002Frevisions-and-audit\u002Findex",[1721],{"title":1717,"path":1718,"stem":1719},{"title":1723,"path":1724,"stem":1725,"children":1726},"Runs","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Foperate\u002Fruns","docs\u002Fstudios\u002Fintegration-studio\u002Foperate\u002Fruns\u002Findex",[1727],{"title":1723,"path":1724,"stem":1725},{"title":1729,"path":1730,"stem":1731,"children":1732,"icon":1734},"Start the workflow","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fstart","docs\u002Fstudios\u002Fintegration-studio\u002Fstart\u002Findex",[1733,1735,1741,1747,1753,1759],{"title":1729,"path":1730,"stem":1731,"icon":1734},"i-lucide-zap",{"title":1736,"path":1737,"stem":1738,"children":1739},"Event triggers","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fstart\u002Fevent-triggers","docs\u002Fstudios\u002Fintegration-studio\u002Fstart\u002Fevent-triggers\u002Findex",[1740],{"title":1736,"path":1737,"stem":1738},{"title":1742,"path":1743,"stem":1744,"children":1745},"Execution modes","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fstart\u002Fexecution-modes","docs\u002Fstudios\u002Fintegration-studio\u002Fstart\u002Fexecution-modes\u002Findex",[1746],{"title":1742,"path":1743,"stem":1744},{"title":1748,"path":1749,"stem":1750,"children":1751},"Schedule triggers","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fstart\u002Fschedule-triggers","docs\u002Fstudios\u002Fintegration-studio\u002Fstart\u002Fschedule-triggers\u002Findex",[1752],{"title":1748,"path":1749,"stem":1750},{"title":1754,"path":1755,"stem":1756,"children":1757},"Triggers","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fstart\u002Ftriggers","docs\u002Fstudios\u002Fintegration-studio\u002Fstart\u002Ftriggers\u002Findex",[1758],{"title":1754,"path":1755,"stem":1756},{"title":1760,"path":1761,"stem":1762,"children":1763},"Webhook triggers","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fstart\u002Fwebhook-triggers","docs\u002Fstudios\u002Fintegration-studio\u002Fstart\u002Fwebhook-triggers\u002Findex",[1764],{"title":1760,"path":1761,"stem":1762},{"title":1766,"path":1767,"stem":1768,"children":1769},"Experience Studio","\u002Fdocs\u002Fstudios\u002Fsites","docs\u002Fstudios\u002Fsites\u002Findex",[1770,1771,1819,1871,1997,2003,2045],{"title":1766,"path":1767,"stem":1768},{"title":1772,"path":1773,"stem":1774,"children":1775,"icon":418},"Compose pages","\u002Fdocs\u002Fstudios\u002Fsites\u002Fblocks","docs\u002Fstudios\u002Fsites\u002Fblocks\u002Findex",[1776,1777,1783,1789,1795,1801,1807,1813],{"title":1772,"path":1773,"stem":1774,"icon":418},{"title":1778,"path":1779,"stem":1780,"children":1781},"Block catalog","\u002Fdocs\u002Fstudios\u002Fsites\u002Fblocks\u002Fblock-catalog","docs\u002Fstudios\u002Fsites\u002Fblocks\u002Fblock-catalog\u002Findex",[1782],{"title":1778,"path":1779,"stem":1780},{"title":1784,"path":1785,"stem":1786,"children":1787},"Block options","\u002Fdocs\u002Fstudios\u002Fsites\u002Fblocks\u002Fblock-options","docs\u002Fstudios\u002Fsites\u002Fblocks\u002Fblock-options\u002Findex",[1788],{"title":1784,"path":1785,"stem":1786},{"title":1790,"path":1791,"stem":1792,"children":1793},"How a block works","\u002Fdocs\u002Fstudios\u002Fsites\u002Fblocks\u002Fhow-a-block-works","docs\u002Fstudios\u002Fsites\u002Fblocks\u002Fhow-a-block-works\u002Findex",[1794],{"title":1790,"path":1791,"stem":1792},{"title":1796,"path":1797,"stem":1798,"children":1799},"Inline editing","\u002Fdocs\u002Fstudios\u002Fsites\u002Fblocks\u002Finline-editing","docs\u002Fstudios\u002Fsites\u002Fblocks\u002Finline-editing\u002Findex",[1800],{"title":1796,"path":1797,"stem":1798},{"title":1802,"path":1803,"stem":1804,"children":1805},"Reading published pages","\u002Fdocs\u002Fstudios\u002Fsites\u002Fblocks\u002Freading-pages","docs\u002Fstudios\u002Fsites\u002Fblocks\u002Freading-pages\u002Findex",[1806],{"title":1802,"path":1803,"stem":1804},{"title":1808,"path":1809,"stem":1810,"children":1811},"Registering blocks","\u002Fdocs\u002Fstudios\u002Fsites\u002Fblocks\u002Fregistering","docs\u002Fstudios\u002Fsites\u002Fblocks\u002Fregistering\u002Findex",[1812],{"title":1808,"path":1809,"stem":1810},{"title":1814,"path":1815,"stem":1816,"children":1817},"Shells and fields","\u002Fdocs\u002Fstudios\u002Fsites\u002Fblocks\u002Fshells-and-fields","docs\u002Fstudios\u002Fsites\u002Fblocks\u002Fshells-and-fields\u002Findex",[1818],{"title":1814,"path":1815,"stem":1816},{"title":1820,"path":1821,"stem":1822,"children":1823,"icon":262},"Connect data","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdata","docs\u002Fstudios\u002Fsites\u002Fdata\u002Findex",[1824,1825,1830,1836,1842,1847,1853,1859,1865],{"title":1820,"path":1821,"stem":1822,"icon":262},{"title":550,"path":1826,"stem":1827,"children":1828},"\u002Fdocs\u002Fstudios\u002Fsites\u002Fdata\u002Fauthentication","docs\u002Fstudios\u002Fsites\u002Fdata\u002Fauthentication\u002Findex",[1829],{"title":550,"path":1826,"stem":1827},{"title":1831,"path":1832,"stem":1833,"children":1834},"The BFF pattern","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdata\u002Fbff-pattern","docs\u002Fstudios\u002Fsites\u002Fdata\u002Fbff-pattern\u002Findex",[1835],{"title":1831,"path":1832,"stem":1833},{"title":1837,"path":1838,"stem":1839,"children":1840},"Catalog, cart, checkout","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdata\u002Fcatalog-cart-checkout","docs\u002Fstudios\u002Fsites\u002Fdata\u002Fcatalog-cart-checkout\u002Findex",[1841],{"title":1837,"path":1838,"stem":1839},{"title":1297,"path":1843,"stem":1844,"children":1845},"\u002Fdocs\u002Fstudios\u002Fsites\u002Fdata\u002Fforms","docs\u002Fstudios\u002Fsites\u002Fdata\u002Fforms\u002Findex",[1846],{"title":1297,"path":1843,"stem":1844},{"title":1848,"path":1849,"stem":1850,"children":1851},"Media and assets","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdata\u002Fmedia","docs\u002Fstudios\u002Fsites\u002Fdata\u002Fmedia\u002Findex",[1852],{"title":1848,"path":1849,"stem":1850},{"title":1854,"path":1855,"stem":1856,"children":1857},"Multi-tenant themes","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdata\u002Fmulti-tenant-themes","docs\u002Fstudios\u002Fsites\u002Fdata\u002Fmulti-tenant-themes\u002Findex",[1858],{"title":1854,"path":1855,"stem":1856},{"title":1860,"path":1861,"stem":1862,"children":1863},"Search collections","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdata\u002Fsearch-collections","docs\u002Fstudios\u002Fsites\u002Fdata\u002Fsearch-collections\u002Findex",[1864],{"title":1860,"path":1861,"stem":1862},{"title":1866,"path":1867,"stem":1868,"children":1869},"Search","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdata\u002Fsearch","docs\u002Fstudios\u002Fsites\u002Fdata\u002Fsearch\u002Findex",[1870],{"title":1866,"path":1867,"stem":1868},{"title":1872,"path":1873,"stem":1874,"children":1875,"icon":1186},"Build and deploy","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Findex",[1876,1877,1883,1889,1895,1901,1907,1913,1991],{"title":1872,"path":1873,"stem":1874,"icon":1186},{"title":1878,"path":1879,"stem":1880,"children":1881},"Build configuration","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fbuild-configuration","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fbuild-configuration\u002Findex",[1882],{"title":1878,"path":1879,"stem":1880},{"title":1884,"path":1885,"stem":1886,"children":1887},"Compute specifications","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fcompute-specifications","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fcompute-specifications\u002Findex",[1888],{"title":1884,"path":1885,"stem":1886},{"title":1890,"path":1891,"stem":1892,"children":1893},"Environment variables","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fenvironment-variables","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fenvironment-variables\u002Findex",[1894],{"title":1890,"path":1891,"stem":1892},{"title":1896,"path":1897,"stem":1898,"children":1899},"From Git","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Ffrom-git","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Ffrom-git\u002Findex",[1900],{"title":1896,"path":1897,"stem":1898},{"title":1902,"path":1903,"stem":1904,"children":1905},"From the CLI","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Ffrom-the-cli","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Ffrom-the-cli\u002Findex",[1906],{"title":1902,"path":1903,"stem":1904},{"title":1908,"path":1909,"stem":1910,"children":1911},"Manually","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fmanually","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fmanually\u002Findex",[1912],{"title":1908,"path":1909,"stem":1910},{"title":1914,"path":1915,"stem":1916,"children":1917},"Quick-starts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Findex",[1918,1919,1925,1931,1937,1943,1949,1955,1961,1967,1973,1979,1985],{"title":1914,"path":1915,"stem":1916},{"title":1920,"path":1921,"stem":1922,"children":1923},"Deploy an Angular app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fangular","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fangular\u002Findex",[1924],{"title":1920,"path":1921,"stem":1922},{"title":1926,"path":1927,"stem":1928,"children":1929},"Deploy a Astro app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fastro","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fastro\u002Findex",[1930],{"title":1926,"path":1927,"stem":1928},{"title":1932,"path":1933,"stem":1934,"children":1935},"Deploy a Flutter Web app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fflutter","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fflutter\u002Findex",[1936],{"title":1932,"path":1933,"stem":1934},{"title":1938,"path":1939,"stem":1940,"children":1941},"Deploy a Next.js app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fnextjs","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fnextjs\u002Findex",[1942],{"title":1938,"path":1939,"stem":1940},{"title":1944,"path":1945,"stem":1946,"children":1947},"Deploy a Nuxt app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fnuxt","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fnuxt\u002Findex",[1948],{"title":1944,"path":1945,"stem":1946},{"title":1950,"path":1951,"stem":1952,"children":1953},"Deploy a React Native app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Freact-native","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Freact-native\u002Findex",[1954],{"title":1950,"path":1951,"stem":1952},{"title":1956,"path":1957,"stem":1958,"children":1959},"Deploy a React app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Freact","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Freact\u002Findex",[1960],{"title":1956,"path":1957,"stem":1958},{"title":1962,"path":1963,"stem":1964,"children":1965},"Deploy a Remix app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fremix","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fremix\u002Findex",[1966],{"title":1962,"path":1963,"stem":1964},{"title":1968,"path":1969,"stem":1970,"children":1971},"Deploy a SvelteKit app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fsveltekit","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fsveltekit\u002Findex",[1972],{"title":1968,"path":1969,"stem":1970},{"title":1974,"path":1975,"stem":1976,"children":1977},"Deploy a TanStack Start app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Ftanstack-start","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Ftanstack-start\u002Findex",[1978],{"title":1974,"path":1975,"stem":1976},{"title":1980,"path":1981,"stem":1982,"children":1983},"Deploy a Vanilla JS app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fvanilla","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fvanilla\u002Findex",[1984],{"title":1980,"path":1981,"stem":1982},{"title":1986,"path":1987,"stem":1988,"children":1989},"Deploy a Vue.js app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fvue","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fvue\u002Findex",[1990],{"title":1986,"path":1987,"stem":1988},{"title":1992,"path":1993,"stem":1994,"children":1995},"Starting points","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fstarting-points","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fstarting-points\u002Findex",[1996],{"title":1992,"path":1993,"stem":1994},{"title":1097,"path":1998,"stem":1999,"children":2000,"icon":2002},"\u002Fdocs\u002Fstudios\u002Fsites\u002Fgetting-started","docs\u002Fstudios\u002Fsites\u002Fgetting-started\u002Findex",[2001],{"title":1097,"path":1998,"stem":1999,"icon":2002},"i-lucide-terminal",{"title":2004,"path":2005,"stem":2006,"children":2007,"icon":615},"Production","\u002Fdocs\u002Fstudios\u002Fsites\u002Fproduction","docs\u002Fstudios\u002Fsites\u002Fproduction\u002Findex",[2008,2009,2015,2021,2027,2033,2039],{"title":2004,"path":2005,"stem":2006,"icon":615},{"title":2010,"path":2011,"stem":2012,"children":2013},"Deployments","\u002Fdocs\u002Fstudios\u002Fsites\u002Fproduction\u002Fdeployments","docs\u002Fstudios\u002Fsites\u002Fproduction\u002Fdeployments\u002Findex",[2014],{"title":2010,"path":2011,"stem":2012},{"title":2016,"path":2017,"stem":2018,"children":2019},"Domains","\u002Fdocs\u002Fstudios\u002Fsites\u002Fproduction\u002Fdomains","docs\u002Fstudios\u002Fsites\u002Fproduction\u002Fdomains\u002Findex",[2020],{"title":2016,"path":2017,"stem":2018},{"title":2022,"path":2023,"stem":2024,"children":2025},"Instant rollbacks","\u002Fdocs\u002Fstudios\u002Fsites\u002Fproduction\u002Finstant-rollbacks","docs\u002Fstudios\u002Fsites\u002Fproduction\u002Finstant-rollbacks\u002Findex",[2026],{"title":2022,"path":2023,"stem":2024},{"title":2028,"path":2029,"stem":2030,"children":2031},"Logs","\u002Fdocs\u002Fstudios\u002Fsites\u002Fproduction\u002Flogs","docs\u002Fstudios\u002Fsites\u002Fproduction\u002Flogs\u002Findex",[2032],{"title":2028,"path":2029,"stem":2030},{"title":2034,"path":2035,"stem":2036,"children":2037},"Previews","\u002Fdocs\u002Fstudios\u002Fsites\u002Fproduction\u002Fpreviews","docs\u002Fstudios\u002Fsites\u002Fproduction\u002Fpreviews\u002Findex",[2038],{"title":2034,"path":2035,"stem":2036},{"title":2040,"path":2041,"stem":2042,"children":2043},"Publishing a theme","\u002Fdocs\u002Fstudios\u002Fsites\u002Fproduction\u002Fpublishing-a-theme","docs\u002Fstudios\u002Fsites\u002Fproduction\u002Fpublishing-a-theme\u002Findex",[2044],{"title":2040,"path":2041,"stem":2042},{"title":2046,"path":2047,"stem":2048,"children":2049,"icon":404},"Build the theme","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Findex",[2050,2051,2057,2063,2069,2075,2081,2087,2093,2111],{"title":2046,"path":2047,"stem":2048,"icon":404},{"title":2052,"path":2053,"stem":2054,"children":2055},"Theme anatomy","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme\u002Fanatomy","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Fanatomy\u002Findex",[2056],{"title":2052,"path":2053,"stem":2054},{"title":2058,"path":2059,"stem":2060,"children":2061},"Design tokens","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme\u002Fdesign-tokens","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Fdesign-tokens\u002Findex",[2062],{"title":2058,"path":2059,"stem":2060},{"title":2064,"path":2065,"stem":2066,"children":2067},"Frameworks","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme\u002Fframeworks","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Fframeworks\u002Findex",[2068],{"title":2064,"path":2065,"stem":2066},{"title":2070,"path":2071,"stem":2072,"children":2073},"The layer chain","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme\u002Flayer-chain","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Flayer-chain\u002Findex",[2074],{"title":2070,"path":2071,"stem":2072},{"title":2076,"path":2077,"stem":2078,"children":2079},"Local development","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme\u002Flocal-development","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Flocal-development\u002Findex",[2080],{"title":2076,"path":2077,"stem":2078},{"title":2082,"path":2083,"stem":2084,"children":2085},"Modules and plugins","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme\u002Fmodules-and-plugins","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Fmodules-and-plugins\u002Findex",[2086],{"title":2082,"path":2083,"stem":2084},{"title":2088,"path":2089,"stem":2090,"children":2091},"Overriding","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme\u002Foverriding","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Foverriding\u002Findex",[2092],{"title":2088,"path":2089,"stem":2090},{"title":2094,"path":2095,"stem":2096,"children":2097},"Rendering","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme\u002Frendering","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Frendering\u002Findex",[2098,2099,2105],{"title":2094,"path":2095,"stem":2096},{"title":2100,"path":2101,"stem":2102,"children":2103},"SSR","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme\u002Frendering\u002Fssr","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Frendering\u002Fssr\u002Findex",[2104],{"title":2100,"path":2101,"stem":2102},{"title":2106,"path":2107,"stem":2108,"children":2109},"Static","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme\u002Frendering\u002Fstatic","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Frendering\u002Fstatic\u002Findex",[2110],{"title":2106,"path":2107,"stem":2108},{"title":2112,"path":2113,"stem":2114,"children":2115},"Service modes","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme\u002Fservice-modes","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Fservice-modes\u002Findex",[2116],{"title":2112,"path":2113,"stem":2114},{"title":2118,"path":2119,"stem":2120,"children":2121},"Tools","\u002Fdocs\u002Ftools","docs\u002Ftools\u002Findex",[2122,2123,2130,2345],{"title":2118,"path":2119,"stem":2120},{"title":2124,"path":2125,"stem":2126,"children":2127,"icon":2129},"AI agents","\u002Fdocs\u002Ftools\u002Fai-agents","docs\u002Ftools\u002Fai-agents\u002Findex",[2128],{"title":2124,"path":2125,"stem":2126,"icon":2129},"i-lucide-shield-alert",{"title":2131,"path":2132,"stem":2133,"children":2134},"Command line","\u002Fdocs\u002Ftools\u002Fcommand-line","docs\u002Ftools\u002Fcommand-line\u002Findex",[2135,2136,2142,2147,2153,2159,2165,2171,2177,2183,2303,2309,2315,2321,2327,2333,2339],{"title":2131,"path":2132,"stem":2133},{"title":2137,"path":2138,"stem":2139,"children":2140},"Aliases","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Faliases","docs\u002Ftools\u002Fcommand-line\u002Faliases\u002Findex",[2141],{"title":2137,"path":2138,"stem":2139},{"title":550,"path":2143,"stem":2144,"children":2145},"\u002Fdocs\u002Ftools\u002Fcommand-line\u002Fauthentication","docs\u002Ftools\u002Fcommand-line\u002Fauthentication\u002Findex",[2146],{"title":550,"path":2143,"stem":2144},{"title":2148,"path":2149,"stem":2150,"children":2151},"Commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Fcommands","docs\u002Ftools\u002Fcommand-line\u002Fcommands\u002Findex",[2152],{"title":2148,"path":2149,"stem":2150},{"title":2154,"path":2155,"stem":2156,"children":2157},"Global commands reference","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Fglobal-commands","docs\u002Ftools\u002Fcommand-line\u002Fglobal-commands\u002Findex",[2158],{"title":2154,"path":2155,"stem":2156},{"title":2160,"path":2161,"stem":2162,"children":2163},"Installation","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Finstallation","docs\u002Ftools\u002Fcommand-line\u002Finstallation\u002Findex",[2164],{"title":2160,"path":2161,"stem":2162},{"title":2166,"path":2167,"stem":2168,"children":2169},"Interactive use","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Finteractive","docs\u002Ftools\u002Fcommand-line\u002Finteractive\u002Findex",[2170],{"title":2166,"path":2167,"stem":2168},{"title":2172,"path":2173,"stem":2174,"children":2175},"Non-interactive use","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Fnon-interactive","docs\u002Ftools\u002Fcommand-line\u002Fnon-interactive\u002Findex",[2176],{"title":2172,"path":2173,"stem":2174},{"title":2178,"path":2179,"stem":2180,"children":2181},"Project configuration","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Fproject-configuration","docs\u002Ftools\u002Fcommand-line\u002Fproject-configuration\u002Findex",[2182],{"title":2178,"path":2179,"stem":2180},{"title":2184,"path":2185,"stem":2186,"children":2187},"Command reference","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Findex",[2188,2189,2195,2201,2207,2213,2219,2225,2231,2237,2243,2249,2255,2261,2267,2273,2279,2285,2291,2297],{"title":2184,"path":2185,"stem":2186},{"title":2190,"path":2191,"stem":2192,"children":2193},"About commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fabout","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fabout\u002Findex",[2194],{"title":2190,"path":2191,"stem":2192},{"title":2196,"path":2197,"stem":2198,"children":2199},"Apps commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fapps","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fapps\u002Findex",[2200],{"title":2196,"path":2197,"stem":2198},{"title":2202,"path":2203,"stem":2204,"children":2205},"Carts commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fcarts","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fcarts\u002Findex",[2206],{"title":2202,"path":2203,"stem":2204},{"title":2208,"path":2209,"stem":2210,"children":2211},"Channels commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fchannels","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fchannels\u002Findex",[2212],{"title":2208,"path":2209,"stem":2210},{"title":2214,"path":2215,"stem":2216,"children":2217},"Create commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fcreate","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fcreate\u002Findex",[2218],{"title":2214,"path":2215,"stem":2216},{"title":2220,"path":2221,"stem":2222,"children":2223},"Customers commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fcustomers","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fcustomers\u002Findex",[2224],{"title":2220,"path":2221,"stem":2222},{"title":2226,"path":2227,"stem":2228,"children":2229},"Deploy commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fdeploy","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fdeploy\u002Findex",[2230],{"title":2226,"path":2227,"stem":2228},{"title":2232,"path":2233,"stem":2234,"children":2235},"Forms commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fforms","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fforms\u002Findex",[2236],{"title":2232,"path":2233,"stem":2234},{"title":2238,"path":2239,"stem":2240,"children":2241},"Markets commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fmarkets","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fmarkets\u002Findex",[2242],{"title":2238,"path":2239,"stem":2240},{"title":2244,"path":2245,"stem":2246,"children":2247},"Order lists commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Forderlists","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Forderlists\u002Findex",[2248],{"title":2244,"path":2245,"stem":2246},{"title":2250,"path":2251,"stem":2252,"children":2253},"Orders commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Forders","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Forders\u002Findex",[2254],{"title":2250,"path":2251,"stem":2252},{"title":2256,"path":2257,"stem":2258,"children":2259},"Pages commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fpages","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fpages\u002Findex",[2260],{"title":2256,"path":2257,"stem":2258},{"title":2262,"path":2263,"stem":2264,"children":2265},"Prices commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fprices","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fprices\u002Findex",[2266],{"title":2262,"path":2263,"stem":2264},{"title":2268,"path":2269,"stem":2270,"children":2271},"Products commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fproducts","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fproducts\u002Findex",[2272],{"title":2268,"path":2269,"stem":2270},{"title":2274,"path":2275,"stem":2276,"children":2277},"Search commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fsearch","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fsearch\u002Findex",[2278],{"title":2274,"path":2275,"stem":2276},{"title":2280,"path":2281,"stem":2282,"children":2283},"Settings commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fsettings","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fsettings\u002Findex",[2284],{"title":2280,"path":2281,"stem":2282},{"title":2286,"path":2287,"stem":2288,"children":2289},"Sites commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fsites","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fsites\u002Findex",[2290],{"title":2286,"path":2287,"stem":2288},{"title":2292,"path":2293,"stem":2294,"children":2295},"Skills commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fskills","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fskills\u002Findex",[2296],{"title":2292,"path":2293,"stem":2294},{"title":2298,"path":2299,"stem":2300,"children":2301},"Storage commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fstorage","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fstorage\u002Findex",[2302],{"title":2298,"path":2299,"stem":2300},{"title":2304,"path":2305,"stem":2306,"children":2307},"Interactive shell (REPL)","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Frepl","docs\u002Ftools\u002Fcommand-line\u002Frepl\u002Findex",[2308],{"title":2304,"path":2305,"stem":2306},{"title":2310,"path":2311,"stem":2312,"children":2313},"Scaffolding","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Fscaffolding","docs\u002Ftools\u002Fcommand-line\u002Fscaffolding\u002Findex",[2314],{"title":2310,"path":2311,"stem":2312},{"title":2316,"path":2317,"stem":2318,"children":2319},"Scripting & output","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Fscripting","docs\u002Ftools\u002Fcommand-line\u002Fscripting\u002Findex",[2320],{"title":2316,"path":2317,"stem":2318},{"title":2322,"path":2323,"stem":2324,"children":2325},"Skills","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Fskills","docs\u002Ftools\u002Fcommand-line\u002Fskills\u002Findex",[2326],{"title":2322,"path":2323,"stem":2324},{"title":2328,"path":2329,"stem":2330,"children":2331},"Full-screen app (TUI)","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Ftui","docs\u002Ftools\u002Fcommand-line\u002Ftui\u002Findex",[2332],{"title":2328,"path":2329,"stem":2330},{"title":2334,"path":2335,"stem":2336,"children":2337},"Type generation","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Ftype-generation","docs\u002Ftools\u002Fcommand-line\u002Ftype-generation\u002Findex",[2338],{"title":2334,"path":2335,"stem":2336},{"title":2340,"path":2341,"stem":2342,"children":2343},"Background watchers","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Fwatch","docs\u002Ftools\u002Fcommand-line\u002Fwatch\u002Findex",[2344],{"title":2340,"path":2341,"stem":2342},{"title":2346,"path":2347,"stem":2348,"children":2349},"Model Context Protocol","\u002Fdocs\u002Ftools\u002Fmcp","docs\u002Ftools\u002Fmcp\u002Findex",[2350,2351,2357,2363,2369,2375,2381,2387,2393],{"title":2346,"path":2347,"stem":2348},{"title":2352,"path":2353,"stem":2354,"children":2355},"revenexx docs MCP in Google Antigravity","\u002Fdocs\u002Ftools\u002Fmcp\u002Fantigravity","docs\u002Ftools\u002Fmcp\u002Fantigravity\u002Findex",[2356],{"title":2352,"path":2353,"stem":2354},{"title":2358,"path":2359,"stem":2360,"children":2361},"revenexx docs MCP in Claude Code","\u002Fdocs\u002Ftools\u002Fmcp\u002Fclaude-code","docs\u002Ftools\u002Fmcp\u002Fclaude-code\u002Findex",[2362],{"title":2358,"path":2359,"stem":2360},{"title":2364,"path":2365,"stem":2366,"children":2367},"revenexx docs MCP in Claude Desktop","\u002Fdocs\u002Ftools\u002Fmcp\u002Fclaude-desktop","docs\u002Ftools\u002Fmcp\u002Fclaude-desktop\u002Findex",[2368],{"title":2364,"path":2365,"stem":2366},{"title":2370,"path":2371,"stem":2372,"children":2373},"revenexx docs MCP in Cursor","\u002Fdocs\u002Ftools\u002Fmcp\u002Fcursor","docs\u002Ftools\u002Fmcp\u002Fcursor\u002Findex",[2374],{"title":2370,"path":2371,"stem":2372},{"title":2376,"path":2377,"stem":2378,"children":2379},"revenexx docs MCP in OpenCode","\u002Fdocs\u002Ftools\u002Fmcp\u002Fopencode","docs\u002Ftools\u002Fmcp\u002Fopencode\u002Findex",[2380],{"title":2376,"path":2377,"stem":2378},{"title":2382,"path":2383,"stem":2384,"children":2385},"revenexx docs MCP in VS Code","\u002Fdocs\u002Ftools\u002Fmcp\u002Fvscode","docs\u002Ftools\u002Fmcp\u002Fvscode\u002Findex",[2386],{"title":2382,"path":2383,"stem":2384},{"title":2388,"path":2389,"stem":2390,"children":2391},"revenexx docs MCP in Windsurf","\u002Fdocs\u002Ftools\u002Fmcp\u002Fwindsurf","docs\u002Ftools\u002Fmcp\u002Fwindsurf\u002Findex",[2392],{"title":2388,"path":2389,"stem":2390},{"title":2394,"path":2395,"stem":2396,"children":2397},"revenexx docs MCP in Zenflow","\u002Fdocs\u002Ftools\u002Fmcp\u002Fzenflow","docs\u002Ftools\u002Fmcp\u002Fzenflow\u002Findex",[2398],{"title":2394,"path":2395,"stem":2396},{"id":2400,"title":180,"body":2401,"description":6188,"extension":6189,"landing":6190,"links":6190,"meta":6191,"navigation":6192,"path":181,"seo":6193,"sitemap":6194,"stem":182,"__hash__":6195},"docs\u002Fdocs\u002Fguides\u002Fcommerce\u002Fmodel-a-catalog\u002Findex.md",{"type":2402,"value":2403,"toc":6176},"minimark",[2404,2419,2422,2545,2563,2577,2631,2635,2640,2643,2713,2742,2748,2768,2771,2774,2785,2789,2792,2805,2923,2967,2981,3888,3928,3997,4020,4073,4077,4084,4280,4288,4292,4298,4414,4428,4432,4438,4603,4615,4947,4968,4972,5018,5036,5111,5119,5128,5170,5174,5177,5366,5408,5412,5427,5483,5492,5519,5534,6002,6023,6027,6141,6145,6148,6172],[2405,2406,2407,2408,2413,2414,2418],"p",{},"A customer sells a cordless drill in two colours and two voltages. Before anything is imported, you decide what that is in the catalog: one product, four products, or one product with four variants. At the end of this guide the drill exists as a model with four variants, each with its own SKU (the article number the customer already uses), a family that says which fields a drill has, and a completeness score you can measure on demand. You will also know what a catalog looks like when the import ran first and the model was skipped, and how to repair it. If you are a merchant who only wants to edit products by hand, use ",[2409,2410,2412],"a",{"href":2411},"\u002Fdocs\u002Fgetting-started\u002Fplatform-overview#cockpit-where-customers-live","Cockpit",", the admin UI at ",[2415,2416,2417],"code",{},"app.revenexx.com",", instead; this guide is for loading data over the API.",[2405,2420,2421],{},"This is for integrators and agencies who load or migrate a customer's product data. You need:",[2423,2424,2425,2450,2471,2539],"ul",{},[2426,2427,2428,2432,2433,2436,2437,2440,2441,2436,2445,2449],"li",{},[2429,2430,2431],"strong",{},"A tenant and its slug."," The slug is the tenant's short name, sent on every call in ",[2415,2434,2435],{},"X-Revenexx-Tenant","; ",[2415,2438,2439],{},"revenexx tenants list"," prints the ones your account can reach (",[2409,2442,2444],{"href":2443},"\u002Fdocs\u002Ftools\u002Fcommand-line\u002Fauthentication#select-a-tenant","Select a tenant",[2409,2446,2448],{"href":2447},"\u002Fdocs\u002Fgetting-started\u002Fprerequisites#find-your-tenant-slug","find your tenant slug",").",[2426,2451,2452,2455,2456,2436,2459,2463,2464,2467,2468,2449],{},[2429,2453,2454],{},"The Products app installed on that tenant."," Apps are installed from the App Marketplace in Cockpit (",[2409,2457,2458],{"href":59},"Platform overview",[2409,2460,2462],{"href":2461},"\u002Fdocs\u002Fgetting-started\u002Fprerequisites#check-and-install-an-app","check and install an app","). If it is missing, the first call in step 1 answers ",[2415,2465,2466],{},"404",", because no installed app serves the path (",[2409,2469,513],{"href":2470},"\u002Fdocs\u002Fservices\u002Fapi-usage\u002Ferrors#status-codes",[2426,2472,2473,2484,2485,2436,2489,2493,2494,2497,2498,2497,2501,2497,2504,2497,2507,2497,2510,2497,2513,2497,2516,2497,2519,2497,2522,2497,2525,2497,2528,2497,2531,2534,2535,2538],{},[2429,2474,2475,2476,2479,2480,2483],{},"An ",[2409,2477,2478],{"href":557},"API key"," with the ",[2415,2481,2482],{},"products.*"," scope"," (",[2409,2486,2488],{"href":2487},"\u002Fdocs\u002Fgetting-started\u002Fprerequisites#create-an-api-key","create an API key",[2409,2490,2492],{"href":2491},"\u002Fdocs\u002Fgetting-started\u002Fprerequisites#which-scope-covers-which-app","which scope covers which app","). It covers every Products operation, writes included. A narrower key needs each operation this guide uses: ",[2415,2495,2496],{},"products.attributes.list",", ",[2415,2499,2500],{},"products.attributes.create",[2415,2502,2503],{},"products.attribute_options.create",[2415,2505,2506],{},"products.families.create",[2415,2508,2509],{},"products.family_attributes.create",[2415,2511,2512],{},"products.family_variants.create",[2415,2514,2515],{},"products.create",[2415,2517,2518],{},"products.list",[2415,2520,2521],{},"products.get",[2415,2523,2524],{},"products.update",[2415,2526,2527],{},"products.grid",[2415,2529,2530],{},"products.attribute-schema",[2415,2532,2533],{},"products.completeness"," and ",[2415,2536,2537],{},"products.family.assign",".",[2426,2540,2541,2544],{},[2429,2542,2543],{},"The customer's product list"," in front of you (sizes, colours, units and the like).",[2405,2546,2547,2548,2551,2552,2497,2555,2558,2559,2538],{},"New to the platform? ",[2409,2549,64],{"href":2550},"\u002Fdocs\u002Fgetting-started\u002Fprerequisites#cockpit-and-who-grants-access"," covers Cockpit, your ",[2409,2553,2554],{"href":2447},"tenant slug",[2409,2556,2557],{"href":2461},"installing an app"," and a ",[2409,2560,2562],{"href":2561},"\u002Fdocs\u002Fgetting-started\u002Fprerequisites#get-a-test-tenant","test tenant",[2405,2564,2565,2566,2569,2570,2534,2573,2576],{},"Every call goes through the ",[2409,2567,2568],{"href":508},"API gateway",". The calls use ",[2415,2571,2572],{},"curl",[2415,2574,2575],{},"jq",", keep the ids they return in shell variables, and assume one terminal session from start to finish. They run in bash and in zsh, the default shell on macOS:",[2578,2579,2585],"pre",{"className":2580,"code":2581,"filename":2582,"language":2583,"meta":2584,"style":2584},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export REVENEXX_TENANT=\"\u003CTENANT_SLUG>\"\nexport REVENEXX_API_KEY=\"rvxk_...\"\n","Environment","bash","",[2415,2586,2587,2614],{"__ignoreMap":2584},[2588,2589,2592,2596,2600,2604,2607,2611],"span",{"class":2590,"line":2591},"line",1,[2588,2593,2595],{"class":2594},"spNyl","export",[2588,2597,2599],{"class":2598},"sTEyZ"," REVENEXX_TENANT",[2588,2601,2603],{"class":2602},"sMK4o","=",[2588,2605,2606],{"class":2602},"\"",[2588,2608,2610],{"class":2609},"sfazB","\u003CTENANT_SLUG>",[2588,2612,2613],{"class":2602},"\"\n",[2588,2615,2617,2619,2622,2624,2626,2629],{"class":2590,"line":2616},2,[2588,2618,2595],{"class":2594},[2588,2620,2621],{"class":2598}," REVENEXX_API_KEY",[2588,2623,2603],{"class":2602},[2588,2625,2606],{"class":2602},[2588,2627,2628],{"class":2609},"rvxk_...",[2588,2630,2613],{"class":2602},[2632,2633,2634],"note",{},"Statements here about behaviour the API does not validate or enforce can change. A date appears next to a claim only where it is the exception. (as of 2026-10)",[2636,2637,2639],"h2",{"id":2638},"decide-the-model-first","Decide the model first",[2405,2641,2642],{},"Three questions settle almost everything. Answer them on paper, with the customer, before you create a row:",[2644,2645,2646,2662],"table",{},[2647,2648,2649],"thead",{},[2650,2651,2652,2656,2659],"tr",{},[2653,2654,2655],"th",{},"Question",[2653,2657,2658],{},"If the answer is…",[2653,2660,2661],{},"Then it is a…",[2663,2664,2665,2685,2699],"tbody",{},[2650,2666,2667,2671,2674],{},[2668,2669,2670],"td",{},"What facts do we keep about a product (name, colour, weight, EAN)?",[2668,2672,2673],{},"each fact",[2668,2675,2676,2679,2680,2558,2682],{},[2429,2677,2678],{},"Attribute",", with a ",[2415,2681,2415],{},[2415,2683,2684],{},"type",[2650,2686,2687,2690,2693],{},[2668,2688,2689],{},"Which products carry the same set of facts?",[2668,2691,2692],{},"all drills, all cables",[2668,2694,2695,2698],{},[2429,2696,2697],{},"Family",", linked to its attributes",[2650,2700,2701,2704,2707],{},[2668,2702,2703],{},"Within one family, what makes two products \"the same product in another size\"?",[2668,2705,2706],{},"colour and voltage",[2668,2708,2709,2712],{},[2429,2710,2711],{},"Variant axes",", declared on a family variant",[2405,2714,2715,2716,2497,2719,2497,2722,2497,2725,2497,2728,2497,2731,2534,2734,2737,2738,2741],{},"Not everything is an attribute. A product has a few fields of its own: ",[2415,2717,2718],{},"sku",[2415,2720,2721],{},"kind",[2415,2723,2724],{},"parent_id",[2415,2726,2727],{},"family_id",[2415,2729,2730],{},"family_variant_id",[2415,2732,2733],{},"enabled",[2415,2735,2736],{},"tax_class",". Everything else you keep about it, its name and its EAN included, is an attribute, and so is a picture (an ",[2415,2739,2740],{},"asset_collection"," attribute holds asset codes). Prices and stock are not on the product at all: the Prices and Inventories apps keep them and refer to the product by SKU or id.",[2405,2743,2744,2745,2747],{},"A family covers many products, and a model is one article with its axes. Then the shape of a product follows. Every product has a ",[2415,2746,2721],{},":",[2423,2749,2750,2756,2762],{},[2426,2751,2752,2755],{},[2415,2753,2754],{},"simple"," stands alone.",[2426,2757,2758,2761],{},[2415,2759,2760],{},"model"," groups its variants and holds the facts you choose to keep in one place. Nothing is inherited: the API never copies or merges a model's values into its variants, so a fact a variant must show or score on has to be on the variant itself (step 6).",[2426,2763,2764,2767],{},[2415,2765,2766],{},"variant"," is one sellable combination of one model.",[2405,2769,2770],{},"A drill in two colours and two voltages is one model and four variants. These roles are conventions that you keep: nothing in the API stops you selling a model, and nothing checks that a variant points at one (see step 4).",[2405,2772,2773],{},"Decide the axes carefully. An attribute named as an axis is set on each variant and not on the model. Make something an axis when the customer sells the product as one article in another colour, size or voltage and the buyer picks it on one page. If the other version needs different fields, it belongs in a different family, so model it as a separate product.",[2405,2775,2776,2777,2780,2781,2784],{},"The axes are the part that is hard to change once variants exist. ",[2415,2778,2779],{},"PUT \u002Fv1\u002Fproducts\u002Ffamily_variants\u002F\u003Cid>"," changes a family variant's ",[2415,2782,2783],{},"axes",", but nothing re-checks the variants you already have: you set each new axis value on each variant yourself (step 7) and find the gaps with the check in step 5.",[2636,2786,2788],{"id":2787},"_1-create-the-attributes-and-their-options","1. Create the attributes and their options",[2405,2790,2791],{},"Work in this order: run the check below, then the create block once, and after a failure part way rerun the check, not the block. A duplicate attribute is accepted silently, so the block must not run twice.",[2405,2793,2794,2795,2798,2799,2801,2802,2804],{},"Attribute codes are not deduplicated, so check before you create. A tenant may already have a ",[2415,2796,2797],{},"name"," attribute, and a second one with the same code is accepted rather than refused. Look each code up first; ",[2415,2800,2415],{}," is an exact-match filter on the list (",[2409,2803,525],{"href":526},"):",[2578,2806,2809],{"className":2580,"code":2807,"filename":2808,"language":2583,"meta":2584,"style":2584},"for code in name colour voltage; do\n  curl -s \"https:\u002F\u002Fapi.revenexx.com\u002Fv1\u002Fproducts\u002Fattributes?code=$code\" \\\n    -H \"X-Revenexx-Tenant: $REVENEXX_TENANT\" \\\n    -H \"X-Revenexx-Api-Key: $REVENEXX_API_KEY\" \\\n    | jq -r '.items[] | [.code, .id, .type] | @tsv'\ndone\n","Check for existing attributes",[2415,2810,2811,2838,2861,2879,2896,2917],{"__ignoreMap":2584},[2588,2812,2813,2817,2820,2823,2826,2829,2832,2835],{"class":2590,"line":2591},[2588,2814,2816],{"class":2815},"s7zQu","for",[2588,2818,2819],{"class":2598}," code ",[2588,2821,2822],{"class":2815},"in",[2588,2824,2825],{"class":2609}," name",[2588,2827,2828],{"class":2609}," colour",[2588,2830,2831],{"class":2609}," voltage",[2588,2833,2834],{"class":2602},";",[2588,2836,2837],{"class":2815}," do\n",[2588,2839,2840,2844,2847,2850,2853,2856,2858],{"class":2590,"line":2616},[2588,2841,2843],{"class":2842},"sBMFI","  curl",[2588,2845,2846],{"class":2609}," -s",[2588,2848,2849],{"class":2602}," \"",[2588,2851,2852],{"class":2609},"https:\u002F\u002Fapi.revenexx.com\u002Fv1\u002Fproducts\u002Fattributes?code=",[2588,2854,2855],{"class":2598},"$code",[2588,2857,2606],{"class":2602},[2588,2859,2860],{"class":2598}," \\\n",[2588,2862,2864,2867,2869,2872,2875,2877],{"class":2590,"line":2863},3,[2588,2865,2866],{"class":2609},"    -H",[2588,2868,2849],{"class":2602},[2588,2870,2871],{"class":2609},"X-Revenexx-Tenant: ",[2588,2873,2874],{"class":2598},"$REVENEXX_TENANT",[2588,2876,2606],{"class":2602},[2588,2878,2860],{"class":2598},[2588,2880,2882,2884,2886,2889,2892,2894],{"class":2590,"line":2881},4,[2588,2883,2866],{"class":2609},[2588,2885,2849],{"class":2602},[2588,2887,2888],{"class":2609},"X-Revenexx-Api-Key: ",[2588,2890,2891],{"class":2598},"$REVENEXX_API_KEY",[2588,2893,2606],{"class":2602},[2588,2895,2860],{"class":2598},[2588,2897,2899,2902,2905,2908,2911,2914],{"class":2590,"line":2898},5,[2588,2900,2901],{"class":2602},"    |",[2588,2903,2904],{"class":2842}," jq",[2588,2906,2907],{"class":2609}," -r",[2588,2909,2910],{"class":2602}," '",[2588,2912,2913],{"class":2609},".items[] | [.code, .id, .type] | @tsv",[2588,2915,2916],{"class":2602},"'\n",[2588,2918,2920],{"class":2590,"line":2919},6,[2588,2921,2922],{"class":2815},"done\n",[2405,2924,2925,2926,2928,2929,2932,2933,2935,2936,2938,2939,2942,2943,2946,2947,2949,2950,2953,2954,2534,2957,2949,2960,2963,2964,2538],{},"No output means none of the three exists yet. If ",[2415,2927,2575],{}," reports ",[2415,2930,2931],{},"Cannot iterate over null"," instead, run the call without ",[2415,2934,2575],{}," and read the error: ",[2415,2937,2466],{}," means the Products app is not installed, ",[2415,2940,2941],{},"403"," that the key lacks the scope. For a code that prints a row, reuse it: set its variable to the printed id (",[2415,2944,2945],{},"NAME_ID=\u003Cid>",") and leave its line out of the next block. First check the printed type: ",[2415,2948,2797],{}," must be ",[2415,2951,2952],{},"text",", and ",[2415,2955,2956],{},"colour",[2415,2958,2959],{},"voltage",[2415,2961,2962],{},"select",". If a code exists with another type, choose a different code and use it in every later step, because changing an attribute's type later leaves stored values in their old bucket (see below). For a reused select, create only the option codes it lacks: an option code that already exists answers ",[2415,2965,2966],{},"409",[2405,2968,2969,2970,2558,2972,2974,2975,2977,2978,2980],{},"An attribute needs a ",[2415,2971,2415],{},[2415,2973,2684],{},". The ",[2415,2976,2415],{}," is the key the value is stored under in the product, so choose it once. A select also needs its permitted values as options, and an option's ",[2415,2979,2415],{},", never its label, is what a product stores:",[2578,2982,2985],{"className":2580,"code":2983,"filename":2984,"language":2583,"meta":2584,"style":2584},"# POST a body; print the stored row on 2xx, otherwise print the error body and fail.\ncreate() {\n  local out http_code\n  out=$(curl -sS -w '\\n%{http_code}' -X POST \"https:\u002F\u002Fapi.revenexx.com\u002Fv1\u002Fproducts$1\" \\\n    -H \"X-Revenexx-Tenant: $REVENEXX_TENANT\" \\\n    -H \"X-Revenexx-Api-Key: $REVENEXX_API_KEY\" \\\n    -H \"Content-Type: application\u002Fjson\" -d \"$2\") || return 1\n  http_code=${out##*$'\\n'}\n  out=${out%$'\\n'*}\n  case $http_code in\n    2??) printf '%s\\n' \"$out\" ;;\n    *) printf 'create %s failed with HTTP %s: %s\\n' \"$1\" \"$http_code\" \"$out\" >&2; return 1 ;;\n  esac\n}\n\n# The same call, but print only the new id, and fail if there is none.\ncreate_id() {\n  local row id\n  row=$(create \"$@\") || return 1\n  id=$(printf '%s' \"$row\" | jq -r '.id \u002F\u002F empty')\n  if [ -z \"$id\" ] || [ \"$id\" = null ]; then\n    printf 'create %s returned no id: %s\\n' \"$1\" \"$row\" >&2\n    return 1\n  fi\n  printf '%s\\n' \"$id\"\n}\n\nbuild_attributes() {\n  NAME_ID=$(create_id \u002Fattributes '{\"code\":\"name\",\"type\":\"text\",\"labels\":{\"en\":\"Name\"}}') || return 1\n  COLOUR_ID=$(create_id \u002Fattributes '{\"code\":\"colour\",\"type\":\"select\",\"labels\":{\"en\":\"Colour\"}}') || return 1\n  VOLTAGE_ID=$(create_id \u002Fattributes '{\"code\":\"voltage\",\"type\":\"select\",\"labels\":{\"en\":\"Voltage\"}}') || return 1\n\n  create \u002Fattribute_options \"{\\\"attribute_id\\\":\\\"$COLOUR_ID\\\",\\\"code\\\":\\\"black\\\",\\\"labels\\\":{\\\"en\\\":\\\"Black\\\"}}\" || return 1\n  create \u002Fattribute_options \"{\\\"attribute_id\\\":\\\"$COLOUR_ID\\\",\\\"code\\\":\\\"red\\\",\\\"labels\\\":{\\\"en\\\":\\\"Red\\\"}}\" || return 1\n  create \u002Fattribute_options \"{\\\"attribute_id\\\":\\\"$VOLTAGE_ID\\\",\\\"code\\\":\\\"12v\\\",\\\"labels\\\":{\\\"en\\\":\\\"12 V\\\"}}\" || return 1\n  create \u002Fattribute_options \"{\\\"attribute_id\\\":\\\"$VOLTAGE_ID\\\",\\\"code\\\":\\\"18v\\\",\\\"labels\\\":{\\\"en\\\":\\\"18 V\\\"}}\" || return 1\n}\nbuild_attributes\n","Create the attributes",[2415,2986,2987,2993,3005,3013,3056,3070,3084,3119,3145,3166,3178,3209,3253,3259,3264,3271,3277,3287,3295,3320,3362,3406,3434,3442,3448,3466,3471,3476,3486,3514,3541,3568,3573,3657,3730,3804,3877,3882],{"__ignoreMap":2584},[2588,2988,2989],{"class":2590,"line":2591},[2588,2990,2992],{"class":2991},"sHwdD","# POST a body; print the stored row on 2xx, otherwise print the error body and fail.\n",[2588,2994,2995,2999,3002],{"class":2590,"line":2616},[2588,2996,2998],{"class":2997},"s2Zo4","create",[2588,3000,3001],{"class":2602},"()",[2588,3003,3004],{"class":2602}," {\n",[2588,3006,3007,3010],{"class":2590,"line":2863},[2588,3008,3009],{"class":2594},"  local",[2588,3011,3012],{"class":2598}," out http_code\n",[2588,3014,3015,3018,3021,3023,3026,3029,3031,3034,3037,3040,3043,3045,3048,3052,3054],{"class":2590,"line":2881},[2588,3016,3017],{"class":2598},"  out",[2588,3019,3020],{"class":2602},"=$(",[2588,3022,2572],{"class":2842},[2588,3024,3025],{"class":2609}," -sS",[2588,3027,3028],{"class":2609}," -w",[2588,3030,2910],{"class":2602},[2588,3032,3033],{"class":2609},"\\n%{http_code}",[2588,3035,3036],{"class":2602},"'",[2588,3038,3039],{"class":2609}," -X",[2588,3041,3042],{"class":2609}," POST",[2588,3044,2849],{"class":2602},[2588,3046,3047],{"class":2609},"https:\u002F\u002Fapi.revenexx.com\u002Fv1\u002Fproducts",[2588,3049,3051],{"class":3050},"sHdIc","$1",[2588,3053,2606],{"class":2602},[2588,3055,2860],{"class":2598},[2588,3057,3058,3060,3062,3064,3066,3068],{"class":2590,"line":2898},[2588,3059,2866],{"class":2609},[2588,3061,2849],{"class":2602},[2588,3063,2871],{"class":2609},[2588,3065,2874],{"class":2598},[2588,3067,2606],{"class":2602},[2588,3069,2860],{"class":2598},[2588,3071,3072,3074,3076,3078,3080,3082],{"class":2590,"line":2919},[2588,3073,2866],{"class":2609},[2588,3075,2849],{"class":2602},[2588,3077,2888],{"class":2609},[2588,3079,2891],{"class":2598},[2588,3081,2606],{"class":2602},[2588,3083,2860],{"class":2598},[2588,3085,3087,3089,3091,3094,3096,3099,3101,3104,3106,3109,3112,3115],{"class":2590,"line":3086},7,[2588,3088,2866],{"class":2609},[2588,3090,2849],{"class":2602},[2588,3092,3093],{"class":2609},"Content-Type: application\u002Fjson",[2588,3095,2606],{"class":2602},[2588,3097,3098],{"class":2609}," -d",[2588,3100,2849],{"class":2602},[2588,3102,3103],{"class":3050},"$2",[2588,3105,2606],{"class":2602},[2588,3107,3108],{"class":2602},")",[2588,3110,3111],{"class":2602}," ||",[2588,3113,3114],{"class":2815}," return",[2588,3116,3118],{"class":3117},"sbssI"," 1\n",[2588,3120,3122,3125,3128,3131,3134,3137,3140,3142],{"class":2590,"line":3121},8,[2588,3123,3124],{"class":2598},"  http_code",[2588,3126,3127],{"class":2602},"=${",[2588,3129,3130],{"class":2598},"out",[2588,3132,3133],{"class":2602},"##*",[2588,3135,3136],{"class":2602},"$'",[2588,3138,3139],{"class":2598},"\\n",[2588,3141,3036],{"class":2602},[2588,3143,3144],{"class":2602},"}\n",[2588,3146,3148,3150,3152,3154,3157,3159,3161,3163],{"class":2590,"line":3147},9,[2588,3149,3017],{"class":2598},[2588,3151,3127],{"class":2602},[2588,3153,3130],{"class":2598},[2588,3155,3156],{"class":2602},"%",[2588,3158,3136],{"class":2602},[2588,3160,3139],{"class":2598},[2588,3162,3036],{"class":2602},[2588,3164,3165],{"class":2602},"*}\n",[2588,3167,3169,3172,3175],{"class":2590,"line":3168},10,[2588,3170,3171],{"class":2815},"  case",[2588,3173,3174],{"class":2598}," $http_code ",[2588,3176,3177],{"class":2815},"in\n",[2588,3179,3181,3184,3187,3189,3192,3194,3197,3199,3201,3204,3206],{"class":2590,"line":3180},11,[2588,3182,3183],{"class":2609},"    2",[2588,3185,3186],{"class":2602},"??",[2588,3188,3108],{"class":2602},[2588,3190,3191],{"class":2997}," printf",[2588,3193,2910],{"class":2602},[2588,3195,3196],{"class":2609},"%s\\n",[2588,3198,3036],{"class":2602},[2588,3200,2849],{"class":2602},[2588,3202,3203],{"class":2598},"$out",[2588,3205,2606],{"class":2602},[2588,3207,3208],{"class":2602}," ;;\n",[2588,3210,3212,3215,3217,3219,3222,3224,3226,3228,3230,3232,3235,3237,3239,3241,3243,3246,3248,3251],{"class":2590,"line":3211},12,[2588,3213,3214],{"class":2602},"    *)",[2588,3216,3191],{"class":2997},[2588,3218,2910],{"class":2602},[2588,3220,3221],{"class":2609},"create %s failed with HTTP %s: %s\\n",[2588,3223,3036],{"class":2602},[2588,3225,2849],{"class":2602},[2588,3227,3051],{"class":3050},[2588,3229,2606],{"class":2602},[2588,3231,2849],{"class":2602},[2588,3233,3234],{"class":2598},"$http_code",[2588,3236,2606],{"class":2602},[2588,3238,2849],{"class":2602},[2588,3240,3203],{"class":2598},[2588,3242,2606],{"class":2602},[2588,3244,3245],{"class":2602}," >&2;",[2588,3247,3114],{"class":2815},[2588,3249,3250],{"class":3117}," 1",[2588,3252,3208],{"class":2602},[2588,3254,3256],{"class":2590,"line":3255},13,[2588,3257,3258],{"class":2815},"  esac\n",[2588,3260,3262],{"class":2590,"line":3261},14,[2588,3263,3144],{"class":2602},[2588,3265,3267],{"class":2590,"line":3266},15,[2588,3268,3270],{"emptyLinePlaceholder":3269},true,"\n",[2588,3272,3274],{"class":2590,"line":3273},16,[2588,3275,3276],{"class":2991},"# The same call, but print only the new id, and fail if there is none.\n",[2588,3278,3280,3283,3285],{"class":2590,"line":3279},17,[2588,3281,3282],{"class":2997},"create_id",[2588,3284,3001],{"class":2602},[2588,3286,3004],{"class":2602},[2588,3288,3290,3292],{"class":2590,"line":3289},18,[2588,3291,3009],{"class":2594},[2588,3293,3294],{"class":2598}," row id\n",[2588,3296,3298,3301,3303,3305,3307,3310,3312,3314,3316,3318],{"class":2590,"line":3297},19,[2588,3299,3300],{"class":2598},"  row",[2588,3302,3020],{"class":2602},[2588,3304,2998],{"class":2842},[2588,3306,2849],{"class":2602},[2588,3308,3309],{"class":3050},"$@",[2588,3311,2606],{"class":2602},[2588,3313,3108],{"class":2602},[2588,3315,3111],{"class":2602},[2588,3317,3114],{"class":2815},[2588,3319,3118],{"class":3117},[2588,3321,3323,3326,3328,3331,3333,3336,3338,3340,3343,3345,3348,3350,3352,3354,3357,3359],{"class":2590,"line":3322},20,[2588,3324,3325],{"class":2598},"  id",[2588,3327,3020],{"class":2602},[2588,3329,3330],{"class":2997},"printf",[2588,3332,2910],{"class":2602},[2588,3334,3335],{"class":2609},"%s",[2588,3337,3036],{"class":2602},[2588,3339,2849],{"class":2602},[2588,3341,3342],{"class":2598},"$row",[2588,3344,2606],{"class":2602},[2588,3346,3347],{"class":2602}," |",[2588,3349,2904],{"class":2842},[2588,3351,2907],{"class":2609},[2588,3353,2910],{"class":2602},[2588,3355,3356],{"class":2609},".id \u002F\u002F empty",[2588,3358,3036],{"class":2602},[2588,3360,3361],{"class":2602},")\n",[2588,3363,3365,3368,3371,3374,3376,3379,3381,3384,3386,3388,3390,3392,3394,3397,3400,3403],{"class":2590,"line":3364},21,[2588,3366,3367],{"class":2815},"  if",[2588,3369,3370],{"class":2602}," [",[2588,3372,3373],{"class":2602}," -z",[2588,3375,2849],{"class":2602},[2588,3377,3378],{"class":2598},"$id",[2588,3380,2606],{"class":2602},[2588,3382,3383],{"class":2602}," ]",[2588,3385,3111],{"class":2602},[2588,3387,3370],{"class":2602},[2588,3389,2849],{"class":2602},[2588,3391,3378],{"class":2598},[2588,3393,2606],{"class":2602},[2588,3395,3396],{"class":2602}," =",[2588,3398,3399],{"class":2598}," null ",[2588,3401,3402],{"class":2602},"];",[2588,3404,3405],{"class":2815}," then\n",[2588,3407,3409,3412,3414,3417,3419,3421,3423,3425,3427,3429,3431],{"class":2590,"line":3408},22,[2588,3410,3411],{"class":2997},"    printf",[2588,3413,2910],{"class":2602},[2588,3415,3416],{"class":2609},"create %s returned no id: %s\\n",[2588,3418,3036],{"class":2602},[2588,3420,2849],{"class":2602},[2588,3422,3051],{"class":3050},[2588,3424,2606],{"class":2602},[2588,3426,2849],{"class":2602},[2588,3428,3342],{"class":2598},[2588,3430,2606],{"class":2602},[2588,3432,3433],{"class":2602}," >&2\n",[2588,3435,3437,3440],{"class":2590,"line":3436},23,[2588,3438,3439],{"class":2815},"    return",[2588,3441,3118],{"class":3117},[2588,3443,3445],{"class":2590,"line":3444},24,[2588,3446,3447],{"class":2815},"  fi\n",[2588,3449,3451,3454,3456,3458,3460,3462,3464],{"class":2590,"line":3450},25,[2588,3452,3453],{"class":2997},"  printf",[2588,3455,2910],{"class":2602},[2588,3457,3196],{"class":2609},[2588,3459,3036],{"class":2602},[2588,3461,2849],{"class":2602},[2588,3463,3378],{"class":2598},[2588,3465,2613],{"class":2602},[2588,3467,3469],{"class":2590,"line":3468},26,[2588,3470,3144],{"class":2602},[2588,3472,3474],{"class":2590,"line":3473},27,[2588,3475,3270],{"emptyLinePlaceholder":3269},[2588,3477,3479,3482,3484],{"class":2590,"line":3478},28,[2588,3480,3481],{"class":2997},"build_attributes",[2588,3483,3001],{"class":2602},[2588,3485,3004],{"class":2602},[2588,3487,3489,3492,3494,3496,3499,3501,3504,3506,3508,3510,3512],{"class":2590,"line":3488},29,[2588,3490,3491],{"class":2598},"  NAME_ID",[2588,3493,3020],{"class":2602},[2588,3495,3282],{"class":2842},[2588,3497,3498],{"class":2609}," \u002Fattributes",[2588,3500,2910],{"class":2602},[2588,3502,3503],{"class":2609},"{\"code\":\"name\",\"type\":\"text\",\"labels\":{\"en\":\"Name\"}}",[2588,3505,3036],{"class":2602},[2588,3507,3108],{"class":2602},[2588,3509,3111],{"class":2602},[2588,3511,3114],{"class":2815},[2588,3513,3118],{"class":3117},[2588,3515,3517,3520,3522,3524,3526,3528,3531,3533,3535,3537,3539],{"class":2590,"line":3516},30,[2588,3518,3519],{"class":2598},"  COLOUR_ID",[2588,3521,3020],{"class":2602},[2588,3523,3282],{"class":2842},[2588,3525,3498],{"class":2609},[2588,3527,2910],{"class":2602},[2588,3529,3530],{"class":2609},"{\"code\":\"colour\",\"type\":\"select\",\"labels\":{\"en\":\"Colour\"}}",[2588,3532,3036],{"class":2602},[2588,3534,3108],{"class":2602},[2588,3536,3111],{"class":2602},[2588,3538,3114],{"class":2815},[2588,3540,3118],{"class":3117},[2588,3542,3544,3547,3549,3551,3553,3555,3558,3560,3562,3564,3566],{"class":2590,"line":3543},31,[2588,3545,3546],{"class":2598},"  VOLTAGE_ID",[2588,3548,3020],{"class":2602},[2588,3550,3282],{"class":2842},[2588,3552,3498],{"class":2609},[2588,3554,2910],{"class":2602},[2588,3556,3557],{"class":2609},"{\"code\":\"voltage\",\"type\":\"select\",\"labels\":{\"en\":\"Voltage\"}}",[2588,3559,3036],{"class":2602},[2588,3561,3108],{"class":2602},[2588,3563,3111],{"class":2602},[2588,3565,3114],{"class":2815},[2588,3567,3118],{"class":3117},[2588,3569,3571],{"class":2590,"line":3570},32,[2588,3572,3270],{"emptyLinePlaceholder":3269},[2588,3574,3576,3579,3582,3584,3587,3590,3593,3595,3597,3600,3603,3605,3607,3609,3611,3613,3616,3618,3620,3622,3625,3627,3630,3632,3635,3637,3639,3641,3644,3646,3649,3651,3653,3655],{"class":2590,"line":3575},33,[2588,3577,3578],{"class":2842},"  create",[2588,3580,3581],{"class":2609}," \u002Fattribute_options",[2588,3583,2849],{"class":2602},[2588,3585,3586],{"class":2609},"{",[2588,3588,3589],{"class":2598},"\\\"",[2588,3591,3592],{"class":2609},"attribute_id",[2588,3594,3589],{"class":2598},[2588,3596,2747],{"class":2609},[2588,3598,3599],{"class":2598},"\\\"$COLOUR_ID\\\"",[2588,3601,3602],{"class":2609},",",[2588,3604,3589],{"class":2598},[2588,3606,2415],{"class":2609},[2588,3608,3589],{"class":2598},[2588,3610,2747],{"class":2609},[2588,3612,3589],{"class":2598},[2588,3614,3615],{"class":2609},"black",[2588,3617,3589],{"class":2598},[2588,3619,3602],{"class":2609},[2588,3621,3589],{"class":2598},[2588,3623,3624],{"class":2609},"labels",[2588,3626,3589],{"class":2598},[2588,3628,3629],{"class":2609},":{",[2588,3631,3589],{"class":2598},[2588,3633,3634],{"class":2609},"en",[2588,3636,3589],{"class":2598},[2588,3638,2747],{"class":2609},[2588,3640,3589],{"class":2598},[2588,3642,3643],{"class":2609},"Black",[2588,3645,3589],{"class":2598},[2588,3647,3648],{"class":2609},"}}",[2588,3650,2606],{"class":2602},[2588,3652,3111],{"class":2602},[2588,3654,3114],{"class":2815},[2588,3656,3118],{"class":3117},[2588,3658,3660,3662,3664,3666,3668,3670,3672,3674,3676,3678,3680,3682,3684,3686,3688,3690,3693,3695,3697,3699,3701,3703,3705,3707,3709,3711,3713,3715,3718,3720,3722,3724,3726,3728],{"class":2590,"line":3659},34,[2588,3661,3578],{"class":2842},[2588,3663,3581],{"class":2609},[2588,3665,2849],{"class":2602},[2588,3667,3586],{"class":2609},[2588,3669,3589],{"class":2598},[2588,3671,3592],{"class":2609},[2588,3673,3589],{"class":2598},[2588,3675,2747],{"class":2609},[2588,3677,3599],{"class":2598},[2588,3679,3602],{"class":2609},[2588,3681,3589],{"class":2598},[2588,3683,2415],{"class":2609},[2588,3685,3589],{"class":2598},[2588,3687,2747],{"class":2609},[2588,3689,3589],{"class":2598},[2588,3691,3692],{"class":2609},"red",[2588,3694,3589],{"class":2598},[2588,3696,3602],{"class":2609},[2588,3698,3589],{"class":2598},[2588,3700,3624],{"class":2609},[2588,3702,3589],{"class":2598},[2588,3704,3629],{"class":2609},[2588,3706,3589],{"class":2598},[2588,3708,3634],{"class":2609},[2588,3710,3589],{"class":2598},[2588,3712,2747],{"class":2609},[2588,3714,3589],{"class":2598},[2588,3716,3717],{"class":2609},"Red",[2588,3719,3589],{"class":2598},[2588,3721,3648],{"class":2609},[2588,3723,2606],{"class":2602},[2588,3725,3111],{"class":2602},[2588,3727,3114],{"class":2815},[2588,3729,3118],{"class":3117},[2588,3731,3733,3735,3737,3739,3741,3743,3745,3747,3749,3752,3754,3756,3758,3760,3762,3764,3767,3769,3771,3773,3775,3777,3779,3781,3783,3785,3787,3789,3792,3794,3796,3798,3800,3802],{"class":2590,"line":3732},35,[2588,3734,3578],{"class":2842},[2588,3736,3581],{"class":2609},[2588,3738,2849],{"class":2602},[2588,3740,3586],{"class":2609},[2588,3742,3589],{"class":2598},[2588,3744,3592],{"class":2609},[2588,3746,3589],{"class":2598},[2588,3748,2747],{"class":2609},[2588,3750,3751],{"class":2598},"\\\"$VOLTAGE_ID\\\"",[2588,3753,3602],{"class":2609},[2588,3755,3589],{"class":2598},[2588,3757,2415],{"class":2609},[2588,3759,3589],{"class":2598},[2588,3761,2747],{"class":2609},[2588,3763,3589],{"class":2598},[2588,3765,3766],{"class":2609},"12v",[2588,3768,3589],{"class":2598},[2588,3770,3602],{"class":2609},[2588,3772,3589],{"class":2598},[2588,3774,3624],{"class":2609},[2588,3776,3589],{"class":2598},[2588,3778,3629],{"class":2609},[2588,3780,3589],{"class":2598},[2588,3782,3634],{"class":2609},[2588,3784,3589],{"class":2598},[2588,3786,2747],{"class":2609},[2588,3788,3589],{"class":2598},[2588,3790,3791],{"class":2609},"12 V",[2588,3793,3589],{"class":2598},[2588,3795,3648],{"class":2609},[2588,3797,2606],{"class":2602},[2588,3799,3111],{"class":2602},[2588,3801,3114],{"class":2815},[2588,3803,3118],{"class":3117},[2588,3805,3807,3809,3811,3813,3815,3817,3819,3821,3823,3825,3827,3829,3831,3833,3835,3837,3840,3842,3844,3846,3848,3850,3852,3854,3856,3858,3860,3862,3865,3867,3869,3871,3873,3875],{"class":2590,"line":3806},36,[2588,3808,3578],{"class":2842},[2588,3810,3581],{"class":2609},[2588,3812,2849],{"class":2602},[2588,3814,3586],{"class":2609},[2588,3816,3589],{"class":2598},[2588,3818,3592],{"class":2609},[2588,3820,3589],{"class":2598},[2588,3822,2747],{"class":2609},[2588,3824,3751],{"class":2598},[2588,3826,3602],{"class":2609},[2588,3828,3589],{"class":2598},[2588,3830,2415],{"class":2609},[2588,3832,3589],{"class":2598},[2588,3834,2747],{"class":2609},[2588,3836,3589],{"class":2598},[2588,3838,3839],{"class":2609},"18v",[2588,3841,3589],{"class":2598},[2588,3843,3602],{"class":2609},[2588,3845,3589],{"class":2598},[2588,3847,3624],{"class":2609},[2588,3849,3589],{"class":2598},[2588,3851,3629],{"class":2609},[2588,3853,3589],{"class":2598},[2588,3855,3634],{"class":2609},[2588,3857,3589],{"class":2598},[2588,3859,2747],{"class":2609},[2588,3861,3589],{"class":2598},[2588,3863,3864],{"class":2609},"18 V",[2588,3866,3589],{"class":2598},[2588,3868,3648],{"class":2609},[2588,3870,2606],{"class":2602},[2588,3872,3111],{"class":2602},[2588,3874,3114],{"class":2815},[2588,3876,3118],{"class":3117},[2588,3878,3880],{"class":2590,"line":3879},37,[2588,3881,3144],{"class":2602},[2588,3883,3885],{"class":2590,"line":3884},38,[2588,3886,3887],{"class":2842},"build_attributes\n",[2405,3889,3890,3892,3893,3896,3897,3900,3901,2953,3904,3900,3907,3909,3910,3913,3914,3917,3918,3920,3921,3924,3925,2747],{},[2415,3891,2998],{}," takes the part of the path after ",[2415,3894,3895],{},"\u002Fv1\u002Fproducts",": ",[2415,3898,3899],{},"create \u002Fattributes"," posts to ",[2415,3902,3903],{},"\u002Fv1\u002Fproducts\u002Fattributes",[2415,3905,3906],{},"create \"\"",[2415,3908,3895],{}," to make a product. Every create answers ",[2415,3911,3912],{},"201"," with the stored row, so ",[2415,3915,3916],{},".id"," is the new id. On any other answer the helper prints the status and the error body and fails, and ",[2415,3919,3481],{}," stops at that call, so a failed call never leaves a variable set to ",[2415,3922,3923],{},"null",". Fix the cause, then run the check above again before you retry the block. If it stopped at an option instead, the attribute ids are already set in your shell: list the options that exist and create only the missing ones with ",[2415,3926,3927],{},"create \u002Fattribute_options",[2578,3929,3932],{"className":2580,"code":3930,"filename":3931,"language":2583,"meta":2584,"style":2584},"curl -s \"https:\u002F\u002Fapi.revenexx.com\u002Fv1\u002Fproducts\u002Fattribute_options?attribute_id=$COLOUR_ID\" \\\n  -H \"X-Revenexx-Tenant: $REVENEXX_TENANT\" \\\n  -H \"X-Revenexx-Api-Key: $REVENEXX_API_KEY\" \\\n  | jq -r '.items[].code'\n","List an attribute's options",[2415,3933,3934,3952,3967,3981],{"__ignoreMap":2584},[2588,3935,3936,3938,3940,3942,3945,3948,3950],{"class":2590,"line":2591},[2588,3937,2572],{"class":2842},[2588,3939,2846],{"class":2609},[2588,3941,2849],{"class":2602},[2588,3943,3944],{"class":2609},"https:\u002F\u002Fapi.revenexx.com\u002Fv1\u002Fproducts\u002Fattribute_options?attribute_id=",[2588,3946,3947],{"class":2598},"$COLOUR_ID",[2588,3949,2606],{"class":2602},[2588,3951,2860],{"class":2598},[2588,3953,3954,3957,3959,3961,3963,3965],{"class":2590,"line":2616},[2588,3955,3956],{"class":2609},"  -H",[2588,3958,2849],{"class":2602},[2588,3960,2871],{"class":2609},[2588,3962,2874],{"class":2598},[2588,3964,2606],{"class":2602},[2588,3966,2860],{"class":2598},[2588,3968,3969,3971,3973,3975,3977,3979],{"class":2590,"line":2863},[2588,3970,3956],{"class":2609},[2588,3972,2849],{"class":2602},[2588,3974,2888],{"class":2609},[2588,3976,2891],{"class":2598},[2588,3978,2606],{"class":2602},[2588,3980,2860],{"class":2598},[2588,3982,3983,3986,3988,3990,3992,3995],{"class":2590,"line":2881},[2588,3984,3985],{"class":2602},"  |",[2588,3987,2904],{"class":2842},[2588,3989,2907],{"class":2609},[2588,3991,2910],{"class":2602},[2588,3993,3994],{"class":2609},".items[].code",[2588,3996,2916],{"class":2602},[2405,3998,3999,4000,4002,4003,4005,4006,4008,4009,4012,4013,4015,4016,4019],{},"A duplicate family, option or family variant ",[2415,4001,2415],{}," answers ",[2415,4004,2966],{},". A duplicate attribute does not: the ",[2415,4007,2966],{}," only fires when the attribute's ",[2415,4010,4011],{},"entity_ref"," is set, and ",[2415,4014,4011],{}," (which ties an attribute to one reference entity or asset family) is empty for a plain product attribute like these (",[2409,4017,1026],{"href":4018},"\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fdata-model#attributes","). So after a partial failure, run the check again rather than the whole block.",[2405,4021,4022,4023,4025,4026,4029,4030,4033,4034,4037,4038,4041,4042,2497,4045,4048,4049,2484,4052,4054,4055,2534,4058,4061,4062,4064,4065,4068,4069,4072],{},"The ",[2415,4024,2684],{}," list is open: text, select, number, metric, price, asset_collection and reference_entity are the ones in use, and an unknown type is shown as a text field. Add ",[2415,4027,4028],{},"\"localizable\": true"," for a value per language, or ",[2415,4031,4032],{},"\"scopable\": true"," for a value per channel. Those flags decide which of the four buckets of a product's ",[2415,4035,4036],{},"attribute_values"," holds the value: ",[2415,4039,4040],{},"common"," (one plain value, as in this guide), ",[2415,4043,4044],{},"locale_specific",[2415,4046,4047],{},"channel_specific"," or ",[2415,4050,4051],{},"channel_locale_specific",[2409,4053,1392],{"href":1393},"). Set them before values exist: changing an attribute's type or its ",[2415,4056,4057],{},"localizable",[2415,4059,4060],{},"scopable"," flags later leaves stored values in their old bucket. ",[2415,4063,2797],{}," is the conventional display-name attribute: it is used when neither the family's ",[2415,4066,4067],{},"label_attribute"," nor the tenant's ",[2415,4070,4071],{},"default_label_attribute"," names another.",[2636,4074,4076],{"id":4075},"_2-create-the-family-and-link-its-attributes","2. Create the family and link its attributes",[2405,4078,4079,4080,4083],{},"A family answers \"which fields does a drill have\". Link each attribute to it, and mark ",[2415,4081,4082],{},"is_required"," for the ones that must be filled for a product to count as complete:",[2578,4085,4088],{"className":2580,"code":4086,"filename":4087,"language":2583,"meta":2584,"style":2584},"FAMILY_ID=$(create_id \u002Ffamilies '{\"code\":\"power_tools\",\"labels\":{\"en\":\"Power tools\"}}')\n: \"${FAMILY_ID:?the family was not created, see the error above}\"\n\ncreate \u002Ffamily_attributes \"{\\\"family_id\\\":\\\"$FAMILY_ID\\\",\\\"attribute_id\\\":\\\"$NAME_ID\\\",\\\"is_required\\\":true}\"\ncreate \u002Ffamily_attributes \"{\\\"family_id\\\":\\\"$FAMILY_ID\\\",\\\"attribute_id\\\":\\\"$COLOUR_ID\\\"}\"\ncreate \u002Ffamily_attributes \"{\\\"family_id\\\":\\\"$FAMILY_ID\\\",\\\"attribute_id\\\":\\\"$VOLTAGE_ID\\\"}\"\n","Create the family",[2415,4089,4090,4111,4155,4159,4207,4244],{"__ignoreMap":2584},[2588,4091,4092,4095,4097,4099,4102,4104,4107,4109],{"class":2590,"line":2591},[2588,4093,4094],{"class":2598},"FAMILY_ID",[2588,4096,3020],{"class":2602},[2588,4098,3282],{"class":2842},[2588,4100,4101],{"class":2609}," \u002Ffamilies",[2588,4103,2910],{"class":2602},[2588,4105,4106],{"class":2609},"{\"code\":\"power_tools\",\"labels\":{\"en\":\"Power tools\"}}",[2588,4108,3036],{"class":2602},[2588,4110,3361],{"class":2602},[2588,4112,4113,4115,4118,4120,4123,4126,4129,4132,4135,4138,4140,4143,4146,4149,4152],{"class":2590,"line":2616},[2588,4114,2747],{"class":2997},[2588,4116,4117],{"class":2602}," \"${",[2588,4119,4094],{"class":2598},[2588,4121,4122],{"class":2602},":?",[2588,4124,4125],{"class":2598},"the",[2588,4127,4128],{"class":2598}," family",[2588,4130,4131],{"class":2598}," was",[2588,4133,4134],{"class":2598}," not",[2588,4136,4137],{"class":2598}," created",[2588,4139,2497],{"class":2609},[2588,4141,4142],{"class":2598},"see",[2588,4144,4145],{"class":2598}," the",[2588,4147,4148],{"class":2598}," error",[2588,4150,4151],{"class":2598}," above",[2588,4153,4154],{"class":2602},"}\"\n",[2588,4156,4157],{"class":2590,"line":2863},[2588,4158,3270],{"emptyLinePlaceholder":3269},[2588,4160,4161,4163,4166,4168,4170,4172,4174,4176,4178,4181,4183,4185,4187,4189,4191,4194,4196,4198,4200,4202,4205],{"class":2590,"line":2881},[2588,4162,2998],{"class":2842},[2588,4164,4165],{"class":2609}," \u002Ffamily_attributes",[2588,4167,2849],{"class":2602},[2588,4169,3586],{"class":2609},[2588,4171,3589],{"class":2598},[2588,4173,2727],{"class":2609},[2588,4175,3589],{"class":2598},[2588,4177,2747],{"class":2609},[2588,4179,4180],{"class":2598},"\\\"$FAMILY_ID\\\"",[2588,4182,3602],{"class":2609},[2588,4184,3589],{"class":2598},[2588,4186,3592],{"class":2609},[2588,4188,3589],{"class":2598},[2588,4190,2747],{"class":2609},[2588,4192,4193],{"class":2598},"\\\"$NAME_ID\\\"",[2588,4195,3602],{"class":2609},[2588,4197,3589],{"class":2598},[2588,4199,4082],{"class":2609},[2588,4201,3589],{"class":2598},[2588,4203,4204],{"class":2609},":true}",[2588,4206,2613],{"class":2602},[2588,4208,4209,4211,4213,4215,4217,4219,4221,4223,4225,4227,4229,4231,4233,4235,4237,4239,4242],{"class":2590,"line":2898},[2588,4210,2998],{"class":2842},[2588,4212,4165],{"class":2609},[2588,4214,2849],{"class":2602},[2588,4216,3586],{"class":2609},[2588,4218,3589],{"class":2598},[2588,4220,2727],{"class":2609},[2588,4222,3589],{"class":2598},[2588,4224,2747],{"class":2609},[2588,4226,4180],{"class":2598},[2588,4228,3602],{"class":2609},[2588,4230,3589],{"class":2598},[2588,4232,3592],{"class":2609},[2588,4234,3589],{"class":2598},[2588,4236,2747],{"class":2609},[2588,4238,3599],{"class":2598},[2588,4240,4241],{"class":2609},"}",[2588,4243,2613],{"class":2602},[2588,4245,4246,4248,4250,4252,4254,4256,4258,4260,4262,4264,4266,4268,4270,4272,4274,4276,4278],{"class":2590,"line":2919},[2588,4247,2998],{"class":2842},[2588,4249,4165],{"class":2609},[2588,4251,2849],{"class":2602},[2588,4253,3586],{"class":2609},[2588,4255,3589],{"class":2598},[2588,4257,2727],{"class":2609},[2588,4259,3589],{"class":2598},[2588,4261,2747],{"class":2609},[2588,4263,4180],{"class":2598},[2588,4265,3602],{"class":2609},[2588,4267,3589],{"class":2598},[2588,4269,3592],{"class":2609},[2588,4271,3589],{"class":2598},[2588,4273,2747],{"class":2609},[2588,4275,3751],{"class":2598},[2588,4277,4241],{"class":2609},[2588,4279,2613],{"class":2602},[2405,4281,4282,4283,2497,4285,4287],{},"Do not mark the axis attributes (",[2415,4284,2956],{},[2415,4286,2959],{},") as required. A required attribute counts against every product of the family, and the model never carries the axis values, so the model would always score as incomplete.",[2636,4289,4291],{"id":4290},"_3-declare-the-variant-structure","3. Declare the variant structure",[2405,4293,4294,4295,4297],{},"A family variant says which attributes a family splits on. Its ",[2415,4296,2415],{}," is unique across the whole tenant, so name it for the family:",[2578,4299,4302],{"className":2580,"code":4300,"filename":4301,"language":2583,"meta":2584,"style":2584},"FAMILY_VARIANT_ID=$(create_id \u002Ffamily_variants \"{\\\"code\\\":\\\"power_tools_by_colour_voltage\\\",\\\"family_id\\\":\\\"$FAMILY_ID\\\",\\\"axes\\\":[\\\"colour\\\",\\\"voltage\\\"]}\")\n: \"${FAMILY_VARIANT_ID:?the family variant was not created, see the error above}\"\n","Declare the axes",[2415,4303,4304,4379],{"__ignoreMap":2584},[2588,4305,4306,4309,4311,4313,4316,4318,4320,4322,4324,4326,4328,4330,4333,4335,4337,4339,4341,4343,4345,4347,4349,4351,4353,4355,4358,4360,4362,4364,4366,4368,4370,4372,4375,4377],{"class":2590,"line":2591},[2588,4307,4308],{"class":2598},"FAMILY_VARIANT_ID",[2588,4310,3020],{"class":2602},[2588,4312,3282],{"class":2842},[2588,4314,4315],{"class":2609}," \u002Ffamily_variants",[2588,4317,2849],{"class":2602},[2588,4319,3586],{"class":2609},[2588,4321,3589],{"class":2598},[2588,4323,2415],{"class":2609},[2588,4325,3589],{"class":2598},[2588,4327,2747],{"class":2609},[2588,4329,3589],{"class":2598},[2588,4331,4332],{"class":2609},"power_tools_by_colour_voltage",[2588,4334,3589],{"class":2598},[2588,4336,3602],{"class":2609},[2588,4338,3589],{"class":2598},[2588,4340,2727],{"class":2609},[2588,4342,3589],{"class":2598},[2588,4344,2747],{"class":2609},[2588,4346,4180],{"class":2598},[2588,4348,3602],{"class":2609},[2588,4350,3589],{"class":2598},[2588,4352,2783],{"class":2609},[2588,4354,3589],{"class":2598},[2588,4356,4357],{"class":2609},":[",[2588,4359,3589],{"class":2598},[2588,4361,2956],{"class":2609},[2588,4363,3589],{"class":2598},[2588,4365,3602],{"class":2609},[2588,4367,3589],{"class":2598},[2588,4369,2959],{"class":2609},[2588,4371,3589],{"class":2598},[2588,4373,4374],{"class":2609},"]}",[2588,4376,2606],{"class":2602},[2588,4378,3361],{"class":2602},[2588,4380,4381,4383,4385,4387,4389,4391,4393,4396,4398,4400,4402,4404,4406,4408,4410,4412],{"class":2590,"line":2616},[2588,4382,2747],{"class":2997},[2588,4384,4117],{"class":2602},[2588,4386,4308],{"class":2598},[2588,4388,4122],{"class":2602},[2588,4390,4125],{"class":2598},[2588,4392,4128],{"class":2598},[2588,4394,4395],{"class":2598}," variant",[2588,4397,4131],{"class":2598},[2588,4399,4134],{"class":2598},[2588,4401,4137],{"class":2598},[2588,4403,2497],{"class":2609},[2588,4405,4142],{"class":2598},[2588,4407,4145],{"class":2598},[2588,4409,4148],{"class":2598},[2588,4411,4151],{"class":2598},[2588,4413,4154],{"class":2602},[2405,4415,4416,4417,4420,4421,4424,4425,4427],{},"A flat list of codes puts both axes on one level. The levelled form, ",[2415,4418,4419],{},"[{\"level\":1,\"axes\":[\"colour\"]},{\"level\":2,\"axes\":[\"voltage\"]}]",", is also read, and is how a catalog with a two-step picker is written (",[2409,4422,1026],{"href":4423},"\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fdata-model#family-variants","). This guide uses the flat form; use the levelled one only when your storefront has the buyer pick one axis before the other. The axes name attributes by ",[2415,4426,2415],{},", not by id.",[2636,4429,4431],{"id":4430},"_4-create-the-model-then-the-variants","4. Create the model, then the variants",[2405,4433,4434,4435,4437],{},"Create the model first. It holds the facts you want kept once, not the axis values. The variants below do not inherit them; a reader that wants the model's description next to a variant reads the model through the variant's ",[2415,4436,2724],{},". A fact that differs per variant, such as an EAN, goes on the variant:",[2578,4439,4442],{"className":2580,"code":4440,"filename":4441,"language":2583,"meta":2584,"style":2584},"MODEL_ID=$(create_id \"\" \"{\n  \\\"sku\\\": \\\"ACME-4711\\\", \\\"kind\\\": \\\"model\\\",\n  \\\"family_id\\\": \\\"$FAMILY_ID\\\", \\\"family_variant_id\\\": \\\"$FAMILY_VARIANT_ID\\\",\n  \\\"attribute_values\\\": { \\\"common\\\": { \\\"name\\\": \\\"ACME cordless drill 4711\\\" } }\n}\")\n: \"${MODEL_ID:?the model was not created, see the error above}\"\n","Create the model",[2415,4443,4444,4461,4498,4525,4562,4570],{"__ignoreMap":2584},[2588,4445,4446,4449,4451,4453,4456,4458],{"class":2590,"line":2591},[2588,4447,4448],{"class":2598},"MODEL_ID",[2588,4450,3020],{"class":2602},[2588,4452,3282],{"class":2842},[2588,4454,4455],{"class":2602}," \"\"",[2588,4457,2849],{"class":2602},[2588,4459,4460],{"class":2609},"{\n",[2588,4462,4463,4466,4468,4470,4472,4474,4477,4479,4481,4483,4485,4487,4489,4491,4493,4495],{"class":2590,"line":2616},[2588,4464,4465],{"class":2598},"  \\\"",[2588,4467,2718],{"class":2609},[2588,4469,3589],{"class":2598},[2588,4471,3896],{"class":2609},[2588,4473,3589],{"class":2598},[2588,4475,4476],{"class":2609},"ACME-4711",[2588,4478,3589],{"class":2598},[2588,4480,2497],{"class":2609},[2588,4482,3589],{"class":2598},[2588,4484,2721],{"class":2609},[2588,4486,3589],{"class":2598},[2588,4488,3896],{"class":2609},[2588,4490,3589],{"class":2598},[2588,4492,2760],{"class":2609},[2588,4494,3589],{"class":2598},[2588,4496,4497],{"class":2609},",\n",[2588,4499,4500,4502,4504,4506,4508,4510,4512,4514,4516,4518,4520,4523],{"class":2590,"line":2863},[2588,4501,4465],{"class":2598},[2588,4503,2727],{"class":2609},[2588,4505,3589],{"class":2598},[2588,4507,3896],{"class":2609},[2588,4509,4180],{"class":2598},[2588,4511,2497],{"class":2609},[2588,4513,3589],{"class":2598},[2588,4515,2730],{"class":2609},[2588,4517,3589],{"class":2598},[2588,4519,3896],{"class":2609},[2588,4521,4522],{"class":2598},"\\\"$FAMILY_VARIANT_ID\\\"",[2588,4524,4497],{"class":2609},[2588,4526,4527,4529,4531,4533,4536,4538,4540,4542,4544,4546,4548,4550,4552,4554,4557,4559],{"class":2590,"line":2881},[2588,4528,4465],{"class":2598},[2588,4530,4036],{"class":2609},[2588,4532,3589],{"class":2598},[2588,4534,4535],{"class":2609},": { ",[2588,4537,3589],{"class":2598},[2588,4539,4040],{"class":2609},[2588,4541,3589],{"class":2598},[2588,4543,4535],{"class":2609},[2588,4545,3589],{"class":2598},[2588,4547,2797],{"class":2609},[2588,4549,3589],{"class":2598},[2588,4551,3896],{"class":2609},[2588,4553,3589],{"class":2598},[2588,4555,4556],{"class":2609},"ACME cordless drill 4711",[2588,4558,3589],{"class":2598},[2588,4560,4561],{"class":2609}," } }\n",[2588,4563,4564,4566,4568],{"class":2590,"line":2898},[2588,4565,4241],{"class":2609},[2588,4567,2606],{"class":2602},[2588,4569,3361],{"class":2602},[2588,4571,4572,4574,4576,4578,4580,4582,4585,4587,4589,4591,4593,4595,4597,4599,4601],{"class":2590,"line":2919},[2588,4573,2747],{"class":2997},[2588,4575,4117],{"class":2602},[2588,4577,4448],{"class":2598},[2588,4579,4122],{"class":2602},[2588,4581,4125],{"class":2598},[2588,4583,4584],{"class":2598}," model",[2588,4586,4131],{"class":2598},[2588,4588,4134],{"class":2598},[2588,4590,4137],{"class":2598},[2588,4592,2497],{"class":2609},[2588,4594,4142],{"class":2598},[2588,4596,4145],{"class":2598},[2588,4598,4148],{"class":2598},[2588,4600,4151],{"class":2598},[2588,4602,4154],{"class":2602},[2405,4604,4605,4606,4608,4609,4611,4612,4614],{},"Each variant has its own SKU, points at the model with ",[2415,4607,2724],{},", and carries the axis values. Send ",[2415,4610,2727],{}," as well as ",[2415,4613,2730],{},": the tenant's default family (a Products app setting, see the end of step 7) is applied only when neither is sent, so a variant created with a variant structure alone gets no family. This loop creates all four combinations:",[2578,4616,4619],{"className":2580,"code":4617,"filename":4618,"language":2583,"meta":2584,"style":2584},"for colour in black red; do\n  for voltage in 12v 18v; do\n    case $colour in black) c=BLK;; red) c=RED;; esac\n    sku=\"ACME-4711-$c-$(echo $voltage | tr a-z A-Z)\"\n    row=$(create \"\" \"{\n      \\\"sku\\\": \\\"$sku\\\", \\\"kind\\\": \\\"variant\\\", \\\"parent_id\\\": \\\"$MODEL_ID\\\",\n      \\\"family_id\\\": \\\"$FAMILY_ID\\\", \\\"family_variant_id\\\": \\\"$FAMILY_VARIANT_ID\\\",\n      \\\"attribute_values\\\": { \\\"common\\\": { \\\"name\\\": \\\"ACME cordless drill 4711, $colour, $voltage\\\", \\\"colour\\\": \\\"$colour\\\", \\\"voltage\\\": \\\"$voltage\\\" } }\n    }\") || break 2\n    printf '%s\\n' \"$row\" | jq -r '[.sku, .id] | @tsv'\n  done\ndone\n","Create the four variants",[2415,4620,4621,4640,4660,4701,4739,4754,4799,4825,4892,4909,4938,4943],{"__ignoreMap":2584},[2588,4622,4623,4625,4628,4630,4633,4636,4638],{"class":2590,"line":2591},[2588,4624,2816],{"class":2815},[2588,4626,4627],{"class":2598}," colour ",[2588,4629,2822],{"class":2815},[2588,4631,4632],{"class":2609}," black",[2588,4634,4635],{"class":2609}," red",[2588,4637,2834],{"class":2602},[2588,4639,2837],{"class":2815},[2588,4641,4642,4645,4648,4650,4653,4656,4658],{"class":2590,"line":2616},[2588,4643,4644],{"class":2815},"  for",[2588,4646,4647],{"class":2598}," voltage ",[2588,4649,2822],{"class":2815},[2588,4651,4652],{"class":2609}," 12v",[2588,4654,4655],{"class":2609}," 18v",[2588,4657,2834],{"class":2602},[2588,4659,2837],{"class":2815},[2588,4661,4662,4665,4668,4670,4672,4674,4677,4679,4682,4685,4687,4689,4691,4693,4696,4698],{"class":2590,"line":2863},[2588,4663,4664],{"class":2815},"    case",[2588,4666,4667],{"class":2598}," $colour ",[2588,4669,2822],{"class":2815},[2588,4671,4632],{"class":2609},[2588,4673,3108],{"class":2602},[2588,4675,4676],{"class":2598}," c",[2588,4678,2603],{"class":2602},[2588,4680,4681],{"class":2609},"BLK",[2588,4683,4684],{"class":2602},";;",[2588,4686,4635],{"class":2609},[2588,4688,3108],{"class":2602},[2588,4690,4676],{"class":2598},[2588,4692,2603],{"class":2602},[2588,4694,4695],{"class":2609},"RED",[2588,4697,4684],{"class":2602},[2588,4699,4700],{"class":2815}," esac\n",[2588,4702,4703,4706,4708,4710,4713,4716,4719,4722,4725,4728,4730,4733,4736],{"class":2590,"line":2881},[2588,4704,4705],{"class":2598},"    sku",[2588,4707,2603],{"class":2602},[2588,4709,2606],{"class":2602},[2588,4711,4712],{"class":2609},"ACME-4711-",[2588,4714,4715],{"class":2598},"$c",[2588,4717,4718],{"class":2609},"-",[2588,4720,4721],{"class":2602},"$(",[2588,4723,4724],{"class":2997},"echo",[2588,4726,4727],{"class":2598}," $voltage",[2588,4729,3347],{"class":2602},[2588,4731,4732],{"class":2842}," tr",[2588,4734,4735],{"class":2609}," a-z A-Z",[2588,4737,4738],{"class":2602},")\"\n",[2588,4740,4741,4744,4746,4748,4750,4752],{"class":2590,"line":2898},[2588,4742,4743],{"class":2598},"    row",[2588,4745,3020],{"class":2602},[2588,4747,2998],{"class":2842},[2588,4749,4455],{"class":2602},[2588,4751,2849],{"class":2602},[2588,4753,4460],{"class":2609},[2588,4755,4756,4759,4761,4763,4765,4768,4770,4772,4774,4776,4778,4780,4782,4784,4786,4788,4790,4792,4794,4797],{"class":2590,"line":2919},[2588,4757,4758],{"class":2598},"      \\\"",[2588,4760,2718],{"class":2609},[2588,4762,3589],{"class":2598},[2588,4764,3896],{"class":2609},[2588,4766,4767],{"class":2598},"\\\"$sku\\\"",[2588,4769,2497],{"class":2609},[2588,4771,3589],{"class":2598},[2588,4773,2721],{"class":2609},[2588,4775,3589],{"class":2598},[2588,4777,3896],{"class":2609},[2588,4779,3589],{"class":2598},[2588,4781,2766],{"class":2609},[2588,4783,3589],{"class":2598},[2588,4785,2497],{"class":2609},[2588,4787,3589],{"class":2598},[2588,4789,2724],{"class":2609},[2588,4791,3589],{"class":2598},[2588,4793,3896],{"class":2609},[2588,4795,4796],{"class":2598},"\\\"$MODEL_ID\\\"",[2588,4798,4497],{"class":2609},[2588,4800,4801,4803,4805,4807,4809,4811,4813,4815,4817,4819,4821,4823],{"class":2590,"line":3086},[2588,4802,4758],{"class":2598},[2588,4804,2727],{"class":2609},[2588,4806,3589],{"class":2598},[2588,4808,3896],{"class":2609},[2588,4810,4180],{"class":2598},[2588,4812,2497],{"class":2609},[2588,4814,3589],{"class":2598},[2588,4816,2730],{"class":2609},[2588,4818,3589],{"class":2598},[2588,4820,3896],{"class":2609},[2588,4822,4522],{"class":2598},[2588,4824,4497],{"class":2609},[2588,4826,4827,4829,4831,4833,4835,4837,4839,4841,4843,4845,4847,4849,4851,4853,4856,4859,4861,4864,4866,4868,4870,4872,4874,4877,4879,4881,4883,4885,4887,4890],{"class":2590,"line":3121},[2588,4828,4758],{"class":2598},[2588,4830,4036],{"class":2609},[2588,4832,3589],{"class":2598},[2588,4834,4535],{"class":2609},[2588,4836,3589],{"class":2598},[2588,4838,4040],{"class":2609},[2588,4840,3589],{"class":2598},[2588,4842,4535],{"class":2609},[2588,4844,3589],{"class":2598},[2588,4846,2797],{"class":2609},[2588,4848,3589],{"class":2598},[2588,4850,3896],{"class":2609},[2588,4852,3589],{"class":2598},[2588,4854,4855],{"class":2609},"ACME cordless drill 4711, ",[2588,4857,4858],{"class":2598},"$colour",[2588,4860,2497],{"class":2609},[2588,4862,4863],{"class":2598},"$voltage\\\"",[2588,4865,2497],{"class":2609},[2588,4867,3589],{"class":2598},[2588,4869,2956],{"class":2609},[2588,4871,3589],{"class":2598},[2588,4873,3896],{"class":2609},[2588,4875,4876],{"class":2598},"\\\"$colour\\\"",[2588,4878,2497],{"class":2609},[2588,4880,3589],{"class":2598},[2588,4882,2959],{"class":2609},[2588,4884,3589],{"class":2598},[2588,4886,3896],{"class":2609},[2588,4888,4889],{"class":2598},"\\\"$voltage\\\"",[2588,4891,4561],{"class":2609},[2588,4893,4894,4897,4899,4901,4903,4906],{"class":2590,"line":3147},[2588,4895,4896],{"class":2609},"    }",[2588,4898,2606],{"class":2602},[2588,4900,3108],{"class":2602},[2588,4902,3111],{"class":2602},[2588,4904,4905],{"class":2815}," break",[2588,4907,4908],{"class":3117}," 2\n",[2588,4910,4911,4913,4915,4917,4919,4921,4923,4925,4927,4929,4931,4933,4936],{"class":2590,"line":3168},[2588,4912,3411],{"class":2997},[2588,4914,2910],{"class":2602},[2588,4916,3196],{"class":2609},[2588,4918,3036],{"class":2602},[2588,4920,2849],{"class":2602},[2588,4922,3342],{"class":2598},[2588,4924,2606],{"class":2602},[2588,4926,3347],{"class":2602},[2588,4928,2904],{"class":2842},[2588,4930,2907],{"class":2609},[2588,4932,2910],{"class":2602},[2588,4934,4935],{"class":2609},"[.sku, .id] | @tsv",[2588,4937,2916],{"class":2602},[2588,4939,4940],{"class":2590,"line":3180},[2588,4941,4942],{"class":2815},"  done\n",[2588,4944,4945],{"class":2590,"line":3211},[2588,4946,2922],{"class":2815},[2405,4948,4949,4950,4952,4953,4956,4957,4959,4960,4963,4964,4967],{},"Each line of output is a SKU and its new id; a failed create prints the error and stops the loop. A SKU is unique across the tenant and a repeat answers ",[2415,4951,2966],{}," with ",[2415,4954,4955],{},"code: unique_violation",". Nothing checks that ",[2415,4958,2724],{}," names a model, that the axis values are set, or that two siblings differ, so a variant with no colour is accepted. Completeness does not report it either: it counts only attributes the family marks required, and the axes must not be (step 2). Step 5 is the check that catches it. The products are created enabled, so they are live, unless the ",[2415,4961,4962],{},"new_products_enabled_by_default"," setting is off for the tenant or the body sends ",[2415,4965,4966],{},"enabled: false"," (see the end of step 7).",[2636,4969,4971],{"id":4970},"_5-check-how-the-variants-show-up","5. Check how the variants show up",[2405,4973,4974,4977,4978,4981,4982,4985,4986,4988,4989,4992,4993,4997,4998,2534,5000,5002,5003,5006,5007,5009,5010,5013,5014,5017],{},[2415,4975,4976],{},"GET \u002Fv1\u002Fproducts"," returns every kind as rows and leaves trashed rows out. Add ",[2415,4979,4980],{},"trashed=include"," to get them too (then skip any row whose ",[2415,4983,4984],{},"deleted_at"," is set, as the ",[2415,4987,2575],{}," filter below does), or ",[2415,4990,4991],{},"trashed=only"," to read the trash on its own (",[2409,4994,4996],{"href":4995},"\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fproducts#trash-and-restore","trash and restore","). A storefront finds a model's variants by filtering on the model's id, because there is no separate children route. ",[2415,4999,2724],{},[2415,5001,2718],{}," are exact-match filters, and ",[2415,5004,5005],{},"order"," sorts by one column (",[2409,5008,525],{"href":526},"). A page holds at most 200 rows, so ",[2415,5011,5012],{},"limit=200"," asks for the most, and a model with more variants than that needs ",[2415,5015,5016],{},"offset"," for the rest.",[2405,5019,4022,5020,5022,5023,5026,5027,4048,5029,5031,5032,5035],{},[2415,5021,2575],{}," filter also prints each variant's axis values, read from ",[2415,5024,5025],{},"attribute_values.common"," because neither attribute is ",[2415,5028,4057],{},[2415,5030,4060],{},", and prints ",[2415,5033,5034],{},"MISSING"," for one that was never set:",[2578,5037,5040],{"className":2580,"code":5038,"filename":5039,"language":2583,"meta":2584,"style":2584},"curl -s \"https:\u002F\u002Fapi.revenexx.com\u002Fv1\u002Fproducts?parent_id=$MODEL_ID&order=sku&limit=200\" \\\n  -H \"X-Revenexx-Tenant: $REVENEXX_TENANT\" \\\n  -H \"X-Revenexx-Api-Key: $REVENEXX_API_KEY\" \\\n  | jq -r '.items[] | select(.deleted_at == null)\n      | [.sku, .kind, (.attribute_values.common.colour \u002F\u002F \"MISSING\"), (.attribute_values.common.voltage \u002F\u002F \"MISSING\")] | @tsv'\n","A model's variants",[2415,5041,5042,5063,5077,5091,5104],{"__ignoreMap":2584},[2588,5043,5044,5046,5048,5050,5053,5056,5059,5061],{"class":2590,"line":2591},[2588,5045,2572],{"class":2842},[2588,5047,2846],{"class":2609},[2588,5049,2849],{"class":2602},[2588,5051,5052],{"class":2609},"https:\u002F\u002Fapi.revenexx.com\u002Fv1\u002Fproducts?parent_id=",[2588,5054,5055],{"class":2598},"$MODEL_ID",[2588,5057,5058],{"class":2609},"&order=sku&limit=200",[2588,5060,2606],{"class":2602},[2588,5062,2860],{"class":2598},[2588,5064,5065,5067,5069,5071,5073,5075],{"class":2590,"line":2616},[2588,5066,3956],{"class":2609},[2588,5068,2849],{"class":2602},[2588,5070,2871],{"class":2609},[2588,5072,2874],{"class":2598},[2588,5074,2606],{"class":2602},[2588,5076,2860],{"class":2598},[2588,5078,5079,5081,5083,5085,5087,5089],{"class":2590,"line":2863},[2588,5080,3956],{"class":2609},[2588,5082,2849],{"class":2602},[2588,5084,2888],{"class":2609},[2588,5086,2891],{"class":2598},[2588,5088,2606],{"class":2602},[2588,5090,2860],{"class":2598},[2588,5092,5093,5095,5097,5099,5101],{"class":2590,"line":2881},[2588,5094,3985],{"class":2602},[2588,5096,2904],{"class":2842},[2588,5098,2907],{"class":2609},[2588,5100,2910],{"class":2602},[2588,5102,5103],{"class":2609},".items[] | select(.deleted_at == null)\n",[2588,5105,5106,5109],{"class":2590,"line":2898},[2588,5107,5108],{"class":2609},"      | [.sku, .kind, (.attribute_values.common.colour \u002F\u002F \"MISSING\"), (.attribute_values.common.voltage \u002F\u002F \"MISSING\")] | @tsv",[2588,5110,2916],{"class":2602},[2578,5112,5117],{"className":5113,"code":5115,"filename":5116,"language":2952,"meta":2584},[5114],"language-text","ACME-4711-BLK-12V   variant black   12v\nACME-4711-BLK-18V   variant black   18v\nACME-4711-RED-12V   variant red 12v\nACME-4711-RED-18V   variant red 18v\n","Response",[2415,5118,5115],{"__ignoreMap":2584},[2405,5120,5121,5122,5124,5125,5127],{},"A ",[2415,5123,5034],{}," in either column is a variant without an axis value. Set it with the read-merge-write call in step 7, with the right values in its ",[2415,5126,2575],{}," filter.",[2405,5129,5130,5131,5134,5135,2534,5137,5139,5140,5142,5143,5145,5146,5148,5149,5152,5153,5156,5157,5159,5160,5163,5164,5167,5168,2449],{},"The list the Cockpit shows, ",[2415,5132,5133],{},"GET \u002Fv1\u002Fproducts\u002Fgrid",", filters on ",[2415,5136,2721],{},[2415,5138,2727],{},", one value of each per call. The rows you sell are the ",[2415,5141,2754],{}," and the ",[2415,5144,2766],{}," ones (a ",[2415,5147,2760],{}," is not sold, by convention), so ask once with ",[2415,5150,5151],{},"?kind=variant"," and, if the catalog also holds standalone products, once with ",[2415,5154,5155],{},"?kind=simple","; in this guide's catalog every sellable row is a variant. The grid does not return ",[2415,5158,2724],{},". To read a family's field list, call ",[2415,5161,5162],{},"GET \u002Fv1\u002Fproducts\u002Fattribute-schema?family_code=power_tools&kind=model","; with ",[2415,5165,5166],{},"kind=model"," the axis fields come back read-only, which is a hint to a form and not a rule of the API (",[2409,5169,1369],{"href":1370},[2636,5171,5173],{"id":5172},"_6-check-completeness","6. Check completeness",[2405,5175,5176],{},"Completeness measures a product against the attributes its family marks required, and stores the result on the product. It is measured when you ask, not when you write:",[2578,5178,5181],{"className":2580,"code":5179,"filename":5180,"language":2583,"meta":2584,"style":2584},"VARIANT_PRODUCT_ID=$(curl -s \"https:\u002F\u002Fapi.revenexx.com\u002Fv1\u002Fproducts?sku=ACME-4711-BLK-18V\" \\\n  -H \"X-Revenexx-Tenant: $REVENEXX_TENANT\" -H \"X-Revenexx-Api-Key: $REVENEXX_API_KEY\" | jq -r '.items[0].id \u002F\u002F empty')\n: \"${VARIANT_PRODUCT_ID:?no product with that SKU: create the variants in step 4 first}\"\n\ncurl -s -X POST \"https:\u002F\u002Fapi.revenexx.com\u002Fv1\u002Fproducts\u002F$VARIANT_PRODUCT_ID\u002Fcompleteness\" \\\n  -H \"X-Revenexx-Tenant: $REVENEXX_TENANT\" \\\n  -H \"X-Revenexx-Api-Key: $REVENEXX_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" -d '{}'\n","Measure a variant",[2415,5182,5183,5203,5241,5290,5294,5319,5333,5347],{"__ignoreMap":2584},[2588,5184,5185,5188,5190,5192,5194,5196,5199,5201],{"class":2590,"line":2591},[2588,5186,5187],{"class":2598},"VARIANT_PRODUCT_ID",[2588,5189,3020],{"class":2602},[2588,5191,2572],{"class":2842},[2588,5193,2846],{"class":2609},[2588,5195,2849],{"class":2602},[2588,5197,5198],{"class":2609},"https:\u002F\u002Fapi.revenexx.com\u002Fv1\u002Fproducts?sku=ACME-4711-BLK-18V",[2588,5200,2606],{"class":2602},[2588,5202,2860],{"class":2598},[2588,5204,5205,5207,5209,5211,5213,5215,5218,5220,5222,5224,5226,5228,5230,5232,5234,5237,5239],{"class":2590,"line":2616},[2588,5206,3956],{"class":2609},[2588,5208,2849],{"class":2602},[2588,5210,2871],{"class":2609},[2588,5212,2874],{"class":2598},[2588,5214,2606],{"class":2602},[2588,5216,5217],{"class":2609}," -H",[2588,5219,2849],{"class":2602},[2588,5221,2888],{"class":2609},[2588,5223,2891],{"class":2598},[2588,5225,2606],{"class":2602},[2588,5227,3347],{"class":2602},[2588,5229,2904],{"class":2842},[2588,5231,2907],{"class":2609},[2588,5233,2910],{"class":2602},[2588,5235,5236],{"class":2609},".items[0].id \u002F\u002F empty",[2588,5238,3036],{"class":2602},[2588,5240,3361],{"class":2602},[2588,5242,5243,5245,5247,5249,5251,5254,5257,5260,5263,5266,5268,5271,5273,5276,5279,5282,5285,5288],{"class":2590,"line":2863},[2588,5244,2747],{"class":2997},[2588,5246,4117],{"class":2602},[2588,5248,5187],{"class":2598},[2588,5250,4122],{"class":2602},[2588,5252,5253],{"class":2598},"no",[2588,5255,5256],{"class":2598}," product",[2588,5258,5259],{"class":2598}," with",[2588,5261,5262],{"class":2598}," that",[2588,5264,5265],{"class":2598}," SKU",[2588,5267,2747],{"class":2602},[2588,5269,5270],{"class":2598}," create",[2588,5272,4145],{"class":2598},[2588,5274,5275],{"class":2598}," variants",[2588,5277,5278],{"class":2598}," in",[2588,5280,5281],{"class":2598}," step",[2588,5283,5284],{"class":2598}," 4",[2588,5286,5287],{"class":2598}," first",[2588,5289,4154],{"class":2602},[2588,5291,5292],{"class":2590,"line":2881},[2588,5293,3270],{"emptyLinePlaceholder":3269},[2588,5295,5296,5298,5300,5302,5304,5306,5309,5312,5315,5317],{"class":2590,"line":2898},[2588,5297,2572],{"class":2842},[2588,5299,2846],{"class":2609},[2588,5301,3039],{"class":2609},[2588,5303,3042],{"class":2609},[2588,5305,2849],{"class":2602},[2588,5307,5308],{"class":2609},"https:\u002F\u002Fapi.revenexx.com\u002Fv1\u002Fproducts\u002F",[2588,5310,5311],{"class":2598},"$VARIANT_PRODUCT_ID",[2588,5313,5314],{"class":2609},"\u002Fcompleteness",[2588,5316,2606],{"class":2602},[2588,5318,2860],{"class":2598},[2588,5320,5321,5323,5325,5327,5329,5331],{"class":2590,"line":2919},[2588,5322,3956],{"class":2609},[2588,5324,2849],{"class":2602},[2588,5326,2871],{"class":2609},[2588,5328,2874],{"class":2598},[2588,5330,2606],{"class":2602},[2588,5332,2860],{"class":2598},[2588,5334,5335,5337,5339,5341,5343,5345],{"class":2590,"line":3086},[2588,5336,3956],{"class":2609},[2588,5338,2849],{"class":2602},[2588,5340,2888],{"class":2609},[2588,5342,2891],{"class":2598},[2588,5344,2606],{"class":2602},[2588,5346,2860],{"class":2598},[2588,5348,5349,5351,5353,5355,5357,5359,5361,5364],{"class":2590,"line":3121},[2588,5350,3956],{"class":2609},[2588,5352,2849],{"class":2602},[2588,5354,3093],{"class":2609},[2588,5356,2606],{"class":2602},[2588,5358,3098],{"class":2609},[2588,5360,2910],{"class":2602},[2588,5362,5363],{"class":2609},"{}",[2588,5365,2916],{"class":2602},[2405,5367,5368,5369,2497,5372,2534,5374,2558,5376,5379,5380,2497,5383,2497,5386,5389,5390,5393,5394,5397,5398,5400,5401,5404,5405,5407],{},"The answer carries the product's ",[2415,5370,5371],{},"id",[2415,5373,2718],{},[2415,5375,2727],{},[2415,5377,5378],{},"completeness"," object with ",[2415,5381,5382],{},"required",[2415,5384,5385],{},"filled",[2415,5387,5388],{},"ratio",", the ",[2415,5391,5392],{},"missing"," codes and ",[2415,5395,5396],{},"computed_at",". A family that requires nothing scores 1. A product reads only its own values, and so does every read of it: a variant does not inherit the model's, so if ",[2415,5399,2797],{}," is required, every variant needs its own. Run the measure again after a bulk change, because nothing recomputes it for you. A product with no family answers ",[2415,5402,5403],{},"400"," on this call, and its stored completeness is ",[2415,5406,3923],{}," rather than 0.",[2636,5409,5411],{"id":5410},"_7-what-a-flat-import-looks-like-and-how-to-repair-it","7. What a flat import looks like, and how to repair it",[2405,5413,5414,5415,2484,5418,5420,5421,2497,5424,5426],{},"If the import ran before the model, the products are bare, and what \"bare\" means depends on the file. Any file import through ",[2415,5416,5417],{},"\u002Fv1\u002Fio",[2409,5419,1380],{"href":1381},") writes rows and nothing else, so the tenant defaults (",[2415,5422,5423],{},"default_product_family",[2415,5425,4962],{},") apply to none of them.",[2423,5428,5429,5457],{},[2426,5430,5431,5434,5435,5437,5438,5440,5441,5443,5444,5446,5447,5450,5451,2534,5453,5456],{},[2429,5432,5433],{},"BMECAT"," (the XML catalog format many suppliers publish; see ",[2409,5436,277],{"href":278},") writes each article as a ",[2415,5439,2754],{}," product with ",[2415,5442,2733],{}," true and no parent. The import engine has no family handling at all, so treat every product it writes as having no family. It writes feature values, the EAN and the units under ",[2415,5445,5025],{},", and the short and long descriptions under ",[2415,5448,5449],{},"locale_specific.\u003Clocale>"," as ",[2415,5452,2797],{},[2415,5454,5455],{},"description",". It also discovers attributes from the feed without linking them to any family. The BMECAT feed has no variant mapping.",[2426,5458,5459,5465,5466,2497,5468,2497,5470,2534,5472,5474,5475,5477,5478,2534,5480,5482],{},[2429,5460,5461,5462,5464],{},"CSV and the other ",[2415,5463,5417],{}," formats"," write the columns you give them, so a row can carry ",[2415,5467,2721],{},[2415,5469,2724],{},[2415,5471,2727],{},[2415,5473,2730],{},", but only as raw values and ids that already exist. A column you leave out takes the database default: ",[2415,5476,2721],{}," is ",[2415,5479,2754],{},[2415,5481,2733],{}," is true, so an imported product is live unless the file says otherwise.",[2405,5484,5485,5486,5488,5489,5491],{},"Either way, an imported catalog looks full in the grid, and a product with no family has a ",[2415,5487,3923],{}," completeness until one is assigned. Check ",[2415,5490,2727],{}," on a few products before you rely on it.",[2405,5493,5494,5495,5497,5498,5500,5501,5503,5504,5506,5507,5509,5510,5512,5513,5515,5516,5518],{},"The buckets need no repair. Completeness and the display name look in every bucket, ",[2415,5496,4040],{}," first and then ",[2415,5499,4044],{},", whatever the attribute's ",[2415,5502,4057],{}," flag says. So a ",[2415,5505,2797],{}," that BMECAT wrote under ",[2415,5508,5449],{}," counts as filled for the required ",[2415,5511,2797],{}," of step 2, and nothing has to be moved. A ",[2415,5514,2797],{}," you later write under ",[2415,5517,4040],{}," is read first and wins.",[2405,5520,5521,5522,2497,5524,4048,5527,5530,5531,5533],{},"To repair it, build the model as above, then move the products onto it. Start with step 1's check: the import discovers attributes from the feed and types them from the values (",[2415,5523,2952],{},[2415,5525,5526],{},"number",[2415,5528,5529],{},"metric","), so a code like ",[2415,5532,2959],{}," may already exist as a number and not as the select this guide needs.",[5535,5536,5537,5619],"ol",{},[2426,5538,5539,5540,5608,5611,5612,5614,5615,5618],{},"Assign the family to each product, which also measures completeness in the same call:",[2578,5541,5544],{"className":2580,"code":5542,"filename":5543,"language":2583,"meta":2584,"style":2584},"curl -s -X POST \"https:\u002F\u002Fapi.revenexx.com\u002Fv1\u002Fproducts\u002F\u003CPRODUCT_ID>\u002Ffamily\" \\\n  -H \"X-Revenexx-Tenant: $REVENEXX_TENANT\" -H \"X-Revenexx-Api-Key: $REVENEXX_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" -d '{ \"family_code\": \"power_tools\" }'\n","Assign a family",[2415,5545,5546,5565,5589],{"__ignoreMap":2584},[2588,5547,5548,5550,5552,5554,5556,5558,5561,5563],{"class":2590,"line":2591},[2588,5549,2572],{"class":2842},[2588,5551,2846],{"class":2609},[2588,5553,3039],{"class":2609},[2588,5555,3042],{"class":2609},[2588,5557,2849],{"class":2602},[2588,5559,5560],{"class":2609},"https:\u002F\u002Fapi.revenexx.com\u002Fv1\u002Fproducts\u002F\u003CPRODUCT_ID>\u002Ffamily",[2588,5562,2606],{"class":2602},[2588,5564,2860],{"class":2598},[2588,5566,5567,5569,5571,5573,5575,5577,5579,5581,5583,5585,5587],{"class":2590,"line":2616},[2588,5568,3956],{"class":2609},[2588,5570,2849],{"class":2602},[2588,5572,2871],{"class":2609},[2588,5574,2874],{"class":2598},[2588,5576,2606],{"class":2602},[2588,5578,5217],{"class":2609},[2588,5580,2849],{"class":2602},[2588,5582,2888],{"class":2609},[2588,5584,2891],{"class":2598},[2588,5586,2606],{"class":2602},[2588,5588,2860],{"class":2598},[2588,5590,5591,5593,5595,5597,5599,5601,5603,5606],{"class":2590,"line":2863},[2588,5592,3956],{"class":2609},[2588,5594,2849],{"class":2602},[2588,5596,3093],{"class":2609},[2588,5598,2606],{"class":2602},[2588,5600,3098],{"class":2609},[2588,5602,2910],{"class":2602},[2588,5604,5605],{"class":2609},"{ \"family_code\": \"power_tools\" }",[2588,5607,2916],{"class":2602},[5609,5610],"br",{},"The call changes only the family; it deletes no values. A value for an attribute outside the new family stays in ",[2415,5613,4036],{},", but it is hidden: the family's field list (",[2415,5616,5617],{},"attribute-schema",") does not show it and completeness does not count it.",[2426,5620,5621,5622,5624,5625,5627,5628,2497,5630,2497,5632,2534,5634,5636,5637,5652,5654,5655,5658,5659,2497,5661,2534,5663,5665,5666,5668,5669,5980,4022,5982,5985,5986,5988,5989,5991,5992,5995,5996,5998,5999,6001],{},"For products that should become variants, create the model first, then update each product to point at it and set its axis values. This update sets ",[2415,5623,2727],{}," itself, so such a product does not need the call in item 1; unlike item 1 it does not measure completeness, so run the measure (step 6) afterwards. Do this after your last BMECAT import: a re-import replaces each existing product's ",[2415,5626,4036],{}," with the feed's, which erases axis values you set (",[2415,5629,2721],{},[2415,5631,2724],{},[2415,5633,2727],{},[2415,5635,2733],{}," stay).",[5638,5639,5640,5643,5644,2497,5646,5648,5649,5651],"warning",{},[2415,5641,5642],{},"PUT"," changes only the fields the body names, so ",[2415,5645,2718],{},[2415,5647,2733],{}," and the rest stay as they are. ",[2415,5650,4036],{}," counts as one field and is replaced as a whole: any value you leave out of the body is deleted, and no call brings it back. Never send a body with only the axis values. Read the product, merge your axis values into what it holds, and send the merged body.",[5609,5653],{},"This reads, merges and writes in one go. Set ",[2415,5656,5657],{},"PRODUCT_ID"," below, make sure ",[2415,5660,4448],{},[2415,5662,4094],{},[2415,5664,4308],{}," hold the real ids, and put the product's own colour and voltage in the ",[2415,5667,2575],{}," filter:",[2578,5670,5673],{"className":2580,"code":5671,"filename":5672,"language":2583,"meta":2584,"style":2584},"PRODUCT_ID=\"\u003CPRODUCT_ID>\"\n: \"${MODEL_ID:?set MODEL_ID to the id of the model}\" \"${FAMILY_ID:?set FAMILY_ID to the id of the family}\" \\\n  \"${FAMILY_VARIANT_ID:?set FAMILY_VARIANT_ID to the id of the family variant}\" &&\nBODY=$(curl -sS \"https:\u002F\u002Fapi.revenexx.com\u002Fv1\u002Fproducts\u002F$PRODUCT_ID\" \\\n  -H \"X-Revenexx-Tenant: $REVENEXX_TENANT\" -H \"X-Revenexx-Api-Key: $REVENEXX_API_KEY\" \\\n  | jq -c --arg model \"$MODEL_ID\" --arg family \"$FAMILY_ID\" --arg fv \"$FAMILY_VARIANT_ID\" '\n      select(.id != null) | {\n        kind: \"variant\", parent_id: $model, family_id: $family, family_variant_id: $fv,\n        attribute_values: ((.attribute_values \u002F\u002F {}) * { common: { colour: \"black\", voltage: \"18v\" } })\n      }') && [ -n \"$BODY\" ] &&\ncurl -sS -X PUT \"https:\u002F\u002Fapi.revenexx.com\u002Fv1\u002Fproducts\u002F$PRODUCT_ID\" \\\n  -H \"X-Revenexx-Tenant: $REVENEXX_TENANT\" -H \"X-Revenexx-Api-Key: $REVENEXX_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" -d \"$BODY\"\n","Read, merge, write",[2415,5674,5675,5688,5749,5782,5804,5828,5874,5879,5884,5889,5917,5938,5962],{"__ignoreMap":2584},[2588,5676,5677,5679,5681,5683,5686],{"class":2590,"line":2591},[2588,5678,5657],{"class":2598},[2588,5680,2603],{"class":2602},[2588,5682,2606],{"class":2602},[2588,5684,5685],{"class":2609},"\u003CPRODUCT_ID>",[2588,5687,2613],{"class":2602},[2588,5689,5690,5692,5694,5696,5698,5701,5704,5707,5709,5712,5715,5717,5719,5722,5724,5726,5728,5730,5733,5735,5737,5739,5741,5743,5745,5747],{"class":2590,"line":2616},[2588,5691,2747],{"class":2997},[2588,5693,4117],{"class":2602},[2588,5695,4448],{"class":2598},[2588,5697,4122],{"class":2602},[2588,5699,5700],{"class":2598},"set",[2588,5702,5703],{"class":2598}," MODEL_ID",[2588,5705,5706],{"class":2598}," to",[2588,5708,4145],{"class":2598},[2588,5710,5711],{"class":2598}," id",[2588,5713,5714],{"class":2598}," of",[2588,5716,4145],{"class":2598},[2588,5718,4584],{"class":2598},[2588,5720,5721],{"class":2602},"}\"",[2588,5723,4117],{"class":2602},[2588,5725,4094],{"class":2598},[2588,5727,4122],{"class":2602},[2588,5729,5700],{"class":2598},[2588,5731,5732],{"class":2598}," FAMILY_ID",[2588,5734,5706],{"class":2598},[2588,5736,4145],{"class":2598},[2588,5738,5711],{"class":2598},[2588,5740,5714],{"class":2598},[2588,5742,4145],{"class":2598},[2588,5744,4128],{"class":2598},[2588,5746,5721],{"class":2602},[2588,5748,2860],{"class":2598},[2588,5750,5751,5754,5756,5758,5760,5763,5765,5767,5769,5771,5773,5775,5777,5779],{"class":2590,"line":2863},[2588,5752,5753],{"class":2602},"  \"${",[2588,5755,4308],{"class":2598},[2588,5757,4122],{"class":2602},[2588,5759,5700],{"class":2598},[2588,5761,5762],{"class":2598}," FAMILY_VARIANT_ID",[2588,5764,5706],{"class":2598},[2588,5766,4145],{"class":2598},[2588,5768,5711],{"class":2598},[2588,5770,5714],{"class":2598},[2588,5772,4145],{"class":2598},[2588,5774,4128],{"class":2598},[2588,5776,4395],{"class":2598},[2588,5778,5721],{"class":2602},[2588,5780,5781],{"class":2602}," &&\n",[2588,5783,5784,5787,5789,5791,5793,5795,5797,5800,5802],{"class":2590,"line":2881},[2588,5785,5786],{"class":2598},"BODY",[2588,5788,3020],{"class":2602},[2588,5790,2572],{"class":2842},[2588,5792,3025],{"class":2609},[2588,5794,2849],{"class":2602},[2588,5796,5308],{"class":2609},[2588,5798,5799],{"class":2598},"$PRODUCT_ID",[2588,5801,2606],{"class":2602},[2588,5803,2860],{"class":2598},[2588,5805,5806,5808,5810,5812,5814,5816,5818,5820,5822,5824,5826],{"class":2590,"line":2898},[2588,5807,3956],{"class":2609},[2588,5809,2849],{"class":2602},[2588,5811,2871],{"class":2609},[2588,5813,2874],{"class":2598},[2588,5815,2606],{"class":2602},[2588,5817,5217],{"class":2609},[2588,5819,2849],{"class":2602},[2588,5821,2888],{"class":2609},[2588,5823,2891],{"class":2598},[2588,5825,2606],{"class":2602},[2588,5827,2860],{"class":2598},[2588,5829,5830,5832,5834,5837,5840,5842,5844,5846,5848,5850,5852,5854,5857,5859,5861,5864,5866,5869,5871],{"class":2590,"line":2919},[2588,5831,3985],{"class":2602},[2588,5833,2904],{"class":2842},[2588,5835,5836],{"class":2609}," -c",[2588,5838,5839],{"class":2609}," --arg",[2588,5841,4584],{"class":2609},[2588,5843,2849],{"class":2602},[2588,5845,5055],{"class":2598},[2588,5847,2606],{"class":2602},[2588,5849,5839],{"class":2609},[2588,5851,4128],{"class":2609},[2588,5853,2849],{"class":2602},[2588,5855,5856],{"class":2598},"$FAMILY_ID",[2588,5858,2606],{"class":2602},[2588,5860,5839],{"class":2609},[2588,5862,5863],{"class":2609}," fv",[2588,5865,2849],{"class":2602},[2588,5867,5868],{"class":2598},"$FAMILY_VARIANT_ID",[2588,5870,2606],{"class":2602},[2588,5872,5873],{"class":2602}," '\n",[2588,5875,5876],{"class":2590,"line":3086},[2588,5877,5878],{"class":2609},"      select(.id != null) | {\n",[2588,5880,5881],{"class":2590,"line":3121},[2588,5882,5883],{"class":2609},"        kind: \"variant\", parent_id: $model, family_id: $family, family_variant_id: $fv,\n",[2588,5885,5886],{"class":2590,"line":3147},[2588,5887,5888],{"class":2609},"        attribute_values: ((.attribute_values \u002F\u002F {}) * { common: { colour: \"black\", voltage: \"18v\" } })\n",[2588,5890,5891,5894,5896,5898,5901,5903,5906,5908,5911,5913,5915],{"class":2590,"line":3168},[2588,5892,5893],{"class":2609},"      }",[2588,5895,3036],{"class":2602},[2588,5897,3108],{"class":2602},[2588,5899,5900],{"class":2602}," &&",[2588,5902,3370],{"class":2602},[2588,5904,5905],{"class":2602}," -n",[2588,5907,2849],{"class":2602},[2588,5909,5910],{"class":2598},"$BODY",[2588,5912,2606],{"class":2602},[2588,5914,3383],{"class":2602},[2588,5916,5781],{"class":2602},[2588,5918,5919,5921,5923,5925,5928,5930,5932,5934,5936],{"class":2590,"line":3180},[2588,5920,2572],{"class":2842},[2588,5922,3025],{"class":2609},[2588,5924,3039],{"class":2609},[2588,5926,5927],{"class":2609}," PUT",[2588,5929,2849],{"class":2602},[2588,5931,5308],{"class":2609},[2588,5933,5799],{"class":2598},[2588,5935,2606],{"class":2602},[2588,5937,2860],{"class":2598},[2588,5939,5940,5942,5944,5946,5948,5950,5952,5954,5956,5958,5960],{"class":2590,"line":3211},[2588,5941,3956],{"class":2609},[2588,5943,2849],{"class":2602},[2588,5945,2871],{"class":2609},[2588,5947,2874],{"class":2598},[2588,5949,2606],{"class":2602},[2588,5951,5217],{"class":2609},[2588,5953,2849],{"class":2602},[2588,5955,2888],{"class":2609},[2588,5957,2891],{"class":2598},[2588,5959,2606],{"class":2602},[2588,5961,2860],{"class":2598},[2588,5963,5964,5966,5968,5970,5972,5974,5976,5978],{"class":2590,"line":3255},[2588,5965,3956],{"class":2609},[2588,5967,2849],{"class":2602},[2588,5969,3093],{"class":2609},[2588,5971,2606],{"class":2602},[2588,5973,3098],{"class":2609},[2588,5975,2849],{"class":2602},[2588,5977,5910],{"class":2598},[2588,5979,2613],{"class":2602},[5609,5981],{},[2415,5983,5984],{},"*"," merges the two objects key by key, so ",[2415,5987,4044],{}," and the other buckets, and every other ",[2415,5990,4040],{}," value, are sent back unchanged. ",[2415,5993,5994],{},"\u002F\u002F {}"," covers a product with no ",[2415,5997,4036],{}," yet. If the GET fails, ",[2415,6000,5786],{}," stays empty and nothing is written.",[2405,6003,6004,6005,2534,6007,6009,6010,6012,6013,6015,6016,6019,6020,6022],{},"The Products app settings ",[2415,6006,5423],{},[2415,6008,4962],{}," apply to products you create through the API, not to a file import. ",[2415,6011,4071],{}," decides which attribute a product's display name is read from (",[2409,6014,1392],{"href":1393},"). An operator sets all three in Cockpit's settings form for the Products app, per market, and ",[2415,6017,6018],{},"GET \u002Fv1\u002Fsettings\u002Fapps\u002Fproducts"," reads the values in force (",[2409,6021,944],{"href":1500},"). The API cannot change them.",[2636,6024,6026],{"id":6025},"troubleshooting","Troubleshooting",[2644,6028,6029,6042],{},[2647,6030,6031],{},[2650,6032,6033,6036,6039],{},[2653,6034,6035],{},"Symptom",[2653,6037,6038],{},"Cause",[2653,6040,6041],{},"Fix",[2663,6043,6044,6061,6077,6094,6105,6127],{},[2650,6045,6046,6049,6058],{},[2668,6047,6048],{},"A variant has no family",[2668,6050,6051,6052,6054,6055,6057],{},"It was created with ",[2415,6053,2730],{}," and no ",[2415,6056,2727],{},", so the default family was skipped",[2668,6059,6060],{},"Send both (step 4), or assign the family afterwards",[2650,6062,6063,6068,6074],{},[2668,6064,6065,6066],{},"Create answers ",[2415,6067,2966],{},[2668,6069,6070,6071,6073],{},"The SKU, or the family variant ",[2415,6072,2415],{},", is already taken in the tenant",[2668,6075,6076],{},"Choose another code; a SKU is the key every integration joins on, so decide it once",[2650,6078,6079,6084,6087],{},[2668,6080,6081,6082],{},"Completeness answers ",[2415,6083,5403],{},[2668,6085,6086],{},"The product has no family",[2668,6088,6089,6090,6093],{},"Assign one with ",[2415,6091,6092],{},"POST \u002Fv1\u002Fproducts\u002F\u003CID>\u002Ffamily"," (step 7)",[2650,6095,6096,6099,6102],{},[2668,6097,6098],{},"The model always scores incomplete",[2668,6100,6101],{},"An axis attribute is marked required",[2668,6103,6104],{},"Unmark it on the family link (step 2)",[2650,6106,6107,6113,6116],{},[2668,6108,6109,6110,6112],{},"A variant shows ",[2415,6111,5034],{}," for colour or voltage (step 5)",[2668,6114,6115],{},"The axis value was never set; nothing checks it and completeness does not count it",[2668,6117,6118,6119,6121,6122,6124,6125],{},"Set it with the read-merge-write ",[2415,6120,5642],{}," in step 7, never a ",[2415,6123,5642],{}," of the axis values alone, which replaces the whole ",[2415,6126,4036],{},[2650,6128,6129,6132,6135],{},[2668,6130,6131],{},"A grid shows models and variants together",[2668,6133,6134],{},"They are all products",[2668,6136,6137,6138,6140],{},"Filter the grid on ",[2415,6139,2721],{}," (step 5)",[2636,6142,6144],{"id":6143},"where-to-go-next","Where to go next",[2405,6146,6147],{},"Model one product family end to end by hand, then load the rest. Then read:",[2423,6149,6150,6159,6166],{},[2426,6151,6152,2497,6154,2534,6156,6158],{},[2409,6153,1026],{"href":1375},[2409,6155,1392],{"href":1393},[2409,6157,1369],{"href":1370},": the reference behind each step.",[2426,6160,6161,2534,6163,6165],{},[2409,6162,277],{"href":278},[2409,6164,1380],{"href":1381},": loading the data into the model.",[2426,6167,6168,6171],{},[2409,6169,6170],{"href":373},"Choose which system owns each entity",": who maintains the model once it exists.",[6173,6174,6175],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":2584,"searchDepth":2616,"depth":2616,"links":6177},[6178,6179,6180,6181,6182,6183,6184,6185,6186,6187],{"id":2638,"depth":2616,"text":2639},{"id":2787,"depth":2616,"text":2788},{"id":4075,"depth":2616,"text":4076},{"id":4290,"depth":2616,"text":4291},{"id":4430,"depth":2616,"text":4431},{"id":4970,"depth":2616,"text":4971},{"id":5172,"depth":2616,"text":5173},{"id":5410,"depth":2616,"text":5411},{"id":6025,"depth":2616,"text":6026},{"id":6143,"depth":2616,"text":6144},"Decide which facts are attributes, which products share a family and where variants split, then build it over the API with a worked example, check how variants list and how completeness reads, and see what an import does when the model was skipped.","md",null,{},{"icon":185},{"title":180,"description":6188},{"loc":181},"0vBKS_TxMj5pvmId6QOa0wgrVz0nsTYPTAe8syoX7DI",1792158132087]