Overview
Noah payouts let your client convert stablecoins to fiat and disburse through local payout rails.1. Prerequisite: approved KYC
Ensure the client has completed Noah onboarding and hasAPPROVED status.
See Noah KYC onboarding.
2. Get supported payout countries
countries map includes many additional country/currency combinations based on Noah support.
3. Get payout channels
CallGET /payouts/channels with at least cryptoCurrency. country and
fiatCurrency are optional filters; pass either or both to narrow results.
In Noah’s sandbox, cryptocurrency tickers must be suffixed with
_TEST (e.g. USDC_TEST). Drop the suffix in production. See Noah’s sandbox naming convention.Optional query params:
fiatAmount— pricing context for the returnedcalculated.totalFee.paymentMethodId— scope channels to a specific existing payment method.pageSize— page size (1-100).pageToken— pagination token from a previous response.
4. (Optional) Get saved payment methods
CallGET /payouts/payment-methods to list saved payout destinations for the approved customer.
If you want to use a saved payout destination, you can pass its id as paymentMethodId in POST /payouts/quote.
pageToken may also be present when pagination is returned.
5. Get dynamic form for selected channel
UseGET /payouts/channels/:channelId/form and render the returned formSchema.
formSchema can include additional nested validation rules (allOf, if/then, minLength, maxLength, pattern) that should be rendered and validated in your form UI.
6. Quote payout
CallPOST /payouts/quote to validate form data and get fee + estimate.
paymentMethodId is optional and is only needed when quoting against a saved payment method from step 4.
Provide exactly one of fiatAmount or cryptoAmount:
fiatAmount— amount the recipient receives. The quote derives the equivalent crypto.cryptoAmount— exact crypto the depositor will send. The quote derives the equivalent fiat (returned in the response’sfiatAmountdisclosure field).
quoted: true to request a fixed-rate quote. When quoted is true and
all form steps are complete, the response includes a quote object with a
signedQuote and expiry issued by Noah.
Forward quote.signedQuote unchanged into the Quoted trigger on
POST /payouts (as trigger.SignedQuote) to lock the rate end-to-end. See
the trigger variants in step 7.
Optional businessFee applies a per-transaction business fee on top of the
customer’s payout (fixed FeeBase and/or FeePct in the given FiatCurrency).
quoted: true was sent in the request and all form steps are complete,
the response also includes a quote object:
quote.signedQuote unchanged on POST /payouts
inside the Quoted trigger as trigger.SignedQuote. The deposit must arrive
and finalize before quote.expiry; otherwise the workflow proceeds at the
market rate at execution time.
7. Initiate payout
CallPOST /payouts using payoutId returned from quote.
nonce must be unique per transaction attempt (max 36 characters). Reuse the same nonce only when retrying the same payout request for idempotency.
After receiving this response, submit the onchain transfer to the returned
destinationAddress and ensure it satisfies the returned conditions (network and amount constraints).Trigger variants
You can pass an explicittrigger to control how the sell rule fires. The
Type field selects the variant:
SingleOnchainDepositSourceTriggerInput(default) — executes once.Conditions[*]must carryAmountConditions. Portal forwards the persistedfiatAmountfrom the quote when set.PermanentOnchainDepositSourceTriggerInput— fires on every matching deposit; the entire deposited crypto amount is always sold.Conditions[*]carriesNetworkonly — omitAmountConditions. OptionalNetworkAgnostic: truematches deposits on any network.QuotedOnchainDepositSourceTriggerInput— executes once and locks the conversion rate from a priorSellQuote. RequiresSignedQuoteon the trigger (fromquote.signedQuotereturned byPOST /payouts/quote).Conditions[*]carriesNetworkonly — omitAmountConditions.Expiryis optional and defaults to the bound quote’s expiry.
AmountConditions):
signedQuote returned by POST /payouts/quote
as trigger.SignedQuote; no AmountConditions; Expiry defaults to the
bound quote’s expiry):
ComparisonOperator values for the Single trigger: EQ, LTEQ, GTEQ.
You can also pass an optional businessFee at the top level of the payout
request — same shape as on POST /payouts/quote.
8. Configure Noah webhooks for payout updates
Set up Noah webhooks in Noah Dashboard to receive payout lifecycle and transaction updates directly from Noah.- Subscribe to
Transactionevents for payout execution and completion updates. - Noah Webhooks
9. Monitor payout progress
UseTransaction webhook events and Noah Dashboard delivery logs to track payout execution and reconciliation.