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

# Fiat to crypto

> How to bring fiat into a customer's custodial wallet.

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

Fiat-in does not use the quote and transaction pattern. A quote's `source` is always an OMS crypto wallet (`walletId`, `asset`, `network`), so there is no way to fund a quote from fiat. Instead, fiat enters through a fiat-in product that auto-creates the `fiatToCrypto` transaction once the money arrives:

* **Cash-in**: a customer deposits physical cash at a retail location, and OMS delivers USDC to the destination wallet. This is available in the OMS API today.
* **Virtual accounts**: each customer gets a dedicated bank account number; an ACH or wire deposit auto-converts to USDC. This is in early access.

Both paths set `destination` to an OMS wallet (or an onchain address) and let OMS create the transaction for you. You never call `POST /quotes` for fiat-in.

## Cash-in (available today)

Cash-in is the supported fiat-to-crypto path available in the OMS API today. You create a cash-in record that names the customer, the destination wallet, and the cash location where the customer will deposit. OMS returns estimated pricing upfront and finalizes it once the customer deposits cash at the counter.

### Create a cash-in

<CodeGroup>
  ```bash Sandbox theme={null}
  curl -X POST https://sandbox-api.polygon.technology/v0.9/cash-ins \
    -H "Authorization: Bearer {token}" \
    -H "Content-Type: application/json" \
    -H "Idempotency-Key: ci-alice-usdc-001" \
    -d '{
      "customerId": "cst_01H9Xa...",
      "source": {
        "asset": "usd",
        "indicatedAmount": "100.00"
      },
      "destination": {
        "wallet": { "wallet": "wlt_01H9Xb..." },
        "asset": "usdc",
        "network": "polygon"
      },
      "cash": {
        "cashLocationId": "loc_01H9Xd...",
        "cashLocationReference": "R1JFRU5ET1QtMjQzNDpsYXQ9MzguNDk1MTMzLGxuZz0tMTIxLjUwNTMzNg=="
      }
    }'
  ```

  ```bash Production theme={null}
  curl -X POST https://api.polygon.technology/v0.9/cash-ins \
    -H "Authorization: Bearer {token}" \
    -H "Content-Type: application/json" \
    -H "Idempotency-Key: ci-alice-usdc-001" \
    -d '{
      "customerId": "cst_01H9Xa...",
      "source": {
        "asset": "usd",
        "indicatedAmount": "100.00"
      },
      "destination": {
        "wallet": { "wallet": "wlt_01H9Xb..." },
        "asset": "usdc",
        "network": "polygon"
      },
      "cash": {
        "cashLocationId": "loc_01H9Xd...",
        "cashLocationReference": "R1JFRU5ET1QtMjQzNDpsYXQ9MzguNDk1MTMzLGxuZz0tMTIxLjUwNTMzNg=="
      }
    }'
  ```
</CodeGroup>

* `customerId`: the customer making the deposit. Must have passed KYC.
* `source.asset`: always `usd`.
* `source.indicatedAmount`: the expected deposit amount, used for upfront pricing estimates. Defaults to `"100.00"` if omitted. The actual amount is whatever the customer deposits at the counter.
* `destination.wallet`: one of `wallet` (an OMS custodial wallet), `blockchainAddress` (an external onchain address), or `externalAccount` (a saved blockchain address).
* `destination.asset` and `destination.network`: the crypto asset and chain to deliver.
* `cash.cashLocationId` and `cash.cashLocationReference`: the deposit location, obtained from `GET /cash-locations`.

OMS returns the cash-in with estimated pricing on the `source` and `destination` objects. When the customer deposits cash, OMS recalculates pricing on the actual amount, creates the `fiatToCrypto` transaction, and delivers USDC to the destination wallet.

For the full lifecycle, pricing fields, location lookup, and webhook events, see the [Cash-in guide](/api-reference/guide-cash-in).

## Virtual accounts (early access)

Virtual accounts give each customer a dedicated bank account number. When the customer sends an ACH or wire transfer to that number, OMS auto-converts the deposit to USDC and creates the `fiatToCrypto` transaction. This suits recurring funding, where a customer tops up the same account repeatedly rather than deposits cash.

<Note>
  Virtual account provisioning is not yet available in the OMS API. To be notified when it launches, 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 virtual account provisioning is available.
  </Card>
</Note>

See [Virtual accounts](/payments/guides/virtual-accounts) for the planned setup.

## Key points

* **Fiat-in never uses a quote.** A quote's source is always an OMS wallet, so fiat cannot fund a quote. Use cash-in or virtual accounts, which auto-create the `fiatToCrypto` transaction.
* **Cash-in is available in the OMS API today.** Virtual accounts are in early access.
* **The destination is a wallet.** Set `destination.wallet` to an OMS custodial wallet, an onchain address, or a saved blockchain address.
* **Card-funded on-ramps are on the roadmap.** Debit-card funding is coming soon and is not yet a capability you can build against.
