Create Payout Quote
Mint a signed payout quote.
quote_id is opaque and single-use; pass it to
POST /payouts within 60s to execute. Production HMAC-
signs it server-side; the sandbox derives it deterministically
from the request fingerprint so partner tests stay stable.
Idempotency: the quote endpoint is idempotency-required even
though it doesn’t move money. Partners retrying after a
network blip should get the same quote, not a fresh one with
different pricing — that’s a worse UX than the small extra
cost of replay storage.Authorizations
Paste your Connect API key (sk_live_… for production, sk_test_… for sandbox) without the Bearer prefix. Mint and rotate keys from the admin panel.
Body
Request body for POST /payouts/quote.
The asset + amount is what the user wants to send. We
determine routing (native vs bridge) by combining the asset
with the destination address's chain (auto-detected from the
address shape, or hinted via network_hint).
Notably absent: a separate from_network field. The partner
doesn't specify source — they specify the asset and we pick
the cheapest source chain that asset is available on. If that
yields a different chain than the destination (cross-chain),
we route through the bridge automatically.
Why external_ref is required here (vs. optional on
/addresses): payouts always debit a specific end-user's
balance. There's no "treasury payout" mode in Phase 3 — that
would require an org-level balance the partner has explicitly
funded, which isn't on the roadmap.
The partner-user whose balance funds the payout. Must already exist (have been seen by some prior Connect call). Unknown refs → 404 external_ref_unknown.
1 - 255On-chain destination address. Must be a valid address for the asset's natural network OR for network_hint when set.
1 - 128Asset code to send (USDT, XAUT). Case-insensitive.
2 - 16Amount of asset to send, in the asset's user-facing unit, as a decimal string. The recipient receives amount minus fee_total_usd (rendered as recipient_gets in the response).
1 - 64Optional destination-chain hint when the address shape is ambiguous (e.g. EVM addresses are valid on ethereum / polygon / arbitrum / base / avalanche / optimism — without this we'd guess). For native addresses (solana, tron, bitcoin) the chain is unambiguous from the address shape and this field is ignored.
2 - 16Response
Successful Response
Response body for POST /payouts/quote.
The quote is signed server-side (HMAC-SHA256 + 60s TTL +
single-use) — partners treat quote_id as an opaque bearer
string. Forging or tampering raises at consume time
(POST /payouts), not at quote read.
Opaque, signed, single-use. Expires at expires_at.
When the quote becomes invalid. Standard TTL is 60s from issuance.
What gets debited from the partner-user (decimal string).
What lands at destination after fees (decimal string).
Sum of network + provider + Zopay fees for this route, in USD as a decimal string. Always rendered in USD regardless of the asset because partners use this to compare alternative routes.
Routing summary baked into every quote.
Partners surface this to their user as "via Solana → Tron, ~90s" so the user understands the path before confirming.
Optional nudge surfaced when a cheaper / faster route exists for the same user. Absent on the quote response when no recommendation is actionable (e.g. the requested route is already the cheapest).
Returned inside the quote body (not as an error) when the user lacks the balance to cover this payout.
Partners can render "you need $50 more USDT" without parsing
an error; the quote_id is still issued (consumable to confirm
intent) but the partner is expected NOT to call POST /payouts
in this state. If they do, the execute call 422s with
insufficient_funds.