curl --request POST \
--url https://api.qovery.com/v1/organization/{organizationId}/selfManagedCluster \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"provider": "AWS",
"region": "eu-west-3",
"credentials": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
},
"platform": {
"templateKey": "<string>",
"templateVersion": "<string>",
"layerSelections": {},
"managedConfig": {}
},
"production": false,
"clusterInputs": {}
}
'import requests
url = "https://api.qovery.com/v1/organization/{organizationId}/selfManagedCluster"
payload = {
"name": "<string>",
"provider": "AWS",
"region": "eu-west-3",
"credentials": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" },
"platform": {
"templateKey": "<string>",
"templateVersion": "<string>",
"layerSelections": {},
"managedConfig": {}
},
"production": False,
"clusterInputs": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
provider: 'AWS',
region: 'eu-west-3',
credentials: {id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'},
platform: {
templateKey: '<string>',
templateVersion: '<string>',
layerSelections: {},
managedConfig: {}
},
production: false,
clusterInputs: {}
})
};
fetch('https://api.qovery.com/v1/organization/{organizationId}/selfManagedCluster', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.qovery.com/v1/organization/{organizationId}/selfManagedCluster",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'provider' => 'AWS',
'region' => 'eu-west-3',
'credentials' => [
'id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'platform' => [
'templateKey' => '<string>',
'templateVersion' => '<string>',
'layerSelections' => [
],
'managedConfig' => [
]
],
'production' => false,
'clusterInputs' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.qovery.com/v1/organization/{organizationId}/selfManagedCluster"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"provider\": \"AWS\",\n \"region\": \"eu-west-3\",\n \"credentials\": {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n },\n \"platform\": {\n \"templateKey\": \"<string>\",\n \"templateVersion\": \"<string>\",\n \"layerSelections\": {},\n \"managedConfig\": {}\n },\n \"production\": false,\n \"clusterInputs\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.qovery.com/v1/organization/{organizationId}/selfManagedCluster")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"provider\": \"AWS\",\n \"region\": \"eu-west-3\",\n \"credentials\": {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n },\n \"platform\": {\n \"templateKey\": \"<string>\",\n \"templateVersion\": \"<string>\",\n \"layerSelections\": {},\n \"managedConfig\": {}\n },\n \"production\": false,\n \"clusterInputs\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qovery.com/v1/organization/{organizationId}/selfManagedCluster")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"provider\": \"AWS\",\n \"region\": \"eu-west-3\",\n \"credentials\": {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n },\n \"platform\": {\n \"templateKey\": \"<string>\",\n \"templateVersion\": \"<string>\",\n \"layerSelections\": {},\n \"managedConfig\": {}\n },\n \"production\": false,\n \"clusterInputs\": {}\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organizationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"production": true,
"provider": "AWS",
"region": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"credentials": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
},
"registry": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "ECR"
},
"platform": {
"templateKey": "<string>",
"templateVersion": "<string>",
"layerSelections": {},
"managedConfig": {}
},
"clusterInputs": {},
"layers": [
{
"key": "<string>",
"status": "ENABLED",
"reason": "<string>",
"componentKeys": [
"<string>"
]
}
]
}Create a self-managed cluster run by the Qovery Operator
Creates a self-managed cluster on an existing AWS cloud credential of the organization. The organization’s plan must include self-managed clusters, otherwise the call answers 403. The credential only needs ECR permissions for the cluster itself, including ecr:DescribeRepositories in us-east-1, which Qovery calls to check the credential whatever the cluster region; features that call other AWS services with the credential, such as managed databases or Terraform services using the cluster credentials, need more. Without platform.templateKey and platform.templateVersion, Qovery selects its self-managed platform template release and the response returns it: "platform": {} gives that release with its default configuration. Without clusterInputs, the cluster has no cluster inputs. The credential, including its ECR access in the cluster region, and the platform configuration are checked before anything is created. One transaction then writes the cluster, its Qovery DNS and build providers, its default ECR registry derived from the credential, its initial deployment status, its platform configuration and its Qovery Operator enrollment. Only the AWS provider is supported. Install the Operator next with the cluster’s Operator bootstrap.
curl --request POST \
--url https://api.qovery.com/v1/organization/{organizationId}/selfManagedCluster \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"provider": "AWS",
"region": "eu-west-3",
"credentials": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
},
"platform": {
"templateKey": "<string>",
"templateVersion": "<string>",
"layerSelections": {},
"managedConfig": {}
},
"production": false,
"clusterInputs": {}
}
'import requests
url = "https://api.qovery.com/v1/organization/{organizationId}/selfManagedCluster"
payload = {
"name": "<string>",
"provider": "AWS",
"region": "eu-west-3",
"credentials": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" },
"platform": {
"templateKey": "<string>",
"templateVersion": "<string>",
"layerSelections": {},
"managedConfig": {}
},
"production": False,
"clusterInputs": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
provider: 'AWS',
region: 'eu-west-3',
credentials: {id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'},
platform: {
templateKey: '<string>',
templateVersion: '<string>',
layerSelections: {},
managedConfig: {}
},
production: false,
clusterInputs: {}
})
};
fetch('https://api.qovery.com/v1/organization/{organizationId}/selfManagedCluster', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.qovery.com/v1/organization/{organizationId}/selfManagedCluster",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'provider' => 'AWS',
'region' => 'eu-west-3',
'credentials' => [
'id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'platform' => [
'templateKey' => '<string>',
'templateVersion' => '<string>',
'layerSelections' => [
],
'managedConfig' => [
]
],
'production' => false,
'clusterInputs' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.qovery.com/v1/organization/{organizationId}/selfManagedCluster"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"provider\": \"AWS\",\n \"region\": \"eu-west-3\",\n \"credentials\": {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n },\n \"platform\": {\n \"templateKey\": \"<string>\",\n \"templateVersion\": \"<string>\",\n \"layerSelections\": {},\n \"managedConfig\": {}\n },\n \"production\": false,\n \"clusterInputs\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.qovery.com/v1/organization/{organizationId}/selfManagedCluster")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"provider\": \"AWS\",\n \"region\": \"eu-west-3\",\n \"credentials\": {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n },\n \"platform\": {\n \"templateKey\": \"<string>\",\n \"templateVersion\": \"<string>\",\n \"layerSelections\": {},\n \"managedConfig\": {}\n },\n \"production\": false,\n \"clusterInputs\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qovery.com/v1/organization/{organizationId}/selfManagedCluster")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"provider\": \"AWS\",\n \"region\": \"eu-west-3\",\n \"credentials\": {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n },\n \"platform\": {\n \"templateKey\": \"<string>\",\n \"templateVersion\": \"<string>\",\n \"layerSelections\": {},\n \"managedConfig\": {}\n },\n \"production\": false,\n \"clusterInputs\": {}\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organizationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"production": true,
"provider": "AWS",
"region": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"credentials": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
},
"registry": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "ECR"
},
"platform": {
"templateKey": "<string>",
"templateVersion": "<string>",
"layerSelections": {},
"managedConfig": {}
},
"clusterInputs": {},
"layers": [
{
"key": "<string>",
"status": "ENABLED",
"reason": "<string>",
"componentKeys": [
"<string>"
]
}
]
}Authorizations
JWT tokens should be used with OIDC account (human to machine). JWT tokens used by the Qovery console to communicate with the API have a TTL. Curl Example ' curl https://console.qovery.com/organization -H "Authorization: Bearer $qovery_token" '
Path Parameters
Organization ID
Body
AWS "eu-west-3"
AWS cloud credential of the organization that the cluster runs on. This operation only takes and returns its id.
Show child attributes
Show child attributes
Platform template release and configuration of a new self-managed cluster. Set templateKey and templateVersion together to select a release, or omit both and Qovery selects its self-managed platform template release; only one of them answers 400. layerSelections and managedConfig are validated against the selected release, and {} gives that release with its default configuration. Send them without templateKey and templateVersion only if you already know the components of the self-managed platform template; a client that renders the fields of a release must send that release's coordinates, and selections of mandatory layers are rejected. The response returns the selected release, and the cluster keeps it even if Qovery later selects another one.
Show child attributes
Show child attributes
String values keyed first by component key and then by input key
Show child attributes
Show child attributes
Response
Created self-managed cluster
AWS, SCW, GCP, DO, AZURE, OVH, CIVO, HETZNER, ORACLE, IBM, ON_PREMISE AWS cloud credential of the organization that the cluster runs on. This operation only takes and returns its id.
Show child attributes
Show child attributes
Default ECR registry of the cluster, derived from its cloud credential and region.
Show child attributes
Show child attributes
Platform template release selected for a cluster, with its layer selections and component configuration. Sensitive managedConfig values are redacted in responses.
Show child attributes
Show child attributes
String values keyed first by component key and then by input key
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Was this page helpful?