Retrieves available product swap/substitution options for specified variants based on configured swap rules. Returns multiple levels of swap suggestions allowing members to exchange products in their memberships.
Key Features:
Variant-Based Swaps: Get swap options for specific product variants
Multi-Level Suggestions: Returns up to 4 levels of swap alternatives
Quantity Preservation: Maintains quantities when suggesting swaps
Recurring Order Rules: Only returns swaps configured for every recurring order
Group-Based Matching: Uses variant groups to find compatible swaps
Product Enrichment: Includes product details (title, price, images)
How Swap Rules Work:
Merchant configures swap rules defining which products can substitute others
Rules are organized by variant groups (e.g., coffee roasts, tea flavors)
Each rule specifies “from” variants and “to” variants
Rules can be limited to specific membership frequencies or all orders
Members can swap products within the allowed groups
Request Structure:
Variant Quantity List: Array of variant IDs with quantities
Each entry contains variant ID and quantity
System finds swap options for all provided variants
Response Structure:
Returns nested list of swap options (up to 5 levels)
Level 0: Original variants (as provided in request)
Levels 1-4: Progressive swap suggestions
Each level contains variant IDs, quantities, titles, prices, images
Variants appear with full Shopify product data
Use Cases:
Display product swap options in customer portal
Allow members to switch between flavor/size variants
{"docsConfig":{"theme":"luma","$schema":"https://mintlify.com/docs.json","name":"Appstle","colors":{"primary":"#0caceb","light":"#6ccdf2","dark":"#0a7eae"},"favicon":"https://mintcdn.com/appstleinc-aeca3e0a/811jRr2WFwD6kXFw/favicon.webp?fit=max\u0026auto=format\u0026n=811jRr2WFwD6kXFw\u0026q=85\u0026s=a98f329ae5c5ff4deaa241d8abe53f11","api":{"playground":{"display":"interactive"},"examples":{"defaults":"required","languages":["bash","python","javascript","node","php","go","ruby"]}},"appearance":{"default":"light","strict":true},"navbar":{"primary":{"type":"github","href":"https://github.com/AppstleInc"}},"footer":{"socials":{"website":"https://appstle.com"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"appstleinc-aeca3e0a","hasAudioNarration":false,"actualSubdomain":"appstleinc-aeca3e0a","customDomains":["developers.appstle.com"],"gitSource":{"type":"github","owner":"appstleinc","repo":"appstle-docs-mintlify","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adfa33f64308ab65ed2456b","collectionId":"d72b93ab-daca-4f97-a891-c13ef4624f35","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adfa33f64308ab65ed2456b"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ae04bff87a96311da529678","clientVersion":"0.0.3971","searchFilterCounts":[{"language":"default","tag":"Subscriptions","count":262},{"language":"default","tag":"Admin API","count":183},{"language":"default","tag":"Storefront API","count":172},{"language":"default","tag":"Memberships","count":118},{"language":"default","tag":"Subscription Contracts","count":63},{"language":"default","tag":"Membership Contracts","count":62},{"language":"default","tag":"Customer Portal API","count":55},{"language":"default","tag":"Loyalty","count":46},{"language":"default","tag":"Billing \u0026 Payments","count":28},{"language":"default","tag":"Bundles","count":24}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"memberships-admin-api/product-swap-rules/get-product-swap-options-for-membership-items","slug":"/memberships-admin-api/product-swap-rules/get-product-swap-options-for-membership-items","pageMetadata":{"title":"Get product swap options for membership items","description":"Retrieves available product swap/substitution options for specified variants based on configured swap rules. Returns multiple levels of swap suggestions allowing members to exchange products in their memberships.\n\n**Key Features:**\n- **Variant-Based Swaps**: Get swap options for specific product variants\n- **Multi-Level Suggestions**: Returns up to 4 levels of swap alternatives\n- **Quantity Preservation**: Maintains quantities when suggesting swaps\n- **Recurring Order Rules**: Only returns swaps configured for every recurring order\n- **Group-Based Matching**: Uses variant groups to find compatible swaps\n- **Product Enrichment**: Includes product details (title, price, images)\n\n**How Swap Rules Work:**\n1. Merchant configures swap rules defining which products can substitute others\n2. Rules are organized by variant groups (e.g., coffee roasts, tea flavors)\n3. Each rule specifies \"from\" variants and \"to\" variants\n4. Rules can be limited to specific membership frequencies or all orders\n5. Members can swap products within the allowed groups\n\n**Request Structure:**\n- **Variant Quantity List**: Array of variant IDs with quantities\n- Each entry contains variant ID and quantity\n- System finds swap options for all provided variants\n\n**Response Structure:**\n- Returns nested list of swap options (up to 5 levels)\n- Level 0: Original variants (as provided in request)\n- Levels 1-4: Progressive swap suggestions\n- Each level contains variant IDs, quantities, titles, prices, images\n- Variants appear with full Shopify product data\n\n**Use Cases:**\n- Display product swap options in customer portal\n- Allow members to switch between flavor/size variants\n- Build custom product selection interfaces\n- Enable seasonal product swaps (summer/winter varieties)\n- Offer alternative products when items are out of stock\n- Let members customize memberships within allowed product groups\n\n**Example Scenario:**\nMember has \"Dark Roast Coffee (12oz)\" in membership. API returns:\n- Level 0: Dark Roast Coffee 12oz (original)\n- Level 1: Medium Roast Coffee 12oz, Light Roast Coffee 12oz\n- Level 2: Dark Roast Coffee 16oz, Decaf Dark Roast 12oz\n- Level 3: Espresso Blend 12oz, French Roast 12oz\n- Level 4: Additional variants based on swap rules\n\n**Authentication:** Requires API key authentication via X-API-Key header or api_key parameter","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json post /api/external/v2/product-swaps-by-variant-groups","href":"/memberships-admin-api/product-swap-rules/get-product-swap-options-for-membership-items","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n li: \"li\",\n ol: \"ol\",\n p: \"p\",\n strong: \"strong\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"Retrieves available product swap/substitution options for specified variants based on configured swap rules. Returns multiple levels of swap suggestions allowing members to exchange products in their memberships.\"\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"Key Features:\"\n })\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"Variant-Based Swaps\"\n }), \": Get swap options for specific product variants\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"Multi-Level Suggestions\"\n }), \": Returns up to 4 levels of swap alternatives\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"Quantity Preservation\"\n }), \": Maintains quantities when suggesting swaps\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"Recurring Order Rules\"\n }), \": Only returns swaps configured for every recurring order\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"Group-Based Matching\"\n }), \": Uses variant groups to find compatible swaps\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"Product Enrichment\"\n }), \": Includes product details (title, price, images)\"]\n }), \"\\n\"]\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"How Swap Rules Work:\"\n })\n }), \"\\n\", _jsxs(_components.ol, {\n children: [\"\\n\", _jsx(_components.li, {\n children: \"Merchant configures swap rules defining which products can substitute others\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Rules are organized by variant groups (e.g., coffee roasts, tea flavors)\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Each rule specifies “from” variants and “to” variants\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Rules can be limited to specific membership frequencies or all orders\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Members can swap products within the allowed groups\"\n }), \"\\n\"]\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"Request Structure:\"\n })\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"Variant Quantity List\"\n }), \": Array of variant IDs with quantities\"]\n }), \"\\n\", _jsx(_components.li, {\n children: \"Each entry contains variant ID and quantity\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"System finds swap options for all provided variants\"\n }), \"\\n\"]\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"Response Structure:\"\n })\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsx(_components.li, {\n children: \"Returns nested list of swap options (up to 5 levels)\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Level 0: Original variants (as provided in request)\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Levels 1-4: Progressive swap suggestions\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Each level contains variant IDs, quantities, titles, prices, images\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Variants appear with full Shopify product data\"\n }), \"\\n\"]\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"Use Cases:\"\n })\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsx(_components.li, {\n children: \"Display product swap options in customer portal\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Allow members to switch between flavor/size variants\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Build custom product selection interfaces\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Enable seasonal product swaps (summer/winter varieties)\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Offer alternative products when items are out of stock\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Let members customize memberships within allowed product groups\"\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Example Scenario:\"\n }), \"\\nMember has “Dark Roast Coffee (12oz)” in membership. API returns:\"]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsx(_components.li, {\n children: \"Level 0: Dark Roast Coffee 12oz (original)\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Level 1: Medium Roast Coffee 12oz, Light Roast Coffee 12oz\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Level 2: Dark Roast Coffee 16oz, Decaf Dark Roast 12oz\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Level 3: Espresso Blend 12oz, French Roast 12oz\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Level 4: Additional variants based on swap rules\"\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Authentication:\"\n }), \" Requires API key authentication via X-API-Key header or api_key parameter\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Get product swap options for membership items","description":"Retrieves available product swap/substitution options for specified variants based on configured swap rules. Returns multiple levels of swap suggestions allowing members to exchange products in their memberships.\n\n**Key Features:**\n- **Variant-Based Swaps**: Get swap options for specific product variants\n- **Multi-Level Suggestions**: Returns up to 4 levels of swap alternatives\n- **Quantity Preservation**: Maintains quantities when suggesting swaps\n- **Recurring Order Rules**: Only returns swaps configured for every recurring order\n- **Group-Based Matching**: Uses variant groups to find compatible swaps\n- **Product Enrichment**: Includes product details (title, price, images)\n\n**How Swap Rules Work:**\n1. Merchant configures swap rules defining which products can substitute others\n2. Rules are organized by variant groups (e.g., coffee roasts, tea flavors)\n3. Each rule specifies \"from\" variants and \"to\" variants\n4. Rules can be limited to specific membership frequencies or all orders\n5. Members can swap products within the allowed groups\n\n**Request Structure:**\n- **Variant Quantity List**: Array of variant IDs with quantities\n- Each entry contains variant ID and quantity\n- System finds swap options for all provided variants\n\n**Response Structure:**\n- Returns nested list of swap options (up to 5 levels)\n- Level 0: Original variants (as provided in request)\n- Levels 1-4: Progressive swap suggestions\n- Each level contains variant IDs, quantities, titles, prices, images\n- Variants appear with full Shopify product data\n\n**Use Cases:**\n- Display product swap options in customer portal\n- Allow members to switch between flavor/size variants\n- Build custom product selection interfaces\n- Enable seasonal product swaps (summer/winter varieties)\n- Offer alternative products when items are out of stock\n- Let members customize memberships within allowed product groups\n\n**Example Scenario:**\nMember has \"Dark Roast Coffee (12oz)\" in membership. API returns:\n- Level 0: Dark Roast Coffee 12oz (original)\n- Level 1: Medium Roast Coffee 12oz, Light Roast Coffee 12oz\n- Level 2: Dark Roast Coffee 16oz, Decaf Dark Roast 12oz\n- Level 3: Espresso Blend 12oz, French Roast 12oz\n- Level 4: Additional variants based on swap rules\n\n**Authentication:** Requires API key authentication via X-API-Key header or api_key parameter","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json post /api/external/v2/product-swaps-by-variant-groups","href":"/memberships-admin-api/product-swap-rules/get-product-swap-options-for-membership-items","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"description":"Retrieves available product swap/substitution options for specified variants based on configured swap rules. Returns multiple levels of swap suggestions allowing members to exchange products in their memberships.\n\n**Key Features:**\n- **Variant-Based Swaps**: Get swap options for specific product variants\n- **Multi-Level Suggestions**: Returns up to 4 levels of swap alternatives\n- **Quantity Preservation**: Maintains quantities when suggesting swaps\n- **Recurring Order Rules**: Only returns swaps configured for every recurring order\n- **Group-Based Matching**: Uses variant groups to find compatible swaps\n- **Product Enrichment**: Includes product details (title, price, images)\n\n**How Swap Rules Work:**\n1. Merchant configures swap rules defining which products can substitute others\n2. Rules are organized by variant groups (e.g., coffee roasts, tea flavors)\n3. Each rule specifies \"from\" variants and \"to\" variants\n4. Rules can be limited to specific membership frequencies or all orders\n5. Members can swap products within the allowed groups\n\n**Request Structure:**\n- **Variant Quantity List**: Array of variant IDs with quantities\n- Each entry contains variant ID and quantity\n- System finds swap options for all provided variants\n\n**Response Structure:**\n- Returns nested list of swap options (up to 5 levels)\n- Level 0: Original variants (as provided in request)\n- Levels 1-4: Progressive swap suggestions\n- Each level contains variant IDs, quantities, titles, prices, images\n- Variants appear with full Shopify product data\n\n**Use Cases:**\n- Display product swap options in customer portal\n- Allow members to switch between flavor/size variants\n- Build custom product selection interfaces\n- Enable seasonal product swaps (summer/winter varieties)\n- Offer alternative products when items are out of stock\n- Let members customize memberships within allowed product groups\n\n**Example Scenario:**\nMember has \"Dark Roast Coffee (12oz)\" in membership. API returns:\n- Level 0: Dark Roast Coffee 12oz (original)\n- Level 1: Medium Roast Coffee 12oz, Light Roast Coffee 12oz\n- Level 2: Dark Roast Coffee 16oz, Decaf Dark Roast 12oz\n- Level 3: Espresso Blend 12oz, French Roast 12oz\n- Level 4: Additional variants based on swap rules\n\n**Authentication:** Requires API key authentication via X-API-Key header or api_key parameter","operationId":"getProductSwapsByVariantIdV2","parameters":["caece5ea-8b63-4e29-b9ff-b04ce11b3d72","45b36f41-d498-4d3f-8144-c3a25ba8ec71"],"requestBody":"6f20da0a-bba6-4f51-9a37-2a11c5cc02f3","responses":{"200":"2dafda77-08cd-469d-91f2-82e3cc4d9af6","400":"90238ef6-6cee-441b-a788-8605b0df792b","401":"4fd3ec3c-e542-466d-b41d-196c27b0c4f4","404":"0b4381d3-e42f-4818-b77b-ce756b9e3b9a"},"summary":"Get product swap options for membership items","tags":["Product Swap Rules"],"method":"post","type":"path","servers":["98a02612-1a78-40c2-8320-a479a74f714d"],"security":[],"path":"/api/external/v2/product-swaps-by-variant-groups","baseUrlOptions":["https://membership-admin.appstle.com"],"title":"Get product swap options for membership items","codeSamples":[],"requestExampleLanguages":["bash","python","javascript","node","php","go","ruby"],"requiredOnlyExamples":true,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"caece5ea-8b63-4e29-b9ff-b04ce11b3d72":{"description":"API Key (Deprecated - Use Header X-API-Key instead)","in":"query","name":"api_key","required":false,"schema":{"type":"string","isRequired":false,"description":"API Key (Deprecated - Use Header X-API-Key instead)","uniqueKey":"","typeLabel":"string"}},"45b36f41-d498-4d3f-8144-c3a25ba8ec71":{"description":"API Key for authentication (Preferred method - use this instead of api_key parameter)","in":"header","name":"X-API-Key","required":false,"schema":{"type":"string","isRequired":false,"description":"API Key for authentication (Preferred method - use this instead of api_key parameter)","uniqueKey":"","typeLabel":"string"}}},"requestBody":{"content":{"application/json":{"example":{"variantQuantityList":[{"quantity":2,"variantId":123456},{"quantity":1,"variantId":789012}]},"schema":{"properties":{"variantQuantityList":{"items":{"properties":{"image":{"type":"string","uniqueKey":"variantQuantityList.items.[INDEX].image","typeLabel":"string"},"productId":{"type":"string","uniqueKey":"variantQuantityList.items.[INDEX].productId","typeLabel":"string"},"productTitle":{"type":"string","uniqueKey":"variantQuantityList.items.[INDEX].productTitle","typeLabel":"string"},"quantity":{"format":"int32","type":"integer","uniqueKey":"variantQuantityList.items.[INDEX].quantity","typeLabel":"integer\u003cint32>"},"sellingPlanId":{"type":"string","uniqueKey":"variantQuantityList.items.[INDEX].sellingPlanId","typeLabel":"string"},"title":{"type":"string","uniqueKey":"variantQuantityList.items.[INDEX].title","typeLabel":"string"},"variantId":{"format":"int64","type":"integer","uniqueKey":"variantQuantityList.items.[INDEX].variantId","typeLabel":"integer\u003cint64>"}},"type":"object","uniqueKey":"variantQuantityList.items.[INDEX]","typeLabel":"object"},"type":"array","uniqueKey":"variantQuantityList","typeLabel":"object[]"}},"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"variantQuantityList":[{"quantity":2,"variantId":123456},{"quantity":1,"variantId":789012}]}}},"exampleType":"examples"}},"description":"List of variants with quantities to find swap options for","required":true,"exampleType":"examples"},"responses":{"2dafda77-08cd-469d-91f2-82e3cc4d9af6":{"content":{"application/json":{"schema":{"description":"Nested list where each element is a list of variant options for that swap level","type":"array","uniqueKey":"","typeLabel":"array"},"examples":{"Example":{"title":"Example","value":"\u003carray>"}},"exampleType":"generated"}},"description":"Swap options successfully retrieved with up to 5 levels of suggestions","exampleType":"generated"},"90238ef6-6cee-441b-a788-8605b0df792b":{"content":{"*/*":{"schema":{"items":{"items":{"properties":{"image":{"type":"string","uniqueKey":"items.[INDEX].items.[INDEX].image","typeLabel":"string"},"productId":{"type":"string","uniqueKey":"items.[INDEX].items.[INDEX].productId","typeLabel":"string"},"productTitle":{"type":"string","uniqueKey":"items.[INDEX].items.[INDEX].productTitle","typeLabel":"string"},"quantity":{"format":"int32","type":"integer","uniqueKey":"items.[INDEX].items.[INDEX].quantity","typeLabel":"integer\u003cint32>"},"sellingPlanId":{"type":"string","uniqueKey":"items.[INDEX].items.[INDEX].sellingPlanId","typeLabel":"string"},"title":{"type":"string","uniqueKey":"items.[INDEX].items.[INDEX].title","typeLabel":"string"},"variantId":{"format":"int64","type":"integer","uniqueKey":"items.[INDEX].items.[INDEX].variantId","typeLabel":"integer\u003cint64>"}},"type":"object","uniqueKey":"items.[INDEX].items.[INDEX]","typeLabel":"object"},"type":"array","uniqueKey":"items.[INDEX]","typeLabel":"object[]"},"type":"array","uniqueKey":"","typeLabel":"object[][]"},"examples":{"Example":{"title":"Example","value":[[{"image":"\u003cstring>","productId":"\u003cstring>","productTitle":"\u003cstring>","quantity":123,"sellingPlanId":"\u003cstring>","title":"\u003cstring>","variantId":123}]]}},"exampleType":"generated"}},"description":"Invalid variant information provided","exampleType":"generated"},"4fd3ec3c-e542-466d-b41d-196c27b0c4f4":{"content":{"*/*":{"schema":{"items":{"items":{"properties":{"image":{"type":"string","uniqueKey":"items.[INDEX].items.[INDEX].image","typeLabel":"string"},"productId":{"type":"string","uniqueKey":"items.[INDEX].items.[INDEX].productId","typeLabel":"string"},"productTitle":{"type":"string","uniqueKey":"items.[INDEX].items.[INDEX].productTitle","typeLabel":"string"},"quantity":{"format":"int32","type":"integer","uniqueKey":"items.[INDEX].items.[INDEX].quantity","typeLabel":"integer\u003cint32>"},"sellingPlanId":{"type":"string","uniqueKey":"items.[INDEX].items.[INDEX].sellingPlanId","typeLabel":"string"},"title":{"type":"string","uniqueKey":"items.[INDEX].items.[INDEX].title","typeLabel":"string"},"variantId":{"format":"int64","type":"integer","uniqueKey":"items.[INDEX].items.[INDEX].variantId","typeLabel":"integer\u003cint64>"}},"type":"object","uniqueKey":"items.[INDEX].items.[INDEX]","typeLabel":"object"},"type":"array","uniqueKey":"items.[INDEX]","typeLabel":"object[]"},"type":"array","uniqueKey":"","typeLabel":"object[][]"},"examples":{"Example":{"title":"Example","value":[[{"image":"\u003cstring>","productId":"\u003cstring>","productTitle":"\u003cstring>","quantity":123,"sellingPlanId":"\u003cstring>","title":"\u003cstring>","variantId":123}]]}},"exampleType":"generated"}},"description":"Authentication required - invalid or missing API key","exampleType":"generated"},"0b4381d3-e42f-4818-b77b-ce756b9e3b9a":{"content":{"*/*":{"schema":{"items":{"items":{"properties":{"image":{"type":"string","uniqueKey":"items.[INDEX].items.[INDEX].image","typeLabel":"string"},"productId":{"type":"string","uniqueKey":"items.[INDEX].items.[INDEX].productId","typeLabel":"string"},"productTitle":{"type":"string","uniqueKey":"items.[INDEX].items.[INDEX].productTitle","typeLabel":"string"},"quantity":{"format":"int32","type":"integer","uniqueKey":"items.[INDEX].items.[INDEX].quantity","typeLabel":"integer\u003cint32>"},"sellingPlanId":{"type":"string","uniqueKey":"items.[INDEX].items.[INDEX].sellingPlanId","typeLabel":"string"},"title":{"type":"string","uniqueKey":"items.[INDEX].items.[INDEX].title","typeLabel":"string"},"variantId":{"format":"int64","type":"integer","uniqueKey":"items.[INDEX].items.[INDEX].variantId","typeLabel":"integer\u003cint64>"}},"type":"object","uniqueKey":"items.[INDEX].items.[INDEX]","typeLabel":"object"},"type":"array","uniqueKey":"items.[INDEX]","typeLabel":"object[]"},"type":"array","uniqueKey":"","typeLabel":"object[][]"},"examples":{"Example":{"title":"Example","value":[[{"image":"\u003cstring>","productId":"\u003cstring>","productTitle":"\u003cstring>","quantity":123,"sellingPlanId":"\u003cstring>","title":"\u003cstring>","variantId":123}]]}},"exampleType":"generated"}},"description":"No swap rules configured for shop","exampleType":"generated"}},"security":{},"servers":{"98a02612-1a78-40c2-8320-a479a74f714d":{"url":"https://membership-admin.appstle.com"}}},"originalFileLocation":"memberships/admin-api-swagger.json"},"subdomain":"appstleinc-aeca3e0a","siteName":"Appstle","title":"Get product swap options for membership items - Appstle","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-06T07:00:43.549Z","originalFileLocation":"memberships-admin-api/product-swap-rules/get-product-swap-options-for-membership-items.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=\"light\";if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Retrieves available product swap/substitution options for specified variants based on configured swap rules. Returns multiple levels of swap suggestions allowing members to exchange products in their memberships. Key Features: - Variant-Based Swaps: Get swap options for specific product variants - Multi-Level Suggestions: Returns up to 4 levels of swap alternatives - Quantity Preservation: Maintains quantities when suggesting swaps - Recurring Order Rules: Only returns swaps configured for every recurring order - Group-Based Matching: Uses variant groups to find compatible swaps - Product Enrichment: Includes product details (title, price, images) How Swap Rules Work: 1. Merchant configures swap rules defining which products can substitute others 2. Rules are organized by variant groups (e.g., coffee roasts, tea flavors) 3. Each rule specifies \u0026quot;from\u0026quot; variants and \u0026quot;to\u0026quot; variants 4. Rules can be limited to specific membership frequencies or all orders 5. Members can swap products within the allowed groups Request Structure: - Variant Quantity List: Array of variant IDs with quantities - Each entry contains variant ID and quantity - System finds swap options for all provided variants Response Structure: - Returns nested list of swap options (up to 5 levels) - Level 0: Original variants (as provided in request) - Levels 1-4: Progressive swap suggestions - Each level contains variant IDs, quantities, titles, prices, images - Variants appear with full Shopify product data Use Cases: - Display product swap options in customer portal - Allow members to switch between flavor/size variants - Build custom product selection interfaces - Enable seasonal product swaps (summer/winter varieties) - Offer alternative products when items are out of stock - Let members customize memberships within allowed product groups Example Scenario: Member has \u0026quot;Dark Roast Coffee (12oz)\u0026quot; in membership. API returns: - Level 0: Dark Roast Coffee 12oz (original) - Level 1: Medium Roast Coffee 12oz, Light Roast Coffee 12oz - Level 2: Dark Roast Coffee 16oz, Decaf Dark Roast 12oz - Level 3: Espresso Blend 12oz, French Roast 12oz - Level 4: Additional variants based on swap rules Authentication: Requires API key authentication via X-API-Key header or api_key parameter\">\u003cmeta data-mint-head name=\"application-name\" content=\"Appstle\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/appstleinc-aeca3e0a/qTHqMufQccFjyOE2/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/appstleinc-aeca3e0a/qTHqMufQccFjyOE2/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/appstleinc-aeca3e0a/qTHqMufQccFjyOE2/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/appstleinc-aeca3e0a/qTHqMufQccFjyOE2/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/appstleinc-aeca3e0a/qTHqMufQccFjyOE2/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/appstleinc-aeca3e0a/qTHqMufQccFjyOE2/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/appstleinc-aeca3e0a/qTHqMufQccFjyOE2/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/appstleinc-aeca3e0a/qTHqMufQccFjyOE2/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/appstleinc-aeca3e0a/qTHqMufQccFjyOE2/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Get product swap options for membership items - Appstle\">\u003cmeta data-mint-head property=\"og:description\" content=\"Retrieves available product swap/substitution options for specified variants based on configured swap rules. Returns multiple levels of swap suggestions allowing members to exchange products in their memberships. Key Features: - Variant-Based Swaps: Get swap options for specific product variants - Multi-Level Suggestions: Returns up to 4 levels of swap alternatives - Quantity Preservation: Maintains quantities when suggesting swaps - Recurring Order Rules: Only returns swaps configured for every recurring order - Group-Based Matching: Uses variant groups to find compatible swaps - Product Enrichment: Includes product details (title, price, images) How Swap Rules Work: 1. Merchant configures swap rules defining which products can substitute others 2. Rules are organized by variant groups (e.g., coffee roasts, tea flavors) 3. Each rule specifies \u0026quot;from\u0026quot; variants and \u0026quot;to\u0026quot; variants 4. Rules can be limited to specific membership frequencies or all orders 5. Members can swap products within the allowed groups Request Structure: - Variant Quantity List: Array of variant IDs with quantities - Each entry contains variant ID and quantity - System finds swap options for all provided variants Response Structure: - Returns nested list of swap options (up to 5 levels) - Level 0: Original variants (as provided in request) - Levels 1-4: Progressive swap suggestions - Each level contains variant IDs, quantities, titles, prices, images - Variants appear with full Shopify product data Use Cases: - Display product swap options in customer portal - Allow members to switch between flavor/size variants - Build custom product selection interfaces - Enable seasonal product swaps (summer/winter varieties) - Offer alternative products when items are out of stock - Let members customize memberships within allowed product groups Example Scenario: Member has \u0026quot;Dark Roast Coffee (12oz)\u0026quot; in membership. API returns: - Level 0: Dark Roast Coffee 12oz (original) - Level 1: Medium Roast Coffee 12oz, Light Roast Coffee 12oz - Level 2: Dark Roast Coffee 16oz, Decaf Dark Roast 12oz - Level 3: Espresso Blend 12oz, French Roast 12oz - Level 4: Additional variants based on swap rules Authentication: Requires API key authentication via X-API-Key header or api_key parameter\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Appstle\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://developers.appstle.com/memberships-admin-api/product-swap-rules/get-product-swap-options-for-membership-items\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://appstleinc-aeca3e0a.mintlify.app/_mintlify/api/og/v2?division=Product+Swap+Rules\u0026amp;title=Get+product+swap+options+for+membership+items\u0026amp;description=Retrieves+available+product+swap%2Fsubstitution+options+for+specified+variants+based+on+configured+swap+rules.+Returns+multiple+levels+of+swap+suggestions+allowin\u0026amp;theme=f3911f4da205a97f19a260f1\u0026amp;signature=5e6f035bdd7139b23ef8533594b58ac80ce2d4aae523c5ccb2bd15f505087100\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Get product swap options for membership items - Appstle\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Retrieves available product swap/substitution options for specified variants based on configured swap rules. Returns multiple levels of swap suggestions allowing members to exchange products in their memberships. Key Features: - Variant-Based Swaps: Get swap options for specific product variants - Multi-Level Suggestions: Returns up to 4 levels of swap alternatives - Quantity Preservation: Maintains quantities when suggesting swaps - Recurring Order Rules: Only returns swaps configured for every recurring order - Group-Based Matching: Uses variant groups to find compatible swaps - Product Enrichment: Includes product details (title, price, images) How Swap Rules Work: 1. Merchant configures swap rules defining which products can substitute others 2. Rules are organized by variant groups (e.g., coffee roasts, tea flavors) 3. Each rule specifies \u0026quot;from\u0026quot; variants and \u0026quot;to\u0026quot; variants 4. Rules can be limited to specific membership frequencies or all orders 5. Members can swap products within the allowed groups Request Structure: - Variant Quantity List: Array of variant IDs with quantities - Each entry contains variant ID and quantity - System finds swap options for all provided variants Response Structure: - Returns nested list of swap options (up to 5 levels) - Level 0: Original variants (as provided in request) - Levels 1-4: Progressive swap suggestions - Each level contains variant IDs, quantities, titles, prices, images - Variants appear with full Shopify product data Use Cases: - Display product swap options in customer portal - Allow members to switch between flavor/size variants - Build custom product selection interfaces - Enable seasonal product swaps (summer/winter varieties) - Offer alternative products when items are out of stock - Let members customize memberships within allowed product groups Example Scenario: Member has \u0026quot;Dark Roast Coffee (12oz)\u0026quot; in membership. API returns: - Level 0: Dark Roast Coffee 12oz (original) - Level 1: Medium Roast Coffee 12oz, Light Roast Coffee 12oz - Level 2: Dark Roast Coffee 16oz, Decaf Dark Roast 12oz - Level 3: Espresso Blend 12oz, French Roast 12oz - Level 4: Additional variants based on swap rules Authentication: Requires API key authentication via X-API-Key header or api_key parameter\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://appstleinc-aeca3e0a.mintlify.app/_mintlify/api/og/v2?division=Product+Swap+Rules\u0026amp;title=Get+product+swap+options+for+membership+items\u0026amp;description=Retrieves+available+product+swap%2Fsubstitution+options+for+specified+variants+based+on+configured+swap+rules.+Returns+multiple+levels+of+swap+suggestions+allowin\u0026amp;theme=f3911f4da205a97f19a260f1\u0026amp;signature=5e6f035bdd7139b23ef8533594b58ac80ce2d4aae523c5ccb2bd15f505087100\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/appstleinc-aeca3e0a/qTHqMufQccFjyOE2/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Appstle\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0caceb\">\u003clink data-mint-head rel=\"canonical\" href=\"https://developers.appstle.com/memberships-admin-api/product-swap-rules/get-product-swap-options-for-membership-items\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/memberships-admin-api/product-swap-rules/get-product-swap-options-for-membership-items.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://developers.appstle.com/#organization\",\"name\":\"Appstle\",\"url\":\"https://developers.appstle.com\"},{\"@type\":\"WebSite\",\"@id\":\"https://developers.appstle.com#website\",\"name\":\"Appstle\",\"url\":\"https://developers.appstle.com\",\"publisher\":{\"@id\":\"https://developers.appstle.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://developers.appstle.com/memberships-admin-api/product-swap-rules/get-product-swap-options-for-membership-items#webpage\",\"url\":\"https://developers.appstle.com/memberships-admin-api/product-swap-rules/get-product-swap-options-for-membership-items\",\"name\":\"Get product swap options for membership items\",\"description\":\"Retrieves available product swap/substitution options for specified variants based on configured swap rules. Returns multiple levels of swap suggestions allowing members to exchange products in their memberships. Key Features: - Variant-Based Swaps: Get swap options for specific product variants - Multi-Level Suggestions: Returns up to 4 levels of swap alternatives - Quantity Preservation: Maintains quantities when suggesting swaps - Recurring Order Rules: Only returns swaps configured for every recurring order - Group-Based Matching: Uses variant groups to find compatible swaps - Product Enrichment: Includes product details (title, price, images) How Swap Rules Work: 1. Merchant configures swap rules defining which products can substitute others 2. Rules are organized by variant groups (e.g., coffee roasts, tea flavors) 3. Each rule specifies \\\"from\\\" variants and \\\"to\\\" variants 4. Rules can be limited to specific membership frequencies or all orders 5. Members can swap products within the allowed groups Request Structure: - Variant Quantity List: Array of variant IDs with quantities - Each entry contains variant ID and quantity - System finds swap options for all provided variants Response Structure: - Returns nested list of swap options (up to 5 levels) - Level 0: Original variants (as provided in request) - Levels 1-4: Progressive swap suggestions - Each level contains variant IDs, quantities, titles, prices, images - Variants appear with full Shopify product data Use Cases: - Display product swap options in customer portal - Allow members to switch between flavor/size variants - Build custom product selection interfaces - Enable seasonal product swaps (summer/winter varieties) - Offer alternative products when items are out of stock - Let members customize memberships within allowed product groups Example Scenario: Member has \\\"Dark Roast Coffee (12oz)\\\" in membership. API returns: - Level 0: Dark Roast Coffee 12oz (original) - Level 1: Medium Roast Coffee 12oz, Light Roast Coffee 12oz - Level 2: Dark Roast Coffee 16oz, Decaf Dark Roast 12oz - Level 3: Espresso Blend 12oz, French Roast 12oz - Level 4: Additional variants based on swap rules Authentication: Requires API key authentication via X-API-Key header or api_key parameter\",\"dateModified\":\"2026-09-06T07:00:43.549Z\",\"isPartOf\":{\"@id\":\"https://developers.appstle.com#website\"},\"breadcrumb\":{\"@id\":\"https://developers.appstle.com/memberships-admin-api/product-swap-rules/get-product-swap-options-for-membership-items#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://developers.appstle.com/memberships-admin-api/product-swap-rules/get-product-swap-options-for-membership-items#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Admin API\",\"item\":\"https://developers.appstle.com/memberships-admin-api/cancellation-flow-configuration/get-cancellation-flow-configuration\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Get product swap options for membership items\",\"item\":\"https://developers.appstle.com/memberships-admin-api/product-swap-rules/get-product-swap-options-for-membership-items\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://developers.appstle.com/memberships-admin-api/product-swap-rules/get-product-swap-options-for-membership-items#apireference\",\"headline\":\"Get product swap options for membership items\",\"name\":\"Get product swap options for membership items\",\"description\":\"Retrieves available product swap/substitution options for specified variants based on configured swap rules. Returns multiple levels of swap suggestions allowing members to exchange products in their memberships. Key Features: - Variant-Based Swaps: Get swap options for specific product variants - Multi-Level Suggestions: Returns up to 4 levels of swap alternatives - Quantity Preservation: Maintains quantities when suggesting swaps - Recurring Order Rules: Only returns swaps configured for every recurring order - Group-Based Matching: Uses variant groups to find compatible swaps - Product Enrichment: Includes product details (title, price, images) How Swap Rules Work: 1. Merchant configures swap rules defining which products can substitute others 2. Rules are organized by variant groups (e.g., coffee roasts, tea flavors) 3. Each rule specifies \\\"from\\\" variants and \\\"to\\\" variants 4. Rules can be limited to specific membership frequencies or all orders 5. Members can swap products within the allowed groups Request Structure: - Variant Quantity List: Array of variant IDs with quantities - Each entry contains variant ID and quantity - System finds swap options for all provided variants Response Structure: - Returns nested list of swap options (up to 5 levels) - Level 0: Original variants (as provided in request) - Levels 1-4: Progressive swap suggestions - Each level contains variant IDs, quantities, titles, prices, images - Variants appear with full Shopify product data Use Cases: - Display product swap options in customer portal - Allow members to switch between flavor/size variants - Build custom product selection interfaces - Enable seasonal product swaps (summer/winter varieties) - Offer alternative products when items are out of stock - Let members customize memberships within allowed product groups Example Scenario: Member has \\\"Dark Roast Coffee (12oz)\\\" in membership. API returns: - Level 0: Dark Roast Coffee 12oz (original) - Level 1: Medium Roast Coffee 12oz, Light Roast Coffee 12oz - Level 2: Dark Roast Coffee 16oz, Decaf Dark Roast 12oz - Level 3: Espresso Blend 12oz, French Roast 12oz - Level 4: Additional variants based on swap rules Authentication: Requires API key authentication via X-API-Key header or api_key parameter\",\"url\":\"https://developers.appstle.com/memberships-admin-api/product-swap-rules/get-product-swap-options-for-membership-items\",\"mainEntityOfPage\":{\"@id\":\"https://developers.appstle.com/memberships-admin-api/product-swap-rules/get-product-swap-options-for-membership-items#webpage\"},\"dateModified\":\"2026-09-06T07:00:43.549Z\",\"publisher\":{\"@id\":\"https://developers.appstle.com/#organization\"},\"isPartOf\":{\"@id\":\"https://developers.appstle.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Appstle\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Appstle","nav":{"global":null,"products":[{"product":"Subscriptions","icon":"arrows-rotate","description":"Recurring orders, selling plans, and the customer portal","pages":[{"title":"Subscriptions","href":"/subscription/introduction"}]},{"product":"Loyalty","icon":"medal","description":"Points, VIP tiers, rewards, referrals, and store credit","pages":[{"title":"Loyalty","href":"/loyalty/introduction"}]},{"product":"Memberships","icon":"id-card","description":"Membership plans, member perks, billing, and access control","groups":[{"group":"Get Started","pages":[{"title":"Appstle Memberships: Tiered Plans \u0026 Access Control","sidebarTitle":"Introduction","href":"/memberships/introduction"},{"title":"Authenticate with the Appstle Memberships API","sidebarTitle":"Authentication","href":"/memberships/authentication"},{"title":"Get started with Appstle Memberships API","sidebarTitle":"Quickstart","href":"/memberships/quickstart"}]},{"group":"Guides","pages":[{"title":"Appstle Memberships third-party integration guide","sidebarTitle":"Integration guide","href":"/memberships/integration-guide"},{"title":"Automate memberships with Shopify Flow","sidebarTitle":"Shopify Flow","href":"/memberships/shopify-flow"},{"title":"Shopify metafields and tags for Appstle Memberships","sidebarTitle":"Metafields \u0026 tags","href":"/memberships/metafields-and-tags"}]},{"group":"Partner Integration","pages":[{"title":"Partner Integration Framework overview","sidebarTitle":"Framework overview","href":"/memberships/partner-framework-overview"},{"title":"Partner Integration Framework","sidebarTitle":"Partner integration","href":"/memberships/partner-integration"}]},{"group":"Webhooks","pages":[{"title":"Appstle Memberships webhook events and setup","sidebarTitle":"Webhooks","href":"/memberships/webhooks"}]},{"group":"Admin API","pages":[{"group":"Cancellation Flow Configuration","pages":[{"title":"Get cancellation flow configuration","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json get /api/external/v2/cancellation-managements/{id}","href":"/memberships-admin-api/cancellation-flow-configuration/get-cancellation-flow-configuration"}]},{"group":"Customer Discount History","pages":[{"title":"Get past discount codes for contract","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json get /api/external/v2/customer-discount-code-infos/get-past-discounts","href":"/memberships-admin-api/customer-discount-history/get-past-discount-codes-for-contract"}]},{"group":"Customer Payment Methods","pages":[{"title":"Get customer payment token information","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json get /api/external/v2/customer-payments/token/{customerId}","href":"/memberships-admin-api/customer-payment-methods/get-customer-payment-token-information"}]},{"group":"Customer Portal Configuration","pages":[{"title":"Get customer portal settings","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json get /api/external/v2/customer-portal-settings/{id}","href":"/memberships-admin-api/customer-portal-configuration/get-customer-portal-settings"}]},{"group":"Membership Contracts","pages":[{"title":"Generate customer portal authentication token","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json get /api/external/v2/customer-portal-token","href":"/memberships-admin-api/membership-contracts/generate-customer-portal-authentication-token"},{"title":"Generate customer portal magic link","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json get /api/external/v2/manage-subscription-link/{customerId}","href":"/memberships-admin-api/membership-contracts/generate-customer-portal-magic-link"},{"title":"Add product line item to membership contract","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-contract-add-line-item","href":"/memberships-admin-api/membership-contracts/add-product-line-item-to-membership-contract"},{"title":"Get membership contract list","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json get /api/external/v2/subscription-contract-details","href":"/memberships-admin-api/membership-contracts/get-membership-contract-list"},{"title":"Get billing interval options for selling plans","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json get /api/external/v2/subscription-contract-details/billing-interval","href":"/memberships-admin-api/membership-contracts/get-billing-interval-options-for-selling-plans"},{"title":"Get customer payment methods","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json get /api/external/v2/subscription-contract-details/shopify/customer/{customerId}/payment-methods","href":"/memberships-admin-api/membership-contracts/get-customer-payment-methods"},{"title":"Get membership order fulfillment details","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json get /api/external/v2/subscription-contract-details/subscription-fulfillments/{contractId}","href":"/memberships-admin-api/membership-contracts/get-membership-order-fulfillment-details"},{"title":"Get pending downgrade for a membership contract","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json get /api/external/v2/subscription-contract-details/{contractId}/pending-downgrade","href":"/memberships-admin-api/membership-contracts/get-pending-downgrade-for-a-membership-contract"},{"title":"Cancel pending downgrade for a membership contract","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json delete /api/external/v2/subscription-contract-details/{contractId}/pending-downgrade","href":"/memberships-admin-api/membership-contracts/cancel-pending-downgrade-for-a-membership-contract"},{"title":"Update product variant in membership contract","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-contract-update-variant","href":"/memberships-admin-api/membership-contracts/update-product-variant-in-membership-contract"},{"title":"Create and add custom discount to membership","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-contracts-add-discount","href":"/memberships-admin-api/membership-contracts/create-and-add-custom-discount-to-membership"},{"title":"Add product to membership contract","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-contracts-add-line-item","href":"/memberships-admin-api/membership-contracts/add-product-to-membership-contract"},{"title":"Apply discount code to membership","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-contracts-apply-discount","href":"/memberships-admin-api/membership-contracts/apply-discount-code-to-membership"},{"title":"Send customer portal magic link via email","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json get /api/external/v2/subscription-contracts-email-magic-link","href":"/memberships-admin-api/membership-contracts/send-customer-portal-magic-link-via-email"},{"title":"Remove discount from membership","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-contracts-remove-discount","href":"/memberships-admin-api/membership-contracts/remove-discount-from-membership"},{"title":"Remove product from membership contract","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-contracts-remove-line-item","href":"/memberships-admin-api/membership-contracts/remove-product-from-membership-contract"},{"title":"Update membership contract billing date","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-contracts-update-billing-date","href":"/memberships-admin-api/membership-contracts/update-membership-contract-billing-date"},{"title":"Update billing interval for membership contract","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-contracts-update-billing-interval","href":"/memberships-admin-api/membership-contracts/update-billing-interval-for-membership-contract"},{"title":"Update custom note attributes on membership contract","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-contracts-update-custom-note-attributes","href":"/memberships-admin-api/membership-contracts/update-custom-note-attributes-on-membership-contract"},{"title":"Update delivery interval for membership contract","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-contracts-update-delivery-interval","href":"/memberships-admin-api/membership-contracts/update-delivery-interval-for-membership-contract"},{"title":"Update membership line item quantity and pricing","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-contracts-update-line-item","href":"/memberships-admin-api/membership-contracts/update-membership-line-item-quantity-and-pricing"},{"title":"Update custom attributes on membership line item","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-contracts-update-line-item-attributes","href":"/memberships-admin-api/membership-contracts/update-custom-attributes-on-membership-line-item"},{"title":"Update maximum billing cycles for membership contract","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-contracts-update-max-cycles","href":"/memberships-admin-api/membership-contracts/update-maximum-billing-cycles-for-membership-contract"},{"title":"Update minimum billing cycles for membership contract","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-contracts-update-min-cycles","href":"/memberships-admin-api/membership-contracts/update-minimum-billing-cycles-for-membership-contract"},{"title":"Update order note/instructions for membership contract","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-contracts-update-order-note/{contractId}","href":"/memberships-admin-api/membership-contracts/update-order-noteinstructions-for-membership-contract"},{"title":"Update membership payment method","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-contracts-update-payment-method","href":"/memberships-admin-api/membership-contracts/update-membership-payment-method"},{"title":"Update shipping address for membership contract","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-contracts-update-shipping-address","href":"/memberships-admin-api/membership-contracts/update-shipping-address-for-membership-contract"},{"title":"Update membership contract status (pause/resume/activate)","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-contracts-update-status","href":"/memberships-admin-api/membership-contracts/update-membership-contract-status-pauseresumeactivate"},{"title":"Get raw membership contract details from Shopify","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json get /api/external/v2/subscription-contracts/contract-external/{contractId}","href":"/memberships-admin-api/membership-contracts/get-raw-membership-contract-details-from-shopify"},{"title":"Cancel membership contract","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json delete /api/external/v2/subscription-contracts/{id}","href":"/memberships-admin-api/membership-contracts/cancel-membership-contract"},{"title":"Get detailed customer membership information","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json get /api/external/v2/subscription-customers-detail/valid/{customerId}","href":"/memberships-admin-api/membership-contracts/get-detailed-customer-membership-information"},{"title":"Sync customer information","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json delete /api/external/v2/subscription-customers/sync-info/{customerId}","href":"/memberships-admin-api/membership-contracts/sync-customer-information"},{"title":"Get valid membership contract IDs for customer","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json get /api/external/v2/subscription-customers/valid/{customerId}","href":"/memberships-admin-api/membership-contracts/get-valid-membership-contract-ids-for-customer"},{"title":"Get membership customer details","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json get /api/external/v2/subscription-customers/{customerId}","href":"/memberships-admin-api/membership-contracts/get-membership-customer-details"}]},{"group":"Shipping \u0026 Delivery Profiles","pages":[{"title":"Create shipping/delivery profile (V1 format - Legacy)","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json post /api/external/v2/delivery-profiles/create-shipping-profile","href":"/memberships-admin-api/shipping-\u0026-delivery-profiles/create-shippingdelivery-profile-v1-format--legacy"},{"title":"Create shipping/delivery profile (V2 format)","description":"Creates a new Shopify delivery profile with custom shipping zones, rates, and methods. Delivery profiles control which shipping options are available to customers at checkout for membership orders.\n\n**What is a Delivery Profile?**\nA delivery profile defines shipping configurations (zones, rates, methods) for specific products or locations. Membership memberships can have dedicated delivery profiles with custom shipping pricing (free shipping for VIPs, regional rates, express delivery options, etc.).\n\n**Request Body Structure (CreateShippingProfileRequestV2):**\n```json\n{\n \"profileName\": \"VIP Membership Free Shipping\",\n \"locationInfos\": [\n {\n \"locationId\": \"gid://shopify/Location/12345\",\n \"countryInfos\": [\n {\n \"countryCode\": \"US\",\n \"provinceCodeInfoList\": [\"CA\", \"NY\", \"TX\"],\n \"deliveryMethodInfo\": [\n {\n \"name\": \"Standard Shipping\",\n \"amount\": 0.00,\n \"currencyCode\": \"USD\",\n \"minWeight\": null,\n \"maxWeight\": null,\n \"description\": \"Free for members\"\n },\n {\n \"name\": \"Express Shipping\",\n \"amount\": 9.99,\n \"currencyCode\": \"USD\",\n \"description\": \"2-day delivery\"\n }\n ]\n }\n ]\n }\n ]\n}\n```\n\n**Field Explanations:**\n\n**profileName** (string, required):\n- Unique name for the delivery profile\n- Visible in Shopify admin\n- Examples: \"Premium Member Shipping\", \"International Free Shipping\", \"Express Delivery Profile\"\n- Max length: 255 characters\n\n**locationInfos** (array, required):\n- Array of store locations this profile applies to\n- Get location IDs via Shopify Admin API or `/data/locations` endpoint\n- Can configure different shipping for each warehouse/store\n- **locationId** format: `gid://shopify/Location/{numeric_id}`\n\n**countryInfos** (array, required):\n- Shipping configuration per country\n- **countryCode**: ISO 3166-1 alpha-2 code (\"US\", \"CA\", \"GB\", etc.)\n- **provinceCodeInfoList**: Optional state/province filtering (e.g., [\"CA\", \"NY\"] for US states)\n - Omit to include all provinces/states\n - Use ISO 3166-2 province codes (e.g., \"CA\" for California, \"ON\" for Ontario)\n\n**deliveryMethodInfo** (array, required):\n- Shipping methods available for this zone\n- **name**: Method display name (\"Standard\", \"Express\", \"Overnight\")\n- **amount**: Shipping cost (0.00 for free shipping)\n- **currencyCode**: Auto-set to shop currency (do not manually specify)\n- **minWeight** / **maxWeight**: Optional weight restrictions in grams\n- **description**: Optional customer-facing description\n\n**Common Use Cases \u0026 Examples:**\n\n**1. Free Shipping for VIP Members**\n```json\n{\n \"profileName\": \"VIP Free Shipping\",\n \"locationInfos\": [{\n \"locationId\": \"gid://shopify/Location/67890\",\n \"countryInfos\": [{\n \"countryCode\": \"US\",\n \"deliveryMethodInfo\": [{\n \"name\": \"Free Standard Shipping\",\n \"amount\": 0.00,\n \"description\": \"Included with VIP membership\"\n }]\n }]\n }]\n}\n```\n\n**2. Regional Pricing (Different Rates per State)**\n```json\n{\n \"profileName\": \"Regional Shipping\",\n \"locationInfos\": [{\n \"locationId\": \"gid://shopify/Location/12345\",\n \"countryInfos\": [\n {\n \"countryCode\": \"US\",\n \"provinceCodeInfoList\": [\"CA\", \"OR\", \"WA\"],\n \"deliveryMethodInfo\": [{\n \"name\": \"West Coast Shipping\",\n \"amount\": 4.99\n }]\n },\n {\n \"countryCode\": \"US\",\n \"provinceCodeInfoList\": [\"NY\", \"NJ\", \"CT\"],\n \"deliveryMethodInfo\": [{\n \"name\": \"East Coast Shipping\",\n \"amount\": 5.99\n }]\n }\n ]\n }]\n}\n```\n\n**3. Tiered Shipping (Standard + Express)**\n```json\n{\n \"profileName\": \"Multi-Speed Shipping\",\n \"locationInfos\": [{\n \"locationId\": \"gid://shopify/Location/12345\",\n \"countryInfos\": [{\n \"countryCode\": \"US\",\n \"deliveryMethodInfo\": [\n {\n \"name\": \"Standard (5-7 days)\",\n \"amount\": 0.00,\n \"description\": \"Free standard shipping\"\n },\n {\n \"name\": \"Express (2-3 days)\",\n \"amount\": 9.99,\n \"description\": \"Faster delivery\"\n },\n {\n \"name\": \"Overnight\",\n \"amount\": 24.99,\n \"description\": \"Next business day\"\n }\n ]\n }]\n }]\n}\n```\n\n**Validation Rules:**\n- **profileName**: Required, non-empty, max 255 characters\n- **locationInfos**: Must contain at least 1 location\n- **countryCode**: Must be valid ISO 3166-1 alpha-2 code\n- **provinceCodeInfoList**: Optional, must be valid province codes for the country\n- **deliveryMethodInfo**: Must have at least 1 method per country\n- **amount**: Must be >= 0 (cannot be negative)\n- **locationId**: Must exist in Shopify and be active\n\n**Common Errors:**\n\n**400 - Invalid Country Code:**\n```json\n{\"error\": \"Invalid country code 'USA'. Use 'US' instead (ISO 3166-1 alpha-2)\"}\n```\nSolution: Use 2-letter codes (US, CA, GB, AU, etc.)\n\n**400 - Invalid Location ID:**\n```json\n{\"error\": \"Location not found: gid://shopify/Location/99999\"}\n```\nSolution: Verify location exists via `/data/locations` endpoint\n\n**400 - Missing Delivery Methods:**\n```json\n{\"error\": \"Country US has no delivery methods configured\"}\n```\nSolution: Add at least one delivery method to each country\n\n**400 - Invalid Province Code:**\n```json\n{\"error\": \"Province code 'California' invalid for US. Use 'CA'\"}\n```\nSolution: Use 2-letter state codes (CA, NY, TX), not full names\n\n**500 - Shopify API Error:**\nShopify's delivery profile API rejected the request. Common reasons:\n- Duplicate profile name\n- Missing required Shopify permissions\n- Shopify API rate limit exceeded\n- Invalid zone configuration\n\n**Response (DeliveryProfileDTO):**\nReturns created profile with:\n- `id`: Shopify delivery profile ID\n- `profileName`: Confirmed profile name\n- `active`: Whether profile is active (true by default)\n- `locationGroupId`: Shopify internal location group ID\n\n**How to Get Location IDs:**\n```\nGET /api/data/locations\nResponse:\n{\n \"locations\": {\n \"nodes\": [\n {\n \"id\": \"gid://shopify/Location/12345\",\n \"name\": \"Main Warehouse\"\n }\n ]\n }\n}\n```\n\n**Best Practices:**\n1. **Test with One Country First**: Start with single country, add more after validation\n2. **Use Descriptive Names**: \"VIP Free Shipping\" better than \"Profile 1\"\n3. **Verify Location IDs**: Always fetch current locations before creating profile\n4. **Set Reasonable Rates**: Research competitor shipping prices\n5. **Provide Descriptions**: Help customers understand shipping options\n6. **Weight Limits**: Use for heavy items requiring freight shipping\n\n**Authentication:** Requires API key authentication via X-API-Key header or api_key parameter","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json post /api/external/v2/delivery-profiles/v2/create-shipping-profile","href":"/memberships-admin-api/shipping-\u0026-delivery-profiles/create-shippingdelivery-profile-v2-format"}]},{"group":"Product Swap Rules","pages":[{"title":"Get product swap options for membership items","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json post /api/external/v2/product-swaps-by-variant-groups","href":"/memberships-admin-api/product-swap-rules/get-product-swap-options-for-membership-items"}]},{"group":"Billing \u0026 Orders","pages":[{"title":"Update membership billing attempt","description":"Updates billing attempt details for a membership contract. Billing attempts represent individual charge attempts for recurring membership orders.\n\n**Key Information Updated:**\n- **Billing Date**: Next scheduled billing/charge date\n- **Status**: Success, failed, pending, or scheduled\n- **Error Messages**: Failure reasons for declined payments\n- **Retry Count**: Number of retry attempts made\n- **Order ID**: Associated Shopify order if billing succeeded\n- **Amount**: Billing amount charged or attempted\n\n**Billing Attempt Lifecycle:**\n1. **Scheduled**: Billing attempt is queued for future processing\n2. **Pending**: Charge is being processed by payment gateway\n3. **Success**: Payment captured, order created\n4. **Failed**: Payment declined or error occurred\n5. **Retrying**: Automatic retry scheduled after failure\n\n**Common Use Cases:**\n- Reschedule failed billing attempts to a new date\n- Update billing date to align with customer preferences\n- Mark manual payment reconciliation in external systems\n- Sync billing status with external payment processors\n- Trigger retry logic for failed payment attempts\n- Update billing metadata for reporting and analytics\n\n**Important Notes:**\n- Changing billing date will affect the membership's billing cycle\n- Only pending or failed attempts can typically be modified\n- Successfully billed attempts are immutable in most cases\n\n**Authentication:** Requires API key authentication via X-API-Key header or api_key parameter","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-billing-attempts","href":"/memberships-admin-api/billing-\u0026-orders/update-membership-billing-attempt"},{"title":"Update order note for billing attempt","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-billing-attempts-update-order-note/{id}","href":"/memberships-admin-api/billing-\u0026-orders/update-order-note-for-billing-attempt"},{"title":"Retry billing for failed attempt","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-billing-attempts/attempt-billing/{id}","href":"/memberships-admin-api/billing-\u0026-orders/retry-billing-for-failed-attempt"},{"title":"Get past orders","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json get /api/external/v2/subscription-billing-attempts/past-orders","href":"/memberships-admin-api/billing-\u0026-orders/get-past-orders"},{"title":"Get paginated past or upcoming orders report","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json get /api/external/v2/subscription-billing-attempts/past-orders/report","href":"/memberships-admin-api/billing-\u0026-orders/get-paginated-past-or-upcoming-orders-report"},{"title":"Skip upcoming membership order","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-billing-attempts/skip-order/{id}","href":"/memberships-admin-api/billing-\u0026-orders/skip-upcoming-membership-order"},{"title":"Get upcoming orders","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json get /api/external/v2/subscription-billing-attempts/top-orders","href":"/memberships-admin-api/billing-\u0026-orders/get-upcoming-orders"}]},{"group":"One-Time Add-Ons","pages":[{"title":"Get one-time add-ons for a membership contract","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json get /api/external/v2/subscription-contract-one-offs-by-contractId","href":"/memberships-admin-api/one-time-add-ons/get-one-time-add-ons-for-a-membership-contract"},{"title":"Add one-time product to upcoming order","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json put /api/external/v2/subscription-contract-one-offs-by-contractId-and-billing-attempt-id","href":"/memberships-admin-api/one-time-add-ons/add-one-time-product-to-upcoming-order"},{"title":"Remove one-time product from upcoming order","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json delete /api/external/v2/subscription-contract-one-offs-by-contractId-and-billing-attempt-id","href":"/memberships-admin-api/one-time-add-ons/remove-one-time-product-from-upcoming-order"}]},{"group":"Custom CSS Styling","pages":[{"title":"Get custom CSS styling configuration","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json get /api/external/v2/subscription-custom-csses/{id}","href":"/memberships-admin-api/custom-css-styling/get-custom-css-styling-configuration"}]},{"group":"Membership Plans","pages":[{"title":"List all membership plan groups","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json get /api/external/v2/subscription-groups","href":"/memberships-admin-api/membership-plans/list-all-membership-plan-groups"},{"title":"Get a membership plan group","deprecated":null,"version":null,"openapi":"/memberships/admin-api-swagger.json get /api/external/v2/subscription-groups/{subscriptionGroupId}","href":"/memberships-admin-api/membership-plans/get-a-membership-plan-group"}]}]},{"group":"Customer Portal API","pages":[{"group":"Cancellation Flow Configuration","pages":[{"title":"Get cancellation flow settings","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/cancellation-managements/{id}","href":"/memberships-customer-portal-api/cancellation-flow-configuration/get-cancellation-flow-settings"}]},{"group":"Customer Discount History","pages":[{"title":"Get past discount history","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/customer-discount-code-infos/get-past-discounts","href":"/memberships-customer-portal-api/customer-discount-history/get-past-discount-history"}]},{"group":"Customer Portal Configuration","pages":[{"title":"Get customer portal settings","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/customer-portal-settings/{id}","href":"/memberships-customer-portal-api/customer-portal-configuration/get-customer-portal-settings"},{"title":"Get customer portal label translations for locale","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/label-translations/locale","href":"/memberships-customer-portal-api/customer-portal-configuration/get-customer-portal-label-translations-for-locale"}]},{"group":"Customer Retention","pages":[{"title":"Create retention activity record","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json post /memberships/cp/api/customer-retention-activities","href":"/memberships-customer-portal-api/customer-retention/create-retention-activity-record"}]},{"group":"Product \u0026 Inventory Data","pages":[{"title":"Get product details by ID","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/data/product","href":"/memberships-customer-portal-api/product-\u0026-inventory-data/get-product-details-by-id"},{"title":"Get product with selling plans and variants","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/data/product-selling-plan-variant","href":"/memberships-customer-portal-api/product-\u0026-inventory-data/get-product-with-selling-plans-and-variants"},{"title":"Search membership-enabled products with pagination","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/data/products","href":"/memberships-customer-portal-api/product-\u0026-inventory-data/search-membership-enabled-products-with-pagination"},{"title":"List products attached to selling plans","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/data/selling-plan-products","href":"/memberships-customer-portal-api/product-\u0026-inventory-data/list-products-attached-to-selling-plans"},{"title":"Get contextual pricing for a variant by currency","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/data/variant-contextual-pricing","href":"/memberships-customer-portal-api/product-\u0026-inventory-data/get-contextual-pricing-for-a-variant-by-currency"}]},{"group":"Shipping \u0026 Delivery Profiles","pages":[{"title":"Get pickup locations","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/delivery-profiles/get-locations","href":"/memberships-customer-portal-api/shipping-\u0026-delivery-profiles/get-pickup-locations"}]},{"group":"Loyalty Integration","pages":[{"title":"Get loyalty customer details","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/loyalty-integration/customer","href":"/memberships-customer-portal-api/loyalty-integration/get-loyalty-customer-details"},{"title":"Get loyalty point earn options","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/loyalty-integration/earn-options","href":"/memberships-customer-portal-api/loyalty-integration/get-loyalty-point-earn-options"},{"title":"Redeem loyalty points","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json post /memberships/cp/api/loyalty-integration/redeem","href":"/memberships-customer-portal-api/loyalty-integration/redeem-loyalty-points"},{"title":"Get loyalty point redeem options","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/loyalty-integration/redeem-options","href":"/memberships-customer-portal-api/loyalty-integration/get-loyalty-point-redeem-options"}]},{"group":"notification-resource","pages":[{"title":"Get membershipscpapinotification session","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/notification-session","href":"/memberships-customer-portal-api/notification-resource/get-membershipscpapinotification-session"}]},{"group":"Product Swap Rules","pages":[{"title":"Get product swap options by variant","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json post /memberships/cp/api/product-swaps-by-variant-groups","href":"/memberships-customer-portal-api/product-swap-rules/get-product-swap-options-by-variant"}]},{"group":"Shop Settings","pages":[{"title":"Get shop info for current user","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/shop-infos-by-current-login","href":"/memberships-customer-portal-api/shop-settings/get-shop-info-for-current-user"}]},{"group":"Billing \u0026 Orders","pages":[{"title":"Update billing attempt","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json put /memberships/cp/api/subscription-billing-attempts","href":"/memberships-customer-portal-api/billing-\u0026-orders/update-billing-attempt"},{"title":"Trigger billing attempt","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json put /memberships/cp/api/subscription-billing-attempts/attempt-billing/{id}","href":"/memberships-customer-portal-api/billing-\u0026-orders/trigger-billing-attempt"},{"title":"Get past orders","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/subscription-billing-attempts/past-orders","href":"/memberships-customer-portal-api/billing-\u0026-orders/get-past-orders"},{"title":"Skip an upcoming billing order","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json put /memberships/cp/api/subscription-billing-attempts/skip-order/{id}","href":"/memberships-customer-portal-api/billing-\u0026-orders/skip-an-upcoming-billing-order"},{"title":"Get upcoming orders","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/subscription-billing-attempts/top-orders","href":"/memberships-customer-portal-api/billing-\u0026-orders/get-upcoming-orders"}]},{"group":"Membership Contracts","pages":[{"title":"Update membership contract details","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json put /memberships/cp/api/subscription-contract-details","href":"/memberships-customer-portal-api/membership-contracts/update-membership-contract-details"},{"title":"Get current billing cycle","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/subscription-contract-details/current-cycle/{contractId}","href":"/memberships-customer-portal-api/membership-contracts/get-current-billing-cycle"},{"title":"Get customer membership details","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/subscription-contract-details/customer/{contractId}","href":"/memberships-customer-portal-api/membership-contracts/get-customer-membership-details"},{"title":"Get customer payment methods","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/subscription-contract-details/shopify/customer/{customerId}/payment-methods","href":"/memberships-customer-portal-api/membership-contracts/get-customer-payment-methods"},{"title":"List Shopify fulfillments for a membership contract","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/subscription-contract-details/subscription-fulfillments/{contractId}","href":"/memberships-customer-portal-api/membership-contracts/list-shopify-fulfillments-for-a-membership-contract"},{"title":"Get pending downgrade","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/subscription-contract-details/{contractId}/pending-downgrade","href":"/memberships-customer-portal-api/membership-contracts/get-pending-downgrade"},{"title":"Cancel pending downgrade","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json delete /memberships/cp/api/subscription-contract-details/{contractId}/pending-downgrade","href":"/memberships-customer-portal-api/membership-contracts/cancel-pending-downgrade"},{"title":"Update line item variant","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json put /memberships/cp/api/subscription-contract-update-variant","href":"/memberships-customer-portal-api/membership-contracts/update-line-item-variant"},{"title":"Apply discount code","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json put /memberships/cp/api/subscription-contracts-apply-discount","href":"/memberships-customer-portal-api/membership-contracts/apply-discount-code"},{"title":"Apply cancellation retention discount","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json put /memberships/cp/api/subscription-contracts-cancellation-discount","href":"/memberships-customer-portal-api/membership-contracts/apply-cancellation-retention-discount"},{"title":"Send magic link email","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/subscription-contracts-email-magic-link","href":"/memberships-customer-portal-api/membership-contracts/send-magic-link-email"},{"title":"Remove discount from contract","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json put /memberships/cp/api/subscription-contracts-remove-discount","href":"/memberships-customer-portal-api/membership-contracts/remove-discount-from-contract"},{"title":"Remove line item from contract","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json put /memberships/cp/api/subscription-contracts-remove-line-item","href":"/memberships-customer-portal-api/membership-contracts/remove-line-item-from-contract"},{"title":"Update next billing date","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json put /memberships/cp/api/subscription-contracts-update-billing-date","href":"/memberships-customer-portal-api/membership-contracts/update-next-billing-date"},{"title":"Update billing interval","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json put /memberships/cp/api/subscription-contracts-update-billing-interval","href":"/memberships-customer-portal-api/membership-contracts/update-billing-interval"},{"title":"Update existing payment method details","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json put /memberships/cp/api/subscription-contracts-update-existing-payment-method","href":"/memberships-customer-portal-api/membership-contracts/update-existing-payment-method-details"},{"title":"Update line item attributes","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json put /memberships/cp/api/subscription-contracts-update-line-item-attributes","href":"/memberships-customer-portal-api/membership-contracts/update-line-item-attributes"},{"title":"Update order note","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json put /memberships/cp/api/subscription-contracts-update-order-note/{contractId}","href":"/memberships-customer-portal-api/membership-contracts/update-order-note"},{"title":"Update payment method","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json put /memberships/cp/api/subscription-contracts-update-payment-method","href":"/memberships-customer-portal-api/membership-contracts/update-payment-method"},{"title":"Update shipping address","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json put /memberships/cp/api/subscription-contracts-update-shipping-address","href":"/memberships-customer-portal-api/membership-contracts/update-shipping-address"},{"title":"Update membership contract status","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json put /memberships/cp/api/subscription-contracts-update-status","href":"/memberships-customer-portal-api/membership-contracts/update-membership-contract-status"},{"title":"Get raw Shopify membership contract data","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/subscription-contracts/contract-external/{contractId}","href":"/memberships-customer-portal-api/membership-contracts/get-raw-shopify-membership-contract-data"},{"title":"Get membership contract details","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/subscription-contracts/contract/{contractId}","href":"/memberships-customer-portal-api/membership-contracts/get-membership-contract-details"},{"title":"Cancel a membership contract","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json delete /memberships/cp/api/subscription-contracts/{id}","href":"/memberships-customer-portal-api/membership-contracts/cancel-a-membership-contract"},{"title":"Get current customer's membership profile","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/subscription-customers","href":"/memberships-customer-portal-api/membership-contracts/get-current-customers-membership-profile"},{"title":"Get valid membership contracts for a customer","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/subscription-customers-detail/valid/{id}","href":"/memberships-customer-portal-api/membership-contracts/get-valid-membership-contracts-for-a-customer"},{"title":"List current customer's valid membership contract IDs","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/subscription-customers/valid","href":"/memberships-customer-portal-api/membership-contracts/list-current-customers-valid-membership-contract-ids"},{"title":"Add line item to contract","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json put /memberships/cp/api/v2/subscription-contracts-add-line-item","href":"/memberships-customer-portal-api/membership-contracts/add-line-item-to-contract"}]},{"group":"One-Time Add-Ons","pages":[{"title":"Get one-off items for contract","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/subscription-contract-one-offs-by-contractId","href":"/memberships-customer-portal-api/one-time-add-ons/get-one-off-items-for-contract"},{"title":"Add or update one-off item","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json put /memberships/cp/api/subscription-contract-one-offs-by-contractId-and-billing-attempt-id","href":"/memberships-customer-portal-api/one-time-add-ons/add-or-update-one-off-item"}]},{"group":"Custom CSS Styling","pages":[{"title":"Get custom CSS styles","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/subscription-custom-csses/{id}","href":"/memberships-customer-portal-api/custom-css-styling/get-custom-css-styles"}]},{"group":"Membership Plans","pages":[{"title":"Get all selling plans","deprecated":null,"version":null,"openapi":"/memberships/storefront-api-swagger.json get /memberships/cp/api/subscription-groups/all-selling-plans","href":"/memberships-customer-portal-api/membership-plans/get-all-selling-plans"}]}]}]},{"product":"Bundles","icon":"boxes-stacked","description":"Fixed, dynamic, and volume-discount bundles plus Build-a-Box","pages":[{"title":"Bundles","href":"/bundles/introduction"}]}]},"title":"Get product swap options for membership items - Appstle","buildId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","deploymentId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","dynamics":["c2aa737661","b0f84f53ff","a9bb46feb3","2b790eda92"],"chunks":["OpenApiReferenceProvider-rfhihCWU.js","utils-BmH1XFxk.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-BcNsxPKB.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-BAES3tkd.js","snippetPresets-DCMQBKLP.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","Page-D5fEM6aW.js","ApiExamples-D6l_bzE9.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BOktbnNh.js","shallow-BCs8SgM7.js","getApiPlaygroundDisplay-DEmW5bJB.js","CodeSnippet-CpZOpB9C.js","CodeSnippets-BOBDqibl.js","getPastedJson-DH2JBvmr.js","icon-BBJH-kKh.js","MethodPill-D2Sd5NLC.js","DuplicateIcon-CGgfL2qN.js","createIcon-BKudBBzi.js","DynamicMarkdown-85clUA0i.js","SectionHeading-D0JiMgDx.js","axios-vUo_bRtp.js","Markdown-Cfiy0xZO.js","clsx-rL8ZCCw4.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-aeztFa9U.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BywkCr5C.js"]}