Errors and limits
Nord rejects an action with a value from the Error enum. This page lists the
errors you are most likely to hit and the limits that cause them.
A rejected action still returns HTTP 200. The response is a Receipt whose kind
is err and carries the Error value, so always decode the receipt (see
Signed actions). The full enum is in the schema the
exchange serves at GET /schema.proto.
Limits
| Limit | Value | Error |
|---|---|---|
| Open orders per account | 100 | TOO_MANY_OPEN_ORDERS |
| Trading accounts per user (wallet) | 8 | TOO_MANY_USER_ACCOUNTS |
| Position size per market | $5,000,000 notional | POSITION_SIZE_LIMIT |
| Encoded action size | 1648 bytes, plus a 64-byte signature | ENCODED_ACTION_TOO_LARGE |
| Action timestamp | Within 2 minutes of server time | TIMESTAMP_OUT_OF_THRESHOLD |
| Open sessions per user | 200 | None; the oldest session is evicted |
| Session duration | 1 year | None; a longer expiry is capped to 1 year |
| External withdrawal fee | 1 USDC | — |
Rate limits
HTTP requests are rate-limited per client IP address, in two separate buckets:
| Bucket | Requests |
|---|---|
| Actions | POST /action |
| Default | Every other HTTP request |
Each bucket has its own requests-per-second rate and burst allowance, so heavy polling of REST endpoints doesn't consume your action budget. Requests over the limit are rejected. Back off and retry, and prefer WebSocket streams over polling.
Common errors
| Error | Meaning | What to do |
|---|---|---|
TIMESTAMP_OUT_OF_THRESHOLD | The action's currentTimestamp is more than 2 minutes from server time. | Fetch GET /timestamp before signing; don't use the local clock. |
TOO_MANY_OPEN_ORDERS | The account already has 100 open orders. | Cancel resting orders, or spread orders across subaccounts. |
POSITION_SIZE_LIMIT | The order would take the position past the position size limit. | Reduce the order size. |
POST_ONLY_MUST_NOT_FILL_ANY_OPPOSITE_ORDERS | A post-only order would have crossed the book. | Reprice the order away from the opposite side. |
MARKET_FROZEN | The market is frozen and isn't accepting this action. | Wait for the market to resume. |
ENCODED_ACTION_TOO_LARGE | The encoded action exceeds 1648 bytes. | Split large atomic actions into smaller ones. |
TRIGGER_WOULD_FIRE_IMMEDIATELY | The trigger price is already reached at placement. | Set a trigger price on the far side of the current price. |
TOO_MANY_USER_ACCOUNTS | The wallet already owns 8 trading accounts. | Reuse an existing account. |
Next steps
- Signed actions: build, sign, and submit actions.
- REST API: read state and server time.
- Changelog: protobuf and API changes by release.