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/tradeRequest
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
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Client-generated unique request identifier |
method | string | Yes | Must be "post" |
params | object | Yes | Contains all parameters for the request |
Params Object
| Parameter | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Must be "getRateLimits" |
subAccountId | string | Yes | Subaccount identifier for authentication |
user | string | Yes | Wallet address to check rate limits for |
expiresAfter | integer | No | Optional expiration timestamp in milliseconds |
signature | object | Yes | EIP-712 signature using SubAccountAction type |
- This endpoint uses
SubAccountActionEIP-712 type (no nonce required, onlyexpiresAfteris 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
| Field | Type | Description |
|---|---|---|
requestsUsed | integer | Total requests used in the current rate limit window |
requestsCap | integer | Maximum 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 Code | Description | Retryable |
|---|---|---|
UNAUTHORIZED | EIP-712 signature validation failed | No |
VALIDATION_ERROR | Request validation failed | No |
MISSING_REQUIRED_FIELD | Required field is missing | No |
INVALID_FORMAT | Field format is invalid | No |
INVALID_VALUE | Invalid parameter value | No |
RATE_LIMIT_EXCEEDED | Too many requests in time window | Yes |
INSUFFICIENT_MARGIN | Not enough margin for trade | No |
ORDER_NOT_FOUND | Order does not exist | No |
OPERATION_TIMEOUT | Operation timed out | Yes |
Next Steps
- Rate Limits Overview — Comprehensive rate limiting documentation
- REST Alternative — REST API equivalent
