> ## Documentation Index
> Fetch the complete documentation index at: https://www.commercengine.io/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Create variant

> Create variant



## OpenAPI

````yaml https://openapi.commercengine.io/ce-admin.json post /catalog/products/{id}/variants
openapi: 3.1.0
info:
  title: CE Admin APIs
  version: '1.0'
  summary: Comprehensive admin interface for managing your e-commerce platform
  description: >-
    Complete administrative API suite for Commerce Engine, providing powerful
    tools to manage products, orders, customers, inventory, analytics, and
    system configuration. Designed for administrators and backend integrations
    requiring full platform control.
  license:
    name: All Rights Reserved
    url: https://www.commercengine.io/contact-us
  contact:
    email: support@commercengine.io
    url: https://www.commercengine.io/contact-us
    name: Support
servers:
  - url: https://staging.api.commercengine.io/api/v1/{store_id}/admin
    description: Staging Server
    variables:
      store_id:
        default: store_id
        description: Store ID
  - url: https://prod.api.commercengine.io/api/v1/{store_id}/admin
    description: Prod Server
    variables:
      store_id:
        default: store_id
        description: Store ID
security:
  - Authorization: []
tags:
  - name: Analytics
    description: Analytics
  - name: Catalog
    description: Catalog
  - name: Coupons & promotions
    description: Coupons & promotions
  - name: Customers
    description: Customers
  - name: Filter Options
    description: Filter Options
  - name: Inventories
    description: Inventories
  - name: Marketplace
    description: Marketplace
  - name: Marketplace Catalog
    description: Marketplace Catalog
  - name: Media Gallery
    description: Media Gallery
  - name: Metrics
    description: Metrics
  - name: Orders
    description: Orders
  - name: Payments
    description: Payments
  - name: Payouts
    description: Payouts
  - name: POS
    description: POS
  - name: POSAdmin
    description: Admin endpoints to be used as proxy in pos
  - name: Segments
    description: Segments
  - name: Shipping
    description: Shipping
  - name: SSE
    description: SSE
  - name: Store
    description: Store
  - name: Webhooks
    description: Webhooks
paths:
  /catalog/products/{id}/variants:
    parameters:
      - name: id
        in: path
        description: product id
        required: true
        schema:
          type: string
    post:
      tags:
        - Catalog
      summary: Create variant
      description: Create variant
      operationId: create-variant
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/CreateVariant'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  success:
                    type: boolean
                  content:
                    properties:
                      variants:
                        type: array
                        items:
                          $ref: '#/components/schemas/VariantDetail'
                    type: object
