# Off-Ramp (Crypto → Fiat)

**Flow:** lock a quote → receive a deposit address → user sends crypto → recipient receives fiat.

### Create off-ramp transfer

<mark style="color:$success;">`POST`</mark> :  `/api/v1/off-ramp`

Lock a valid `OFF_RAMP` quote and generate crypto deposit instructions.

**Required scopes:** `transfers:write` or `all`

{% hint style="info" %}
This endpoint supports idempotency. Include an `Idempotency-Key` header to prevent duplicate transfers.
{% endhint %}

**Request body**

| Parameter         | Type   | Required | Description                                 |
| ----------------- | ------ | -------- | ------------------------------------------- |
| `quoteId`         | UUID   | Required | ID of a valid, non-expired `OFF_RAMP` quote |
| `recipientId`     | UUID   | Required | UUID of the approved recipient              |
| `clientReference` | string | Optional | Your internal reference (max 128 chars)     |

CURL REQUEST&#x20;

```bash
curl -X POST https://zynta-lastmile-api.up.railway.app/api/v1/off-ramp \
  -H "x-api-key: sk_test_..." \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: offramp-001" \
  -d '{
    "quoteId": "550e8400-e29b-41d4-a716-446655440000",
    "recipientId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
  }'
```

**Response `201 Created`**

```json
{
  "id": "txn_7km3nf...",
  "state": "PENDING_DEPOSIT",
  "fundingInstructions": {
    "depositAddress": "TBushaDepositAddr123xyz",
    "amount": 1000,
    "asset": "USDC",
    "chain": "SOLANA",
    "expiresAt": "2026-03-24T14:15:00Z"
  },
  "createdAt": "2026-03-24T14:00:00Z"
}
```

The user must send the exact crypto amount to the `depositAddress` before the `expiresAt` time.

***

### Get off-ramp transfer

<mark style="color:blue;">`GET`</mark> :  `/api/v1/off-ramp/{id}`

Retrieve details of an existing off-ramp transfer.

**Required scopes:** `transfers:read` or `all`

***

### Get transfer timeline

<mark style="color:blue;">`GET`</mark> :  `/api/v1/off-ramp/{id}/timeline`

Returns the audit timeline and event history for a transfer. Useful for debugging and showing progress to end users.

***

### Transfer states

| State             | Description                                             |
| ----------------- | ------------------------------------------------------- |
| `QUOTE_LOCKED`    | Quote accepted, awaiting crypto deposit                 |
| `PENDING_DEPOSIT` | Deposit address generated, awaiting incoming crypto     |
| `PROCESSING`      | Crypto received, fiat conversion and payout in progress |
| `COMPLETED`       | Fiat delivered to recipient's bank account              |
| `FAILED`          | Transfer could not be completed (see `failureReason`)   |
| `EXPIRED`         | Quote or deposit window expired before completion       |

### Response fields <a href="#response-fields" id="response-fields"></a>

| Field                 | Type     | Description                                   |
| --------------------- | -------- | --------------------------------------------- |
| `id`                  | string   | Unique transfer identifier                    |
| `state`               | string   | Current transfer state (see table above)      |
| `fundingInstructions` | object   | Deposit address, amount, asset, chain, expiry |
| `completedAt`         | datetime | Timestamp when transfer completed             |
| `failureReason`       | string   | Reason for failure (if state is `FAILED`)     |
| `createdAt`           | datetime | Transfer creation time                        |
| `updatedAt`           | datetime | Last status update time                       |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.zynta.com/api-reference/transfers/off-ramp-crypto-fiat.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
