---
title: "Create a cluster"
method: POST
path: "/organization/{organizationId}/cluster"
tags: ["Clusters"]
---

# Create a cluster

`POST /organization/{organizationId}/cluster`

## Request

- Base URL: `https://api.qovery.com`
- URL: `https://api.qovery.com/organization/{organizationId}/cluster`
- Auth: one of:
  - API key in header `Authorization`
  - HTTP bearer
- TypeScript: <https://skmtc.dev/qovery/apis/qovery-api/docs/organization/:organizationId/cluster/post.ts> (a function with typed inputs; its response is checked against the schema)

## Path parameters

- `organizationId` string, uuid, required

## Request body

- ClusterRequest
  - `name` string, required: name is case-insensitive
  - `description` string
  - `region` string, required
  - `cloud_provider` 'AWS' | 'SCW' | 'GCP' | 'DO' | 'AZURE' | 'OVH' | 'CIVO' | 'HETZNER' | 'ORACLE' | 'IBM' | 'ON_PREMISE', required
  - `cloud_provider_credentials` ClusterCloudProviderInfoRequest
    - `cloud_provider` 'AWS' | 'SCW' | 'GCP' | 'ON_PREMISE' | 'AZURE'
    - `credentials` object
      - `id` string, uuid
      - `name` string
    - `region` string
  - `min_running_nodes` integer
  - `max_running_nodes` integer
  - `disk_size` integer: Unit is in GB. The disk size to be used for the node configuration
  - `instance_type` string: the instance type to be used for this cluster. The list of values can be retrieved via the endpoint /{CloudProvider}/instanceType
  - `kubernetes` 'MANAGED' | 'SELF_MANAGED' | 'PARTIALLY_MANAGED'
  - `production` boolean: specific flag to indicate that this cluster is a production one
  - `ssh_keys` string[]: Indicate your public ssh_key to remotely connect to your EC2 instance.
  - `features` object[]
    - `id` string, uuid
    - `value` union
      - string
      - boolean
      - ClusterFeatureAwsExistingVpc
        - `aws_vpc_eks_id` string, required
        - `eks_subnets_zone_a_ids` string[], required
        - `eks_subnets_zone_b_ids` string[], required
        - `eks_subnets_zone_c_ids` string[], required
        - `documentdb_subnets_zone_a_ids` string[], nullable
        - `documentdb_subnets_zone_b_ids` string[], nullable
        - `documentdb_subnets_zone_c_ids` string[], nullable
        - `elasticache_subnets_zone_a_ids` string[], nullable
        - `elasticache_subnets_zone_b_ids` string[], nullable
        - `elasticache_subnets_zone_c_ids` string[], nullable
        - `rds_subnets_zone_a_ids` string[], nullable
        - `rds_subnets_zone_b_ids` string[], nullable
        - `rds_subnets_zone_c_ids` string[], nullable
        - `eks_karpenter_fargate_subnets_zone_a_ids` string[], nullable
        - `eks_karpenter_fargate_subnets_zone_b_ids` string[], nullable
        - `eks_karpenter_fargate_subnets_zone_c_ids` string[], nullable
      - ClusterFeatureGcpExistingVpc
        - `vpc_name` string, required
        - `vpc_project_id` string, nullable
        - `subnetwork_name` string, nullable
        - `ip_range_services_name` string, nullable
        - `ip_range_pods_name` string, nullable
        - `additional_ip_range_pods_names` string[]
      - ClusterFeatureKarpenterParameters
        - `spot_enabled` boolean, required
        - `disk_size_in_gib` integer, required
        - `default_service_architecture` 'AMD64' | 'ARM64', required
        - `qovery_node_pools` KarpenterNodePool, required
          - `requirements` KarpenterNodePoolRequirement[], required
            - `key` 'InstanceFamily' | 'InstanceSize' | 'Arch' | 'SkuFamily' | 'SkuVersion', required
            - `operator` 'In', required
            - `values` string[], required
          - `stable_override` KarpenterStableNodePoolOverride
            - `consolidation` KarpenterNodePoolConsolidation
              - …
            - `limits` KarpenterNodePoolLimits
              - …
          - `default_override` KarpenterDefaultNodePoolOverride
            - `limits` KarpenterNodePoolLimits
              - …
          - `gpu_override` KarpenterGpuNodePoolOverride
            - `consolidation` KarpenterNodePoolConsolidation
              - …
            - `limits` KarpenterNodePoolLimits
              - …
            - `requirements` KarpenterNodePoolRequirement[]
              - …
  - `metrics_parameters` MetricsParameters
    - `enabled` boolean
    - `configuration` object
      - `kind` 'MANAGED_BY_QOVERY'
  - `infrastructure_charts_parameters` ClusterInfrastructureChartsParameters
    - `nginx_parameters` ClusterInfrastructureNginxChartParameters
      - `replica_count` integer
      - `default_ssl_certificate` string
      - `publish_status_address` string
      - `annotation_metal_lb_load_balancer_ips` string
      - `annotation_external_dns_kubernetes_target` string
    - `cert_manager_parameters` ClusterInfrastructureCertManagerChartParameters
      - `kubernetes_namespace` string
    - `metal_lb_parameters` ClusterInfrastructureMetalLbChartParameters
      - `ip_address_pools` string[]

