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

# Off-Ramp (Sell)

> Let your users sell crypto and receive fiat to their card

Off-ramp lets users sell crypto and receive fiat on their debit or credit card.

## Enable off-ramp

Off-ramp is **disabled by default**. To enable it for your integration, request it at onboarding or contact the Proof team. There is no self-service toggle.

## Request a sell session

Pass `"type": "sell"` in the session request:

```bash theme={null}
curl -X POST https://DOMAIN/widget/session \
  -H "Authorization: Bearer <client_token>" \
  -H "Content-Type: application/json" \
  -d '{
    "partner_user_id": "user-123",
    "user_email": "user@example.com",
    "network": "TRC20",
    "currency": "USDT",
    "amount": "100",
    "type": "sell"
  }'
```

The response shape is identical to the buy flow. Pass the returned values to `proofWidget.run({...})` exactly as in the [Quickstart](/on-off-ramp/quickstart).

## Requirements

<Warning>
  All of the following must hold for off-ramp to work.
</Warning>

| Requirement                  | Details                                                                    |
| ---------------------------- | -------------------------------------------------------------------------- |
| Off-ramp enabled             | Sell flow must be enabled for your integration (request it at onboarding)  |
| Identity verification        | The user must complete identity verification inside the widget             |
| Currency + network supported | The `currency` and `network` you pass must be enabled for your integration |

## Off-ramp flow

<Steps>
  <Step title="User initiates sell">
    Your frontend calls `POST /widget/session` with `type: "sell"`.
  </Step>

  <Step title="Identity verification">
    If the user is not verified, the widget guides them through verification first.
  </Step>

  <Step title="Sell widget opens">
    The widget shows the sell flow: the user enters the amount, adds a card, and receives a deposit address.
  </Step>

  <Step title="User sends crypto">
    The user sends crypto to the deposit address. The widget tracks the deposit.
  </Step>

  <Step title="Fiat payout">
    Once the deposit is confirmed, fiat is sent to the user's card.
  </Step>

  <Step title="Completion">
    Transaction transitions to `completed`. You receive a WebSocket update, a webhook, or a poll response.
  </Step>
</Steps>

## Transaction statuses

The same status enum used for buy applies to sell:

| Status       | Description                                                       |
| ------------ | ----------------------------------------------------------------- |
| `pending`    | Waiting for the user's crypto deposit                             |
| `processing` | Deposit received; fiat payout in flight                           |
| `completed`  | Fiat sent to the card                                             |
| `failed`     | Deposit timed out, payout failed, or the transaction was rejected |
| `cancelled`  | User cancelled inside the widget                                  |

See [Transaction Status](/on-off-ramp/transaction-status) for the full delivery model.

## Important notes

* If the user does not send crypto within the deposit window, the sell transitions to `failed` automatically.
* Off-ramp fiat support is configured per partner. Confirm the supported fiat currencies with the Proof team during onboarding.
