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

# Transactions

> The core money movement operation in OMS: quote, then execute.

A transaction moves money through OMS. The type is inferred from the asset pair, you specify a source and destination, and OMS determines whether the operation is `fiatToCrypto`, `cryptoToFiat`, or `cryptoToCrypto`.

Standard sends and payouts follow a two-step flow: create a quote to lock pricing, then create a transaction to execute it. Cash-in and auto-created transactions (virtual accounts, deposit addresses) skip the quote step.

## Transaction types

| Type             | Source                                                        | Destination                                |
| ---------------- | ------------------------------------------------------------- | ------------------------------------------ |
| `fiatToCrypto`   | Cash (Cash-In) today; ACH to a virtual account (early access) | Wallet (USDC/USDT)                         |
| `cryptoToFiat`   | Wallet (USDC/USDT)                                            | Bank account or cash pickup (early access) |
| `cryptoToCrypto` | Wallet (USDC/USDT)                                            | Wallet or external on-chain address        |

## Two-step flow

```
POST /quotes   →  quote in "open" status (rate locked)
                    │
POST /transactions  →  transaction in "processing"
                    │
              completed | failed
```

The quote locks the exchange rate and fee breakdown for a short validity window. If the quote expires before you create the transaction, create a new quote.

## Quote object

```json theme={null}
{
  "id": "qt_...",
  "object": "quote",
  "type": "cryptoToCrypto",
  "status": "open",
  "source": {
    "walletId": "wlt_...",
    "asset": "usdc",
    "network": "polygon",
    "amountGross": "100.00",
    "amountNet": "99.42",
    "feesDeducted": { "total": "0.58", "developer": "0.20", "oms": "0.35", "gas": "0.03" }
  },
  "destination": {
    "wallet": { "blockchainAddress": "0x..." },
    "asset": "usdc",
    "network": "polygon",
    "amountGross": "99.42",
    "amountNet": "99.42"
  },
  "rates": {
    "exchangeRate": "1.0",
    "effectiveRate": "0.9942"
  },
  "fixedAmountSide": "source",
  "expiresAt": "2025-01-15T10:35:00Z"
}
```

Set `fixedAmountSide` to `"source"` when the user specifies how much to send, or `"destination"` when the user specifies how much to receive.

A quote's `source` is always an OMS wallet, referenced by `walletId`. The `destination.wallet` can target another OMS wallet (`id`), an external on-chain address (`blockchainAddress`), or a saved external account such as a bank (`externalAccount`, early access).

## Transaction statuses

| Status       | Meaning                                                |
| ------------ | ------------------------------------------------------ |
| `processing` | Executing. Funds are being pulled or converted.        |
| `completed`  | Funds delivered to the destination.                    |
| `failed`     | Async failure. The `error` object describes the cause. |

OMS fires a webhook on every status change. Event names follow the pattern `transaction.{type}.{event}`: for example, `transaction.fiatToCrypto.completed`.

## Developer fees

Developer fees are configurable per integration and are never shown to the end user. Set them on your OMS account or pass them in the quote request. They appear in the `feesDeducted.developer` field on both the source and destination sides of the quote.

## Key operations

| Operation            | Endpoint                            |
| -------------------- | ----------------------------------- |
| Create a quote       | `POST /quotes`                      |
| Get a quote          | `GET /quotes/{quoteId}`             |
| Create a transaction | `POST /transactions`                |
| Get a transaction    | `GET /transactions/{transactionId}` |
| List transactions    | `GET /transactions`                 |

<Note>
  All `POST` endpoints accept an `Idempotency-Key` header. Use a stable key tied to your internal order ID to safely retry on network failure without risk of double-execution.
</Note>

## Related

* [Fiat to crypto guide](/payments/guides/fiat-to-crypto): cash-in and virtual-account funding
* [Send from a wallet guide](/payments/guides/crypto-to-fiat): crypto sends today, bank payouts in early access
* [Bank transfers guide](/api-reference/guide-bank-transfers): ACH and wire transfer details (early access)
