Rate limits
The Prop AI Deals API enforces three types of limits on everypaid_* request:
- 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 scope (the AI chat quota scales by tier — see the table above). Professional and Business additionally include build-cost:read.
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
info@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 account in Redis (shared across all your keys). 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.
429 ai_chat_quota_exceeded; all other endpoints keep working until the main monthly request quota is also used up.
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.
Use separate keys per environment
Give production, staging, and CI each their own key so you can revoke or rotate one without disrupting the others, and tell traffic apart inGET /api/v1/api-billing/logs and /usage/daily. Note: all keys on your account share one quota pool — separate keys improve hygiene and attribution, they do not raise your limits, so a runaway CI script still draws down the same monthly quota. Add a client-side throttle to non-production keys if that’s a concern. You can have up to 5 active keys per account.