Projects — NuPaaS Docs
API reference

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.

ParameterTypeDescription
idstringProject identifier.
org_idstringOwning organization. Output only — it is derived from your credential, never sent.
namestringDisplay name.
slugstringURL-safe identifier derived from the name.
repo_urlstring | nullLinked Git repository, or null when none is attached.
auto_deploy_branchstring | nullBranch whose pushes trigger a deployment, or null when auto-deploy is off.
build_strategystringHow the project is built.
statusstringLifecycle status.
created_atstringCreation timestamp, ISO 8601.

List projects

GET /projects returns the projects in your organization. Requires a valid credential; no additional scope.

GET /projects
curl "https://platform.nupaas.com/api/v1/projects?limit=25" \
  -H "Authorization: Bearer plat_REPLACE_WITH_YOUR_KEY"
ParameterTypeDescription
limitquery stringPage size. Sent as a string. Defaults to "25".
cursorquery stringOpaque cursor from a previous page's next_cursor. Defaults to empty.
Response
{
  "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.

POST /projects
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"}'
ParameterTypeDescription
namestringRequired. Display name for the new project.
repoUrlstringOptional. 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.

GET /projects/{id}
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.

PATCH /projects/{id}
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"}'
ParameterTypeDescription
namestringOptional. New display name.
repo_urlstring | nullOptional. Pass null to unlink the repository.
auto_deploy_branchstring | nullOptional. Pass null to turn auto-deploy off.
build_strategystringOptional. 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.

DELETE /projects/{id}
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.

GET /projects/{id}/env
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.

POST /projects/{id}/env
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"}'
ParameterTypeDescription
keystringRequired. Variable name.
valuestringRequired. Variable value.
environmentstringOptional. 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.

DELETE /projects/{id}/env/{key}
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.