curl --request PATCH \
--url https://api.qumo-deploy.com/v1/projects/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Live (Tokyo)"
}
'import requests
url = "https://api.qumo-deploy.com/v1/projects/{id}"
payload = { "name": "Live (Tokyo)" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: 'Live (Tokyo)'})
};
fetch('https://api.qumo-deploy.com/v1/projects/{id}', 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.qumo-deploy.com/v1/projects/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Live (Tokyo)'
]),
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.qumo-deploy.com/v1/projects/{id}"
payload := strings.NewReader("{\n \"name\": \"Live (Tokyo)\"\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.qumo-deploy.com/v1/projects/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Live (Tokyo)\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qumo-deploy.com/v1/projects/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Live (Tokyo)\"\n}"
response = http.request(request)
puts response.read_body{
"id": "9b1d6e2f-4a3c-4f8b-a7e5-0c9d2b4f6e81",
"organization_id": "3f8c2a1e-7b4d-4e9a-9c61-2d5e8f0a1b7c",
"name": "Live",
"slug": "live",
"environment": "prod",
"created_at": "2026-09-14T08:21:37Z",
"suspended_at": null
}{
"error": "organization_id is required"
}{
"error": "organization_id is required"
}{
"error": "organization_id is required"
}{
"error": "organization_id is required"
}Rename a project
Changes a project’s display name. Its slug, and so its broadcast paths, stay the same.
curl --request PATCH \
--url https://api.qumo-deploy.com/v1/projects/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Live (Tokyo)"
}
'import requests
url = "https://api.qumo-deploy.com/v1/projects/{id}"
payload = { "name": "Live (Tokyo)" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: 'Live (Tokyo)'})
};
fetch('https://api.qumo-deploy.com/v1/projects/{id}', 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.qumo-deploy.com/v1/projects/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Live (Tokyo)'
]),
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.qumo-deploy.com/v1/projects/{id}"
payload := strings.NewReader("{\n \"name\": \"Live (Tokyo)\"\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.qumo-deploy.com/v1/projects/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Live (Tokyo)\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qumo-deploy.com/v1/projects/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Live (Tokyo)\"\n}"
response = http.request(request)
puts response.read_body{
"id": "9b1d6e2f-4a3c-4f8b-a7e5-0c9d2b4f6e81",
"organization_id": "3f8c2a1e-7b4d-4e9a-9c61-2d5e8f0a1b7c",
"name": "Live",
"slug": "live",
"environment": "prod",
"created_at": "2026-09-14T08:21:37Z",
"suspended_at": null
}{
"error": "organization_id is required"
}{
"error": "organization_id is required"
}{
"error": "organization_id is required"
}{
"error": "organization_id is required"
}Authorizations
A personal access token (POST /v1/auth/tokens) or a machine
identity token (POST /v1/projects/{project_id}/identities/{identity_id}/tokens),
both prefixed qumo_pat_. A token's scopes cap what it can do; see
Scopes and permissions. A personal
token names no organization: on a route whose path names no project or
organization, pass ?organization_id=.
Path Parameters
The project's id.
Body
The new display name.
1"Live (Tokyo)"
Response
The renamed project.
A project inside an organization; signing keys and identities belong to one.
The project's id.
"9b1d6e2f-4a3c-4f8b-a7e5-0c9d2b4f6e81"
The organization that owns the project.
"3f8c2a1e-7b4d-4e9a-9c61-2d5e8f0a1b7c"
Display name.
"Live"
The project's name in broadcast paths, after the organization's slug. Unique within the organization, derived from the name at creation, and unchanged when the name changes.
"live"
Which relays the project's credentials work on: prod on the
managed relay network, dev on a relay you run yourself.
prod, dev "prod"
When the project was created.
"2026-09-14T08:21:37Z"
When Qumo took the project off the managed relays, or null. While set, credentials signed with the project's keys are refused there.
null