# Pricing & Quote ID

The Native API provides two pricing endpoints: one for display-only indicative prices, and one that locks a rate and returns a quote ID. Using the quote ID flow guarantees that the rate shown to the user is the rate applied when the ramp is created.

## Two pricing endpoints

| Endpoint | Purpose | Returns `quoteId`? |
|  --- | --- | --- |
| `GET /eapi/v0/price` | Indicative price for display | No |
| `GET /eapi/v0/quote` | Locked price for ramp creation | Yes |


### Indicative pricing

`GET /eapi/v0/price` returns a real-time price estimate. Use it to display rates before a user has committed to transact. The rate is not persisted and cannot be passed to ramp creation.

For details on how fiat and crypto amount inputs work with this endpoint, see [Pricing & Amount Inputs](/products/native-api/docs/how-it-works/flexible-amounts).

### Locked pricing

`GET /eapi/v0/quote` locks a price and returns a `quoteId` with a 3-minute TTL. Pass the `quoteId` to `POST /eapi/v0/ramps` to create a ramp at that exact rate — no re-calculation at execution time.

A `quoteId` is **one-time use** — it cannot be reused after a ramp has been created with it.

## Why use the quote ID flow

Without a quote ID, the typical flow re-calculates the rate at ramp creation:

1. Call `/price` → rate returned
2. Show rate to user on a confirmation screen
3. User confirms
4. Call `/ramps` with `fiatAmount` or `cryptoAmount` → rate re-calculated silently at step 4


If the market moves between steps 2 and 4, the ramp is created at a different rate than displayed. The quote ID flow eliminates this: the rate from step 2 is preserved and applied in step 4.

## How it works


```mermaid
sequenceDiagram
    participant Partner
    participant BanxaAPI as Banxa API

    Partner->>BanxaAPI: GET /eapi/v0/price (optional — for early display)
    BanxaAPI-->>Partner: Indicative rate (no quoteId)

    Partner->>BanxaAPI: GET /eapi/v0/quote
    BanxaAPI-->>Partner: quoteId + expiresAt (3-minute TTL, UTC)

    Note over Partner: Show locked rate + countdown to user
    Note over Partner: User confirms within 3 minutes

    Partner->>BanxaAPI: POST /eapi/v0/ramps { quoteId, identityReference, walletAddress }
    BanxaAPI-->>Partner: Ramp created at locked rate
```

### Step 1 — Fetch a locked quote


```
GET /eapi/v0/quote
```

All parameters are required. See the [Quote API Reference](/products/native-api/openapi/quote) for the full parameter list.

**Example response (on-ramp, fiat-locked):**


```json
{
  "quoteId": "6e9174edd370ffe6331aeda7a6d75592",
  "identityReference": "customer-ref-1234",
  "source": {
    "fiat": {
      "id": "AUD",
      "method": "payid-bank-transfer"
    },
    "amount": "24.50"
  },
  "target": {
    "crypto": {
      "id": "ETH",
      "blockchain": "ETH"
    },
    "amount": "0.007259"
  },
  "processingFee": "0.00",
  "networkFee": "0.00",
  "marketRate": {
    "crypto": {
      "USD": "2342.218",
      "AUD": "3297.79"
    },
    "forex": {
      "reference": "USD",
      "AUD": "1.4079800"
    }
  },
  "expiresAt": "2026-04-10 04:50:36"
}
```

| Field | Description |
|  --- | --- |
| `quoteId` | Unique identifier for this locked quote. Pass this to ramp creation. |
| `identityReference` | The customer this quote is bound to. |
| `source.amount` | The locked source amount (fiat for on-ramp, crypto for off-ramp). |
| `target.amount` | The locked target amount (crypto for on-ramp, fiat for off-ramp). |
| `processingFee` | Banxa processing fee in the source fiat currency. |
| `networkFee` | Blockchain network fee in the source fiat currency. |
| `marketRate` | Market rates used to calculate this quote — for display only. |
| `expiresAt` | UTC timestamp after which this quote is no longer valid. |


### Step 2 — Create the ramp

Pass the `quoteId` to `POST /eapi/v0/ramps`. The amounts, payment method, and rate are all inferred from the quote — do not re-specify them.

**Request body:**


```json
{
  "quoteId": "6e9174edd370ffe6331aeda7a6d75592",
  "identityReference": "customer-ref-1234",
  "walletAddress": "0xc292474673cf1a96a96e8c56ec4f45ecf2e0b448",
  "walletAddressMemo": null
}
```

| Field | Required | Description |
|  --- | --- | --- |
| `quoteId` | Yes | The `quoteId` from `GET /eapi/v0/quote`. |
| `identityReference` | Yes | Must match the `identityReference` used when fetching the quote. |
| `walletAddress` | Yes | The customer's wallet address for the target asset. |
| `walletAddressMemo` | No | Memo or destination tag, required by some networks (e.g. XRP, XLM, EOS). |


See the [Ramps API Reference](/products/native-api/openapi/ramps) for the full request schema.

## Quote expiry

Quotes expire **3 minutes** after creation (`expiresAt` is UTC). If the user does not confirm within the window, fetch a fresh quote before submitting the ramp.

Display the expiry countdown in your confirmation UI — it prevents users from being surprised by a rejected submission.