---
title: "Create a new channel"
method: POST
path: "/settings/channels"
tags: ["Admin Settings: Channels"]
---

# Create a new channel

`POST /settings/channels`

## Request

- Base URL: `http://localhost:8000/api/admin`
- URL: `http://localhost:8000/api/admin/settings/channels`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/bagisto/apis/bagisto-admin-api/docs/settings/channels/post.ts> (a function with typed inputs; its response is checked against the schema)

Mirrors Bagisto admin Settings → Channels → Create. Validates code (unique, alpha-dash), hostname (unique), locales/currencies/inventory_sources (non-empty arrays), default_locale_id and base_currency_id (must appear in the respective arrays), root_category_id (must exist).

## Request body

- object

## Response `201`

Channel created.

- AdminSettingsChannelAdminSettingsChannelRestDto: Admin Settings → Channels endpoints (Block B Wave 2; objectified 2026-06-22). Bare Eloquent `#[ApiResource]` parent. Nested data is field-selectable: GraphQL → `translations`/`locales`/`currencies`/`inventorySources` Relay connections + `homeSeo` typed object. REST → the same data as flat arrays of objects (no connections). REST shape stays flat via `output: AdminSettingsChannelRestDto`; GraphQL ops carry NO output so they return this Eloquent model → connections resolve. BREAKING (user-approved): the old scalar `localeIds`/`currencyIds`/ `inventorySourceIds` int arrays are REPLACED by the `locales`/`currencies`/ `inventorySources` object connections (GraphQL) / object arrays (REST). REST: GET /api/admin/settings/channels — datagrid-parity listing GET /api/admin/settings/channels/{id} — detail POST /api/admin/settings/channels — create PUT /api/admin/settings/channels/{id} — update (translatable via translations map) DELETE /api/admin/settings/channels/{id} — delete (guards: last channel, app.channel) GraphQL: adminSettingsChannels / adminSettingsChannel(id:) createAdminSettingsChannel / updateAdminSettingsChannel / deleteAdminSettingsChannel Mirrors Webkul\Admin\Http\Controllers\Settings\ChannelController 1:1. Image upload (logo/favicon) is not supported yet; an update keeps the current images.
  - `id` integer, nullable
  - `code` string, nullable
  - `name` string, nullable
  - `description` string, nullable
  - `hostname` string, nullable
  - `theme` string, nullable
  - `timezone` string, nullable
  - `defaultLocaleId` integer, nullable
  - `baseCurrencyId` integer, nullable
  - `rootCategoryId` integer, nullable
  - `isMaintenanceOn` boolean, nullable
  - `maintenanceModeText` string, nullable
  - `allowedIps` string[], nullable
  - `logo` string, nullable
  - `logoUrl` string, nullable
  - `favicon` string, nullable
  - `faviconUrl` string, nullable
  - `locales` object[], nullable
  - `currencies` object[], nullable
  - `inventorySources` object[], nullable
  - `homeSeo` object, nullable
  - `translations` object[], nullable
  - `createdAt` string, nullable
  - `updatedAt` string, nullable

## Other responses

- `400`: Invalid input
- `422`: Validation failure.

---

[API](https://skmtc.dev/bagisto/apis/bagisto-admin-api.md) - [All operations](https://skmtc.dev/bagisto/apis/bagisto-admin-api/llms.txt) - [OpenAPI document](https://skmtc.dev/bagisto/apis/bagisto-admin-api/revisions/3198f11be70f?raw)
