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

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

Step 2: Execute the transaction

curl -X POST https://sandbox-api.polygon.technology/v0.9/transactions \
  -H "Authorization: Bearer {api_key}" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: txn-send-001" \
  -d '{ "quoteId": "qt_01H9Xq..." }'
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.
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.

Register interest

Share your use case and we’ll reach out when bank transfers are available.
For the planned inbound flow, see 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.
  • 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.