Skip to content

Rate limiting#

Our application limits the number of requests you can make during certain period of time. The restrictions are different for different REST API paths or websocket/SDK RPC API methods. If the request limit is exceeded, then error TooManyRequests (http status code - 429) will be returned. The error payload contains recommended time to repeat request at.

MetaApi API has following types of limits defined:

  • REST and RPC API rate limits
  • real-time market data streaming rate limits
  • real-time terminal state synchronization limits

REST and RPC API rate limiting#

REST and RPC API rate limiting use CPU credits system. There are several limits defined by the MetaApi app. According to each limit your app is granted with a number of credits per unit of time and you can consume the credits for making API calls.

REST and RPC API rate limits include 3 kinds of limits:

  1. Total number of CPU credits available per application
  2. Number of CPU credits available to be spent on a single server
  3. Number of CPU credits available to be spent on a single account

Historical market data API rate limits use the same system, however they are calculated independendtly of the rest of the API.

In addition to above, historical market data API limits number of concurrent requests per account.

Note, that small-scale applications are likely to hit limit #1 above. Large scale applications, which have more than 120 accounts deployed (as per time of writing this document) are likely to hit limit #2 first.

What should I do if I hit a REST/RPC API rate limit?#

If you hit a rate limit accidentally, just wait recommended time as per error payload and retry your request.

If you are consistently hitting rate limits this most likely means that you are not using our API efficiently. Consider switching from RPC-style API to real-time streaming API as it requires much less computational resources on server-side and thus scales much better. Feel free to contact our support to get some assistance on how to design more efficient application.

You can also contact support to request your rate limit quotas increase, however a justification might be required for rate limit quotas increase.

Total number of CPU credits available per application#

Below is a table of how many credits your entire application can spend for a period of time. Please note that you need to multiply these values by the number of accounts you have deployed to MetaApi to figure out your final quota.

Period Credits available
1 second 1000
1 minute 6000
1 hour 18000
6 hours 43200

Example: If you have 10 accounts deployed, then you end up with 10000 CPU credits quota per second because 1000 CPU credits per second is multiplied by the number of deployed accounts.

Error example:

{
  "id": 1,
  "error": "TooManyRequestsError",
  "message": "The getAccountInformation API allows 1000 cpu credits per 1s to avoid overloading our servers. Please wait some time and retry your request or contact support to extend your quota. For more information see https://metaapi.cloud/docs/client/rateLimiting/",
  "metadata": {
    "total": 1000,
    "available": 0,
    "needed": 50,
    "resourceId": 'user:userId',
    "multiplierId": 'accountCount:userId',
    "exceededConfig": 'perUser',
    "exceededPeriod": '1s',
    "recommendedRetryTime": "2022-05-31T09:00:52.361Z",
    "method": "getAccountInformation"
  }
}

Number of CPU credits available on a single server#

In order to avoid overloading a server, there is a separate limit each front-end server (there are 12 front-end servers at the time of writing this doc).

If you reached the credit limit on one server you can switch servers by selecting different value of client-id HTTP header.

Allowed credits on one server per time period

Period Credits available (shared server)
1 second 2000
1 minute 18000
1 hour 180000
6 hours 432000

An example of an error in the case of using all credits on one server

{
  "id": 1,
  "error": "TooManyRequestsError",
  "message": "The getAccountInformation API allows 2000 cpu credits per 1s to avoid overloading our servers. Please wait some time and retry your request or contact support to extend your quota. For more information see https://metaapi.cloud/docs/client/rateLimiting/",
  "metadata": {
    "total": 2000,
    "available": 0,
    "needed": 50,
    "resourceId": 'server:vGopD5NMrdcv',
    "exceededConfig": 'perServer',
    "exceededPeriod": '1s',
    "recommendedRetryTime": "2022-05-31T09:00:52.361Z",
    "method": "getAccountInformation"
  }
}

Number of CPU credits available to be spent on a single account#

Overloading a single account can adversely affect quality of service provided to your application, thus there is a separate limit of how many CPU credits you can spend making requests to a single account.

Available credits table for one account per time period

Period Credits available
10 seconds 5000

Error example:

{
  "id": 1,
  "error": "TooManyRequestsError",
  "message": "The getAccountInformation API allows 2000 cpu credits per 1s to avoid overloading our servers. Please wait some time and retry your request or contact support to extend your quota. For more information see https://metaapi.cloud/docs/client/rateLimiting/",
  "metadata": {
    "total": 5000,
    "available": 0,
    "needed": 100,
    "resourceId": 'account:16d703b1-f529-42c2-b647-dc660a313458',
    "exceededConfig": 'perAccount',
    "exceededPeriod": '10s',
    "recommendedRetryTime": "2022-05-31T09:00:52.361Z",
    "method": "getAccountInformation"
  }
}

Number of concurrent historical market data API requests per account#

MetaApi allows 5 concurrent historica market data requests per account.

