The IBKR TWS API enforces a hard ceiling of 50 messages per second from client to TWS, plus a separate historical-data pacing regime: no more than 60 historical requests per 10-minute window, no 6+ identical-contract requests within 2 seconds, and no identical request repeated within 15 seconds. All of this is verified against the official TWS API docs on 2026-05-2512. Breaching the message rate eventually drops your connection; breaching historical pacing returns a pacing-violation error. Option chains have a specific gotcha: the old contract-details method is throttled, but reqSecDefOptParams is not3. This is the operational spec you build a resilient IBKR client against. Map it against other brokers in the Broker API Comparator.

TL;DR

  • Global message rate: 50 messages/second from client to TWS; over-limit eventually closes the connection1.
  • Historical-data pacing (each is a violation)2:
    • More than 60 historical requests in any 10-minute period.
    • 6+ historical requests for the same contract, exchange, and tick type within 2 seconds.
    • An identical historical request repeated within 15 seconds.
    • BID_ASK requests count double.
  • Max open historical requests: 50 simultaneous2.
  • Market-data lines: 100 by default (minimum 100)2.
  • Option chains: reqContractDetails is throttled; reqSecDefOptParams avoids the throttle3.

The global message rate

Every other rule sits on top of one ceiling: the client may send at most 50 messages per second to TWS1. Each ticker subscription request and each cancellation counts as one message. This is not a per-minute budget you can burst into; it is a sustained-rate cap. Sustained breaches do not return a clean 429 — TWS eventually closes the socket1. The correct client design paces all outbound traffic under 50/second with a token bucket, treating subscriptions, orders, and data requests as drawing from the same per-second budget.

Historical-data pacing rules

Historical data has its own pacing layer, because backfilling bars is the easiest way to flood the gateway. A pacing violation is triggered by any of these2:

Rule Threshold
Requests per 10-minute window More than 60
Same contract/exchange/tick type 6+ within 2 seconds
Identical request repeated Within 15 seconds
BID_ASK requests Count double toward all limits
Max simultaneous open requests 50

All verified on 2026-05-252. The practical reading: when backfilling a universe, stagger requests so you stay under 6 per contract per 2 seconds and under 60 total per 10 minutes, and never re-fire an identical request inside 15 seconds. A queue with a per-10-minute counter and a per-contract debounce is the standard pattern.

What a pacing violation looks like

When you cross a historical-data threshold, TWS returns a pacing-violation error rather than silently dropping data. Recovery is to pause, let the 10-minute window roll, and resume at a slower cadence. Unlike the 50/second message limit (which can kill the connection), a historical pacing violation is recoverable in place — but it stalls your backfill, so prevention beats recovery.

The option-chain gotcha

Polling option chains is where many IBKR integrations accidentally trip pacing. The older approach of enumerating contracts via reqContractDetails is throttled — the more ambiguous the contract definition, the slower and more rate-limited the return3. The fix is the dedicated method: reqSecDefOptParams returns the full list of expirations and strikes for an underlying without the throttling limitation3. For any option-chain workload, use reqSecDefOptParams; reserve reqContractDetails for narrow, fully-specified lookups.

Market-data lines

Separate from pacing, IBKR limits how many instruments you can stream concurrently: 100 market-data lines by default, with a minimum of 1002. Streaming quotes on more than 100 symbols at once requires more lines (which scale with commission activity). A scanner watching a broad universe should rotate subscriptions through the line budget rather than assuming unlimited concurrent streams.

Building a compliant client

  • One token bucket at 50/second for all outbound messages: the master constraint.
  • Historical queue with a 10-minute rolling counter (cap 60), a per-contract 2-second debounce, and a 15-second identical-request guard.
  • Use reqSecDefOptParams for option chains, never reqContractDetails in a loop.
  • Rotate market-data subscriptions through the 100-line budget.
  • Treat the 50/second limit as connection-fatal and historical pacing as recoverable-but-stalling.

For the cost side of IBKR (the API is free; you pay commissions and per-exchange data), see Interactive Brokers API Pricing 2026.

Verified figures

The 50 messages/second client limit, the historical-data pacing thresholds (60/10min, 6/2s, 15s identical, BID_ASK double, 50 max open), the 100 default market-data lines, and the reqSecDefOptParams throttle exemption were all verified against the official TWS API documentation on 2026-05-25.

Connects to

References

Footnotes

  1. Interactive Brokers. "TWS API - Introduction" (TWS accepts up to fifty messages per second from the client side; over-limit closes the connection; each subscription/cancellation is one message). interactivebrokers.github.io, verified 2026-05-25. https://interactivebrokers.github.io/tws-api/introduction.html 2 3 4

  2. Interactive Brokers. "TWS API - Historical Data Limitations" (60 requests / 10 minutes, 6 same-contract requests / 2 seconds, identical request within 15 seconds, BID_ASK counts double, 50 max simultaneous open requests). verified 2026-05-25. https://interactivebrokers.github.io/tws-api/historical_limitations.html 2 3 4 5 6 7

  3. Interactive Brokers. "TWS API - Options" (reqSecDefOptParams returns expirations and strikes without the reqContractDetails throttling limitation). verified 2026-05-25. https://interactivebrokers.github.io/tws-api/options.html 2 3 4

