Skip to main content
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 before you begin.
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

curl -X POST https://sandbox-api.polygon.technology/v0.9/cash-ins \
  -H "Authorization: Bearer {api_key}" \
  -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=="
    }
  }'
  • 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.

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.
Virtual account provisioning is not yet available in the OMS API. To be notified when it launches, register your interest.

Register interest

Share your use case and we’ll reach out when virtual account provisioning is available.
See 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.