# Products

## Creates or updates products in bulk.

`ProductCreateProductsResponse Products.CreateProducts(ProductCreateProductsParams?parameters, CancellationTokencancellationToken = default)`

**post** `/api/v2/public/products`

Creates or updates products in bulk.

### Parameters

- `ProductCreateProductsParams parameters`

  - `Boolean flush`

    Query param: When true, removes existing products before inserting.

  - `IReadOnlyList<Product>? products`

    Body param: The products to create or update.

    - `required Double CarrierItemQuantity`

      Quantity per carrier item.

    - `required Boolean IsCounted`

      Whether the product is counted.

    - `required Double PriceCompareMultiplier`

      Multiplier used for unit price comparison.

    - `required string ProductName`

      Display name of the product.

    - `required string ProductNumber`

      Unique product number.

    - `Boolean? AllowDecimal`

      Whether decimal quantities are allowed.

    - `IReadOnlyList<string>? AttentionCode`

      Attention codes applied to the product.

    - `Double? AverageWeight`

      Average weight of the product.

    - `string? Barcode`

      Primary barcode for the product.

    - `IReadOnlyList<BarcodesArray>? BarcodesArray`

      Additional barcodes for the product.

      - `string? Barcode`

        Barcode value.

    - `string? BaseUnitName`

      Name of the base unit (e.g. piece, kg).

    - `string? BrandCode`

      Brand code.

    - `string? BrandDescription`

      Brand description.

    - `string? CategoryCode`

      Category code the product belongs to.

    - `string? Color`

      Color name.

    - `string? ColorCode`

      Color code.

    - `IReadOnlyList<string>? CountriesAllowed`

      Countries where the product is allowed.

    - `IReadOnlyList<string>? CountriesNotAllowed`

      Countries where the product is excluded.

    - `string? CountryCode`

      ISO country code; defaults to "NL".

    - `string? DefaultLocationTag`

      Default location tag for the product.

    - `DateTimeOffset? DeprecationDate`

      Date the product is deprecated.

    - `Int? ExpirationMinRange`

      Minimum days remaining before expiration triggers an alert.

    - `IReadOnlyList<FreeField>? FreeFields`

      Custom free-field key/value pairs.

      - `required Int SortOrder`

        Sort order for display purposes.

      - `string? Key`

        Free-field key.

      - `string? Value`

        Free-field value.

    - `Int? GeneralLedgerAccountNumber`

      General ledger account number.

    - `string? ImageUrl`

      URL of the product image.

    - `Int? Ioq`

      Initial order quantity.

    - `Boolean? IsActive`

      Whether the product is active.

    - `Boolean? IsAdr`

      Whether the product is classified as ADR (hazardous goods).

    - `Boolean? IsDeleted`

      Whether the product is marked deleted.

    - `Boolean? IsEditMinMax`

      Whether min/max can be edited at store level.

    - `Boolean? IsEditReplenishment`

      Whether replenishment values can be edited at store level.

    - `Boolean? IsExpiration`

      Whether expiration tracking is enabled for the product.

    - `Boolean? IsMarkdownAllowed`

      Whether markdown is allowed for the product.

    - `Boolean? IsOrderManually`

      Whether the product is ordered manually.

    - `Boolean? IsOrdering`

      Whether the product can be ordered.

    - `Boolean? IsPromotion`

      Whether the product is currently in promotion.

    - `Boolean? IsResetStoreStock`

      When true, resets store stock for the product.

    - `Boolean? IsSet`

      Whether the product is a set/bundle.

    - `Boolean? IsStock`

      Whether the product is stocked.

    - `Boolean? IsStoreProduct`

      Whether the product is store-specific.

    - `Boolean? IsTemplate`

      Whether the product is a template.

    - `Boolean? IsTheft`

      Whether the product is theft-sensitive.

    - `string? LedgerDimensionValue`

      Ledger dimension value used for VC exports.

    - `string? MarginCategory`

      Margin category classification.

    - `Double? Moq`

      Minimum order quantity.

    - `Double? Price`

      Sale price.

    - `string? PriceCompareUnit`

      Unit used for price comparison (e.g. per kg).

    - `string? PriceLines`

      Comma-separated price line identifiers.

    - `string? ProductDescription`

      A description of the product.

    - `string? ProductDetails`

      Free-form product details.

    - `string? ProductReferenceNumber`

      External product reference number.

    - `string? ProductStatus`

      Product life-cycle status.

    - `string? ProductType`

      Product type classification.

    - `string? ProductUrl`

      URL of the product detail page.

    - `IReadOnlyList<string>? PromoStoresAllowed`

      Stores where the product is allowed for promotion.

    - `IReadOnlyList<string>? PromoStoresNotAllowed`

      Stores where the product is excluded from promotion.

    - `Double? PromotionPrice`

      Promotional price.

    - `string? PromotionText`

      Promotion text shown on shelf labels.

    - `string? PromotionWeek`

      Week identifier the promotion applies to.

    - `Double? PurchasePrice`

      Purchase price from the supplier.

    - `string? PurchaseUnitBarcode`

      Barcode of the purchase unit.

    - `string? PurchaseUnitName`

      Name of the purchase unit.

    - `string? PurchaseUnitProductNumber`

      Product number of the purchase unit.

    - `Double? PurchaseUnitQuantity`

      Quantity in a purchase unit.

    - `string? PurchbookFreeTxt`

      Free text used for purchase book/order exports.

    - `string? ReferralProductNumber`

      Referral product number used as a substitute.

    - `IReadOnlyList<SetProduct>? SetProducts`

      Products bundled within this set.

      - `string? SetItemQuantity`

        Quantity of the bundled item.

      - `string? SetProductNumber`

        Product number of the bundled item.

    - `IReadOnlyList<ShelfLabel>? ShelfLabels`

      Shelf-label text fields for the product.

      - `string? Shelflabel1`

        Shelf label slot 1.

      - `string? Shelflabel2`

        Shelf label slot 2.

      - `string? Shelflabel3`

        Shelf label slot 3.

      - `string? Shelflabel4`

        Shelf label slot 4.

      - `string? Shelflabel5`

        Shelf label slot 5.

      - `string? Shelflabel6`

        Shelf label slot 6.

    - `string? Size`

      Size descriptor.

    - `string? SizeCode`

      Size code.

    - `string? SmallestProductNumber`

      Product number of the smallest sub-unit.

    - `Double? SmallestQuantity`

      Quantity of the smallest sub-unit.

    - `string? StoreNumber`

      Store number when the product is store-specific.

    - `IReadOnlyList<string>? StoresAllowed`

      Stores where the product is allowed.

    - `IReadOnlyList<string>? StoresNotAllowed`

      Stores where the product is excluded.

    - `string? SupplierName`

      Supplier name.

    - `string? SupplierNumber`

      Supplier number.

    - `string? SupplierProductNumber`

      Supplier's product number.

    - `IReadOnlyList<Unit>? Units`

      Units of measure (e.g. box, pallet) the product is sold in.

      - `required string UnitBarcode`

        Barcode of the unit.

      - `required string UnitName`

        Name of the unit.

      - `required Double UnitQuantity`

        Quantity per unit.

    - `string? VariantCode`

      Variant code.

    - `string? VariantFamily`

      Variant family.

    - `string? Volume`

      Volume / size descriptor.

