---
title: "Create store product"
method: POST
path: "/v1/store-products"
tags: ["Store products"]
---

# Create store product

`POST /v1/store-products`

## Request body

- CreateStoreProductWrapperDto
  - `data` CreateStoreProductDto, required
    - `name` string, required
    - `description` string, nullable
    - `barcode` string, required
    - `disable_barcode_sanitization` boolean — When true, the barcode is stored verbatim and the product's `barcode_type` is set to `Unsanitized`. When false, an existing `Unsanitized` product is re-sanitized on save. When omitted, the existing `barcode_type` is preserved (partial updates are safe).
    - `department_id` string, required
    - `active` boolean
    - `retail_price` string, positive-monetary, nullable
    - `minimum_retail_price` string, positive-monetary, nullable
    - `maximum_retail_price` string, positive-monetary, nullable
    - `retail_price_source` 'ACCEPTED_COST_CHANGE' | 'BULK_UPDATE' | 'COST_FILE_IMPORT' | 'PRODUCT_DETAILS' | 'PRODUCT_RULES'
    - `retail_price_source_platform` 'API' | 'CDC_PIPELINE' | 'CLI' | 'MOBILE' | 'WEB'
    - `retail_price_input_method` 'COST_FILE' | 'MANUALLY_ENTERED_PRICE' | 'USED_SUGGESTED_PRICE'
    - `retail_price_unit_of_measure_id` string, nullable
    - `brand` string, nullable
    - `target_margin` number, nullable
    - `case_size` integer, nullable
    - `pack_size` integer, nullable
    - `min_customer_age` integer
    - `loyalty_points_per_dollar` string, nullable
    - `unit_volume_quantity` string, nullable
    - `unit_volume_uom_name` string, nullable
    - `wic_enabled` boolean
    - `wic_override_plu` string, nullable
    - `snap_enabled` boolean
    - `ebt_enabled` boolean
    - `is_tippable` boolean
    - `is_blackhawk_gift_card` boolean
    - `is_reloadable_blackhawk_gift_card` boolean
    - `print_physical_tag` boolean
    - `ecommerce_enabled` boolean
    - `variable_sale_price` boolean
    - `sold_by_weight` boolean
    - `prompt_for_quantity` boolean
    - `manual_item` boolean
    - `tax_rate_ids` string[]
    - `variable_weight_ids` string[]
    - `item_modifier_ids` string[]
    - `food_modifier_ids` string[]
    - `country_of_origin` string, nullable
    - `store_vendor_products` NestedSetStoreVendorProductDto[]
      - `uuid` string, uuid
      - `mutationKey` string, uuid
      - `storeVendorID` string, required
      - `storeProductID` string, nullable
      - `parentProductID` string, nullable
      - `itemCode` string
      - `unitUPC` string, nullable
      - `caseUPC` string, nullable
      - `packUPC` string, nullable
      - `caseSize` number, nullable
      - `barcode` string, nullable
      - `description` string
      - `brandName` string, nullable
      - `unitVolume` string, nullable
      - `caseSizeDecimal` string, nullable
      - `caseCost` string, nullable
      - `eachCost` string, nullable
      - `lbCost` string, nullable
      - `costStartTime` string, date-time, nullable
      - `isOrderPrimary` boolean
      - `isPricingEligible` boolean
      - `purchaseOrderUOMLock` 'CASE' | 'EACH' | 'LB'
      - `alternateIdentifiers` union[]
        - union
          - DescriptionIdentifierDto
            - `type` 'barcode' | 'description' | 'item_code', required
            - `description` string, required
          - BarcodeIdentifierDto
            - `type` 'barcode' | 'description' | 'item_code', required
            - `barcode` string, required
          - ItemCodeIdentifierDto
            - `type` 'barcode' | 'description' | 'item_code', required
            - `item_code` string, required
      - `id` string
    - `primary_vendor_configuration` 'LATEST_COST' | 'SELECTED_BY_USER'
    - `sync_to_deli_scales` boolean
    - `alcohol_by_volume` string, nullable
    - `notes` string, nullable
    - `ingredients` string, nullable
    - `shelf_life_days` integer, nullable — Shelf life in days sent to deli scales (Hobart, eplum, Ishida); the scale computes the sell-by date from it. 1-999, or null for no Vori-managed shelf life.
    - `last_printed_at` string, date-time, nullable
    - `inventory_change` InitialStoreProductInventoryDto
      - `count` string, required
      - `source_type` 'CLEAR_ON_ORDER' | 'DASH_PRODUCT_DETAILS' | 'DASHBOARD_INVENTORY_PAGE' | 'HANDHELD_INVENTORY_COUNT' | 'HANDHELD_INVENTORY_MANUAL' | 'HANDHELD_INVENTORY_RESTOCK' | 'HANDHELD_INVENTORY_SHRINK' | 'HANDHELD_ORDERING_COUNT' | 'HANDHELD_PRODUCT_MANUAL' | 'INVENTORY_RECOUNT' | 'INVENTORY_UPLOAD' | 'INVOICE_SHIPPED_QTY' | 'ONBOARDING_APL_IMPORT' | 'POS_REFUND' | 'POS_SALE' | 'PURCHASE_ORDER' | 'RDS_IMPORT' | 'STORE_TRANSFER', required
      - `completed_at` string, date-time, nullable
    - `par` NestedStoreProductParDto
      - `manual_reorder_point` string, nullable, required
      - `manual_max_stock` string, nullable, required
    - `snap_incentive_earnable` boolean
    - `snap_incentive_redeemable` boolean
    - `discount_restrictions` DiscountRestriction[], nullable
    - `store_product_group_rule_ids` string[]

