{"templateId":"markdown","versions":[{"version":"opendelivery","label":"Open Delivery API","link":"/apis/opendelivery/docs/changelog","default":true,"active":false,"folderId":"58c9a61d"},{"version":"standard","label":"Standard Keeta API","link":"/apis/standard/docs/changelog","default":false,"active":true,"folderId":"58c9a61d"}],"sharedDataIds":{"sidebar":"sidebar-apis/@standard/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Release Notes","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"release-notes","__idx":0},"children":["Release Notes"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This document tracks notable updates to the Keeta Open Platform APIs and documentation. It is not intended to be a comprehensive list of all changes."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"added-store-status-now-differentiates-delivery-and-pickup-services","__idx":1},"children":["[Added] Store Status Now Differentiates Delivery and Pickup Services"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["June 23, 2026"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Store status management has been enhanced to support independent tracking of delivery and pickup service availability. Previously, the store status only reflected a single overall operational state. Now, each service line has its own status, enabling more granular visibility into a store's operations."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Get Store Details"]}," now returns two additional fields:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["deliveryRestStatus"]},": indicates whether the store's delivery service is available, unavailable, or not enabled."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pickupRestStatus"]},": indicates whether the store's pickup (self-collection) service is available, unavailable, or not enabled."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The existing overall ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]}," field remains and is now derived from the combination of these sub-statuses: the store is considered Open when either service is available, and Closed only when both are unavailable."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Store Status Update Notification"]}," (Event ID: 1102) now includes four additional fields in the webhook payload:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fromDeliveryRestStatus"]}," / ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["toDeliveryRestStatus"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fromPickupRestStatus"]}," / ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["toPickupRestStatus"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The webhook fires whenever any sub-status changes, even if the overall store status does not."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Suspend Store"]}," and ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Reactivate Store"]}," continue to operate on the store as a whole, suspending or restoring both delivery and pickup simultaneously. During a platform-managed override (e.g., severe weather), the Reactivate endpoint cannot restore a service that the platform has suspended. See the Store Status Management guide for details on platform override behavior."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A new ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Store Status Management"]}," guide has been published to help developers understand how delivery and pickup statuses interact, how platform overrides work."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://api-docs.mykeeta.com/apis/standard/shop/endpoints/getstoredetails"},"children":["Get Store Details"]}," · ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://api-docs.mykeeta.com/apis/standard/shop/endpoints/suspendstore"},"children":["Suspend Store"]}," · ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://api-docs.mykeeta.com/apis/standard/shop/endpoints/reactivatestore"},"children":["Reactivate Store"]}," · ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://api-docs.mykeeta.com/apis/standard/shop/webhooks/storestatusupdatenotification"},"children":["Store Status Update Notification"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"new-cash-on-delivery-cod-support","__idx":2},"children":["[New] Cash on Delivery (COD) Support"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["January 04, 2026"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Keeta now supports Cash on Delivery (COD) orders. The following updates have been made across the Order API and Webhooks:"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Get Order Details"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payType"]}," field to indicate the payment method. When ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payType"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Cash"]},", the order is a COD order."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payTypeDesc"]}," field as the description of the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payType"]}," field."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Updated the description of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]}," enum value ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["10"]}," (Order Submitted): removed \"and paid for\" to accommodate unpaid COD orders at the time of submission."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Cancel Order"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added error code ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["2090001015"]},": COD orders do not support partial refunds by the merchant."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added error code ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["2090001016"]},": COD orders do not support merchant cancellation after the rider has picked up the order."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Order Webhooks"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payType"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payTypeDesc"]}," fields to the Order Placed Notification webhook payload."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://api-docs.mykeeta.com/apis/standard/order/endpoints/getorderdetails"},"children":["Get Order Details"]}," · ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://api-docs.mykeeta.com/apis/standard/order/endpoints/cancelorder"},"children":["Cancel Order"]}," · ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://api-docs.mykeeta.com/apis/standard/order/webhooks/orderplacednotification"},"children":["Order Placed Notification"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"new-nested-choicegroups-for-non-listed-modifiers","__idx":3},"children":["[New] Nested ChoiceGroups for Non-listed Modifiers"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["September 29, 2025"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The OpenItemCode-Based Menu Synchronization API now supports multi-layer ChoiceGroups for modifiers (ChoiceGroupSku) that are not sold separately on the menu."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Previously, multi-layer ChoiceGroups could only be built by binding a ChoiceGroupSku to an existing SKU via the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["relatedSkuOpenItemCode"]}," field. This required the modifier to also be a listed item on the menu."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A new field ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["choiceGroupOpenItemCodeList"]}," (Array of strings) has been added under ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["choiceGroupList[].choiceGroupSkuList[]"]},", allowing a second layer of ChoiceGroups to be attached directly to non-listed ChoiceGroupSku entities. The ChoiceGroupSku must not share the same name as any other SPU on the menu."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["See OpenItemCode-Based Menu Sync API · ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://api-docs.mykeeta.com/apis/standard/docs/menuintegrationguide"},"children":["Menu API Integration Guide"]}]}]},"headings":[{"value":"Release Notes","id":"release-notes","depth":1},{"value":"[Added] Store Status Now Differentiates Delivery and Pickup Services","id":"added-store-status-now-differentiates-delivery-and-pickup-services","depth":2},{"value":"[New] Cash on Delivery (COD) Support","id":"new-cash-on-delivery-cod-support","depth":2},{"value":"[New] Nested ChoiceGroups for Non-listed Modifiers","id":"new-nested-choicegroups-for-non-listed-modifiers","depth":2}],"frontmatter":{"seo":{"title":"Release Notes"}},"lastModified":"2026-06-25T13:52:17.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/apis/standard/docs/changelog","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}