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 continue immediately, or decline it to wait for the normal confirmed path.
How are confirmations handled?
| Scenario | Confirmations required |
|---|---|
| ZeroConf offer accepted | 0 (instant) |
| ZeroConf offer declined | 1 |
| ZeroConf offer expired (no response) | 1 |
| Spark requires confirmation or no offer is created | 1 |
What is the offer flow?
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.Deposit detected
After the Bitcoin transaction is broadcast and detected, the engine evaluates the specific UTXO for ZeroConf eligibility.
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.Accept or decline
Call
POST /v1/orchestration/zeroconf/accept for instant credit, or POST /v1/orchestration/zeroconf/decline to wait for 1 confirmation. If you do not respond before expiresAt, the offer expires and the engine waits for 1 confirmation.What fields are in a ZeroConf offer?
When present,order.zeroconfOffer contains:
| Field | Type | Description |
|---|---|---|
status | string | pending, accepted, declined, expired, or confirmed |
quoteId | string | ZeroConf quote identifier |
depositSats | string | Total BTC deposited (sats) |
instantSats | string | Amount credited instantly on acceptance |
holdbackSats | string | Amount reserved for later confirmed credit. Current generated offers use "0" |
feeSats | string | Difference between depositSats and instantSats from Spark’s static-deposit quote |
expiresAt | string | Offer expiry (ISO 8601) |
offeredAt | string | When the offer was generated |
resolvedAt | string or null | When accepted, declined, or expired. null while pending |
confirmed status means the Bitcoin transaction reached 1 confirmation before the offer was resolved, bypassing the approval window entirely.
feeSats is not the Flashnet orchestration platform fee. Platform pricing stays in the normal quote and order fields such as feeBps, feeAmount, and totalFeeAmount.
Read feeSats from each offer. Do not hard-code a fixed percentage or fixed sat amount.
How do I accept or decline an offer?
Accept (instant credit):When does ZeroConf apply?
- ZeroConf applies to eligible
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 and Spark’s fulfillment plan.
- If Spark does not return a 0-conf plan, the engine falls back to the confirmed path without a partner action.