---
title: "List live exchange rates"
description: "Fetches exchange rates for multiple currency pairs from all enabled providers."
protocol: rest
method: GET
endpoint: "/v1/fx/rates"
baseUrl: "https://api.gravv.xyz"
group: "Fx"
auth:
  label: "Api-Key"
  name: "Api-Key"
  in: header
---

# List live exchange rates

<Endpoint method="GET" path="/v1/fx/rates" />

Fetches exchange rates for multiple currency pairs from all enabled providers.

Filters that match no supported pair (for example an unknown currency code) don't error; they return a `200` with an empty `data` array. Use [Get supported currencies](/reference/get_v1-fx-supported-currencies) to confirm a pair is supported.

## Query Parameters

<ParamField name="include_crypto" query="include_crypto" type="boolean" default="false">
  When `true`, crypto pairs are included in the rates data alongside fiat pairs. Defaults to `false`.
</ParamField>

<ParamField name="from_currency" query="from_currency" type="string">
  Filter by source currency (3-letter ISO 4217 code)
</ParamField>

<ParamField name="to_currency" query="to_currency" type="string">
  Filter by target currency (3-letter ISO 4217 code)
</ParamField>

<ParamField name="currency_pairs" query="currency_pairs" type="string">
  Comma-separated list of specific currency pairs to retrieve, each in `FROM/TO` format.
</ParamField>

## Responses

| Status | Description |
| --- | --- |
| `200` | List of exchange rates |
| `400` | Invalid request |
| `401` | Missing or invalid API key |
| `500` | Internal server error |

### 200 response

<ResponseField name="data" type="object[]">

  <Expandable title="properties">
    <ResponseField name="rate" type="number,null">
      Rate for this pair in the given direction; null if unavailable for that direction.
    </ResponseField>

    <ResponseField name="direction" type="string">
      Direction of the rate.

      Possible values: `BUY`, `SELL`
    </ResponseField>

    <ResponseField name="currency_pair" type="string">
    </ResponseField>

    <ResponseField name="pair_type" type="string">
      Category of the currency pair.

      Possible values: `fiat/fiat`, `crypto/crypto`, `fiat/crypto`, `crypto/fiat`
    </ResponseField>

    <ResponseField name="from_currency" type="string">
    </ResponseField>

    <ResponseField name="from_currency_name" type="string,null">
    </ResponseField>

    <ResponseField name="timestamp" type="string">
    </ResponseField>

    <ResponseField name="to_currency" type="string">
    </ResponseField>

    <ResponseField name="to_currency_name" type="string,null">
    </ResponseField>

  </Expandable>
</ResponseField>

<ResponseField name="error" type="string,null">
</ResponseField>

<ResponseExample>

```json title="Response"
{
  "data": [
    {
      "rate": 13.7741,
      "direction": "BUY",
      "currency_pair": "BWP/USD",
      "pair_type": "fiat/fiat",
      "from_currency": "BWP",
      "from_currency_name": null,
      "timestamp": "2026-03-23T12:50:32.082350079+01:00",
      "to_currency": "USD",
      "to_currency_name": null
    },
    {
      "rate": 18.4025,
      "direction": "SELL",
      "currency_pair": "USD/ZAR",
      "pair_type": "fiat/fiat",
      "from_currency": "USD",
      "from_currency_name": null,
      "timestamp": "2026-03-23T12:50:32.450793659+01:00",
      "to_currency": "ZAR",
      "to_currency_name": null
    }
  ],
  "error": null
}
```

</ResponseExample>

### 400 response

<ResponseField name="data" type="null">
  Always null for error responses.
</ResponseField>

<ResponseField name="error" type="string">
  Human-readable error message.
</ResponseField>

<ResponseExample>

```json title="InvalidPairFormat"
{
  "data": null,
  "error": "field 'currencypairs[0]' must be a valid currency pair format (e.g., USD/ZAR, BTC/USDT)"
}
```

</ResponseExample>

### 401 response

<ResponseField name="data" type="null">
  Always null for error responses.
</ResponseField>

<ResponseField name="error" type="string">
  Human-readable error message.
</ResponseField>

<ResponseExample>

```json title="MissingApiKey"
{
  "data": null,
  "error": "Invalid or missing Api-Key header. Api-Key is required!"
}
```

```json title="InvalidApiKey"
{
  "data": null,
  "error": "Invalid token!"
}
```

</ResponseExample>

### 500 response

<ResponseField name="data" type="null">
  Always null for error responses.
</ResponseField>

<ResponseField name="error" type="string">
  Human-readable error message.
</ResponseField>

<ResponseExample>

```json title="Response"
{
  "data": null,
  "error": "Internal server error"
}
```

</ResponseExample>

## Authorization

- **ApiKeyAuth**
