The IBKR TWS API allows your market-data lines divided by 2 requests per second, which is 50 requests per second on the default 100 lines, and it scales up as lines grow (200 lines give 100 per second). On top of that, historical bars of 30 seconds or less carry their own pacing rules: no identical request within 15 seconds, no 6 or more requests for the same contract, exchange and tick type within 2 seconds, and no more than 60 requests in any 10-minute window. Both rules come from IBKR's current TWS API documentation, read 2026-10-1112. What happens on a breach depends on a TWS setting: reject with error 100 (three strikes end the session) or queue and pace automatically3. Compare brokers in the Broker API Comparator.
What is the TWS API request limit?
| Rule | Value | Source |
|---|---|---|
| Requests per second | Market-data lines ÷ 2 | IBKR pacing docs1 |
| Default lines | 100, so 50 requests/second | IBKR pacing docs1 |
| Example with more lines | 200 lines, 100 requests/second | IBKR pacing docs1 |
| FIX through IB Gateway | 250 messages/second | IBKR pacing docs1 |
Only the request that starts a data flow counts: a market-data subscription is one request, however many ticks it delivers afterwards1. IBKR notes that above 50 requests per second "some orders may be queued and delayed" and points heavy users to the FIX API1.
What happens when I exceed it?
TWS and IB Gateway have a Global Configuration setting under API > Settings: "Reject messages above maximum allowed message rate vs applying pacing"3.
- Checked (reject): TWS returns error code 100 for each request over the limit. After three violations the API session terminates, which surfaces as WinError 10053 on Windows or a broken pipe on macOS and Linux3.
- Unchecked (pace): TWS queues the excess and acknowledges requests in the EReader thread before moving on3.
For an unattended agent, pacing is the safer default, but it turns a burst into latency. A client-side token bucket at your limit keeps both behaviours out of the hot path.
What are the historical-data pacing rules?
IBKR's "Pacing Violations for Small Bars (30 secs or less)" page lists three restrictions2:
| Restriction | Threshold |
|---|---|
| Identical historical requests | Not within 15 seconds |
| Same contract, exchange and tick type | Fewer than 6 requests within 2 seconds |
| Requests in any 10-minute period | No more than 60 |
| BID_ASK requests | Count twice |
IBKR states that "these limitations apply to all our clients and it is not possible to overcome them", and suggests a specialized data provider if they do not fit your needs2. The current docs scope these rules to bars of 30 seconds or less. IBKR's older TWS reference, now marked deprecated, also listed a maximum of 50 simultaneous open historical requests4; the current page does not restate that number, so keep concurrency well below it.
How many instruments can I stream at once?
As many as your market-data lines. Every client starts with 100 concurrent lines and never falls below 1005. After the first month the allocation is the greater of monthly commissions divided by 8, equity × 100 / $1,000,000 (rounded down), or 100, so an account with $500 of monthly commissions and $1,245,000 of equity gets 124 lines5. Lines are shared between TWS watchlists and every API connection under the same username6. Because the request limit is lines ÷ 2, buying more lines through commissions or a quote booster also raises your requests per second1.
How do I pull option chains without hitting limits?
Use reqSecDefOptParams. IBKR's option-chain page says that enumerating chains through reqContractDetails with an incompletely defined contract is throttled and slows as the definition becomes more ambiguous, and that reqSecDefOptParams "was introduced that does not have the throttling limitation"7. It returns the expiries and strikes for an underlying; some strike-expiry combinations may not be valid contracts, so validate before subscribing.
How should a compliant client be built?
- One token bucket at your lines ÷ 2 per second for every outbound request.
- A historical queue with a rolling 10-minute counter (cap 60), a per-contract 2-second debounce, a 15-second identical-request guard, and BID_ASK counted twice.
- Pacing mode on in TWS for unattended runs, so a burst queues instead of killing the session.
reqSecDefOptParamsfor chains, neverreqContractDetailsin a loop.- Subscription rotation through your line budget, shared with any TWS watchlists.
For the cost side (the API is free; commissions and market-data subscriptions are not), see Interactive Brokers API Pricing 2026.
Verified figures
The lines ÷ 2 rule, the 100-line default, the 200-line example and the FIX 250 messages/second figure, the reject-versus-pace setting and error 100, the small-bar historical pacing rules, the line-allocation formula and the option-chain guidance were read from IBKR's current TWS API and market-data documentation on 2026-10-11.
Connects to
- Interactive Brokers API Pricing 2026: the cost side of the same API.
- Alpaca vs Interactive Brokers API 2026: pacing versus a flat per-minute cap.
- Choosing a Broker API in 2026: the five-broker pillar.
- Broker API Comparator: rate models side by side.
References
Footnotes
-
Interactive Brokers. "TWS API: Pacing Limitations, Introduction" (maximum requests per second = market-data lines / 2; default 100 lines = 50/second; 200 lines = 100/second; FIX via IB Gateway 250 messages/second). Read 2026-10-11. https://www.interactivebrokers.com/docs/tws-api/doc/pacing-limitations/introduction ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
-
Interactive Brokers. "TWS API: Pacing Violations for Small Bars (30 secs or less)" (15-second identical-request rule; 6 requests per contract/exchange/tick type in 2 seconds; 60 requests per 10 minutes; BID_ASK counted twice). Read 2026-10-11. https://www.interactivebrokers.com/docs/tws-api/doc/market-data-historical/historical-data-limitations/pacing-violations-for-small-bars-30-secs-or-less ↩ ↩2 ↩3
-
Interactive Brokers. "TWS API: Pacing Behavior" (reject vs pace setting; error 100; session ends after three violations). Read 2026-10-11. https://www.interactivebrokers.com/docs/tws-api/doc/pacing-limitations/pacing-behavior ↩ ↩2 ↩3 ↩4
-
Interactive Brokers. "TWS API v9.72+: Historical Data Limitations" (legacy reference, marked deprecated; maximum 50 simultaneous open historical requests). Read 2026-10-11. https://interactivebrokers.github.io/tws-api/historical_limitations.html ↩
-
Interactive Brokers. "Market Data Lines: How Market Data is Allocated" (100 lines minimum; commissions / 8 or equity × 100 / $1,000,000). Read 2026-10-11. https://www.interactivebrokers.com/docs/general/market-data-subscriptions/market-data-lines/how-market-data-is-allocated ↩ ↩2
-
Interactive Brokers. "Market Data Lines: Introduction" (lines shared between TWS and API connections). Read 2026-10-11. https://www.interactivebrokers.com/docs/general/market-data-subscriptions/market-data-lines/introduction ↩
-
Interactive Brokers. "TWS API: Option Chains" (reqContractDetails throttled for chains; reqSecDefOptParams without the throttling limitation). Read 2026-10-11. https://www.interactivebrokers.com/docs/tws-api/doc/contracts-financial-instruments/option-chains/introduction ↩
Verified engine output
Show the recompute-verified inputs and outputs
| require_futures | 1 |
|---|---|
| max_auth_complexity | 5 |
| filters › require options | false |
|---|---|
| filters › require futures | true |
| filters › require crypto | false |
| filters › require mcp | false |
| filters › require free tier | false |
| filters › max auth complexity | 5 |
| results › row 1 › broker › id | ibkr |
| results › row 1 › broker › name | Interactive Brokers |
| results › row 1 › broker › url | https://www.interactivebrokers.com/ |
| results › row 1 › broker › docs url | https://www.interactivebrokers.com/en/trading/ib-api.php |
| results › row 1 › broker › auth | OAuth + TWS/IB Gateway |
| results › row 1 › broker › auth complexity | 5 |
| results › row 1 › broker › order types (10 items) | [...] |
| results › row 1 › broker › rate limits | Market-data lines / 2 requests per second (50 on the default 100 lines); small-bar history 60 requests per 10 min |
| results › row 1 › broker › market data › row 1 | Global equities via subscription bundles |
| results › row 1 › broker › market data › row 2 | Level-2 depth on most exchanges |
| results › row 1 › broker › market data › row 3 | Historical depth across asset classes |
| results › row 1 › broker › mcp | official |
| results › row 1 › broker › mcp note | Official IBKR Connector: remote MCP at api.ibkr.com, IBKR sign-in, one account; drafts trade instructions that you submit as orders yourself |
| results › row 1 › broker › assets › stocks | true |
| results › row 1 › broker › assets › options | true |
| results › row 1 › broker › assets › futures | true |
| results › row 1 › broker › assets › crypto | true |
| results › row 1 › broker › assets › forex | true |
| results › row 1 › broker › assets › bonds | true |
| results › row 1 › broker › account minimum | 0 |
| results › row 1 › broker › commission | Tiered per-share or fixed; ~$0.0035/sh tiered |
| results › row 1 › broker › good for | Multi-asset-class, international, scale |
| results › row 1 › broker › has free tier | false |
| results › row 1 › broker › notes › row 1 | Requires TWS or IB Gateway running locally |
| results › row 1 › broker › notes › row 2 | Idempotency via client-supplied orderId |
| results › row 1 › broker › notes › row 3 | Fully headless gateway is possible but under-documented |
| results › row 1 › score | 2 |
| results › row 1 › max score | 2 |
| results › row 1 › fits | true |
| results › row 2 › broker › id | alpaca |
| results › row 2 › broker › name | Alpaca |
| results › row 2 › broker › url | https://alpaca.markets/ |
| results › row 2 › broker › docs url | https://alpaca.markets/docs/ |
| results › row 2 › broker › auth | API Key + Secret |
| results › row 2 › broker › auth complexity | 1 |
| results › row 2 › broker › order types (10 items) | [...] |
| results › row 2 › broker › rate limits | Trading API 200 req/min; market data 200/min free, 10,000/min on Algo Trader Plus |
| results › row 2 › broker › market data › row 1 | IEX real-time (free) |
| results › row 2 › broker › market data › row 2 | Full SIP on Algo Trader Plus ($99/mo) |
| results › row 2 › broker › market data › row 3 | Historical bars + trades + quotes |
| results › row 2 › broker › mcp | official |
| results › row 2 › broker › mcp note | Official open-source MCP server (V2 rewrite on FastMCP/OpenAPI); data, paper and live trading |
| results › row 2 › broker › assets › stocks | true |
| results › row 2 › broker › assets › options | true |
| results › row 2 › broker › assets › futures | false |
| results › row 2 › broker › assets › crypto | true |
| results › row 2 › broker › assets › forex | false |
| results › row 2 › broker › assets › bonds | false |
| results › row 2 › broker › account minimum | 0 |
| results › row 2 › broker › commission | $0 (PFOF on equities) |
| results › row 2 › broker › good for | Solo AI operator, paper-to-live parity |
| results › row 2 › broker › has free tier | true |
| results › row 2 › broker › notes › row 1 | Free paper trading with same API surface as live |
| results › row 2 › broker › notes › row 2 | Real-time OPRA options data needs Algo Trader Plus; Basic gets the indicative feed |
| results › row 2 › broker › notes › row 3 | Python/Go SDKs mature; rate-limit backoff documented |
| results › row 2 › score | 1 |
| results › row 2 › max score | 2 |
| results › row 2 › fits | false |
| results › row 2 › fail reasons › row 1 | Futures |
| results › row 3 › broker › id | tradier |
| results › row 3 › broker › name | Tradier |
| results › row 3 › broker › url | https://tradier.com/ |
| results › row 3 › broker › docs url | https://developer.tradier.com/ |
| results › row 3 › broker › auth | OAuth 2.0 |
| results › row 3 › broker › auth complexity | 3 |
| results › row 3 › broker › order types (8 items) | [...] |
| results › row 3 › broker › rate limits | 120 req/min standard and market data, 60 req/min trading (production) |
| results › row 3 › broker › market data › row 1 | Real-time equities + options (streaming) |
| results › row 3 › broker › market data › row 2 | Historical OHLC back ~5 years |
| results › row 3 › broker › market data › row 3 | No Level-2 depth |
| results › row 3 › broker › mcp | official |
| results › row 3 › broker › mcp note | Official hosted MCP server (Streamable HTTP, personal API token); market data, accounts and order placement |
| results › row 3 › broker › assets › stocks | true |
| results › row 3 › broker › assets › options | true |
| results › row 3 › broker › assets › futures | false |
| results › row 3 › broker › assets › crypto | false |
| results › row 3 › broker › assets › forex | false |
| results › row 3 › broker › assets › bonds | false |
| results › row 3 › broker › account minimum | 0 |
| results › row 3 › broker › commission | $0 equities (PFOF), $0.35/contract options Pro |
| results › row 3 › broker › good for | Options-first retail, multi-leg strategies |
| results › row 3 › broker › has free tier | true |
| results › row 3 › broker › notes › row 1 | Free sandbox with delayed data |
| results › row 3 › broker › notes › row 2 | Strong options chain + multi-leg order API |
| results › row 3 › broker › notes › row 3 | US-only account eligibility |
| results › row 3 › score | 1 |
| results › row 3 › max score | 2 |
| results › row 3 › fits | false |
| results › row 3 › fail reasons › row 1 | Futures |
| results › row 4 › broker › id | robinhood |
| results › row 4 › broker › name | Robinhood |
| results › row 4 › broker › url | https://robinhood.com/ |
| results › row 4 › broker › docs url | https://docs.robinhood.com/ |
| results › row 4 › broker › auth | API key (Crypto Trading API); Robinhood sign-in (Trading MCP) |
| results › row 4 › broker › auth complexity | 3 |
| results › row 4 › broker › order types › row 1 | market |
| results › row 4 › broker › order types › row 2 | limit |
| results › row 4 › broker › order types › row 3 | stop |
| results › row 4 › broker › order types › row 4 | stop-limit |
| results › row 4 › broker › rate limits | Not publicly documented |
| results › row 4 › broker › market data › row 1 | Delayed quotes in public tier |
| results › row 4 › broker › market data › row 2 | Limited historical depth |
| results › row 4 › broker › market data › row 3 | No public Level-2 |
| results › row 4 › broker › mcp | official |
| results › row 4 › broker › mcp note | Official Robinhood Trading MCP (Agentic Trading): long equities, options and crypto, only in a dedicated agentic account; no multi-leg options |
| results › row 4 › broker › assets › stocks | true |
| results › row 4 › broker › assets › options | true |
| results › row 4 › broker › assets › futures | false |
| results › row 4 › broker › assets › crypto | true |
| results › row 4 › broker › assets › forex | false |
| results › row 4 › broker › assets › bonds | false |
| results › row 4 › broker › account minimum | 0 |
| results › row 4 › broker › commission | $0 (PFOF), $5/mo Gold for margin + extras |
| results › row 4 › broker › good for | Agent-driven trading from an existing Robinhood account; no REST API for stocks or options |
| results › row 4 › broker › has free tier | true |
| results › row 4 › broker › notes › row 1 | Official REST API covers crypto only; stocks and options are reachable only through the Trading MCP |
| results › row 4 › broker › notes › row 2 | Trade approvals are off by default for external MCP agents |
| results › row 4 › broker › notes › row 3 | Paper trading unavailable |
| results › row 4 › score | 1 |
| results › row 4 › max score | 2 |
| results › row 4 › fits | false |
| results › row 4 › fail reasons › row 1 | Futures |
| results › row 5 › broker › id | schwab |
| results › row 5 › broker › name | Schwab |
| results › row 5 › broker › url | https://www.schwab.com/ |
| results › row 5 › broker › docs url | https://developer.schwab.com/ |
| results › row 5 › broker › auth | OAuth 2.0 (3-legged) |
| results › row 5 › broker › auth complexity | 4 |
| results › row 5 › broker › order types (9 items) | [...] |
| results › row 5 › broker › rate limits | 120 req/min for non-order calls per app; order writes 0-120/min per account, set at app registration |
| results › row 5 › broker › market data › row 1 | Real-time equities + options quotes |
| results › row 5 › broker › market data › row 2 | Historical bars (1m to daily) |
| results › row 5 › broker › market data › row 3 | No exchange depth via API |
| results › row 5 › broker › mcp | community |
| results › row 5 › broker › mcp note | No official MCP; community servers wrap the Trader API (self-hosted, re-authorize when the 7-day refresh token expires) |
| results › row 5 › broker › assets › stocks | true |
| results › row 5 › broker › assets › options | true |
| results › row 5 › broker › assets › futures | false |
| results › row 5 › broker › assets › crypto | false |
| results › row 5 › broker › assets › forex | false |
| results › row 5 › broker › assets › bonds | false |
| results › row 5 › broker › account minimum | 0 |
| results › row 5 › broker › commission | $0 equities, $0.65/contract options |
| results › row 5 › broker › good for | Established retail, post-TDA API migration |
| results › row 5 › broker › has free tier | true |
| results › row 5 › broker › notes › row 1 | API rebuilt after TD Ameritrade integration; still maturing |
| results › row 5 › broker › notes › row 2 | Orders cover stocks, ETFs and options; futures and forex trade on thinkorswim, not through the API |
| results › row 5 › broker › notes › row 3 | Requires individual developer registration and app review |
| results › row 5 › broker › notes › row 4 | Token refresh flow is finicky vs Alpaca/Tradier |
| results › row 5 › score | 1 |
| results › row 5 › max score | 2 |
| results › row 5 › fits | false |
| results › row 5 › fail reasons › row 1 | Futures |
| fitting brokers › row 1 › broker › id | ibkr |
| fitting brokers › row 1 › broker › name | Interactive Brokers |
| fitting brokers › row 1 › broker › url | https://www.interactivebrokers.com/ |
| fitting brokers › row 1 › broker › docs url | https://www.interactivebrokers.com/en/trading/ib-api.php |
| fitting brokers › row 1 › broker › auth | OAuth + TWS/IB Gateway |
| fitting brokers › row 1 › broker › auth complexity | 5 |
| fitting brokers › row 1 › broker › order types (10 items) | [...] |
| fitting brokers › row 1 › broker › rate limits | Market-data lines / 2 requests per second (50 on the default 100 lines); small-bar history 60 requests per 10 min |
| fitting brokers › row 1 › broker › market data › row 1 | Global equities via subscription bundles |
| fitting brokers › row 1 › broker › market data › row 2 | Level-2 depth on most exchanges |
| fitting brokers › row 1 › broker › market data › row 3 | Historical depth across asset classes |
| fitting brokers › row 1 › broker › mcp | official |
| fitting brokers › row 1 › broker › mcp note | Official IBKR Connector: remote MCP at api.ibkr.com, IBKR sign-in, one account; drafts trade instructions that you submit as orders yourself |
| fitting brokers › row 1 › broker › assets › stocks | true |
| fitting brokers › row 1 › broker › assets › options | true |
| fitting brokers › row 1 › broker › assets › futures | true |
| fitting brokers › row 1 › broker › assets › crypto | true |
| fitting brokers › row 1 › broker › assets › forex | true |
| fitting brokers › row 1 › broker › assets › bonds | true |
| fitting brokers › row 1 › broker › account minimum | 0 |
| fitting brokers › row 1 › broker › commission | Tiered per-share or fixed; ~$0.0035/sh tiered |
| fitting brokers › row 1 › broker › good for | Multi-asset-class, international, scale |
| fitting brokers › row 1 › broker › has free tier | false |
| fitting brokers › row 1 › broker › notes › row 1 | Requires TWS or IB Gateway running locally |
| fitting brokers › row 1 › broker › notes › row 2 | Idempotency via client-supplied orderId |
| fitting brokers › row 1 › broker › notes › row 3 | Fully headless gateway is possible but under-documented |
| fitting brokers › row 1 › score | 2 |
| fitting brokers › row 1 › max score | 2 |
| fitting brokers › row 1 › fits | true |
Computed live at build time.
Frequently asked questions
- What is the IBKR TWS API rate limit?
- Your market-data lines divided by 2 requests per second. Every account starts with 100 lines, so the default is 50 requests per second; 200 lines give 100 per second. Only the request that starts a data flow counts (IBKR TWS API docs, read 2026-10-11).
- What happens if I exceed the TWS API pacing limit?
- It depends on the TWS setting 'Reject messages above maximum allowed message rate vs applying pacing'. With reject on, TWS returns error 100 and terminates the API session after three violations. With it off, TWS queues and paces the requests.
- What triggers an IBKR historical-data pacing violation?
- For bars of 30 seconds or less: an identical request within 15 seconds, 6 or more requests for the same contract, exchange and tick type within 2 seconds, or more than 60 requests in any 10-minute period. BID_ASK requests count twice.
- How do I poll IBKR option chains without hitting rate limits?
- Use reqSecDefOptParams, which returns expiries and strikes without the throttling that applies when reqContractDetails enumerates a chain from an incompletely defined contract.
- How many market-data lines does IBKR give?
- 100 to start, never fewer. After the first month IBKR allocates the greater of monthly commissions divided by 8, equity times 100 divided by $1,000,000, or 100. Lines are shared between TWS and API connections.