Verified engine output

Show the recompute-verified inputs and outputs
Multi-asset brokers including futures coverage
Inputs
require_futures1
max_auth_complexity5
Result
filters › require optionsfalse
filters › require futurestrue
filters › require cryptofalse
filters › require mcpfalse
filters › require free tierfalse
filters › max auth complexity5
results › row 1 › broker › idschwab
results › row 1 › broker › nameSchwab
results › row 1 › broker › urlhttps://www.schwab.com/
results › row 1 › broker › docs urlhttps://developer.schwab.com/
results › row 1 › broker › authOAuth 2.0 (3-legged)
results › row 1 › broker › auth complexity4
results › row 1 › broker › order types (9 items)[...]
results › row 1 › broker › rate limits120 req/min per endpoint (published tier)
results › row 1 › broker › market data › row 1Real-time equities + options quotes
results › row 1 › broker › market data › row 2Historical bars (1m to daily)
results › row 1 › broker › market data › row 3No exchange depth via API
results › row 1 › broker › mcpnone
results › row 1 › broker › mcp noteNo official or listed community MCP server
results › row 1 › broker › assets › stockstrue
results › row 1 › broker › assets › optionstrue
results › row 1 › broker › assets › futurestrue
results › row 1 › broker › assets › cryptofalse
results › row 1 › broker › assets › forextrue
results › row 1 › broker › assets › bondstrue
results › row 1 › broker › account minimum0
results › row 1 › broker › commission$0 equities, $0.65/contract options
results › row 1 › broker › good forEstablished retail, post-TDA API migration
results › row 1 › broker › has free tiertrue
results › row 1 › broker › notes › row 1API rebuilt after TD Ameritrade integration; still maturing
results › row 1 › broker › notes › row 2Requires individual developer registration and app review
results › row 1 › broker › notes › row 3Token refresh flow is finicky vs Alpaca/Tradier
results › row 1 › score2
results › row 1 › max score2
results › row 1 › fitstrue
results › row 2 › broker › idibkr
results › row 2 › broker › nameInteractive Brokers
results › row 2 › broker › urlhttps://www.interactivebrokers.com/
results › row 2 › broker › docs urlhttps://www.interactivebrokers.com/en/trading/ib-api.php
results › row 2 › broker › authOAuth + TWS/IB Gateway
results › row 2 › broker › auth complexity5
results › row 2 › broker › order types (10 items)[...]
results › row 2 › broker › rate limits~50 msg/sec per connection; 50 orders/sec burst
results › row 2 › broker › market data › row 1Global equities via subscription bundles
results › row 2 › broker › market data › row 2Level-2 depth on most exchanges
results › row 2 › broker › market data › row 3Historical depth across asset classes
results › row 2 › broker › mcpcommunity
results › row 2 › broker › mcp noteCommunity CLI MCP; audit before production
results › row 2 › broker › assets › stockstrue
results › row 2 › broker › assets › optionstrue
results › row 2 › broker › assets › futurestrue
results › row 2 › broker › assets › cryptotrue
results › row 2 › broker › assets › forextrue
results › row 2 › broker › assets › bondstrue
results › row 2 › broker › account minimum0
results › row 2 › broker › commissionTiered per-share or fixed; ~$0.0035/sh tiered
results › row 2 › broker › good forMulti-asset-class, international, scale
results › row 2 › broker › has free tierfalse
results › row 2 › broker › notes › row 1Requires TWS or IB Gateway running locally
results › row 2 › broker › notes › row 2Idempotency via client-supplied orderId
results › row 2 › broker › notes › row 3Fully headless gateway is possible but under-documented
results › row 2 › score2
results › row 2 › max score2
results › row 2 › fitstrue
results › row 3 › broker › idalpaca
results › row 3 › broker › nameAlpaca
results › row 3 › broker › urlhttps://alpaca.markets/
results › row 3 › broker › docs urlhttps://alpaca.markets/docs/
results › row 3 › broker › authAPI Key + Secret
results › row 3 › broker › auth complexity1
results › row 3 › broker › order types (10 items)[...]
results › row 3 › broker › rate limits200 req/min (free), higher on paid tiers
results › row 3 › broker › market data › row 1IEX real-time (free)
results › row 3 › broker › market data › row 2Full SIP on Algo Trader Plus ($99/mo)
results › row 3 › broker › market data › row 3Historical bars + trades + quotes
results › row 3 › broker › mcpofficial
results › row 3 › broker › mcp noteOfficial MCP V2, 61 actions, idempotent order submission
results › row 3 › broker › assets › stockstrue
results › row 3 › broker › assets › optionstrue
results › row 3 › broker › assets › futuresfalse
results › row 3 › broker › assets › cryptotrue
results › row 3 › broker › assets › forexfalse
results › row 3 › broker › assets › bondsfalse
results › row 3 › broker › account minimum0
results › row 3 › broker › commission$0 (PFOF on equities)
results › row 3 › broker › good forSolo AI operator, paper-to-live parity
results › row 3 › broker › has free tiertrue
results › row 3 › broker › notes › row 1Free paper trading with same API surface as live
results › row 3 › broker › notes › row 2Options require Algo Trader Plus tier
results › row 3 › broker › notes › row 3Python/Go SDKs mature; rate-limit backoff documented
results › row 3 › score1
results › row 3 › max score2
results › row 3 › fitsfalse
results › row 3 › fail reasons › row 1Futures
results › row 4 › broker › idtradier
results › row 4 › broker › nameTradier
results › row 4 › broker › urlhttps://tradier.com/
results › row 4 › broker › docs urlhttps://developer.tradier.com/
results › row 4 › broker › authOAuth 2.0
results › row 4 › broker › auth complexity3
results › row 4 › broker › order types (8 items)[...]
results › row 4 › broker › rate limits120 req/min market data, 60 req/min trading
results › row 4 › broker › market data › row 1Real-time equities + options (streaming)
results › row 4 › broker › market data › row 2Historical OHLC back ~5 years
results › row 4 › broker › market data › row 3No Level-2 depth
results › row 4 › broker › mcpcommunity
results › row 4 › broker › mcp noteCommunity MCP; idempotency is a manual patch
results › row 4 › broker › assets › stockstrue
results › row 4 › broker › assets › optionstrue
results › row 4 › broker › assets › futuresfalse
results › row 4 › broker › assets › cryptofalse
results › row 4 › broker › assets › forexfalse
results › row 4 › broker › assets › bondsfalse
results › row 4 › broker › account minimum0
results › row 4 › broker › commission$0 equities (PFOF), $0.35/contract options Pro
results › row 4 › broker › good forOptions-first retail, multi-leg strategies
results › row 4 › broker › has free tiertrue
results › row 4 › broker › notes › row 1Free sandbox with delayed data
results › row 4 › broker › notes › row 2Strong options chain + multi-leg order API
results › row 4 › broker › notes › row 3US-only account eligibility
results › row 4 › score1
results › row 4 › max score2
results › row 4 › fitsfalse
results › row 4 › fail reasons › row 1Futures
results › row 5 › broker › idrobinhood
results › row 5 › broker › nameRobinhood
results › row 5 › broker › urlhttps://robinhood.com/
results › row 5 › broker › docs urlhttps://docs.robinhood.com/
results › row 5 › broker › authOAuth 2.0 (unofficial endpoints)
results › row 5 › broker › auth complexity4
results › row 5 › broker › order types › row 1market
results › row 5 › broker › order types › row 2limit
results › row 5 › broker › order types › row 3stop
results › row 5 › broker › order types › row 4stop-limit
results › row 5 › broker › order types › row 5gtc
results › row 5 › broker › order types › row 6ioc
results › row 5 › broker › rate limitsNot publicly documented; low throughput
results › row 5 › broker › market data › row 1Delayed quotes in public tier
results › row 5 › broker › market data › row 2Limited historical depth
results › row 5 › broker › market data › row 3No public Level-2
results › row 5 › broker › mcpnone
results › row 5 › broker › mcp noteNo MCP; unofficial SDKs only
results › row 5 › broker › assets › stockstrue
results › row 5 › broker › assets › optionstrue
results › row 5 › broker › assets › futuresfalse
results › row 5 › broker › assets › cryptotrue
results › row 5 › broker › assets › forexfalse
results › row 5 › broker › assets › bondsfalse
results › row 5 › broker › account minimum0
results › row 5 › broker › commission$0 (PFOF), $5/mo Gold for margin + extras
results › row 5 › broker › good forCasual retail; not recommended for agents
results › row 5 › broker › has free tiertrue
results › row 5 › broker › notes › row 1No officially supported public API in 2026
results › row 5 › broker › notes › row 2Community SDKs break on auth changes without notice
results › row 5 › broker › notes › row 3Paper trading unavailable
results › row 5 › score1
results › row 5 › max score2
results › row 5 › fitsfalse
results › row 5 › fail reasons › row 1Futures
fitting brokers › row 1 › broker › idschwab
fitting brokers › row 1 › broker › nameSchwab
fitting brokers › row 1 › broker › urlhttps://www.schwab.com/
fitting brokers › row 1 › broker › docs urlhttps://developer.schwab.com/
fitting brokers › row 1 › broker › authOAuth 2.0 (3-legged)
fitting brokers › row 1 › broker › auth complexity4
fitting brokers › row 1 › broker › order types (9 items)[...]
fitting brokers › row 1 › broker › rate limits120 req/min per endpoint (published tier)
fitting brokers › row 1 › broker › market data › row 1Real-time equities + options quotes
fitting brokers › row 1 › broker › market data › row 2Historical bars (1m to daily)
fitting brokers › row 1 › broker › market data › row 3No exchange depth via API
fitting brokers › row 1 › broker › mcpnone
fitting brokers › row 1 › broker › mcp noteNo official or listed community MCP server
fitting brokers › row 1 › broker › assets › stockstrue
fitting brokers › row 1 › broker › assets › optionstrue
fitting brokers › row 1 › broker › assets › futurestrue
fitting brokers › row 1 › broker › assets › cryptofalse
fitting brokers › row 1 › broker › assets › forextrue
fitting brokers › row 1 › broker › assets › bondstrue
fitting brokers › row 1 › broker › account minimum0
fitting brokers › row 1 › broker › commission$0 equities, $0.65/contract options
fitting brokers › row 1 › broker › good forEstablished retail, post-TDA API migration
fitting brokers › row 1 › broker › has free tiertrue
fitting brokers › row 1 › broker › notes › row 1API rebuilt after TD Ameritrade integration; still maturing
fitting brokers › row 1 › broker › notes › row 2Requires individual developer registration and app review
fitting brokers › row 1 › broker › notes › row 3Token refresh flow is finicky vs Alpaca/Tradier
fitting brokers › row 1 › score2
fitting brokers › row 1 › max score2
fitting brokers › row 1 › fitstrue
fitting brokers › row 2 › broker › idibkr
fitting brokers › row 2 › broker › nameInteractive Brokers
fitting brokers › row 2 › broker › urlhttps://www.interactivebrokers.com/
fitting brokers › row 2 › broker › docs urlhttps://www.interactivebrokers.com/en/trading/ib-api.php
fitting brokers › row 2 › broker › authOAuth + TWS/IB Gateway
fitting brokers › row 2 › broker › auth complexity5
fitting brokers › row 2 › broker › order types (10 items)[...]
fitting brokers › row 2 › broker › rate limits~50 msg/sec per connection; 50 orders/sec burst
fitting brokers › row 2 › broker › market data › row 1Global equities via subscription bundles
fitting brokers › row 2 › broker › market data › row 2Level-2 depth on most exchanges
fitting brokers › row 2 › broker › market data › row 3Historical depth across asset classes
fitting brokers › row 2 › broker › mcpcommunity
fitting brokers › row 2 › broker › mcp noteCommunity CLI MCP; audit before production
fitting brokers › row 2 › broker › assets › stockstrue
fitting brokers › row 2 › broker › assets › optionstrue
fitting brokers › row 2 › broker › assets › futurestrue
fitting brokers › row 2 › broker › assets › cryptotrue
fitting brokers › row 2 › broker › assets › forextrue
fitting brokers › row 2 › broker › assets › bondstrue
fitting brokers › row 2 › broker › account minimum0
fitting brokers › row 2 › broker › commissionTiered per-share or fixed; ~$0.0035/sh tiered
fitting brokers › row 2 › broker › good forMulti-asset-class, international, scale
fitting brokers › row 2 › broker › has free tierfalse
fitting brokers › row 2 › broker › notes › row 1Requires TWS or IB Gateway running locally
fitting brokers › row 2 › broker › notes › row 2Idempotency via client-supplied orderId
fitting brokers › row 2 › broker › notes › row 3Fully headless gateway is possible but under-documented
fitting brokers › row 2 › score2
fitting brokers › row 2 › max score2
fitting brokers › row 2 › fitstrue

Computed live at build time.

Frequently asked questions

What is the IBKR TWS API message rate limit?
The client may send at most 50 messages per second to TWS. Each ticker subscription and cancellation counts as one message. Exceeding the sustained rate eventually causes TWS to close the connection.
What triggers an IBKR historical-data pacing violation?
Any of: more than 60 historical requests in a 10-minute window; 6 or more requests for the same contract, exchange, and tick type within 2 seconds; or an identical request repeated within 15 seconds. BID_ASK requests count double, and you may have at most 50 simultaneous open historical requests.
How do I poll IBKR option chains without hitting rate limits?
Use reqSecDefOptParams, which returns the full list of expirations and strikes for an underlying without the throttling limitation. The older reqContractDetails approach is throttled and slows down with ambiguous contract definitions.
How many instruments can IBKR stream at once?
100 market-data lines by default, with a minimum of 100. Streaming more than 100 symbols concurrently requires additional lines, which scale with commission activity.