---
title: "Create a KOTS customer."
method: POST
path: "/customer"
tags: ["customers"]
---

# Create a KOTS customer.

`POST /customer`

Create a new customer and license for a specified app, with options for channel assignment, license type, expiration, and feature flags.
The created customer will be available for management and download.

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

## Request body

- object
  - `app_id` string, required — App to which the customer is associated.
  - `channel_id` string — Channel to which the customer license is associated. This is the default channel for the customer.
  - `custom_id` string — Custom ID that can be used in external systems.
  - `email` string — Email address of the customer that is to be created
  - `entitlementValues` EntitlementValue[]
    - `isDefault` boolean
    - `name` string
    - `value` string
  - `expires_at` string
  - `is_airgap_enabled` boolean
  - `is_dev_mode_enabled` boolean
  - `is_disaster_recovery_supported` boolean
  - `is_embedded_cluster_download_enabled` boolean
  - `is_embedded_cluster_multinode_enabled` boolean
  - `is_geoaxis_supported` boolean
  - `is_gitops_supported` boolean
  - `is_helm_airgap_enabled` boolean
  - `is_helm_install_enabled` boolean
  - `is_identity_service_supported` boolean
  - `is_installer_support_enabled` boolean
  - `is_kots_install_enabled` boolean
  - `is_kurl_install_enabled` boolean
  - `is_snapshot_supported` boolean
  - `is_support_bundle_upload_enabled` boolean
  - `name` string, required — Name of the customer that is to be created.
  - `type` string

## Response `201`

GetCustomerResponse represents a customer.

