> This page is for Developer.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.bigcommerce.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.bigcommerce.com/_mcp/server.

# Create Channel Menus

POST https://api.bigcommerce.com/stores/{store_hash}/v3/channels/{channel_id}/channel-menus
Content-Type: application/json

Creates or replaces the list of control panel side navigation menus for a channel.

Reference: https://docs.bigcommerce.com/developer/api-reference/rest/admin/management/channels/menus/create-channel-menus

## Authentication

- `X-Auth-Token` header (required) — ### OAuth scopes | UI Name | Permission | Parameter | |:--------|:-----------|:----------| | Channel Listings | modify | `store_channel_listings` | | Channel Listings | read-only | `store_channel_listings_read_only` | | Channel Settings | modify | `store_channel_settings` | | Channel Settings | read-only | `store_channel_settings_read_only` | | Sites & Routes | modify | `store_sites` | | Sites & Routes | read-only | `store_sites_read_only` | ### Authentication header | Header | Argument | Description | |:-------|:---------|:------------| | `X-Auth-Token` | `access_token` | For more about API accounts that generate `access_token`s, see our [Guide to API Accounts](/developer/docs/overview/api-fundamentals/api-accounts#api-accounts). | ### Further reading For example requests and more information about authenticating BigCommerce APIs, see [Authentication and Example Requests](/developer/docs/overview/api-fundamentals/api-accounts#x-auth-token-header-example-requests). For more about BigCommerce OAuth scopes, see our [Guide to API Accounts](/developer/docs/overview/api-fundamentals/api-accounts#oauth-scopes). For a list of API status codes, see [API Status Codes](/developer/api-reference/rest/overview#rest-http-status-codes).

## Request

### Path parameters

- `channel_id` (long, required) — The ID of a channel.
- `store_hash` (string, required) — Permanent ID of the BigCommerce store.

### Headers

- `Accept` (string, required, default: application/json) — The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the response body.

### Body (application/json)

This endpoint expects a channel_menus_Post.

