Error codes
Every error from the API, CLI, MCP and your app’s runtime is JSON with a code, a message that says what to do, and a docsUrl pointing at one of these pages.
Requests and sign-in
| Code | HTTP | Retrying helps |
|---|---|---|
validation_failed |
400 | After changing the request |
confirmation_required |
400 | After changing the request |
unauthenticated |
401 | After changing the request |
checkout_required |
403 | After a plan, setting or role change |
forbidden |
403 | After a plan, setting or role change |
two_factor_required |
403 | After changing the request |
not_found |
404 | After changing the request |
conflict |
409 | After changing the request |
method_not_allowed |
405 | After changing the request |
rate_limited |
429 | Yes, after the wait |
feature_unavailable |
501 | After a plan, setting or role change |
internal_error |
500 | Yes, shortly |
End-user sign-in
| Code | HTTP | Retrying helps |
|---|---|---|
invalid_credentials |
401 | After changing the request |
email_not_verified |
403 | After a plan, setting or role change |
email_taken |
409 | After changing the request |
invalid_token |
400 | After changing the request |
sign_in_locked |
429 | Yes, after the wait |
sign_in_backoff |
429 | Yes, after the wait |
bot_check_failed |
403 | After changing the request |
user_banned |
403 | After a plan, setting or role change |
auth_method_disabled |
403 | After a plan, setting or role change |
auth_not_deployed |
501 | After a plan, setting or role change |
Account state
| Code | HTTP | Retrying helps |
|---|---|---|
account_locked |
402 | After a plan, setting or role change |
account_suspended |
403 | After a plan, setting or role change |
account_cancelled |
402 | After a plan, setting or role change |
Plan counts
| Code | HTTP | Retrying helps |
|---|---|---|
plan_limit_reached |
403 | After a plan, setting or role change |
downgrade_blocked |
409 | After a plan, setting or role change |
add_on_in_use |
409 | After a plan, setting or role change |
add_on_not_available |
403 | After a plan, setting or role change |
engine_not_on_plan |
403 | After a plan, setting or role change |
postgres_engine_required |
409 | After a plan, setting or role change |
extension_not_supported |
400 | After changing the request |
extension_in_use |
409 | After a plan, setting or role change |
parked_slots_full |
403 | After a plan, setting or role change |
park_blocked |
409 | After changing the request |
Usage limits
| Code | HTTP | Retrying helps |
|---|---|---|
requests_capped |
429 | Yes, after the wait |
cpu_capped |
429 | Yes, after the wait |
database_storage_full |
507 | After a plan, setting or role change |
d1_size_limit |
507 | After a plan, setting or role change |
parked_limit_reached |
429 | After a plan, setting or role change |
parked_storage_full |
507 | After a plan, setting or role change |
file_storage_full |
507 | After a plan, setting or role change |
email_quota_exceeded |
429 | Yes, after the wait |
postgres_read_only |
429 | Yes, after the wait |
mau_capped |
403 | Yes, after the wait |
realtime_capacity |
503 | Yes, after the wait |
vector_records_capped |
507 | After a plan, setting or role change |
| Code | HTTP | Retrying helps |
|---|---|---|
email_sending_suspended |
403 | After a plan, setting or role change |
email_rate_limited |
429 | Yes, after the wait |
email_too_many_recipients |
400 | After changing the request |
email_send_failed |
502 | Yes, shortly |
email_appeal_not_open |
409 | After a plan, setting or role change |
Sender domains
| Code | HTTP | Retrying helps |
|---|---|---|
email_domain_invalid |
400 | After changing the request |
email_domain_not_verified |
422 | After a plan, setting or role change |
AI gateway
| Code | HTTP | Retrying helps |
|---|---|---|
ai_user_cap_reached |
429 | Yes, after the wait |
ai_project_cap_reached |
429 | Yes, after the wait |
ai_credit_exhausted |
402 | After a plan, setting or role change |
Projects and domains
| Code | HTTP | Retrying helps |
|---|---|---|
not_deployed |
503 | After a plan, setting or role change |
project_provisioning |
409 | Yes, after the wait |
project_deleted |
410 | After a plan, setting or role change |
project_archived |
409 | After a plan, setting or role change |
archive_blocked |
409 | After changing the request |
no_free_slot |
403 | After a plan, setting or role change |
export_expired |
410 | After changing the request |
domain_taken |
409 | After a plan, setting or role change |
Outbound requests
| Code | HTTP | Retrying helps |
|---|---|---|
outbound_blocked |
403 | After changing the request |
edge_unavailable |
503 | Yes, shortly |
Sandboxes
| Code | HTTP | Retrying helps |
|---|---|---|
sandbox_rate_limited |
429 | Yes, after the wait |
sandbox_expired |
410 | After a plan, setting or role change |
Cron
| Code | HTTP | Retrying helps |
|---|---|---|
cron_timeout |
504 | After changing the request |
cron_interval_too_short |
422 | After changing the request |
Imports
| Code | HTTP | Retrying helps |
|---|---|---|
import_source_unreachable |
502 | After changing the request |
import_blocked |
422 | After changing the request |
import_running |
409 | Yes, after the wait |
import_expired |
409 | After a plan, setting or role change |
Deploys and migrations
| Code | HTTP | Retrying helps |
|---|---|---|
deploy_failed |
422 | After changing the request |
destructive_migration |
409 | After changing the request |
migration_failed |
422 | After changing the request |
migration_conflict |
409 | After changing the request |
bundle_too_large |
413 | After changing the request |
assets_too_large |
413 | After changing the request |
assets_missing |
409 | After changing the request |
publish_too_large |
413 | After changing the request |
deploy_blocked_by_scanner |
422 | After changing the request |
As Markdown: errors.md