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, getOrdersHistory, getTrades, getFundingPayments, getSubAccount, getSubAccounts, getDelegatedSigners, getBalanceUpdates) 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, getOrdersHistory, getTrades, getFundingPayments, getSubAccount, getSubAccounts, getDelegatedSigners, getBalanceUpdates) 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