### Returns

- `class ProductCreateProductsResponse:`

  Standard success response returned by mutation endpoints.

  - `required Boolean Success`

    Indicates whether the operation completed successfully.

  - `string? Data`

    Optional data payload returned by the operation.

  - `string? Message`

    Human-readable message describing the result.

### Example

```csharp
ProductCreateProductsParams parameters = new();

var response = await client.Products.CreateProducts(parameters);

Console.WriteLine(response);
```

#### Response

```json
{
  "success": true,
  "data": "data",
  "message": "message"
}
```

## Retrieves a paginated list of products.

`ProductListProductsResponse Products.ListProducts(ProductListProductsParams?parameters, CancellationTokencancellationToken = default)`

**get** `/api/v2/public/products`

Retrieves a paginated list of products.

### Parameters

- `ProductListProductsParams parameters`

  - `string pageSize`

  - `string pageStart`

  - `IReadOnlyList<string> productNumber`

### Returns

- `class ProductListProductsResponse:`

  Lightweight paginated result set.

  - `required Long PageNumber`

    Current page number (1-based).

  - `required Int PageSize`

    Maximum number of records returned per page.

  - `required Long TotalRecordCount`

    Total number of records matching the query across all pages.

  - `IReadOnlyList<ProductItem>? Records`

    Collection of records for the current page.

    - `required string Barcode`

      Primary barcode for the product.

    - `required Double CarrierItemQuantity`

    - `required Int EditMinMaxPercentage`

    - `required Double PriceCompareMultiplier`

    - `required string ProductName`

      Display name of the product.

    - `required string ProductNumber`

      Unique product number.

    - `required Int ShelfLabelQuantity`

    - `Boolean? AllowDecimal`

    - `string? AttentionCode`

    - `Double? AverageWeight`

    - `string? BarcodesArray`

    - `string? BaseUnitName`

    - `string? BrandCode`

    - `string? BrandDescription`

    - `string? CategoryCode`

    - `string? Color`

    - `string? ColorCode`

    - `IReadOnlyList<string>? CountriesAllowed`

    - `IReadOnlyList<string>? CountriesNotAllowed`

    - `string? CountryCode`

    - `DateTimeOffset? DeprecationDate`

    - `Int? ExpirationMinRange`

    - `IReadOnlyList<FreeField>? FreeFields`

      - `required Int SortOrder`

      - `string? Key`

      - `string? Value`

    - `string? GeneralLedger`

    - `string? ImageUrl`

    - `Boolean? IsActive`

    - `Boolean? IsCounted`

    - `Boolean? IsEditMinMax`

    - `Boolean? IsEditReplenishment`

    - `Boolean? IsExpiration`

    - `Boolean? IsOrderManually`

    - `Boolean? IsPromotion`

    - `Boolean? IsSet`

    - `Boolean? IsStock`

    - `Boolean? IsStoreProduct`

    - `Boolean? IsTemplate`

    - `string? MarginCategory`

    - `Double? Moq`

    - `Double? OldPrice`

    - `Double? Price`

    - `string? PriceCompareUnit`

    - `string? PriceLines`

    - `string? ProductDetails`

    - `string? ProductType`

    - `string? ProductUrl`

    - `IReadOnlyList<string>? PromoStoresAllowed`

    - `IReadOnlyList<string>? PromoStoresNotAllowed`

    - `string? Promotion`

    - `Double? PromotionPrice`

    - `string? PromotionWeek`

    - `Double? PurchasePrice`

    - `string? PurchaseUnitBarcode`

    - `string? PurchaseUnitName`

    - `string? PurchaseUnitProductNumber`

    - `Double? PurchaseUnitQuantity`

    - `string? ReferralProductID`

    - `Boolean? ResetStoreStock`

    - `IReadOnlyList<SetProduct>? SetProduct`

      - `string? SetItemQuantity`

      - `string? SetProductNumber`

    - `Boolean? ShelfLabel`

    - `Boolean? ShelfLabelBarcode`

    - `Int? ShelfLabelLayout`

    - `Boolean? ShelfLabelPrice`

    - `string? Size`

    - `string? SizeCode`

    - `string? SmallestProductNumber`

    - `Double? SmallestQuantity`

    - `Double? SpecialPrice`

    - `IReadOnlyList<string>? StoresAllowed`

    - `IReadOnlyList<string>? StoresNotAllowed`

    - `string? SupplierID`

    - `string? SupplierName`

    - `string? SupplierProductNumber`

    - `IReadOnlyList<Unit>? Units`

      - `required Double UnitQuantity`

      - `string? UnitBarcode`

      - `string? UnitName`

    - `string? VariantCode`

    - `Double? VariantFactor`

    - `string? VariantFamily`

    - `string? Volume`

