---
title: "Create a new release."
method: POST
path: "/app/{app_id}/release"
tags: ["releases"]
---

# Create a new release.

`POST /app/{app_id}/release`

Create a new release for the specified app using the provided release specification.
The release can be configured with a raw or gzipped spec and will be available for promotion to channels.

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

## Path parameters

- `app_id` string, required

## Request body

- object
  - `spec` string — The spec to use in the new release
  - `spec_gzip` integer[] — The spec to use in the new release, but gzipped

## Response `201`

CreateReleaseResponse contains the new release properties

- object
  - `release` AppRelease
    - `appId` string
    - `channels` 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
    - `charts` Chart[]
      - `error` string
      - `name` string
      - `status` string
      - `updatedAt` string, date-time
      - `version` string
    - `compatibilityResults` CompatibilityResult[]
      - `distribution` string
      - `failureAt` string, date-time
      - `failureNotes` string
      - `successAt` string, date-time
      - `successNotes` string
      - `version` string
    - `created` string, date-time
    - `createdBy` Actor
      - `description` string
      - `id` string
      - `link` string
      - `timestamp` string, date-time
      - `type` string
    - `hasKurlInstaller` boolean
    - `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
    - `isArchived` boolean
    - `isHelmOnly` boolean
    - `isReleaseNotEditable` boolean
    - `lintResult` LintResult
      - `isLintingComplete` boolean
      - `lintExpressions` LintExpression[]
        - `message` string
        - `path` string
        - `rule` string
        - `type` string
    - `rawSpec` string
    - `releaseNotes` string
    - `sequence` integer
    - `spec` string
    - `updated` string, date-time
    - `updatedBy` Actor
      - `description` string
      - `id` string
      - `link` string
      - `timestamp` string, date-time
      - `type` string
    - `userAgent` string

## 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
- `404` — Returned on resource not found

---

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