Errors
Lists the errors that the API returns and the action to take for each.
Last updated
On this page
Quota
409, plain text. Creating, cloning, restoring or taking a snapshot past a ceiling, or starting a workspace while over the disk ceiling:
{dimension}: {used} of {limit} in use; request more under Quota
{dimension} is workspaces, environments, snapshots, diskGb, cpu, memoryGb or sandboxes. A retry after you free something succeeds. To raise a ceiling, open a quota request; it answers 409 a request is already pending while another of the same kind is open.
Team access
| Status | Body | When |
|---|---|---|
403 | your access to {team} is paused | Your membership is paused. Everything of the team's is refused until an admin unpauses you. |
403 | you are no longer a member of {team} | You were removed from the team and are acting on an object you own there. |
404 | not found | The object does not exist, or is not yours to see. |
The team routes have their own wording; see teams, keys and tokens.
Names
422, JSON. A workspace, environment or session name that breaks the rule:
{"error": "name must be 1-40 lowercase letters, digits or '-', start with a letter, end with a letter or digit, no '--', and not be reserved (ws, env, api, admin, system, kl, bld-*) or look like an id"}
400, plain text. A service name that breaks its rule (reserved words are allowed for services): service name "{name}" must be 1-40 lowercase letters, digits or '-', start with a letter, end with a letter or digit, no '--'.
409, plain text. The name is taken by another of yours:
a workspace named "{name}" already exists herean environment named "{name}" already exists hereyou already have a session named {name} in {team}
409, JSON. The name given matches more than one object you can see. Qualify it as team/name (or ?owner=), or use the id:
{"error": "\"backend\" is ambiguous; qualify it as owner/name", "matches": [{"id": "ws-…", "name": "backend", "team": "acme"}]}A session named ambiguously across teams answers more than one session is named {name}; name it as team/{name} as plain text (api/sessions.rs:273).
Lifecycle conflicts
All 409, plain text unless noted.
| Body | When |
|---|---|
workspace is interrupted: its node is down; it resumes when the node returns | Starting a workspace whose node is down. environment is interrupted: … for an environment, which has no clone fallback. |
the source's node is down and no other node holds a sync point of it yet; nothing can be cloned until one syncs or the node returns | Cloning an interrupted workspace before any other node holds a copy. |
a snapshot is already being cut for this workspace | A second snapshot while one is in flight. |
this snapshot is the base of a running worktree | Deleting a snapshot a running workspace stands on. |
a sync point cannot be deleted by hand | Deleting a platform-cut sync point. |
the volume still has a workspace or environment | Deleting a volume that still has a working copy. |
this session has no environment; connect one with PUT /v1/sessions/{id}/environment | A session route that needs an environment on a session without one. |
that workspace is in session {name}; remove it there first | Adding a workspace that belongs to another session. |
conflict, retry / the session changed; retry / the workspace was changed while this was being written; try again | Another write won; repeat the call. |
Sandbox routes answer 409 and 422 in JSON (api/sandboxes/mod.rs:97-103); their wording is on the sandbox reference.
Named volumes
Plain text unless noted. The first four rows are the answers of a push. The sandbox routes answer in JSON.
| Status | Body | When |
|---|---|---|
422 | volume: this volume has no name yet; name it on its first push | The first push of a volume has no volume. |
422 | volume {name}: … | The name breaks the rule, starts with an id prefix, or is a reserved word. |
409 | volume {name} already exists; delete it first | Another volume of the owner has the name. |
409 | this volume is named {a}, not {b} | A push names a volume that already has another name. |
409 | volume {name} now names another volume; nothing was pushed | The name moved to another volume while the push ran. |
409 | the version counter of {name} is busy; retry | The counter changed five times while this call tried to number its push. Repeat the call. |
404 | volume {name} does not exist | A reference names a volume that the owner does not have. A volume of another owner gives the same answer. |
404 | volume {name} has no version {n} | A name@N reference, or a version route, names a version that does not exist or is not ready. |
404 | volume {name} has no ready version | A name reference, and no version of the volume is ready. |
422 | {ref}: a version is a whole number from 1, written without a leading zero | A reference such as go-base@0 or go-base@01. |
409 | volume {name} is used by {readers} | Deleting a volume that a pipeline or a run reads. |
409 | version {n} of {name} is used by {readers} | Deleting a version that a pipeline or a run reads. |
503 | pipelines cannot be read right now; retry | A delete cannot check the readers, so it deletes nothing. |
A pipeline job that saves a volume ends with one of these sentences as its detail:
| Body | When |
|---|---|
saveTo {name}: the save failed | The platform cut the snapshot and it ended in error. |
saveTo {name}: the save did not finish within 5 minutes | The snapshot was not ready in time. The platform deletes it. |
saveTo {name}: volume {name} was created by another run while this job ran; nothing was saved | Two runs started with no volume of that name, and the other run saved first. |
the job's sandbox did not exit 0; nothing was saved | The job did not succeed, so it saves nothing. |
the job's sandbox is gone; nothing was saved | The sandbox ended before the save. |
the job's sandbox was saved by another job; nothing was saved | Another job already saved this sandbox. |
the job's sandbox does not save to {target}; nothing was saved | The sandbox does not belong to a job that saves to {target}. |
fromSnapshot {name}: volume {name} has no ready version; delete that volume or push to it | The volume exists but holds no ready version. A save never moves a name. |
fromSnapshot {ref}: volume {name} does not exist | The volume was deleted, or a condition skipped the job that makes it. |
fromSnapshot {ref}: volume {name} has no version {n} | The pinned version does not exist at job start. |
Out-of-range values
422. A value outside its bounds (ttl_secs, sandbox timeout_secs, cpu, memory_gb) or a package pin that cannot be resolved. The body names the field and the range, for example ttl_secs must be 600..=2592000 seconds. See limits.
Pipelines
Plain text. A refusal of a definition or a start lists every problem at once, one line each, after its first line.
| Status | Body | When |
|---|---|---|
422 | pipeline {name} is invalid: and one line for each problem | A save of a definition that does not parse, does not validate, names a missing secret or a missing after pipeline. |
422 | pipeline {name} cannot run: and one line for each problem | A start whose inputs or secrets do not fit the version. |
403 | only a team admin can change team pipelines | A team member who is not an admin changes a team pipeline. |
409 | {owner} has 50 pipelines; delete one first / pipeline {name} has 100 versions; delete an old version | A create or a save past a limit. |
409 | pipeline {name} changed; retry | Another save won; repeat the call. |
409 | this run has already finished | A cancel of a finished run. |
The cause and the fix of each sentence are in the troubleshooting tables of Pipelines.
Git credentials
Plain text. The git credential helper writes the sentence to the log of the step as kl git-credential: {sentence}, and git then fails the command.
| Status | Body | When |
|---|---|---|
403 | job {key} did not ask for permissions.git: read | The token names a job whose definition has no permissions.git: read. |
403 | your access to {team} is paused / you are no longer a member of {team} | A workspace, bench or sandbox of a paused or removed member asks for a credential. |
404 | {host} is not a git host Kloudlite answers for | The host is not github.com or the GitLab of the region. |
404 | no git connector of {owner} covers {host}/{repo} | No connected connector of the owner reaches the repository. |
404 | job {key} is not in this run | The token names a job that the run does not have. |
409 | the run is over / job {key} is not running | The request comes after the run or the job ended. |
409 | the sandbox is over | The request comes after the sandbox ended. |
404 | version {n} of {name} is gone | The pipeline version that the run uses was deleted. |
409 | connector {name} is expired / GitHub is not configured / GitLab is not configured | The connector or the provider app cannot make a credential. |
422 | only https is answered / path is not a repository path / the body is not a git credential request | The request is not for an HTTPS repository path. |
429 | too many git credential requests; retry in a minute | The token made more than 60 requests in one minute. |
502 | a fixed sentence of the provider, such as the provider refused the credential | GitHub or GitLab refused to make the credential. |
The cause and the fix of each sentence are in the troubleshooting table of Code in a job.