### Example

```csharp
ProductListProductsParams parameters = new();

var response = await client.Products.ListProducts(parameters);

Console.WriteLine(response);
```

#### Response

```json
{
  "page_number": 0,
  "page_size": 0,
  "total_record_count": 0,
  "records": [
    {
      "barcode": "barcode",
      "carrier_item_quantity": 0,
      "edit_min_max_percentage": 0,
      "price_compare_multiplier": 0,
      "product_name": "product_name",
      "product_number": "product_number",
      "shelf_label_quantity": 0,
      "allow_decimal": true,
      "attention_code": "attention_code",
      "average_weight": 0,
      "barcodes_array": "barcodes_array",
      "base_unit_name": "base_unit_name",
      "brand_code": "brand_code",
      "brand_description": "brand_description",
      "category_code": "category_code",
      "color": "color",
      "color_code": "color_code",
      "countries_allowed": [
        "string"
      ],
      "countries_not_allowed": [
        "string"
      ],
      "country_code": "country_code",
      "deprecation_date": "2019-12-27T18:11:19.117Z",
      "expiration_min_range": 0,
      "free_fields": [
        {
          "sort_order": 0,
          "key": "key",
          "value": "value"
        }
      ],
      "general_ledger": "general_ledger",
      "image_url": "image_url",
      "is_active": true,
      "is_counted": true,
      "is_edit_min_max": true,
      "is_edit_replenishment": true,
      "is_expiration": true,
      "is_order_manually": true,
      "is_promotion": true,
      "is_set": true,
      "is_stock": true,
      "is_store_product": true,
      "is_template": true,
      "margin_category": "margin_category",
      "moq": 0,
      "old_price": 0,
      "price": 0,
      "price_compare_unit": "price_compare_unit",
      "price_lines": "price_lines",
      "product_details": "product_details",
      "product_type": "product_type",
      "product_url": "product_url",
      "promo_stores_allowed": [
        "string"
      ],
      "promo_stores_not_allowed": [
        "string"
      ],
      "promotion": "promotion",
      "promotion_price": 0,
      "promotion_week": "promotion_week",
      "purchase_price": 0,
      "purchase_unit_barcode": "purchase_unit_barcode",
      "purchase_unit_name": "purchase_unit_name",
      "purchase_unit_product_number": "purchase_unit_product_number",
      "purchase_unit_quantity": 0,
      "referral_product_id": "referral_product_id",
      "reset_store_stock": true,
      "set_product": [
        {
          "set_item_quantity": "set_item_quantity",
          "set_product_number": "set_product_number"
        }
      ],
      "shelf_label": true,
      "shelf_label_barcode": true,
      "shelf_label_layout": 0,
      "shelf_label_price": true,
      "size": "size",
      "size_code": "size_code",
      "smallest_product_number": "smallest_product_number",
      "smallest_quantity": 0,
      "special_price": 0,
      "stores_allowed": [
        "string"
      ],
      "stores_not_allowed": [
        "string"
      ],
      "supplier_id": "supplier_id",
      "supplier_name": "supplier_name",
      "supplier_product_number": "supplier_product_number",
      "units": [
        {
          "unit_quantity": 0,
          "unit_barcode": "unit_barcode",
          "unit_name": "unit_name"
        }
      ],
      "variant_code": "variant_code",
      "variant_factor": 0,
      "variant_family": "variant_family",
      "volume": "volume"
    }
  ]
}
```

