> ## 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.

# getPayoutChannelForm

> Fetches the dynamic form schema for a Noah payout channel.

## Function Signature

```swift theme={null}
public func getPayoutChannelForm(channelId: String) async throws -> NoahGetPayoutChannelFormResponse
```

## Description

Loads the dynamic form schema for a payout channel so you can collect the recipient fields that channel requires before requesting a quote.

The `channelId` is percent-encoded as a single path segment, so identifiers containing reserved characters are handled safely.

<Tip>
  Channels returned by [`getPayoutChannels`](./noahgetpayoutchannels) may already include an inline `formSchema`. When they do, use it directly and skip this call.
</Tip>

## Parameters

| Parameter   | Type     | Required | Description                                  |
| ----------- | -------- | -------- | -------------------------------------------- |
| `channelId` | `String` | Yes      | Channel identifier from `getPayoutChannels`. |

## Returns

**`NoahGetPayoutChannelFormResponse`** — an envelope containing:

| Property   | Type                           | Description                 |
| ---------- | ------------------------------ | --------------------------- |
| `data`     | `NoahGetPayoutChannelFormData` | The response payload.       |
| `metadata` | `NoahResponseMetadata?`        | Freeform response metadata. |

`NoahGetPayoutChannelFormData`:

| Property       | Type                    | Description                                   |
| -------------- | ----------------------- | --------------------------------------------- |
| `formSchema`   | `[String: AnyCodable]?` | JSON Schema describing the fields to collect. |
| `formMetadata` | `NoahFormMetadata?`     | Schema metadata — `contentHash: String`.      |

## Example

```swift theme={null}
import PortalSwift

do {
  let response = try await portal.ramps.noah.getPayoutChannelForm(channelId: "ch-1")

  guard let schema = response.data.formSchema else {
    print("Channel requires no recipient form")
    return
  }

  // Render form fields from `schema` per Noah's JSON Schema
  print("Schema keys: \(schema.keys.sorted())")
  print("Content hash: \(response.data.formMetadata?.contentHash ?? "none")")
} catch {
  print("getPayoutChannelForm failed: \(error)")
}
```

## Errors

| Error                                           | Description                                        |
| ----------------------------------------------- | -------------------------------------------------- |
| `PortalApiError.unableToEncodeData`             | The `channelId` could not be percent-encoded.      |
| `PortalRequestsError.unauthorized`              | Authentication failed (401).                       |
| `PortalRequestsError.clientError`               | Client error (4xx). The channel id does not exist. |
| `PortalRequestsError.internalServerError`       | Server error (5xx).                                |
| `PortalRequestsError.couldNotParseHttpResponse` | The response could not be parsed.                  |
| `URLError.badURL`                               | The request URL could not be built.                |

## Related

* [Noah virtual accounts and payouts](../guide/noah)
* [getPayoutChannels](./noahgetpayoutchannels)
* [getPayoutQuote](./noahgetpayoutquote)
* [Noah payouts workflow](/integrations/On-Off-Ramp/noah-payouts)
