Login passed step one; a TOTP code is needed to complete the session.
invalid_two_factor_code
The TOTP code was wrong or expired.
session_expired
The session cookie is no longer valid. Log in again.
invalid_token
Short-lived opaque token (email verification, password reset, OAuth state, 2FA temp) was invalid or expired. Distinct from session_expired on purpose: don't bounce the user to /login on a stale reset link.
credential_expired
The API key is genuine but past its expires_at. Create a new key.
In the organization, but without the permission the route needs. details.permission names it; for relationship rules (handing out the owner role) details.required_role does. Also answered when an API key was not issued for this organization.
Answered with 402. The permission was there; what the organization is on does not cover the action. Creating a productionapplication, or promoting a development one to production, is the route a script meets these on. A development application is free and takes no slot.
Code
Meaning
billing_required
No active subscription, valid trial, or free plan. Nothing to create against.
trial_expired
The trial has lapsed and no payment has taken its place.
app_limit_reached
The plan's production application slots are used up. Buy a slot, upgrade, or create the application as development.
billing_disabled
Billing is switched off platform-wide. Nothing for the caller to fix.
Always include the request_id when you contact support. It lets us pull the matching server log in seconds. Without it, debugging starts from "describe what time it happened roughly," which is much slower.
The request ID is on:
the X-Request-ID response header,
error.request_id in the JSON body,
the response of every successful request too (for chain correlation).
404 is intentionally ambiguous. "I can't see this resource" and "this resource doesn't exist" both return 404. We don't want to leak existence to unauthorized clients.
Validation errors stop at the first failure. A payload with two bad fields reports one. Fix and resend to see the next.