- `bigcommerce_protected_app_sections` (list of enum, optional) — List of channel-specific control panel menu navigation items and corresponding settings pages an app developer can choose to enable for the subject channel. Protected settings override any settings set in those UI sections at the storewide level. Learn more in the [Building Storefront Channels](/developer/docs/integrations/channels/guide/building-storefront-channels#protected-ui-sections) tutorial.
  - Allowed values: `overview`, `storefront_settings`, `localization`, `carousel`, `script_manager`, `currencies`, `payments`, `checkout`, `domains`, `notifications`, `social`, `pages`, `data_solutions`
- `custom_app_sections` (list of CustomAppSectionsItems, optional)

## Response

### 200

The channel's control-panel menus.

- `data` (ChannelsChannelIdChannelMenusPostResponsesContentApplicationJsonSchemaData, optional)
- `meta` (EmptyMeta, optional) — Response metadata.

## Errors

### 422 Unprocessable Entity Error

Unprocessable entity (The following fields are invalid.)

- `status` (integer, optional)
- `title` (string, optional)
- `type` (string, optional)
- `instance` (string, optional)
- `errors` (ErrorResponseErrors, optional)

## Types

### CustomAppSectionsItems

- `title` (string, optional) — Text displayed to the merchant.
- `query_path` (string, optional) — Value used in the `section` query param.

### ChannelsChannelIdChannelMenusPostResponsesContentApplicationJsonSchemaData

- `bigcommerce_protected_app_sections` (list of enum, optional) — List of channel-specific control panel menu navigation items and corresponding settings pages an app developer can choose to enable for the subject channel. Protected settings override any settings set in those UI sections at the storewide level. Learn more in the [Building Storefront Channels](/developer/docs/integrations/channels/guide/building-storefront-channels#protected-ui-sections) tutorial.
  - Allowed values: `overview`, `storefront_settings`, `localization`, `carousel`, `script_manager`, `currencies`, `payments`, `checkout`, `domains`, `notifications`, `social`, `pages`, `data_solutions`
- `custom_app_sections` (list of CustomAppSectionsItems, optional)

### EmptyMeta

Response metadata.

### ErrorResponseErrors

## Examples

**Request**

```json
{
  "bigcommerce_protected_app_sections": [
    "social",
    "carousel",
    "domains",
    "currencies",
    "notifications",
    "storefront_settings"
  ],
  "custom_app_sections": [
    {
      "title": "Overview",
      "query_path": "overview"
    },
    {
      "title": "Products",
      "query_path": "products"
    },
    {
      "title": "Campaigns",
      "query_path": "campaigns"
    },
    {
      "title": "Settings",
      "query_path": "settings"
    }
  ]
}
```

**Response**

```json
{
  "data": {
    "bigcommerce_protected_app_sections": [
      "social",
      "carousel",
      "domains",
      "currencies",
      "notifications",
      "storefront_settings"
    ],
    "custom_app_sections": [
      {
        "title": "Overview",
        "query_path": "overview"
      },
      {
        "title": "Products",
        "query_path": "products"
      },
      {
        "title": "Campaigns",
        "query_path": "campaigns"
      },
      {
        "title": "Settings",
        "query_path": "settings"
      }
    ]
  },
  "meta": {}
}
```

**SDK Code**

```python Create channel menus
import requests

url = "https://api.bigcommerce.com/stores/store_hash/v3/channels/1/channel-menus"

payload = {
    "bigcommerce_protected_app_sections": ["social", "carousel", "domains", "currencies", "notifications", "storefront_settings"],
    "custom_app_sections": [
        {
            "title": "Overview",
            "query_path": "overview"
        },
        {
            "title": "Products",
            "query_path": "products"
        },
        {
            "title": "Campaigns",
            "query_path": "campaigns"
        },
        {
            "title": "Settings",
            "query_path": "settings"
        }
    ]
}
headers = {
    "Accept": "application/json",
    "X-Auth-Token": "<apiKey>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript Create channel menus
const url = 'https://api.bigcommerce.com/stores/store_hash/v3/channels/1/channel-menus';
const options = {
  method: 'POST',
  headers: {
    Accept: 'application/json',
    'X-Auth-Token': '<apiKey>',
    'Content-Type': 'application/json'
  },
  body: '{"bigcommerce_protected_app_sections":["social","carousel","domains","currencies","notifications","storefront_settings"],"custom_app_sections":[{"title":"Overview","query_path":"overview"},{"title":"Products","query_path":"products"},{"title":"Campaigns","query_path":"campaigns"},{"title":"Settings","query_path":"settings"}]}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Create channel menus
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.bigcommerce.com/stores/store_hash/v3/channels/1/channel-menus"

	payload := strings.NewReader("{\n  \"bigcommerce_protected_app_sections\": [\n    \"social\",\n    \"carousel\",\n    \"domains\",\n    \"currencies\",\n    \"notifications\",\n    \"storefront_settings\"\n  ],\n  \"custom_app_sections\": [\n    {\n      \"title\": \"Overview\",\n      \"query_path\": \"overview\"\n    },\n    {\n      \"title\": \"Products\",\n      \"query_path\": \"products\"\n    },\n    {\n      \"title\": \"Campaigns\",\n      \"query_path\": \"campaigns\"\n    },\n    {\n      \"title\": \"Settings\",\n      \"query_path\": \"settings\"\n    }\n  ]\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Accept", "application/json")
	req.Header.Add("X-Auth-Token", "<apiKey>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Create channel menus
require 'uri'
require 'net/http'

url = URI("https://api.bigcommerce.com/stores/store_hash/v3/channels/1/channel-menus")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Accept"] = 'application/json'
request["X-Auth-Token"] = '<apiKey>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"bigcommerce_protected_app_sections\": [\n    \"social\",\n    \"carousel\",\n    \"domains\",\n    \"currencies\",\n    \"notifications\",\n    \"storefront_settings\"\n  ],\n  \"custom_app_sections\": [\n    {\n      \"title\": \"Overview\",\n      \"query_path\": \"overview\"\n    },\n    {\n      \"title\": \"Products\",\n      \"query_path\": \"products\"\n    },\n    {\n      \"title\": \"Campaigns\",\n      \"query_path\": \"campaigns\"\n    },\n    {\n      \"title\": \"Settings\",\n      \"query_path\": \"settings\"\n    }\n  ]\n}"

response = http.request(request)
puts response.read_body
```

```java Create channel menus
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.bigcommerce.com/stores/store_hash/v3/channels/1/channel-menus")
  .header("Accept", "application/json")
  .header("X-Auth-Token", "<apiKey>")
  .header("Content-Type", "application/json")
  .body("{\n  \"bigcommerce_protected_app_sections\": [\n    \"social\",\n    \"carousel\",\n    \"domains\",\n    \"currencies\",\n    \"notifications\",\n    \"storefront_settings\"\n  ],\n  \"custom_app_sections\": [\n    {\n      \"title\": \"Overview\",\n      \"query_path\": \"overview\"\n    },\n    {\n      \"title\": \"Products\",\n      \"query_path\": \"products\"\n    },\n    {\n      \"title\": \"Campaigns\",\n      \"query_path\": \"campaigns\"\n    },\n    {\n      \"title\": \"Settings\",\n      \"query_path\": \"settings\"\n    }\n  ]\n}")
  .asString();
```

```php Create channel menus
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.bigcommerce.com/stores/store_hash/v3/channels/1/channel-menus', [
  'body' => '{
  "bigcommerce_protected_app_sections": [
    "social",
    "carousel",
    "domains",
    "currencies",
    "notifications",
    "storefront_settings"
  ],
  "custom_app_sections": [
    {
      "title": "Overview",
      "query_path": "overview"
    },
    {
      "title": "Products",
      "query_path": "products"
    },
    {
      "title": "Campaigns",
      "query_path": "campaigns"
    },
    {
      "title": "Settings",
      "query_path": "settings"
    }
  ]
}',
  'headers' => [
    'Accept' => 'application/json',
    'Content-Type' => 'application/json',
    'X-Auth-Token' => '<apiKey>',
  ],
]);

echo $response->getBody();
```

```csharp Create channel menus
using RestSharp;

var client = new RestClient("https://api.bigcommerce.com/stores/store_hash/v3/channels/1/channel-menus");
var request = new RestRequest(Method.POST);
request.AddHeader("Accept", "application/json");
request.AddHeader("X-Auth-Token", "<apiKey>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"bigcommerce_protected_app_sections\": [\n    \"social\",\n    \"carousel\",\n    \"domains\",\n    \"currencies\",\n    \"notifications\",\n    \"storefront_settings\"\n  ],\n  \"custom_app_sections\": [\n    {\n      \"title\": \"Overview\",\n      \"query_path\": \"overview\"\n    },\n    {\n      \"title\": \"Products\",\n      \"query_path\": \"products\"\n    },\n    {\n      \"title\": \"Campaigns\",\n      \"query_path\": \"campaigns\"\n    },\n    {\n      \"title\": \"Settings\",\n      \"query_path\": \"settings\"\n    }\n  ]\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Create channel menus
import Foundation

let headers = [
  "Accept": "application/json",
  "X-Auth-Token": "<apiKey>",
  "Content-Type": "application/json"
]
let parameters = [
  "bigcommerce_protected_app_sections": ["social", "carousel", "domains", "currencies", "notifications", "storefront_settings"],
  "custom_app_sections": [
    [
      "title": "Overview",
      "query_path": "overview"
    ],
    [
      "title": "Products",
      "query_path": "products"
    ],
    [
      "title": "Campaigns",
      "query_path": "campaigns"
    ],
    [
      "title": "Settings",
      "query_path": "settings"
    ]
  ]
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.bigcommerce.com/stores/store_hash/v3/channels/1/channel-menus")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```