# IG trading API: limits, auth and errors

Independent and unofficial. Not affiliated with or endorsed by any broker or platform named here. Educational only: nothing here is advice, and nothing here recommends a broker or a trade.

This is the markdown version of https://openbrokerapi.com/brokers/ig, written from the same records as that page.

Risk warning: CFDs and spread bets are complex instruments and come with a high risk of losing money rapidly due to leverage. You can lose money on these products, and each provider publishes its own loss figure under FCA rules. You should consider whether you understand how they work and whether you can afford to take the high risk of losing your money. Automated and API trading can amplify losses through bugs, connectivity failures and runaway orders.

REST plus streaming for IG spread bet and CFD accounts.

- Kind: Broker API
- Newest reading: 2026-10-12
- Official documentation: [labs.ig.com](https://labs.ig.com/)
- Everything recorded for IG, as one JSON file: https://openbrokerapi.com/data/brokers/ig.json
- Quickstart, key to first call: https://openbrokerapi.com/brokers/ig/quickstart

## IG API rate limits and allowances

One record per limit. The scope is part of the limit: a figure without its scope is not a figure you can pace against.

- Historical price data points a week: 10,000 data points per week
  - Scope: Per account, price history endpoints only
  - Status: verified. Source: [labs.ig.com](https://labs.ig.com/faq.html), checked 2026-10-12.
- Non trading requests a minute: 30 requests per minute
  - Scope: Per account, non trading calls only
  - Status: verified. Source: [labs.ig.com](https://labs.ig.com/faq.html), checked 2026-10-12.
- Non trading requests a minute: 60 requests per minute
  - Scope: Per application, that is per API key, non trading calls only
  - Status: verified. Source: [labs.ig.com](https://labs.ig.com/faq.html), checked 2026-10-12.
- Concurrent streaming subscriptions: 40 subscriptions
  - Scope: Per streaming connection
  - Status: verified. Source: [labs.ig.com](https://labs.ig.com/faq.html), checked 2026-10-12.
  - Corroborated by [labs.ig.com/streaming-api-guide.html](https://labs.ig.com/streaming-api-guide.html)
- Trading requests a minute: 100 requests per minute
  - Scope: Per account, trading calls only
  - Sources conflict: [ig.com](https://www.ig.com/en/trading-platforms/trading-apis/how-to-use-ig-api) states around 40 trade requests per minute, checked 2026-10-05. IG's own pages disagree. The conflict is labelled, not resolved. Pace against 40.
  - Status: conflicting. Source: [labs.ig.com](https://labs.ig.com/faq.html), checked 2026-10-12.

[IG API rate limits in full](https://openbrokerapi.com/brokers/ig/rate-limits), with the related error codes.

## Access, authentication and streaming

- How you get a key: API keys are only issued to existing live account holders: generate one in My IG > Settings > API keys.
  - Status: verified. Source: [How to use IG API](https://www.ig.com/uk/trading-platforms/trading-apis/how-to-use-ig-api), checked 2026-10-12.
- Who can use it: Spread bet and CFD accounts only. Share dealing, ISA and SIPP are not supported (error stockbroking-not-supported).
  - Status: verified. Source: [trading-ig FAQ (community source)](https://trading-ig.readthedocs.io/en/latest/faq.html), checked 2026-10-12.
- Demo: Partial: demo API works, but no key from a standalone demo account unless it is linked to a live account.
  - Status: verified. Source: [How to use IG API](https://www.ig.com/uk/trading-platforms/trading-apis/how-to-use-ig-api), checked 2026-10-12.
  - Status: verified. Source: [IG Labs FAQ: the demo and live base addresses, and the demo key rule](https://labs.ig.com/faq.html), checked 2026-10-12.
  - Status: verified. Source: [IG REST trading API guide: examples on the demo host](https://labs.ig.com/rest-trading-api-guide.html), checked 2026-10-12.
- Authentication: API key plus username and password returns CST and X-SECURITY-TOKEN, valid 12 hours on a rolling basis with each call resetting the clock on the IG Labs FAQ, while IG's REST trading API guide says 6 hours at first, extended up to a maximum of 72 hours: a disagreement between two IG pages that the blocked reference page could not settle on 23 Sep 2026. The v3 OAuth access token lasts as long as the login response says, with a refresh token that expires later. All tokens are invalidated during weekend maintenance.
  - Sources conflict: IG Labs FAQ: 12 hours between calls, reset by each call. IG Labs REST trading API guide: 6 hours at first, extended up to 72 hours while in use.
  - Status: conflicting. Source: [IG Labs REST trading API guide](https://labs.ig.com/rest-trading-api-guide.html), checked 2026-10-12.
  - Status: conflicting. Source: [IG Labs FAQ](https://labs.ig.com/faq.html), checked 2026-10-12.
- Streaming: Streaming runs on Lightstreamer: IG's Streaming API Guide starts by sending you to the Lightstreamer client library, and the server address to connect to comes back from the /session call. By default a connection holds up to 40 simultaneous subscriptions. The guide asks you to contact IG to raise that quota and the FAQ says to manage it by unsubscribing and subscribing as needed; both warn that opening extra connections to get past it may cost you the API key or your API permissions. The streaming API does not take OAuth tokens, only the CST and X-SECURITY-TOKEN pair.
  - Status: verified. Source: [IG Labs Streaming API Guide](https://labs.ig.com/streaming-api-guide.html), checked 2026-10-12.
  - Status: verified. Source: [IG Labs FAQ](https://labs.ig.com/faq.html), checked 2026-10-12.
- History depth: Up to 20 years of price history depending on resolution; 10,000 historical data points per week. Transactions and activity history are paged.
  - Status: verified. Source: [IG: How to use IG API](https://www.ig.com/uk/trading-platforms/trading-apis/how-to-use-ig-api), checked 2026-10-12.
  - Status: verified. Source: [IG Labs FAQ](https://labs.ig.com/faq.html), checked 2026-10-12.

## IG API endpoints

49 documented endpoints. [Grouped by what they do](https://openbrokerapi.com/brokers/ig/endpoints).

- [GET /accounts](https://openbrokerapi.com/brokers/ig/endpoints/accounts): List every account under the login (spread bet, CFD and so on) with balance, deposit, profit and loss and available funds.
- [GET /accounts/preferences](https://openbrokerapi.com/brokers/ig/endpoints/accounts-preferences): Read the preferences held on the account. The one preference documented is whether trailing stops are switched on.
- [PUT /accounts/preferences](https://openbrokerapi.com/brokers/ig/endpoints/put-accounts-preferences): Change the account preferences. The documented body carries one field, which switches trailing stops on or off.
- [GET /categories](https://openbrokerapi.com/brokers/ig/endpoints/categories): The categories of instrument switched on for the account, each with a code and a flag saying whether it can be traded.
- [GET /categories/{categoryId}/instruments](https://openbrokerapi.com/brokers/ig/endpoints/category-instruments): Every instrument in one category, paged, with its epic, name, status and current bid and offer.
- [GET /client-sentiment](https://openbrokerapi.com/brokers/ig/endpoints/client-sentiment): The share of IG clients holding long and short positions in each of a list of markets, as two percentages per market.
- [GET /client-sentiment/{marketId}](https://openbrokerapi.com/brokers/ig/endpoints/client-sentiment-by-market-id): The share of IG clients holding long and short positions in one market, as two percentages.
- [GET /client-sentiment/related/{marketId}](https://openbrokerapi.com/brokers/ig/endpoints/client-sentiment-related): Client sentiment for the markets IG relates to the one you name: the long and short percentages for each.
- [GET /confirms/{dealReference}](https://openbrokerapi.com/brokers/ig/endpoints/confirms-by-deal-reference): Deal confirmation for a dealReference. This is where you learn whether the deal was ACCEPTED or REJECTED, and why.
- [GET /history/activity](https://openbrokerapi.com/brokers/ig/endpoints/history-activity): Account activity (deals, amendments, order changes) over a date range, with optional detail.
- [GET /history/activity/{fromDate}/{toDate}](https://openbrokerapi.com/brokers/ig/endpoints/history-activity-by-dates): Account activity between two dates, both given in the path. This is the version 1 form: every value in the reply is a string.
- [GET /history/activity/{lastPeriod}](https://openbrokerapi.com/brokers/ig/endpoints/history-activity-by-period): Account activity for a period counted back from now, given in milliseconds. This is the version 1 form: every value in the reply is a string.
- [GET /history/transactions](https://openbrokerapi.com/brokers/ig/endpoints/history-transactions): Cash transactions (realised profit and loss, funding, deposits). This is the one you want for a trade journal or tax spreadsheet.
- [GET /history/transactions/{transactionType}/{fromDate}/{toDate}](https://openbrokerapi.com/brokers/ig/endpoints/history-transactions-by-dates): Transaction history of one type between two dates, all three given in the path. The version 1 form of the transactions call.
- [GET /history/transactions/{transactionType}/{lastPeriod}](https://openbrokerapi.com/brokers/ig/endpoints/history-transactions-by-period): Transaction history of one type for a period counted back from now, given in milliseconds. The version 1 form of the transactions call.
- [POST /indicativecostsandcharges/close](https://openbrokerapi.com/brokers/ig/endpoints/post-indicative-costs-close): Ask for an indicative breakdown of the costs and charges of closing an open deal. Nothing is traded.
- [GET /indicativecostsandcharges/durablemedium/{indicativeQuoteReference}](https://openbrokerapi.com/brokers/ig/endpoints/indicative-costs-durable-medium): Download an indicative costs and charges quote made earlier, as a PDF. The reference comes back from the open, close and edit quote calls.
- [POST /indicativecostsandcharges/edit](https://openbrokerapi.com/brokers/ig/endpoints/post-indicative-costs-edit): Ask for an indicative breakdown of the costs and charges of editing an order, split into its stop and its limit. Nothing is traded.
- [GET /indicativecostsandcharges/history/from/{from}/to/{to}](https://openbrokerapi.com/brokers/ig/endpoints/indicative-costs-history): The indicative costs and charges quotes made between two date times, paged. Each entry carries the reference needed to download its PDF.
- [POST /indicativecostsandcharges/open](https://openbrokerapi.com/brokers/ig/endpoints/post-indicative-costs-open): Ask for an indicative breakdown of the costs and charges of opening a deal: spread, commission, funding and currency conversion. Nothing is traded.
- [GET /markets](https://openbrokerapi.com/brokers/ig/endpoints/markets): Search markets by free text. Returns epics you then feed into every other call.
- [GET /markets/{epic}](https://openbrokerapi.com/brokers/ig/endpoints/markets-by-epic): Full market details for one epic: instrument, dealing rules (minimum size, stop distances) and snapshot.
- [GET /operations/application](https://openbrokerapi.com/brokers/ig/endpoints/operations-application): List the API applications you own, each with its key, status and the request allowances set on it.
- [PUT /operations/application](https://openbrokerapi.com/brokers/ig/endpoints/put-operations-application): Change one of your API applications: its status and its per account request allowances.
- [PUT /operations/application/disable](https://openbrokerapi.com/brokers/ig/endpoints/put-operations-application-disable): Disable the API key the request is sent with, so it stops serving requests. IG says a disabled key can be switched back on from the account pages of its platform.
- [GET /positions](https://openbrokerapi.com/brokers/ig/endpoints/positions): All open positions on the active account, each with its market snapshot.
- [GET /positions/{dealId}](https://openbrokerapi.com/brokers/ig/endpoints/positions-by-deal-id): A single open position by deal ID.
- [DELETE /positions/otc](https://openbrokerapi.com/brokers/ig/endpoints/delete-positions-otc): Close one or more positions. IG's official Java sample sends a DELETE with a request body; trading-ig sends a POST with the header _method: DELETE for clients that cannot put a body on a DELETE.
- [POST /positions/otc](https://openbrokerapi.com/brokers/ig/endpoints/post-positions-otc): Open an OTC position. Returns a dealReference only: the deal is not confirmed until you call GET /confirms/{dealReference}.
- [PUT /positions/otc/{dealId}](https://openbrokerapi.com/brokers/ig/endpoints/put-positions-otc-by-deal-id): Amend the stop, limit or trailing stop on an open position.
- [GET /prices/{epic}](https://openbrokerapi.com/brokers/ig/endpoints/prices-by-epic): Historical OHLC prices for an epic, paged. Each call eats into your weekly historical data allowance, so cache aggressively.
- [GET /prices/{epic}/{resolution}/{numPoints}](https://openbrokerapi.com/brokers/ig/endpoints/prices-by-num-points): The most recent historical prices for an epic at one resolution, as a fixed number of data points. Each point counts against the historical data allowance.
- [GET /prices/{epic}/{resolution}/{startDate}/{endDate}](https://openbrokerapi.com/brokers/ig/endpoints/prices-by-date-range): Historical prices for an epic at one resolution between two date times given in the path. Each point counts against the historical data allowance.
- [DELETE /session](https://openbrokerapi.com/brokers/ig/endpoints/delete-session): Log out and end the current session. The page documents no parameters and no response body.
- [GET /session](https://openbrokerapi.com/brokers/ig/endpoints/session): Read the current session: client ID, active account and streaming endpoint. Optional fetchSessionTokens=true returns fresh CST headers.
- [POST /session](https://openbrokerapi.com/brokers/ig/endpoints/post-session): Log in with username and password. Returns CST and X-SECURITY-TOKEN in the response headers; send both on every later call.
- [PUT /session](https://openbrokerapi.com/brokers/ig/endpoints/put-session): Switch the session to another of your accounts, and optionally make that account the default one.
- [GET /session/encryptionKey](https://openbrokerapi.com/brokers/ig/endpoints/session-encryption-key): Fetch the key and timestamp used to send a password in encrypted form when logging in. Only some logins need it.
- [POST /session/refresh-token](https://openbrokerapi.com/brokers/ig/endpoints/post-session-refresh-token): Exchange a refresh token from a version 3 login for a new access token and a new refresh token.
- [GET /watchlists](https://openbrokerapi.com/brokers/ig/endpoints/watchlists): All watchlists on the account, including the built in ones.
- [POST /watchlists](https://openbrokerapi.com/brokers/ig/endpoints/post-watchlists): Create a watchlist with a name and, if you wish, a first set of markets. The reply says whether every market was added.
- [DELETE /watchlists/{watchlistId}](https://openbrokerapi.com/brokers/ig/endpoints/delete-watchlist-by-id): Delete a watchlist. The list itself is removed, not the markets or any position in them.
- [GET /watchlists/{watchlistId}](https://openbrokerapi.com/brokers/ig/endpoints/watchlist-by-id): The markets in one watchlist, each with its epic, name, status and current bid and offer.
- [PUT /watchlists/{watchlistId}](https://openbrokerapi.com/brokers/ig/endpoints/put-watchlist-by-id): Add one market to an existing watchlist, by its epic.
- [DELETE /watchlists/{watchlistId}/{epic}](https://openbrokerapi.com/brokers/ig/endpoints/delete-watchlist-epic): Take one market out of a watchlist. The watchlist and its other markets stay as they are.
- [GET /working-orders](https://openbrokerapi.com/brokers/ig/endpoints/workingorders): All working (pending) orders on the active account.
- [POST /working-orders/otc](https://openbrokerapi.com/brokers/ig/endpoints/post-workingorders-otc): Create a working order (LIMIT or STOP) that triggers at a level.
- [DELETE /working-orders/otc/{dealId}](https://openbrokerapi.com/brokers/ig/endpoints/delete-workingorders-otc-by-deal-id): Delete an OTC working order by its deal identifier. Returns a dealReference.
- [PUT /working-orders/otc/{dealId}](https://openbrokerapi.com/brokers/ig/endpoints/put-working-orders-otc-by-deal-id): Amend an OTC working order that has not filled: its level, type, stop, limit and expiry. Returns a dealReference to confirm, as dealing calls do.

## IG messages

5 documented messages. They are not HTTP endpoints: none has a method or a path. [Grouped by what they do](https://openbrokerapi.com/brokers/ig/messages).

- [ACCOUNT:{account identifier}](https://openbrokerapi.com/brokers/ig/messages/account) (IG Streaming API): Live figures for one account: profit and loss, margin, funds, equity and the cash available to trade, each sent again as it changes.
- [CHART:{epic}:{scale}](https://openbrokerapi.com/brokers/ig/messages/chart-candle) (IG Streaming API): Consolidated candle data for one market at one scale. The scale is SECOND, 1MINUTE, 5MINUTE or HOUR, and each update carries the open, high, low and close of the candle for the bid, the offer and the last traded price.
- [CHART:{epic}:TICK](https://openbrokerapi.com/brokers/ig/messages/chart-tick) (IG Streaming API): Tick data for one market: each update carries the bid, the offer, the last traded price and volume, with the day's open, high, low and change on the mid price.
- [PRICE:{account identifier}:{epic}](https://openbrokerapi.com/brokers/ig/messages/price) (IG Streaming API): Live prices for one market, by account identifier and epic: the bid and ask ladder up to five tiers deep, the sizes at each tier, the day's high and low and the dealing state. IG's page says price availability depends on the account's permissions.
- [TRADE:{account identifier}](https://openbrokerapi.com/brokers/ig/messages/trade) (IG Streaming API): Trade notifications for one account in three fields: CONFIRMS for deal confirmations, OPU for open position updates and WOU for working order updates. The value of each is a JSON object.

## IG API error codes

132 decoded error codes. [All IG errors](https://openbrokerapi.com/errors/ig).

- [ACCOUNT_NOT_ENABLED_TO_TRADING](https://openbrokerapi.com/errors/ig/account-not-enabled-to-trading): The account is not enabled to trade.
- [ATTACHED_ORDER_LEVEL_ERROR](https://openbrokerapi.com/errors/ig/attached-order-level-error): The level of the attached stop or limit is not valid.
- [ATTACHED_ORDER_TRAILING_STOP_ERROR](https://openbrokerapi.com/errors/ig/attached-order-trailing-stop-error): The trailing stop value is not valid.
- [authentication.failure.not-a-client-account](https://openbrokerapi.com/errors/ig/not-a-client-account): The account used to log in is not a valid client account.
- [CANNOT_CHANGE_STOP_TYPE](https://openbrokerapi.com/errors/ig/cannot-change-stop-type): The stop type cannot be changed.
- [CANNOT_REMOVE_STOP](https://openbrokerapi.com/errors/ig/cannot-remove-stop): The stop cannot be removed.
- [CLOSING_ONLY_TRADES_ACCEPTED_ON_THIS_MARKET](https://openbrokerapi.com/errors/ig/closing-only-trades-on-this-market): IG is not taking opening deals on a controlled risk basis on this market, so only closing trades are accepted.
- [CLOSINGS_ONLY_ACCOUNT](https://openbrokerapi.com/errors/ig/closings-only-account): The account is currently restricted from opening new positions.
- [CONFLICTING_ORDER](https://openbrokerapi.com/errors/ig/conflicting-order): A resubmitted request does not match the original order.
- [CONTACT_SUPPORT_INSTRUMENT_ERROR](https://openbrokerapi.com/errors/ig/contact-support-instrument-error): The instrument has an error.
- [CR_SPACING](https://openbrokerapi.com/errors/ig/cr-spacing): IG could not process the order because the stop or limit level asked for is not a valid trading level in the underlying market.
- [DUPLICATE_ORDER_ERROR](https://openbrokerapi.com/errors/ig/duplicate-order-error): The order was rejected as a duplicate of an order issued earlier.
- [endpoint.unavailable.for.api-key](https://openbrokerapi.com/errors/ig/endpoint-unavailable-for-api-key): The API key was not accepted for this endpoint.
- [error.confirms.deal-not-found](https://openbrokerapi.com/errors/ig/confirms-deal-not-found): No deal confirmation was found for the deal reference given.
- [error.invalid.daterange](https://openbrokerapi.com/errors/ig/invalid-daterange): The date range in a price history request is not valid.
- [error.invalid.watchlist](https://openbrokerapi.com/errors/ig/invalid-watchlist): The watchlist id is not valid.
- [error.malformed.date](https://openbrokerapi.com/errors/ig/malformed-date): A date in a price history request is not in a valid format.
- [error.position.notfound](https://openbrokerapi.com/errors/ig/position-notfound): The requested position was not found.
- [error.positions.generic](https://openbrokerapi.com/errors/ig/positions-generic): An unexpected error happened on IG's side while handling a positions request, and it could not proceed.
- [error.price-history.io-error](https://openbrokerapi.com/errors/ig/price-history-io-error): Reported while downloading historical prices, alongside the points allowance being exceeded.
- [error.public-api.epic-not-found](https://openbrokerapi.com/errors/ig/epic-not-found): The epic in the request was not found.
- [error.public-api.exceeded-account-allowance](https://openbrokerapi.com/errors/ig/exceeded-account-allowance): The account's traffic allowance has been exceeded.
- [error.public-api.exceeded-account-historical-data-allowance](https://openbrokerapi.com/errors/ig/exceeded-account-historical-data-allowance): The account's allowance for historical data has been exceeded.
- [error.public-api.exceeded-account-trading-allowance](https://openbrokerapi.com/errors/ig/exceeded-account-trading-allowance): The account's allowance for trading requests has been exceeded.
- [error.public-api.exceeded-api-key-allowance](https://openbrokerapi.com/errors/ig/exceeded-api-key-allowance): The traffic allowance of the API key has been exceeded.
- [error.public-api.failure.encryption.required](https://openbrokerapi.com/errors/ig/encryption-required): A login was sent to version 1 of the session endpoint by a client of the IG Singapore company.
- [error.public-api.failure.kyc.required](https://openbrokerapi.com/errors/ig/kyc-required): The account is not allowed to log in to the API.
- [error.public-api.failure.missing.credentials](https://openbrokerapi.com/errors/ig/missing-credentials): The request did not carry all of the security credentials the endpoint needs.
- [error.public-api.failure.pending.agreements.required](https://openbrokerapi.com/errors/ig/pending-agreements-required): The account is not allowed to log in to the public API.
- [error.public-api.failure.preferred.account.disabled](https://openbrokerapi.com/errors/ig/preferred-account-disabled): The user's preferred account is disabled.
- [error.public-api.failure.preferred.account.not.set](https://openbrokerapi.com/errors/ig/preferred-account-not-set): The user has not set a preferred account.
- [error.public-api.failure.product-code-not-allowed](https://openbrokerapi.com/errors/ig/product-code-not-allowed): The account's product type is not supported for public API users.
- [error.public-api.failure.stockbroking-not-supported](https://openbrokerapi.com/errors/ig/stockbroking-not-supported): IG's reference describes this code as "Stockbroking not supported for Public API users." It is listed under HTTP 403 in the Exceptions tables for /session.
- [error.public-api.too-many-epics](https://openbrokerapi.com/errors/ig/too-many-epics): The request named more epics than the endpoint accepts in one call.
- [error.request.invalid.date-range](https://openbrokerapi.com/errors/ig/request-invalid-date-range): The date range in the request is not valid.
- [error.request.invalid.page-size](https://openbrokerapi.com/errors/ig/request-invalid-page-size): The page size in the request is not valid.
- [error.security.account-access-denied](https://openbrokerapi.com/errors/ig/account-access-denied): The account has been denied login privileges.
- [error.security.account-migrated](https://openbrokerapi.com/errors/ig/account-migrated): The account has been migrated to IG's client and account model.
- [error.security.account-not-yet-activated](https://openbrokerapi.com/errors/ig/account-not-yet-activated): The account has not been activated yet.
- [error.security.account-suspended](https://openbrokerapi.com/errors/ig/account-suspended): The account has been suspended.
- [error.security.account-token-invalid](https://openbrokerapi.com/errors/ig/account-token-invalid): The endpoint needs an account token and the one sent was not valid.
- [error.security.account-token-missing](https://openbrokerapi.com/errors/ig/account-token-missing): The endpoint needs an account token and none was sent.
- [error.security.all-accounts-pending](https://openbrokerapi.com/errors/ig/all-accounts-pending): All of the client's accounts are in a pending state.
- [error.security.all-accounts-suspended](https://openbrokerapi.com/errors/ig/all-accounts-suspended): All of the client's accounts have been suspended.
- [error.security.api-key-disabled](https://openbrokerapi.com/errors/ig/api-key-disabled): The API key was not accepted because it is not currently enabled.
- [error.security.api-key-invalid](https://openbrokerapi.com/errors/ig/api-key-invalid): The API key provided was not accepted.
- [error.security.api-key-missing](https://openbrokerapi.com/errors/ig/api-key-missing): No API key was sent with the request.
- [error.security.api-key-restricted](https://openbrokerapi.com/errors/ig/api-key-restricted): The API key is not valid for the account making the request.
- [error.security.api-key-revoked](https://openbrokerapi.com/errors/ig/api-key-revoked): The API key was not accepted because it has been revoked.
- [error.security.authentication.timeout](https://openbrokerapi.com/errors/ig/authentication-timeout): Authentication timed out.
- [error.security.client-suspended](https://openbrokerapi.com/errors/ig/client-suspended): The client has been suspended from using the platform.
- [error.security.client-token-invalid](https://openbrokerapi.com/errors/ig/client-token-invalid): The endpoint needs a client token and the one sent was not valid.
- [error.security.client-token-missing](https://openbrokerapi.com/errors/ig/client-token-missing): The endpoint needs a client token and none was sent.
- [error.security.generic](https://openbrokerapi.com/errors/ig/security-generic): An unexpected error happened on IG's side and the request could not proceed.
- [error.security.get.session.timeout](https://openbrokerapi.com/errors/ig/get-session-timeout): The request timed out while IG was retrieving the session details.
- [error.security.invalid-application](https://openbrokerapi.com/errors/ig/invalid-application): The user agent string sent with the request is not valid.
- [error.security.invalid-details](https://openbrokerapi.com/errors/ig/invalid-details): The credentials used to log in are not valid, so the login is rejected.
- [error.security.invalid-website](https://openbrokerapi.com/errors/ig/invalid-website): The site the account belongs to is not accessible through the API services.
- [error.security.oauth-token-invalid](https://openbrokerapi.com/errors/ig/oauth-token-invalid): The OAuth access token is not valid.
- [error.security.too-many-failed-attempts](https://openbrokerapi.com/errors/ig/too-many-failed-attempts): The maximum number of failed login attempts has been reached.
- [error.service.watchlists.add-instrument.invalid-epic](https://openbrokerapi.com/errors/ig/watchlists-add-invalid-epic): The epic given when adding a market to a watchlist is not valid.
- [error.switch.accountId-must-be-different](https://openbrokerapi.com/errors/ig/switch-accountid-must-be-different): A switch to the account that is already active was attempted.
- [error.switch.cannot-set-default-account](https://openbrokerapi.com/errors/ig/switch-cannot-set-default-account): The switch could not make the target account the new default account.
- [error.switch.invalid-accountId](https://openbrokerapi.com/errors/ig/switch-invalid-accountid): A switch to an account id that is not valid was attempted.
- [error.trading.otc.instrument-not-found](https://openbrokerapi.com/errors/ig/otc-instrument-not-found): The instrument named in the dealing request was not found.
- [error.trading.otc.market-orders.not-supported](https://openbrokerapi.com/errors/ig/otc-market-orders-not-supported): Market orders are not supported for this request.
- [error.unsupported.epic](https://openbrokerapi.com/errors/ig/unsupported-epic): The epic is not supported by the price history endpoint.
- [error.watchlists.management.cannot-delete-watchlist](https://openbrokerapi.com/errors/ig/watchlists-cannot-delete): An attempt was made to delete a system generated watchlist, and IG rejected it.
- [error.watchlists.management.duplicate-name](https://openbrokerapi.com/errors/ig/watchlists-duplicate-name): A watchlist could not be created because another watchlist already has that name.
- [error.watchlists.management.error](https://openbrokerapi.com/errors/ig/watchlists-management-error): A watchlist request failed for a reason IG does not specify.
- [error.watchlists.management.watchlist-not-found](https://openbrokerapi.com/errors/ig/watchlists-watchlist-not-found): An attempt was made to delete a watchlist that does not exist, and IG rejected it.
- [EXCHANGE_MANUAL_OVERRIDE](https://openbrokerapi.com/errors/ig/exchange-manual-override): An exchange check failed.
- [EXPIRY_LESS_THAN_SPRINT_MARKET_MIN_EXPIRY](https://openbrokerapi.com/errors/ig/expiry-less-than-sprint-min-expiry): The order's expiry is shorter than the sprint market's minimum expiry.
- [FINANCE_REPEAT_DEALING](https://openbrokerapi.com/errors/ig/finance-repeat-dealing): The total size of the deals placed on this market in a short period is more than IG permits.
- [FORCE_OPEN_ON_SAME_MARKET_DIFFERENT_CURRENCY](https://openbrokerapi.com/errors/ig/force-open-different-currency): Forcing open a position in a different currency on the same market is not allowed.
- [GENERAL_ERROR](https://openbrokerapi.com/errors/ig/general-error): An error happened and no detailed information is available.
- [GOOD_TILL_DATE_IN_THE_PAST](https://openbrokerapi.com/errors/ig/good-till-date-in-the-past): The working order was set to expire on a date that has already passed.
- [INSTRUMENT_NOT_FOUND](https://openbrokerapi.com/errors/ig/instrument-not-found): The requested market was not found.
- [INSTRUMENT_NOT_TRADEABLE_IN_THIS_CURRENCY](https://openbrokerapi.com/errors/ig/instrument-not-tradeable-in-currency): The instrument cannot be traded in the currency given.
- [INSUFFICIENT_FUNDS](https://openbrokerapi.com/errors/ig/insufficient-funds): The account does not have enough funds available for the requested trade.
- [invalid.input](https://openbrokerapi.com/errors/ig/invalid-input): A generic error in the input data.
- [invalid.input.too.many.markets](https://openbrokerapi.com/errors/ig/too-many-markets): The request asked for too many markets in one call.
- [invalid.request.forceOpen](https://openbrokerapi.com/errors/ig/invalid-request-forceopen): A validation failure on the request field forceOpen.
- [invalid.url](https://openbrokerapi.com/errors/ig/invalid-url): The URL requested is not valid.
- [LEVEL_TOLERANCE_ERROR](https://openbrokerapi.com/errors/ig/level-tolerance-error): The market level moved and the deal was rejected.
- [LIMIT_ORDER_WRONG_SIDE_OF_MARKET](https://openbrokerapi.com/errors/ig/limit-order-wrong-side-of-market): The deal was rejected because the limit level is inconsistent with the current market price for the deal's direction.
- [MANUAL_ORDER_TIMEOUT](https://openbrokerapi.com/errors/ig/manual-order-timeout): The time allowed for a manual order ran out.
- [MARGIN_ERROR](https://openbrokerapi.com/errors/ig/margin-error): The order was declined during margin checks.
- [MARKET_CLOSED](https://openbrokerapi.com/errors/ig/market-closed): The market is currently closed.
- [MARKET_CLOSED_WITH_EDITS](https://openbrokerapi.com/errors/ig/market-closed-with-edits): The market is currently closed with edits.
- [MARKET_CLOSING](https://openbrokerapi.com/errors/ig/market-closing): The epic is due to expire shortly.
- [MARKET_NOT_BORROWABLE](https://openbrokerapi.com/errors/ig/market-not-borrowable): The market does not allow short positions to be opened.
- [MARKET_OFFLINE](https://openbrokerapi.com/errors/ig/market-offline): The market is currently offline.
- [MARKET_ORDERS_NOT_ALLOWED_ON_INSTRUMENT](https://openbrokerapi.com/errors/ig/market-orders-not-allowed): The epic does not support the market order type.
- [MARKET_PHONE_ONLY](https://openbrokerapi.com/errors/ig/market-phone-only): The market can only be traded over the phone.
- [MARKET_ROLLED](https://openbrokerapi.com/errors/ig/market-rolled): The market has been rolled to the next period.
- [MARKET_UNAVAILABLE_TO_CLIENT](https://openbrokerapi.com/errors/ig/market-unavailable-to-client): The requested market is not available to this account.
- [MAX_AUTO_SIZE_EXCEEDED](https://openbrokerapi.com/errors/ig/max-auto-size-exceeded): The order size is larger than the maximum configured for the instrument for automatically hedging a deal's exposure.
- [MINIMUM_ORDER_SIZE_ERROR](https://openbrokerapi.com/errors/ig/minimum-order-size-error): The order size is too small.
- [MOVE_AWAY_ONLY_LIMIT](https://openbrokerapi.com/errors/ig/move-away-only-limit): The limit level asked for is closer to the market level than the existing one.
- [MOVE_AWAY_ONLY_STOP](https://openbrokerapi.com/errors/ig/move-away-only-stop): The stop level asked for is closer to the market level than the existing stop level.
- [MOVE_AWAY_ONLY_TRIGGER_LEVEL](https://openbrokerapi.com/errors/ig/move-away-only-trigger-level): The order level asked for is closer to the market level than the existing order level.
- [NCR_POSITIONS_ON_CR_ACCOUNT](https://openbrokerapi.com/errors/ig/ncr-positions-on-cr-account): The account is not permitted to open a position that is not controlled risk.
- [OPPOSING_DIRECTION_ORDERS_NOT_ALLOWED](https://openbrokerapi.com/errors/ig/opposing-direction-orders-not-allowed): Opening a controlled risk position in the opposite direction to an existing controlled risk position is not allowed.
- [OPPOSING_POSITIONS_NOT_ALLOWED](https://openbrokerapi.com/errors/ig/opposing-positions-not-allowed): The deal was rejected to avoid holding long and short positions on the same market, or long and short positions and working orders on the same epic.
- [ORDER_DECLINED](https://openbrokerapi.com/errors/ig/order-declined): The order was declined.
- [ORDER_LOCKED](https://openbrokerapi.com/errors/ig/order-locked): The order is locked and cannot be edited by the user.
- [ORDER_NOT_FOUND](https://openbrokerapi.com/errors/ig/order-not-found): The order was not found.
- [ORDER_SIZE_CANNOT_BE_FILLED](https://openbrokerapi.com/errors/ig/order-size-cannot-be-filled): The order size cannot be filled at this price at the moment.
- [OVER_NORMAL_MARKET_SIZE](https://openbrokerapi.com/errors/ig/over-normal-market-size): The total position size at this stop level is greater than the size allowed on this market.
- [PARTIALY_CLOSED_POSITION_NOT_DELETED](https://openbrokerapi.com/errors/ig/partialy-closed-position-not-deleted): The position cannot be deleted because it has been partially closed.
- [POSITION_ALREADY_EXISTS_IN_OPPOSITE_DIRECTION](https://openbrokerapi.com/errors/ig/position-exists-in-opposite-direction): The deal was rejected because of an existing position in the opposite direction.
- [POSITION_NOT_AVAILABLE_TO_CANCEL](https://openbrokerapi.com/errors/ig/position-not-available-to-cancel): The position cannot be cancelled.
- [POSITION_NOT_AVAILABLE_TO_CLOSE](https://openbrokerapi.com/errors/ig/position-not-available-to-close): The position cannot be closed.
- [POSITION_NOT_FOUND](https://openbrokerapi.com/errors/ig/position-not-found): The position was not found.
- [public-api.costs-and-charges.client-error](https://openbrokerapi.com/errors/ig/costs-and-charges-client-error): A client side error on the indicative costs and charges endpoints.
- [public-api.costs-and-charges.general-error](https://openbrokerapi.com/errors/ig/costs-and-charges-general-error): A server side error on the indicative costs and charges endpoints.
- [public-api.costs-and-charges.indicative-quote-reference-not-found](https://openbrokerapi.com/errors/ig/costs-quote-reference-not-found): The indicative quote reference was not found.
- [REJECT_CFD_ORDER_ON_SPREADBET_ACCOUNT](https://openbrokerapi.com/errors/ig/reject-cfd-order-on-spreadbet-account): A CFD style order was sent to a spread bet account.
- [REJECT_SPREADBET_ORDER_ON_CFD_ACCOUNT](https://openbrokerapi.com/errors/ig/reject-spreadbet-order-on-cfd-account): A spread bet trade was submitted on a CFD account, which is not valid.
- [SIZE_INCREMENT](https://openbrokerapi.com/errors/ig/size-increment): The order size is not a multiple of the size increment set for the market.
- [SPRINT_MARKET_EXPIRY_AFTER_MARKET_CLOSE](https://openbrokerapi.com/errors/ig/sprint-market-expiry-after-market-close): The position's expiry would have fallen after the market's closing time.
- [STOP_OR_LIMIT_NOT_ALLOWED](https://openbrokerapi.com/errors/ig/stop-or-limit-not-allowed): The market does not allow attached stop or limit orders.
- [STOP_REQUIRED_ERROR](https://openbrokerapi.com/errors/ig/stop-required-error): The order requires a stop.
- [STRIKE_LEVEL_TOLERANCE](https://openbrokerapi.com/errors/ig/strike-level-tolerance): The strike level submitted is not valid.
- [system.error](https://openbrokerapi.com/errors/ig/system-error): A system error on IG's side.
- [TRAILING_STOP_NOT_ALLOWED](https://openbrokerapi.com/errors/ig/trailing-stop-not-allowed): The market or the account does not allow trailing stops.
- [unauthorised.access.to.equity.exception](https://openbrokerapi.com/errors/ig/unauthorised-access-to-equity): The account is not authorised to access equity data.
- [unauthorised.api-key.revoked](https://openbrokerapi.com/errors/ig/unauthorised-api-key-revoked): The API key is in the revoked state and cannot be used.
- [unauthorised.clientId.api-key.mismatch](https://openbrokerapi.com/errors/ig/clientid-api-key-mismatch): The API key does not belong to the authenticated individual.
- [UNKNOWN](https://openbrokerapi.com/errors/ig/unknown): The operation ended in an unknown result.
- [WRONG_SIDE_OF_MARKET](https://openbrokerapi.com/errors/ig/wrong-side-of-market): The operation was attempted on the wrong side of the market for its direction.

## Platform APIs an account here can reach

- [MetaTrader 4 (MQL4)](https://openbrokerapi.com/platforms/metatrader-4): offered. Offered for spread betting and CFD accounts. Expert Advisors allowed: page says you can build strategies to execute automatically using your algorithms or MT4's own, called Expert Advisors.
  - Status: verified. Source: [IG UK MetaTrader 4](https://www.ig.com/uk/trading-platforms/metatrader-4), checked 2026-09-18.
- [MetaTrader 5 (Python package and MQL5)](https://openbrokerapi.com/platforms/metatrader-5): offered. MT5 offered to UK clients; page mentions running Expert Advisors, MQL5 and free VPS for qualifying accounts. Account type split (CFD vs spread bet) not stated on page.
  - Status: verified. Source: [IG UK MetaTrader 5](https://www.ig.com/uk/trading-platforms/metatrader-5), checked 2026-09-18.
- [cTrader Open API](https://openbrokerapi.com/platforms/ctrader): not offered. cTrader not listed on the broker's UK platforms page; absence from an overview page is not proof, so unverified.
  - Status: unverified. Source: [IG UK trading platforms](https://www.ig.com/uk/trading-platforms), checked 2026-09-18.
- [TradeLocker API](https://openbrokerapi.com/platforms/tradelocker): not offered. TradeLocker not listed on the broker's UK platforms page; absence from an overview page is not proof, so unverified.
  - Status: unverified. Source: [IG UK trading platforms](https://www.ig.com/uk/trading-platforms), checked 2026-09-18.
- [Match-Trader Platform API](https://openbrokerapi.com/platforms/match-trader): not offered. Match-Trader not listed on the broker's UK platforms page; absence from an overview page is not proof, so unverified.
  - Status: unverified. Source: [IG UK trading platforms](https://www.ig.com/uk/trading-platforms), checked 2026-09-18.
- [DXtrade APIs](https://openbrokerapi.com/platforms/dxtrade): not offered. DXtrade not listed on the broker's UK platforms page; absence from an overview page is not proof, so unverified.
  - Status: unverified. Source: [IG UK trading platforms](https://www.ig.com/uk/trading-platforms), checked 2026-09-18.

## IG API SDKs and wrappers

- trading-ig (Python, Community): Community wrapper, maintained in spare time; 214 forks. Version 0.0.25 (25 Aug 2026) needs Python 3.10 or later; BSD-3-Clause, marked Alpha on PyPI.
  - Status: verified. Source: [github.com](https://github.com/ig-python/trading-ig), checked 2026-09-18.
- ig-webapi-java-sample (Java, Official): Official IG sample, deprecated since Aug 2024; may be removed or replaced.
  - Status: verified. Source: [github.com](https://github.com/IG-Group/ig-webapi-java-sample), checked 2026-09-18.
- ig-webapi-dotnet-sample (C#, Official): Official IG sample, deprecated since Aug 2024; may be removed or replaced.
  - Status: verified. Source: [github.com](https://github.com/IG-Group), checked 2026-09-18.
- ig-webapi-javascript-sample (JavaScript, Official): Official IG sample, deprecated since Aug 2024; may be removed or replaced.
  - Status: verified. Source: [github.com](https://github.com/IG-Group), checked 2026-09-18.

## IG API: questions and answers

### Does IG have an API?

Yes. This register records IG as having its own API (REST and Streaming), with availability marked as active. REST plus streaming for IG spread bet and CFD accounts.

- Status: verified. Source: [IG Labs](https://labs.ig.com/), checked 2026-09-24.

### IG API key: how do I get one?

API keys are only issued to existing live account holders: generate one in My IG > Settings > API keys.

- Status: verified. Source: [How to use IG API](https://www.ig.com/uk/trading-platforms/trading-apis/how-to-use-ig-api), checked 2026-10-12.

### Who can use the IG API?

Spread bet and CFD accounts only. Share dealing, ISA and SIPP are not supported (error stockbroking-not-supported).

- Status: verified. Source: [trading-ig FAQ (community source)](https://trading-ig.readthedocs.io/en/latest/faq.html), checked 2026-10-12.

### IG API demo: is there a demo or sandbox?

Partial: demo API works, but no key from a standalone demo account unless it is linked to a live account.

- Status: verified. Source: [How to use IG API](https://www.ig.com/uk/trading-platforms/trading-apis/how-to-use-ig-api), checked 2026-10-12.
- Status: verified. Source: [IG Labs FAQ: the demo and live base addresses, and the demo key rule](https://labs.ig.com/faq.html), checked 2026-10-12.
- Status: verified. Source: [IG REST trading API guide: examples on the demo host](https://labs.ig.com/rest-trading-api-guide.html), checked 2026-10-12.

### What are the IG API rate limits?

Historical price data points a week: 10,000 data points per week. Scope: Per account, price history endpoints only. Non trading requests a minute: 30 requests per minute. Scope: Per account, non trading calls only. Non trading requests a minute: 60 requests per minute. Scope: Per application, that is per API key, non trading calls only. Concurrent streaming subscriptions: 40 subscriptions. Scope: Per streaming connection. Trading requests a minute: 100 requests per minute. Scope: Per account, trading calls only. Sources conflict: ig.com states around 40 trade requests per minute.

- Status: conflicting. Source: [labs.ig.com](https://labs.ig.com/faq.html), checked 2026-10-12.

### How does IG API authentication work?

Sources conflict. API key plus username and password returns CST and X-SECURITY-TOKEN, valid 12 hours on a rolling basis with each call resetting the clock on the IG Labs FAQ, while IG's REST trading API guide says 6 hours at first, extended up to a maximum of 72 hours: a disagreement between two IG pages that the blocked reference page could not settle on 23 Sep 2026. The other reading: IG Labs FAQ: 12 hours between calls, reset by each call. IG Labs REST trading API guide: 6 hours at first, extended up to 72 hours while in use.

- Status: conflicting. Source: [IG Labs REST trading API guide](https://labs.ig.com/rest-trading-api-guide.html), checked 2026-10-12.
- Status: conflicting. Source: [IG Labs FAQ](https://labs.ig.com/faq.html), checked 2026-10-12.

### Does the IG API support streaming?

Streaming runs on Lightstreamer: IG's Streaming API Guide starts by sending you to the Lightstreamer client library, and the server address to connect to comes back from the /session call. By default a connection holds up to 40 simultaneous subscriptions.

- Status: verified. Source: [IG Labs Streaming API Guide](https://labs.ig.com/streaming-api-guide.html), checked 2026-10-12.
- Status: verified. Source: [IG Labs FAQ](https://labs.ig.com/faq.html), checked 2026-10-12.

### How much history does the IG API return?

Up to 20 years of price history depending on resolution; 10,000 historical data points per week. Transactions and activity history are paged.

- Status: verified. Source: [IG: How to use IG API](https://www.ig.com/uk/trading-platforms/trading-apis/how-to-use-ig-api), checked 2026-10-12.
- Status: verified. Source: [IG Labs FAQ](https://labs.ig.com/faq.html), checked 2026-10-12.

### Is there a Python library for the IG API?

This register lists one Python library for the IG API. trading-ig (community, Python): Community wrapper, maintained in spare time; 214 forks. Version 0.0.25 (25 Aug 2026) needs Python 3.10 or later; BSD-3-Clause, marked Alpha on PyPI.

- Status: verified. Source: [trading-ig](https://github.com/ig-python/trading-ig), checked 2026-09-18.

### Which platform APIs work with an account at IG?

Recorded as offered, with a source: MetaTrader 4 and MetaTrader 5. Not verified either way: cTrader, TradeLocker, Match-Trader and DXtrade.

- Status: verified. Source: [IG UK MetaTrader 4](https://www.ig.com/uk/trading-platforms/metatrader-4), checked 2026-09-18.
- Status: verified. Source: [IG UK MetaTrader 5](https://www.ig.com/uk/trading-platforms/metatrader-5), checked 2026-09-18.

[IG API questions, each answered in a sentence or two](https://openbrokerapi.com/answers/ig).

## Partner programme

No published figure. [The IG partner programme record](https://openbrokerapi.com/partners/ig). This site carries no affiliate links.

## Licence and how to cite

The limit records on this page come from the limits register, which is CC BY 4.0 (https://openbrokerapi.com/data/limits.json). Everything else on it comes from records that are all rights reserved. This file is the page itself, at its own address, in another format, and it is not part of the CC BY 4.0 downloads listed at https://openbrokerapi.com/data.

Cite as: IG trading API: limits, auth and errors. Broker API Hub, https://openbrokerapi.com/brokers/ig, newest check 2026-10-12.

Where you rely on a single figure, cite the source and the checked date printed beside it as well. Where this page and a broker's own documentation differ, the documentation wins.