- object
  - `customer` Customer
    - `actions` CustomerActions
      - `shipApply` string
      - `shipApplyDocker` string
      - `shipInitCloud` string
      - `shipInitHomebrew` string
    - `activeInstances` InstancePreview
      - `instances` CustomerInstance[]
        - `active` boolean
        - `appStatus` string
        - `client` string
        - `cloud` string
        - `clusterId` string
        - `createdAt` string, date-time
        - `embeddedClusterVersion` string
        - `instanceId` string
        - `isAirgap` boolean
        - `isArchived` boolean
        - `isDummyInstance` boolean
        - `isEmbeddedCluster` boolean
        - `isKurl` boolean
        - `k8sVersion` string
        - `kotsVersion` string
        - `kurlNodeCountReady` integer
        - `kurlNodeCountTotal` integer
        - `lastActive` string, date-time
        - `licenseId` string
        - `replicatedSdkVersion` string
        - `serviceAccountId` string
        - `tags` InstanceTag[]
          - `instanceId` string
          - `key` string
          - `origin` string
          - `value` string
        - `versionHistory` CustomerInstanceVersionHistory[]
          - `clusterId` string
          - `downstreamChannelId` string
          - `downstreamReleaseSequence` integer
          - `instanceId` string
          - `intervalLast` string, date-time
          - `intervalStart` string, date-time
          - `nativeHelmCount` integer
          - `replHelmCount` integer
          - `versionLabel` string
      - `moreAvailable` boolean
      - `totalCount` integer
    - `airgap` boolean
    - `airgapDownloadedAt` string, date-time
    - `airgapDownloadedChannelId` string
    - `airgapDownloadedChannelSequence` integer
    - `airgapDownloadedReleaseLabel` string
    - `appType` string
    - `channels` CustomerChannelWithDetail[]
      - `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
      - `channel_id` 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
      - `is_default_for_customer` boolean
      - `latestChannelSequence` integer
      - `name` string
      - `numActiveInstances` integer
      - `numReleases` integer
      - `pinned_channel_sequence` 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
    - `createdAt` string, date-time
    - `createdBy` Actor
      - `description` string
      - `id` string
      - `link` string
      - `timestamp` string, date-time
      - `type` string
    - `customId` string
    - `downloadPortalUrl` string
    - `email` string
    - `entitlements` EntitlementValue[]
      - `isDefault` boolean
      - `name` string
      - `value` string
    - `esInstances` CustomerESInstance[]
      - `downstreamChannelId` string
      - `downstreamChannelName` string
      - `downstreamChannelSequence` integer
      - `installedReleaseLabel` string
      - `instanceId` string
      - `tags` InstanceTag[]
        - `instanceId` string
        - `key` string
        - `origin` string
        - `value` string
    - `expiresAt` string, date-time
    - `id` string
    - `inactiveInstances` InstancePreview
      - `instances` CustomerInstance[]
        - `active` boolean
        - `appStatus` string
        - `client` string
        - `cloud` string
        - `clusterId` string
        - `createdAt` string, date-time
        - `embeddedClusterVersion` string
        - `instanceId` string
        - `isAirgap` boolean
        - `isArchived` boolean
        - `isDummyInstance` boolean
        - `isEmbeddedCluster` boolean
        - `isKurl` boolean
        - `k8sVersion` string
        - `kotsVersion` string
        - `kurlNodeCountReady` integer
        - `kurlNodeCountTotal` integer
        - `lastActive` string, date-time
        - `licenseId` string
        - `replicatedSdkVersion` string
        - `serviceAccountId` string
        - `tags` InstanceTag[]
          - `instanceId` string
          - `key` string
          - `origin` string
          - `value` string
        - `versionHistory` CustomerInstanceVersionHistory[]
          - `clusterId` string
          - `downstreamChannelId` string
          - `downstreamReleaseSequence` integer
          - `instanceId` string
          - `intervalLast` string, date-time
          - `intervalStart` string, date-time
          - `nativeHelmCount` integer
          - `replHelmCount` integer
          - `versionLabel` string
      - `moreAvailable` boolean
      - `totalCount` integer
    - `installationId` string
    - `installationVersion` string
    - `installedReleaseLabel` string
    - `installedReleaseSequence` integer
    - `instances` CustomerInstance[]
      - `active` boolean
      - `appStatus` string
      - `client` string
      - `cloud` string
      - `clusterId` string
      - `createdAt` string, date-time
      - `embeddedClusterVersion` string
      - `instanceId` string
      - `isAirgap` boolean
      - `isArchived` boolean
      - `isDummyInstance` boolean
      - `isEmbeddedCluster` boolean
      - `isKurl` boolean
      - `k8sVersion` string
      - `kotsVersion` string
      - `kurlNodeCountReady` integer
      - `kurlNodeCountTotal` integer
      - `lastActive` string, date-time
      - `licenseId` string
      - `replicatedSdkVersion` string
      - `serviceAccountId` string
      - `tags` InstanceTag[]
        - `instanceId` string
        - `key` string
        - `origin` string
        - `value` string
      - `versionHistory` CustomerInstanceVersionHistory[]
        - `clusterId` string
        - `downstreamChannelId` string
        - `downstreamReleaseSequence` integer
        - `instanceId` string
        - `intervalLast` string, date-time
        - `intervalStart` string, date-time
        - `nativeHelmCount` integer
        - `replHelmCount` integer
        - `versionLabel` string
    - `isArchived` boolean
    - `isDevModeEnabled` boolean
    - `isDisasterRecoverySupported` boolean
    - `isEmbeddedClusterDownloadEnabled` boolean
    - `isEmbeddedClusterMultiNodeEnabled` boolean
    - `isEnterprisePortalEnabled` boolean
    - `isGeoaxisSupported` boolean
    - `isGitopsSupported` boolean
    - `isHelmAirgapEnabled` boolean
    - `isHelmInstallEnabled` boolean
    - `isIdentityServiceSupported` boolean
    - `isInstallerSupportEnabled` boolean
    - `isInstancesLimited` boolean
    - `isKotsInstallEnabled` boolean
    - `isKurlInstallEnabled` boolean
    - `isSecurityCenterEnabled` boolean
    - `isSnapshotSupported` boolean
    - `isSupportBundleUploadEnabled` boolean
    - `lastActive` string, date-time
    - `lowercaseName` string — Lowercase fields for ES customer sorting
    - `name` string
    - `pinnedChannelSequence` integer
    - `shipInstallStatus` ShipInstallStatus
      - `status` string
      - `updatedAt` string, date-time
    - `teamId` string
    - `type` string
    - `updatedAt` string, date-time
    - `updatedBy` Actor
      - `description` string
      - `id` string
      - `link` string
      - `timestamp` string, date-time
      - `type` 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

---

[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)
