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

# Off-ramp: crypto to bank

> Convert stablecoins and other tokens to fiat and settle to a destination account.

An [off-ramp](/guides/definitions#off-ramp) converts stablecoins, or other supported
tokens, to fiat and settles it to one of your user's destination accounts, such as a
[bank account](/guides/definitions#bank-account). The flow is quote based: you request
an [off-ramp quote](/guides/definitions#off-ramp-quote), the user sends the crypto
on-chain to fulfill it, and Spritz settles fiat to the destination.

## Before you start

* Authenticate as an integrator. See [Authentication](/guides/authentication).
* Have a verified user. New users complete identity verification before they can move
  money (see the [Quickstart](/guides/quickstart)).
* Have a destination account to pay out to, for example a bank account added with
  `POST /v1/bank-accounts`. You'll pass its `accountId` into the quote.

<Steps>
  <Step title="Create a quote">
    Tell Spritz the destination account, the amount, the rail to settle over, and the
    chain and token the user will pay with.

    ```bash theme={null}
    curl -X POST https://platform.spritz.finance/v1/off-ramp-quotes/ \
      -H "Content-Type: application/json" \
      # plus your integrator signing headers (see Authentication)
      -d '{
        "accountId": "6a43ac369288351e982157b9",
        "amount": "100.00",
        "amountMode": "output",
        "rail": "ach_standard",
        "chain": "ethereum",
        "tokenAddress": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
      }'
    ```

    The quote spells out exactly what the user pays, what the destination receives, and
    the fees, along with where to send the crypto.

    ```json theme={null}
    {
      "id": "quote_abc123",
      "status": "...",
      "input":  { "amount": "..." },
      "output": { "amount": "100.00" },
      "fees":   { "amount": "..." },
      "sendTo": { "...": "..." }
    }
    ```

    <Note>
      `amountMode` controls how `amount` is read. `output` means the destination
      receives exactly that amount and fees are added on top. `input` means the amount
      is the total the user pays, and the destination receives the remainder after fees.
    </Note>
  </Step>

  <Step title="Choose the rail and chain">
    `rail` is how fiat settles to the destination. Supported rails include
    `ach_standard`, `ach_same_day`, `rtp`, `wire`, `eft`, `sepa`, `faster_payments`,
    `push_to_card`, `bill_pay`, and `card_deposit`. Pick the one your destination
    account supports. See [What we support](/guides/supported) for rails and currencies
    by region.

    `chain` is the blockchain the user pays from (`ethereum`, `polygon`, `base`,
    `arbitrum`, `optimism`, `avalanche`, `solana`, `tron`, and more). Off-ramps aren't
    limited to stablecoins; any supported token on the chain works. On EVM chains, pass
    `tokenAddress`. Different tokens have different fee tiers, and stablecoins like USDC
    are usually cheapest. If you omit it, the chain's native token is assumed.
  </Step>

  <Step title="Get the on-chain transaction">
    Exchange the quote for ready-to-sign transaction parameters.

    ```bash theme={null}
    curl -X POST https://platform.spritz.finance/v1/off-ramp-quotes/quote_abc123/transaction \
      -H "Content-Type: application/json" \
      # plus your integrator signing headers
      -d '{}'
    ```

    The response carries the parameters to execute the payment on-chain. The exact shape
    depends on the chain (contract address and calldata for EVM, a serialized
    transaction for Solana). See the [API Reference](/api-reference) for the per-chain
    fields.
  </Step>

  <Step title="Execute from the user's wallet">
    Sign and submit the transaction from the user's wallet to send the crypto. Quotes
    are time-bound, so fulfill promptly. If a quote expires, create a new one.
  </Step>

  <Step title="Track settlement">
    Once the on-chain payment confirms, Spritz settles fiat to the destination. Track
    progress by polling the off-ramp, or react to [webhooks](/guides/webhooks).

    ```bash theme={null}
    curl https://platform.spritz.finance/v1/off-ramps/{offRampId} \
      # plus your integrator signing headers
    ```

    The `payment.*` events (`payment.created`, `payment.updated`, `payment.completed`,
    `payment.refunded`) fire across all of your users on your existing webhook
    subscription, so you don't register anything per off-ramp.
  </Step>
</Steps>

## Related

<CardGroup cols={2}>
  <Card title="Webhooks" icon="bell" href="/guides/webhooks">
    Track payment status changes without polling.
  </Card>

  <Card title="API Reference" icon="code" href="/api-reference">
    Off-ramp quotes, off-ramps, and bank account endpoints.
  </Card>
</CardGroup>
