Rate limits
The Prop AI Deals API enforces three types of limits on everypaid_* key:
- Per-second rate limit — Sliding-window counter, rejects with
429when exceeded - Monthly request quota — Hard cap at the plan’s
monthly_request_limit. No soft/hard split, no 2× tolerance. Once you hit the cap, requests are blocked until the next billing period. - AI chat quota — Separate quota for AI endpoints (which also cost 5× normal requests against your monthly quota)
Plan comparison
| Plan | Price (GBP/mo) | Requests / month | £/request | Per-second | AI chats / month | Batch limit |
|---|---|---|---|---|---|---|
| Starter | £99 | 20,000 | £0.00495 | 10 req/s | 100 | 100 |
| Professional | £299 | 100,000 | £0.00299 | 25 req/s | 1,000 | 200 |
| Business | £999 | 400,000 | £0.00250 | 50 req/s | 4,000 | 500 |
| Enterprise | Custom | Custom | — | Custom | Custom | Custom |
ai:chat and build-cost:read scopes.
Per-request value: at every tier we’re cheaper per request than the closest UK competitor AND give 20–25× higher per-second rate limits than equivalent tiers at PropertyData.Enterprise plans are custom-provisioned (negotiated limits, dedicated infrastructure, SLAs). Email
api@propaideals.co.uk to discuss.
Live plan details: GET https://api.propaideals.co.uk/api/v1/api-billing/plans
How limits are enforced
Per-second rate limit
Sliding-window counter per key in Redis. If you exceed it, the request fails immediately with429 rate_limit_exceeded:
retry_after seconds and retry. See retry policy.
Monthly request quota — HARD cap
The plan’smonthly_request_limit is a hard ceiling (not a soft target). Example for Professional at 100,000 requests/month:
- Request #99,999 → ✅ 200 OK,
X-Monthly-Usage: 99999 - Request #100,000 → ✅ 200 OK,
X-Monthly-Usage: 100000 - Request #100,001 → ❌ 429
monthly_quota_exceeded
meta.usage.monthly_used on every response, or poll GET /api/v1/api-billing/usage periodically.
AI chat quota
AI endpoints (/api/v1/ultimate-ai/*) consume two budgets simultaneously:
- 5 requests from the monthly request quota (AI requests cost 5×)
- 1 AI chat call from the separate AI chat quota
429 ai_chat_quota_exceeded. Non-AI endpoints continue to work normally until the main monthly quota is also exhausted.
ai:chat scope is only granted to Professional and Business. Sending a paid_* Starter key to /api/v1/ultimate-ai/chat returns 403 insufficient_scope.
Service-level backpressure (503)
During high concurrent traffic, the API server may return 503 Service temporarily busy when its database connection pool is >85% utilized. This is a protective fast-fail to prevent cascade failures — not an authentication or quota error. The response includes a Retry-After: 2 header.
retry_after seconds with exponential backoff. 503s don’t count against your monthly quota — we only increment usage on successful handler execution.
Rate-limit headers
Every successful response includes these headers so you can budget without polling separately:Live usage endpoint
Get the current state of all quotas in one call (uses Clerk session auth, not API key):Best practices
Throttle client-side
Most production traffic is bursty. Add a token-bucket or leaky-bucket throttle so you never hit the per-second limit in the first place.Cache aggressively
Properties don’t change second-to-second. A simple in-memory cache with a 5-minute TTL can cut your bill by 80%+ for read-heavy workloads.Batch where possible
Use the search endpoints (GET /api/v1/properties?area=...&limit=100) instead of N parallel GET /api/v1/properties/{id} calls. One paginated request returns up to 100 properties for the cost of one request — saves 99 quota units and improves latency.
Monitor meta.usage
Log meta.usage.monthly_used on every response. Page yourself when usage crosses 80% of your monthly limit so you can upgrade before hitting the hard cap.
For Professional (100,000 requests/month), 80% = 80,000 requests. At 25 req/s sustained, that’s ~53 minutes. At 5 req/s sustained, that’s ~4.4 hours. Set your alerting accordingly.
Handle 429 and 503 with exponential backoff
Both 429 rate_limit_exceeded (per-second) and 503 Service temporarily busy (server pressure) are transient and should be retried with backoff. 429 monthly_quota_exceeded is NOT transient — don’t retry, upgrade instead.
See Errors › Recommended retry policy for a copy-paste retry helper.