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

# Onramp

> Convert a customer's USD balance into crypto and deliver it to a Conduit wallet or to a wallet outside Conduit with a single orders call

An **onramp** converts fiat held in a customer's virtual account into a crypto asset. It uses `POST /v2/orders`. The `source` is always a virtual account. The direction is inferred from the asset types, so you do not send a `type`.

> [!NOTE]
>
> **Test this flow in sandbox.** See [ONRAMP orders (sandbox)](/sandbox/onramps) for the simulated happy path, failure controls and webhooks.

## Prerequisites

* An `active` customer with a virtual account that holds the fiat to convert ([Add virtual accounts](/guides/add-virtual-accounts)).
* For a Conduit wallet destination, an active wallet for the asset and chain you want ([Add a crypto wallet](/guides/add-crypto-wallet)). For an external wallet, nothing: the customer needs no Conduit wallet and signs nothing.
* A customer outside the United States. On live, an onramp for a customer in the United States returns `403 CAPABILITY_SUSPENDED`; sandbox does not apply this refusal ([Customers in the United States](/sandbox/conversions#customers-in-the-united-states)).
* Your API key.

## Choose the destination

| Destination | `destination.type` | Result |
| - | - | - |
| A wallet the customer holds at Conduit | `wallet` | The converted crypto is credited to the wallet. |
| A wallet outside Conduit | `external_wallet` | The converted crypto goes to `recipient.address` in one on-chain transfer. |

### Send to a Conduit wallet

```bash theme={null}
curl https://api.conduit.financial/v2/orders \
  -X POST \
  -H "x-api-key: YOUR_API_KEY" \
  -H "idempotency-key: $(uuidgen)" \
  -H "content-type: application/json" \
  -d '{
    "source": { "type": "virtual_account", "id": "vac_..." },
    "destination": {
      "type": "wallet",
      "id": "wlt_...",
      "asset": { "code": "USDC", "chain": "ethereum" }
    },
    "lockSide": "source",
    "amount": "100.00",
    "autoExecute": true
  }'
```

### Send to a wallet outside Conduit

```bash theme={null}
curl https://api.conduit.financial/v2/orders \
  -X POST \
  -H "x-api-key: YOUR_API_KEY" \
  -H "idempotency-key: $(uuidgen)" \
  -H "content-type: application/json" \
  -d '{
    "source": { "type": "virtual_account", "id": "vac_..." },
    "destination": {
      "type": "external_wallet",
      "asset": { "code": "USDC", "chain": "ethereum" },
      "purpose": "payment_for_goods_or_services",
      "recipient": {
        "chain": "ethereum",
        "address": "0xYourExternalAddress",
        "attestation": { "custody": "self" }
      }
    },
    "lockSide": "source",
    "amount": "100.00",
    "autoExecute": true
  }'
```

* `recipient` is the crypto recipient of `POST /v2/payouts`. `recipient.chain` must equal `asset.chain`.
* `attestation.custody` is required. Use `self` when the customer owns the wallet. For a wallet that belongs to someone else, use `third_party` and add the owner's identity: `type`, plus `firstName`, `lastName` and `countryOfCitizenship`, or `legalName` and `countryOfRegistration`.
* `purpose` and `documents` follow the same rules as a payout ([Transact](/guides/transact)). A purpose of `intercompany` or `personal_transfer_of_funds` needs the address registered first ([Registered Addresses](/concepts/registered-addresses)).
* `autoPayout` and `sourceAsset` are refused with an `external_wallet` destination.
* To see the recipient fields before you build the request, call `GET /v2/orders/requirements` with `recipientRail=crypto` and the destination asset and chain.

The order creates two transactions: the conversion, then a `withdrawal` to the address, linked to the order by `linkedOrderId`. The withdrawal is screened like any crypto payout and cannot be cancelled once it exists.

## Track the order

The order stays `pending` until it reaches `succeeded`, `failed` or `cancelled`. Watch the `order.*` and `transaction.*` webhooks ([Webhooks](/webhooks)). Use `autoExecute: false` to lock a rate and read the quote without committing, and cancel before execution with `POST /v2/orders/{orderId}/cancel`.

## See also

* [Quote before you order](/guides/quote-before-you-order) — price the onramp before you create it.
* [Take your own margin](/guides/take-your-own-margin) — add your own margin to an onramp you resell.
* [Send a payout](/guides/send-payout) — send crypto you already hold to an external address.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.