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 capsules. 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 desk 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 desk 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 desk named ambiguously across teams answers more than one desk is named {name}; name it as team/{name} as plain text (api/desks.rs:273).
Lifecycle conflicts
All 409, plain text unless noted.
| Body | When |
|---|---|
the storage pool is full; retry later or ask an operator | A create, a restore, a clone or a push that the shared storage pool cannot hold. |
a snapshot is already being cut for this workspace | A second snapshot while one is in flight. |
this snapshot is the base of {kind} {display} | Deleting a snapshot a workspace or environment was built from. |
this snapshot is where {kind} {display} stands now (its latest push) | Deleting the latest push of a workspace or environment. |
a sync point cannot be deleted by hand | Deleting the internal copy that a clone makes. |
the volume still has a workspace or environment | Deleting a volume that still has a working copy. |
this desk has no environment; connect one with PUT /v1/desks/{id}/environment | A desk route that needs an environment on a desk without one. |
that workspace is in desk {name}; remove it there first | Adding a workspace that belongs to another desk. |
conflict, retry / the desk changed; retry / the workspace was changed while this was being written; try again | Another write won; repeat the call. |
Capsule routes answer 409 and 422 in JSON (api/capsules/mod.rs:97-103); their wording is on the capsule reference.
Named volumes
Plain text unless noted. The first four rows are the answers of a push. The capsule 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 capsule did not exit 0; nothing was saved | The job did not succeed, so it saves nothing. |
the job's capsule is gone; nothing was saved | The capsule ended before the save. |
the job's capsule was saved by another job; nothing was saved | Another job already saved this capsule. |
the job's capsule does not save to {target}; nothing was saved | The capsule 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, capsule 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 kd git-credential: {sentence}, and git then fails the command. In a device workspace the helper writes kode git-credential: {sentence}.
| 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 or capsule of a paused or removed member asks for a credential. |
403 | this device is disabled | A device workspace asks while its device is disabled. |
409 | the workspace is stopped | A device workspace asks after it stopped or while it is deleted. |
404 | {host} is not a git host Kode 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 capsule is over | The request comes after the capsule 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.