Error example:

{
  "id": 1,
  "error": "TooManyRequestsError",
  "message": "It seems like you attempted to run too many concurrent historical market data requests for this account. You can execute a maximum of 5 concurrent historical market data requests per account. For more information see https://metaapi.cloud/docs/client/rateLimiting/",
  "metadata": {
    "maxRequestsPerAccount": 5,
    "concurrentRequestCount": 6,
    "recommendedRetryTime": "2021-02-05T16:59:17.029Z",
    "type": "LIMIT_CONCURRENT_MARKET_DATA_REQUESTS_PER_ACCOUNT"
  }
}

Cost of API calls in CPU credits#

Below is the table of the cost of each REST API request in credits.

Path Credits
GET /users/current/accounts/:accountId/accountInformation 50
GET /users/current/accounts/:accountId/positions 50
GET /users/current/accounts/:accountId/positions/:positionId 50
GET /users/current/accounts/:accountId/orders 50
GET /users/current/accounts/:accountId/orders/:orderId 50
GET /users/current/accounts/:accountId/history-orders/ticket/:ticket 50
GET /users/current/accounts/:accountId/history-orders/position/:positionId 50
GET /users/current/accounts/:accountId/history-orders/time/:startTime/:endTime 75 + (number of history orders found) * 0.65
GET /users/current/accounts/:accountId/history-deals/ticket/:ticket 50
GET /users/current/accounts/:accountId/history-deals/position/:positionId 50
GET /users/current/accounts/:accountId/history-deals/time/:startTime/:endTime 75 + (number of deals found) * 0.65
POST /users/current/accounts/:accountId/trade 10
GET /users/current/accounts/:accountId/symbols/symbols 500
GET /users/current/accounts/:accountId/symbols/:symbol/specification 50
GET /users/current/accounts/:accountId/symbols/:symbol/current-price 50
GET /users/current/accounts/:accountId/symbols/:symbol/current-candles/:timeframe 50
GET /users/current/accounts/:accountId/symbols/:symbol/current-tick 50
GET /users/current/accounts/:accountId/symbols/:symbol/current-book 50 + (number of book records) * 0.1
POST /users/current/accounts/:accountId/symbols/:symbol/unsubscribe 50
GET /users/current/accounts/:accountId/historical-market-data/symbols/:symbol/ticks 0.1 + (number of ticks returned) * 0.0002
GET /users/current/accounts/:accountId/historical-market-data/symbols/:symbol/timeframes/:timeframe/candles 0.1 + (number of candles returned) * 0.0004

Below is the table of the cost of each websocket/SDK API request in credits. Please note that only RPC API requests consume CPU credits. Real-time streaming API does not consume any credits.

Path Credits
getAccountInformation or get_account_information 50
getPositions or get_positions 50
getPosition or get_position 50
getOrders or get_orders 50
getOrder or get_order 50
getHistoryOrdersByTicket or get_history_orders_by_ticket 50
getHistoryOrdersByPosition or get_history_orders_by_position 50
getHistoryOrdersByTimeRange or get_history_orders_by_time_range 75 + (number of history orders found) * 0.65
getDealsByTicket or get_deals_by_ticket 50
getDealsByPosition or get_deals_by_position 50
getDealsByTimeRange or get_deals_by_time_range 75 + (number of deals found) * 0.65
trade methods 10
getSymbols or get_symbols 500
getSymbolSpecification or get_symbol_specification 50
getSymbolPrice or get_symbol_price 50
getCandle or get_candle 50
getTick or get_tick 50
getBook or get_book 50 + (number of book records) * 0.1
subscribeToMarketData or subscribe_to_market_data 50
unsubscribeFromMarketData or unsubscribe_from_market_data 50
refreshTerminalState or refresh_terminal_state 50
refreshSymbolQuotes or refresh_symbol_quotes 10

Real-time market data streaming rate limiting#

If you hit a market data streaming rate limit, then server will send you downgradeSubscription event. You can handle it via onSubscriptionDowngraded / on_subscription_downgraded event handler in SDK.

What should I do if I hit a market data streaming rate limits?#

If you hit a rate limit for market data subscriptions please make sure you unsubscribe from unwanted market data and also make sure you did not accidentaly made any unwanted heavy subscriptions.

Note that MT platform will subscribe to quotes of some symbols implicitly. E.g. if you have an EUR account and subscribe to a symbol which is nominated in USD (such as GBPUSD) then MT will automatically subscribe to the quotes of the symbol required to convert USD to EUR, i.e. EURUSD.

If you have no excessive subscriptions but still hitting the limit, then distribute your market data subscriptions across several accounts.

How market data streaming rate limits are calculated#

Each market data streaming event server sends to you costs some market data streaming credits.

Each account maintains an independent market data streaming credit accounting.

Your available credits are listed in the table below.

