BSL Bulk Operations
Bulk operations let liquidity providers update many quotes with one request while keeping deterministic acknowledgement and retry behavior.
Signed Action Batch
The current compact path accepts a batch of signed actions:
{
"version": 1,
"actions": [
{
"payload": {
"account": "0x1111111111111111111111111111111111111111",
"nonce": 42,
"ts": 1781190000000,
"action": {
"SpotQuoteReplace": {
"market": 1,
"legs": [
{
"side": "Bid",
"price": 999900,
"qty": 100000,
"time_in_force": "post_only"
}
]
}
}
},
"signature": {
"scheme": "EcdsaSecp256k1",
"bytes": [1, 2, 3]
}
}
],
"idempotencyKey": "btc-quote-refresh-1842"
}
In private beta, submit through the tested route bundle from the Market Maker Beta Quickstart:
POST /api/order-entry/binary
Content-Type: application/x-senticore-order-entry-batch
X-BSL-Result-Mode: ack
X-Senticore-Response-Mode: detailed
Idempotency-Key: btc-quote-refresh-1842
Nonces: Out-Of-Order Pipelining
Nonces use a windowed replay-protection model. Any unused nonce in
[nonceFloor, nonceFloor + nonceWindow) is accepted. Gaps and out-of-order
submission are allowed, so concurrent batches may use arbitrary unused in-window
nonces.
On nonce reject, use the returned nonceFloor / nonceWindow and choose a
fresh unused nonce. Retry only the rejected action (a QuoteReplace is retried as a whole).
Atomicity
A batch is checked in two stages:
- frame, auth, timestamp, schema, market-lifecycle/expiry, nonce-window and
rate-limit failures reject the whole batch before enqueue
(
acceptedActions: 0, nothing sequenced, no nonce consumed), - after admission each action is applied on its own: an action that fails in
the engine (unfunded ask, below-minimum notional, price above 1.000,
tick/lot) is dropped with receipt
status: dropped,applied: false, and other actions in the batch are unaffected. AQuoteReplaceis one action, so one failing leg drops all its legs, bids included — see Batch atomicity, - admitted actions enter the normal sequencer path,
- terminal state is reconciled from streams, drop-copy, account reads, or receipts where provisioned,
QuoteReplaceandSpotQuoteReplaceare the preferred quote-refresh actions.
Cancel and Replace
Use QuoteReplace or SpotQuoteReplace legs with cancel_order_id when you
want to remove stale quote legs and place new quote legs in one signed action.
A leg with cancel_order_id and qty: 0 is cancel-only. A leg without
cancel_order_id is place-only.
Legacy facade routes still exist:
POST /api/v1/mm/orders/replace
POST /api/v1/mm/orders/cancel-replace
Use those only when the client is already wired to the compatibility facade.
Idempotency
Use both Idempotency-Key and idempotencyKey in the body for retriable
batches. Retrying the same key should return the existing response when the
request hash matches. If the request body changes under the same key, reconcile
before submitting new risk.