# Create products(in batch)

1. Product data that can be transmitted in one batch should not exceed 200. If there are more products, please create them in batches.
2. The interface supports partial synchronization success and partial synchronization failure. However, if there is a parameter format error, all will fail.
3. You can not create "ShopCategory" or "ChoiceGroup" through this interface, please make sure all the ShopCategory.id and ChoiceGroup.id are already exist in store.
4. Regarding the product image related Field, please use the "Image upload API" to upload the image to the KeeTa system first, than get the image URL and pass into the Picture.url field.
5. If it is a tobacco and alcohol product, please be sure to fill in the relevant attributes in the [Product Attributes] field to avoid regulatory issues.
6. If a Spu contains only one Sku, then the Sku.spec field is allowed to remain empty, otherwise the Sku.spec in a specific Spu need to be filled.
7. The Sku.price is required and supports up to two decimal places.
8. Spu.avaliableTime is required.
9. "Specialty" dish can not exceed 15 in a store.

**Rate limit:** 10 QPS by appId dimension.

Endpoint: POST /product/spu/batchcreate
Version: v.1.0.0

## Request fields (application/json):

  - `shopId` (integer, required)
    store id in KeeTa
    Example: 25381

  - `spuList` (array, required)
    Spu data model

  - `spuList.id` (integer)
    Unique SPU ID generated by Keeta. Not required in OpenItemCode-based APIs. Required for updates in Keeta ID-based APIs. See "Menu Development Guide" for details.
    Example: 12345

  - `spuList.name` (string, required)
    Product name
    Example: Spicy Chicken Burger

  - `spuList.sourceLanguageType` (string, required)
    Language code for name field (refer to Menu Integration Guide)
    Example: en

  - `spuList.nameTranslation` (string)
    Localized name translation
    Example: 辣雞腿漢堡

  - `spuList.targetLanguageType` (string)
    Language code for nameTranslation (required if translation exists), please refer to [Menu API Integration Guide](/apis/standard/docs/menuintegrationguide)
    Example: zh-HK

  - `spuList.nameTranslateType` (integer)
    Source of name translation. When the value equals 1, it indicates that the name translation was provided by the merchant.
    Example: 1

  - `spuList.status` (integer, required)
    Product availability status:
    Example: 1

  - `spuList.description` (string)
    Product description
    Example: Spicy Chicken Burger description

  - `spuList.descSourceLanguageType` (string)
    Language code for description (required if description exists), please refer to [Menu API Integration Guide](/apis/standard/docs/menuintegrationguide)
    Example: en

  - `spuList.descriptionTranslation` (string)
    Localized description translation
    Example: 辣雞腿漢堡描述

  - `spuList.descTargetLanguageType` (string)
    Language code for descriptionTranslation (required if translation exists), please refer to [Menu API Integration Guide](/apis/standard/docs/menuintegrationguide)
    Example: zh-HK

  - `spuList.descriptionTranslateType` (integer)
    Source of description translation. When the value equals 1, it indicates that the description translation was provided by the merchant.
    Example: 1

  - `spuList.shopCategoryList` (array)
    Menu categories this SPU belongs to. The 'id' field is required when not using menuSync API. For all interfaces using this struct except menuSync, the id field in ShopCategory struct is required to associate SPUs with category.

  - `spuList.shopCategoryList.id` (integer)
    Keeta's menu category ID. Not required for OpenItemCode-based APIs. Required for updates in Keeta ID-based APIs.
    Example: 12345

  - `spuList.shopCategoryList.name` (string, required)
    Name of the category in a menu
    Example: Happy Meal

  - `spuList.shopCategoryList.sourceLanguageType` (string, required)
    Language type of the name field. Supported language enums can be found in Menu Integration Guide
    Example: en

  - `spuList.shopCategoryList.nameTranslation` (string)
    Translated text for the name field
    Example: 開心樂園餐

  - `spuList.shopCategoryList.targetLanguageType` (string)
    Language type of nameTranslation. Required when nameTranslation is provided.
    Example: zh-HK

  - `spuList.shopCategoryList.nameTranslateType` (integer)
    Source of name translation. When the value equals 1, it indicates that the name translation was provided by the merchant.
    Example: 1

  - `spuList.shopCategoryList.type` (integer, required)
    Indicates the menu category type:
    Example: 0

  - `spuList.shopCategoryList.description` (string)
    Brief description of the category in a menu
    Example: Happy Meal description

  - `spuList.shopCategoryList.descSourceLanguageType` (string)
    Language type of description. Required if description exists.
    Example: en

  - `spuList.shopCategoryList.descriptionTranslation` (string)
    Translated text for description
    Example: 開心樂園餐描述

  - `spuList.shopCategoryList.descTargetLanguageType` (string)
    Language type of descriptionTranslation. Required when descriptionTranslation exists.
    Example: zh-HK

  - `spuList.shopCategoryList.descriptionTranslateType` (integer)
    Source of description translation. When the value equals 1, it indicates that the description translation was provided by the merchant.
    Example: 1

  - `spuList.shopCategoryList.openItemCode` (string, required)
    Third-party category ID. Mandatory and must be unique in OpenItemCode-based APIs. Optional in Keeta ID-based APIs.
    Example: SHOP_CATEGORY#10001

  - `spuList.shopCategoryList.availableTime` (object)
    Selling time slots for this category. Categories are unavailable outside these times.

  - `spuList.shopCategoryList.availableTime.code` (integer, required)
    Selling time type indicator:
    Example: 0

  - `spuList.shopCategoryList.availableTime.values` (array)
    Required when code=1. Contains 7 strings representing daily time slots (from Monday to Sunday). To represent multiple time slots within a day, use comma to separate between each time slots. Empty string means unavailable.

  - `spuList.shopCategoryList.availableTime.available` (array)
    Defines specific date ranges and time windows. Required when code=2.

  - `spuList.shopCategoryList.availableTime.available.startTimestamp` (integer)
    Beginning timestamp (milliseconds). Required when using absolute date ranges. If set without endTimestamp, indicates perpetual availability after start date. Required when AvailableTime.code = 2
    Example: 1735660800000

  - `spuList.shopCategoryList.availableTime.available.endTimestamp` (integer)
    Ending timestamp (milliseconds). When omitted with startTimestamp, creates open-ended availability.
    Example: 1736956799000

  - `spuList.pictureList` (array)
    Product image URLs

  - `spuList.pictureList.url` (string, required)
    Product image URLs

  - `spuList.propertyList` (array)
    SPU properties (Currently the only SPU property available is "alcoholic")
    Example: [{"propertyId":9999,"propertyType":1,"customizable":0,"propertyValueList":[{"valueId":9999}]}]

  - `spuList.propertyList.propertyId` (integer, required)
    Unique identifier for the property
    Example: 9999

  - `spuList.propertyList.propertyName` (string)
    Display name of the property (This field will not be used when propertyType = 1)

  - `spuList.propertyList.propertyType` (integer)
    Property classification:
    Example: 1

  - `spuList.propertyList.minValueNumber` (integer)
    Minimum number of values that must be selected

  - `spuList.propertyList.maxValueNumber` (integer)
    Maximum number of values that can be selected

  - `spuList.propertyList.customizable` (integer)
    Custom value allowance: 0: customizable = 0 prohibits custom values 1: customizable = 1 allows custom text input

  - `spuList.propertyList.propertyValueList` (array, required)
    List of predefined property values

  - `spuList.propertyList.propertyValueList.valueId` (integer, required)
    Unique identifier for the property value
    Example: 9999

  - `spuList.propertyList.propertyValueList.valueName` (string)
    Display name of the property value (This field will not be used when customizable = 0)

  - `spuList.skuList` (array, required)
    A list includes all SKUs under this SPU

  - `spuList.skuList.id` (integer)
    Unique SKU ID generated by Keeta system. Not required in OpenItemCode-based APIs. Required for updates in Keeta ID-based APIs. For details, see "Menu Development Guide" for details.
    Example: 12345

  - `spuList.skuList.spec` (string)
    Specification name (optional for single-spec products)
    Example: Large

  - `spuList.skuList.sourceLanguageType` (string)
    Language code for name field (refer to Menu Integration Guide)
    Example: en

  - `spuList.skuList.specTranslation` (string)
    Localized specification translation
    Example: 大份

  - `spuList.skuList.targetLanguageType` (string)
    Language code for specTranslation (required if translation exists), please refer to [Menu API Integration Guide](/apis/standard/docs/menuintegrationguide)
    Example: zh-HK

  - `spuList.skuList.specTranslateType` (string)
    Source of spec translation. When the value equals 1, it indicates that the spec translation was provided by the merchant.
    Example: 1

  - `spuList.skuList.price` (string)
    Delivery price (supports 3 decimal places, e.g. "12.33")
    Example: 28.0

  - `spuList.skuList.pickPrice` (string)
    Pickup price (supports 3 decimal places)
    Example: 28.0

  - `spuList.skuList.canteenPrice` (string)
    Dine-in price (supports 3 decimal places)
    Example: 28.0

  - `spuList.skuList.currency` (string)
    Currency code (refer to "Currency Symbols" enum). Defaults to merchant's currency if empty.
    Example: HKD

  - `spuList.skuList.choiceGroupList` (array)
    List of ChoiceGroups associated with this SKU. Not used for menuSync API.

  - `spuList.skuList.choiceGroupList.id` (integer)
    Unique ChoiceGroup ID generated by Keeta system. Not required in OpenItemCode-based APIs. Required for updates in Keeta ID-based APIs.
    Example: 0

  - `spuList.skuList.choiceGroupList.name` (string, required)
    Display name of the ChoiceGroup
    Example: Sauces

  - `spuList.skuList.choiceGroupList.sourceLanguageType` (string, required)
    Language code for name field (refer to Menu Integration Guide)
    Example: en

  - `spuList.skuList.choiceGroupList.nameTranslation` (string)
    Localized name translation
    Example: 選擇醬料

  - `spuList.skuList.choiceGroupList.targetLanguageType` (string)
    Language code for nameTranslation (required if translation exists), please refer to [Menu API Integration Guide](/apis/standard/docs/menuintegrationguide)
    Example: zh-HK

  - `spuList.skuList.choiceGroupList.nameTranslateType` (integer)
    Source of name translation. When the value equals 1, it indicates that the name translation was provided by the merchant.
    Example: 1

  - `spuList.skuList.choiceGroupList.minNumber` (integer, required)
    Minimum number of ChoiceGroupSkus that must be selected
    Example: 0

  - `spuList.skuList.choiceGroupList.maxNumber` (integer, required)
    Maximum number of ChoiceGroupSkus that can be selected
    Example: 3

  - `spuList.skuList.choiceGroupList.choiceGroupSkuList` (array, required)
    List of available ChoiceGroupSkus in this ChoiceGroup

  - `spuList.skuList.choiceGroupList.choiceGroupSkuList.id` (integer)
    Primary key for ChoiceGroupSku, mainly used for order API alignment. Changes when names are modified. Not required in OpenItemCode-based APIs. Required for updates in Keeta ID-based APIs.
    Example: 0

  - `spuList.skuList.choiceGroupList.choiceGroupSkuList.name` (string, required)
    Display name of the ChoiceGroupSku. Should match SPU name when representing the same product for internal correlation.
    Example: Ketchup

  - `spuList.skuList.choiceGroupList.choiceGroupSkuList.sourceLanguageType` (string, required)
    Language code for name field (refer to Menu Integration Guide)
    Example: en

  - `spuList.skuList.choiceGroupList.choiceGroupSkuList.nameTranslation` (string)
    Localized name translation
    Example: 番茄醬

  - `spuList.skuList.choiceGroupList.choiceGroupSkuList.targetLanguageType` (string)
    Language code for nameTranslation (required if translation exists), please refer to [Menu API Integration Guide](/apis/standard/docs/menuintegrationguide)
    Example: zh-HK

  - `spuList.skuList.choiceGroupList.choiceGroupSkuList.nameTranslateType` (integer)
    Source of name translation. When the value equals 1, it indicates that the name translation was provided by the merchant.
    Example: 1

  - `spuList.skuList.choiceGroupList.choiceGroupSkuList.price` (string)
    Delivery price (supports 2 decimal places)
    Example: 12.33

  - `spuList.skuList.choiceGroupList.choiceGroupSkuList.pickPrice` (string)
    Pickup price (supports 2 decimal places)
    Example: 12.33

  - `spuList.skuList.choiceGroupList.choiceGroupSkuList.canteenPrice` (string)
    Dine-in price (supports 2 decimal places)
    Example: 12.33

  - `spuList.skuList.choiceGroupList.choiceGroupSkuList.currency` (string)
    Currency code (refer to "Currency Symbols" enum). Defaults to merchant's currency.
    Example: HKD

  - `spuList.skuList.choiceGroupList.choiceGroupSkuList.status` (integer, required)
    Availability status:
> 0:  indicates the ChoiceGroupSku is unavailable /
1:  indicates ChoiceGroupSku is available
    Example: 1

  - `spuList.skuList.choiceGroupList.choiceGroupSkuList.openItemCode` (string, required)
    Third-party ChoiceGroupSku identifier. Mandatory and unique in OpenItemCode-based APIs.
    Example: CHOICE#10001

  - `spuList.skuList.choiceGroupList.choiceGroupSkuList.allergens` (array)
    Allergen information (refer to Menu API Integration Guide - 4.4 Allergen Information Specification)

  - `spuList.skuList.choiceGroupList.choiceGroupSkuList.choiceGroupOpenItemCodeList` (array)
    OpenItemCodes of associated nested ChoiceGroups. Using this field for addons (items not sold separately on the menu, and cannot share the same name as any other SPU on the menu) with nested selection needs.

  - `spuList.skuList.choiceGroupList.choiceGroupSkuList.pictureList` (array)
    ChoiceGroupSku image URLs

  - `spuList.skuList.choiceGroupList.choiceGroupSkuList.pictureList.url` (string, required)
    ChoiceGroupSku image URLs
    Example: https://img-ap-hongkong.mykeeta.net/sailorproduct/9c760595674b395e330cf94b0e5068b09999.jpg

  - `spuList.skuList.choiceGroupList.choiceGroupSkuList.relatedSpuOpenItemCode` (string)
    Third-party SPU identifier this ChoiceGroupSku should bind to. Using this to explicitly bind the ChoiceGroupSku to the given SPU.

  - `spuList.skuList.choiceGroupList.choiceGroupSkuList.relatedSkuOpenItemCode` (string)
    Third-party SKU identifier this ChoiceGroupSku should bind to. Using this to explicitly bind the ChoiceGroupSku to the given SKU. When a ChoiceGroupSku bind to a SKU, it will use the bounded SKU's ChoiceGroups to form a multi-layer ChoiceGroup structure.

  - `spuList.skuList.choiceGroupList.openItemCode` (string, required)
    Developer-provided ChoiceGroup identifier. Mandatory and unique in OpenItemCode-based APIs.
    Example: GROUP#10001

  - `spuList.skuList.choiceGroupList.repeatable` (integer)
    Multiple selection flag:
    Example: 0

  - `spuList.skuList.openItemCode` (string, required)
    Developer-provided SKU identifier. Mandatory and unique in OpenItemCode-based APIs. Optional for Keeta-based ID APIs.
    Example: SKU#10001

  - `spuList.skuList.choiceGroupOpenItemCodeList` (array)
    OpenItemCodes of associated ChoiceGroups. Required for menuSync API.

  - `spuList.skuList.allergens` (array)
    Allergen information (refer to Menu API Integration Guide - 4.4 Allergen Information Specification)

  - `spuList.skuList.servingSize` (integer)
    The number of people the portion serves. (From 1 to 9)
    Example: 4

  - `spuList.skuList.caffeine` (number)
    The amount of caffeine contained in the item. (Must be a non-negative number, up to 2 decimal places)
    Example: 0.39

  - `spuList.availableTime` (object, required)
    Selling time slots for this product

  - `spuList.availableTime.code` (integer, required)
    Selling time type indicator:
    Example: 0

  - `spuList.availableTime.values` (array)
    Required when code=1. Contains 7 strings representing daily time slots (from Monday to Sunday). To represent multiple time slots within a day, use comma to separate between each time slots. Empty string means unavailable.

  - `spuList.availableTime.available` (array)
    Defines specific date ranges and time windows. Required when code=2.

  - `spuList.isSpecialty` (integer, required)
    Signature dish indicator:
    Example: 0

  - `spuList.openItemCode` (string, required)
    Developer-provided SPU identifier. Mandatory and unique in OpenItemCode-based APIs.
    Example: SPU#10001

  - `spuList.shopCategoryOpenItemCodeList` (array, required)
    This field contains the OpenItemCodes that correspond to menu categories in Keeta's system. When calling the menu synchronization (menuSync) API, this field becomes mandatory. The OpenItemCodes are provided by developers and maintain a one-to-one relationship with Keeta's internal menu category IDs. The Keeta platform will verify whether these OpenItemCodes actually exist in the merchant's store.
    Example: ["2$33419","3$34747"]

  - `spuList.userGetModeList` (array, required)
    This field specifies the supported order fulfillment modes, with case-sensitive values. By default, all products support "delivery" mode. To enable "pickup" mode, the following conditions must be satisfied: First, every SKU in the skuList must have a valid pickPrice value specified. Second, all options within every choice group associated with these SKUs must also have pickPrice values defined. The system recognizes two mode values: "delivery" for standard food delivery services "pickup" for customer self-collection scenarios
    Example: ["delivery","pickup"]

## Response 200 fields (application/json):

  - `code` (integer, required)
    A numeric status identifier indicating the result of the interface call, used to determine whether the operation executed successfully.
    Example: 0

  - `message` (string, required)
    Text description corresponding to the status code, explaining the operation result or error cause to users.
    Example: Success

  - `data` (array)
    successful Spu data model

  - `data.id` (integer)
    Unique SPU ID generated by Keeta. Not required in OpenItemCode-based APIs. Required for updates in Keeta ID-based APIs. See "Menu Development Guide" for details.
    Example: 12345

  - `data.name` (string, required)
    Product name
    Example: Spicy Chicken Burger

  - `data.sourceLanguageType` (string, required)
    Language code for name field (refer to Menu Integration Guide)
    Example: en

  - `data.nameTranslation` (string)
    Localized name translation
    Example: 辣雞腿漢堡

  - `data.targetLanguageType` (string)
    Language code for nameTranslation (required if translation exists), please refer to [Menu API Integration Guide](/apis/standard/docs/menuintegrationguide)
    Example: zh-HK

  - `data.nameTranslateType` (integer)
    Source of name translation. When the value equals 1, it indicates that the name translation was provided by the merchant.
    Example: 1

  - `data.status` (integer, required)
    Product availability status:
    Example: 1

  - `data.description` (string)
    Product description
    Example: Spicy Chicken Burger description

  - `data.descSourceLanguageType` (string)
    Language code for description (required if description exists), please refer to [Menu API Integration Guide](/apis/standard/docs/menuintegrationguide)
    Example: en

  - `data.descriptionTranslation` (string)
    Localized description translation
    Example: 辣雞腿漢堡描述

  - `data.descTargetLanguageType` (string)
    Language code for descriptionTranslation (required if translation exists), please refer to [Menu API Integration Guide](/apis/standard/docs/menuintegrationguide)
    Example: zh-HK

  - `data.descriptionTranslateType` (integer)
    Source of description translation. When the value equals 1, it indicates that the description translation was provided by the merchant.
    Example: 1

  - `data.shopCategoryList` (array)
    Menu categories this SPU belongs to. The 'id' field is required when not using menuSync API. For all interfaces using this struct except menuSync, the id field in ShopCategory struct is required to associate SPUs with category.

  - `data.shopCategoryList.id` (integer)
    Keeta's menu category ID. Not required for OpenItemCode-based APIs. Required for updates in Keeta ID-based APIs.
    Example: 12345

  - `data.shopCategoryList.name` (string, required)
    Name of the category in a menu
    Example: Happy Meal

  - `data.shopCategoryList.sourceLanguageType` (string, required)
    Language type of the name field. Supported language enums can be found in Menu Integration Guide
    Example: en

  - `data.shopCategoryList.nameTranslation` (string)
    Translated text for the name field
    Example: 開心樂園餐

  - `data.shopCategoryList.targetLanguageType` (string)
    Language type of nameTranslation. Required when nameTranslation is provided.
    Example: zh-HK

  - `data.shopCategoryList.nameTranslateType` (integer)
    Source of name translation. When the value equals 1, it indicates that the name translation was provided by the merchant.
    Example: 1

  - `data.shopCategoryList.type` (integer, required)
    Indicates the menu category type:
    Example: 0

  - `data.shopCategoryList.description` (string)
    Brief description of the category in a menu
    Example: Happy Meal description

  - `data.shopCategoryList.descSourceLanguageType` (string)
    Language type of description. Required if description exists.
    Example: en

  - `data.shopCategoryList.descriptionTranslation` (string)
    Translated text for description
    Example: 開心樂園餐描述

  - `data.shopCategoryList.descTargetLanguageType` (string)
    Language type of descriptionTranslation. Required when descriptionTranslation exists.
    Example: zh-HK

  - `data.shopCategoryList.descriptionTranslateType` (integer)
    Source of description translation. When the value equals 1, it indicates that the description translation was provided by the merchant.
    Example: 1

  - `data.shopCategoryList.openItemCode` (string, required)
    Third-party category ID. Mandatory and must be unique in OpenItemCode-based APIs. Optional in Keeta ID-based APIs.
    Example: SHOP_CATEGORY#10001

  - `data.shopCategoryList.availableTime` (object)
    Selling time slots for this category. Categories are unavailable outside these times.

  - `data.shopCategoryList.availableTime.code` (integer, required)
    Selling time type indicator:
    Example: 0

  - `data.shopCategoryList.availableTime.values` (array)
    Required when code=1. Contains 7 strings representing daily time slots (from Monday to Sunday). To represent multiple time slots within a day, use comma to separate between each time slots. Empty string means unavailable.

  - `data.shopCategoryList.availableTime.available` (array)
    Defines specific date ranges and time windows. Required when code=2.

  - `data.shopCategoryList.availableTime.available.startTimestamp` (integer)
    Beginning timestamp (milliseconds). Required when using absolute date ranges. If set without endTimestamp, indicates perpetual availability after start date. Required when AvailableTime.code = 2
    Example: 1735660800000

  - `data.shopCategoryList.availableTime.available.endTimestamp` (integer)
    Ending timestamp (milliseconds). When omitted with startTimestamp, creates open-ended availability.
    Example: 1736956799000

  - `data.pictureList` (array)
    Product image URLs

  - `data.pictureList.url` (string, required)
    Product image URLs

  - `data.propertyList` (array)
    SPU properties (Currently the only SPU property available is "alcoholic")
    Example: [{"propertyId":9999,"propertyType":1,"customizable":0,"propertyValueList":[{"valueId":9999}]}]

  - `data.propertyList.propertyId` (integer, required)
    Unique identifier for the property
    Example: 9999

  - `data.propertyList.propertyName` (string)
    Display name of the property (This field will not be used when propertyType = 1)

  - `data.propertyList.propertyType` (integer)
    Property classification:
    Example: 1

  - `data.propertyList.minValueNumber` (integer)
    Minimum number of values that must be selected

  - `data.propertyList.maxValueNumber` (integer)
    Maximum number of values that can be selected

  - `data.propertyList.customizable` (integer)
    Custom value allowance: 0: customizable = 0 prohibits custom values 1: customizable = 1 allows custom text input

  - `data.propertyList.propertyValueList` (array, required)
    List of predefined property values

  - `data.propertyList.propertyValueList.valueId` (integer, required)
    Unique identifier for the property value
    Example: 9999

  - `data.propertyList.propertyValueList.valueName` (string)
    Display name of the property value (This field will not be used when customizable = 0)

  - `data.skuList` (array, required)
    A list includes all SKUs under this SPU

  - `data.skuList.id` (integer)
    Unique SKU ID generated by Keeta system. Not required in OpenItemCode-based APIs. Required for updates in Keeta ID-based APIs. For details, see "Menu Development Guide" for details.
    Example: 12345

  - `data.skuList.spec` (string)
    Specification name (optional for single-spec products)
    Example: Large

  - `data.skuList.sourceLanguageType` (string)
    Language code for name field (refer to Menu Integration Guide)
    Example: en

  - `data.skuList.specTranslation` (string)
    Localized specification translation
    Example: 大份

  - `data.skuList.targetLanguageType` (string)
    Language code for specTranslation (required if translation exists), please refer to [Menu API Integration Guide](/apis/standard/docs/menuintegrationguide)
    Example: zh-HK

  - `data.skuList.specTranslateType` (string)
    Source of spec translation. When the value equals 1, it indicates that the spec translation was provided by the merchant.
    Example: 1

  - `data.skuList.price` (string)
    Delivery price (supports 3 decimal places, e.g. "12.33")
    Example: 28.0

  - `data.skuList.pickPrice` (string)
    Pickup price (supports 3 decimal places)
    Example: 28.0

  - `data.skuList.canteenPrice` (string)
    Dine-in price (supports 3 decimal places)
    Example: 28.0

  - `data.skuList.currency` (string)
    Currency code (refer to "Currency Symbols" enum). Defaults to merchant's currency if empty.
    Example: HKD

  - `data.skuList.choiceGroupList` (array)
    List of ChoiceGroups associated with this SKU. Not used for menuSync API.

  - `data.skuList.choiceGroupList.id` (integer)
    Unique ChoiceGroup ID generated by Keeta system. Not required in OpenItemCode-based APIs. Required for updates in Keeta ID-based APIs.
    Example: 0

  - `data.skuList.choiceGroupList.name` (string, required)
    Display name of the ChoiceGroup
    Example: Sauces

  - `data.skuList.choiceGroupList.sourceLanguageType` (string, required)
    Language code for name field (refer to Menu Integration Guide)
    Example: en

  - `data.skuList.choiceGroupList.nameTranslation` (string)
    Localized name translation
    Example: 選擇醬料

  - `data.skuList.choiceGroupList.targetLanguageType` (string)
    Language code for nameTranslation (required if translation exists), please refer to [Menu API Integration Guide](/apis/standard/docs/menuintegrationguide)
    Example: zh-HK

  - `data.skuList.choiceGroupList.nameTranslateType` (integer)
    Source of name translation. When the value equals 1, it indicates that the name translation was provided by the merchant.
    Example: 1

  - `data.skuList.choiceGroupList.minNumber` (integer, required)
    Minimum number of ChoiceGroupSkus that must be selected
    Example: 0

  - `data.skuList.choiceGroupList.maxNumber` (integer, required)
    Maximum number of ChoiceGroupSkus that can be selected
    Example: 3

  - `data.skuList.choiceGroupList.choiceGroupSkuList` (array, required)
    List of available ChoiceGroupSkus in this ChoiceGroup

  - `data.skuList.choiceGroupList.choiceGroupSkuList.id` (integer)
    Primary key for ChoiceGroupSku, mainly used for order API alignment. Changes when names are modified. Not required in OpenItemCode-based APIs. Required for updates in Keeta ID-based APIs.
    Example: 0

  - `data.skuList.choiceGroupList.choiceGroupSkuList.name` (string, required)
    Display name of the ChoiceGroupSku. Should match SPU name when representing the same product for internal correlation.
    Example: Ketchup

  - `data.skuList.choiceGroupList.choiceGroupSkuList.sourceLanguageType` (string, required)
    Language code for name field (refer to Menu Integration Guide)
    Example: en

  - `data.skuList.choiceGroupList.choiceGroupSkuList.nameTranslation` (string)
    Localized name translation
    Example: 番茄醬

  - `data.skuList.choiceGroupList.choiceGroupSkuList.targetLanguageType` (string)
    Language code for nameTranslation (required if translation exists), please refer to [Menu API Integration Guide](/apis/standard/docs/menuintegrationguide)
    Example: zh-HK

  - `data.skuList.choiceGroupList.choiceGroupSkuList.nameTranslateType` (integer)
    Source of name translation. When the value equals 1, it indicates that the name translation was provided by the merchant.
    Example: 1

  - `data.skuList.choiceGroupList.choiceGroupSkuList.price` (string)
    Delivery price (supports 2 decimal places)
    Example: 12.33

  - `data.skuList.choiceGroupList.choiceGroupSkuList.pickPrice` (string)
    Pickup price (supports 2 decimal places)
    Example: 12.33

  - `data.skuList.choiceGroupList.choiceGroupSkuList.canteenPrice` (string)
    Dine-in price (supports 2 decimal places)
    Example: 12.33

  - `data.skuList.choiceGroupList.choiceGroupSkuList.currency` (string)
    Currency code (refer to "Currency Symbols" enum). Defaults to merchant's currency.
    Example: HKD

  - `data.skuList.choiceGroupList.choiceGroupSkuList.status` (integer, required)
    Availability status:
