IBKR market data errors 354, 10089, 10090, 10186 explained
Figures on this page are as of 2026-09. Fees, limits and margin tiers change — check the venue's own docs.
The one most people search for, as it appears in IBKR’s current TWS API error table:
354: Requested market data is not subscribed. Check API status by selecting the Account menu then under Management choose Market Data Subscription Manager and/or availability of delayed data.
In one line: TWS understood your request and refused to send live data for
that instrument, because the account lacks an entitlement the request needs.
But 354 is one of a family of codes, and they point at different problems —
no subscription, a subscription that does not extend to the API, a partial
subscription, or a session conflict. This page is for TWS API users who need to
tell which one they have before spending money or time on the wrong fix.
What these errors actually mean
All of these arrive through the TWS API’s EWrapper.error() callback, each
carrying the request ID of the market data request that failed. That request ID
is the first thing to log: it tells you which instrument and which request type
was refused, and one connection can receive different codes for different
instruments.
The codes in IBKR’s current table, verbatim:
| Code | Message | What it points to |
|---|---|---|
354 | Requested market data is not subscribed. Check API status by selecting the Account menu then under Management choose Market Data Subscription Manager and/or availability of delayed data. | No live data for that instrument in your account |
10089 | API data requires subscription | A subscription exists, but does not extend to API use |
10090 | Part of requested market data is not subscribed. | Some requested tick types need subscriptions you do not hold |
10091 | Part of requested market data requires additional subscription for API | Partial, and the missing part is the API entitlement |
10186 | Requested market data is not subscribed. Delayed market data is not enabled | No subscription, and you have not asked for delayed data instead |
10197 | No market data during competing session | Logged into paper and live at once, requesting live data |
Two wording variants you may meet in logs:
- 354 reads “Not subscribed to requested market data.” in IBKR’s older (now deprecated) error table. Same code, older text.
- 10089 has a longer form in IBKR’s Common Error Resolution pages: “Requested market data requires additional subscription for API. See link in ‘Market Data Connections’ dialog for more details.Delayed market data is available.” (the missing space is IBKR’s).
These are TWS API codes. The Client Portal Web API reports failures as HTTP responses, and we did not find these numbers documented for it.
The usual cause
Data you can see in TWS is not necessarily data you can get through the
API. IBKR says outright that market data availability differs between TWS and
the API, and its note on 10089 and 10091 is that the subscription held by
the user does not extend support for API use.
That is why this error is so confusing the first time. The chart is live on your screen, the quote is updating, and the API request for the same symbol comes back refused. Nothing is wrong with your code. The entitlement is different.
The fix is on the account side, not in code: check which subscriptions cover
API use through IBKR’s market data subscription pages (linked from the 10089
resolution page) and the Market Data Subscription Manager the 354 message
names. What each subscription costs is on IBKR’s pricing pages and is not
something to rely on from any third-party article, including this one.
Other causes, in order of likelihood
No subscription at all — 354 or 10186. The account has no live data for
that instrument. 10186 adds a second fact: you have not enabled delayed data,
so there was nothing to fall back to.
A partial subscription — 10090. Some of the tick types you asked for need
subscriptions you do not hold. IBKR’s example: options data is subscribed but
the underlying is not, so option greeks cannot be calculated. The request
partly works, which makes it easy to miss.
A competing session — 10197. You are logged into the paper and live
accounts at the same time and requesting live data. IBKR’s note says preference
is given to the live account. This has nothing to do with subscriptions; log one
of the sessions out, or accept that the paper session does not get live data
while both are running.
Delayed fallback working as designed. You may see this message:
Requested market data is not subscribed. Displaying delayed market data…
This is not a failure. IBKR documents that text (on a legacy RTD
troubleshooting page, as a TwsRtdServer error with no code number) as what
appears when you request a live tick type while only delayed data is available.
Data is flowing; it is delayed. User logs posted to the twsapi groups.io list
pair this message with code 10167. That number comes from those third-party
reports only — we did not find
10167 in either of IBKR’s error-code tables as of September 2026 — so treat
the text as IBKR’s and the number as observed rather than documented.
A different constraint that also looks like “no data”: code 101, which
concerns market data line limits. That is a capacity limit rather than an
entitlement problem; the details are in IBKR’s note on it in the error-code
table and in your account’s own settings.
The delayed data switch
Both 354 and 10089 point at the same alternative: ask for delayed data
explicitly. Call EClient.reqMarketDataType() before requesting data:
| Type | Meaning |
|---|---|
| 1 | Live — requires a market data subscription |
| 2 | Frozen |
| 3 | Delayed |
| 4 | Delayed Frozen |
app.reqMarketDataType(3) # delayed if live is not available
app.reqMktData(req_id, contract, "", False, False, [])
IBKR’s description of type 3 is the useful part: TWS switches to delayed data automatically when you lack the real-time subscription, and ignores the request for delayed data if live is available. So setting type 3 is safe to leave in place — subscribed instruments stay live.
Two limits:
- Delayed data only works with
reqMktDataandreqHistoricalData. IBKR states it does not function for tick data. - Delayed data arrives on different tick types, IDs 66 to 76. If your handler only listens for the live tick types, delayed data will arrive and be silently dropped — which looks exactly like “no data”.
How long the delay is varies and is on IBKR’s delayed market data page; we do not quote it here because it is not ours to keep current. What matters for an automated or AI-assisted setup is that delayed prices look exactly like current ones unless your code records which tick types they came from. Tag every price with its source at ingestion.
How to confirm which one you have
| You see | You have | Do this |
|---|---|---|
354 | No live entitlement for that instrument | Subscription manager, or reqMarketDataType(3) |
10186 | No entitlement, delayed not requested | reqMarketDataType(3) before the request |
10089 / 10091 | Entitlement that does not cover the API | Check which subscriptions cover API use |
10090 | Partial: some tick types not covered | Check subscriptions for every component, e.g. the underlying |
10197 | Paper and live logged in together | One session, or accept no live data on paper |
| “Displaying delayed market data…” | Fallback working | Handle tick types 66–76; label the data as delayed |
| Ticks 66–76 arriving | You are on delayed data | Nothing is broken; decide whether delayed is acceptable |
Also filter the informational codes. 2104 “Market data farm connection is OK”
and 2106 (historical data farm connected) arrive on every healthy connect
through the same callback and are not market data errors. Treating every
error() call as fatal is a common way to turn a working connection into an
apparently broken one — see
error handling patterns for trading APIs.
FAQ
Why can I see live prices in TWS but get error 10089 from the API?
IBKR states that market data availability differs between TWS and the API.
Error 10089 means the market data subscription on your account does not extend
to API use, even though it displays in TWS. Check which subscriptions cover API
access through IBKR’s market data subscription pages, or request delayed data
with reqMarketDataType(3).
What is the difference between IBKR error 354 and 10186?
Both mean the account has no live data for the requested instrument. 10186
adds that delayed market data is not enabled either, so the request had nothing
to fall back to. Calling reqMarketDataType(3) before the request tells TWS to
switch to delayed data automatically when live is not available.
Is error 10167 an official IBKR error code?
Its message text is official: IBKR documents “Requested market data is not
subscribed. Displaying delayed market data…” on a legacy troubleshooting page,
without a code number. The number 10167 comes from user logs; we did not find
it in either IBKR error-code table as of September 2026. It indicates delayed
data is being delivered, not that the request failed.
Does reqMarketDataType(3) turn off live data for instruments I subscribe to?
No. IBKR documents that a delayed data request is ignored when live data is available, so subscribed instruments stay live and only unsubscribed ones fall back to delayed. Your handler must accept the delayed tick types, IDs 66 to 76, or delayed data will be dropped.