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

# Create Product

> Create a product with optional inline variants.

Every field of `ProductCreate` is saved — the same set the PATCH accepts.
The constructor used to list the columns by hand and silently dropped ten
of them (shipping, subtract, points, jan, isbn, location and the four
lookup ids) (CAT-7).

Inline variants go through the same SKU guard as `POST …/variants`: a
code repeated in the body or already used in this store is a 409
`product.sku_taken`, not a 500 from the unique index (CAT-19).



## OpenAPI

````yaml https://api.vellaro.io/openapi/admin.json post /api/v1/admin/products
openapi: 3.1.0
info:
  title: Vellaro Admin API
  description: >-
    Store management under `/api/v1/admin`, for back ends and integrations.
    Every call takes `Authorization: Bearer <token>`: an admin API token or a
    staff user's token. The permissions of its role decide what it can do,
    always in its own store.
  version: 0.1.0
servers:
  - url: https://api.vellaro.io
    description: Produzione
security: []
tags:
  - name: Orders
    description: >-
      Orders and manual orders, payments, refunds, shipments, invoices, returns,
      customer subscriptions.
  - name: Products
    description: Products, variants, images, prices and discounts, product lookups.
  - name: Categories & catalog setup
    description: >-
      Categories, brands, attributes, options, filters, downloadable files,
      recurring profiles.
  - name: Inventory
    description: Stock of the variants and stock statuses.
  - name: Customers
    description: Customers, customer groups, custom fields.
  - name: Reviews & questions
    description: Moderation of product reviews and questions.
  - name: Promotions & coupons
    description: Coupons and gift vouchers.
  - name: Marketing
    description: Campaigns, newsletter subscribers, affiliates and their commissions.
  - name: Content
    description: >-
      CMS pages, menus, banners, information pages, flipbooks, media library,
      SEO URLs, email templates, translations.
  - name: Settings
    description: >-
      Store settings, email delivery, languages, currencies, physical stores,
      social login providers.
  - name: Shipping
    description: Couriers, shipping rates, weight and length classes.
  - name: Taxes & geo
    description: Tax classes, rates and rules; countries, zones and geo zones.
  - name: Integrations & modules
    description: >-
      Integrations, plugins and modules (Iute, extra warranty, Nextera, Financa
      5, WhatsApp, Firebase), outbound webhooks.
  - name: AI
    description: AI content generation and the settings of the AI shopping assistant.
  - name: Imports
    description: 'CSV imports and the universal import: runs, mappings, previews, undo.'
  - name: Reports & dashboard
    description: Dashboard figures and reports.
  - name: Users & API keys
    description: Staff users and roles, publishable keys, admin API tokens.
  - name: Audit
    description: The store's audit log.
paths:
  /api/v1/admin/products:
    post:
      tags:
        - Products
      summary: Create Product
      description: >-
        Create a product with optional inline variants.


        Every field of `ProductCreate` is saved — the same set the PATCH
        accepts.

        The constructor used to list the columns by hand and silently dropped
        ten

        of them (shipping, subtract, points, jan, isbn, location and the four

        lookup ids) (CAT-7).


        Inline variants go through the same SKU guard as `POST …/variants`: a

        code repeated in the body or already used in this store is a 409

        `product.sku_taken`, not a 500 from the unique index (CAT-19).
      operationId: create_product_api_v1_admin_products_post
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProductCreate'
      responses:
        '201':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiResponse_ProductOut_'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - HTTPBearer: []
