---
title: "Creates a channel in the KOTS application."
method: POST
path: "/app/{app_id}/channel"
tags: ["channels"]
---

# Creates a channel in the KOTS application.

`POST /app/{app_id}/channel`

Create a new channel for the specified app, allowing for configuration of channel properties such as name, description, and feature flags.

Required RBAC Policy: kots/app/[:appid]/channel/create

## Path parameters

- `app_id` string, required

## Request body

- object
  - `airgapDiffBundlesEnabled` boolean — AirgapDiffBundlesEnabled will allow building diff airgap bundles for the channel.
  - `airgapDockerRegistryFormatEnabled` boolean — AirgapDockerRegistryFormatEnabled airgap bundles built after enabling this will use the Docker Registry format.
  - `customHostnameOverrides` CustomHostnameOverrides
    - `downloadPortal` CustomHostnameOverride
      - `hostname` string
    - `proxy` CustomHostnameOverride
      - `hostname` string
    - `registry` CustomHostnameOverride
      - `hostname` string
    - `replicatedApp` CustomHostnameOverride
      - `hostname` string
  - `description` string — Description of the channel that is to be created.
  - `enterprisePartnerChannelID` string — Enterprise Partner Channel Id to be added to channel.
  - `name` string, required
  - `semverRequired` boolean — SemverRequired when enabled, will cause an error when non semver values are used for new releases

## Response `201`

GetChannelResponse represents a channel.

- object
  - `channel` Channel
    - `adoptionRate` CustomerAdoption[]
      - `channelId` string
      - `count` integer
      - `percent` number, double
      - `releaseSequence` integer
      - `semver` string
      - `totalOnChannel` integer
    - `airgapDiffBundlesEnabled` boolean
    - `airgapDockerRegistryFormatEnabled` boolean
    - `appId` string
    - `appName` string
    - `appSlug` string
    - `buildAirgapAutomatically` boolean
    - `channelIcon` string
    - `channelSequence` integer
    - `channelSlug` string
    - `chartReleases` HelmChart[] — ChartReleases is a map of chart name -> []string of version labels
      - `error` string
      - `hasPreflightSpec` boolean
      - `name` string
      - `version` string
      - `weight` integer
    - `created` string, date-time
    - `currentVersion` string
    - `customHostnameOverrides` CustomHostnameOverrides
      - `downloadPortal` CustomHostnameOverride
        - `hostname` string
      - `proxy` CustomHostnameOverride
        - `hostname` string
      - `registry` CustomHostnameOverride
        - `hostname` string
      - `replicatedApp` CustomHostnameOverride
        - `hostname` string
    - `customers` TotalActiveInactiveCustomers
      - `activeCustomers` integer
      - `inactiveCustomers` integer
      - `totalCustomers` integer
    - `description` string
    - `embeddedClusterInstallCommand` string
    - `enterprisePartnerChannelID` string
    - `existingClusterInstallCommand` string
    - `extraLintRules` ExtraLintRules[]
    - `gitHubRef` GitHubRef
    - `hasKurlInstaller` boolean — swager:ignore
    - `id` string
    - `isArchived` boolean
    - `isDefault` boolean
    - `isHelmOnly` boolean
    - `latestChannelSequence` integer
    - `name` string
    - `numActiveInstances` integer
    - `numReleases` integer
    - `releaseNotes` string
    - `releaseSequence` integer
    - `releases` KotsChannelRelease[]
      - `airgapBuildError` string
      - `airgapBuildStatus` string
      - `airgapBundleImages` string[]
      - `channelIcon` string
      - `channelId` string
      - `channelName` string
      - `channelSequence` integer
      - `created` string, date-time
      - `createdBy` Actor
        - `description` string
        - `id` string
        - `link` string
        - `timestamp` string, date-time
        - `type` string
      - `customResourceError` string
      - `customResourceWarnings` string[]
      - `demotedAt` string, date-time
      - `embeddedClusterVersion` string
      - `hasECInstaller` boolean
      - `hasKurlInstaller` boolean
      - `imageSecurityInfo` ImageVulnCounts[]
        - `counts` VulnCounts
          - `critical` integer
          - `high` integer
          - `low` integer
          - `medium` integer
          - `total` integer
        - `digest` string
        - `digest_first_seen_at` string
        - `image_size_bytes` integer
        - `input` string
        - `installation_phase` string — InstallationPhase indicates the Embedded Cluster phase for the image ("", "online", or "airgap"). Application images have the phase "". Infrastructure images used for Embedded Cluster in both online and airgap have the phase "online" or "airgap". Infrastructure images used for Embedded Cluster only in airgap have the phase "airgap".
        - `last_scanned_at` string
        - `not_found` boolean
      - `imageSecuritySums` object
      - `installationTypes` InstallationTypes
        - `embeddedCluster` InstallerTypeEmbeddedCluster
          - `proxyRegistryDomain` string
          - `replicatedAppDomain` string
          - `replicatedRegistryDomain` string
          - `version` string
        - `helm` InstallerTypeHelm
        - `kots` InstallerTypeKots
          - `minKotsVersion` string
          - `targetKotsVersion` string
        - `kotsConfig` InstallerTypeKotsConfig
          - `apiVersion` string
        - `kurl` InstallationTypeKurl
          - `installerVersion` string
        - `preflight` InstallerTypePreflight
          - `apiVersion` string
        - `replicatedSDK` InstallerTypeReplicatedSDK
          - `sdkVersion` string
        - `supportBundle` InstallerTypeSupportBundle
          - `apiVersion` string
      - `isDemoted` boolean
      - `isRequired` boolean
      - `kurlInstallerID` string
      - `lintResult` LintResult
        - `isLintingComplete` boolean
        - `lintExpressions` LintExpression[]
          - `message` string
          - `path` string
          - `rule` string
          - `type` string
      - `proxyRegistryDomain` string
      - `registrySecret` string
      - `releaseNotes` string
      - `releasedAt` string, date-time
      - `replicatedRegistryDomain` string
      - `semver` string
      - `sequence` integer
      - `updated` string, date-time
      - `updatedBy` Actor
        - `description` string
        - `id` string
        - `link` string
        - `timestamp` string, date-time
        - `type` string
    - `replicatedRegistryDomain` string
    - `semverRequired` boolean
    - `semverWarning` string
    - `targetKotsVersion` string
    - `updated` string, date-time

## Other responses

- `400` — Returned on bad input
- `401` — Return if the caller is not authorized
- `403` — Returned if the caller does not have the needed permission

---

[API](https://skmtc.net/replicated/apis/vendor-api-v3-2.md) · [All operations](https://skmtc.net/replicated/apis/vendor-api-v3-2/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/replicated/vendor-api-v3-2/versions/6fcf9e54aba4/schema)
