Market data and account
The seven read endpoints that cover everything you need to quote, with measured times.
Seven read endpoints cover everything you need to quote: three public, four behind your API key. Every measured time below was taken on devnet.
Responses use the envelope {"ok": true, "data": ...}; errors use {"ok": false, "error": {"code", "message"}}.
Public
GET /pairs, under 0.05 s. Every pair Cardiv trades, with base, quote and minQuoteAmount. Use the pair string verbatim in order bodies and URL-encode it in path parameters (CBTC%2FcETH). minQuoteAmount is the smallest notional the book keeps: orders below it are refused, and a fill that would leave a smaller remainder expires the remainder instead, so a large order can finish marginally short.
GET /orderbook/{pair}?depth=, 0.2 to 0.8 s. bids and asks as [price, quantity] string tuples, best price first. asOf.updateId is the point in the Canton Network's history the snapshot reflects. It reads a cached view rather than the Canton Network directly, so polling faster than every 1 to 2 seconds buys you no extra freshness.
GET /trades?pair=&limit=, 0.8 to 1.4 s. The public tape for the pair, newest first. Each entry carries tradeId, price, quantity and executedAt and nothing more: no party, no side, no attribution, for any caller.
Behind your key
Each endpoint here returns your own account and nothing else.
GET /account, 0.4 to 0.8 s. Your registration and your limits, and the right first call of any integration. feeExempt should read true; if it does not, stop and contact Cardiv before trading. clientOrderIdPrefix (acme-, for example) is what every clientOrderId you send must start with. status is ACTIVE, SUSPENDED or DISABLED, and a non-active account is refused new placements while its resting orders carry on. limits.allowedPairs is a list of pairs or "all". limits.maxOpenOrders and limits.ordersPerMinute are your caps, null when uncapped or on the venue default.
GET /orders?pair=&status=&limit=&refreshCalden=, 0.8 to 1.2 s. Your orders, and the authority on your own fills: filled and status track execution. status defaults to OPEN, which returns every resting state (OPEN, PARTIALLY_FILLED, PENDING_TRIGGER); ALL returns full history; any single status filters exactly. from and to bound creation time as ISO 8601 instants. side, pair and limit (default 100) do what they look like. Set refreshCalden=false in any polling loop: the default re-queries the wallet service on every call, measured at 34 seconds against 1 second for the same query.
GET /orders/{orderId}, under 1 s. Single-order lookup, and the recovery primitive after a failed, timed-out or lost submission. It reads directly and never triggers a wallet refresh. An orderId that does not exist and one belonging to somebody else both return 404 CONTRACT_NOT_FOUND, deliberately indistinguishable, so a 404 tells you only that the id is not yours.
GET /balances, 1 to 2 s warm. Your balances, with available free to commit to new orders and locked committed to resting ones, both decimal strings. It takes no parameters: one account is one party, and the key identifies it. Use it at startup and for periodic reconciliation, not in the quote loop; the first call against a cold cache can pass 10 seconds.
Need help
Write to support@wolfedgelabs.com and include your party ID.