Cardiv
Market maker programme

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.

On this page

Need help

Write to support@wolfedgelabs.com and include your party ID.