Skip to main content

Rate limits

The Prop AI Deals API enforces three types of limits on every paid_* request:
  1. Per-second rate limit — Sliding-window counter, rejects with 429 when exceeded
  2. 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.
  3. AI chat quota — Separate quota for AI endpoints (which also cost 5× normal requests against your monthly quota)
All limits are per account (not per IP, not per key). Your subscription buys one shared pool: every API key you create draws from the same per-second rate limit, monthly request quota, and AI chat quota. Creating more keys does not increase your limits. MCP tool calls (the Claude connector) draw from the same monthly pool as your REST keys.

Plan comparison

A credit is one standard request; heavier endpoints consume more per call (see request cost by endpoint). There is a free tier. Every account can create an API key on the Free plan — 200 credits a month at 2 req/s, no card required — with the properties:read, market-data:read, areas:read, and epc:read scopes. That covers listing search, valuations, comparables, sold prices, area statistics, and EPC lookups. AI chat is included from the Growth plan up; the Advanced plan and above add investment calculators, spatial search, planning / flood-risk / heritage data, and lead generators; Professional and Business additionally include build-cost:read. For any plan, the live scope list is always GET /api/v1/api-billing/plans. Advanced is the plan previously sold as Starter. Same £99 price, limits, and scopes — only the name changed when the £29 Starter and £59 Growth tiers were introduced. Existing subscriptions are unaffected. Starter and Growth are rolling out now. They are priced from £29/mo and £59/mo and appear at checkout as soon as they go live on your dashboard. If you don’t see them yet, start on Free (no card needed) or pick Advanced. 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 with 429 rate_limit_exceeded:
Sleep for retry_after seconds and retry. See retry policy.

Monthly request quota — HARD cap

The plan’s monthly_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
Once you’ve consumed the full quota, every subsequent request returns 429 until the calendar month rolls over or you upgrade your plan.
We recommend setting up alerts at 80% of your monthly quota so you have time to upgrade before hitting the cap. Monitor 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:
  1. 5 requests from the monthly request quota (AI requests cost 5×)
  2. 1 AI chat call from the separate AI chat quota
When the AI quota is exhausted: 429 ai_chat_quota_exceeded. Non-AI endpoints continue to work normally until the main monthly quota is also exhausted.
AI chat is included from the Growth plan up — Growth 25 chats/month, Advanced 100, Professional 1,000, Business 4,000. Free and Starter do not include AI chat. When the AI quota is exhausted the AI endpoints return 429 ai_chat_quota_exceeded; all other endpoints keep working until the main monthly request quota is also used up.

Request cost by endpoint

Most endpoints cost 1 request against your monthly quota. Some cost more: The X-Request-Cost response header and meta.usage.request_cost tell you exactly what each call consumed. The bundles (/property-pack, /area-summary) cost 10 because they assemble several atomic endpoints in one call — only cheaper than fetching the slices individually when you need most of them.

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.
Recommended handling: retry after 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:
The same data appears in the response envelope:

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.
Leave 10–20% headroom below your nominal limit to absorb clock skew and transient bursts.

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 in GET /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.