Projects and environments
Discover and manage projects and environments through the HTTP API.
BASE = https://api.cloud.simplifyd.com/v1/workspaces/{workspace}/projectsUse the resource's slug in each path. A project token can read its own workspace, project and environments. An environment-scoped token limits environment discovery to its assigned environment. For routes that require a session, send the signed-in session JWT as a bearer token.
Set BASE to the URL above with your workspace slug. Set PROJECT and ENV to the IDs returned by the corresponding list or create calls. The examples read credentials from SIMPLIFYD_API_TOKEN or SIMPLIFYD_SESSION_TOKEN.
| Method and path | Request and response | Access |
|---|---|---|
GET {BASE} | 200 OK with an array of projects | Session or project token |
GET {BASE}/{project} | 200 OK with the project | Session or project token |
POST {BASE} | Send {"name":"My app"}. Returns 201 Created with the project and the first environment's ID in active_env. | Session |
PUT {BASE}/{project} | Send {"name":"New name"}. Returns 200 OK with {"success":true}. | Session |
DELETE {BASE}/{project} | Deletes the project and all its services. Returns 200 OK with {"success":true}. | Workspace owner session |
GET {BASE}/{project}/envs | 200 OK with an array of environments | Session or project token |
GET {BASE}/{project}/envs/{env} | 200 OK with the environment | Session or project token |
POST {BASE}/{project}/envs | Send {"name":"staging"}. Returns 201 Created with success and active_env. | Session or token scoped to the whole project |
PUT {BASE}/{project}/envs/{env} | Send {"name":"preproduction"}. Returns 200 OK with {"success":true}. | Session or project token |
DELETE {BASE}/{project}/envs/{env} | Deletes the environment and all its services. Returns 200 OK with {"success":true}. | Workspace owner session |
When creating an environment, you can include cluster with a region slug or short code. Omit it to use the default region. The region is fixed after creation. Deleting a project's last environment returns 409 Conflict.
List projects
GET {BASE}A project token sees its scoped project. A signed-in member can list projects in the workspace.
curl --fail-with-body "$BASE" \
-H "Authorization: Bearer $SIMPLIFYD_API_TOKEN"const response = await fetch(`${BASE}`, {
headers: {
Authorization: `Bearer ${process.env.SIMPLIFYD_API_TOKEN}`,
},
});
const result = await response.json();
if (!response.ok) throw new Error(result.message ?? response.statusText);Response
200 OK.
[
{
"workspace": "0192e7a0-55c1-7b3e-8f2d-4a1b6c9d0e12",
"name": "My app",
"slug": "0192e7a0-55c1-7b3e-8f2d-4a1b6c9d0e13",
"network_slug": "x4r9pk2",
"envs": [
{
"name": "dev",
"slug": "0192e7a0-55c1-7b3e-8f2d-4a1b6c9d0e14",
"network_slug": "m3rq7"
}
]
}
]Read a project
GET {BASE}/{project}Use the project slug to read its configuration and environments.
curl --fail-with-body "$BASE/$PROJECT" \
-H "Authorization: Bearer $SIMPLIFYD_API_TOKEN"const response = await fetch(`${BASE}/${PROJECT}`, {
headers: {
Authorization: `Bearer ${process.env.SIMPLIFYD_API_TOKEN}`,
},
});
const result = await response.json();
if (!response.ok) throw new Error(result.message ?? response.statusText);Response
200 OK.
{
"workspace": "0192e7a0-55c1-7b3e-8f2d-4a1b6c9d0e12",
"name": "My app",
"slug": "0192e7a0-55c1-7b3e-8f2d-4a1b6c9d0e13",
"network_slug": "x4r9pk2",
"envs": [
{
"name": "dev",
"slug": "0192e7a0-55c1-7b3e-8f2d-4a1b6c9d0e14",
"network_slug": "m3rq7"
}
]
}Create a project
POST {BASE}
Content-Type: application/jsonCreates a project and its first environment. Use the session JWT for this request.
Body
| Field | Description |
|---|---|
name | Required display name. |
curl --fail-with-body -X POST "$BASE" \
-H "Authorization: Bearer $SIMPLIFYD_SESSION_TOKEN" \
-H 'Content-Type: application/json' \
--data '{"name": "My app"}'const response = await fetch(`${BASE}`, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SIMPLIFYD_SESSION_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({"name": "My app"}),
});
const result = await response.json();
if (!response.ok) throw new Error(result.message ?? response.statusText);Response
201 Created.
{
"workspace": "0192e7a0-55c1-7b3e-8f2d-4a1b6c9d0e12",
"name": "My app",
"slug": "0192e7a0-55c1-7b3e-8f2d-4a1b6c9d0e13",
"network_slug": "x4r9pk2",
"envs": [
{
"slug": "0192e7a0-55c1-7b3e-8f2d-4a1b6c9d0e14",
"name": "dev"
}
],
"success": true,
"active_project": "0192e7a0-55c1-7b3e-8f2d-4a1b6c9d0e13",
"active_env": "0192e7a0-55c1-7b3e-8f2d-4a1b6c9d0e14",
"created_at": "2026-01-15T12:00:00Z"
}Use slug as the project ID and active_env as the first environment ID.
Rename a project
PUT {BASE}/{project}
Content-Type: application/jsonUpdates the display name. The project slug stays the same.
curl --fail-with-body -X PUT "$BASE/$PROJECT" \
-H "Authorization: Bearer $SIMPLIFYD_SESSION_TOKEN" \
-H 'Content-Type: application/json' \
--data '{"name": "New name"}'const response = await fetch(`${BASE}/${PROJECT}`, {
method: 'PUT',
headers: {
Authorization: `Bearer ${process.env.SIMPLIFYD_SESSION_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({"name": "New name"}),
});
const result = await response.json();
if (!response.ok) throw new Error(result.message ?? response.statusText);Response
200 OK.
{
"success": true
}Delete a project
DELETE {BASE}/{project}Permanently deletes the project and its services. Use a workspace owner session.
curl --fail-with-body -X DELETE "$BASE/$PROJECT" \
-H "Authorization: Bearer $SIMPLIFYD_SESSION_TOKEN"const response = await fetch(`${BASE}/${PROJECT}`, {
method: 'DELETE',
headers: {
Authorization: `Bearer ${process.env.SIMPLIFYD_SESSION_TOKEN}`,
},
});
const result = await response.json();
if (!response.ok) throw new Error(result.message ?? response.statusText);Response
200 OK.
{
"success": true
}List environments
GET {BASE}/{project}/envsAn environment-scoped token returns only its own environment.
curl --fail-with-body "$BASE/$PROJECT/envs" \
-H "Authorization: Bearer $SIMPLIFYD_API_TOKEN"const response = await fetch(`${BASE}/${PROJECT}/envs`, {
headers: {
Authorization: `Bearer ${process.env.SIMPLIFYD_API_TOKEN}`,
},
});
const result = await response.json();
if (!response.ok) throw new Error(result.message ?? response.statusText);Response
200 OK.
[
{
"name": "dev",
"slug": "0192e7a0-55c1-7b3e-8f2d-4a1b6c9d0e14",
"network_slug": "m3rq7"
}
]Read an environment
GET {BASE}/{project}/envs/{env}Returns the environment and its services when present.
curl --fail-with-body "$BASE/$PROJECT/envs/$ENV" \
-H "Authorization: Bearer $SIMPLIFYD_API_TOKEN"const response = await fetch(`${BASE}/${PROJECT}/envs/${ENV}`, {
headers: {
Authorization: `Bearer ${process.env.SIMPLIFYD_API_TOKEN}`,
},
});
const result = await response.json();
if (!response.ok) throw new Error(result.message ?? response.statusText);Response
200 OK.
{
"name": "dev",
"slug": "0192e7a0-55c1-7b3e-8f2d-4a1b6c9d0e14",
"network_slug": "m3rq7"
}Create an environment
POST {BASE}/{project}/envs
Content-Type: application/jsonUse a token scoped to the whole project or a session JWT.
Body
| Field | Description |
|---|---|
name | Required display name. |
cluster | Optional region slug or short code. The region is fixed after creation. |
curl --fail-with-body -X POST "$BASE/$PROJECT/envs" \
-H "Authorization: Bearer $SIMPLIFYD_API_TOKEN" \
-H 'Content-Type: application/json' \
--data '{"name": "staging"}'const response = await fetch(`${BASE}/${PROJECT}/envs`, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SIMPLIFYD_API_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({"name": "staging"}),
});
const result = await response.json();
if (!response.ok) throw new Error(result.message ?? response.statusText);Response
201 Created.
{
"success": true,
"active_env": "0192e7a0-55c1-7b3e-8f2d-4a1b6c9d0e14"
}Use active_env as the environment ID in subsequent calls.
Rename an environment
PUT {BASE}/{project}/envs/{env}
Content-Type: application/jsonUpdates the environment display name.
curl --fail-with-body -X PUT "$BASE/$PROJECT/envs/$ENV" \
-H "Authorization: Bearer $SIMPLIFYD_API_TOKEN" \
-H 'Content-Type: application/json' \
--data '{"name": "preproduction"}'const response = await fetch(`${BASE}/${PROJECT}/envs/${ENV}`, {
method: 'PUT',
headers: {
Authorization: `Bearer ${process.env.SIMPLIFYD_API_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({"name": "preproduction"}),
});
const result = await response.json();
if (!response.ok) throw new Error(result.message ?? response.statusText);Response
200 OK.
{
"success": true
}Delete an environment
DELETE {BASE}/{project}/envs/{env}Permanently deletes the environment and its services. Use a workspace owner session.
curl --fail-with-body -X DELETE "$BASE/$PROJECT/envs/$ENV" \
-H "Authorization: Bearer $SIMPLIFYD_SESSION_TOKEN"const response = await fetch(`${BASE}/${PROJECT}/envs/${ENV}`, {
method: 'DELETE',
headers: {
Authorization: `Bearer ${process.env.SIMPLIFYD_SESSION_TOKEN}`,
},
});
const result = await response.json();
if (!response.ok) throw new Error(result.message ?? response.statusText);Response
200 OK.
{
"success": true
}Errors
| Status | When |
|---|---|
400 | A required name is missing or the selected region cannot be used. |
401 | The credential is missing or invalid. |
403 | The credential is outside its scope or the caller lacks the required workspace role. |
409 | The environment is the last one in its project. |