> ## Documentation Index
> Fetch the complete documentation index at: https://docs.portalhq.io/llms.txt
> Use this file to discover all available pages before exploring further.

# ramps.noah.getPayoutQuote

> Request a Noah payout quote for a channel and form responses.

## Function Signature

```dart theme={null}
Future<NoahGetPayoutQuoteResponse> getPayoutQuote(NoahGetPayoutQuoteRequest request)
```

## Description

Requests fees and crypto amount estimates for a payout on a given channel. Include `formJson` when the channel requires recipient data — fetch its schema with [`getPayoutChannelForm`](./noah-getpayoutchannelform) or read the inline `formSchema` on the channel.

Set exactly one of `fiatAmount` or `cryptoAmount`. The SDK checks this in Dart before calling the native SDK and throws a `PortalException` with code `INVALID_PAYOUT_QUOTE_AMOUNT` if you pass both or neither.

The returned `payoutId` feeds into [`initiatePayout`](./noah-initiatepayout).

## Parameters

| Parameter | Type | Required | Description |
| - | - | - | - |
| `request.channelId` | `String` | Yes | Payout channel id from `getPayoutChannels`. |
| `request.cryptoCurrency` | `String` | Yes | Crypto asset for the quote. |
| `request.fiatAmount` | `String?` | One of `fiatAmount` or `cryptoAmount` | Fiat amount to receive, as a string. |
| `request.cryptoAmount` | `String?` | One of `fiatAmount` or `cryptoAmount` | Crypto amount to sell, as a string. |
| `request.quoted` | `bool?` | No | Request a signed, rate-locked quote. Required if you intend to submit the payout with a `quoted` trigger. |
| `request.formJson` | `String?` | No | JSON-encoded recipient fields from the channel form. |
| `request.fiatCurrency` | `String?` | No | Fiat currency override when needed. |
| `request.paymentMethodId` | `String?` | No | Saved payment method to attach to the quote. |
| `request.formSessionId` | `String?` | No | Existing form session to continue, for multi-step forms. |
| `request.businessFee` | `NoahBusinessFee?` | No | Accepted for parity with the native SDKs, but ignored by Portal. Business fees come from the [Noah configuration](/integrations/On-Off-Ramp/noah) in the Portal Dashboard. |

## Returns

**`NoahGetPayoutQuoteResponse`** - An envelope containing:

| Property | Type | Description |
| - | - | - |
| `data` | `NoahGetPayoutQuoteData` | The response payload. |
| `metadataJson` | `String?` | JSON-encoded response metadata. Read it decoded through the `metadata` getter. |

`NoahGetPayoutQuoteData`:

| Property | Type | Description |
| - | - | - |
| `payoutId` | `String` | Identifier to pass to `initiatePayout`. |
| `totalFee` | `String` | Total fee for the payout. |
| `cryptoAmountEstimate` | `String` | Estimated crypto amount required. |
| `cryptoAuthorizedAmount` | `String` | Crypto amount the client is authorized to send for this quote. |
| `formSessionId` | `String` | Form session identifier for multi-step flows. |
| `cryptoCurrency` | `String?` | Crypto currency the quote was priced in. |
| `fiatCurrency` | `String?` | Fiat currency the quote was priced in. |
| `fiatAmount` | `String?` | Resolved fiat amount for the quote. |
| `rate` | `String?` | Exchange rate applied to the quote. |
| `breakdown` | `List<NoahTransactionBreakdownItem?>?` | Fee line items. Each has `type` (`ChannelFee`, `BusinessFee`, or `Remaining`) and `amount`. |
| `quote` | `NoahSellQuote?` | Signed quote — `signedQuote: String` and `expiry: String`. Present when `quoted` was `true`. |
| `nextStep` | `NoahFormNextStep?` | Next step in a multi-step form — `stepId`, `stepType` (parse with `NoahFormNextStepType.fromValue`), and the step's schema through the `schema` getter. |

## Example

```dart theme={null}
import 'dart:convert';

import 'package:portal_flutter/portal_flutter.dart';

final portal = Portal();

// Recipient fields matching the channel's form schema. The schema depends on
// the region the customer completed KYC in.
final form = <String, Object>{
  'AccountHolderName': {
    'AccountHolderType': 'Individual',
    'Name': {'FirstName': 'John', 'LastName': 'Doe'},
  },
  // ... other fields required by the schema
};

try {
  final quote = await portal.ramps.noah.getPayoutQuote(
    NoahGetPayoutQuoteRequest(
      channelId: 'ch-1',
      cryptoCurrency: 'USDC_TEST',
      fiatAmount: '10',
      formJson: jsonEncode(form),
    ),
  );

  print('Payout: ${quote.data.payoutId}');
  print('Send: ${quote.data.cryptoAuthorizedAmount}');
  print('Fee: ${quote.data.totalFee}');

  for (final item in (quote.data.breakdown ?? []).whereType<NoahTransactionBreakdownItem>()) {
    print('  ${item.type}: ${item.amount}');
  }
} on PortalException catch (e) {
  print('getPayoutQuote failed: [${e.code}] ${e.message}');
}
```

Request a rate-locked quote when the payout will use a `quoted` trigger:

```dart theme={null}
final quote = await portal.ramps.noah.getPayoutQuote(
  NoahGetPayoutQuoteRequest(
    channelId: 'ch-1',
    cryptoCurrency: 'USDC_TEST',
    cryptoAmount: '10.5',
    quoted: true,
  ),
);

final signedQuote = quote.data.quote?.signedQuote;
```

## Errors

| Code | Description |
| - | - |
| `NOT_INITIALIZED` | Portal was not initialized |
| `INVALID_PAYOUT_QUOTE_AMOUNT` | Both or neither of `fiatAmount` and `cryptoAmount` were set. Thrown before the native call |
| `NOAH_GET_PAYOUT_QUOTE_ERROR` | Failed to get the payout quote — for example missing required form fields, or an amount outside the channel's limits |

## Related

* [Noah virtual accounts and payouts guide](../guide/noah)
* [ramps.noah.getPayoutChannelForm](./noah-getpayoutchannelform)
* [ramps.noah.initiatePayout](./noah-initiatepayout)
* [Noah payouts workflow](/integrations/On-Off-Ramp/noah-payouts)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.