Band 1 · under 100 RPM
These cut off first
Bar length vs HUD / Nominatim at 60 RPM. AirNow’s hourly cap is ~8 requests per minute.
Internal briefing · engineering / product
Vendors publish different units. Converted to requests per minute, the first cutoffs are AirNow (~8), Firecrawl Free (10), Gemini Free (10), Jina keyless (20), then Nominatim and HUD (60). Claude Start (1,000) is not the bottleneck.
13 August 2026
Vendor docs, not live dashboards.
Bars are linear inside each band so a 10 RPM cap is not a 1-pixel sliver next to a 6,000 RPM cap.
Capacity warning You will get cut off under a traffic spike
Same unit
A home report is not one API call. It geocodes, then fans out Census, HUD, Walk Score, AirNow, RentCast, amenities, and a listing scrape. Ten users clicking Generate is tens to hundreds of overlapping requests.
The bars below use Rivvl’s current cheap/free-tier number where a plan exists. Length is relative to the largest bar in that band — not across the whole page.
Band 1 · under 100 RPM
Bar length vs HUD / Nominatim at 60 RPM. AirNow’s hourly cap is ~8 requests per minute.
Band 2 · 100 to 1,000 RPM
Bar length vs Claude Start at 1,000 RPM. RentCast’s rate is in the next band; its monthly quota is the real cheap-plan killer.
Band 3 · 1,000+ RPM
Bar length vs Google Places / Stripe at 6,000 RPM. RentCast is 20 req/s on every plan — Developer still dies at 50 calls/month.
In flight
Most vendors publish a rate, not overlapping sessions. These four publish a true in-flight cap. Each square is one overlapping job. Ten squares is a busy moment on the product.
2 of 10 slots · listing scrape
2 of 10 slots · scrape failover
5 of 10 slots · last-resort scrape
5 of 10 slots · hidden brake on reports
Claude does not sell a concurrent-session number — it uses RPM plus token buckets. Stripe has a separate concurrency limiter whose global number is unpublished. Everyone else: not published.
One row each
Same facts as the bars, in a table. RPM is the published cap converted to requests per minute so rows compare. “Buy more?” means a higher vendor plan raises that cap.
| Provider | Published | In RPM | Concurrent | Buy more? | Risk |
|---|---|---|---|---|---|
| AirNow | 500 / hour | 8 | Not published | No | High |
| Gemini Flash Free | 10 / min | 10 | Not published | Yes · paid tier | High |
| Firecrawl Free | 10 scrapes / min | 10 | 2 browsers | Yes | Medium |
| Jina Reader keyless | 20 / min | 20 | 2 | Yes · add a key | High |
| Nominatim | 1 / second | 60 | 1 thread | No | High |
| HUD User | 60 / min | 60 | Not published | No | Medium |
| ATTOM | 200 / min | 200 | Not published | Yes | OK |
| PostHog analytics | 240 / min | 240 | Not published | n/a | OK |
| Auto.dev Starter | 5 / second | 300 | Not published | Yes | Medium |
| OpenWeather Startup | 600 / min | 600 | Not published | Yes | Medium |
| Claude Start | 1,000 / min | 1,000 | Not published | Yes | OK |
| RentCast | 20 / second | 1,200 | Not published | Rate no · quota yes | Medium |
| NHTSA vPIC | 1,000–2,000 / min | ~1,500 | Not published | No | OK |
| Google Geocoding | 3,000 / min | 3,000 | Not published | Yes | OK |
| Google Places | 6,000 / min | 6,000 | Not published | Yes | OK |
| Stripe live | 100 / second | 6,000 | Unpublished limiter | n/a | OK |
| Walk Score | Daily quota | — | Not published | Maybe | High |
| Census Data API | No RPS with key | — | Not published | No | Medium |
| HERE Geocoding | Plan-specific | — | Not published | Yes | Unknown |
| EPA Envirofacts | None published | — | Not published | No | Unknown |
| FuelEconomy.gov | None published | — | Not published | No | Unknown |
| Scrape.do Free | 1,000 credits / mo | — | 5 | Yes | Medium |
| Inngest Free | No function rateLimit | — | 5 steps | Yes | Medium |
| Brevo | Plan + endpoint | — | Not published | Yes | OK |
Different clock
A high per-minute rate can still die on a small pool. Bars vs 1,000 calls (Auto.dev / Scrape.do Free).
Walk Score is also a daily pool (status 41) — exact size is issued with the key. Claude Start’s real ceiling is often the $500/month spend cap, not 1,000 RPM.
Load shape
Rivvl has no global concurrency governor. Inngest Free hides the pile-up: only 5 function steps run, so downstream APIs see a queue. On Inngest Pro (200+ steps) the free public APIs become the bottleneck instead.
Fine. Nothing queues. Claude Start is nowhere near its cap.
Only 2 listing scrapes in parallel. The rest wait. Jina failover is 20 RPM if Firecrawl is down.
Report jobs themselves queue. Downstream APIs see at most ~5 overlapping generations.
Nominatim 1 rps, HUD 60/min, AirNow hourly, Walk Score daily, Jina 20 RPM.
Published limits
Claude, Firecrawl, RentCast, Google Maps/Places can be raised with a higher plan. You get 429s, then you pay more.
Nominatim, NHTSA, Census, HUD, AirNow, EPA, FuelEconomy have no subscription to buy. They throttle, go dark for an hour, or ban the IP.
| Provider | Role | Used for | Auth | Rate limit | Concurrent limit | Cut off? | Risk |
|---|---|---|---|---|---|---|---|
| Anthropic Claude | Primary | Report write-up, chat, listing extract | Paid API key · org usage tier | Start (Sonnet 4.x): 1,000 RPM / 2M ITPM / 400k OTPM. Build: 5,000 / 5M / 1M. Scale: 10,000 / 10M / 2M. Haiku shares a separate model bucket. | Not published. Token-bucket; a 60 RPM cap can be enforced as ~1 req/s. Bursts 429. | 429 + retry-after. Monthly spend cap: Start $500, Build $1,000, Scale $200k. | OK |
| Google Gemini | Backup | AI failover when Claude fails | API key · project tier in AI Studio | Official docs: limits are project-specific in AI Studio (RPM / TPM / RPD). Google staff table (2025) for 2.5 Flash Free: 10 RPM, 250k TPM, 250 RPD. Tier 1 Flash: 1,000 RPM / 10,000 RPD. Free tier is best-effort and can change. | Not published (RPM/RPD only). | 429 when any of RPM/TPM/RPD is hit. Free RPD resets midnight Pacific. | High |
| Provider | Role | Used for | Auth | Rate limit | Concurrent limit | Cut off? | Risk |
|---|---|---|---|---|---|---|---|
| Firecrawl | Primary | Vehicle + home listing scrape | API key · plan | /scrape RPM: Free 10, Hobby 100, Standard 500, Growth 5,000, Scale 10,000. | Concurrent browsers: Free 2, Hobby 5, Standard 50, Growth 100, Scale 150+. Extra jobs queue; max queued Free/Hobby 50,000. | Queue then 429 if queue is full. Queue wait counts against request timeout (max 48h). | Medium |
| Jina Reader (r.jina.ai) | Backup | Scrape failover (no API key in Rivvl) | Keyless (IP) unless a key is added | Reader: no key 20 RPM; free key 500 RPM; paid key 500 RPM; premium 5,000 RPM. | Jina FAQ (all APIs): Free 2, Paid 50, Premium 500 concurrent. | 429 when RPM or TPM hits first. Keyless is per IP — Vercel egress shares one pool. | High |
| Scrape.do | Backup | Last-resort listing scrape | Token · plan | Credit-based (Free 1,000 successful credits/mo). No separate public RPM table. | API concurrency: Free 5, Hobby 5, Pro 15, Business 40, Advanced 200. Async pool is extra (~30% of plan). | 429 when concurrency is full. Credits exhaust = no more successful scrapes that month. | Medium |
| Provider | Role | Used for | Auth | Rate limit | Concurrent limit | Cut off? | Risk |
|---|---|---|---|---|---|---|---|
| RentCast | Primary | Home value / rent / property data | API key · all plans | Hard cap 20 requests/second per API key on every plan. Monthly quota is plan-based (Developer free tier is 50 calls/month). | Not published separately from the 20 rps cap. | 429 auth/rate-limit-exceeded. Monthly quota is the real cutoff on cheap plans. | Medium |
| ATTOM | Backup | Property data if RentCast fails | API key · monthly plan | 200 calls/minute (only published time-window cap). Monthly base 1,000–1,000,000 then overage. | Not published. | Minute cap + monthly quota. Overage billed rather than hard stop on some plans. | OK |
| Nominatim (OSM) | Primary | First geocode of home addresses | None · public donated servers | Absolute max 1 request/second per application (sum of all users). Bulk scripts: 1 thread, 1 machine; jobs >1 day: 4 req/min. | Bulk: single thread. No distributed clients. | IP/app ban for heavy or systematic use. Commercial geocoding is discouraged. | High |
| HERE Geocoding | Backup | Geocode after Nominatim | API key · HERE plan | Plan-specific. No single public QPS on the open docs (limited plans often ~5 QPS; confirm in HERE dashboard). | Not published as a global number. | 429 / quota errors when plan transactions or QPS are exceeded. | Unknown |
| Google Maps Geocoding | Backup | Geocode fallback | Billed API key | 3,000 QPM (~50/s). No maximum daily request cap if billing is on. | Not published; QPM is the cap. | OVER_QUERY_LIMIT / 429. Repeated abuse can temporarily block the project. | OK |
| Google Places | Primary | Nearby amenities | Billed API key | 6,000 QPM. Per-method quotas on Places (New). | Not published; QPM is the cap. | Quota error / 429. Same abuse block as other Maps APIs. | OK |
| Census Data API | Primary | ACS demographics | Free key required for data queries | 50 variables per query. Older PDF: 500 queries/IP/day without a key. Current guide: key required; no published RPS with a key. | Not published. | Key required. Bureau can monitor and block. Geocoder has no numeric RPS; batch max 10,000 addresses. | Medium |
| HUD User (FMR / LAI) | Primary | Fair market rent | Free token | 60 queries per minute (ToS). | Not published. | Temporary or permanent block if HUD believes limits are exceeded or circumvented. | Medium |
| Walk Score | Primary | Walk / transit / bike score | API key · daily quota | Daily quota exists (status 41). Exact calls/day is not on the public API page — it is issued with the key / trial. | Not published. | Status 41 = daily quota exceeded. Status 42 = IP blocked. | High |
| OpenWeather | Primary | Current weather (2.5/weather) | API key · account plan | Account-level per-minute and daily caps (all keys combined). Paid Startup listed at 600 calls/min. Free-plan RPM is no longer on the public price table (Aug 2026). Docs: do not call the same location more than once / 10 min. | Not published. | 429 then email warning; key can be suspended if you do not upgrade. | Medium |
| AirNow | Primary | AQI observations | Free registered key | Per web-service hourly cap. Commonly documented as 500 requests/hour for most endpoints (CRAN airnow package cites the FAQ). Official FAQ: see each service’s docs; limits cannot be raised. | Not published. | No data until the next hour once the hourly cap is hit. Repeat offenders asked to use file products instead. | High |
| EPA Envirofacts / EJScreen | Primary | Environmental / TRI context | None · public | No published RPS. Queries must finish in under 15 minutes; page for large extracts. | Not published. | Timeout / incomplete results, not a documented 429 table. | Unknown |
| Provider | Role | Used for | Auth | Rate limit | Concurrent limit | Cut off? | Risk |
|---|---|---|---|---|---|---|---|
| NHTSA vPIC | Primary | VIN decode (free, no key) | None · public | No daily quota. FAQ: 1,000–2,000 transactions/minute during business hours (6am–6pm ET). Bulk asked to run nights/weekends. | Not published. Automated traffic control; aggressive use can be throttled. | No hard daily cutoff. Heavy automated traffic can be slowed or blocked. | OK |
| Auto.dev | Backup | VIN / vehicle data failover | API key · plan | Starter 5 rps (1,000 calls/mo). Growth 10 rps. Scale 50 rps. | Not published separately from rps. | 429 RATE_LIMIT_EXCEEDED. Starter also hits monthly 1,000. | Medium |
| FuelEconomy.gov | Primary | MPG / fuel cost | None · public | No published RPM/quota. Free unauthenticated federal service. | Not published. Cache and prefer bulk files for large jobs. | Possible fair-use blocks; not a documented 429 table. | Unknown |
| Provider | Role | Used for | Auth | Rate limit | Concurrent limit | Cut off? | Risk |
|---|---|---|---|---|---|---|---|
| Inngest | Infra | Runs home + vehicle report jobs | Account plan | Function-level rateLimit is optional; Rivvl report functions do not set one. | Max concurrent steps: Free 5, Basic 25, Pro 200+, Enterprise custom. This is the product-level gate for simultaneous reports. | Extra runs wait in queue. They do not all hit downstream APIs at once. | Medium |
| Stripe | Infra | Checkout, credits, refunds | Secret key | Live 100 req/s global; most endpoints 25 req/s. Sandbox 25 req/s global. | Separate concurrency limiter exists (global-concurrency / endpoint-concurrency 429s). Numeric global concurrency is not published. Payouts: 30 concurrent / business. | 429 with Stripe-Rate-Limited-Reason. Unlikely for Rivvl checkout volume. | OK |
| PostHog | Infra | Capture + admin HogQL | Project / personal API key | Public capture (/e) has no request-level rate limit. Analytics GETs: 240/min and 1,200/hour. Query endpoint: 2,400/hour. Other CRUD: 480/min. | Not published. Capture has per-distinct-ID ingestion protection ~5,000 events/min. | Private query APIs 429. Capture still returns 200 when over billing quota (quota_limited in body). | OK |
| Brevo | Infra | Transactional email | API key · plan | Plan + endpoint. Example: POST /v3/smtp/email is in the thousands of RPS on higher plans; contacts often 10–20 RPS. | Not published separately from RPS/RPH. | 429. Not on the report-generation hot path. | OK |
No plan to buy
What to do
Paid APIs can be scaled (higher Firecrawl / Inngest / Claude / RentCast plans). Free public APIs cannot.
Footnotes