## Response `201`

Create cluster

- Cluster
  - `id` string, uuid, required
  - `created_at` string, date-time, required
  - `updated_at` string, date-time
  - `organization` ReferenceObject, required
    - `id` string, uuid, required
  - `name` string, required: name is case-insensitive
  - `description` string
  - `region` string, required
  - `cloud_provider` 'AWS' | 'SCW' | 'GCP' | 'DO' | 'AZURE' | 'OVH' | 'CIVO' | 'HETZNER' | 'ORACLE' | 'IBM' | 'ON_PREMISE', required
  - `min_running_nodes` integer
  - `max_running_nodes` integer
  - `disk_size` integer: Unit is in GB. The disk size to be used for the node configuration
  - `instance_type` string: the instance type to be used for this cluster. The list of values can be retrieved via the endpoint /{CloudProvider}/instanceType
  - `kubernetes` 'MANAGED' | 'SELF_MANAGED' | 'PARTIALLY_MANAGED'
  - `cpu` integer: unit is millicores (m). 1000m = 1 cpu
  - `memory` integer: unit is MB. 1024 MB = 1GB
  - `estimated_cloud_provider_cost` integer: This is an estimation of the cost this cluster will represent on your cloud proider bill, based on your current configuration
  - `status` 'BUILDING' | 'BUILD_ERROR' | 'CANCELED' | 'CANCELING' | 'DELETED' | 'DELETE_ERROR' | 'DELETE_QUEUED' | 'DELETING' | 'DEPLOYED' | 'DEPLOYING' | 'DEPLOYMENT_ERROR' | 'DEPLOYMENT_QUEUED' | 'DRY_RUN' | 'QUEUED' | 'READY' | 'STOPPED' | 'STOPPING' | 'STOP_ERROR' | 'STOP_QUEUED' | 'RESTART_QUEUED' | 'RESTARTING' | 'RESTARTED' | 'RESTART_ERROR' | 'INVALID_CREDENTIALS'
  - `has_access` boolean
  - `version` string
  - `is_default` boolean
  - `is_demo` boolean: specific flag to indicate that this cluster is a demo one
  - `production` boolean: specific flag to indicate that this cluster is a production one
  - `ssh_keys` string[]: Indicate your public ssh_key to remotely connect to your EC2 instance.
  - `features` ClusterFeatureResponse[]
    - `id` string, uuid
    - `title` string
    - `description` string, nullable
    - `cost_per_month_in_cents` integer, nullable
    - `cost_per_month` number, nullable
    - `currency_code` string, nullable
    - `is_cloud_provider_paying_feature` boolean
    - `cloud_provider_feature_documentation` string, nullable
    - `is_qovery_paying_feature` boolean
    - `qovery_feature_documentation` string, nullable
    - `value_type` 'BOOLEAN'
    - `value_object` union
      - ClusterFeatureStringResponse
        - `type` 'STRING' | 'BOOLEAN' | 'AWS_USER_PROVIDED_NETWORK' | 'GCP_USER_PROVIDED_NETWORK' | 'KARPENTER', required
        - `value` string, required
      - ClusterFeatureBooleanResponse
        - `type` 'STRING' | 'BOOLEAN' | 'AWS_USER_PROVIDED_NETWORK' | 'GCP_USER_PROVIDED_NETWORK' | 'KARPENTER', required
        - `value` boolean, required
      - ClusterFeatureAwsExistingVpcResponse
        - `type` 'STRING' | 'BOOLEAN' | 'AWS_USER_PROVIDED_NETWORK' | 'GCP_USER_PROVIDED_NETWORK' | 'KARPENTER', required
        - `value` ClusterFeatureAwsExistingVpc, required
          - `aws_vpc_eks_id` string, required
          - `eks_subnets_zone_a_ids` string[], required
          - `eks_subnets_zone_b_ids` string[], required
          - `eks_subnets_zone_c_ids` string[], required
          - `documentdb_subnets_zone_a_ids` string[], nullable
          - `documentdb_subnets_zone_b_ids` string[], nullable
          - `documentdb_subnets_zone_c_ids` string[], nullable
          - `elasticache_subnets_zone_a_ids` string[], nullable
          - `elasticache_subnets_zone_b_ids` string[], nullable
          - `elasticache_subnets_zone_c_ids` string[], nullable
          - `rds_subnets_zone_a_ids` string[], nullable
          - `rds_subnets_zone_b_ids` string[], nullable
          - `rds_subnets_zone_c_ids` string[], nullable
          - `eks_karpenter_fargate_subnets_zone_a_ids` string[], nullable
          - `eks_karpenter_fargate_subnets_zone_b_ids` string[], nullable
          - `eks_karpenter_fargate_subnets_zone_c_ids` string[], nullable
      - ClusterFeatureGcpExistingVpcResponse
        - `type` 'STRING' | 'BOOLEAN' | 'AWS_USER_PROVIDED_NETWORK' | 'GCP_USER_PROVIDED_NETWORK' | 'KARPENTER', required
        - `value` ClusterFeatureGcpExistingVpc, required
          - `vpc_name` string, required
          - `vpc_project_id` string, nullable
          - `subnetwork_name` string, nullable
          - `ip_range_services_name` string, nullable
          - `ip_range_pods_name` string, nullable
          - `additional_ip_range_pods_names` string[]
      - ClusterFeatureKarpenterParametersResponse
        - `type` 'STRING' | 'BOOLEAN' | 'AWS_USER_PROVIDED_NETWORK' | 'GCP_USER_PROVIDED_NETWORK' | 'KARPENTER', required
        - `value` ClusterFeatureKarpenterParameters, required
          - `spot_enabled` boolean, required
          - `disk_size_in_gib` integer, required
          - `default_service_architecture` 'AMD64' | 'ARM64', required
          - `qovery_node_pools` KarpenterNodePool, required
            - `requirements` KarpenterNodePoolRequirement[], required
              - …
            - `stable_override` KarpenterStableNodePoolOverride
              - …
            - `default_override` KarpenterDefaultNodePoolOverride
              - …
            - `gpu_override` KarpenterGpuNodePoolOverride
              - …
    - `is_value_updatable` boolean
    - `accepted_values` union[]
      - union
        - string
        - boolean
  - `deployment_status` 'NEVER_DEPLOYED' | 'OUT_OF_DATE' | 'UP_TO_DATE'
  - `metrics_parameters` MetricsParameters
    - `enabled` boolean
    - `configuration` object
      - `kind` 'MANAGED_BY_QOVERY'
  - `infrastructure_outputs` union
    - object
      - `kind` 'AKS', required
      - `cluster_name` string, required
      - `cluster_oidc_issuer` string, required
    - object
      - `kind` 'EKS', required
      - `cluster_name` string, required
      - `cluster_arn` string, required
      - `cluster_oidc_issuer` string, required
      - `vpc_id` string, required
    - object
      - `kind` 'GKE', required
      - `cluster_name` string, required
      - `cluster_self_link` string, required
    - object
      - `kind` 'SCW_KAPSULE', required
      - `cluster_name` string, required
  - `infrastructure_charts_parameters` ClusterInfrastructureChartsParameters
    - `nginx_parameters` ClusterInfrastructureNginxChartParameters
      - `replica_count` integer
      - `default_ssl_certificate` string
      - `publish_status_address` string
      - `annotation_metal_lb_load_balancer_ips` string
      - `annotation_external_dns_kubernetes_target` string
    - `cert_manager_parameters` ClusterInfrastructureCertManagerChartParameters
      - `kubernetes_namespace` string
    - `metal_lb_parameters` ClusterInfrastructureMetalLbChartParameters
      - `ip_address_pools` string[]

## Other responses

- `400`: Bad request
- `401`: Access token is missing or invalid
- `403`: Access forbidden
- `404`: Resource not found

---

[API](https://skmtc.dev/qovery/apis/qovery-api.md) - [All operations](https://skmtc.dev/qovery/apis/qovery-api/llms.txt) - [OpenAPI document](https://skmtc.dev/qovery/apis/qovery-api/revisions/93c4960a44ba?raw)
