curl --request POST \
--url https://api.qumo-deploy.com/v1/projects \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Live",
"environment": "prod"
}
'import requests
url = "https://api.qumo-deploy.com/v1/projects"
payload = {
"name": "Live",
"environment": "prod"
}
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: 'Live', environment: 'prod'})
};
fetch('https://api.qumo-deploy.com/v1/projects', 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",
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' => 'Live',
'environment' => 'prod'
]),
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"
payload := strings.NewReader("{\n \"name\": \"Live\",\n \"environment\": \"prod\"\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.qumo-deploy.com/v1/projects")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Live\",\n \"environment\": \"prod\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qumo-deploy.com/v1/projects")
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\": \"Live\",\n \"environment\": \"prod\"\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"
}{
"error": "organization_id is required"
}Create a project
Creates a project in the organization. A prod project’s credentials work
on the managed relay network, which needs a paid plan; a dev project’s
work only on a relay you run yourself, and an organization has at most one.
The slug used in broadcast paths is derived from the name and never
changes.
curl --request POST \
--url https://api.qumo-deploy.com/v1/projects \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Live",
"environment": "prod"
}
'import requests
url = "https://api.qumo-deploy.com/v1/projects"
payload = {
"name": "Live",
"environment": "prod"
}
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: 'Live', environment: 'prod'})
};
fetch('https://api.qumo-deploy.com/v1/projects', 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",
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' => 'Live',
'environment' => 'prod'
]),
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"
payload := strings.NewReader("{\n \"name\": \"Live\",\n \"environment\": \"prod\"\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.qumo-deploy.com/v1/projects")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Live\",\n \"environment\": \"prod\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qumo-deploy.com/v1/projects")
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\": \"Live\",\n \"environment\": \"prod\"\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"
}{
"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=.
Query Parameters
The organization the request acts in. Required with a personal token or a session, which name no organization themselves; an identity token's organization is implied.
Body
Response
The project was created.
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