Skip to main content
The Web SDK exposes Noah virtual accounts and global payouts through portal.ramps.noah. Each method sends a message to the embedded Portal iframe, which calls Portal’s Noah integration on the Client API using your client credentials. You do not call Noah’s servers directly from the browser.
For dashboard setup, signing keys, and supported CAIP-2 networks, see Noah integration overview. For HTTP shapes and webhooks, see the Noah workflow guides and Noah Business API / EMM documentation.

Prerequisites

Architecture

Prefer portal.ramps.noah over lower-level APIs. The SDK types for requests and responses live in @portal-hq/web (see the Web SDK reference section portal.ramps.noah (Noah)).

Types and responses

Successful Client API responses use an envelope { data: T, metadata?: Record<string, unknown> }. Methods on portal.ramps.noah return Promise of that envelope (for example NoahInitiateKycResponse is { data: { hostedUrl: string } }). Throwing or rejected promises usually indicate network errors, iframe timeouts, or API error payloads surfaced by the SDK—handle them with try/catch like other async Portal calls.

initiateKyc

Starts hosted Noah onboarding. Open data.hostedUrl in a new browser context (for example window.open with noopener,noreferrer). Validate HTTPS and the hostname against the checkout domains Noah documents for your environment (extend the example allowlist accordingly).
Signature
ReturnsNoahInitiateKycResponse: { data: { hostedUrl: string } }.
This call only starts onboarding; KYC outcome and status changes arrive asynchronously via Noah Customer webhooks. See Noah webhooks.
See also: Noah KYC guide, Noah hosted flows.

initiatePayin

Creates a fiat-to-stablecoin payin and returns bank instructions and a payinId. Use a supported CAIP-2 network and the user’s wallet address as destinationAddress.
Signature
ReturnsNoahInitiatePayinResponse: { data: { payinId: string; cryptoCurrency: string; fee: NoahFeeDetails; bankDetails: BankDetails } }. NoahFeeDetails shape: { fiatCurrencyCode: string; totalFeePct: string; totalFeeBase: string; totalFeeMin: string }. BankDetails includes:
  • paymentMethodId — payment method identifier
  • paymentMethodType — payment rail type
  • accountNumber — bank account number
  • cryptoCurrency — crypto currency for this payin
  • network — network identifier
  • fee — fee breakdown (NoahFeeDetails)
  • accountHolderName? — optional account holder name
  • bankCode? — optional bank routing/sort code
  • bankName? — optional bank name
  • bankAddress? — optional bank address with street, street2?, city, postCode, state, country
  • reference? — optional payment reference
  • relatedPaymentMethods? — optional array of related payment methods
Payin lifecycle updates are asynchronous; track them with Noah FiatDeposit and Transaction webhooks, not by polling this SDK response. See Noah webhooks.
See also: Payins, FiatDeposit webhooks.

simulatePayin

Sandbox-oriented call to estimate fees or eligibility for a payin without creating a live payin. Typical body includes a Noah paymentMethodId and fiat amount.
Signature
ReturnsNoahSimulatePayinResponse: { data: { fiatDepositId: string; reference?: string } }.

getPayoutCountries

Lists countries available for fiat payouts.
Signature
ReturnsNoahGetPayoutCountriesResponse: { data: { countries: Record<string, string[]> } }.

getPayoutChannels

Returns payout rails available for a crypto currency. country and fiatCurrency narrow results but are optional; fiatAmount can further refine channel availability.
Signature
ReturnsNoahGetPayoutChannelsResponse: { data: { items: Channel[]; pageToken?: string } }. Each Channel includes:
  • id — channel identifier
  • paymentMethodCategory'Bank' | 'Card' | 'Identifier'
  • paymentMethodType — payment rail type (NoahPaymentMethodType)
  • fiatCurrency — fiat currency code
  • country — ISO country code
  • limits{ minLimit: string; maxLimit?: string }
  • rate — exchange rate as a string
  • processingSeconds — estimated settlement time
  • calculated? — optional { totalFee: string }
  • processingTier?'Standard' | 'Priority'
  • issuer? — optional issuer identifier
  • paymentMethods?PaymentMethodDisplay[]
See also: Payouts.

getPayoutChannelForm

Loads the dynamic form schema for a channel so you can collect recipient fields before requesting a quote.
Signature
ReturnsNoahGetPayoutChannelFormResponse: { data: { formSchema?: Record<string, unknown>; formMetadata?: { contentHash: string } } }.

getPayoutQuote

Requests fees and crypto amount estimates for a payout. Include form when the channel requires recipient data.
Signature
ReturnsNoahGetPayoutQuoteResponse: { data: { payoutId: string; totalFee: string; cryptoAmountEstimate: string; cryptoAuthorizedAmount: string; formSessionId: string; rate?: string; breakdown?: TransactionBreakdownItem[]; quote?: NoahSellQuote; cryptoCurrency?: string; fiatCurrency?: string; fiatAmount?: string; nextStep?: FormNextStep } }.
  • cryptoAuthorizedAmount — authorized crypto amount for the payout
  • rate? — effective exchange rate for this quote
  • breakdown? — fee breakdown array ({ type: 'ChannelFee' | 'BusinessFee' | 'Remaining'; amount: string }[])
  • quote? — firm signed quote when quoted: true was requested ({ signedQuote: string; expiry: string })
  • cryptoCurrency?, fiatCurrency?, fiatAmount? — disclosure fields echoing back the quote parameters
When present, nextStep includes:
  • stepId'Vop' | 'Cob' | 'PaymentDetails'
  • stepType'Ack' or 'DataEntry'
  • schema — form schema for the next step

initiatePayout

Executes a payout after quoting. For crypto-sourced payouts you may need to pass deposit conditions from the quote response via a trigger payload; align with Payouts and Noah’s on-chain deposit triggers.
Signature
ReturnsNoahInitiatePayoutResponse: { data: { destinationAddress: string | null; conditions: DepositSourceTriggerCondition[]; ruleId?: string } }. Each DepositSourceTriggerCondition includes:
  • amountConditions — array of { comparisonOperator: 'EQ' | 'LTEQ' | 'GTEQ'; value: string }
  • cryptoCurrency — crypto asset code
  • network — CAIP-2 network identifier
  • destinationAddress — destination address for the deposit
After this call returns destinationAddress and conditions, submit the onchain transfer to satisfy them. You can do this with any wallet — including Portal’s own send method (portal.sendAsset(...)) on the same Portal instance, which builds, signs, and broadcasts in one call.
This call initiates the payout flow; completion and failures are reported asynchronously via Noah Transaction webhooks. See Noah webhooks.
See also: Transaction events, automated payout recipes.

getPaymentMethods

Returns payment methods available to the customer (for example cards or bank rails), including pagination tokens when present.
Signature
ReturnsNoahGetPaymentMethodsResponse: { data: { paymentMethods: PaymentMethod[]; pageToken?: string } }. Each PaymentMethod includes:
  • id — payment method identifier
  • paymentMethodCategory'Bank' | 'Card' | 'Identifier'
  • paymentMethodType — payment rail type
  • details — payment method details with type, optional accountNumber, bankCode, last4, scheme, identifierType, identifier, routingNumber, swiftCode, bankingSystems, bankName, bankAddress
  • accountHolderDetails? — optional holder info with name?: { firstName: string; lastName: string; middleName?: string }
  • issuerDetails? — optional issuer info with name?: string

Error handling

Wrap calls in try/catch. Log or surface errors without printing full API responses in production if they might contain sensitive identifiers. Retry only for idempotent reads unless your product team confirms otherwise.