curl --request POST \
--url https://api.dev.shadowchef.co/v1/partner/menus/sections \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"title": {
"en": "All Day Menu",
"id": "Menu Sepanjang Hari"
},
"description": {
"en": "Available 09:00 – 22:00"
},
"isEnabled": true,
"sequence": 1,
"visibilities": {
"1": true
},
"availableTimes": {
"0": {
"disabled": false,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"1": {
"disabled": false,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"2": {
"disabled": false,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"3": {
"disabled": false,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"4": {
"disabled": false,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"5": {
"disabled": false,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"6": {
"disabled": false,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
}
},
"fromAPI": true
}
'const url = 'https://api.dev.shadowchef.co/v1/partner/menus/sections';
const options = {
method: 'POST',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: {en: 'All Day Menu', id: 'Menu Sepanjang Hari'},
description: {en: 'Available 09:00 – 22:00'},
isEnabled: true,
sequence: 1,
visibilities: {'1': true},
availableTimes: {
'0': {disabled: false, slots: [{startTime: 900, endTime: 2200}]},
'1': {disabled: false, slots: [{startTime: 900, endTime: 2200}]},
'2': {disabled: false, slots: [{startTime: 900, endTime: 2200}]},
'3': {disabled: false, slots: [{startTime: 900, endTime: 2200}]},
'4': {disabled: false, slots: [{startTime: 900, endTime: 2200}]},
'5': {disabled: false, slots: [{startTime: 900, endTime: 2200}]},
'6': {disabled: false, slots: [{startTime: 900, endTime: 2200}]}
},
fromAPI: true
})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));import requests
url = "https://api.dev.shadowchef.co/v1/partner/menus/sections"
payload = {
"title": {
"en": "All Day Menu",
"id": "Menu Sepanjang Hari"
},
"description": { "en": "Available 09:00 – 22:00" },
"isEnabled": True,
"sequence": 1,
"visibilities": { "1": True },
"availableTimes": {
"0": {
"disabled": False,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"1": {
"disabled": False,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"2": {
"disabled": False,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"3": {
"disabled": False,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"4": {
"disabled": False,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"5": {
"disabled": False,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"6": {
"disabled": False,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
}
},
"fromAPI": True
}
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.dev.shadowchef.co/v1/partner/menus/sections"
payload := strings.NewReader("{\n \"title\": {\n \"en\": \"All Day Menu\",\n \"id\": \"Menu Sepanjang Hari\"\n },\n \"description\": {\n \"en\": \"Available 09:00 – 22:00\"\n },\n \"isEnabled\": true,\n \"sequence\": 1,\n \"visibilities\": {\n \"1\": true\n },\n \"availableTimes\": {\n \"0\": {\n \"disabled\": false,\n \"slots\": [\n {\n \"startTime\": 900,\n \"endTime\": 2200\n }\n ]\n },\n \"1\": {\n \"disabled\": false,\n \"slots\": [\n {\n \"startTime\": 900,\n \"endTime\": 2200\n }\n ]\n },\n \"2\": {\n \"disabled\": false,\n \"slots\": [\n {\n \"startTime\": 900,\n \"endTime\": 2200\n }\n ]\n },\n \"3\": {\n \"disabled\": false,\n \"slots\": [\n {\n \"startTime\": 900,\n \"endTime\": 2200\n }\n ]\n },\n \"4\": {\n \"disabled\": false,\n \"slots\": [\n {\n \"startTime\": 900,\n \"endTime\": 2200\n }\n ]\n },\n \"5\": {\n \"disabled\": false,\n \"slots\": [\n {\n \"startTime\": 900,\n \"endTime\": 2200\n }\n ]\n },\n \"6\": {\n \"disabled\": false,\n \"slots\": [\n {\n \"startTime\": 900,\n \"endTime\": 2200\n }\n ]\n }\n },\n \"fromAPI\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Basic <encoded-value>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.dev.shadowchef.co/v1/partner/menus/sections",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'title' => [
'en' => 'All Day Menu',
'id' => 'Menu Sepanjang Hari'
],
'description' => [
'en' => 'Available 09:00 – 22:00'
],
'isEnabled' => true,
'sequence' => 1,
'visibilities' => [
'1' => true
],
'availableTimes' => [
'0' => [
'disabled' => false,
'slots' => [
[
'startTime' => 900,
'endTime' => 2200
]
]
],
'1' => [
'disabled' => false,
'slots' => [
[
'startTime' => 900,
'endTime' => 2200
]
]
],
'2' => [
'disabled' => false,
'slots' => [
[
'startTime' => 900,
'endTime' => 2200
]
]
],
'3' => [
'disabled' => false,
'slots' => [
[
'startTime' => 900,
'endTime' => 2200
]
]
],
'4' => [
'disabled' => false,
'slots' => [
[
'startTime' => 900,
'endTime' => 2200
]
]
],
'5' => [
'disabled' => false,
'slots' => [
[
'startTime' => 900,
'endTime' => 2200
]
]
],
'6' => [
'disabled' => false,
'slots' => [
[
'startTime' => 900,
'endTime' => 2200
]
]
]
],
'fromAPI' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"request_id": "req_4d1b7e3f-1f06-4d3c-a14f-9c0b9f8a3e2c",
"data": {
"id": 1022
}
}{
"request_id": "req_4d1b7e3f-...",
"data": "<unknown>",
"error": {
"code": "request_invalid",
"message": "<string>",
"details": "<unknown>"
}
}Create a section
Adds a new section to your business menu. Sections sit at the
top of the menu tree; categories (created separately) get
attached to a section via linkCategoryToSection.
businessID is injected from your credential; any value you
send in the body is replaced. New entities ship with
fromAPI: true so the admin UI can mark them as
partner-originated.
On success the response carries the new section’s numeric id
at data.id — capture it for the link step.
curl --request POST \
--url https://api.dev.shadowchef.co/v1/partner/menus/sections \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"title": {
"en": "All Day Menu",
"id": "Menu Sepanjang Hari"
},
"description": {
"en": "Available 09:00 – 22:00"
},
"isEnabled": true,
"sequence": 1,
"visibilities": {
"1": true
},
"availableTimes": {
"0": {
"disabled": false,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"1": {
"disabled": false,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"2": {
"disabled": false,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"3": {
"disabled": false,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"4": {
"disabled": false,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"5": {
"disabled": false,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"6": {
"disabled": false,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
}
},
"fromAPI": true
}
'const url = 'https://api.dev.shadowchef.co/v1/partner/menus/sections';
const options = {
method: 'POST',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: {en: 'All Day Menu', id: 'Menu Sepanjang Hari'},
description: {en: 'Available 09:00 – 22:00'},
isEnabled: true,
sequence: 1,
visibilities: {'1': true},
availableTimes: {
'0': {disabled: false, slots: [{startTime: 900, endTime: 2200}]},
'1': {disabled: false, slots: [{startTime: 900, endTime: 2200}]},
'2': {disabled: false, slots: [{startTime: 900, endTime: 2200}]},
'3': {disabled: false, slots: [{startTime: 900, endTime: 2200}]},
'4': {disabled: false, slots: [{startTime: 900, endTime: 2200}]},
'5': {disabled: false, slots: [{startTime: 900, endTime: 2200}]},
'6': {disabled: false, slots: [{startTime: 900, endTime: 2200}]}
},
fromAPI: true
})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));import requests
url = "https://api.dev.shadowchef.co/v1/partner/menus/sections"
payload = {
"title": {
"en": "All Day Menu",
"id": "Menu Sepanjang Hari"
},
"description": { "en": "Available 09:00 – 22:00" },
"isEnabled": True,
"sequence": 1,
"visibilities": { "1": True },
"availableTimes": {
"0": {
"disabled": False,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"1": {
"disabled": False,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"2": {
"disabled": False,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"3": {
"disabled": False,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"4": {
"disabled": False,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"5": {
"disabled": False,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
},
"6": {
"disabled": False,
"slots": [
{
"startTime": 900,
"endTime": 2200
}
]
}
},
"fromAPI": True
}
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.dev.shadowchef.co/v1/partner/menus/sections"
payload := strings.NewReader("{\n \"title\": {\n \"en\": \"All Day Menu\",\n \"id\": \"Menu Sepanjang Hari\"\n },\n \"description\": {\n \"en\": \"Available 09:00 – 22:00\"\n },\n \"isEnabled\": true,\n \"sequence\": 1,\n \"visibilities\": {\n \"1\": true\n },\n \"availableTimes\": {\n \"0\": {\n \"disabled\": false,\n \"slots\": [\n {\n \"startTime\": 900,\n \"endTime\": 2200\n }\n ]\n },\n \"1\": {\n \"disabled\": false,\n \"slots\": [\n {\n \"startTime\": 900,\n \"endTime\": 2200\n }\n ]\n },\n \"2\": {\n \"disabled\": false,\n \"slots\": [\n {\n \"startTime\": 900,\n \"endTime\": 2200\n }\n ]\n },\n \"3\": {\n \"disabled\": false,\n \"slots\": [\n {\n \"startTime\": 900,\n \"endTime\": 2200\n }\n ]\n },\n \"4\": {\n \"disabled\": false,\n \"slots\": [\n {\n \"startTime\": 900,\n \"endTime\": 2200\n }\n ]\n },\n \"5\": {\n \"disabled\": false,\n \"slots\": [\n {\n \"startTime\": 900,\n \"endTime\": 2200\n }\n ]\n },\n \"6\": {\n \"disabled\": false,\n \"slots\": [\n {\n \"startTime\": 900,\n \"endTime\": 2200\n }\n ]\n }\n },\n \"fromAPI\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Basic <encoded-value>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.dev.shadowchef.co/v1/partner/menus/sections",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'title' => [
'en' => 'All Day Menu',
'id' => 'Menu Sepanjang Hari'
],
'description' => [
'en' => 'Available 09:00 – 22:00'
],
'isEnabled' => true,
'sequence' => 1,
'visibilities' => [
'1' => true
],
'availableTimes' => [
'0' => [
'disabled' => false,
'slots' => [
[
'startTime' => 900,
'endTime' => 2200
]
]
],
'1' => [
'disabled' => false,
'slots' => [
[
'startTime' => 900,
'endTime' => 2200
]
]
],
'2' => [
'disabled' => false,
'slots' => [
[
'startTime' => 900,
'endTime' => 2200
]
]
],
'3' => [
'disabled' => false,
'slots' => [
[
'startTime' => 900,
'endTime' => 2200
]
]
],
'4' => [
'disabled' => false,
'slots' => [
[
'startTime' => 900,
'endTime' => 2200
]
]
],
'5' => [
'disabled' => false,
'slots' => [
[
'startTime' => 900,
'endTime' => 2200
]
]
],
'6' => [
'disabled' => false,
'slots' => [
[
'startTime' => 900,
'endTime' => 2200
]
]
]
],
'fromAPI' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"request_id": "req_4d1b7e3f-1f06-4d3c-a14f-9c0b9f8a3e2c",
"data": {
"id": 1022
}
}{
"request_id": "req_4d1b7e3f-...",
"data": "<unknown>",
"error": {
"code": "request_invalid",
"message": "<string>",
"details": "<unknown>"
}
}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.
Body
Locale-keyed text. Keys are ISO 639-1 codes (en, id, ja, ...).
Use whichever key matches your storefront; klikit ships a value
for every locale your business is configured for.
Show child attributes
Show child attributes
{ "en": "Margherita", "id": "Margherita" }
Weekly schedule keyed by weekday number as a string:
"0" = Sunday … "6" = Saturday. Every day must have at least
one slot. To make a section dark for a day, set
disabled: true and pass any placeholder slot (the disabled
flag wins).
Show child attributes
Show child attributes
{
"0": {
"disabled": false,
"slots": [{ "startTime": 900, "endTime": 2200 }]
},
"1": {
"disabled": false,
"slots": [{ "startTime": 900, "endTime": 2200 }]
},
"2": {
"disabled": false,
"slots": [{ "startTime": 900, "endTime": 2200 }]
},
"3": {
"disabled": false,
"slots": [{ "startTime": 900, "endTime": 2200 }]
},
"4": {
"disabled": false,
"slots": [{ "startTime": 900, "endTime": 2200 }]
},
"5": {
"disabled": false,
"slots": [{ "startTime": 1000, "endTime": 2300 }]
},
"6": {
"disabled": false,
"slots": [{ "startTime": 1000, "endTime": 2300 }]
}
}
Per-provider visibility flag. Keys are provider ids (as strings)
from GET /v1/partner/providers. Set a provider's value to
true to publish on that channel. Providers absent from the map
default to hidden.
Klikit's own marketplace is provider id "1".
Show child attributes
Show child attributes
{ "1": true, "6": true }
Locale-keyed text. Keys are ISO 639-1 codes (en, id, ja, ...).
Use whichever key matches your storefront; klikit ships a value
for every locale your business is configured for.
Show child attributes
Show child attributes
{ "en": "Margherita", "id": "Margherita" }
Display order within the menu. Lower numbers come first.
For "Meal for One" sections
Mark records originating from the partner API. Always true for partner-created entities.
Response
Section created. data.id is the section id.
Canonical response wrapper. Every response — success or error —
carries the request_id so you can quote one id to klikit
support to correlate a request end-to-end.
"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 |
Show child attributes
Show child attributes