Rate limits by API
| API | Limit | Scope | Source | Checked |
|---|---|---|---|---|
| OANDA | 120 req/s, 7,200 req/min 120/s per IP address, HTTP 429 above it | IP address | developer.oanda.com | 3 Oct 2026 |
| cTrader Open API | 50 req/s, 3,000 req/min 50/s per connection | connection | help.ctrader.com | 18 Sep 2026 |
| Bitget | 20 req/s, 1,200 req/min 20/s per UID, Get Open Orders (UTA) | UID, per endpoint | bitget.com | 22 Sep 2026 |
| Dukascopy | 16 req/s, 960 req/min 16 orders/s (FIX API) | FIX session, orders | dukascopy.com | 22 Sep 2026 |
| Interactive Brokers | 10 req/s, 600 req/min 10/s global (Web API) | username | ibkrcampus.com | 18 Sep 2026 |
| Capital.com | 10 req/s, 600 req/min 10/s per user | user | open-api.capital.com | 18 Sep 2026 |
| Saxo OpenAPI | 2 req/s, 120 req/min 120/min per session, per service group | session | developer.saxo | 18 Sep 2026 |
| Deriv | Not published. Deriv does not publish fixed request limits for simultaneous or per minute API calls, so there is no figure to normalise. | not published | developers.deriv.com, API overview, 23 Sep 2026 | 23 Sep 2026 |
| IG | 1 req/s, 60 req/min 60/min per application (API key), non trading only. Per account: 100 trading a minute, 30 non trading a minute, 10,000 historical price points a week. Streaming: 40 concurrent subscriptions. IG's own how to use the IG API page states around 40 trade requests a minute, which this site labels as a conflict rather than resolving, and paces dealing against 40. Full record in IG allowances, one row each. | per application (API key), and per account split into trading only, non trading and historical data only; streaming per connection | labs.ig.com/faq | 5 Oct 2026 |
| eToro | 1 req/s, 60 req/min 60/min reads per key | user | api-portal.etoro.com | 20 Sep 2026 |
| Trading 212 | 0.2 req/s, 12 req/min 1 req/5s, account summary (example) | account | docs.trading212.com | 22 Sep 2026 |
| TradeLocker API | No single figure Per route limits only, served at runtime by /trade/config/. No fixed figures are published. A tl-developer-api-key header gets looser limits. | Not stated | public-api.tradelocker.com | 24 Sep 2026 |
| Exness | No single figure Not published. Exness tells clients to read them at runtime from getRateLimits rather than hardcoding any figure. | Not stated | get.exness.help | 23 Sep 2026 |
| MetaTrader 5 (Python package and MQL5) | Not published The Python page states none, carries no version and no date, and gives no consolidated error list beyond last_error() (read 22 Sep 2026). | Not stated | mql5.com | 23 Sep 2026 |
| FXCM | Not published No REST API is listed, so there is nothing to publish limits for. | Not stated | fxcm-rest.readthedocs.io | 21 Sep 2026 |
| Match-Trader Platform API | Not published | Not stated | docs.match-trade.com | 21 Sep 2026 |
| MetaTrader 4 (MQL4) | Not published | Not stated | docs.mql4.com | 20 Sep 2026 |
| FOREX.com / StoneX Trading (City Index) Unverified | Not confirmed Unverified: no rate limit published. FOREX.com's API page states none, and the technical documentation at docs.labs.gaincapital.com is behind a registration form (re-checked 22 Sep 2026). | Not stated | forex.com | 22 Sep 2026 |
| Pepperstone Unverified | Not confirmed Not published for either tier. Last looked for 25 Sep 2026. | Not stated | pepperstone.com | 21 Sep 2026 |
| MetaApi Unverified | Not confirmed Unverified: no rate limits were sourced on 20 Sep 2026. | Not stated | metaapi.cloud | 21 Sep 2026 |
| MetaCopier Unverified | Not confirmed Unverified: no rate limits were sourced on 20 Sep 2026. | Not stated | metacopier.io | 21 Sep 2026 |
| DXtrade APIs Unverified | Not checked Re-tried on 22 Sep 2026: Devexperts' blog on the DXtrade API and a Finance Magnates piece opened but give no rate limit figures, and describe the API as a broker integration suite; the developer portal at demo.dx.trade/developers is a JavaScript shell with no readable content. | Not stated | Not reachable, page tried: devexperts.com | 22 Sep 2026 |
| Swissquote Unverified | Not checked Re-tried on 22 Sep 2026: the OpenWealth professional trading API page opened but gives no rate limit figures, and the FIX API specification is closed to automated reading by robots.txt, so an absence could not be confirmed. | Not stated | Not reachable, page tried: bankingapi.swissquote.ch | 22 Sep 2026 |
| CMC Markets | No retail API No retail API; CMC Connect offers market data and execution through FIX API for institutional partners and states no rate limit (read 22 Sep 2026). | Not stated | cmcmarkets.com | 22 Sep 2026 |
| Axi | No retail API No native API; the help page lists only Autochartist and Trading Central for MT4 and MT5, with no API and no limit (read 22 Sep 2026). | Not stated | help.axi.com | 22 Sep 2026 |
| ThinkMarkets | No retail API Institutional page offers API solutions through vendors with no protocol, documentation or limit stated (read 22 Sep 2026). | Not stated | thinkmarkets.com | 22 Sep 2026 |
| FxPro | No retail API FxPro Prime offers FIX via PrimeXM XCore, MT5 bridge via Ultency and cTrader FIX via cBroker, for institutions; no limit stated (read 22 Sep 2026). | Not stated | fxpro.com | 22 Sep 2026 |
| Tickmill | No retail API FIX API offered to large private and institutional clients (minimum balance 500,000, minimum monthly commission 5,000, no demo); no limit stated (read 22 Sep 2026). | Not stated | tickmill.com | 22 Sep 2026 |
Deeper references: IBKR Web API websocket topics and pacing, endpoint by endpoint, cTrader Open API limits and every payloadType
What to do with these numbers
- Read the scope before the number: a limit per IP address, per API key, per session or per connection changes how you split work across scripts.
- Back off on HTTP 429 and wait before retrying, doubling the wait each time.
- Keep one persistent connection where the broker recommends it (OANDA does) instead of opening new ones.
- On IG, allowance errors arrive as error codes such as error.public-api.exceeded-api-key-allowance; the exact HTTP status is not confirmed.
The backoff loop itself
One helper for any API in the table above that signals a rate limit with HTTP 429. It waits for the seconds in Retry-After when the reply carries one, doubles its own wait when it does not, and gives up after six tries rather than hammering the broker. Nothing is sent from this page.
# Back off on 429 and double the wait, which is what the list above asks for.
# Use the seconds in Retry-After when the reply carries one, and our own 1, 2, 4 up to 60
# seconds when it does not. Not every API in the table sends Retry-After.
import time
import requests
def call(method, url, tries=6, **kw):
delay = 1
for attempt in range(tries):
resp = requests.request(method, url, timeout=10, **kw)
if resp.status_code != 429:
resp.raise_for_status()
return resp
header = resp.headers.get("Retry-After", "")
wait = min(int(header) if header.strip().isdigit() else delay, 60)
print("429 on", url, "- waiting", wait, "seconds before try", attempt + 2)
time.sleep(wait)
delay = min(delay * 2, 60)
raise SystemExit("Still rate limited after " + str(tries) + " tries. Lower your request rate.")IG is the exception on this site: it signals an exhausted allowance with an errorCode on HTTP 403 rather than a 429, and publishes no Retry-After, so this loop will never fire against it. The IG version of this helper branches on the errorCode instead.
IG allowances, one row each
IG splits its limits into allowances and returns an errorCode in the body rather than HTTP 429. This table is the full record of IG's limits on this site: one row per limit, with its scope, its source and the date that source was last checked. All five allowances were read on IG's developer FAQ at labs.ig.com/faq on 5 Oct 2026, and the same five values are what every other IG route here states. The record behind them is the ig-published-limits row of the fact register at /facts, which sources all five to the IG Labs FAQ. The three per account figures were withdrawn for the window of record 23 to 30 Sep 2026, while labs.ig.com/faq returned HTTP 500 on robots.txt, and were reinstated by the reading of 30 Sep 2026; that withdrawal is history, not the live reading. IG's own how to use the IG API page states a lower trading figure of around 40 a minute, also checked 5 Oct 2026. That conflict is labelled here and not resolved: pace dealing against 40 and treat 100 as the reference ceiling.
| Allowance | Figure | Scope | State on 5 Oct 2026 | Source and checked |
|---|---|---|---|---|
| Per application, non trading | 60 non trading requests a minute per application | Per API key (per application), non trading calls only | On IG's developer FAQ 60 non trading requests a minute for each application, which means for each API key. Read again in a browser on 12 Oct 2026. | labs.ig.com/faq · 12 Oct 2026 |
| Streaming subscriptions | 40 concurrent streaming subscriptions | Per streaming connection | On IG's developer FAQ 40 concurrent streaming subscriptions, which the FAQ says to manage by unsubscribing and subscribing as needed; IG's Streaming API Guide gives up to 40 per connection by default and asks you to contact IG to raise it. Both read in a browser on 12 Oct 2026. | labs.ig.com/faq · streaming guide · 12 Oct 2026 |
| Per account, trading | 100 trading requests a minute per account, with IG's own how to use page stating a lower figure of around 40 | Per account, trading calls only: creating or amending a position or a working order | Sources conflict Two IG pages give two numbers. The FAQ is the developer reference and states 100 a minute per account; IG's own how to use the IG API page on ig.com is a marketing page and states around 40 a minute. Both were checked on 5 Oct 2026 and neither is withdrawn, so the conflict is labelled rather than resolved and the lower figure is what a limiter should be sized to. This site paces dealing against 40 and treats 100 as the reference ceiling. | labs.ig.com/faq · 5 Oct 2026 ig.com, how to use the IG API · 5 Oct 2026 |
| Per account, non trading | 30 non trading requests a minute per account | Per account, non trading calls only | On IG's developer FAQ 30 non trading requests a minute for each account. Withdrawn for the window of record 23 to 30 Sep 2026 while labs.ig.com/faq would not open, reinstated by the reading of 30 Sep 2026 and still published when the page was checked again on 5 Oct 2026. | labs.ig.com/faq · 5 Oct 2026 |
| Historical price data | 10,000 historical price data points a week | Per account, historical data only: the price history endpoints | On IG's developer FAQ 10,000 historical price data points a week, which IG applies to the price history endpoints. Withdrawn for the window of record 23 to 30 Sep 2026 while labs.ig.com/faq would not open, reinstated by the reading of 30 Sep 2026 and still published when the page was checked again on 5 Oct 2026. IG's how to use the IG API page names only "a finite weekly limit of datapoints" with no number, checked 5 Oct 2026, so it neither confirms nor contradicts the 10,000. | labs.ig.com/faq · 5 Oct 2026 |
This table is the one canonical record of IG's limits on this site, last checked 5 Oct 2026. Every other IG route here states these same five values, with these scopes and this checked date, and shows fewer rows only where a shorter form is wanted. The matching error strings are error.public-api.exceeded-api-key-allowance, exceeded-account-allowance, exceeded-account-trading-allowance and exceeded-account-historical-data-allowance. Each one has its own page in the error dictionary. The block cleared. On 30 Sep 2026 labs.ig.com/faq opened and published all four allowances, so the per account figures have a page behind them again, and it opened again on 5 Oct 2026 with the same five figures. The labs.ig.com REST reference, the streaming reference and faq.html all failed on robots.txt with HTTP 500 on each attempt made on them, on 22, 23, 24 and 25 Sep 2026, and no workaround was attempted. That is why the figures were withdrawn. The withdrawal window of record, carried by the fact register, is 23 Sep 2026 to 30 Sep 2026, and the earlier description of it as five days is superseded.
Rate limits, with the denominator named, read 4 Oct 2026
| API | What the limit is counted against | Published limits, as the vendor words them | Where the number actually lives |
|---|---|---|---|
| IG | Per app, and separately per account | 60 non trading a minute per app, 100 trading a minute per account, 30 non trading a minute per account, 10,000 historical price points a week, 40 concurrent streaming subscriptions. IG's own how to use the IG API page on ig.com separately states around 40 trade requests a minute, which conflicts with the FAQ's 100; this site labels the conflict rather than resolving it and paces dealing against 40 | An undated FAQ at labs.ig.com/faq, not the reference. The full record of IG's limits is the table above on this page, last checked 5 Oct 2026 |
| Capital.com | Per user, and per API key on one endpoint | 10 requests a second per user, 1 per 0.1 seconds per user when opening positions or creating orders, 1 a second per API key on POST /session, 1000 an hour on demo for position and order creation | Published in the reference, version 1.0.0, newest changelog entry 28 Nov 2023 |
| OANDA | Per requesting IP address | 120 requests a second on REST with HTTP 429 above it, 20 active streams, and no more than 2 new connections a second | The development guide, not the introduction and not the reference. Undated |
| Saxo Bank | Per application per day, and per session per service group | 10,000,000 a day per application across all users and sessions, 120 a minute per session per service group, 1 order a second per session, and identical operations rejected inside a rolling 15 second window with HTTP 409 | Published on its own rate limiting page, undated |
| cTrader Open API | Per connection | 50 requests a second per connection for non historical data, 5 a second for historical data | Published in the Open API help, no version or date, copyright 2025 |
| Interactive Brokers | Per authenticated username | 10 requests a second globally, /iserver/scanner/params 1 request per 15 minutes, /iserver/marketdata/history capped at 10 a second or 50 a minute since the changelog entry of 9 Sep 2026, and a 10 minute penalty box for offending IP addresses | Published on the Campus Web API page and changelog |
| eToro | Per user key | 60 reads a minute, 20 writes or executions a minute, measured over a rolling one minute window, 429 with Retry-After | Published at api-portal.etoro.com/getting-started/rate-limits, undated |
| Trading 212 | Per account, whatever the key or IP | Per endpoint, for example 50 requests a minute, with all 50 allowed as a burst in the first 5 seconds, and a functional cap of 50 pending orders per ticker per account | Published with headers x-ratelimit-limit, -period, -remaining, -reset, -used; API is in open ended beta |
| TradeLocker | Per route, value not published | No numbers published anywhere. The documentation says rate limits vary by route and to call /trade/config/ for specifics; the Developer Program issues a tl-developer-api-key for less restrictive limits | Discoverable only at runtime; docs v1.5, last updated 22 May 2025 |
| Match-Trader | Not published | No auth method, no rate limits, no version and no dates on the trader API page, which hands the substance to a third party documentation host | No figures published |
| Deriv | Not published as fixed numbers | Deriv publishes no fixed per minute limit. A client reads its own allowances at runtime from the website_status call, which returns api_call_limits. The rate limits page at developers.deriv.com/docs/rate-limits answered HTTP 404 on 4 Oct 2026 | Runtime only; the documented page is missing |
Two readings follow from the right hand column rather than from the numbers. First, the limits that matter most are often not in the reference: IG’s five allowances exist only in an undated FAQ, OANDA’s three live on a development guide the introduction never points at, and TradeLocker’s and Deriv’s exist only at runtime behind a call to the API itself. Second, two of the eleven APIs here, Match-Trader and TradeLocker, publish no number at any address, which means a strategy built against them is pacing against something nobody has committed to in writing.
Sources: labs.ig.com FAQ · open-api.capital.com · OANDA development guide · Saxo rate limiting · cTrader Open API help · IBKR Campus Web API · IBKR Web API changelog · eToro rate limits · Trading 212 rate limiting · TradeLocker getting started · checked 4 Oct 2026
Independent and unofficial. Not affiliated with, endorsed by or operated by any firm named here.
OANDA rate limits: the numbers, and the page they are not on, 4 Oct 2026
OANDA does publish request rate limits, and they are not in the place a reader looks first. The v20 introduction and the REST reference carry none, which is the real gap; the numbers are on the development guide, and they were read again there on 4 Oct 2026.
| What is limited | The published limit | Counted against |
|---|---|---|
| REST API requests | 120 requests per second. Excess requests will receive HTTP 429 error | The requesting IP address |
| Streaming API connections | 20 active streams. Requests above this threshold will be rejected | The requesting IP address |
| New connections | No more than 2 new connections per second. Excess connections will be rejected | The client |
One more OANDA figure exists and this site already labels it, so it is repeated here rather than left to be found: the best practices page states one hundred requests a second for established connections, against the development guide’s 120 a second per IP address. Both pages are OANDA’s and both are current. This site treats the development guide as the enforced reading because it names the denominator and the HTTP status, and it publishes the disagreement rather than choosing quietly.
What is worth criticising about OANDA’s documentation is therefore narrower and more useful than a missing number. The limits exist and are specific. They are simply not beside the endpoints they constrain, not mentioned in the introduction a reader starts from, and not dated. The introduction also still names a legacy API token with no deprecation date for the legacy API, under a copyright range ending in 2019.
Practical guidance, stated as guidance. Pace REST against 120 a second and remember the denominator is your IP address rather than your account, so a second process on the same host shares your allowance. Hold to 20 active streams and open new connections no faster than two a second. Back off on HTTP 429.
Sources: OANDA development guide, the page that carries the limits · OANDA v20 introduction, which does not · checked 4 Oct 2026
Independent and unofficial. Not affiliated with, endorsed by or operated by any firm named here.