Skip to main content

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

Error codes

invalid_api_key — 401

The Authorization header is missing, malformed, or the key has been revoked / expired.
Fix: Verify the header is exactly 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.
Fix: Upgrade your plan, or use a different endpoint. See Authentication › Scopes.

rate_limit_exceeded — 429

You’re sending requests faster than your plan’s per-second limit allows.
Fix: Sleep for 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.
This error is NOT transient. Do not retry with backoff — retries will fail with the same error until the billing period resets. Fix: Upgrade your plan at /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.
Every paid tier includes AI chat: Starter 100/month, Professional 1,000/month, Business 4,000/month. Fix: Upgrade for a higher AI chat quota, or wait until the first of next month when usage counters reset. 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.
Fix: Check the supported endpoint list. If you need the requested endpoint exposed publicly, email info@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.
The response includes a 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.
Fix: Check the endpoint reference for valid field types and ranges.

not_found — 404

The resource ID doesn’t exist or has been deleted.
Fix: Check the ID. Property IDs are UUIDs.

internal_error — 500

Something went wrong on our side. We’re already alerted.
Fix: Retry with exponential backoff. If it persists, contact support with your meta.request_id. Implement exponential backoff with jitter for 429, 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 unique meta.request_id. Include it when you contact support:
Email: info@propaideals.co.uk