## Deletes products by product numbers.

`ProductDeleteProductsResponse Products.DeleteProducts(ProductDeleteProductsParams?parameters, CancellationTokencancellationToken = default)`

**delete** `/api/v2/public/products`

Deletes products by product numbers.

### Parameters

- `ProductDeleteProductsParams parameters`

  - `IReadOnlyList<string>? productNumber`

    The product numbers to target.

### Returns

- `class ProductDeleteProductsResponse:`

  Standard success response returned by mutation endpoints.

  - `required Boolean Success`

    Indicates whether the operation completed successfully.

  - `string? Data`

    Optional data payload returned by the operation.

  - `string? Message`

    Human-readable message describing the result.

### Example

```csharp
ProductDeleteProductsParams parameters = new();

var response = await client.Products.DeleteProducts(parameters);

Console.WriteLine(response);
```

#### Response

```json
{
  "success": true,
  "data": "data",
  "message": "message"
}
```

## Updates a product attribute value across all products matching the old value.

`Products.UpdateProductAttributes(ProductUpdateProductAttributesParamsparameters, CancellationTokencancellationToken = default)`

**put** `/api/v2/public/products/attributes`

Updates a product attribute value across all products matching the old value.

### Parameters

- `ProductUpdateProductAttributesParams parameters`

  - `required string attribute`

    The attribute name to update.

  - `required string newValue`

    The new value to set.

  - `required string oldValue`

    The current value to match.

### Example

```csharp
ProductUpdateProductAttributesParams parameters = new()
{
    Attribute = "x",
    NewValue = "x",
    OldValue = "x",
};

await client.Products.UpdateProductAttributes(parameters);
```

