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

# Stablecoin/crypto deposits

> Take a stablecoin from a wallet on any supported chain and settle it where you want it, non-custodially.

A crypto deposit is the simplest way money comes in: the user already holds a
stablecoin somewhere, and we route it to where you want it. Cross-chain is handled
for you - the user does not bridge, swap, or hold a second gas token.

<Note>
  **Live today.** This is the rail the widget has been settling real deposits on, and
  the one you can build your own UI against right now. Nothing is held or signed by
  us at any point.
</Note>

## Before you start

* An API key and the `/v1` prefix - see [Authentication](/api-reference/authentication).
* The destination you want money to land on. Omit it and it settles as USDC on
  Arbitrum, which is what most integrations mean.
* A frontend that can ask the user's wallet to sign. We hand back an unsigned
  transaction; submitting it is yours.

## What it does

* **Any supported source chain and token.** The user picks what they hold.
* **One landing spot you control.** By default USDC on Arbitrum; name another chain
  and token if your key is enabled for it.
* **Non-custodial throughout.** The transaction we hand back is unsigned and the
  user's wallet signs it. Funds never sit with us between the payer and you.
* **Exact-in or exact-out.** Pin the amount the payer spends, or the amount that
  must land - the second is what a fixed price needs.

## The flow

<Steps>
  <Step title="Price it">
    `POST /v1/deposit/quote` with the source, the destination, and the amount.
    See [Quote a deposit](/api-reference/deposit-quote).
  </Step>

  <Step title="Build the transaction">
    `POST /v1/deposit/transaction` with that quote. You get an unsigned
    transaction, preceded by an approval when the token allowance is short.
    See [Build the transaction](/api-reference/deposit-transaction).
  </Step>

  <Step title="Let the user sign">
    Your frontend submits it from the user's wallet. Nothing reaches us here.
  </Step>

  <Step title="Track it">
    `POST /v1/deposit/status` with the receipt, or take a
    [webhook](/webhooks) instead of polling.
    See [Check status](/api-reference/deposit-status).
  </Step>
</Steps>

<Warning>
  **A quote lives five minutes.** Build the transaction from a fresh one - past that
  the request is refused with a quote-expired error rather than silently repriced, so
  the user never signs a number they were not shown.
</Warning>

## Exact-in and exact-out

`exact-in` means the payer spends exactly the amount you named and whatever arrives,
arrives. `target-out` means a fixed figure has to land and the payer's side flexes
to cover it. Collecting a set price - an invoice, a checkout total - is the
exact-out case.

## Settling somewhere other than Arbitrum

Name both `destination.chain` and `destination.token`, never one alone: a chain
without its token address would keep Arbitrum's address on a chain where it does not
exist, so that request is refused. Your key also has to be enabled for that chain,
otherwise the quote comes back `403 chain_not_allowed` instead of a quote you could
not have used.

## Where to go next

* Build your own UI on it: [Server-side integration](/integration/server-side).
* Drop in the ready-made flow: [Rheon SDK](/integration/sdk).
* Which chains and tokens are open: [Coverage](/coverage).
