Rate Limits
GoDark enforces rate limits to ensure fair access and platform stability. Limits are designed around the MPC matching engine's throughput capacity — every order placement, cancellation, and modification requires multi-round computation across the MPC committee and consumes finite cryptographic preprocessing material.
Your per-account limits are tier-driven. Read the public schedule at GET /vip/tiers and your current budget at GET /account/vip. Every REST response includes X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers.
Cancellations use position-indexed lookup, which bypasses the MPC binary search and reduces their computational cost to ~0.2x of an order placement. This allows significantly higher cancel throughput — particularly important for market makers, who typically cancel 10-50x more than they place.
Tier Breakdown
| Tier | REST req/min | REST req/sec | Burst | WS msg/sec | WS conns | WS subs | Orders/min | Cancels/min | Mass Quotes/min | Max Open | Max Open/Symbol | Requirements |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Core | 60 | 2 | 5 | 5 | 2 | 5 | 10 | 50 | — | 15 | 5 | Email verified |
| Select | 300 | 10 | 20 | 20 | 3 | 20 | 120 | 600 | — | 80 | 15 | $5M 30D volume |
| Advanced | 1,200 | 40 | 100 | 100 | 5 | 100 | 480 | 2,400 | — | 300 | 40 | $10M 30D volume |
| Prime | 3,000 | 100 | 200 | 300 | 10 | 300 | 1,200 | 6,000 | 120 | 1,200 | 100 | $25M 30D volume |
| Apex | 6,000 | 200 | 300 | 500 | 15 | 500 | 2,400 | 12,000 | 600 | 2,500 | 200 | $50M 30D volume |
Mass Quotes — Each mass quote batch contains up to 20 cancel-replace legs. A batch of 20 legs counts as 1 MPC action. At the Apex tier, 600 mass quotes/min with 20 legs each delivers up to 12,000 effective quote updates per minute.
Trading Rules
| Rule | Limit | Scope |
|---|---|---|
| Order placement rate | 1 per 1 millisecond | Per symbol, per account |
| Cancel rate | 1 per 200 microseconds | Per symbol, per account |
| Modify rate | 1 per 1 millisecond | Per symbol, per account |
| Mass quote rate | 1 per 1 millisecond | Per symbol, per account |
| Quote rest | 1 millisecond between price improvements | Per symbol |
| Minimum notional | Min Size according to fee tier | Per order |
Weighted Action Costs
Operations consume different amounts of MPC capacity. The system tracks MPC budget using weighted costs:
| Action | MPC Weight | Rationale |
|---|---|---|
| Order placement | 1.0 | Full O(log N) MPC binary search for sorted insertion |
| Cancel | 0.2 | Position-indexed lookup — skips binary search |
| Modify | 1.2 | Cancel (0.2) + new insertion (1.0) |
| Mass quote (per batch) | 1.0 | Fused MPC rounds — constant round count regardless of leg count |
System-Wide Limits
The system enforces global throughput caps to protect the MPC matching engine from aggregate overload. These caps scale with the number of MPC committees via symbol-level sharding:
| Rule | Single Committee | 2 Committees | 4 Committees | Error Code |
|---|---|---|---|---|
| Global throughput cap | 10,000 actions/sec | 20,000 actions/sec | 40,000 actions/sec | 1503 |
| Per-symbol throughput cap | 5,000 actions/sec | 5,000 actions/sec | 5,000 actions/sec | 1502 |
| Per-symbol max book depth | 100,000 open orders | 100,000 open orders | 100,000 open orders | 1405 |
Each MPC committee handles a group of symbols independently. Adding committees linearly scales total system capacity while per-symbol limits remain constant.
When a system-wide or per-symbol cap is reached, additional orders are either queued (code 1502) or rejected (code 1503). See System Status for details on queuing behavior.
Best Practices
- Space orders at least 1ms apart and cancels at least 200μs apart per symbol.
- Use mass quotes for multi-level quote updates — a batch of 20 legs costs the same as a single order.
- Implement exponential backoff when receiving code
1429. - Aggregate small orders to meet the minimum trade size for the fee tier.
- Use different symbols simultaneously — limits are per-symbol.
- Track your request timestamps per symbol to stay within limits.
- If you receive code
1502(queued), do not resubmit — your order will be processed. - If you receive code
1503(system at capacity), retry with exponential backoff starting at 1 second.
Rate Limit Response
When rate-limited, you'll receive 429 Too Many Requests with:
{
"code": 1429,
"message": "Rate limit exceeded. Try again in 1ms.",
"timestamp": "2026-04-20T10:30:00.123Z",
"request_id": "req_01HXYZ..."
}
along with:
X-RateLimit-Limit: 1200
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1839975060
Retry-After: 1