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

# Register a bank account

A bank account is registered once against a user or organization, and can then receive payouts from any of that entity's wallets.

<View title="REST API" icon="terminal">
  To register a bank account for a user, make a `POST` request to:

  ```bash theme={"system"}
  https://api.privy.io/v1/users/{user_id}/external_fiat_accounts
  ```

  To register one for an organization, make a `POST` request to
  `/v1/organizations/{organization_id}/external_fiat_accounts`. The request and response bodies are
  identical.

  In the body of the request, include the following fields:

  <ParamField body="provider" type="'bridge'" required>
    Provider that settles payouts to this account.
  </ParamField>

  <ParamField body="environment" type="'production' | 'sandbox'">
    Provider environment to use. Defaults to `production`.
  </ParamField>

  <ParamField body="currency" type="string" required>
    Fiat currency the account settles in, such as `usd` or `eur`.
  </ParamField>

  <ParamField body="account_owner_name" type="string" required>
    Legal name of the account holder. Set this to a third party's name to pay someone other than the
    verified entity.
  </ParamField>

  <ParamField body="bank_name" type="string">
    Name of the bank holding the account.
  </ParamField>

  <ParamField body="account" type="object" required>
    Bank account details. The `type` field determines which other fields apply.

    <Expandable title="account types">
      <ParamField body="account.type" type="'us' | 'gb' | 'iban' | 'pix' | 'swift'" required>
        Type of the bank account, which determines the rail the payout settles over.
      </ParamField>

      <ParamField body="us" type="object">
        Settles over ACH or wire. Requires `account_number` and a 9-digit `routing_number`, and
        accepts `checking_or_savings`.
      </ParamField>

      <ParamField body="gb" type="object">
        Settles over Faster Payments. Requires an 8-digit `account_number` and a 6-digit `sort_code`.
      </ParamField>

      <ParamField body="iban" type="object">
        Settles over SEPA. Requires `account_number` (the IBAN), `bic`, and `country` as an ISO 3166-1
        alpha-3 code.
      </ParamField>

      <ParamField body="pix" type="object">
        Settles over Pix. Requires exactly one of `pix_key` (an EVP, CPF, CNPJ, Brazilian phone
        number, or email) or `br_code`, and accepts `document_number`.
      </ParamField>

      <ParamField body="swift" type="object">
        Settles over wire, cross-border. Requires `account_number`, `bic`, `category`, at least one
        `purpose_of_funds`, and a `short_business_description`.
      </ParamField>
    </Expandable>
  </ParamField>

  <ParamField body="address" type="object">
    Address of the account holder, containing `street_line_1`, `city`, `country` as an ISO 3166-1
    alpha-3 code, and optionally `street_line_2`, `state`, and `postal_code`. Required for `us` and
    `swift` accounts.
  </ParamField>

  Below is a sample cURL command for this request:

  ```bash theme={"system"}
  curl --request POST https://api.privy.io/v1/users/did:privy:xxxxx/external_fiat_accounts \
    -u "<your-privy-app-id>:<your-privy-app-secret>" \
    -H "privy-app-id: <your-privy-app-id>" \
    -H 'Content-Type: application/json' \
    -d '{
      "provider": "bridge",
      "environment": "sandbox",
      "currency": "usd",
      "account_owner_name": "John Doe",
      "bank_name": "Chase",
      "account": {
        "type": "us",
        "account_number": "1234567899",
        "routing_number": "121212121",
        "checking_or_savings": "checking"
      },
      "address": {
        "street_line_1": "123 Washington St",
        "city": "New York",
        "state": "NY",
        "postal_code": "10001",
        "country": "USA"
      }
    }'
  ```

  A successful response includes the following fields:

  <ResponseField name="external_fiat_account" type="object">
    The registered account.

    <Expandable title="properties" defaultOpen>
      <ResponseField name="id" type="string">
        Unique ID of the account. Pass this as `destination.fiat_account_id` when creating a payout.
      </ResponseField>

      <ResponseField name="user_id" type="string">
        ID of the user the account belongs to. Organization accounts return `organization_id` instead.
      </ResponseField>

      <ResponseField name="provider" type="'bridge'">
        Provider that settles payouts to this account.
      </ResponseField>

      <ResponseField name="environment" type="'production' | 'sandbox'">
        Provider environment the account belongs to.
      </ResponseField>

      <ResponseField name="currency" type="string">
        Fiat currency the account settles in.
      </ResponseField>

      <ResponseField name="account_type" type="string">
        Type of the bank account.
      </ResponseField>

      <ResponseField name="bank_name" type="string">
        Name of the bank holding the account.
      </ResponseField>

      <ResponseField name="last_4" type="string">
        Last four digits of the account number. The full number is never returned after creation.
      </ResponseField>

      <ResponseField name="account_owner_name" type="string">
        Legal name of the account holder.
      </ResponseField>

      <ResponseField name="created_at" type="string">
        When the account was registered, as an ISO 8601 timestamp.
      </ResponseField>
    </Expandable>
  </ResponseField>

  ```json theme={"system"}
  {
    "external_fiat_account": {
      "id": "fa_3ad996de-e827-4d2e-99fc-799838520453",
      "user_id": "did:privy:xxxxx",
      "provider": "bridge",
      "environment": "sandbox",
      "currency": "usd",
      "bank_name": "Chase",
      "account_type": "us",
      "last_4": "7899",
      "account_owner_name": "John Doe",
      "created_at": "2026-07-30T12:00:00Z"
    }
  }
  ```
</View>

<Warning>
  A registered account's bank details cannot be changed. To pay out to different details, delete the
  account and register a new one. This prevents a payout from being redirected to another bank
  account without your app's knowledge.
</Warning>

## Next steps

<CardGroup cols={2}>
  <Card title="Get bank accounts" icon="list" href="/financial-flows/transfers/fiat-payouts/get-bank-accounts">
    List, read, and delete registered bank accounts
  </Card>

  <Card title="Execute a payout" icon="money-bill-transfer" href="/financial-flows/transfers/fiat-payouts/execute-payout">
    Convert crypto to fiat in a single call
  </Card>
</CardGroup>