## Response `201`

- StoreProductDto
  - `id` string, required
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required
  - `deleted_at` string, date-time, nullable, required — When the product was soft-deleted, or null if it has not been deleted.
  - `store_id` string, required — ID of the store this product belongs to.
  - `department_id` string, required — ID of the store department this product belongs to.
  - `tax_rates` NestedTaxRateDto[], required — Tax rates applied to this product at the register.
    - `id` string, required
    - `name` string, required
    - `type` 'amount' | 'percentage', required
    - `value` string, required
    - `tax_type` 'other' | 'sales', required
  - `item_modifiers` NestedItemModifierDto[], required — Item modifiers available for this product.
    - `id` string, required
    - `name` string, required
    - `type` 'bottle_deposit' | 'custom' | 'food_modifier', required
    - `tax_behavior` 'EXCLUDE' | 'INHERIT_FROM_STORE_PRODUCT', required
    - `value` string, required
  - `food_modifier_categories` NestedFoodModifierCategoryDto[], required — Food modifier categories, and their modifiers, available for this product, ordered by category priority.
    - `id` string, required
    - `name` string, required — Category name
    - `priority` integer, required — Display priority (lower = shown first)
    - `min_selection` integer, required — Minimum number of options customer must select (0 = no minimum)
    - `max_selection` integer, nullable, required — Maximum number of options customer can select
    - `modifiers` FoodModifierDto[], required — Modifiers assigned to this product in this category
      - `id` string, required
      - `priority` integer, required — Display priority (lower = shown first)
      - `item_modifier` ItemModifierDto, required
        - `id` string, required
        - `created_at` string, date-time, required
        - `updated_at` string, date-time, required
        - `name` string, required
        - `type` 'bottle_deposit' | 'custom' | 'food_modifier', required
        - `taxBehavior` 'EXCLUDE' | 'INHERIT_FROM_STORE_PRODUCT', required
        - `value` string, required
        - `priceTagModifier` 'BOTTLE_DEPOSIT' | 'CRV', required
  - `additional_barcodes` StoreProductBarcodeDto[], required — Barcodes that resolve to this product in addition to the primary `barcode`.
    - `id` string, required
    - `created_at` string, date-time, required
    - `updated_at` string, date-time, required
    - `store_id` string, required
    - `barcode` string, required
    - `barcode_type` 'EAN 13 Type 2 Without Check Digit' | 'EAN-13' | 'EAN-13 Without Check Digit' | 'EAN-14' | 'EAN-14 Without Check Digit' | 'EAN-8' | 'EAN-8 Without Check Digit' | 'PLU' | 'PRODUCE PLU' | 'Type 2 EAN' | 'Type 2 UPC' | 'Unsanitized' | 'UPC Shipping Container' | 'UPC-A' | 'UPC-A Type 2 Without Check Digit' | 'UPC-A Without Check Digit' | 'UPC-E' | 'UPC-E Without Check Digit', required
    - `store_product_id` string, required
  - `variable_weights` NestedVariableWeightDto[], required — Preset weights for products sold by weight.
    - `id` string, nullable, required
    - `name` string, required
    - `unit` 'LBS' | 'OZ', required
    - `value` string, required
  - `active_vendor` NestedStoreVendorDTO
    - `id` string, required
    - `created_at` string, date-time, required
    - `updated_at` string, date-time, required
    - `name` string, required
    - `code` string, nullable, required
  - `active_vendor_product` NestedStoreVendorProductDTO
    - `id` string, required
    - `created_at` string, date-time, required
    - `updated_at` string, date-time, required
    - `uuid` string, uuid, required
    - `mutation_key` string, uuid, required
    - `store_product` NestedStoreProductDTO, required
      - `id` string, required
      - `created_at` string, date-time, required
      - `updated_at` string, date-time, required
      - `name` string, required
      - `primaryVendorConfiguration` 'LATEST_COST' | 'SELECTED_BY_USER', required
      - `barcode` string, required
    - `store_product_id` string, nullable, required
    - `store_id` string, nullable, required
    - `store_vendor` NestedStoreVendorDTO, required
      - `id` string, required
      - `created_at` string, date-time, required
      - `updated_at` string, date-time, required
      - `name` string, required
      - `code` string, nullable, required
    - `description` string, required
    - `barcode` string, nullable, required
    - `barcode_type` 'EAN 13 Type 2 Without Check Digit' | 'EAN-13' | 'EAN-13 Without Check Digit' | 'EAN-14' | 'EAN-14 Without Check Digit' | 'EAN-8' | 'EAN-8 Without Check Digit' | 'PLU' | 'PRODUCE PLU' | 'Type 2 EAN' | 'Type 2 UPC' | 'Unsanitized' | 'UPC Shipping Container' | 'UPC-A' | 'UPC-A Type 2 Without Check Digit' | 'UPC-A Without Check Digit' | 'UPC-E' | 'UPC-E Without Check Digit', required
    - `item_code` string, required
    - `case_size` string, nullable, required
    - `each_cost` string, nullable, required
    - `each_cost_start_time` string, date-time, nullable, required
    - `case_cost` string, nullable, required
    - `case_cost_start_time` string, date-time, nullable, required
    - `lb_cost` string, nullable, required
    - `lb_cost_start_time` string, date-time, nullable, required
    - `brand_name` string, nullable, required
    - `unit_volume` string, nullable, required
    - `is_order_primary` boolean, required
    - `purchase_order_uom_lock` 'CASE' | 'EACH' | 'LB', required
  - `store_vendor_products` NestedStoreVendorProductDTO[] — Vendor catalog entries for this product.
    - `id` string, required
    - `created_at` string, date-time, required
    - `updated_at` string, date-time, required
    - `uuid` string, uuid, required
    - `mutation_key` string, uuid, required
    - `store_product` NestedStoreProductDTO, required
      - `id` string, required
      - `created_at` string, date-time, required
      - `updated_at` string, date-time, required
      - `name` string, required
      - `primaryVendorConfiguration` 'LATEST_COST' | 'SELECTED_BY_USER', required
      - `barcode` string, required
    - `store_product_id` string, nullable, required
    - `store_id` string, nullable, required
    - `store_vendor` NestedStoreVendorDTO, required
      - `id` string, required
      - `created_at` string, date-time, required
      - `updated_at` string, date-time, required
      - `name` string, required
      - `code` string, nullable, required
    - `description` string, required
    - `barcode` string, nullable, required
    - `barcode_type` 'EAN 13 Type 2 Without Check Digit' | 'EAN-13' | 'EAN-13 Without Check Digit' | 'EAN-14' | 'EAN-14 Without Check Digit' | 'EAN-8' | 'EAN-8 Without Check Digit' | 'PLU' | 'PRODUCE PLU' | 'Type 2 EAN' | 'Type 2 UPC' | 'Unsanitized' | 'UPC Shipping Container' | 'UPC-A' | 'UPC-A Type 2 Without Check Digit' | 'UPC-A Without Check Digit' | 'UPC-E' | 'UPC-E Without Check Digit', required
    - `item_code` string, required
    - `case_size` string, nullable, required
    - `each_cost` string, nullable, required
    - `each_cost_start_time` string, date-time, nullable, required
    - `case_cost` string, nullable, required
    - `case_cost_start_time` string, date-time, nullable, required
    - `lb_cost` string, nullable, required
    - `lb_cost_start_time` string, date-time, nullable, required
    - `brand_name` string, nullable, required
    - `unit_volume` string, nullable, required
    - `is_order_primary` boolean, required
    - `purchase_order_uom_lock` 'CASE' | 'EACH' | 'LB', required
  - `inventory` NestedStoreProductInventoryDto
    - `current` string, required
    - `min_par` string, nullable, required
    - `max_stock` string, nullable, required
    - `last_changed_at` string, date-time, nullable, required
  - `brand` string, nullable, required — Brand name.
  - `description` string, nullable, required — Short description, intended for character-limited use cases (e.g., printed receipts).
  - `active` boolean, required — Whether the product is active.
  - `name` string, required — Human-readable product name.
  - `barcode` string, required — Primary barcode.
  - `target_margin` string, nullable, required — Target gross margin for pricing decisions, as a whole-number percentage (35 means 35%).
  - `case_size` integer, nullable, required — Number of sellable units in a vendor case.
  - `pack_size` integer, nullable, required — Number of units in a retail pack.
  - `print_physical_tag` boolean, required — Whether a physical shelf tag should be printed for this product.
  - `esl_enabled` boolean, required — Whether electronic shelf labels are enabled for this product.
  - `label_last_printed_at` string, date-time, nullable, required — When a shelf tag was last printed for this product.
  - `wicable` integer, nullable, required — WIC eligibility indicator.
  - `min_customer_age` integer, nullable, required — Minimum customer age, in years, required to purchase.
  - `wic_enabled` boolean, required — Whether the product is eligible for WIC payment.
  - `snap_enabled` boolean, required — Whether the product is eligible for SNAP payment.
  - `ebt_enabled` boolean, required — Whether the product is eligible for EBT/SNAP payment.
  - `ecommerce_enabled` boolean, required — Whether the product is available for e-commerce.
  - `variable_sale_price` boolean, required — Whether the sale price is entered at the register instead of fixed.
  - `sold_by_weight` boolean, required — Whether the product is sold by weight rather than by unit.
  - `prompt_for_quantity` boolean, required — Whether the register prompts for a quantity when the product is scanned.
  - `manual_item` boolean, required — Whether the product is entered manually at the register rather than scanned.
  - `is_tippable` boolean, required — Whether purchases of this product can include a tip.
  - `is_blackhawk_gift_card` boolean, required — Whether the product is a Blackhawk gift card.
  - `is_reloadable_blackhawk_gift_card` boolean, required — Whether the product is a reloadable Blackhawk gift card.
  - `snap_incentive_earnable` boolean, required — Whether purchases of this product earn SNAP incentives.
  - `snap_incentive_redeemable` boolean, required — Whether SNAP incentives can be redeemed against this product.
  - `discount_restrictions` DiscountRestriction[], nullable, required — Discount types that may not be applied to this product.
  - `loyalty_points_per_dollar` string, nullable, required — Loyalty points earned per dollar spent. Null defaults to one point per dollar.
  - `unit_volume_quantity` string, nullable, required — Net content quantity, in the unit given by `unit_volume_uom_name`.
  - `unit_volume_uom_name` string, nullable, required — Unit of measure for `unit_volume_quantity`.
  - `unit_price` string, nullable, required — Retail price per unit of measure, in dollars.
  - `retail_price` string, positive-monetary, nullable, required — Current shelf/retail price in dollars.
  - `minimum_retail_price` string, positive-monetary, nullable, required — Lower bound for the retail price, in dollars.
  - `maximum_retail_price` string, positive-monetary, nullable, required — Upper bound for the retail price, in dollars.
  - `retail_price_effective_at` string, date-time, nullable, required — When the current retail price took effect.
  - `retail_price_unit_of_measure` UnitOfMeasureDto, required
    - `id` string, required
    - `name` string, required
    - `description` string, required
  - `disable_pos_sync` boolean, required — Whether synchronization of this product to the point-of-sale is disabled.
  - `primary_vendor_configuration` 'LATEST_COST' | 'SELECTED_BY_USER', required
  - `country_of_origin` string, nullable, required — ISO 3166-1 alpha-3 country code of origin.
  - `sync_to_deli_scales` boolean, required — Whether the product is synchronized to deli scales.

## Other responses

- `400`
- `403`

---

[API](https://skmtc.dev/vori/apis/vori-api.md) · [All operations](https://skmtc.dev/vori/apis/vori-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/vori/vori-api/revisions/4e0f577114aa/schema)
