You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Protocol Guide uses structured error responses with consistent error codes. All errors include a request ID for debugging and correlation with server logs.
{
"success": false,
"error": {
"code": "CLAUDE_RATE_LIMITED",
"message": "The AI service is temporarily busy. Please try again in a moment.",
"requestId": "req_abc123xyz",
"timestamp": "2026-01-25T10:30:00.000Z",
"retryable": true
}
}
tRPC Error Codes
Authentication Errors
Code
HTTP Status
Description
User Message
UNAUTHORIZED
401
No valid authentication
"Please sign in to continue"
FORBIDDEN
403
Insufficient permissions
"You don't have permission to perform this action"
Validation Errors
Code
HTTP Status
Description
User Message
BAD_REQUEST
400
Invalid input
"Invalid request. Please check your input."
PARSE_ERROR
400
Malformed request body
"Unable to parse request"
Resource Errors
Code
HTTP Status
Description
User Message
NOT_FOUND
404
Resource doesn't exist
"The requested resource was not found"
CONFLICT
409
Resource conflict
"This resource already exists"
Rate Limiting
Code
HTTP Status
Description
User Message
TOO_MANY_REQUESTS
429
Rate limit exceeded
"Too many requests. Please wait and try again."
Server Errors
Code
HTTP Status
Description
User Message
INTERNAL_SERVER_ERROR
500
Unexpected server error
"An unexpected error occurred. Please try again."
TIMEOUT
408
Request timeout
"Request timed out. Please try again."
CLIENT_CLOSED_REQUEST
499
Client disconnected
N/A (client-side)
Custom Error Codes
Claude API Errors
Code
HTTP Status
Retryable
Description
CLAUDE_RATE_LIMITED
429
✅ Yes
Claude API rate limit
CLAUDE_AUTH_ERROR
500
❌ No
API key invalid
CLAUDE_SERVER_ERROR
503
✅ Yes
Claude 5xx error
CLAUDE_OVERLOADED
503
✅ Yes
Claude at capacity
CLAUDE_TIMEOUT
504
✅ Yes
Request timeout
CLAUDE_INVALID_REQUEST
400
❌ No
Bad request to Claude
CLAUDE_API_ERROR
500
✅ Yes
Generic Claude error
Gemini API Errors (Embeddings; Voyage removed 2026-03-24)
Code
HTTP Status
Retryable
Description
GEMINI_RATE_LIMITED
429
✅ Yes
Gemini rate limit
GEMINI_AUTH_ERROR
500
❌ No
API key invalid
GEMINI_SERVER_ERROR
503
✅ Yes
Gemini 5xx error
GEMINI_TIMEOUT
504
✅ Yes
Request timeout
GEMINI_API_ERROR
500
✅ Yes
Generic Gemini error
Security Errors
Code
HTTP Status
Description
CSRF_MISSING
403
CSRF token not provided
CSRF_MISMATCH
403
CSRF token doesn't match
TOKEN_REVOKED
401
Auth token has been revoked
SESSION_EXPIRED
401
Session has expired
Subscription Errors
Code
HTTP Status
Description
SUBSCRIPTION_REQUIRED
403
Feature requires paid subscription
SUBSCRIPTION_EXPIRED
403
Subscription has expired
TIER_LIMIT_EXCEEDED
429
Daily query limit reached
COUNTY_LIMIT_REACHED
400
Max saved counties for tier
Webhook Errors
Code
HTTP Status
Description
WEBHOOK_SIGNATURE_INVALID
400
Stripe signature verification failed
WEBHOOK_ALREADY_PROCESSED
200
Duplicate event (idempotent)
Error Handling Best Practices
Client-Side Error Handling
try{constresult=awaittrpc.query.submit.mutate({ ... });}catch(error){if(error.code==='UNAUTHORIZED'){// Redirect to loginrouter.push('/login');}elseif(error.code==='TOO_MANY_REQUESTS'){// Show rate limit messageconstretryAfter=error.data?.retryAfter;showToast(`Please wait ${retryAfter} seconds`);}elseif(error.code==='SUBSCRIPTION_REQUIRED'){// Prompt upgradeshowUpgradeModal();}elseif(error.data?.retryable){// Retry with backoffawaitretryWithBackoff(()=>trpc.query.submit.mutate({ ... }));}else{// Show generic error with request IDshowError(`Error: ${error.message} (ID: ${error.data?.requestId})`);}}
BAD_REQUEST (400)
├── Missing required field
├── Invalid field format
├── Value out of range
└── Invalid enum value
PARSE_ERROR (400)
├── Invalid JSON
├── Encoding error
└── Malformed body
Category: Rate Limits (429)
TOO_MANY_REQUESTS (429)
├── IP rate limit
├── User minute limit
├── User daily limit
└── Endpoint-specific limit
Category: External Services (5xx)
SERVICE_UNAVAILABLE (503)
├── Claude API unavailable
├── Gemini API unavailable
├── Database connection failed
└── Redis unavailable
GATEWAY_TIMEOUT (504)
├── Claude timeout
├── Gemini timeout
└── Database timeout