Skip to content

Get Rate Limits

Retrieve current rate limit usage and capacity for the authenticated user. This endpoint provides real-time information about API request consumption, helping developers monitor usage and avoid hitting rate limits.

Endpoint

POST https://papi.synthetix.io/v1/trade

Request

Request Format

{
  "params": {
    "action": "getRateLimits",
    "subAccountId": "1867542890123456789",
    "user": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"
  },
  "expiresAfter": 1704067500,
  "signature": {
    "v": 28,
    "r": "0x19480589384695193600abcdef19480589384695193600abcdef19480589384695193600abcdef19480589384695193600abcdef",
    "s": "0xabcdef19480589384695193600abcdef19480589384695193600abcdef19480589384695193600abcdef19480589384695193600"
  }
}

Request Parameters

ParameterTypeRequiredDescription
paramsobjectYesRequest parameters wrapper
params.actionstringYesMust be "getRateLimits"
params.subAccountIdstringYesSubAccount ID for authentication
params.userstringYesWallet address to check rate limits for
ParameterTypeRequiredDescription
nonceuint64Yes*Positive integer nonce (must be incrementing and unique per request)
signatureobjectYesEIP-712 signature object
expiresAfteruint64NoUnix milliseconds expiration timestamp (5x rate limit on stale cancels)

:::info Common Parameters These are top-level request parameters. The subAccountId parameter is specified within the params object (see each endpoint's parameter table). :::

:::info SubAccountAction Endpoints Endpoints using SubAccountAction signing (getPositions, getOpenOrders, getOrderHistory, getTrades, getFundingPayments, getSubAccount, getSubAccounts, getDelegatedSigners, getBalanceUpdates, getWithdrawableAmounts, getFeeRate, getSnaxpotEpochTickets) do not require the nonce parameter. Only signature and optional expiresAfter are needed. :::

Response

Response Structure

FieldTypeDescription
statusstringAlways "ok" for successful requests or "error" for failures
responseobjectRate limit data (omitted when status is "error")
errorobjectError details (only present when status is "error")
request_idstringRequest tracking identifier

Success Response

{
  "status": "ok",
  "response": {
    "requestsUsed": 45,
    "requestsCap": 1200
  },
  "request_id": "5ccf215d37e3ae6d"
}

Response Fields

FieldTypeDescription
requestsUsedintegerTotal requests used in the current rate limit window
requestsCapintegerMaximum total requests allowed in the current window

Error Response

{
  "status": "error",
  "error": {
    "code": "INVALID_FORMAT",
    "message": "Invalid request body"
  },
  "request_id": "5ccf215d37e3ae6d"
}

Usage Examples

Check Rate Limit Status

{
  "params": {
    "action": "getRateLimits",
    "subAccountId": "1867542890123456789",
    "user": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"
  },
  "expiresAfter": 1704067500,
  "signature": { "v": 28, "r": "0x...", "s": "0x..." }
}

EIP-712 Signature

const domain = {
  name: "Synthetix",
  version: "1",
  chainId: 1,
  verifyingContract: "0x0000000000000000000000000000000000000000"
};
 
const types = {
  SubAccountAction: [
    { name: "subAccountId", type: "uint256" },
    { name: "action", type: "string" },
    { name: "expiresAfter", type: "uint256" }
  ]
};
 
const message = {
  subAccountId: "1867542890123456789",
  action: "getRateLimits",
  expiresAfter: 0
};
 
const signature = await signer._signTypedData(domain, types, message);

Implementation Notes

  • Returns rate limit usage for the authenticated user
  • Authentication requires signature by account owner or authorized delegate
  • Uses SubAccountAction EIP-712 type (no nonce required, only optional expiresAfter)

Signing

All trading methods are signed using EIP-712. Each successful trading request will contain:

  • A piece of structured data that includes the sender address
  • A signature of the hash of that structured data, signed by the sender

For detailed information on EIP-712 signing, see EIP-712 Signing.

Nonce Management

The nonce system prevents replay attacks and ensures order uniqueness:

  • Use any positive integer as nonce
  • Each nonce must be greater than the previous one (incrementing)
  • Date.now() is a convenient option, not a requirement
  • If nonce conflicts occur, increment by 1 and retry

:::note SubAccountAction Exception SubAccountAction endpoints (getPositions, getOpenOrders, getOrderHistory, getTrades, getFundingPayments, getSubAccount, getSubAccounts, getDelegatedSigners, getBalanceUpdates, getWithdrawableAmounts, getFeeRate, getSnaxpotEpochTickets) do not require a nonce. Only the signature and optional expiresAfter parameters are needed. :::

Rate Limit Information

:::info Rate Limits The Synthetix API enforces rate limits to ensure fair usage and system stability:

  • Order Placement: 100 orders per second per subaccount
  • WebSocket Connections: 100 connections per IP address
  • WebSocket Subscriptions: 1000 subscriptions per IP address

See Rate Limits for detailed information and best practices. :::

This endpoint itself is subject to rate limiting. For detailed rate limit policies, see Rate Limits.

Error Handling

Common error scenarios:

Error CodeDescriptionRetryable
UNAUTHORIZEDEIP-712 signature validation failedNo
VALIDATION_ERRORRequest validation failedNo
MISSING_REQUIRED_FIELDRequired field is missingNo
INVALID_FORMATField format is invalidNo
INVALID_VALUEInvalid parameter valueNo
RATE_LIMIT_EXCEEDEDToo many requests in time windowYes
INSUFFICIENT_MARGINNot enough margin for tradeNo
ORDER_NOT_FOUNDOrder does not existNo
OPERATION_TIMEOUTOperation timed outYes
ErrorDescription
Invalid request formatRequest payload could not be parsed
Authentication errorInvalid or missing EIP-712 signature

Related Endpoints