Errors
The Prop AI Deals API uses standard HTTP status codes. Every error response has the same JSON shape so your error handler only needs to be written once.Error response format
error.code— Stable machine-readable string. Switch on this in code.error.message— Human-readable explanation. Show in UI / log to console.- Additional fields — Some errors include extra context (e.g.
retry_after,required_scope).
HTTP status codes
| Status | Meaning |
|---|---|
200 | Success |
400 | Malformed request — fix and retry |
401 | Authentication failed — check your API key |
403 | Authenticated, but key lacks the required scope |
404 | Resource not found |
422 | Validation error — request body or query params invalid |
429 | Rate limit or quota exceeded — back off and retry |
500 | Internal server error — usually transient, retry with backoff |
502 | Upstream bad gateway — retry |
503 | Service temporarily unavailable — retry with backoff |
Error codes
invalid_api_key — 401
The Authorization header is missing, malformed, or the key has been revoked / expired.
Authorization: Bearer paid_.... Check the key hasn’t been revoked in the dashboard.
insufficient_scope — 403
Your key is valid, but its plan doesn’t grant access to this endpoint.
rate_limit_exceeded — 429
You’re sending requests faster than your plan’s per-second limit allows.
retry_after seconds and retry. Implement client-side throttling. See Rate limits.
monthly_quota_exceeded — 429
You’ve reached your plan’s hard monthly request limit. There is no 2× soft/hard split — once you hit the number printed in X-Monthly-Limit, every subsequent request is rejected until the next calendar month rolls over.
/dashboard/api (takes effect immediately after Stripe charges succeed), or wait until the first of next month when usage counters reset.
ai_chat_quota_exceeded — 429
AI chat endpoints (/api/v1/ultimate-ai/*) have a separate monthly quota that’s been used up.
403 insufficient_scope on AI endpoints instead.
Fix: Upgrade to Professional (2,500 AI chats/month) or Business (15,000 AI chats/month). Non-AI endpoints continue to work normally until your main monthly quota is also exhausted.
endpoint_not_in_public_api — 403
You tried to call an internal endpoint (like /api/v1/api-keys or /api/v1/dashboard/*) with a paid_* API key. The public API exposes only the routes listed in the API reference — dashboard and billing endpoints require a Clerk session token, not an API key.
api@propaideals.co.uk.
Service temporarily busy — 503
The API server rejected your request because its database connection pool was at >85% capacity. This is a protective fast-fail under high concurrent load, not a quota or auth error.
Retry-After: 2 header. 503s do not count against your monthly quota — we only charge successful handler executions.
Fix: Retry after retry_after seconds with exponential backoff. If you see sustained 503s, you’re pushing concurrent load higher than your plan’s capacity — throttle client-side.
validation_error — 422
The request body or query string failed validation.
not_found — 404
The resource ID doesn’t exist or has been deleted.
internal_error — 500
Something went wrong on our side. We’re already alerted.
meta.request_id.
Recommended retry policy
Implement exponential backoff with jitter for429, 500, 502, and 503. Don’t retry 400, 401, 403, 404, or 422 — they will fail the same way every time.
Getting help
Every response includes a uniquemeta.request_id. Include it when you contact support:
api@propaideals.co.uk