Rate Limits¶
Robinhood has no documented rate limits. Everything here is based on observed behavior and may change without notice.
Authentication¶
| Behavior | Observed Limit |
|---|---|
| Failed login attempts | 2-3 before lockout |
| Lockout duration | 5-10 minutes |
| Lockout scope | Account-wide (all endpoints) |
| Approval polling | Same rate limit pool as login |
Do not retry failed logins
After a failed login attempt, wait at least 5 minutes before trying again. Rapid retries will lock out your entire account's API access.
Best Practices¶
- One login attempt at a time — never run concurrent logins
- Wait for explicit approval — don't assume device approval succeeded
- Use
pyhood.refresh()— avoids the login flow entirely - If rate limited, stop — wait 5+ minutes, don't keep hitting the endpoint
Market Data¶
| Endpoint | Observed Safe Rate |
|---|---|
| Stock quotes | ~10-20 req/sec |
| Fundamentals | ~10-20 req/sec |
| Options chains | ~2 req/sec (heavier payload) |
| Earnings | ~10 req/sec |
| Positions/Account | ~5 req/sec |
pyhood enforces a 250ms minimum between all requests by default, which keeps you well within safe limits.
How pyhood Handles Rate Limits¶
- Minimum delay — 250ms between all requests (configurable)
- 429 detection — Automatically retries with backoff when rate limited
- Max retries — 2 retries before raising
RateLimitError - Retry-After header — Respected when Robinhood provides it
General Notes¶
- Rate limits appear to be per-account, not per-IP
- 429s during authentication block all API endpoints
- The
Retry-Afterheader is sometimes present, sometimes not - No official documentation exists — these observations may become outdated