Skip to main content

What does an error look like?

Every error uses the same envelope, described in the API introduction. The HTTP status tells you the category, code is a stable string safe to branch on, and details — when present — carries the numbers you need to act (a limit, a retry delay, the missing scope).
message is for humans and can change; never branch your code on it. For deploy and runtime problems that don’t come from the API itself (crash loops, missing dependencies, OOMKilled), see Common Errors — this page only covers the stable code values the API answers with.
VALIDATION_ERROR (400) covers request-shape problems across every route — a required field missing, the wrong type, an out-of-range value. details.path names the offending field, e.g. "memory" or "user.name".

Auth & API keys

Plans & billing

Applications

Build failure codes

When a build or install fails, GET /v1/apps/{id} returns the code in last_build_error (null after a successful build); the detail is in the application’s logs.

Web Analytics

Deploy & GitHub

Files

Blob Storage

Reused codes: VALIDATION_ERROR, PLAN_RESTRICTED_FEATURE, RATE_LIMIT_EXCEEDED (with retry_after, also used for the one-upload-per-second limit below Business), API_KEY_SCOPE_DENIED, WORKSPACE_PERMISSION_DENIED and INVALID_CUSTOM_DOMAIN_FORMAT.

Network & domains

Databases

Environment variables

Snapshots

Custom Docker images

See Custom Docker images.

Templates

Deploying a template is asynchronous; failures arrive in the deploy job and its events. See Template errors.

Stacks

Changes that can alter variables or certificates return restart_required and apps_to_restart: see Create Stack.

Workspaces

Rate limits & quotas

See rate limits for the full breakdown of budgets per plan.

General

This catalog lists every code from the public API contract. A route can still answer other standard HTTP errors (like a generic 404 for an unknown path) that don’t carry one of these code values.
Last modified on November 8, 2026