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

TierREST req/minREST req/secBurstWS msg/secWS connsWS subsOrders/minCancels/minMass Quotes/minMax OpenMax Open/SymbolRequirements
Core60255251050155Email verified
Select3001020203201206008015$5M 30D volume
Advanced1,2004010010051004802,40030040$10M 30D volume
Prime3,000100200300103001,2006,0001201,200100$25M 30D volume
Apex6,000200300500155002,40012,0006002,500200$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

RuleLimitScope
Order placement rate1 per 1 millisecondPer symbol, per account
Cancel rate1 per 200 microsecondsPer symbol, per account
Modify rate1 per 1 millisecondPer symbol, per account
Mass quote rate1 per 1 millisecondPer symbol, per account
Quote rest1 millisecond between price improvementsPer symbol
Minimum notionalMin Size according to fee tierPer order

Weighted Action Costs

Operations consume different amounts of MPC capacity. The system tracks MPC budget using weighted costs:

ActionMPC WeightRationale
Order placement1.0Full O(log N) MPC binary search for sorted insertion
Cancel0.2Position-indexed lookup — skips binary search
Modify1.2Cancel (0.2) + new insertion (1.0)
Mass quote (per batch)1.0Fused 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:

RuleSingle Committee2 Committees4 CommitteesError Code
Global throughput cap10,000 actions/sec20,000 actions/sec40,000 actions/sec1503
Per-symbol throughput cap5,000 actions/sec5,000 actions/sec5,000 actions/sec1502
Per-symbol max book depth100,000 open orders100,000 open orders100,000 open orders1405

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

  1. Space orders at least 1ms apart and cancels at least 200μs apart per symbol.
  2. Use mass quotes for multi-level quote updates — a batch of 20 legs costs the same as a single order.
  3. Implement exponential backoff when receiving code 1429.
  4. Aggregate small orders to meet the minimum trade size for the fee tier.
  5. Use different symbols simultaneously — limits are per-symbol.
  6. Track your request timestamps per symbol to stay within limits.
  7. If you receive code 1502 (queued), do not resubmit — your order will be processed.
  8. 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