https://orchestration.flashnet.xyz. For the end-to-end flow, see Standing Deposit Addresses.
All endpoints require a server key in Authorization: Bearer fn_.... Client keys are rejected, including on reads. Every mutation requires X-Idempotency-Key.
{ref} is your customer reference: a string of 1–128 characters, scoped to your partner account. Use the same reference throughout this API, not the returned standingAddressId. URL-encode it as one path segment; a simple identifier such as customer-123-usdc-v1 avoids encoding issues. Keep your own reference-to-customer mapping: this API has no list-all-instructions endpoint.
Create or retrieve an instruction
PUT /v1/standing-deposit-addresses/{ref}
The body defines the destination and conversion policy. Replace the address placeholders before sending:
The body and
destination object reject unknown fields. Do not include sourceChain, sourceAsset, amount, enabled, appFees, or an expiration. The server determines available source addresses. Deposits determine conversion amounts.
An affiliate entry is either a registered ID string or an override object:
^[a-z0-9][a-z0-9_-]{0,63}$. Overrides are integers 1–9999. Resolved affiliate fees must total less than 10000 basis points. Profiles must belong to your partner and have a payout address. Their resolved configuration is frozen into the instruction; subsequent profile changes do not change it. Register affiliates first.
Response
Both creation and identical-instruction retrieval return HTTP200:
The address map above is illustrative. Available sources depend on configured standing custody and partner/route admission. A chain address may observe multiple supported assets; it does not promise support for arbitrary tokens or every amount. An issued address is published only after deposit observation is acknowledged.
There is no creation-time quote, fixed output, deposit amount or expiry in this response. The destination and fee settings are not returned; store your submitted instruction.
Immutability and retries
The same partner/reference and normalized instruction return the same standing instruction. Different instructions at the same reference return409 instruction_conflict. This includes changes to destination, slippage, fees, affiliate entries and configured refund addresses. A different idempotency key does not permit an instruction change.
For a network timeout, retry with the original body and idempotency key. HTTP idempotency and instruction identity are separate checks: changing omitted defaults to explicit values can conflict with an existing idempotency key even when the resulting instruction would be equivalent. Preserve your original request.
A successful idempotent replay returns the original response with X-Idempotency-Replayed: true. Its enabled state or address map may now be stale. Use GET for current state. Failed registration can leave a durable instruction awaiting observation setup; retry the same reference and body rather than registering replacements.
Retrieve current addresses
GET /v1/standing-deposit-addresses/{ref}
Returns the same three fields as PUT. No idempotency key is required.
Existing addresses remain stable. A current GET or an identical PUT that is not served from the idempotency cache can add source chains enabled since registration. Treat new map entries as additional addresses; do not replace an existing address with a locally derived value. Retrieval can return a temporary error while new observation setup is unavailable.
Pause or resume
PATCH /v1/standing-deposit-addresses/{ref}
The complete body is:
true to resume. Unknown fields or a missing enabled return 400 immutable_instruction.
Response (200):
standing_address_paused; it does not clear unrelated holds or cancel refund requests.
Use a new idempotency key for each intended state change and the same key only to retry that change. There is no delete or instruction-edit endpoint.
List deposits
GET /v1/standing-deposit-addresses/{ref}/deposits?limit=50&offset=0
Response (
200), illustrating an unreserved deposit waiting for a sufficient amount:
Results are newest-first by observation time, then deposit ID.
nextOffset advances by limit when a full page is returned; otherwise it is null. A full final page can be followed by an empty page. Pagination is not a snapshot: deduplicate across shifting pages and revisit recent rows to receive status updates.
States before order creation
Once
orderId exists, follow the ordinary order lifecycle. Do not restrict status to the table above.
batchState is preparing, held, committed, refund_requested, refunded, or null. committed means batch initialization completed; it does not mean customer delivery completed. A batch can be refund_requested while the order’s status still says paused.
Useful deposit reasons include:
This is not an exhaustive error enum. Retain the server’s
code, show a pending/review state for unfamiliar nonterminal outcomes, and reconcile with the order when one exists.
Request a refund
POST /v1/standing-deposit-addresses/{ref}/resolve
Supply exactly one selector and an explicit source-chain refund target:
Do not send both
batchId and depositIds. Unknown fields are rejected. Duplicate deposit IDs fail the ownership/count check; deduplicate before submission.
Response (202):
202 alone as final payment.
HTTP errors
Errors use the standard envelope:
Address screening can also refuse a destination or refund target. Handle the returned error through your normal risk and compliance flow; changing idempotency keys does not bypass it.