What does ZeroConf do?
When a Bitcoin L1 deposit is detected, the engine asks Spark for an instant static-deposit quote. If Spark returns a 0-conf fulfillment plan, Orchestra creates a ZeroConf offer and moves the order toawaiting_approval. Partners accept the offer to begin the instant-credit claim, or decline it to wait for the normal confirmed path.
How are confirmations handled?
What is the offer flow?
1
Create a Bitcoin L1 quote
Create an exact-in quote with
sourceChain=bitcoin. The quote response returns a Bitcoin L1 depositAddress. It does not include a ZeroConf offer.2
Deposit detected
After the Bitcoin transaction is broadcast and detected, the engine evaluates the specific UTXO for ZeroConf eligibility.
3
Spark returns a plan
If Spark returns a 0-conf plan, the engine stores a pending
zeroconfOffer and moves the order to awaiting_approval. If Spark requires confirmation, the order waits for 1 block.4
Accept or decline
Call
POST /v1/orchestration/zeroconf/accept for instant credit, or POST /v1/orchestration/zeroconf/decline to wait for 1 confirmation. Offers currently allow 60 seconds, but treat expiresAt as authoritative. If you do not respond before it, the offer expires and the engine waits for 1 confirmation.5
Execution continues
After acceptance (instant credit) or confirmation (1 block), the order proceeds through swapping, bridging, and delivery.
What fields are in a ZeroConf offer?
Three fields drive the decision:expiresAt: the deadline. Respond before it or the offer expires and the order waits for 1 confirmation.instantSats: what the order is credited on acceptance.feeSats: the difference between the deposited amount andinstantSats, from Spark’s static-deposit quote.depositSats = instantSats + feeSats. This is not the Flashnet orchestration platform fee; platform pricing stays in the normal quote and order fields such asfeeBpsandfeeAmount. ReadfeeSatsfrom each offer; do not hard-code a fixed percentage or sat amount.
instantSats. Confirmation does not release an additional amount.
The full object schema, including status, depositSats, and resolution timestamps, is in ZeroConf offer fields.
How do I accept or decline an offer?
Accept (instant credit):order.awaiting_approval webhook whose zeroconfOffer.status is pending. awaiting_approval alone is not an authorization to call these endpoints. Use a stable idempotency key per decision, and re-read the order when the response reports expired, invalid_state, or a conflict.
Accept returns status: "processing" when the instant-credit claim starts. It is not final destination delivery. Track the order through its normal status events until a terminal status.
When does ZeroConf apply?
- ZeroConf is evaluated for
sourceChain=bitcoinexact-in orders after the Bitcoin transaction is detected. - Exact-out (
amountMode=exact_out) uses confirmation-based processing and does not use ZeroConf. - Quote responses do not predict whether an offer will be created. The decision depends on the detected UTXO, the credited amount, and Spark’s fulfillment plan. The credited instant amount must meet the 1,000-sat execution floor.
- If Spark does not return a 0-conf plan, the engine falls back to the confirmed path without a partner action.
zeroconfOffer: { "status": "denied", "deniedAt": "..." } when no offer was created. This is not an offer and is not actionable; keep tracking the confirmed path.