components:
  schemas:
    CreateVariant:
      title: CreateVariant
      allOf:
        - $ref: '#/components/schemas/VariantCommonDetail'
        - type: object
          required:
            - name
            - associated_options
          properties:
            name:
              type: string
            associated_options:
              type: array
              items:
                $ref: '#/components/schemas/AssociatedOption'
            description:
              type:
                - string
                - 'null'
            images:
              type: array
              items:
                type: string
            videos:
              type: array
              items:
                type: string
            seo:
              $ref: '#/components/schemas/Seo'
            shipping:
              $ref: '#/components/schemas/ProductShipping'
            packaging:
              $ref: '#/components/schemas/ProductPackaging'
            related_products:
              type: object
              properties:
                cross_sell:
                  description: >-
                    Array of IDs. The ID value should be the product ID if a
                    non-variant product is selected. For variant products, the
                    ID should be a combination of the product ID and variant ID,
                    separated by a hyphen ('-').
                  type: array
                  items:
                    type: string
                upsell:
                  description: >-
                    Array of IDs. The ID value should be the product ID if a
                    non-variant product is selected. For variant products, the
                    ID should be a combination of the product ID and variant ID,
                    separated by a hyphen ('-').
                  type: array
                  items:
                    type: string
            promotions:
              $ref: '#/components/schemas/ProductPromotion'
            subscriptions:
              type: array
              items:
                $ref: '#/components/schemas/ProductSubscription'
      examples: []
      x-tags:
        - Catalog
    VariantDetail:
      title: VariantDetail
      allOf:
        - $ref: '#/components/schemas/Variant'
        - type: object
          properties:
            description:
              type: string
            videos:
              type: array
              items:
                $ref: '#/components/schemas/ProductVideo'
            seo:
              $ref: '#/components/schemas/Seo'
            shipping:
              $ref: '#/components/schemas/ProductShipping'
            packaging:
              $ref: '#/components/schemas/ProductPackaging'
            sales_channels:
              type: array
              items:
                $ref: '#/components/schemas/SalesChannel'
            related_products:
              type: object
              properties:
                upsell:
                  type: array
                  items:
                    $ref: '#/components/schemas/ProductBasicDetail'
                cross_sell:
                  type: array
                  items:
                    $ref: '#/components/schemas/ProductBasicDetail'
            promotions:
              $ref: '#/components/schemas/ProductPromotion'
            subscriptions:
              type: array
              items:
                $ref: '#/components/schemas/ProductSubscription'
      examples: []
      x-tags:
        - Catalog
    VariantCommonDetail:
      title: VariantCommonDetail
      type: object
      properties:
        id:
          description: variant id
          type: string
          readOnly: true
        active:
          type: boolean
          readOnly: true
        stock_available:
          type: boolean
          readOnly: true
        is_default:
          type: boolean
        short_description:
          type:
            - string
            - 'null'
        metadata:
          type:
            - object
            - 'null'
          additionalProperties:
            type: string
        sku:
          description: variant sku. can be null for digital product.
          type:
            - string
            - 'null'
        slug:
          description: variant sku. can be null for digital product.
          type: string
        hsn_code:
          type: string
          readOnly: true
        on_offer:
          type: boolean
          readOnly: true
        on_promotion:
          type: boolean
          readOnly: true
        on_subscription:
          type: boolean
          readOnly: true
        product_type:
          enum:
            - physical
            - digital
          readOnly: true
        product_id:
          type: string
          readOnly: true
        product_name:
          type: string
          readOnly: true
        pricing:
          type: array
          items:
            $ref: '#/components/schemas/ProductPricing'
        created_at:
          type: string
          format: date-time
          readOnly: true
        modified_at:
          type: string
          format: date-time
          readOnly: true
        variant_attributes:
          type: array
          items:
            $ref: '#/components/schemas/ProductAttribute'
      examples: []
      x-tags:
        - Catalog
    AssociatedOption:
      title: AssociatedOption
      type: object
      required:
        - attribute_id
        - attribute_value
      properties:
        attribute_id:
          type: string
        attribute_value:
          oneOf:
            - type: string
              description: >-
                Attributes with type of **single-select**, the value will be
                represented as a **string**.
            - $ref: '#/components/schemas/ColorObject'
              description: >-
                **Color** attributes will have their value represented as a
                color object, specifying the color details with name and
                hexcode.
        attribute_name:
          type: string
          readOnly: true
        attribute_type:
          enum:
            - single-select
            - color
          readOnly: true
        key:
          description: value in snake case.
          type: string
          readOnly: true
    Seo:
      title: Seo
      type: object
      required:
        - title
        - description
        - keywords
      properties:
        title:
          type:
            - string
            - 'null'
        description:
          type:
            - string
            - 'null'
        keywords:
          type:
            - array
            - 'null'
    ProductShipping:
      title: ProductShipping
      type: object
      required:
        - handling_charge
      properties:
        handling_charge:
          description: >-
            A handling charge is an additional fee applied to cover the costs
            associated with preparing, packaging, and processing an order for
            shipment or delivery.
          type: number
          minimum: 0
      x-tags:
        - Catalog
    ProductPackaging:
      title: ProductPackaging
      type:
        - object
        - 'null'
      required:
        - pack_width
        - pack_height
        - pack_length
        - pack_dry_weight
        - units_per_pack
        - vertical_rotation
      properties:
        pack_width:
          type: number
          format: float
        pack_height:
          type: number
          format: float
        pack_length:
          type: number
          format: float
        pack_dry_weight:
          type: number
          format: float
        units_per_pack:
          type: integer
          format: int32
        vertical_rotation:
          description: >-
            Indicates whether items can be rotated during packing or if they
            must be kept in a strictly vertical orientation.
          type: boolean
        shipper_width:
          type: number
          format: float
        shipper_height:
          type: number
          format: float
        shipper_length:
          type: number
          format: float
        shipper_dry_weight:
          type: number
          format: float
        units_per_shipper:
          type: integer
          format: int32
      x-tags:
        - Catalog
    ProductPromotion:
      title: ProductPromotion
      oneOf:
        - $ref: '#/components/schemas/DiscountBasedPromotion'
        - $ref: '#/components/schemas/FixedPricePromotion'
        - $ref: '#/components/schemas/VolumeBasedPromotion'
        - $ref: '#/components/schemas/FreeGoodsPromotion'
      x-tags:
        - Catalog
    ProductSubscription:
      title: ProductSubscription
      type: object
      required:
        - subscription_plan
        - billing_interval
        - billing_frequency
        - billing_limit
        - billing_trial_days
        - fulfill_separately
        - subscription_price
      properties:
        subscription_plan_id:
          type: string
          readOnly: true
        subscription_plan:
          type: string
        billing_interval:
          type: integer
          format: int32
        billing_frequency:
          enum:
            - monthly
        billing_limit:
          type:
            - integer
            - 'null'
        billing_trial_days:
          type: integer
          format: int32
          default: 0
        order_interval:
          type:
            - integer
            - 'null'
        order_frequency:
          type:
            - string
            - 'null'
          enum:
            - monthly
        order_limit:
          type:
            - integer
            - 'null'
        fulfill_separately:
          type: boolean
        subscription_price:
          type: array
          items:
            type: object
            required:
              - suscription_price
              - minimum_quantity
              - customer_group_id
            properties:
              suscription_price:
                type: number
                format: double
              minimum_quantity:
                type: integer
                default: 1
              customer_group_id:
                description: customer group id.
                type:
                  - string
                  - 'null'
      x-tags:
        - Catalog
    Variant:
      title: Variant
      allOf:
        - $ref: '#/components/schemas/VariantCommonDetail'
        - type: object
          properties:
            name:
              type: string
            associated_options:
              type: array
              items:
                $ref: '#/components/schemas/AssociatedOption'
            images:
              type: array
              items:
                $ref: '#/components/schemas/ProductImage'
      examples: []
      x-tags:
        - Catalog
    ProductVideo:
      title: ProductVideo
      type: object
      properties:
        title:
          type:
            - string
            - 'null'
        alternate_text:
          type:
            - string
            - 'null'
        sort_order:
          type: integer
        video_preview_url:
          type: string
        video_stream_hls_url:
          type: string
        video_stream_dash_url:
          type: string
        image_thumbnail_url:
          type: string
        video_duration:
          type: integer
        file_id:
          type: string
      x-tags:
        - Catalog
    SalesChannel:
      title: SalesChannel
      type: object
      required:
        - id
        - name
        - kind
        - active
      properties:
        id:
          type: string
        name:
          type: string
          readOnly: true
        kind:
          type: string
          enum:
            - storefront
            - marketplace
        active:
          type: boolean
          readOnly: true
    ProductBasicDetail:
      title: ProductBasicDetail
      type: object
      properties:
        id:
          description: >-
            product id or combination of product id and variant id separated by
            hyphen.
          type: string
          readOnly: true
        product_id:
          type: string
        product_name:
          type: string
        product_type:
          enum:
            - physical
            - digital
            - bundle
        status:
          enum:
            - draft
            - active
            - inactive
          readOnly: true
        tags:
          type: array
          items:
            type: string
        reviews_rating_sum:
          type: integer
          format: int32
          readOnly: true
        reviews_count:
          type: integer
          format: int32
          readOnly: true
        hsn_code:
          type:
            - string
            - 'null'
          maxLength: 128
        variant_id:
          type:
            - string
            - 'null'
          maxLength: 128
        variant_name:
          type:
            - string
            - 'null'
          maxLength: 128
        slug:
          type: string
          maxLength: 128
        sku:
          type: string
          maxLength: 128
        associated_options:
          type: array
          items:
            $ref: '#/components/schemas/AssociatedOption'
        active:
          type: boolean
        stock_available:
          type: boolean
        images:
          type: array
          items:
            $ref: '#/components/schemas/ProductImage'
        pricing:
          type: array
          items:
            $ref: '#/components/schemas/ProductPricing'
      x-tags:
        - Catalog
    ProductPricing:
      title: ProductPricing
      type: object
      required:
        - customer_group_id
        - cost_price
        - listing_price
        - selling_price
        - tax_rate
      properties:
        customer_group_id:
          description: >-
            customer group id. for different pricing model in case of multiple
            customer groups.
          type:
            - string
            - 'null'
        cost_price:
          type:
            - number
            - 'null'
          format: double
        listing_price:
          type: number
          format: double
        selling_price:
          type: number
          format: double
        min_order_quantity:
          type: integer
          format: int32
          default: 1
        max_order_quantity:
          type:
            - integer
            - 'null'
          format: int32
        incremental_quantity:
          type: integer
          format: int32
          default: 1
        tax_type:
          enum:
            - GST
          readOnly: true
        tax_rate:
          type: number
          format: double
      x-tags:
        - Catalog
    ProductAttribute:
      title: ProductAttribute
      type: object
      properties:
        attribute_id:
          type: string
        attribute_name:
          type: string
          readOnly: true
        attribute_type:
          type: string
          enum:
            - text
            - number
            - boolean
            - date
            - single-select
            - multi-select
            - color
          readOnly: true
        attribute_value:
          oneOf:
            - type: string
              description: >-
                string value for attribute type **text**, **single select** and
                **date**.
            - type: number
              description: numeric value for attribute type number.
            - type: boolean
              description: true/false for attribute type boolean.
            - type: array
              description: for attribute type = multi-select
              items:
                type: string
            - $ref: '#/components/schemas/ColorObject'
              description: for attribute type = color
        key:
          description: Value in snake case.
          type: string
          readOnly: true
      examples: []
      x-tags:
        - Catalog
    ColorObject:
      title: ColorObject
      type: object
      required:
        - name
        - hexcode
      properties:
        name:
          type: string
        hexcode:
          type: string
    DiscountBasedPromotion:
      title: DiscountBasedPromotion
      description: promotion_type = discount
      type:
        - object
        - 'null'
      required:
        - promotion_type
        - starts_at
        - details
      properties:
        id:
          type: string
          readOnly: true
        promotion_type:
          enum:
            - discount
        starts_at:
          type: string
        expires_at:
          description: null means never expires.
          type:
            - string
            - 'null'
        details:
          type: array
          items:
            oneOf:
              - $ref: '#/components/schemas/PercentageBasedDiscount'
              - $ref: '#/components/schemas/FixedAmountBasedDiscount'
    FixedPricePromotion:
      title: FixedPricePromotion
      description: promotion_type = fixed-price
      type:
        - object
        - 'null'
      required:
        - promotion_type
        - starts_at
        - details
      properties:
        id:
          type: string
          readOnly: true
        promotion_type:
          enum:
            - fixed-price
        starts_at:
          type: string
        expires_at:
          description: null means never expires.
          type:
            - string
            - 'null'
        details:
          type: array
          items:
            type: object
            required:
              - offer_price
              - customer_group_id
              - minimum_quantity
              - maximum_quantity
            properties:
              offer_price:
                type: number
              customer_group_id:
                type:
                  - string
                  - 'null'
              minimum_quantity:
                description: >-
                  It refers to the minimum quantity of a specific item a
                  customer must purchase to qualify for the promotion.
                type: integer
                default: 1
              maximum_quantity:
                description: >-
                  It refers to the maximum quantity of a specific item a
                  customer can purchase in order to qualify for the promotion.
                  If this field is set to null, it indicates that there is no
                  limit.
                type:
                  - integer
                  - 'null'
    VolumeBasedPromotion:
      title: VolumeBasedPromotion
      description: promotion_type = volume-based
      type:
        - object
        - 'null'
      required:
        - promotion_type
        - starts_at
        - details
      properties:
        id:
          type: string
          readOnly: true
        promotion_type:
          enum:
            - volume-based
        starts_at:
          type: string
        expires_at:
          description: null means never expires.
          type:
            - string
            - 'null'
        details:
          type: array
          items:
            type: object
            required:
              - customer_group_id
              - slabs
            properties:
              customer_group_id:
                type:
                  - string
                  - 'null'
              slabs:
                type: array
                items:
                  type: object
                  required:
                    - quantity
                    - quantity_condition
                    - discount_percent
                  properties:
                    quantity:
                      type: integer
                    quantity_condition:
                      description: >-
                        This key defines how the system will evaluate the
                        quantity to determine if the promotion should be
                        applied, based on the specified slab.
                      enum:
                        - less
                        - less-or-equal
                        - greater
                        - greater-or-equal
                    discount_percent:
                      type: number
    FreeGoodsPromotion:
      title: FreeGoodsPromotion
      description: promotion_type = free-goods
      type:
        - object
        - 'null'
      required:
        - promotion_type
        - starts_at
        - details
      properties:
        id:
          type: string
          readOnly: true
        promotion_type:
          enum:
            - free-goods
        starts_at:
          type: string
          format: date-time
        expires_at:
          description: null means never expires.
          type:
            - string
            - 'null'
          format: date-time
        details:
          type: array
          items:
            allOf:
              - required:
                  - customer_group_id
                properties:
                  customer_group_id:
                    type:
                      - string
                      - 'null'
              - oneOf:
                  - title: ScaleAutomatically
                    required:
                      - auto_scale
                      - slab
                    properties:
                      auto_scale:
                        description: >-
                          The **auto_scale** key determines whether the
                          promotion should be automatically adjusted based on
                          the ratio between the quantities bought and the
                          quantities received.\n\nIf **true**: The promotion
                          will be applied dynamically according to the ratio of
                          the buy quantity to the get quantity. For example, if
                          the promotion is \"Buy 2, Get 1\" and the customer
                          buys 4 items, they would receive 2 free items (scaling
                          based on the original ratio).\n\nIf **false**: The
                          promotion will be applied strictly according to the
                          predefined conditions. For example, even if the
                          customer buys more items, they will receive the fixed
                          free quantity as defined in the original promotion
                          (e.g., buying 4 would still only get them 1 free
                          item).
                        type: boolean
                      slab:
                        type: object
                        properties:
                          buy_quantity:
                            type: integer
                          get_quantity:
                            type: integer
                          quantity_condition:
                            description: >-
                              Defines how the system will evaluate the
                              buy_quantity to determine if the promotion should
                              be applied.
                            enum:
                              - less
                              - less-or-equal
                              - greater
                              - greater-or-equal
                        required:
                          - buy_quantity
                          - get_quantity
                          - quantity_condition
                  - title: CustomSlabs
                    required:
                      - slabs
                    properties:
                      slabs:
                        type: array
                        items:
                          type: object
                          properties:
                            buy_quantity:
                              type: integer
                            get_quantity:
                              type: integer
                            quantity_condition:
                              description: >-
                                Defines how the system will evaluate the
                                buy_quantity to determine if the promotion
                                should be applied.
                              enum:
                                - less
                                - less-or-equal
                                - greater
                                - greater-or-equal
                          required:
                            - buy_quantity
                            - get_quantity
                            - quantity_condition
            type: object
    ProductImage:
      title: ProductImage
      type: object
      properties:
        title:
          type:
            - string
            - 'null'
          maxLength: 128
        alternate_text:
          type:
            - string
            - 'null'
          maxLength: 128
        sort_order:
          type: integer
          format: int32
        url_tiny:
          type: string
          maxLength: 512
        url_thumbnail:
          type: string
          maxLength: 512
        url_standard:
          type: string
          maxLength: 512
        url_zoom:
          type: string
          maxLength: 512
        file_id:
          type: string
        file_type:
          enum:
            - image
      x-tags:
        - Catalog
    PercentageBasedDiscount:
      title: PercentageBasedDiscount
      description: promotion_type = discount
      type:
        - object
        - 'null'
      required:
        - discount_type
        - discount_percent
        - customer_group_id
        - minimum_quantity
        - maximum_quantity
        - maximum_discount_amount
      properties:
        discount_type:
          type: string
          const: percentage
        discount_percent:
          type: number
        customer_group_id:
          type:
            - string
            - 'null'
        minimum_quantity:
          description: >-
            It refers to the minimum quantity of a specific item a customer must
            purchase to qualify for the promotion.
          type: integer
          default: 1
        maximum_quantity:
          description: >-
            It refers to the maximum quantity of a specific item a customer can
            purchase in order to qualify for the promotion. If this field is set
            to null, it indicates that there is no limit.
          type:
            - integer
            - 'null'
        maximum_discount_amount:
          description: >-
            When a value is specified, the discount amount will not exceed the
            defined maximum, ensuring that the promotion stays within a
            controlled discount range. If this field is set to null, it
            indicates that there is no limit to the discount amount.
          type:
            - number
            - 'null'
    FixedAmountBasedDiscount:
      title: FixedAmountBasedDiscount
      description: promotion_type = discount
      type:
        - object
        - 'null'
      required:
        - discount_type
        - discount_fixed_amount
        - customer_group_id
        - minimum_quantity
        - maximum_quantity
      properties:
        discount_type:
          type: string
          const: fixed-amount
        discount_fixed_amount:
          type: integer
        customer_group_id:
          type:
            - string
            - 'null'
        minimum_quantity:
          description: >-
            It refers to the minimum quantity of a specific item a customer must
            purchase to qualify for the promotion.
          type: integer
          default: 1
        maximum_quantity:
          description: >-
            It refers to the maximum quantity of a specific item a customer can
            purchase in order to qualify for the promotion. If this field is set
            to null, it indicates that there is no limit.
          type:
            - integer
            - 'null'
  securitySchemes:
    Authorization:
      type: http
      scheme: bearer

````