Skip to content

Error Codes

All errors are returned as JSON with an error field:

{
"error": "Human-readable error message"
}
ErrorStatusCause
Missing or invalid parameters400Required query params missing
Only S256 code_challenge_method is supported400Plain PKCE not allowed
Invalid client_id400Project doesn’t exist
Invalid redirect_uri400URI not in project’s allowlist
ErrorStatusCause
Missing client_id400No client_id in body
Rate limited429>20 requests in 60s for this client
Invalid client_id400Project doesn’t exist
Invalid client_secret401Wrong client secret
Missing required fields400Missing code/verifier/redirect_uri
Invalid or expired code400Auth code not found or expired
redirect_uri mismatch400Doesn’t match stored URI
project mismatch400Code issued for different project
PKCE verification failed400Code verifier doesn’t match challenge
Missing refresh_token400No refresh_token in body
Invalid refresh token401Not found, wrong project, or revoked
Refresh token expired401Past expiration date
Account blocked403User blocked in this project
PIN revoked403PIN has been revoked
User not found401User deleted since token was issued
Unsupported grant_type400Not authorization_code or refresh_token
ErrorStatusCause
Missing token or client_id400Required fields missing
ErrorStatusCause
Invalid credentials401Email not found or wrong password
Account blocked403User is blocked in this project
Not a member403User exists but not in this project
Rate limited4295+ attempts in 15 min from this IP
ErrorStatusCause
Invalid PIN401PIN doesn’t match any active project PIN
Rate limited4295+ attempts in 15 min from this IP
ErrorStatusCause
Email already registered409Email exists in the system
Invalid password400Doesn’t meet requirements
Registration closed403Project doesn’t allow new signups
Rate limited4293+ signups in 1 hour from this IP
ErrorStatusCause
Rate limited4293+ sends in 1 hour for this email
Invalid or expired token400Token not in KV (expired/used)
Registration closed403New user + closed registration
ErrorStatusCause
Unauthorized401Missing or invalid Bearer token
Forbidden403Valid token but not admin
Not found404Resource doesn’t exist
Max active PINs reached40010 active PINs already exist

Rate-limited responses include:

HTTP/1.1 429 Too Many Requests
Content-Type: application/json
{
"error": "Rate limited"
}

No Retry-After header is included. Clients should implement exponential backoff.