awaiting_approval with zeroconfOffer.status: "pending". Use the endpoints below to accept or decline. Do not act on awaiting_approval alone. See Order Lifecycle for the full state machine and ZeroConf for how instant credit works.
Market-move repricing is handled automatically. If post-deposit execution would exceed the quote’s
slippageBps, the order refunds without partner action. There is no accept/decline step. See Market moves and refunds below.POST /v1/orchestration/zeroconf/accept
Accept a pending ZeroConf offer and start the instant-credit claim. It does not complete destination delivery.- Order must be in
awaiting_approvalwith a pendingzeroconfOffer. - The offer must not be expired.
- The API key must belong to the same partner as the order.
- Retrying the same request with the same
X-Idempotency-Keyis safe. A new accept request after the offer has already resolved returns an invalid state error. An expired pending offer returns409 expired.
POST /v1/orchestration/zeroconf/decline
Decline a pending ZeroConf offer. The order waits for 1 on-chain confirmation before proceeding.- Order must be in
awaiting_approvalwith a pendingzeroconfOffer. - The API key must belong to the same partner as the order.
ZeroConf offer fields
This is the canonicalzeroconfOffer schema. Status responses and webhook payloads use the same projection, so the object is identical wherever it appears.
When a Bitcoin L1 deposit receives a ZeroConf quote, the order includes a zeroconfOffer object:
Present only when set (omitted otherwise):
quoteNetwork, quoteSignature, planId, planAmountSats, planConfirmations, planStatus, transferSparkId, and claimId. These carry Spark static-deposit quote and fulfillment-plan details. Treat them as informational; the fields above are the ones to act on.
feeSats is not the Flashnet orchestration platform fee. Platform pricing stays in the normal quote and order fields such as feeBps, feeAmount, and totalFeeAmount. depositSats = instantSats + feeSats; accepting the offer credits the one net instantSats amount.
Read feeSats from each offer. Do not hard-code a fixed percentage or fixed sat amount.
Act only when both the order status is awaiting_approval and zeroconfOffer.status is pending. Resolve with:
POST /v1/orchestration/zeroconf/acceptto accept and receive instant creditPOST /v1/orchestration/zeroconf/declineto wait for 1 on-chain confirmation before proceeding
expired and the engine waits for 1 on-chain confirmation before proceeding.
zeroconfOffer can instead be { "status": "denied", "deniedAt": "..." }. That object is not an offer and has no accept or decline action; the order follows the confirmation path.
Market moves and refunds
If the pool moves against the quote between the deposit and execution, Orchestra refunds the order automatically. No partner action is required. The resulting order will havestatus=refunding and errorCode=slippage_exceeded before finalizing as refunded.
Late deposits (arriving after quote expiry) are always accepted and repriced at the live market rate at detection time, then executed against slippageBps. If the pool has moved too far, the normal slippage_exceeded refund applies.
Exact-out orders that can’t be satisfied from the received amount refund with one of:
exact_out_insufficient_input: the deposit was belowrequiredAmountInexact_out_input_above_max: the deposit exceededmaxAcceptedAmountInexact_out_target_not_met: the pool couldn’t producetargetAmountOut
order.refunding. Partners should treat these as normal refund flows.