Fetch the menu tree (store-level or business-level)
Returns a 4-level menu tree (sections → categories → items → modifier groups → modifiers) scoped to your credential’s business. Two modes, selected by whether you supply the store coordinates:
Store-level (brand_id + branch_id both present)
Returns the per-store snapshot served from the cached
store_full_menus blob. Reflects every per-store override
written via zoneStores plus the latest
publishMenu. This is the same
payload klikit ships to aggregator marketplaces.
The envelope is data.menu.branchInfo + data.menu.sections[].
Each section / category / item carries fields like
isAvailable, stockEnabled, attachedWithStore derived
from the store’s overrides.
Business-level (brand_id and branch_id both omitted)
Returns the business-level tree with no store overrides applied —
the raw shape sitting in the sections / categories / items / modifier_groups tables before any store has populated.
partner-api assembles this on the fly by walking the four list endpoints in parallel and joining them client-side, so the payload is a superset of what those endpoints return:
listSectionsfor the top of the tree (each section carrieslinkedCategories[]ids).listCategoriessupplies the category records.listItemssupplies items (top-level- modifier options — modifier options are items with
onlyModifier: true).
- modifier options — modifier options are items with
listModifierGroupssupplies the MG records.
The envelope is data.menu.businessInfo + data.menu.sections[].
Store-specific fields (isAvailable, attachedWithStore, …)
are absent because there’s no store context.
Errors
- Passing only one of
brand_id/branch_idreturns400 request_invalid. Either both together (store mode) or neither (business mode). - Store-mode 404 when
(brand_id, branch_id)doesn’t resolve to one of your business’s stores.
Both modes use the same menus:read scope.
Authorizations
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 of the target store. Required when branch_id is
also passed. Omit (along with branch_id) to read the
business-level tree.
x >= 1Branch id of the target store. Required when brand_id is
also passed. Omit (along with brand_id) to read the
business-level tree.
x >= 1Optional IANA timezone used to compute availability flags.
"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 modifiersOn 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.
"req_4d1b7e3f-..."
Endpoint-specific payload on success.
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:
| Code | HTTP | Meaning |
|---|---|---|
auth_missing | 401 | Authorization header absent / malformed |
auth_invalid_credential | 401 | partner_key or secret_key did not verify |
auth_revoked | 403 | Credential is revoked |
auth_forbidden | 403 | Credential not authorized for the requested scope |
request_invalid | 400 | Body / query parameters failed validation |
request_missing_idempotency_key | 400 | Write endpoint called without Idempotency-Key |
request_invalid_range | 400 | Date range > 90 days |
resource_not_found | 404 | Order / store / mapping does not exist |
resource_unmapped | 404 | Stock / availability call referenced an unknown SKU |
state_invalid_transition | 409 | Order PATCH not allowed by current state |
state_idempotency_conflict | 409 | Same Idempotency-Key reused with a different body |
rate_limit_exceeded | 429 | Per-credential rate cap hit |
downstream_unavailable | 502 | An internal klikit dependency is unreachable |