Skip to main content
GET
/
v1
/
partner
/
menus
Fetch the menu tree (store-level or business-level)
curl --request GET \
  --url https://api.dev.shadowchef.co/v1/partner/menus \
  --header 'Authorization: Basic <encoded-value>'
{
  "request_id": "0af0f90815518ac157c838fd0e07ed5a",
  "data": {
    "menu": {
      "branchInfo": {
        "branchID": 1293,
        "brandID": 5297,
        "businessID": 398,
        "countryID": 4,
        "currencyCode": "IDR",
        "currencyID": 4,
        "currencySymbol": "",
        "languageCode": "id",
        "providerIDs": "1,6,9,11,16,17"
      },
      "sections": [
        {
          "id": 6825,
          "sequence": 1,
          "title": {
            "en": "Cimol Bojot AA Master Menu"
          },
          "description": {},
          "enabled": true,
          "image": "",
          "isMealForOne": false,
          "visibilities": {
            "1": true
          },
          "availableTimes": {
            "0": {
              "disabled": false,
              "slots": [
                {
                  "startTime": 0,
                  "endTime": 2359
                }
              ]
            },
            "1": {
              "disabled": false,
              "slots": [
                {
                  "startTime": 0,
                  "endTime": 2359
                }
              ]
            },
            "2": {
              "disabled": false,
              "slots": [
                {
                  "startTime": 0,
                  "endTime": 2359
                }
              ]
            },
            "3": {
              "disabled": false,
              "slots": [
                {
                  "startTime": 0,
                  "endTime": 2359
                }
              ]
            },
            "4": {
              "disabled": false,
              "slots": [
                {
                  "startTime": 0,
                  "endTime": 2359
                }
              ]
            },
            "5": {
              "disabled": false,
              "slots": [
                {
                  "startTime": 0,
                  "endTime": 2359
                }
              ]
            },
            "6": {
              "disabled": false,
              "slots": [
                {
                  "startTime": 0,
                  "endTime": 2359
                }
              ]
            }
          },
          "blackoutDates": null,
          "categories": [
            {
              "id": 39114,
              "sequence": 1,
              "title": {
                "en": "Cimol Bundling"
              },
              "description": {},
              "enabled": true,
              "alcBeverages": false,
              "blackoutDates": null,
              "consentMessage": {},
              "isAgeRestricted": false,
              "isGrabMealForOne": false,
              "isHalal": false,
              "isIdVerificationRequired": false,
              "isMealForOne": false,
              "visibilities": {
                "1": true
              },
              "items": [
                {
                  "id": 289370,
                  "sequence": 1,
                  "title": {
                    "en": "Cimol Bundling 1"
                  },
                  "description": {
                    "en": "Paket Bundling: - Cimol Bojot Porsi Kecil Isi ±100 Gram - Cimol Mozzarella Porsi Besar Isi 16 Pcs atau Cimol Ayam/Beef Porsi Besar Isi 14 Pcs"
                  },
                  "enabled": true,
                  "itemIsEnabled": true,
                  "isGrabMealForOne": false,
                  "isHalal": false,
                  "maxQuantityPerDay": 1,
                  "preparationTime": 0,
                  "skuID": "",
                  "stockEnabled": false,
                  "yieldCount": 1,
                  "vat": 0,
                  "allergenIDs": null,
                  "allergens": null,
                  "blackoutDates": null,
                  "groups": [],
                  "itemVisibilities": {
                    "1": true
                  },
                  "visibilities": {
                    "1": true
                  },
                  "oos": {
                    "available": true,
                    "snooze": null
                  },
                  "prices": {
                    "1": {
                      "IDR": {
                        "price": 25000,
                        "takeAwayPrice": 25000
                      }
                    }
                  },
                  "resources": []
                }
              ]
            }
          ]
        }
      ]
    }
  }
}

Authorizations

Authorization
string
header
required

Authorization: Basic base64(partner_key:secret_key).

Credentials are issued by a klikit operator. The plaintext secret_key is shown once at issuance and cannot be retrieved later — store it securely. If lost, ask your operator to rotate the secret to receive a new one. The old secret stops working immediately on rotation; there is no overlap window.

Query Parameters

brand_id
integer

Brand id of the target store. Required when branch_id is also passed. Omit (along with branch_id) to read the business-level tree.

Required range: x >= 1
branch_id
integer

Branch id of the target store. Required when brand_id is also passed. Omit (along with brand_id) to read the business-level tree.

Required range: x >= 1
tz
string

Optional IANA timezone used to compute availability flags.

Example:

"Asia/Singapore"

Response

Menu tree. The example below is one section / one category / one item sliced verbatim from a prod store-mode response (brand 5297, branch 1293). Business-mode responses share the same shape and key names but with a much larger tree (no trimming applied server-side); the full payload weighs in at several MB on real businesses, so partners should expect to stream-parse if pulling business mode.

The data.menu payload is a recursive tree:

menu
├── branchInfo store-level metadata (currency, language)
└── sections[]
└── categories[]
└── items[]
└── groups[] modifier GROUPS (e.g. "Size")
└── modifiers[] modifier OPTIONS (e.g. "Large")
└── groups[] nested groups, for stacked modifiers

On the wire the modifier-group key is groups; modifier options are under modifiers. A modifier (option) carries the same shape as a regular item — id, title, price, visibilities, image, plus its own groups array, so combos like pizza → size → toppings nest naturally. Map your SKUs to the id you see at each level.

Most fields are language maps keyed by locale code ({"en": "...", "id": "..."}) so the same payload serves multiple storefronts.

request_id
string
required
Example:

"req_4d1b7e3f-..."

data
object

Endpoint-specific payload on success.

error
object

Machine-readable error code + human message. The code is stable across releases — switch on code in your client code rather than parsing the message text.

Common codes you will encounter as a partner:

CodeHTTPMeaning
auth_missing401Authorization header absent / malformed
auth_invalid_credential401partner_key or secret_key did not verify
auth_revoked403Credential is revoked
auth_forbidden403Credential not authorized for the requested scope
request_invalid400Body / query parameters failed validation
request_missing_idempotency_key400Write endpoint called without Idempotency-Key
request_invalid_range400Date range > 90 days
resource_not_found404Order / store / mapping does not exist
resource_unmapped404Stock / availability call referenced an unknown SKU
state_invalid_transition409Order PATCH not allowed by current state
state_idempotency_conflict409Same Idempotency-Key reused with a different body
rate_limit_exceeded429Per-credential rate cap hit
downstream_unavailable502An internal klikit dependency is unreachable