# Merge Variants POST https://api.shipbob.com/2026-01/variant/{variantId}:merge Content-Type: application/json Merges multiple product variants into a target variant. Provide an array of variant IDs to merge into the target variant specified in the path. Inventory from the merged variants will be consolidated into the target variant. Reference: https://developer.shipbob.com/api/products/merge-variants ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: api-2026-01 version: 1.0.0 paths: /2026-01/variant/{variantId}:merge: post: operationId: merge-variants summary: Merge Variants description: >- Merges multiple product variants into a target variant. Provide an array of variant IDs to merge into the target variant specified in the path. Inventory from the merged variants will be consolidated into the target variant. tags: - subpackage_products parameters: - name: variantId in: path description: | The ID of the variant to use as the merge target required: true schema: type: string format: int64 - name: Authorization in: header description: Authentication using Personal Access Token (PAT) token or OAuth2 required: true schema: type: string responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/Products.ProductViewModelV5' requestBody: description: The variants that should be merged to the target variant content: application/json: schema: $ref: '#/components/schemas/Products.MergeVariantRequestModelArray' servers: - url: https://api.shipbob.com - url: https://sandbox-api.shipbob.com components: schemas: Products.MergeVariantRequestModel: type: object properties: id: type: integer format: int64 title: Products.MergeVariantRequestModel Products.MergeVariantRequestModelArray: type: array items: $ref: '#/components/schemas/Products.MergeVariantRequestModel' title: Products.MergeVariantRequestModelArray Products.TaxonomyInformationViewModel: type: object properties: id: type: - integer - 'null' description: Unique identifier for the taxonomy name: type: - string - 'null' description: Name of this taxonomy category parent_id: type: - integer - 'null' description: ID of the parent category in the taxonomy hierarchy parent_name: type: - string - 'null' description: Name of the parent category in the taxonomy hierarchy path: type: - string - 'null' description: >- Full hierarchical path of the taxonomy category (e.g., 'Electronics > Computers > Laptops') title: Products.TaxonomyInformationViewModel Products.AdditionalHazmatAttributesViewModel: type: object properties: charge_state_percentage: type: - number - 'null' format: double container_metal: type: - boolean - 'null' container_type: type: - string - 'null' lithium_battery_packaging: type: - string - 'null' lithium_battery_type: type: - string - 'null' magnet: type: - boolean - 'null' net_volume: type: - number - 'null' format: double net_weight: type: - number - 'null' format: double title: Products.AdditionalHazmatAttributesViewModel Products.AssociatedBundlesViewModel: type: object properties: product_id: type: integer format: int64 product_name: type: - string - 'null' quantity: type: integer variant_id: type: integer format: int64 variant_sku: type: - string - 'null' title: Products.AssociatedBundlesViewModel Products.BundleDefinitionViewModel: type: object properties: product_id: type: integer format: int64 quantity: type: integer variant_id: type: integer format: int64 variant_name: type: - string - 'null' variant_sku: type: - string - 'null' title: Products.BundleDefinitionViewModel Products.CustomsViewModel: type: object properties: country_code_of_origin: type: - string - 'null' description: >- ISO 3166-1 alpha-2 country code where the product was manufactured (e.g., 'US', 'CN', 'MX') currency: type: - string - 'null' description: >- ISO 4217 currency code for the declared value (e.g., 'USD', 'EUR', 'GBP') description: type: - string - 'null' description: Product description for customs documentation hs_tariff_code: type: - string - 'null' description: >- Harmonized System tariff code used for international customs classification (6-10 digits) is321_eligible: type: boolean description: >- Flag indicating eligibility for Section 321 de minimis exemption (imports under $800 to US) value: type: - integer - 'null' description: Declared customs value of the product for international shipping title: Products.CustomsViewModel Products.DimensionViewModel: type: object properties: height: type: number format: double description: Height of the product is_locked: type: boolean description: >- Flag indicating whether dimensions are locked and cannot be automatically recalculated by the system length: type: number format: double description: Length of the product source: type: - string - 'null' description: Source of the dimension data (e.g., 'User', 'System', 'Warehouse') unit: type: - string - 'null' description: Unit of measurement for dimensions (e.g., 'in', 'cm') width: type: number format: double description: Width of the product title: Products.DimensionViewModel Products.SerialScanViewModel: type: object properties: exact_character_length: type: - integer - 'null' is_enabled: type: boolean prefix: type: - string - 'null' suffix: type: - string - 'null' title: Products.SerialScanViewModel Products.FulfillmentSettingsViewModel: type: object properties: dangerous_goods: type: boolean description: >- Flag indicating whether the product is classified as dangerous goods (hazmat) requiring special handling is_bpm_parcel: type: boolean description: >- Flag indicating whether this product qualifies for Business Parcel Manager (BPM) parcel shipping is_case_pick: type: boolean description: >- Flag indicating whether this product should be picked by the case rather than individual units msds_url: type: - string - 'null' description: URL to the Material Safety Data Sheet (MSDS) for hazardous materials requires_prop65: type: boolean description: >- Flag indicating California Proposition 65 warning label requirement for products containing chemicals known to cause cancer or reproductive harm serial_scan: $ref: '#/components/schemas/Products.SerialScanViewModel' description: Serial number scanning configuration for tracking individual units title: Products.FulfillmentSettingsViewModel Products.InventoryViewModel: type: object properties: inventory_id: type: - integer - 'null' on_hand_qty: type: integer title: Products.InventoryViewModel Products.LotInformationViewModel: type: object properties: is_lot: type: boolean minimum_shelf_life_days: type: - integer - 'null' title: Products.LotInformationViewModel Products.MergedChildrenViewModel: type: object properties: channel_ids: type: - array - 'null' items: type: integer format: int64 completed_at: type: string format: date-time inventory_id: type: - integer - 'null' format: int64 variant_id: type: integer format: int64 variant_name: type: - string - 'null' title: Products.MergedChildrenViewModel Products.EnumViewModel: type: object properties: id: type: integer format: int64 name: type: - string - 'null' title: Products.EnumViewModel Products.ReturnPreferencesViewModel: type: object properties: backup_action: $ref: '#/components/schemas/Products.EnumViewModel' description: Backup action to take if primary action cannot be completed instructions: type: - string - 'null' description: Special instructions for handling returned items primary_action: $ref: '#/components/schemas/Products.EnumViewModel' description: >- Primary action to take when product is returned by customer (e.g., 'Restock', 'Dispose', 'Return to Sender') return_to_sender_backup_action: $ref: '#/components/schemas/Products.EnumViewModel' description: >- Backup action for undeliverable packages if primary action cannot be completed return_to_sender_primary_action: $ref: '#/components/schemas/Products.EnumViewModel' description: >- Primary action for undeliverable packages that are returned to sender title: Products.ReturnPreferencesViewModel Products.WeightViewModel: type: object properties: unit: type: - string - 'null' description: Unit of measurement for weight (e.g., 'lb', 'oz', 'kg', 'g') weight: type: number format: double description: Weight value of the product title: Products.WeightViewModel Products.BarcodeViewModel: type: object properties: sticker_url: type: - string - 'null' description: URL to download or view a printable barcode sticker value: type: - string - 'null' description: The barcode value (e.g., UPC, EAN, GTIN, or other barcode format) title: Products.BarcodeViewModel Products.ChannelMetadataViewModel: type: object properties: channel_id: type: integer format: int64 channel_name: type: - string - 'null' currency: type: - string - 'null' id: type: integer format: int64 is_inventory_sync_enabled: type: boolean legacy_product_id: type: - integer - 'null' format: int64 platform: type: - string - 'null' platform_identifier: type: - string - 'null' platform_inventory_item_id: type: - string - 'null' price: type: number format: double seller_sku: type: - string - 'null' title: Products.ChannelMetadataViewModel Products.AmazonChannelMetadataViewModel: type: object properties: channel_id: type: integer format: int64 channel_name: type: - string - 'null' currency: type: - string - 'null' id: type: integer format: int64 is_inventory_sync_enabled: type: boolean legacy_product_id: type: - integer - 'null' format: int64 platform: type: - string - 'null' platform_identifier: type: - string - 'null' platform_inventory_item_id: type: - string - 'null' price: type: number format: double seller_sku: type: - string - 'null' asin: type: - string - 'null' fnsku: type: - string - 'null' fulfillment_channel: type: - string - 'null' title: Products.AmazonChannelMetadataViewModel Products.BigCommerceChannelMetadataViewModel: type: object properties: channel_id: type: integer format: int64 channel_name: type: - string - 'null' currency: type: - string - 'null' id: type: integer format: int64 is_inventory_sync_enabled: type: boolean legacy_product_id: type: - integer - 'null' format: int64 platform: type: - string - 'null' platform_identifier: type: - string - 'null' platform_inventory_item_id: type: - string - 'null' price: type: number format: double seller_sku: type: - string - 'null' platform_product_id: type: - integer - 'null' format: int64 platform_variant_id: type: - integer - 'null' format: int64 title: Products.BigCommerceChannelMetadataViewModel Products.ShopifyChannelMetadataViewModel: type: object properties: channel_id: type: integer format: int64 channel_name: type: - string - 'null' currency: type: - string - 'null' id: type: integer format: int64 is_inventory_sync_enabled: type: boolean legacy_product_id: type: - integer - 'null' format: int64 platform: type: - string - 'null' platform_identifier: type: - string - 'null' platform_inventory_item_id: type: - string - 'null' price: type: number format: double seller_sku: type: - string - 'null' title: Products.ShopifyChannelMetadataViewModel ProductsVariantViewModelV5ChannelMetadataItems: oneOf: - $ref: '#/components/schemas/Products.ChannelMetadataViewModel' - $ref: '#/components/schemas/Products.AmazonChannelMetadataViewModel' - $ref: '#/components/schemas/Products.BigCommerceChannelMetadataViewModel' - $ref: '#/components/schemas/Products.ShopifyChannelMetadataViewModel' title: ProductsVariantViewModelV5ChannelMetadataItems Products.VariantViewModelV5: type: object properties: additional_hazmat_attributes: $ref: '#/components/schemas/Products.AdditionalHazmatAttributesViewModel' description: >- Additional hazardous materials attributes for lithium batteries and dangerous goods associated_bundles: type: - array - 'null' items: $ref: '#/components/schemas/Products.AssociatedBundlesViewModel' description: List of bundle products that include this variant as a component bundle_definition: type: - array - 'null' items: $ref: '#/components/schemas/Products.BundleDefinitionViewModel' description: >- If this variant is a bundle, defines which variants and quantities make up the bundle created_on: type: string format: date-time description: Timestamp when the variant was created customs: $ref: '#/components/schemas/Products.CustomsViewModel' description: >- Customs and international shipping information (tariff codes, country of origin, declared value) dimension: $ref: '#/components/schemas/Products.DimensionViewModel' description: Physical dimensions of the variant (length, width, height) fulfillment_settings: $ref: '#/components/schemas/Products.FulfillmentSettingsViewModel' description: >- Fulfillment-specific settings (Prop 65, dangerous goods, serial scanning, case pick) gtin: type: - string - 'null' description: Global Trade Item Number - standardized product identifier id: type: integer format: int64 description: Unique identifier for the variant inventory: $ref: '#/components/schemas/Products.InventoryViewModel' description: Current inventory information including on-hand quantity is_digital: type: boolean description: >- Flag indicating whether this is a digital product (no physical fulfillment) is_image_uploaded: type: boolean description: >- Flag indicating whether a product image has been uploaded for this variant lot_information: $ref: '#/components/schemas/Products.LotInformationViewModel' description: >- Lot tracking settings including whether lot tracking is enabled and minimum shelf life requirements merge_children: type: - array - 'null' items: $ref: '#/components/schemas/Products.MergedChildrenViewModel' description: List of variants that have been merged into this variant name: type: - string - 'null' description: Variant name or descriptor packaging_material_type: $ref: '#/components/schemas/Products.EnumViewModel' description: Type of packaging material used for this variant (ID and name) packaging_requirement: $ref: '#/components/schemas/Products.EnumViewModel' description: Special packaging requirements for this variant (ID and name) return_preferences: $ref: '#/components/schemas/Products.ReturnPreferencesViewModel' description: >- Customer return handling preferences including primary and backup actions reviews_pending: type: - array - 'null' items: type: string description: >- List of pending review types for this variant (e.g., compliance checks, quality reviews) sku: type: - string - 'null' description: >- Stock Keeping Unit - unique identifier for the variant used in inventory management status: type: - string - 'null' description: Current status of the variant (e.g., 'Active', 'Inactive') upc: type: - string - 'null' description: Universal Product Code - 12-digit barcode identifier updated_on: type: - string - 'null' format: date-time description: Timestamp when the variant was last updated weight: $ref: '#/components/schemas/Products.WeightViewModel' description: Weight of the variant including unit of measure barcodes: type: - array - 'null' items: $ref: '#/components/schemas/Products.BarcodeViewModel' description: List of barcodes associated with this variant (UPC, EAN, etc.) channel_metadata: type: - array - 'null' items: $ref: >- #/components/schemas/ProductsVariantViewModelV5ChannelMetadataItems description: >- Platform-specific metadata for sales channels (e.g., Amazon ASIN, Shopify product IDs) title: Products.VariantViewModelV5 Products.ComplianceViewModel: type: object properties: category: type: - array - 'null' items: type: string reasons: type: - array - 'null' items: type: string status: type: - string - 'null' title: Products.ComplianceViewModel Products.VariantInternalViewModelV5: type: object properties: additional_hazmat_attributes: $ref: '#/components/schemas/Products.AdditionalHazmatAttributesViewModel' description: >- Additional hazardous materials attributes for lithium batteries and dangerous goods associated_bundles: type: - array - 'null' items: $ref: '#/components/schemas/Products.AssociatedBundlesViewModel' description: List of bundle products that include this variant as a component bundle_definition: type: - array - 'null' items: $ref: '#/components/schemas/Products.BundleDefinitionViewModel' description: >- If this variant is a bundle, defines which variants and quantities make up the bundle created_on: type: string format: date-time description: Timestamp when the variant was created customs: $ref: '#/components/schemas/Products.CustomsViewModel' description: >- Customs and international shipping information (tariff codes, country of origin, declared value) dimension: $ref: '#/components/schemas/Products.DimensionViewModel' description: Physical dimensions of the variant (length, width, height) fulfillment_settings: $ref: '#/components/schemas/Products.FulfillmentSettingsViewModel' description: >- Fulfillment-specific settings (Prop 65, dangerous goods, serial scanning, case pick) gtin: type: - string - 'null' description: Global Trade Item Number - standardized product identifier id: type: integer format: int64 description: Unique identifier for the variant inventory: $ref: '#/components/schemas/Products.InventoryViewModel' description: Current inventory information including on-hand quantity is_digital: type: boolean description: >- Flag indicating whether this is a digital product (no physical fulfillment) is_image_uploaded: type: boolean description: >- Flag indicating whether a product image has been uploaded for this variant lot_information: $ref: '#/components/schemas/Products.LotInformationViewModel' description: >- Lot tracking settings including whether lot tracking is enabled and minimum shelf life requirements merge_children: type: - array - 'null' items: $ref: '#/components/schemas/Products.MergedChildrenViewModel' description: List of variants that have been merged into this variant name: type: - string - 'null' description: Variant name or descriptor packaging_material_type: $ref: '#/components/schemas/Products.EnumViewModel' description: Type of packaging material used for this variant (ID and name) packaging_requirement: $ref: '#/components/schemas/Products.EnumViewModel' description: Special packaging requirements for this variant (ID and name) return_preferences: $ref: '#/components/schemas/Products.ReturnPreferencesViewModel' description: >- Customer return handling preferences including primary and backup actions reviews_pending: type: - array - 'null' items: type: string description: >- List of pending review types for this variant (e.g., compliance checks, quality reviews) sku: type: - string - 'null' description: >- Stock Keeping Unit - unique identifier for the variant used in inventory management status: type: - string - 'null' description: Current status of the variant (e.g., 'Active', 'Inactive') upc: type: - string - 'null' description: Universal Product Code - 12-digit barcode identifier updated_on: type: - string - 'null' format: date-time description: Timestamp when the variant was last updated weight: $ref: '#/components/schemas/Products.WeightViewModel' description: Weight of the variant including unit of measure barcodes: type: - array - 'null' items: $ref: '#/components/schemas/Products.BarcodeViewModel' description: List of barcodes associated with this variant (UPC, EAN, etc.) channel_metadata: type: - array - 'null' items: $ref: >- #/components/schemas/ProductsVariantViewModelV5ChannelMetadataItems description: >- Platform-specific metadata for sales channels (e.g., Amazon ASIN, Shopify product IDs) compliance: $ref: '#/components/schemas/Products.ComplianceViewModel' title: Products.VariantInternalViewModelV5 ProductsProductViewModelV5VariantsItems: oneOf: - $ref: '#/components/schemas/Products.VariantViewModelV5' - $ref: '#/components/schemas/Products.VariantInternalViewModelV5' title: ProductsProductViewModelV5VariantsItems Products.ProductViewModelV5: type: object properties: created_on: type: string format: date-time description: Timestamp when the product was created id: type: integer format: int64 description: Unique identifier for the product name: type: - string - 'null' description: Product name taxonomy: $ref: '#/components/schemas/Products.TaxonomyInformationViewModel' description: Product categorization information including category hierarchy type: type: - string - 'null' description: Product type (e.g., 'Regular' or 'Bundle') updated_on: type: - string - 'null' format: date-time description: Timestamp when the product was last updated user_id: type: integer format: int64 description: ID of the user who owns this product variants: type: - array - 'null' items: $ref: '#/components/schemas/ProductsProductViewModelV5VariantsItems' description: >- List of variants belonging to this product. Each variant represents a specific SKU. title: Products.ProductViewModelV5 securitySchemes: PAT: type: http scheme: bearer description: Authentication using Personal Access Token (PAT) token or OAuth2 ``` ## SDK Code Examples ```python Products_mergeVariants_example import requests url = "https://api.shipbob.com/2026-01/variant/variantId:merge" payload = [{ "id": 0 }] headers = { "Authorization": "Bearer ", "Content-Type": "application/json" } response = requests.post(url, json=payload, headers=headers) print(response.json()) ``` ```javascript Products_mergeVariants_example const url = 'https://api.shipbob.com/2026-01/variant/variantId:merge'; const options = { method: 'POST', headers: {Authorization: 'Bearer ', 'Content-Type': 'application/json'}, body: '[{"id":0}]' }; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go Products_mergeVariants_example package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.shipbob.com/2026-01/variant/variantId:merge" payload := strings.NewReader("[\n {\n \"id\": 0\n }\n]") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby Products_mergeVariants_example require 'uri' require 'net/http' url = URI("https://api.shipbob.com/2026-01/variant/variantId:merge") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "[\n {\n \"id\": 0\n }\n]" response = http.request(request) puts response.read_body ``` ```java Products_mergeVariants_example import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.shipbob.com/2026-01/variant/variantId:merge") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("[\n {\n \"id\": 0\n }\n]") .asString(); ``` ```php Products_mergeVariants_example request('POST', 'https://api.shipbob.com/2026-01/variant/variantId:merge', [ 'body' => '[ { "id": 0 } ]', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp Products_mergeVariants_example using RestSharp; var client = new RestClient("https://api.shipbob.com/2026-01/variant/variantId:merge"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "[\n {\n \"id\": 0\n }\n]", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift Products_mergeVariants_example import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = [["id": 0]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.shipbob.com/2026-01/variant/variantId:merge")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ```