This endpoint enables menu synchronization for stores on Keeta. The system performs full-menu updates based on the provided data, implementing entity matching through the openItemCode field.
Rate Limiting App-level throttling: QPS ≤ 50
Notes
- Entity Matching Logic The system identifies entities as follows:
- Update: When matching openItemCode values exist in the store's current menu
- Addition: When no matching openItemCode values are found
- Deletion: All existing entities with openItemCode values not present in the request
2. Execution Semantics A successful response only confirms successful submission of the synchronization task. Certain items may still fail during processing due to validation rules, requiring manual verification and resubmission by the caller.
3. Image Handling The endpoints supports standard HTTP/HTTPS (ports 80/443) external image URLs, which must comply with platform specifications regarding size, format, and accessibility.
4. Validation Requirements:
| Type | Requirements |
|---|---|
| Category | - The openItemCode field is mandatory and must maintain uniqueness across entities - Each store cannot exceed 100 menu categories - Category names must be unique within a single store - Only one mandatory category is permitted per store - Categories become hidden when all contained products are delisted, and are repositioned when products become temporarily unavailable |
| Choicegroup | - The openItemCode field is mandatory with entity-level uniqueness - Maximum 2,000 option groups per store - Maximum 10,000 options per store - Use the relatedSpuOpenItemCode to explicitly bind the ChoiceGroupSku to an existing SPU entity - Use the relatedSkuOpenItemCode to explicitly bind the ChoiceGroupSku to an existing SKU entity. When the ChoiceGroupSku binds to a SKU, it will use the bounded SKU''s ChoiceGroups to form a multi-layer ChoiceGroup structure. - When both relatedSkuOpenItemCode and relatedSpuOpenItemCode are declared, there will be a association check to ensure the SKU belongs to the declared SPU. - If both relatedSpuOpenItemCode and relatedSkuOpenItemCode are not specified, automatic binding occurs when the ChoiceGroupSku name matches a SPU name, enabling coordinated SPUs and ChoiceGroupSku status management (Note: If multiple SPUs share identical names, the system randomly selects one for binding, which may lead to unintended synchronization.) - External image URLs are supported in the pictureList field |
| Product (SPU) | - The openItemCode field is mandatory with entity-level uniqueness - Maximum 2,000 SPUs per store - Maximum 15 featured products per store - Tobacco/alcohol products must have corresponding attributes marked as "Yes" - External image URLs are supported in the pictureList field - Time-limited availability slots cannot overlap and are limited to 30 time periods - The shopCategoryOpenItemCodeList request should include the menu category openItemCode which exists in the specific store - The choiceGroupOpenItemCodeList request should include the choicegroup openItemCode which exists in the specific store |
| Product Sorting | - Optional field that defaults to upload sequence when empty - Requires complete sorting data for all products across all categories when provided |
Please send all the menu category info of the specific store to this field.
Please send all the choicegroup info of the specific store to this field.
Please send all the SPU info of the specific store to this field.
This field allows developers to set product sorting within menu categories. When the value equals null, product sorting follows Keeta's default sorting.
Data Structure:
- Key: Menu category's OpenItemCode
- Value: Array of SPU OpenItemCodes in desired display order
Merchants can specify exact product order by listing SPU OpenItemCodes in the desired sequence for each category. The specified order updates the in-app display, showcasing products in the defined arrangement.
{ "shopCategoryOpenItemCode1": [ "spuOpenItemCode1", "spuOpenItemCode2" ], "shopCategoryOpenItemCode2": [ "spuOpenItemCode1", "spuOpenItemCode3" ] }
- https://open.mykeeta.com/api/openhttps://open.mykeeta.com/api/open/product/menu/sync
curl -i -X POST \
https://open.mykeeta.com/api/open/product/menu/sync \
-H 'Content-Type: application/json' \
-d '{
"shopCategoryList": [
{
"nameTranslation": "開心樂園餐",
"descriptionTranslation": "開心樂園餐描述",
"description": "Happy Meal description",
"type": 0,
"descSourceLanguageType": "en",
"sourceLanguageType": "en",
"descriptionTranslateType": 1,
"openItemCode": "SHOP_CATEGORY#10001",
"availableTime": {
"code": 0,
"values": [
"00:00-05:59, 11:00-23:45",
"11:00-23:45",
"11:00-23:45",
"11:00-23:45",
"11:00-23:45",
"11:00-23:45",
"11:00-23:45"
],
"available": [
{
"endTimestamp": 1736956799000,
"startTimestamp": 1735660800000
}
]
},
"targetLanguageType": "zh-HK",
"descTargetLanguageType": "zh-HK",
"name": "Happy Meal",
"id": 12345,
"nameTranslateType": 1
}
],
"spuList": [
{
"nameTranslation": "辣雞腿漢堡",
"skuList": [
{
"pickPrice": "28.0",
"nutritionalInfo": {
"property2": 0,
"property1": 0
},
"specTranslateType": "1",
"specTranslation": "大份",
"choiceGroupList": [],
"spec": "Large",
"sourceLanguageType": "en",
"allergens": [
"string"
],
"openItemCode": "SKU#10001",
"choiceGroupOpenItemCodeList": [
"GROUP#10001"
],
"targetLanguageType": "zh-HK",
"price": "28.0",
"canteenPrice": "28.0",
"currency": "HKD",
"id": 12345
}
],
"shopCategoryList": [],
"propertyList": [
{
"propertyName": "",
"propertyType": 1,
"customizable": 0,
"propertyValueList": [
{
"valueId": 9999,
"valueName": ""
}
],
"maxValueNumber": 0,
"minValueNumber": 0,
"propertyId": 9999
}
],
"descriptionTranslation": "辣雞腿漢堡描述",
"description": "Spicy Chicken Burger description",
"userGetModeList": [
"delivery",
"pickup"
],
"descSourceLanguageType": "en",
"isSpecialty": 0,
"sourceLanguageType": "en",
"descriptionTranslateType": 1,
"availableTime": {
"code": 0,
"values": [
"00:00-05:59, 11:00-23:45",
"11:00-23:45",
"11:00-23:45",
"11:00-23:45",
"11:00-23:45",
"11:00-23:45",
"11:00-23:45"
],
"available": [
{
"endTimestamp": 1736956799000,
"startTimestamp": 1735660800000
}
]
},
"openItemCode": "SPU#10001",
"targetLanguageType": "zh-HK",
"descTargetLanguageType": "zh-HK",
"name": "Spicy Chicken Burger",
"shopCategoryOpenItemCodeList": [
"SHOP_CATEGORY#10001"
],
"id": 12345,
"pictureList": [
{
"url": "string"
}
],
"nameTranslateType": 1,
"status": 1
},
{
"nameTranslation": "漢堡套餐",
"skuList": [
{
"pickPrice": "15.0",
"nutritionalInfo": {
"property2": 0,
"property1": 0
},
"specTranslateType": "1",
"specTranslation": "中份",
"choiceGroupList": [],
"spec": "Regular",
"sourceLanguageType": "en",
"allergens": [
"string"
],
"openItemCode": "SKU#10002",
"choiceGroupOpenItemCodeList": [
"GROUP#10002"
],
"targetLanguageType": "zh-HK",
"price": "15.0",
"canteenPrice": "15.0",
"currency": "HKD",
"id": 12345
}
],
"shopCategoryList": [],
"propertyList": [
{
"propertyName": "",
"propertyType": 1,
"customizable": 0,
"propertyValueList": [
{
"valueId": 9999,
"valueName": ""
}
],
"maxValueNumber": 0,
"minValueNumber": 0,
"propertyId": 9999
}
],
"descriptionTranslation": "漢堡套餐",
"description": "Burger Meal description",
"userGetModeList": [
"delivery",
"pickup"
],
"descSourceLanguageType": "en",
"isSpecialty": 0,
"sourceLanguageType": "en",
"descriptionTranslateType": 1,
"availableTime": {
"code": 0,
"values": [
"00:00-05:59, 11:00-23:45",
"11:00-23:45",
"11:00-23:45",
"11:00-23:45",
"11:00-23:45",
"11:00-23:45",
"11:00-23:45"
],
"available": [
{
"endTimestamp": 1736956799000,
"startTimestamp": 1735660800000
}
]
},
"openItemCode": "SPU#10002",
"targetLanguageType": "zh-HK",
"descTargetLanguageType": "zh-HK",
"name": "Burger Meal",
"shopCategoryOpenItemCodeList": [
"SHOP_CATEGORY#10001"
],
"id": 12345,
"pictureList": [
{
"url": "string"
}
],
"nameTranslateType": 1,
"status": 1
}
],
"spuSequenceCodeMap": {
"shopCategoryOpenItemCode2": [
"spuOpenItemCode1",
"spuOpenItemCode3"
],
"shopCategoryOpenItemCode1": [
"spuOpenItemCode1",
"spuOpenItemCode2"
]
},
"choiceGroupList": [
{
"nameTranslation": "選擇醬料",
"minNumber": 0,
"openItemCode": "GROUP#10001",
"targetLanguageType": "zh-HK",
"maxNumber": 3,
"repeatable": 0,
"name": "Sauces",
"id": 0,
"choiceGroupSkuList": [
{
"pickPrice": "12.33",
"nutritionalInfo": {
"property2": 0,
"property1": 0
},
"nameTranslation": "番茄醬",
"sourceLanguageType": "en",
"allergens": [
"string"
],
"openItemCode": "CHOICE#10001",
"targetLanguageType": "zh-HK",
"price": "12.33",
"canteenPrice": "12.33",
"name": "Ketchup",
"currency": "HKD",
"id": 0,
"nameTranslateType": 1,
"status": 1
}
],
"sourceLanguageType": "en",
"nameTranslateType": 1
},
{
"nameTranslation": "選擇漢堡",
"minNumber": 1,
"openItemCode": "GROUP#10002",
"targetLanguageType": "zh-HK",
"maxNumber": 1,
"repeatable": 0,
"name": "Choose a Burger",
"id": 0,
"choiceGroupSkuList": [
{
"pickPrice": "10.00",
"nutritionalInfo": {
"property2": 0,
"property1": 0
},
"nameTranslation": "辣雞腿漢堡",
"relatedSkuOpenItemCode": "SKU#10001",
"sourceLanguageType": "en",
"allergens": [
"string"
],
"openItemCode": "CHOICE#10002",
"targetLanguageType": "zh-HK",
"price": "10.00",
"canteenPrice": "10.00",
"name": "Spicy Chicken Burger",
"currency": "HKD",
"id": 0,
"nameTranslateType": 1,
"status": 1
}
],
"sourceLanguageType": "en",
"nameTranslateType": 1
}
],
"shopId": 12345
}'Request executed successfully
A numeric status identifier indicating the result of the interface call, used to determine whether the operation executed successfully.
| Enum Value | Description |
|---|---|
| 0 | The request was executed successfully. |
| Non-zero value | The request execution failed. Specific error details can be viewed in the message field. |
Text description corresponding to the status code, explaining the operation result or error cause to users.
When interacting with Keeta's platform for actions that require asynchronous processing, such as complex data operations or system integrations, the platform will initiate a task that may not complete immediately upon request submission. Instead of providing immediate completion confirmation, Keeta's system generates a taskId, which serves as a unique identifier for that specific task in the internal execution system.
{ "code": 0, "message": "Success", "data": 0 }