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

# Bank transfers

> How to move money between bank accounts and OMS wallets in both directions.

<Note>
  **Before you start:** the OMS API is in early access. Every endpoint, including the ones in this guide, requires an early-access API key. [Request access](https://info.polygon.technology/get-early-access?utm_source=docs\&utm_medium=card\&utm_campaign=oms_access) before you begin.

  Authenticate by exchanging your API key and secret for a bearer token at `POST /auth/token`, then send it as `Authorization: Bearer {token}` on every request. See [Get started](/payments/get-started) for the full flow.
</Note>

Moving value in and out of an OMS wallet over bank rails (ACH and wire) is in early access. Inbound bank transfers depend on virtual accounts; outbound bank payouts depend on external bank accounts. Neither has an endpoint yet.

What works today:

* **Getting fiat in**: use cash-in, where a customer deposits physical cash and OMS delivers USDC to the wallet. See the [Cash-in guide](/api-reference/guide-cash-in).
* **Moving value out of a wallet**: use the `POST /quotes` then `POST /transactions` pattern when the destination is another OMS wallet or an external `blockchainAddress`. This is a crypto-to-crypto send, available now.

A quote's `source` is always an OMS wallet (`walletId`, `asset`, `network`), so the supported out-of-wallet flow keeps crypto on both sides.

## Move value out of a wallet (available today)

This flow sends USDC from a customer's wallet to an onchain address. OMS infers the `cryptoToCrypto` type from the source and destination asset pair.

### Step 1: Create a quote

<CodeGroup>
  ```bash Sandbox theme={null}
  curl -X POST https://sandbox-api.polygon.technology/v0.9/quotes \
    -H "Authorization: Bearer {token}" \
    -H "Content-Type: application/json" \
    -H "Idempotency-Key: qt-send-001" \
    -d '{
      "customerId": "cst_01H9Xa...",
      "source": {
        "walletId": "wlt_01H9Xb...",
        "asset": "usdc",
        "network": "polygon"
      },
      "destination": {
        "wallet": { "blockchainAddress": "0xBEEF4a2c891D56e72b67a3f21d0cf94F1D7c5911" },
        "asset": "usdc",
        "network": "polygon"
      },
      "sponsorGas": true
    }'
  ```

  ```bash Production theme={null}
  curl -X POST https://api.polygon.technology/v0.9/quotes \
    -H "Authorization: Bearer {token}" \
    -H "Content-Type: application/json" \
    -H "Idempotency-Key: qt-send-001" \
    -d '{
      "customerId": "cst_01H9Xa...",
      "source": {
        "walletId": "wlt_01H9Xb...",
        "asset": "usdc",
        "network": "polygon"
      },
      "destination": {
        "wallet": { "blockchainAddress": "0xBEEF4a2c891D56e72b67a3f21d0cf94F1D7c5911" },
        "asset": "usdc",
        "network": "polygon"
      },
      "sponsorGas": true
    }'
  ```
</CodeGroup>

* `source`: the OMS wallet to pull from. The `walletId`, `asset`, and `network` are all required.
* `destination.wallet`: either another OMS wallet (`wallet`) or an external onchain address (`blockchainAddress`). This example sends to a `blockchainAddress`.

The response includes a locked rate, a fee breakdown, and an expiry. Present `destination.amountNet` to the customer before they confirm.

<Tip>
  Set `sponsorGas: true` to cover Polygon gas for your customers. Gas on Polygon averages \$0.002 per transaction and appears as `sponsorGasCost` on the transaction object, billed to your developer account.
</Tip>

### Step 2: Execute the transaction

<CodeGroup>
  ```bash Sandbox theme={null}
  curl -X POST https://sandbox-api.polygon.technology/v0.9/transactions \
    -H "Authorization: Bearer {token}" \
    -H "Content-Type: application/json" \
    -H "Idempotency-Key: txn-send-001" \
    -d '{ "quoteId": "qt_01H9Xq..." }'
  ```

  ```bash Production theme={null}
  curl -X POST https://api.polygon.technology/v0.9/transactions \
    -H "Authorization: Bearer {token}" \
    -H "Content-Type: application/json" \
    -H "Idempotency-Key: txn-send-001" \
    -d '{ "quoteId": "qt_01H9Xq..." }'
  ```
</CodeGroup>

The request body is just the quote ID: the quote is the contract. OMS pulls USDC from the wallet and delivers it to the destination. You receive a `transaction.cryptoToCrypto.completed` webhook with the onchain `txHash` when the send settles.

## Bank rails (early access)

Bank transfers in both directions are in early access. Inbound ACH and wire need a virtual account, which provisions a dedicated bank account number per customer and auto-creates a `fiatToCrypto` transaction when a deposit arrives. Outbound ACH and wire payouts pull from a wallet to an external bank account (`cpUsBank_`), creating a `cryptoToFiat` transaction.

<Note>
  Bank transfers over ACH and wire are not yet available in the OMS API. Inbound depends on virtual accounts and outbound depends on external bank accounts, neither of which is available in the OMS API yet. To be notified when they launch, register your interest.

  <Card title="Register interest" icon="envelope" href="https://info.polygon.technology/get-early-access?utm_source=docs&utm_medium=card&utm_campaign=oms_access">
    Share your use case and we'll reach out when bank transfers are available.
  </Card>
</Note>

For the planned inbound flow, see [Virtual accounts](/payments/guides/virtual-accounts).

## Key points

* **Bank rails are early access.** ACH and wire in both directions depend on virtual accounts (inbound) and external bank accounts (outbound), which are not yet available in the OMS API.
* **Crypto-to-crypto sends work today.** The `POST /quotes` then `POST /transactions` pattern moves value out of a wallet when the destination is another wallet or an external `blockchainAddress`.
* **Cash-in handles fiat-in today.** See the [Cash-in guide](/api-reference/guide-cash-in).
* **A quote's source is always an OMS wallet.** There is no fiat-funded quote.
* **Idempotency keys:** all `POST` endpoints accept an `Idempotency-Key` header. Use a deterministic key so you can safely retry on network errors.