> 0:  indicates the ChoiceGroupSku is unavailable /
1:  indicates ChoiceGroupSku is available
    Example: 1

  - `data.skuList.choiceGroupList.choiceGroupSkuList.openItemCode` (string, required)
    Third-party ChoiceGroupSku identifier. Mandatory and unique in OpenItemCode-based APIs.
    Example: CHOICE#10001

  - `data.skuList.choiceGroupList.choiceGroupSkuList.allergens` (array)
    Allergen information (refer to Menu API Integration Guide - 4.4 Allergen Information Specification)

  - `data.skuList.choiceGroupList.choiceGroupSkuList.choiceGroupOpenItemCodeList` (array)
    OpenItemCodes of associated nested ChoiceGroups. Using this field for addons (items not sold separately on the menu, and cannot share the same name as any other SPU on the menu) with nested selection needs.

  - `data.skuList.choiceGroupList.choiceGroupSkuList.pictureList` (array)
    ChoiceGroupSku image URLs

  - `data.skuList.choiceGroupList.choiceGroupSkuList.pictureList.url` (string, required)
    ChoiceGroupSku image URLs
    Example: https://img-ap-hongkong.mykeeta.net/sailorproduct/9c760595674b395e330cf94b0e5068b09999.jpg

  - `data.skuList.choiceGroupList.choiceGroupSkuList.relatedSpuOpenItemCode` (string)
    Third-party SPU identifier this ChoiceGroupSku should bind to. Using this to explicitly bind the ChoiceGroupSku to the given SPU.

  - `data.skuList.choiceGroupList.choiceGroupSkuList.relatedSkuOpenItemCode` (string)
    Third-party SKU identifier this ChoiceGroupSku should bind to. Using this to explicitly bind the ChoiceGroupSku to the given SKU. When a ChoiceGroupSku bind to a SKU, it will use the bounded SKU's ChoiceGroups to form a multi-layer ChoiceGroup structure.

  - `data.skuList.choiceGroupList.openItemCode` (string, required)
    Developer-provided ChoiceGroup identifier. Mandatory and unique in OpenItemCode-based APIs.
    Example: GROUP#10001

  - `data.skuList.choiceGroupList.repeatable` (integer)
    Multiple selection flag:
    Example: 0

  - `data.skuList.openItemCode` (string, required)
    Developer-provided SKU identifier. Mandatory and unique in OpenItemCode-based APIs. Optional for Keeta-based ID APIs.
    Example: SKU#10001

  - `data.skuList.choiceGroupOpenItemCodeList` (array)
    OpenItemCodes of associated ChoiceGroups. Required for menuSync API.

  - `data.skuList.allergens` (array)
    Allergen information (refer to Menu API Integration Guide - 4.4 Allergen Information Specification)

  - `data.skuList.servingSize` (integer)
    The number of people the portion serves. (From 1 to 9)
    Example: 4

  - `data.skuList.caffeine` (number)
    The amount of caffeine contained in the item. (Must be a non-negative number, up to 2 decimal places)
    Example: 0.39

  - `data.availableTime` (object, required)
    Selling time slots for this product

  - `data.availableTime.code` (integer, required)
    Selling time type indicator:
    Example: 0

  - `data.availableTime.values` (array)
    Required when code=1. Contains 7 strings representing daily time slots (from Monday to Sunday). To represent multiple time slots within a day, use comma to separate between each time slots. Empty string means unavailable.

  - `data.availableTime.available` (array)
    Defines specific date ranges and time windows. Required when code=2.

  - `data.isSpecialty` (integer, required)
    Signature dish indicator:
    Example: 0

  - `data.openItemCode` (string, required)
    Developer-provided SPU identifier. Mandatory and unique in OpenItemCode-based APIs.
    Example: SPU#10001

  - `data.shopCategoryOpenItemCodeList` (array, required)
    This field contains the OpenItemCodes that correspond to menu categories in Keeta's system. When calling the menu synchronization (menuSync) API, this field becomes mandatory. The OpenItemCodes are provided by developers and maintain a one-to-one relationship with Keeta's internal menu category IDs. The Keeta platform will verify whether these OpenItemCodes actually exist in the merchant's store.
    Example: ["2$33419","3$34747"]

  - `data.userGetModeList` (array, required)
    This field specifies the supported order fulfillment modes, with case-sensitive values. By default, all products support "delivery" mode. To enable "pickup" mode, the following conditions must be satisfied: First, every SKU in the skuList must have a valid pickPrice value specified. Second, all options within every choice group associated with these SKUs must also have pickPrice values defined. The system recognizes two mode values: "delivery" for standard food delivery services "pickup" for customer self-collection scenarios
    Example: ["delivery","pickup"]

  - `errorList` (array)
    failed Spu informations

  - `errorList.id` (integer)
    Unique identifier for the SPU (Standard Product Unit), generated by Keeta's system

  - `errorList.name` (string)
    Display name of the SPU

  - `errorList.openItemCode` (string)
    Developer-provided external identifier that maintains a one-to-one mapping with Keeta's internal SPU ID. Refer to the "Menu Development Guide" for implementation details.
    Example: VGsku-00035

  - `errorList.errorPictureList` (array)
    Contains information about failed image binding attempts during batch operations, including error details

  - `errorList.errorPictureList.url` (string)
    Product image URLs
    Example: https://img-ap-hongkong.mykeeta.net/sailorproduct/9c760595674b395e330cf94b0e5068b09999.jpg

  - `errorList.errorPictureList.code` (integer)
    A numeric status identifier indicating the result of the interface call, used to determine whether the operation executed successfully. **A code value of 0** indicates that **the request was executed successfully**. **Any non-zero code value** indicates that **request execution failed**. **Specific error details** can be viewed in the *message* field.

  - `errorList.errorPictureList.message` (string)
    Text description corresponding to the status code, explaining the operation result or error cause to users.

  - `errorList.code` (integer)
    A numeric status identifier indicating the result of the interface call, used to determine whether the operation executed successfully. **A code value of 0** indicates that **the request was executed successfully**. **Any non-zero code value** indicates that **request execution failed**. **Specific error details** can be viewed in the *message* field.

  - `errorList.message` (string)
    Text description corresponding to the status code, explaining the operation result or error cause to users.