## Creates or updates product prices.

`ProductCreatePricesResponse Products.CreatePrices(ProductCreatePricesParams?parameters, CancellationTokencancellationToken = default)`

**post** `/api/v2/public/products/prices`

Creates or updates product prices.

### Parameters

- `ProductCreatePricesParams parameters`

  - `IReadOnlyList<Price>? prices`

    The product prices to create or update.

    - `required Double Price`

      Price value.

    - `required string PriceID`

      Unique price identifier.

    - `required Int PriceType`

      Numeric price type.

    - `required string ProductNumber`

      The product number this price applies to.

    - `required DateTimeOffset ValidFrom`

      Start of the price's validity period.

    - `required DateTimeOffset ValidTo`

      End of the price's validity period.

    - `string? CountryCode`

      Optional ISO country code restricting the price.

    - `string? PriceGroup`

      Optional price group identifier.

    - `Double? PriceQuantity`

      Quantity for which the price applies.

    - `string? PriceUnit`

      Unit of measure the price applies to.

    - `string? StoreNumber`

      Optional store number restricting the price.

### Returns

- `class ProductCreatePricesResponse:`

  Standard success response returned by mutation endpoints.

  - `required Boolean Success`

    Indicates whether the operation completed successfully.

  - `string? Data`

    Optional data payload returned by the operation.

  - `string? Message`

    Human-readable message describing the result.

### Example

```csharp
ProductCreatePricesParams parameters = new();

var response = await client.Products.CreatePrices(parameters);

Console.WriteLine(response);
```

#### Response

```json
{
  "success": true,
  "data": "data",
  "message": "message"
}
```

## Creates or updates discount prices for products.

`ProductCreateDiscountPricesResponse Products.CreateDiscountPrices(ProductCreateDiscountPricesParams?parameters, CancellationTokencancellationToken = default)`

**post** `/api/v2/public/products/discountprices`

Creates or updates discount prices for products.

### Parameters

- `ProductCreateDiscountPricesParams parameters`

  - `IReadOnlyList<Discount>? discounts`

    Body param: The list of discount price entries.

    - `required Boolean IsDelete`

      When true, removes the existing discount entry.

    - `string? DiscountDescription`

      Human-readable description of the discount.

    - `string? DiscountGroup`

      Optional discount group identifier.

    - `string? DiscountID`

      Unique discount identifier.

    - `Long? DiscountType`

      Numeric discount type.

    - `Long? LineNumber`

      Line number on the discount.

    - `Float? Price`

      Discounted price value.

    - `string? ProductNumber`

      The product number this discount applies to.

    - `DateTimeOffset? ValidFrom`

      Start of the discount's validity period.

    - `DateTimeOffset? ValidTo`

      End of the discount's validity period.

  - `Boolean isExpireDiscounts`

    Header param: When true, expires related active discount rows not refreshed in this import.

  - `Boolean isFlush`

    Header param: When true, removes existing discount prices before inserting.

### Returns

- `class ProductCreateDiscountPricesResponse:`

  Standard success response returned by mutation endpoints.

  - `required Boolean Success`

    Indicates whether the operation completed successfully.

  - `string? Data`

    Optional data payload returned by the operation.

  - `string? Message`

    Human-readable message describing the result.

### Example

```csharp
ProductCreateDiscountPricesParams parameters = new();

var response = await client.Products.CreateDiscountPrices(parameters);

Console.WriteLine(response);
```

#### Response

```json
{
  "success": true,
  "data": "data",
  "message": "message"
}
```

## Creates or updates submitted product free fields. Existing keys not included in the request are unchanged.

`ProductCreateProductFreeFieldsResponse Products.CreateProductFreeFields(ProductCreateProductFreeFieldsParams?parameters, CancellationTokencancellationToken = default)`

**post** `/api/v2/public/products/freefields`

Creates or updates submitted product free fields. Existing keys not included in the request are unchanged.

### Parameters

- `ProductCreateProductFreeFieldsParams parameters`

  - `IReadOnlyList<FreeField>? freeFields`

    The product free fields to create or update.

    - `required string CountryCode`

    - `required IReadOnlyList<FreeField> FreeFields`

      - `string? Key`

      - `Int? SortOrder`

      - `string? Value`

    - `required string ProductNumber`

    - `string? EntityType`

