{
  "name": "Broker API Hub: Limits register",
  "licence": "CC BY 4.0",
  "cite": "Broker API Hub, Limits register, openbrokerapi.com/data",
  "note": "structuredValue, structuredUnit and windowSeconds restate a limit as numbers where its own value and unit, or the opening of its text, state them outright: a count, optionally what is counted, and a window. They are read by a fixed pattern and are null wherever the pattern does not fit, so a null means not restated, not that there is no limit. windowSeconds is null for an allowance that is not a rate. structuredUnit is null where the wording does not name what is counted. A week is taken as 7 days. They add nothing to the record: value, unit, text and scope are unchanged and remain the record. A record whose status is conflicting has a second reading under conflict, which these fields do not restate.",
  "records": [
    {
      "id": "bitget.headline",
      "broker": "bitget",
      "name": "Public market data, legacy v1 API",
      "value": null,
      "text": "20 per 2 s per IP, public market data",
      "unit": null,
      "scope": "Per IP address, public market data endpoints of the legacy v1 API",
      "source": "https://bitgetlimited.github.io/apidoc/en/spot/",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "note": "Re-read on the legacy v1 documentation on 12 Oct 2026: 20 requests in 2 seconds. Authenticated endpoints there are set per endpoint per UID, and a general endpoint with no figure of its own is 10 a second. HTTP 429 on breach. The window is 2 seconds, which a single unit cannot state, so the figure stays as wording. The current API states its own overall limit, held in a separate record.",
      "review": {
        "state": "verified-at-source",
        "from": "bitgetlimited.github.io/apidoc/en/spot, opened 2026-10-12"
      },
      "structuredValue": 20,
      "structuredUnit": null,
      "windowSeconds": 2
    },
    {
      "id": "bitget.overall-per-ip",
      "broker": "bitget",
      "name": "Overall requests a minute",
      "value": 6000,
      "text": null,
      "unit": "requests per minute",
      "scope": "Per IP address, all requests to the common domain name, with REST and WebSocket sharing one allowance",
      "source": "https://www.bitget.com/docs/uta/quick-start",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "note": "Each endpoint also carries its own limit on its own documentation page, counted separately. HTTP 429 on breach.",
      "review": {
        "state": "verified-at-source",
        "from": "https://www.bitget.com/docs/uta/quick-start, opened 2026-10-12"
      },
      "structuredValue": 6000,
      "structuredUnit": "requests",
      "windowSeconds": 60
    },
    {
      "id": "bitget.ws-connections",
      "broker": "bitget",
      "name": "Concurrent WebSocket connections",
      "value": 100,
      "text": null,
      "unit": "connections",
      "scope": "Per IP address",
      "source": "https://www.bitget.com/docs/uta/quick-start",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "note": "Also 300 connection requests per IP in 5 minutes.",
      "review": {
        "state": "verified-at-source",
        "from": "https://www.bitget.com/docs/uta/quick-start, opened 2026-10-12"
      },
      "structuredValue": 100,
      "structuredUnit": "connections",
      "windowSeconds": null
    },
    {
      "id": "bitget.ws-messages",
      "broker": "bitget",
      "name": "WebSocket messages a second",
      "value": 10,
      "text": null,
      "unit": "messages per second",
      "scope": "Per WebSocket connection, counting ping, login, subscribe and unsubscribe messages",
      "source": "https://www.bitget.com/docs/uta/quick-start",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "note": "A connection that sends more is disconnected, and an IP that is disconnected repeatedly may be blocked.",
      "review": {
        "state": "verified-at-source",
        "from": "https://www.bitget.com/docs/uta/quick-start, opened 2026-10-12"
      },
      "structuredValue": 10,
      "structuredUnit": "messages",
      "windowSeconds": 1
    },
    {
      "id": "bitget.ws-subscription-requests",
      "broker": "bitget",
      "name": "WebSocket subscription requests an hour",
      "value": 240,
      "text": null,
      "unit": "subscription requests per hour",
      "scope": "Per WebSocket connection",
      "source": "https://www.bitget.com/docs/uta/quick-start",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "review": {
        "state": "verified-at-source",
        "from": "https://www.bitget.com/docs/uta/quick-start, opened 2026-10-12"
      },
      "structuredValue": 240,
      "structuredUnit": "subscription requests",
      "windowSeconds": 3600
    },
    {
      "id": "bitget.ws-subscriptions",
      "broker": "bitget",
      "name": "Concurrent WebSocket channel subscriptions",
      "value": 1000,
      "text": null,
      "unit": "channel subscriptions",
      "scope": "Per WebSocket connection",
      "source": "https://www.bitget.com/docs/uta/quick-start",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "note": "Bitget recommends fewer than 50 channels on one connection.",
      "review": {
        "state": "verified-at-source",
        "from": "https://www.bitget.com/docs/uta/quick-start, opened 2026-10-12"
      },
      "structuredValue": 1000,
      "structuredUnit": "channel subscriptions",
      "windowSeconds": null
    },
    {
      "id": "capital-com.headline",
      "broker": "capital-com",
      "name": "Headline limit",
      "value": null,
      "text": "10/s per user",
      "unit": null,
      "scope": "user",
      "source": "https://open-api.capital.com/",
      "alsoSources": [],
      "checked": "2026-09-18",
      "status": "verified",
      "conflict": null,
      "note": "Orders and new positions: 1 per 0.1 s. POST /session: 1 a second per API key. Demo: 1000 an hour for POST /positions and /workingorders.",
      "review": {
        "state": "ported",
        "from": "prototype v229 (cycle 86), read 2026-10-05"
      },
      "structuredValue": 10,
      "structuredUnit": null,
      "windowSeconds": 1
    },
    {
      "id": "ctrader.headline",
      "broker": "ctrader",
      "name": "Requests a second, not historical data",
      "value": 50,
      "text": null,
      "unit": "requests per second",
      "scope": "Per connection, requests that are not for historical data",
      "source": "https://help.ctrader.com/open-api/",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "note": "Historical data requests have their own lower limit, held in a separate record.",
      "review": {
        "state": "verified-at-source",
        "from": "help.ctrader.com/open-api, opened 2026-10-12"
      },
      "structuredValue": 50,
      "structuredUnit": "requests",
      "windowSeconds": 1
    },
    {
      "id": "ctrader.historical",
      "broker": "ctrader",
      "name": "Requests a second, historical data",
      "value": 5,
      "text": null,
      "unit": "requests per second",
      "scope": "Per connection, historical data requests only",
      "source": "https://help.ctrader.com/open-api/",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "review": {
        "state": "verified-at-source",
        "from": "https://help.ctrader.com/open-api/, opened 2026-10-12"
      },
      "structuredValue": 5,
      "structuredUnit": "requests",
      "windowSeconds": 1
    },
    {
      "id": "deriv.headline",
      "broker": "deriv",
      "name": "Headline limit",
      "value": null,
      "text": "80/min per logged in user (REST)",
      "unit": null,
      "scope": "user, REST",
      "source": "https://developers.deriv.com/docs/limits/",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "conflicting",
      "conflict": {
        "value": 60,
        "unit": "REST requests per minute per token",
        "source": "https://developers.deriv.com/llms/api-overview.md",
        "checked": "2026-10-12",
        "note": "Deriv's API overview in the text form it publishes for AI tools gives REST 60 requests a minute per token, where its Limits page gives 80 a minute per logged in user. The same overview also gives 100 WebSocket requests a second per connection, 100 active subscriptions per connection and 5 concurrent WebSocket connections per user, none of which the Limits page mentions. Deriv's own pages disagree; the conflict is labelled, not resolved.",
        "paceAgainst": 60
      },
      "note": "From the Limits page: REST is also capped at 300 a minute and 1,000 per ten minutes per IP address. WebSocket budgets, each shared by the calls in its row, a minute and an hour: proposal, proposal_open_contract, buy and sell 360 and 14,400; balance and statement 100 and 2,000; portfolio and profit table 30 and 1,500; all other calls 220 and 14,400. ping sits outside these budgets at 10 a second per connection.",
      "review": {
        "state": "verified-at-source",
        "from": "developers.deriv.com/docs/limits/ read in a browser 2026-10-12; developers.deriv.com/llms/api-overview.md read 2026-10-12",
        "note": "The HTML API overview at developers.deriv.com/docs/intro/api-overview/, read in a browser the same day, gives no limits; the differing figures are on the text form of the overview that Deriv's llms.txt links as covering rate limits. An earlier note gave 14 Aug 2026 as the Limits page's publication date; the page read on 12 Oct 2026 shows no date, so that line was dropped."
      },
      "structuredValue": 80,
      "structuredUnit": null,
      "windowSeconds": 60
    },
    {
      "id": "dukascopy.fix-connection-attempts",
      "broker": "dukascopy",
      "name": "Connection attempts a minute",
      "value": 5,
      "text": null,
      "unit": "connection attempts per minute",
      "scope": "Per IP address, per FIX server",
      "source": "https://www.dukascopy.com/media-storage/3000474271/o/",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "review": {
        "state": "verified-at-source",
        "from": "Dukascopy FIX API Programming Guide, revision 8.8.1, opened 2026-10-12"
      },
      "structuredValue": 5,
      "structuredUnit": "connection attempts",
      "windowSeconds": 60
    },
    {
      "id": "dukascopy.fix-open-positions",
      "broker": "dukascopy",
      "name": "Open positions",
      "value": 100,
      "text": null,
      "unit": "open positions",
      "scope": "FIX API. The guide does not say whether the count is per session or per account",
      "source": "https://www.dukascopy.com/media-storage/3000474271/o/",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "review": {
        "state": "verified-at-source",
        "from": "Dukascopy FIX API Programming Guide, revision 8.8.1, opened 2026-10-12"
      },
      "structuredValue": 100,
      "structuredUnit": "open positions",
      "windowSeconds": null
    },
    {
      "id": "dukascopy.headline",
      "broker": "dukascopy",
      "name": "Orders a second",
      "value": 16,
      "text": null,
      "unit": "orders per second",
      "scope": "FIX API, orders only. The guide does not say whether the count is per session or per account",
      "source": "https://www.dukascopy.com/media-storage/3000474271/o/",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "note": "Orders, not every request. Stated in the introduction of the FIX API Programming Guide, revision 8.8.1. The JForex API pages opened state no limit.",
      "review": {
        "state": "verified-at-source",
        "from": "Dukascopy FIX API Programming Guide, revision 8.8.1, opened 2026-10-12"
      },
      "structuredValue": 16,
      "structuredUnit": "orders",
      "windowSeconds": 1
    },
    {
      "id": "etoro.headline",
      "broker": "etoro",
      "name": "Headline limit",
      "value": null,
      "text": "60/min reads per key",
      "unit": null,
      "scope": "user",
      "source": "https://api-portal.etoro.com/core/getting-started/rate-limits.md",
      "alsoSources": [],
      "checked": "2026-09-20",
      "status": "verified",
      "conflict": null,
      "note": "Most GET calls. Trading and writes: 20 a minute. Tracked per user key over a one minute rolling window, 429 on excess. The page states no response headers, and the 120 per 60 seconds market data quota carried from earlier readings is now unverified.",
      "review": {
        "state": "ported",
        "from": "prototype v229 (cycle 86), read 2026-10-05"
      },
      "structuredValue": 60,
      "structuredUnit": null,
      "windowSeconds": 60
    },
    {
      "id": "forex-com-city-index.throttle",
      "broker": "forex-com-city-index",
      "name": "Request throttle",
      "value": null,
      "text": "500 requests per 5 s, HTTP 429 above it",
      "unit": null,
      "scope": "Requests from one client application. The page does not say whether the count is per session, per AppKey or per IP address",
      "source": "https://docs.labs.gaincapital.com/Content/Getting%20Started/CIAPI%20Basics.htm",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "note": "After a 429 the client must wait 1 second before sending more requests. The window is 5 seconds, which a single unit cannot state, so the figure stays as wording.",
      "review": {
        "state": "verified-at-source",
        "from": "https://docs.labs.gaincapital.com/Content/Getting%20Started/CIAPI%20Basics.htm, opened 2026-10-12"
      },
      "structuredValue": 500,
      "structuredUnit": "requests",
      "windowSeconds": 5
    },
    {
      "id": "ibkr.headline",
      "broker": "ibkr",
      "name": "Global requests a second (Web API)",
      "value": 10,
      "text": null,
      "unit": "requests per second",
      "scope": "Per authenticated username, that is per Web API session",
      "source": "https://www.ibkrcampus.com/campus/ibkr-api-page/webapi-doc/",
      "alsoSources": [
        "https://www.interactivebrokers.com/docs/web-api/trading/usage-and-availability/pacing-limitations"
      ],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "note": "Client Portal Web API. Some endpoints carry their own lower limit, held in separate records. A breach returns HTTP 429, and both IBKR pages read on 12 Oct 2026 give a penalty box of 10 minutes for a violating IP address.",
      "review": {
        "state": "verified-at-source",
        "from": "ibkrcampus.com Web API documentation and interactivebrokers.com pacing limitations page, opened 2026-10-12"
      },
      "structuredValue": 10,
      "structuredUnit": "requests",
      "windowSeconds": 1
    },
    {
      "id": "ibkr.marketdata-history",
      "broker": "ibkr",
      "name": "Historical market data requests",
      "value": null,
      "text": "Either 10 req/s or 50 req/minute, as the page words it",
      "unit": null,
      "scope": "GET /iserver/marketdata/history only",
      "source": "https://www.interactivebrokers.com/docs/web-api/trading/usage-and-availability/pacing-limitations",
      "alsoSources": [
        "https://www.ibkrcampus.com/campus/ibkr-api-page/webapi-doc/"
      ],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "note": "The page gives two figures joined by or and does not say which applies when, so no single number is recorded. The IBKR Campus page also lists 5 concurrent requests for this endpoint.",
      "review": {
        "state": "verified-at-source",
        "from": "https://www.interactivebrokers.com/docs/web-api/trading/usage-and-availability/pacing-limitations, opened 2026-10-12"
      },
      "structuredValue": null,
      "structuredUnit": null,
      "windowSeconds": null
    },
    {
      "id": "ibkr.marketdata-snapshot",
      "broker": "ibkr",
      "name": "Market data snapshot requests a second",
      "value": 10,
      "text": null,
      "unit": "requests per second",
      "scope": "GET /iserver/marketdata/snapshot only",
      "source": "https://www.interactivebrokers.com/docs/web-api/trading/usage-and-availability/pacing-limitations",
      "alsoSources": [
        "https://www.ibkrcampus.com/campus/ibkr-api-page/webapi-doc/"
      ],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "review": {
        "state": "verified-at-source",
        "from": "https://www.interactivebrokers.com/docs/web-api/trading/usage-and-availability/pacing-limitations, opened 2026-10-12"
      },
      "structuredValue": 10,
      "structuredUnit": "requests",
      "windowSeconds": 1
    },
    {
      "id": "ibkr.orders-poll",
      "broker": "ibkr",
      "name": "Order and trade list requests",
      "value": null,
      "text": "1 req/5 s",
      "unit": null,
      "scope": "GET /iserver/orders and GET /iserver/trades, each counted on its own",
      "source": "https://www.interactivebrokers.com/docs/web-api/trading/usage-and-availability/pacing-limitations",
      "alsoSources": [
        "https://www.ibkrcampus.com/campus/ibkr-api-page/webapi-doc/"
      ],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "note": "The same figure applies to /iserver/account/pnl/partitioned, /portfolio/accounts and /portfolio/subaccounts. The window is 5 seconds, which a single unit cannot state, so the figure stays as wording.",
      "review": {
        "state": "verified-at-source",
        "from": "https://www.interactivebrokers.com/docs/web-api/trading/usage-and-availability/pacing-limitations, opened 2026-10-12"
      },
      "structuredValue": 1,
      "structuredUnit": "requests",
      "windowSeconds": 5
    },
    {
      "id": "ibkr.sso-validate",
      "broker": "ibkr",
      "name": "Session validation requests a minute",
      "value": 1,
      "text": null,
      "unit": "requests per minute",
      "scope": "GET /sso/validate only",
      "source": "https://www.interactivebrokers.com/docs/web-api/trading/usage-and-availability/pacing-limitations",
      "alsoSources": [
        "https://www.ibkrcampus.com/campus/ibkr-api-page/webapi-doc/"
      ],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "review": {
        "state": "verified-at-source",
        "from": "https://www.interactivebrokers.com/docs/web-api/trading/usage-and-availability/pacing-limitations, opened 2026-10-12"
      },
      "structuredValue": 1,
      "structuredUnit": "requests",
      "windowSeconds": 60
    },
    {
      "id": "ibkr.tickle",
      "broker": "ibkr",
      "name": "Session keep alive requests a second",
      "value": 1,
      "text": null,
      "unit": "requests per second",
      "scope": "GET /tickle only",
      "source": "https://www.interactivebrokers.com/docs/web-api/trading/usage-and-availability/pacing-limitations",
      "alsoSources": [
        "https://www.ibkrcampus.com/campus/ibkr-api-page/webapi-doc/"
      ],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "review": {
        "state": "verified-at-source",
        "from": "https://www.interactivebrokers.com/docs/web-api/trading/usage-and-availability/pacing-limitations, opened 2026-10-12"
      },
      "structuredValue": 1,
      "structuredUnit": "requests",
      "windowSeconds": 1
    },
    {
      "id": "ig.historical-points-per-week",
      "broker": "ig",
      "name": "Historical price data points a week",
      "value": 10000,
      "text": null,
      "unit": "data points per week",
      "scope": "Per account, price history endpoints only",
      "source": "https://labs.ig.com/faq.html",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "review": {
        "state": "verified-at-source",
        "from": "labs.ig.com/faq.html, re-read 2026-10-12",
        "note": "The address without .html answers Internal Server Error; the .html form opens and states the figure. Re-read on 2026-10-12."
      },
      "structuredValue": 10000,
      "structuredUnit": "data points",
      "windowSeconds": 604800
    },
    {
      "id": "ig.non-trading-per-account",
      "broker": "ig",
      "name": "Non trading requests a minute",
      "value": 30,
      "text": null,
      "unit": "requests per minute",
      "scope": "Per account, non trading calls only",
      "source": "https://labs.ig.com/faq.html",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "review": {
        "state": "verified-at-source",
        "from": "labs.ig.com/faq.html, re-read 2026-10-12",
        "note": "The address without .html answers Internal Server Error; the .html form opens and states the figure. Re-read on 2026-10-12."
      },
      "structuredValue": 30,
      "structuredUnit": "requests",
      "windowSeconds": 60
    },
    {
      "id": "ig.non-trading-per-app",
      "broker": "ig",
      "name": "Non trading requests a minute",
      "value": 60,
      "text": null,
      "unit": "requests per minute",
      "scope": "Per application, that is per API key, non trading calls only",
      "source": "https://labs.ig.com/faq.html",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "review": {
        "state": "verified-at-source",
        "from": "labs.ig.com/faq.html, re-read 2026-10-12",
        "note": "The address without .html answers Internal Server Error; the .html form opens and states the figure. Re-read on 2026-10-12. labs.ig.com/node/158, once a second source for the same figure, showed an out of service notice in a browser on 2026-10-12 and was dropped, since the FAQ carries the figure."
      },
      "structuredValue": 60,
      "structuredUnit": "requests",
      "windowSeconds": 60
    },
    {
      "id": "ig.streaming-subscriptions",
      "broker": "ig",
      "name": "Concurrent streaming subscriptions",
      "value": 40,
      "text": null,
      "unit": "subscriptions",
      "scope": "Per streaming connection",
      "source": "https://labs.ig.com/faq.html",
      "alsoSources": [
        "https://labs.ig.com/streaming-api-guide.html"
      ],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "review": {
        "state": "verified-at-source",
        "from": "labs.ig.com/faq.html and labs.ig.com/streaming-api-guide.html, read in a browser 2026-10-12",
        "note": "The FAQ gives 40 concurrent subscriptions; the Streaming API Guide gives up to 40 simultaneous subscriptions per connection by default, which is where the per connection scope comes from. labs.ig.com/node/158, once a second source, showed an out of service notice in a browser on 2026-10-12 and was dropped."
      },
      "structuredValue": 40,
      "structuredUnit": "subscriptions",
      "windowSeconds": null
    },
    {
      "id": "ig.trading-per-account",
      "broker": "ig",
      "name": "Trading requests a minute",
      "value": 100,
      "text": null,
      "unit": "requests per minute",
      "scope": "Per account, trading calls only",
      "source": "https://labs.ig.com/faq.html",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "conflicting",
      "conflict": {
        "value": 40,
        "qualifier": "around",
        "unit": "trade requests per minute",
        "source": "https://www.ig.com/en/trading-platforms/trading-apis/how-to-use-ig-api",
        "checked": "2026-10-05",
        "note": "IG's own pages disagree. The conflict is labelled, not resolved.",
        "paceAgainst": 40
      },
      "review": {
        "state": "verified-at-source",
        "from": "labs.ig.com/faq.html, re-read 2026-10-12",
        "note": "The address without .html answers Internal Server Error; the .html form opens and states the figure. Re-read on 2026-10-12."
      },
      "structuredValue": 100,
      "structuredUnit": "requests",
      "windowSeconds": 60
    },
    {
      "id": "metaapi.account-credits",
      "broker": "metaapi",
      "name": "CPU credits per account",
      "value": null,
      "text": "5,000 CPU credits per 10 seconds",
      "unit": null,
      "scope": "Per MetaTrader account. REST and RPC calls only",
      "source": "https://metaapi.cloud/docs/client/rateLimiting/",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "note": "The window is 10 seconds, which a single unit cannot state, so the figure stays as wording.",
      "review": {
        "state": "verified-at-source",
        "from": "https://metaapi.cloud/docs/client/rateLimiting/, opened 2026-10-12"
      },
      "structuredValue": 5000,
      "structuredUnit": "CPU credits",
      "windowSeconds": 10
    },
    {
      "id": "metaapi.app-credits-hour",
      "broker": "metaapi",
      "name": "CPU credits an hour, per application",
      "value": 18000,
      "text": null,
      "unit": "credits per hour",
      "scope": "Per application, multiplied by the number of accounts deployed to MetaApi. REST and RPC calls only, counted in CPU credits and not in requests",
      "source": "https://metaapi.cloud/docs/client/rateLimiting/",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "note": "Also 43,200 credits per 6 hours.",
      "review": {
        "state": "verified-at-source",
        "from": "https://metaapi.cloud/docs/client/rateLimiting/, opened 2026-10-12"
      },
      "structuredValue": 18000,
      "structuredUnit": "credits",
      "windowSeconds": 3600
    },
    {
      "id": "metaapi.app-credits-minute",
      "broker": "metaapi",
      "name": "CPU credits a minute, per application",
      "value": 6000,
      "text": null,
      "unit": "credits per minute",
      "scope": "Per application, multiplied by the number of accounts deployed to MetaApi. REST and RPC calls only, counted in CPU credits and not in requests",
      "source": "https://metaapi.cloud/docs/client/rateLimiting/",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "review": {
        "state": "verified-at-source",
        "from": "https://metaapi.cloud/docs/client/rateLimiting/, opened 2026-10-12"
      },
      "structuredValue": 6000,
      "structuredUnit": "credits",
      "windowSeconds": 60
    },
    {
      "id": "metaapi.app-credits-second",
      "broker": "metaapi",
      "name": "CPU credits a second, per application",
      "value": 1000,
      "text": null,
      "unit": "credits per second",
      "scope": "Per application, multiplied by the number of accounts deployed to MetaApi. REST and RPC calls only, counted in CPU credits and not in requests",
      "source": "https://metaapi.cloud/docs/client/rateLimiting/",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "note": "Most read calls cost 50 credits, a trade costs 10 and listing symbols costs 500. Streaming uses no CPU credits. HTTP 429 with a recommended retry time on breach.",
      "review": {
        "state": "verified-at-source",
        "from": "https://metaapi.cloud/docs/client/rateLimiting/, opened 2026-10-12"
      },
      "structuredValue": 1000,
      "structuredUnit": "credits",
      "windowSeconds": 1
    },
    {
      "id": "metaapi.historical-concurrent",
      "broker": "metaapi",
      "name": "Concurrent historical market data requests",
      "value": 5,
      "text": null,
      "unit": "concurrent requests",
      "scope": "Per MetaTrader account, historical market data API only",
      "source": "https://metaapi.cloud/docs/client/rateLimiting/",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "review": {
        "state": "verified-at-source",
        "from": "https://metaapi.cloud/docs/client/rateLimiting/, opened 2026-10-12"
      },
      "structuredValue": 5,
      "structuredUnit": "concurrent requests",
      "windowSeconds": null
    },
    {
      "id": "metaapi.server-credits-second",
      "broker": "metaapi",
      "name": "CPU credits a second, per server",
      "value": 2000,
      "text": null,
      "unit": "credits per second",
      "scope": "Per shared front end server. REST and RPC calls only, counted in CPU credits and not in requests",
      "source": "https://metaapi.cloud/docs/client/rateLimiting/",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "note": "Also 18,000 a minute, 180,000 an hour and 432,000 per 6 hours on one server. The page says a different client-id header selects a different server.",
      "review": {
        "state": "verified-at-source",
        "from": "https://metaapi.cloud/docs/client/rateLimiting/, opened 2026-10-12"
      },
      "structuredValue": 2000,
      "structuredUnit": "credits",
      "windowSeconds": 1
    },
    {
      "id": "oanda.headline",
      "broker": "oanda",
      "name": "Headline limit",
      "value": null,
      "text": "120/s per IP address, HTTP 429 above it",
      "unit": null,
      "scope": "ip",
      "source": "https://developer.oanda.com/rest-live-v20/development-guide/",
      "alsoSources": [],
      "checked": "2026-10-03",
      "status": "verified",
      "conflict": null,
      "note": "Best practices. Also 2 new connections a second. The development guide separately states 120 requests a second per IP address, read 24 Sep 2026; the two figures are in different units and neither replaces the other.",
      "review": {
        "state": "ported",
        "from": "prototype v229 (cycle 86), read 2026-10-05"
      },
      "structuredValue": 120,
      "structuredUnit": null,
      "windowSeconds": 1
    },
    {
      "id": "saxo.headline",
      "broker": "saxo",
      "name": "Headline limit",
      "value": null,
      "text": "120/min per session, per service group",
      "unit": null,
      "scope": "session",
      "source": "https://www.developer.saxo/openapi/learn/rate-limiting",
      "alsoSources": [],
      "checked": "2026-09-18",
      "status": "verified",
      "conflict": null,
      "note": "Per session per service group; 1 order per second per session.",
      "review": {
        "state": "ported",
        "from": "prototype v229 (cycle 86), read 2026-10-05"
      },
      "structuredValue": 120,
      "structuredUnit": null,
      "windowSeconds": 60
    },
    {
      "id": "trading-212.headline",
      "broker": "trading-212",
      "name": "Headline limit",
      "value": null,
      "text": "1 req/5s, account summary (example)",
      "unit": null,
      "scope": "account",
      "source": "https://docs.trading212.com/api/section/rate-limiting",
      "alsoSources": [],
      "checked": "2026-10-12",
      "status": "verified",
      "conflict": null,
      "note": "Limits are set per endpoint and applied per account; this is the account summary example from the docs, not a single global figure. A different endpoint on the same docs page carries a much higher limit, order placement (POST market order) at 50 requests a minute, about one call every 1.2 seconds, shown elsewhere on this site's re-verified note dated 23 Sep 2026. The two figures are not a contradiction: they are two different endpoints on one rate-limiting page, read account summary 22 Sep 2026 and order placement 23 Sep 2026. Build a rate limiter against the endpoint you actually call, not against either figure alone.",
      "review": {
        "state": "ported",
        "from": "prototype v229 (cycle 86), read 2026-10-05"
      },
      "structuredValue": 1,
      "structuredUnit": "requests",
      "windowSeconds": 5
    }
  ]
}