Partner webhooks deliver order status changes for your partner account. Partner webhooks are the primary integration for:Documentation Index
Fetch the complete documentation index at: https://docs.flashnet.xyz/llms.txt
Use this file to discover all available pages before exploring further.
- orchestration orders
- accumulation address deposits (orders have
quoteId = null) - liquidation address deposits (orders have
quoteId = null)
How do I register an endpoint?
Create an endpoint:POST /v1/webhookswith{ "url": "https://..." }
webhookIdsecret(returned once)
What events are emitted?
Webhook events are derived from publicorder.status transitions:
order.processingorder.confirmingorder.bridgingorder.swappingorder.awaiting_approvalorder.refundingorder.deliveringorder.completedorder.failedorder.unfulfilledorder.refunded
paused transitions do not emit order.paused. Public webhook payloads continue to show data.status as processing until the order resumes or reaches a partner-visible final state.
See Order Lifecycle for the full state machine, transition rules, and what each status means.
What does the payload look like?
Webhooks are delivered as an HTTPPOST with Content-Type: application/json.
Payload envelope:
datais an order snapshot at the moment the event was emitted.paymentIntentis included on exact-out orders and on orders created withamountFiatUsd. For fiat-denominated orders,dataalso mirrorsamountFiatUsd,amountFiatCurrency, andspotUsdPerBtcat the top level.payLinkIdis included when the order originated from a pay-link.payLinkLabelis included when that pay-link was created with alabel. Use either to reconcile webhook events back to the originating pay-link without maintaining an external mapping.zeroconfOfferis included when a ZeroConf offer has been generated for a Bitcoin L1 deposit. See ZeroConf for the offer flow and Offer Fields for the field reference.feePlanis included when quoteappFeesoraffiliateIdwas requested.feePayoutsis included once payout legs are recorded.feePayouts.entries[*].roleisapp_feeorrecipient_payout.feePayouts.entries[*].affiliateIdis present for registry-based app-fee entries.feePayouts.entries[*].legisfull,instant, orholdback.feePayouts.entries[*].amountis the gross fee.platformCutAmountis Flashnet’s 20% cut.recipientAmountis the 80% paid to the fee recipient. These fields arenullforrecipient_payoutentries.- When a Flashnet swap has executed,
data.swapis included with simulation and execution metadata. - Some fields are
nulluntil the engine reaches that step.
What stages appear in the status endpoint?
GET /v1/orchestration/status includes a stages array. Stages are monotonic markers recorded when a step completes.
Common stage names:
deposit_confirmedamount_reconciled(actual deposit differed from quoted amount;amountInandfeeAmountupdated)swept(accumulation/liquidation and other Bitcoin source flows)bridged(bridge completed)swapped(swap completed)deliveredrefund_requestedrefunded
zeroconf_offer_pendingzeroconf_offer_acceptedzeroconf_offer_declinedzeroconf_accepteddeposit_claimedholdback_ready
swept_instant, swapped_instant, bridged_instant, delivered_instant, swept_holdback, swapped_holdback, bridged_holdback, delivered_holdback) are deprecated. Current orders use single-leg execution.
Treat stages as informational. The primary state machine is data.status.
How do I verify webhook signatures?
Each delivery includes two headers:X-Flashnet-Signature: hex-encoded HMAC-SHA256X-Flashnet-Timestamp: millisecond epoch timestamp of the delivery attempt
hex(HMAC_SHA256(secret, timestamp + "." + raw_body_json))
timestamp is the value of X-Flashnet-Timestamp.
Verify the signature against the raw request body bytes, not a re-serialized JSON object. Use the timestamp from the header, not from the payload.
Example (Node):
How are webhooks delivered?
- At least once: the same event may be delivered multiple times.
- Consider deliveries successful only when your endpoint returns a
2xxstatus.
- 10 seconds
- 30 seconds
- 2 minutes
- 10 minutes
- 30 minutes
- 2 hours
- 6 hours
- 24 hours
What should my handler do?
- Verify the signature before parsing JSON.
- Make processing idempotent.
- A safe key is
(data.id, event, timestamp).
- A safe key is
- Return
2xxonly after you have persisted the event.