Period Credits available
10 seconds 31500
1 minute 126000
5 minutes 315000

Each market data streaming packet sent to you cost 2 credits. Each quote or candle your receive costs 2 credits. Each tick or order book entry you receive costs 1 credit.

Obviously market depth data subscriptions are usually most heavy, followed by tick data subscriptions.

How much market data I can receive given these limits?#

5 minute limit allows you to receive approximately 200K ticks which approximately equals to daily throughput on most active EURUSD symbol.

5 minute limit allows you to receive approximately 20K order books (given the average size of order book equal to 10) which approximately equals to 10% of the daily throughput on most active EURUSD symbol.

Thus you should have plenty of room for your market data subscriptions.

Real-time terminal state synchronization limits#

SDK performs terminal state synchronization in several steps. First, it is emitting a subscribe request to subscribe to the account synchronization events. Then it issues a synchronize request to synchronize to the terminal state.

There are three types of rate limits defined:

  • subscribe request rate limits
  • limits on the number of account subscriptions your application can establish
  • limits on the number of terminal state synchronizations

You are unlikely to ever worry about these limits as SDK is designed to observe the limits and react to rate limiting errors correctly.

Subscribe request rate limits#

Subscribe request is rate-limited based on the number of requests allowed from one account.

The number of available requests is multiplied by the number of deployed accounts.

Below is a table of how many requests can be made over a period of time.

Period Requests available
1 minute 10

Limits on the number of account subscriptions your application can establish#

There are currently two account susbcriptions limits:

  • total number of account subscriptions per application per server
  • total number of account subscriptions per application
  • total number of account subscriptions per server (applied to all users)

Total number of account subscriptions per server#

One user can subscribe to more than 300 accounts on one server, if you try to subscribe to more accounts, the server will respond with error 429 (TooManyRequests).

Error example:

{
  "id": 1,
  "error": "TooManyRequestsError",
  "message": "One user can connect to one server no more than 300 accounts. Current number of connected accounts 300. For more information see https://metaapi.cloud/docs/client/rateLimiting/",
  "metadata": {
    "maxAccountsPerUserPerServer": 300,
    "accountsCount":  300,
    "recommendedRetryTime": "2021-02-05T16:59:17.029Z",
    "type": "LIMIT_ACCOUNT_SUBSCRIPTIONS_PER_USER_PER_SERVER"
  }
}

Total number of account subscriptions per application#

This limit is calculated as the number of accounts deployed by the user multiplied by 10.

For example, if you have 5 accounts, then you can make no more than total of 50 subscriptions on all servers in the system.

Error example:

{
  "id": 1,
  "error": "TooManyRequestsError",
  "message": "You have used all your account subscriptions quota. You have 50 account subscriptions available and have used 50 subscriptions. Please deploy more accounts to get more subscriptions. For more information see https://metaapi.cloud/docs/client/rateLimiting/",
  "metadata": {
    "maxAccountsPerUser":  50,
    "accountsCount": 50,
    "recommendedRetryTime": "2021-02-05T16:59:17.029Z",
    "type": "LIMIT_ACCOUNT_SUBSCRIPTIONS_PER_USER"
  }
}

Total number of account subscriptions per server (applied to all users)#

If the server is overloaded, it will ask you to try to connect to another server.

Error example:

{
  "id": 1,
  "error": "TooManyRequestsError",
  "message": "You can not subscribe to more accounts on this connection because server is out of capacity. Please establish a new connection with a different client-id header value to switch to a different server. For more information see https://metaapi.cloud/docs/client/rateLimiting/",
  "metadata": {
    "changeClientIdHeader": true,
    "recommendedRetryTime": "2021-02-05T16:59:17.029Z",
    "type": "LIMIT_ACCOUNT_SUBSCRIPTIONS_PER_SERVER"
  }
}

Limits on the number of terminal state synchronizations#

The MetaApi limits the number of simultaneous synchronizations from one user.

Your application can synchronize to not more than 10% of the total number of the accounts you have subscribed to. The value is rounded to the closest greater integer and can not be less than 1.

For example, if you have subscriebed to 23 accounts, then you can execute a maximum of 3 concurrent synchronizations.

Error example:

{
  "id": 1,
  "error": "TooManyRequestsError",
  "message": "It seems like you attempted to run too many concurrent synchronizations on this server. You can have maximum of 10 concurrent synchronizations on this server because you have subscribed to 100 accounts on the server and you are allowed to execute one concurrent synchronization per 10 account subscriptions. For more information see https://metaapi.cloud/docs/client/rateLimiting/",
  "metadata": {
    "maxSynchronizationsCount": 10,
    "subscribedAccountsCount": 100,
    "synchronizationsPerAccount": 10,
    "recommendedRetryTime": "2021-02-05T16:59:17.029Z",
    "type": "LIMIT_ACCOUNT_SYNCHRONIZATIONS_PER_USER_PER_SERVER"
  }
}