Skip to content

Get Rate Limits (WebSocket)

Retrieve current rate limit usage and capacity for the authenticated user through the WebSocket connection. This method provides real-time information about API request consumption.

Endpoint

ws.send() wss://api.synthetix.io/v1/ws/trade

Request

Request Format

{
  "id": "ratelimits-1",
  "method": "post",
  "params": {
    "action": "getRateLimits",
    "subAccountId": "1867542890123456789",
    "user": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb",
    "expiresAfter": 1704067500,
    "signature": {
      "v": 28,
      "r": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
      "s": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890"
    }
  }
}

Parameters

Request Parameters

ParameterTypeRequiredDescription
idstringYesClient-generated unique request identifier
methodstringYesMust be "post"
paramsobjectYesContains all parameters for the request

Params Object

ParameterTypeRequiredDescription
actionstringYesMust be "getRateLimits"
subAccountIdstringYesSubaccount identifier for authentication
userstringYesWallet address to check rate limits for
expiresAfterintegerNoOptional expiration timestamp in milliseconds
signatureobjectYesEIP-712 signature using SubAccountAction type
Important Notes:
  • This endpoint uses SubAccountAction EIP-712 type (no nonce required, only expiresAfter is optional)

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);

Response Format

Success Response

{
  "id": "ratelimits-1",
  "status": 200,
  "result": {
    "status": "success",
    "response": {
      "requestsUsed": 45,
      "requestsCap": 1200
    }
  }
}

Response Fields

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

Error Response

{
  "id": "ratelimits-1",
  "status": 400,
  "result": null,
  "error": {
    "code": 400,
    "message": "Invalid request body"
  }
}

Code Examples

Check Rate Limit Status

{
  "id": "ratelimits-check",
  "method": "post",
  "params": {
    "action": "getRateLimits",
    "subAccountId": "1867542890123456789",
    "user": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb",
    "expiresAfter": 1704067500,
    "signature": { "v": 28, "r": "0x...", "s": "0x..." }
  }
}

Validation Rules

  • Subaccount ID must be valid and accessible
  • User address must be a valid Ethereum address
  • Authentication requires valid EIP-712 signature
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

Next Steps