components:
  schemas:
    ProductCreate:
      properties:
        name:
          type: string
          title: Name
        slug:
          type: string
          title: Slug
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
        short_description:
          anyOf:
            - type: string
            - type: 'null'
          title: Short Description
        name_i18n:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Name I18N
        description_i18n:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Description I18N
        short_description_i18n:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Short Description I18N
        meta_title_i18n:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Meta Title I18N
        meta_description_i18n:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Meta Description I18N
        category_id:
          anyOf:
            - type: string
              format: uuid
            - type: 'null'
          title: Category Id
        brand_id:
          anyOf:
            - type: string
              format: uuid
            - type: 'null'
          title: Brand Id
        model_number:
          anyOf:
            - type: string
            - type: 'null'
          title: Model Number
        upc:
          anyOf:
            - type: string
            - type: 'null'
          title: Upc
        ean:
          anyOf:
            - type: string
            - type: 'null'
          title: Ean
        mpn:
          anyOf:
            - type: string
            - type: 'null'
          title: Mpn
        weight_kg:
          anyOf:
            - type: number
            - type: string
              pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
            - type: 'null'
          title: Weight Kg
        length_cm:
          anyOf:
            - type: number
            - type: string
              pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
            - type: 'null'
          title: Length Cm
        width_cm:
          anyOf:
            - type: number
            - type: string
              pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
            - type: 'null'
          title: Width Cm
        height_cm:
          anyOf:
            - type: number
            - type: string
              pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
            - type: 'null'
          title: Height Cm
        minimum_quantity:
          type: integer
          title: Minimum Quantity
          default: 1
        sort_order:
          type: integer
          title: Sort Order
          default: 0
        is_featured:
          type: boolean
          title: Is Featured
          default: false
        available_at:
          anyOf:
            - type: string
              format: date
            - type: 'null'
          title: Available At
        is_active:
          type: boolean
          title: Is Active
          default: true
        meta_title:
          anyOf:
            - type: string
            - type: 'null'
          title: Meta Title
        meta_description:
          anyOf:
            - type: string
            - type: 'null'
          title: Meta Description
        shipping:
          type: boolean
          title: Shipping
          default: true
        subtract:
          type: boolean
          title: Subtract
          default: true
        is_digital:
          type: boolean
          title: Is Digital
          default: false
        download_ids:
          anyOf:
            - items:
                type: string
                format: uuid
              type: array
            - type: 'null'
          title: Download Ids
        points:
          type: integer
          title: Points
          default: 0
        jan:
          anyOf:
            - type: string
            - type: 'null'
          title: Jan
        isbn:
          anyOf:
            - type: string
            - type: 'null'
          title: Isbn
        location:
          anyOf:
            - type: string
            - type: 'null'
          title: Location
        stock_status_id:
          anyOf:
            - type: string
              format: uuid
            - type: 'null'
          title: Stock Status Id
        tax_class_id:
          anyOf:
            - type: string
              format: uuid
            - type: 'null'
          title: Tax Class Id
        weight_class_id:
          anyOf:
            - type: string
              format: uuid
            - type: 'null'
          title: Weight Class Id
        length_class_id:
          anyOf:
            - type: string
              format: uuid
            - type: 'null'
          title: Length Class Id
        variants:
          items:
            $ref: '#/components/schemas/ProductVariantCreate'
          type: array
          title: Variants
          default: []
      type: object
      required:
        - name
        - slug
      title: ProductCreate
    ApiResponse_ProductOut_:
      properties:
        data:
          anyOf:
            - $ref: '#/components/schemas/ProductOut'
            - type: 'null'
        meta:
          anyOf:
            - $ref: '#/components/schemas/PaginationMeta'
            - type: 'null'
        error:
          anyOf:
            - type: string
            - type: 'null'
          title: Error
        error_code:
          anyOf:
            - type: string
            - type: 'null'
          title: Error Code
      type: object
      title: ApiResponse[ProductOut]
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    ProductVariantCreate:
      properties:
        sku:
          type: string
          title: Sku
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
        price:
          anyOf:
            - type: number
            - type: string
              pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
          title: Price
        compare_at_price:
          anyOf:
            - type: number
            - type: string
              pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
            - type: 'null'
          title: Compare At Price
        sale_price:
          anyOf:
            - type: number
            - type: string
              pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
            - type: 'null'
          title: Sale Price
        sale_start:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Sale Start
        sale_end:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Sale End
        stock:
          type: integer
          title: Stock
          default: 0
        track_inventory:
          type: boolean
          title: Track Inventory
          default: true
        allow_backorder:
          type: boolean
          title: Allow Backorder
          default: false
        weight:
          anyOf:
            - type: number
            - type: string
              pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
            - type: 'null'
          title: Weight
        barcode:
          anyOf:
            - type: string
            - type: 'null'
          title: Barcode
        attributes:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Attributes
        is_active:
          type: boolean
          title: Is Active
          default: true
      type: object
      required:
        - sku
        - price
      title: ProductVariantCreate
    ProductOut:
      properties:
        id:
          type: string
          format: uuid
          title: Id
        name:
          type: string
          title: Name
        slug:
          type: string
          title: Slug
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
        short_description:
          anyOf:
            - type: string
            - type: 'null'
          title: Short Description
        name_i18n:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Name I18N
        description_i18n:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Description I18N
        short_description_i18n:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Short Description I18N
        meta_title_i18n:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Meta Title I18N
        meta_description_i18n:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Meta Description I18N
        category_id:
          anyOf:
            - type: string
              format: uuid
            - type: 'null'
          title: Category Id
        brand_id:
          anyOf:
            - type: string
              format: uuid
            - type: 'null'
          title: Brand Id
        model_number:
          anyOf:
            - type: string
            - type: 'null'
          title: Model Number
        upc:
          anyOf:
            - type: string
            - type: 'null'
          title: Upc
        ean:
          anyOf:
            - type: string
            - type: 'null'
          title: Ean
        mpn:
          anyOf:
            - type: string
            - type: 'null'
          title: Mpn
        weight_kg:
          anyOf:
            - type: string
              pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
            - type: 'null'
          title: Weight Kg
        length_cm:
          anyOf:
            - type: string
              pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
            - type: 'null'
          title: Length Cm
        width_cm:
          anyOf:
            - type: string
              pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
            - type: 'null'
          title: Width Cm
        height_cm:
          anyOf:
            - type: string
              pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
            - type: 'null'
          title: Height Cm
        minimum_quantity:
          type: integer
          title: Minimum Quantity
        sort_order:
          type: integer
          title: Sort Order
        view_count:
          type: integer
          title: View Count
        is_featured:
          type: boolean
          title: Is Featured
        available_at:
          anyOf:
            - type: string
              format: date
            - type: 'null'
          title: Available At
        is_active:
          type: boolean
          title: Is Active
        meta_title:
          anyOf:
            - type: string
            - type: 'null'
          title: Meta Title
        meta_description:
          anyOf:
            - type: string
            - type: 'null'
          title: Meta Description
        shipping:
          type: boolean
          title: Shipping
        subtract:
          type: boolean
          title: Subtract
        is_digital:
          type: boolean
          title: Is Digital
          default: false
        points:
          type: integer
          title: Points
        jan:
          anyOf:
            - type: string
            - type: 'null'
          title: Jan
        isbn:
          anyOf:
            - type: string
            - type: 'null'
          title: Isbn
        location:
          anyOf:
            - type: string
            - type: 'null'
          title: Location
        stock_status_id:
          anyOf:
            - type: string
              format: uuid
            - type: 'null'
          title: Stock Status Id
        stock_status_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Stock Status Name
        tax_class_id:
          anyOf:
            - type: string
              format: uuid
            - type: 'null'
          title: Tax Class Id
        weight_class_id:
          anyOf:
            - type: string
              format: uuid
            - type: 'null'
          title: Weight Class Id
        length_class_id:
          anyOf:
            - type: string
              format: uuid
            - type: 'null'
          title: Length Class Id
        created_at:
          type: string
          format: date-time
          title: Created At
        updated_at:
          type: string
          format: date-time
          title: Updated At
        brand:
          anyOf:
            - $ref: '#/components/schemas/BrandOut'
            - type: 'null'
        variants:
          items:
            $ref: '#/components/schemas/ProductVariantOut'
          type: array
          title: Variants
          default: []
        images:
          items:
            $ref: '#/components/schemas/ProductImageOut'
          type: array
          title: Images
          default: []
        option_groups:
          items:
            $ref: '#/components/schemas/ProductOptionOut'
          type: array
          title: Option Groups
          default: []
        recurrings:
          items:
            $ref: '#/components/schemas/RecurringPlanOut'
          type: array
          title: Recurrings
          default: []
        specifications:
          items:
            $ref: '#/components/schemas/ProductSpecGroupOut'
          type: array
          title: Specifications
          default: []
        special_price:
          anyOf:
            - type: string
              pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
            - type: 'null'
          title: Special Price
      type: object
      required:
        - id
        - name
        - slug
        - description
        - short_description
        - category_id
        - brand_id
        - model_number
        - upc
        - ean
        - mpn
        - weight_kg
        - length_cm
        - width_cm
        - height_cm
        - minimum_quantity
        - sort_order
        - view_count
        - is_featured
        - available_at
        - is_active
        - meta_title
        - meta_description
        - shipping
        - subtract
        - points
        - jan
        - isbn
        - location
        - stock_status_id
        - tax_class_id
        - weight_class_id
        - length_class_id
        - created_at
        - updated_at
      title: ProductOut
    PaginationMeta:
      properties:
        page:
          type: integer
          title: Page
        page_size:
          type: integer
          title: Page Size
        total:
          type: integer
          title: Total
        total_pages:
          type: integer
          title: Total Pages
      type: object
      required:
        - page
        - page_size
        - total
        - total_pages
      title: PaginationMeta
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
    BrandOut:
      properties:
        id:
          type: string
          format: uuid
          title: Id
        name:
          type: string
          title: Name
        name_i18n:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Name I18N
        slug:
          type: string
          title: Slug
        image_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Image Url
        sort_order:
          type: integer
          title: Sort Order
        is_active:
          type: boolean
          title: Is Active
        product_count:
          anyOf:
            - type: integer
            - type: 'null'
          title: Product Count
      type: object
      required:
        - id
        - name
        - slug
        - image_url
        - sort_order
        - is_active
      title: BrandOut
    ProductVariantOut:
      properties:
        id:
          type: string
          format: uuid
          title: Id
        sku:
          type: string
          title: Sku
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
        price:
          type: string
          pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
          title: Price
        compare_at_price:
          anyOf:
            - type: string
              pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
            - type: 'null'
          title: Compare At Price
        sale_price:
          anyOf:
            - type: string
              pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
            - type: 'null'
          title: Sale Price
        sale_start:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Sale Start
        sale_end:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Sale End
        stock:
          type: integer
          title: Stock
        track_inventory:
          type: boolean
          title: Track Inventory
        allow_backorder:
          type: boolean
          title: Allow Backorder
        weight:
          anyOf:
            - type: string
              pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
            - type: 'null'
          title: Weight
        barcode:
          anyOf:
            - type: string
            - type: 'null'
          title: Barcode
        attributes:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Attributes
        is_active:
          type: boolean
          title: Is Active
        created_at:
          type: string
          format: date-time
          title: Created At
      type: object
      required:
        - id
        - sku
        - name
        - price
        - compare_at_price
        - sale_price
        - sale_start
        - sale_end
        - stock
        - track_inventory
        - allow_backorder
        - weight
        - barcode
        - attributes
        - is_active
        - created_at
      title: ProductVariantOut
    ProductImageOut:
      properties:
        id:
          type: string
          format: uuid
          title: Id
        url:
          type: string
          title: Url
        alt:
          anyOf:
            - type: string
            - type: 'null'
          title: Alt
        position:
          type: integer
          title: Position
        is_primary:
          type: boolean
          title: Is Primary
      type: object
      required:
        - id
        - url
        - alt
        - position
        - is_primary
      title: ProductImageOut
    ProductOptionOut:
      properties:
        product_option_id:
          type: string
          format: uuid
          title: Product Option Id
        option_id:
          type: string
          format: uuid
          title: Option Id
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
        type:
          anyOf:
            - type: string
            - type: 'null'
          title: Type
        required:
          type: boolean
          title: Required
          default: true
        values:
          items:
            $ref: '#/components/schemas/ProductOptionValueOut'
          type: array
          title: Values
          default: []
      type: object
      required:
        - product_option_id
        - option_id
      title: ProductOptionOut
    RecurringPlanOut:
      properties:
        id:
          type: string
          format: uuid
          title: Id
        name_i18n:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Name I18N
        price:
          type: string
          pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
          title: Price
        frequency:
          type: string
          title: Frequency
        duration:
          type: integer
          title: Duration
        cycle:
          type: integer
          title: Cycle
        trial_status:
          type: boolean
          title: Trial Status
          default: false
        trial_price:
          anyOf:
            - type: string
              pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
            - type: 'null'
          title: Trial Price
        trial_frequency:
          anyOf:
            - type: string
            - type: 'null'
          title: Trial Frequency
        trial_duration:
          anyOf:
            - type: integer
            - type: 'null'
          title: Trial Duration
        trial_cycle:
          anyOf:
            - type: integer
            - type: 'null'
          title: Trial Cycle
        billing_interval:
          type: integer
          title: Billing Interval
          default: 1
        billing_charges:
          type: integer
          title: Billing Charges
          default: 0
        trial_length:
          anyOf:
            - type: integer
            - type: 'null'
          title: Trial Length
        legacy_schedule:
          type: boolean
          title: Legacy Schedule
          default: false
      type: object
      required:
        - id
        - price
        - frequency
        - duration
        - cycle
      title: RecurringPlanOut
      description: Public recurring plan attached to a product (R17 storefront exposure).
    ProductSpecGroupOut:
      properties:
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
        sort_order:
          type: integer
          title: Sort Order
          default: 0
        items:
          items:
            $ref: '#/components/schemas/ProductSpecItemOut'
          type: array
          title: Items
          default: []
      type: object
      title: ProductSpecGroupOut
      description: >-
        One attribute group («Generale», «Display»…) of a product's spec sheet.


        `name` is null for rows whose attribute has no group (the storefront
        draws

        them as an untitled block).
    ProductOptionValueOut:
      properties:
        option_value_id:
          type: string
          format: uuid
          title: Option Value Id
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
        color:
          anyOf:
            - type: string
            - type: 'null'
          title: Color
        image:
          anyOf:
            - type: string
            - type: 'null'
          title: Image
        price:
          type: string
          pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
          title: Price
          default: '0'
        price_prefix:
          type: string
          title: Price Prefix
          default: +
      type: object
      required:
        - option_value_id
      title: ProductOptionValueOut
      description: One option value enabled for a product (with optional price modifier).
    ProductSpecItemOut:
      properties:
        name:
          type: string
          title: Name
        value:
          type: string
          title: Value
        sort_order:
          type: integer
          title: Sort Order
          default: 0
      type: object
      required:
        - name
        - value
      title: ProductSpecItemOut
      description: >-
        One row of the technical-spec sheet: attribute name + this product's
        value.
  securitySchemes:
    HTTPBearer:
      type: http
      scheme: bearer

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.