$EDEL_API_URL and the key from
$EDEL_API_KEY. Set EDEL_API_URL to the REST base URL the introduction lists.
1. Receive a server-issued bot key
A market-making bot does not use the agent-connect browser grant. The venue bot runtime issues its first key server side after verifying its workload identity and configured bot-to-account binding. The bot rotates that key before its seven-day expiry. These are server-only operations, not public setup steps. The bot key and an agent key are checked the same way and have the same one-account read and trade boundary. If you operate an independent automated strategy rather than the venue bot runtime, use the trading-agent browser approval flow instead. Do not imitate the bot issuance path. See the shared API key table for all principal kinds.2. Authenticate every request
Send the key as a bearer on every private request:GET /v1/api-keys/current:
Protect the key: it can trade this account. It can never deposit, withdraw or change the
Canton Party; those stay behind the owner’s passkey session. See
Authentication models for the guarantee that bounds a key.
3. Place and cancel orders
Placing and cancelling both need thetrade scope, and both take an Idempotency-Key header:
reuse the same value on every retry of one call, so a lost response never places or cancels
twice. A placed order also carries a clientOrderId in its body; choose it once for the logical
order and keep it stable across retries. A cancel body names only the owned account and market.
Place an order with POST /v1/orders. A limit order carries orderType limit, a price
and a quantity as decimal strings; side is buy or sell:
POST /v1/orders/:orderId/cancel. The
body names the owned account and market. An exact replay with the same Idempotency-Key
returns the original decision; a later cancel with a new key returns not_found:
reduceOnly, and attached take-profit and
stop-loss (autoClose).
4. Stream the book and your fills over WebSockets
Live data is pushed over the WebSocket at/streams/v1/ws. Edel has no webhooks, and REST
polling does not scale, so a market maker reads state from the socket.
- Market channels are open. Connect and subscribe to
market.bookandmarket.trades(andmarket.ticker,market.funding, and the rest) with no credential. - Account channels need a ticket. Your own events arrive on
account.orders,account.fills,account.positionsandaccount.balance. Mint a short-lived, account-scoped ticket with your key (POST /v1/realtime/ticket,readscope), send it in an auth frame on the socket, and subscribe only afterauth_okarrives. The ticket, not the key, travels on the connection, so a long-lived socket never parks your key. Rotate the ticket and authenticate the same socket again beforeexpiresAt; the socket authentication flow shows every frame.
Rate and risk limits
By default a venue allows 600 authenticated requests per 60 seconds for each API key. The window starts with your first request and resets 60 seconds later; it does not roll. Minting a realtime ticket counts against the same budget. A venue can set a different limit; a staging or production venue never allows more than 6,000 per window. A request over the limit is refused before the API acts on it, with429 and this envelope:
Retry-After header. Wait for your window to reset, at most 60 seconds, then
send the same request again with the same Idempotency-Key and clientOrderId. A rate-limit
refusal is never permission to retry an order with a new identity. Stream state over WebSockets
instead of polling REST; polling is the most common way a client reaches the limit.
Every order still passes the venue’s pre-trade risk checks, market bounds, margin and account
readiness rules. A valid key is not evidence that an order was accepted, journaled or settled.
Preserve clientOrderId and Idempotency-Key across an uncertain response. Do not infer a fill
from a successful HTTP response. The bot runtime also applies its own configuration and fleet
limits, which may be stricter than the public REST quota.