Free tier
Search endpoints (/v1/search/rentals, /v1/search/sales), areas (/v1/areas), market routes, and the photo proxy (/v1/photos/{key}) work without an API key and use the Free tier limits of 10 requests/minute and 100 requests/month per IP. The public /v1/health endpoint is also available without authentication, but it is outside Borough’s metered quota and rate-limit middleware.
Paid plans
All paid tiers include automatic data freshness on property and building detail: when cached data is past your tier’s threshold, the API returns it immediately with
"source": "stale" and queues a background refresh, so a later request can get fresher data. Search is different: search results are kept current by the scheduled crawl, so "source": "stale" on a search response is a freshness signal only and does not queue a refresh. Check the response’s source and dataAge to see how fresh a given result is, and see Data freshness for the per-tier thresholds.
Live data is best-effort. Business live-first detail, live events on Pro+ listing streams, background refreshes, and listing-watcher polls all draw on a shared live-fetch budget. While that budget is held for Borough’s scheduled updates, or live fetching is paused, detail routes keep serving cached data ("source": "cached" or "stale"), background refreshes are skipped, listing-watcher polls are skipped without being counted, and a listing stream ends its live attempt with an error event (budget_exceeded or service_disabled) after the cached event.
Watcher limits
Business customers can have up to 50 active watchers:- Listing watchers check the live listing on every poll, so at most 5 can be active, and their
pollIntervalminimum and default is 3,600 seconds (1 hour). - Building and search watchers poll Borough’s own data, with a minimum
pollIntervalof 300 seconds and a default of 900. - A search watcher’s filters can match at most 500 active listings. Broader filters are refused with
400 INVALID_PARAMSwhen the watcher is created or resumed; narrow them withareas,minPrice/maxPrice,beds,listingType, orbuildingType.
429 QUOTA_EXCEEDED, resuming one past a cap returns 400, and a pollInterval below the minimum returns 400.
Overage billing
When you exceed your included monthly quota, requests continue to flow instead of being blocked immediately. Each additional request is billed at the overage rate for your tier, up to the monthly overage cap. How it works:- Your included quota is consumed first (no overage charges)
- Once the base quota is exhausted, each additional request incurs the overage rate
- The hard limit is your base quota plus the maximum extra requests before hitting the dollar cap
- Example: Starter gets 5,000 included + 10,000 overage (0.005) = 15,000 total
- Once the hard limit is reached, requests return
429 QUOTA_EXCEEDED - Free anonymous quotas reset on the 1st of each calendar month
- Paid quotas and overage counters reset with your Polar subscription billing period
X-Quota-* headers on metered responses. They are absent on the never-counted control calls below (PATCH and DELETE on watchers and webhooks, GET /v1/usage) and on requests rejected before metering, such as authentication errors. Paid tiers also receive X-Quota-Overage-Limit showing the hard limit.
What counts as a request
- Only successful (
2xx) responses count. A request that fails is not charged. POST /v1/property/batchcounts one request per unique ID (up to 50 IDs per call on Starter, 500 on Pro and Business).- Each photo (
GET /v1/photos/{key}) counts as one request, including repeat downloads of the same image, so cache photos you have already fetched. Keyless photo requests count against the Free tier’s per-IP allowance. - Each watcher poll counts as one request, and a watcher is paused when you reach your hard limit. Over 30 days a listing watcher at its 1-hour interval uses about 720 requests, and a building or search watcher about 2,880 at the 15-minute default or 8,640 at the 5-minute minimum. A listing-watcher poll that is skipped because live fetching is held back or paused is not counted.
- Each watcher stream connection counts as one request. Streams reconnect about every 5 minutes, so one kept open continuously costs about 8,640 requests per 30 days. See Streaming.
- Updating, pausing, or deleting a watcher or webhook (
PATCHorDELETEon/v1/watchers/{id}and/v1/webhooks/{id}) andGET /v1/usageare never counted. - All API keys on one subscription share a single quota counter.
Subscribe
Click below to choose your plan and complete checkout. YourBOROUGH-<uuid> license key is delivered immediately.
Get API Key
After subscribing, your license key will be emailed to you and you’ll be redirected to the quickstart guide to make your first request.