## GET /openapi/v1/derivatives/exchanges

The derivatives exchanges we collect, each with the open interest and 24h volume of its
contracts added up. Pass an exchange's `id` to `/derivatives/pairs` as `exchange_id` to see
those contracts.

**Coverage.** The same contracts as `/derivatives/pairs`, with the same hourly refresh: an
exchange's totals here are the sums of what `/derivatives/pairs?exchange_id=` lists for it.
Some exchanges report a contract's open interest as a quantity of the asset rather than in USD,
and contracts quoted in a crypto asset can report it near zero; we add the values up as
reported, so an exchange's `open_interest_usd` can be **lower** than its true USD figure.
A response's totals can be up to 60 seconds behind
`/derivatives/pairs`: for that long after an hourly refresh it can still carry the previous refresh's sums.

### Query parameters

| Parameter | Type | Default | Notes |
|:--|:--|:--|:--|
| `category` | string | both | `perpetual` or `futures`. Every figure then counts only that category: with `perpetual`, `num_futures_pairs` is `0`, and an exchange with no perpetuals is not listed |
| `page`, `size`, `limit`, `offset` | integer | `size` 20 | As on `/assets` |
| `sort` | string | `open_interest_usd:desc` | `open_interest_usd`, `volume_24h`, `name`, written `<key>[:asc\|desc]`; a key with no direction is ascending. `name` ignores case. A `null` sorts last descending and first ascending. Equal values are ordered by `id` |

### Response

```json
{
  "code": 0,
  "message": "success",
  "message_key": "SUCCESS",
  "result": {
    "items": [
      {
        "id": 42,
        "name": "Binance",
        "slug": "binance",
        "logo": "https://s2.coinmarketcap.com/static/img/exchanges/64x64/270.png",
        "open_interest_usd": "31234567890.12",
        "volume_24h": "68123456789.5",
        "num_perpetual_pairs": 412,
        "num_futures_pairs": 36,
        "data_time": "2026-10-27T08:00:00Z"
      }
    ],
    "page": 1,
    "total_page": 2,
    "total": 30
  }
}
```

#### Item fields

| Field | Type | Notes |
|:--|:--|:--|
| `id` | number | The exchange's id — the same kind of id `/exchanges` publishes |
| `name`, `slug` | string | |
| `logo` | string | **Empty string** when there is none |
| `open_interest_usd` | string or `null` | Sum over the exchange's contracts, as reported (see Coverage). **`null` when none of them reports one** — not a total of zero |
| `volume_24h` | string | Sum of the contracts' 24h volume, in USD |
| `num_perpetual_pairs`, `num_futures_pairs` | number | How many contracts of each kind |
| `data_time` | string | The **earliest** `data_time` among the exchange's contracts, RFC3339 UTC — how old its oldest figure is |

### Examples

```bash
# Derivatives exchanges by open interest
curl -H "X-Api-Key: <your-api-key>" \
  "https://open-api.coinworldcap.com/openapi/v1/derivatives/exchanges"

# Perpetuals only, by 24h volume
curl -H "X-Api-Key: <your-api-key>" \
  "https://open-api.coinworldcap.com/openapi/v1/derivatives/exchanges?category=perpetual&sort=volume_24h:desc"
```

| HTTP status | `code` | When |
|:--|:--|:--|
| 400 | 40000 | A `category` other than `perpetual` and `futures`; a `sort` key outside the three above (`num_perpetual_pairs` included), or a malformed `sort`; the paging limits of `/assets` |

`id`, `slug` and `exchange_id` are not parameters here and are ignored. The other errors are
in [Errors](#errors).