### Returns

- `class ProductCreateProductFreeFieldsResponse:`

  Standard success response returned by mutation endpoints.

  - `required Boolean Success`

    Indicates whether the operation completed successfully.

  - `string? Data`

    Optional data payload returned by the operation.

  - `string? Message`

    Human-readable message describing the result.

### Example

```csharp
ProductCreateProductFreeFieldsParams parameters = new();

var response = await client.Products.CreateProductFreeFields(parameters);

Console.WriteLine(response);
```

#### Response

```json
{
  "success": true,
  "data": "data",
  "message": "message"
}
```

## Domain Types

### Product Item

- `class ProductItem:`

  Full product details returned from the products GET endpoint, including units, barcodes, pricing, and store/country assignments.

  - `required string Barcode`

    Primary barcode for the product.

  - `required Double CarrierItemQuantity`

  - `required Int EditMinMaxPercentage`

  - `required Double PriceCompareMultiplier`

  - `required string ProductName`

    Display name of the product.

  - `required string ProductNumber`

    Unique product number.

  - `required Int ShelfLabelQuantity`

  - `Boolean? AllowDecimal`

  - `string? AttentionCode`

  - `Double? AverageWeight`

  - `string? BarcodesArray`

  - `string? BaseUnitName`

  - `string? BrandCode`

  - `string? BrandDescription`

  - `string? CategoryCode`

  - `string? Color`

  - `string? ColorCode`

  - `IReadOnlyList<string>? CountriesAllowed`

  - `IReadOnlyList<string>? CountriesNotAllowed`

  - `string? CountryCode`

  - `DateTimeOffset? DeprecationDate`

  - `Int? ExpirationMinRange`

  - `IReadOnlyList<FreeField>? FreeFields`

    - `required Int SortOrder`

    - `string? Key`

    - `string? Value`

  - `string? GeneralLedger`

  - `string? ImageUrl`

  - `Boolean? IsActive`

  - `Boolean? IsCounted`

  - `Boolean? IsEditMinMax`

  - `Boolean? IsEditReplenishment`

  - `Boolean? IsExpiration`

  - `Boolean? IsOrderManually`

  - `Boolean? IsPromotion`

  - `Boolean? IsSet`

  - `Boolean? IsStock`

  - `Boolean? IsStoreProduct`

  - `Boolean? IsTemplate`

  - `string? MarginCategory`

  - `Double? Moq`

  - `Double? OldPrice`

  - `Double? Price`

  - `string? PriceCompareUnit`

  - `string? PriceLines`

  - `string? ProductDetails`

  - `string? ProductType`

  - `string? ProductUrl`

  - `IReadOnlyList<string>? PromoStoresAllowed`

  - `IReadOnlyList<string>? PromoStoresNotAllowed`

  - `string? Promotion`

  - `Double? PromotionPrice`

  - `string? PromotionWeek`

  - `Double? PurchasePrice`

  - `string? PurchaseUnitBarcode`

  - `string? PurchaseUnitName`

  - `string? PurchaseUnitProductNumber`

  - `Double? PurchaseUnitQuantity`

  - `string? ReferralProductID`

  - `Boolean? ResetStoreStock`

  - `IReadOnlyList<SetProduct>? SetProduct`

    - `string? SetItemQuantity`

    - `string? SetProductNumber`

  - `Boolean? ShelfLabel`

  - `Boolean? ShelfLabelBarcode`

  - `Int? ShelfLabelLayout`

  - `Boolean? ShelfLabelPrice`

  - `string? Size`

  - `string? SizeCode`

  - `string? SmallestProductNumber`

  - `Double? SmallestQuantity`

  - `Double? SpecialPrice`

  - `IReadOnlyList<string>? StoresAllowed`

  - `IReadOnlyList<string>? StoresNotAllowed`

  - `string? SupplierID`

  - `string? SupplierName`

  - `string? SupplierProductNumber`

  - `IReadOnlyList<Unit>? Units`

    - `required Double UnitQuantity`

    - `string? UnitBarcode`

    - `string? UnitName`

  - `string? VariantCode`

  - `Double? VariantFactor`

  - `string? VariantFamily`

  - `string? Volume`
