Projects
Project endpoints live under /projects on the v1 API. Every call is scoped to the organization behind your credential; there is no organization parameter to pass.
The project resource
Every endpoint on this page returns this shape, either alone under data or as an array of them.
| Parameter | Type | Description |
|---|---|---|
| id | string | Project identifier. |
| org_id | string | Owning organization. Output only — it is derived from your credential, never sent. |
| name | string | Display name. |
| slug | string | URL-safe identifier derived from the name. |
| repo_url | string | null | Linked Git repository, or null when none is attached. |
| auto_deploy_branch | string | null | Branch whose pushes trigger a deployment, or null when auto-deploy is off. |
| build_strategy | string | How the project is built. |
| status | string | Lifecycle status. |
| created_at | string | Creation timestamp, ISO 8601. |
List projects
GET /projects returns the projects in your organization. Requires a valid credential; no additional scope.
curl "https://platform.nupaas.com/api/v1/projects?limit=25" \
-H "Authorization: Bearer plat_REPLACE_WITH_YOUR_KEY"| Parameter | Type | Description |
|---|---|---|
| limit | query string | Page size. Sent as a string. Defaults to "25". |
| cursor | query string | Opaque cursor from a previous page's next_cursor. Defaults to empty. |
{
"data": [
{
"id": "prj_REPLACE",
"org_id": "org_REPLACE",
"name": "checkout",
"slug": "checkout",
"repo_url": "https://github.com/example/checkout",
"auto_deploy_branch": "main",
"build_strategy": "dockerfile_buildkit",
"status": "active",
"created_at": "2026-01-14T09:22:31Z"
}
],
"pagination": { "next_cursor": null, "has_more": false }
}Paginate by passing the previous response's pagination.next_cursor back as cursor. Stop when pagination.has_more is false; at that point next_cursor is null. Both limit and cursor are query strings, so send limit=25, not a JSON number.
Create a project
POST /projects. Requires the write scope.
curl -X POST https://platform.nupaas.com/api/v1/projects \
-H "Authorization: Bearer plat_REPLACE_WITH_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"checkout","repoUrl":"https://github.com/example/checkout"}'| Parameter | Type | Description |
|---|---|---|
| name | string | Required. Display name for the new project. |
| repoUrl | string | Optional. Git repository to link. Defaults to an empty string. |
The created project is returned under data.
Get a project
GET /projects/{id}. Requires a valid credential; no additional scope.
curl https://platform.nupaas.com/api/v1/projects/prj_REPLACE \
-H "Authorization: Bearer plat_REPLACE_WITH_YOUR_KEY"A project belonging to a different organization returns 404, not 403 — the API does not confirm that an identifier you cannot reach exists.
Update a project
PATCH /projects/{id}. Requires the write scope. Every field is optional; send only what you are changing.
curl -X PATCH https://platform.nupaas.com/api/v1/projects/prj_REPLACE \
-H "Authorization: Bearer plat_REPLACE_WITH_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"auto_deploy_branch":"main"}'| Parameter | Type | Description |
|---|---|---|
| name | string | Optional. New display name. |
| repo_url | string | null | Optional. Pass null to unlink the repository. |
| auto_deploy_branch | string | null | Optional. Pass null to turn auto-deploy off. |
| build_strategy | string | Optional. Change how the project is built. |
repo_url and auto_deploy_branch accept an explicit null, which is how you clear them. Omitting a field leaves it unchanged; sending null unsets it. The updated project is returned under data.
Delete a project
DELETE /projects/{id}. Requires the write scope.
curl -X DELETE https://platform.nupaas.com/api/v1/projects/prj_REPLACE \
-H "Authorization: Bearer plat_REPLACE_WITH_YOUR_KEY"On success the response body is { "data": "deleted" } — a literal string, not a project object. There is no confirmation step on the API, unlike the CLI, so a client that issues this call deletes immediately.
Environment variables
Environment variables belong to a project and an environment. They are the only supported way to configure a deployment's environment — set them before deploying.
List variables
GET /projects/{id}/env. Requires a valid credential; no additional scope. An optional environment query parameter narrows the result.
curl "https://platform.nupaas.com/api/v1/projects/prj_REPLACE/env?environment=production" \
-H "Authorization: Bearer plat_REPLACE_WITH_YOUR_KEY"Each entry has three fields: key, value and environment. The response uses the list envelope, so it carries a pagination object alongside data.
Set a variable
POST /projects/{id}/env. Requires the write scope. Setting a key that already exists overwrites it.
curl -X POST https://platform.nupaas.com/api/v1/projects/prj_REPLACE/env \
-H "Authorization: Bearer plat_REPLACE_WITH_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"key":"LOG_LEVEL","value":"info","environment":"production"}'| Parameter | Type | Description |
|---|---|---|
| key | string | Required. Variable name. |
| value | string | Required. Variable value. |
| environment | string | Optional. Defaults to production. |
Success returns { "data": "ok" }.
Delete a variable
DELETE /projects/{id}/env/{key}. Requires the write scope. The variable name is a path segment; the environment is a query parameter defaulting to production.
curl -X DELETE "https://platform.nupaas.com/api/v1/projects/prj_REPLACE/env/LOG_LEVEL?environment=production" \
-H "Authorization: Bearer plat_REPLACE_WITH_YOUR_KEY"Success returns { "data": "deleted" }. Because the environment defaults to production, omitting the query parameter deletes the production value — be explicit when you are targeting anything else.