## GET /openapi/v1/dex/tokens

One list of DEX tokens, a page at a time, optionally on one chain, filtered and sorted.

### Query parameters

| Parameter | Type | Default | Notes |
|:--|:--|:--|:--|
| `list` | string | `trending` | `trending`, `new` or `gainers`, in any case |
| `window` | string | `24h` | `5m`, `1h`, `4h` or `24h`. Picks the list (below) and the period `volume`, `txns`, `traders` and `percent_change` filter and sort on |
| `chain_slug` | string | all chains | A `slug` from `/dex/chains`. One the list does not cover is an empty page |
| `page`, `size`, `limit`, `offset` | integer | `size` 20 | As on `/assets` |
| `sort` | string | the list's order | `price`, `volume`, `liquidity`, `market_cap`, `fdv`, `percent_change_5m`, `percent_change_1h`, `percent_change_4h`, `percent_change_24h`, `txns`, `traders`, `launch_time`, written `<key>[:asc\|desc]`; no direction is ascending. `volume`, `txns` and `traders` are those of `window`. A `null` sorts first ascending and last descending; equal values keep the list's order |
| `select` | comma-separated strings | — | At most 100. Return only these `items[]` fields, plus `id`; a name not among them is a `400`. Select `chain_slug` and `address` to call the other `/dex` endpoints. See [Choosing fields with `select`](#choosing-fields-with-select) |
| filters | | the list's | Below |

Filters, each `_min` and `_max` inclusive. A filter sent empty is the same as one not sent:
the list's default applies.

| Filter | Value | Bounds |
|:--|:--|:--|
| `liquidity_min`, `liquidity_max` | decimal ≥ 0 | `liquidity` |
| `volume_min`, `volume_max` | decimal ≥ 0 | the volume over `window` |
| `market_cap_min`, `market_cap_max`, `fdv_min`, `fdv_max` | decimal ≥ 0 | `market_cap`, `fdv` |
| `txns_min`, `txns_max`, `traders_min`, `traders_max` | integer ≥ 0 | transactions, traders over `window` |
| `age_hours_min`, `age_hours_max` | decimal ≥ 0 | hours since `launch_time` |
| `percent_change_24h_min`, `percent_change_24h_max` | decimal | `percent_change["24h"]`, whatever `window` |
| `percent_change_min`, `percent_change_max` | decimal | the change over `window` |
| `hide_high_risk` | `true` or `false` | `true` drops `risk_level` `high_risk`; `unknown` and `null` stay. Rows from our backup copy of the 24-hour Trending list, served when the published list is unavailable, all carry `risk_level` `null`, so this filter drops none of them |
| `has_social` | `true` or `false` | `true` keeps tokens with a website, X or Telegram link |

A token whose value is `null` does not pass a bound on it. A `_min` above its `_max` is an empty
page. Each list has default filters, shown in `filters.defaults`: none on Trending;
`liquidity_min` 10000, `volume_min` 1000 and `hide_high_risk` on New; `liquidity_min` 50000,
`volume_min` 10000, `percent_change_24h_max` 100000 and `hide_high_risk` on Gainers. A filter
you send replaces that list's default for it.

**Which list.** `window=24h` serves the list named. A shorter window on `trending` serves
Trending's version for that window. On `gainers`, it serves Gainers' version for that window,
followed by the tokens of the 24-hour Gainers and Trending lists that are not in it, by their
change over the window, highest first, none above its last row. On `new`, every window serves
the same list, with that window's figures. A list that is missing or more than three hours old
is an empty page with `data_time: null` and `stale: true`; for a shorter window, the 24-hour list
does not stand in for it.

**Order without `sort`.** The 24-hour Trending list by `trending_rank`, or by `chain_rank` on one
chain. Every other list — Trending's shorter windows included — in the order CoinMarketCap gives
it, with Gainers' fill after it.

### Response

```json
{
  "code": 0,
  "message": "success",
  "message_key": "SUCCESS",
  "result": {
    "items": [
      {
        "id": "1",
        "chain_slug": "base",
        "address": "0x07b3d902783c3c12b077508c3b5c00113d1291d0",
        "symbol": "XDP",
        "name": "Doppler",
        "logo": "https://s2.coinmarketcap.com/static/img/coins/64x64/40953.png",
        "price": "0.0204910145",
        "volume_24h": "290842301.37",
        "liquidity": "4238562.5",
        "market_cap": "204910145.22",
        "fdv": "204910145.22",
        "percent_change": { "5m": "0.05", "1h": "-0.28", "4h": "1.12", "24h": "2.31" },
        "txns": 778836,
        "traders": 4562,
        "windows": {
          "5m": { "volume": "512340.1", "txns": 1203, "traders": 310 },
          "1h": { "volume": "8123456.7", "txns": 20311, "traders": 1502 },
          "4h": { "volume": "40123456.2", "txns": 101233, "traders": 2890 },
          "24h": { "volume": "290842301.37", "txns": 778836, "traders": 4562 }
        },
        "trending_rank": 1,
        "chain_rank": 1,
        "launch_time": "2026-07-21T05:13:39Z",
        "last_trade_time": "2026-10-21T08:04:00Z",
        "risk_level": "safe",
        "inactive": false
      }
    ],
    "page": 1,
    "total_page": 117,
    "total": 2331,
    "list": "trending",
    "window": "24h",
    "data_time": "2026-10-21T08:04:59Z",
    "stale": false,
    "filters": {
      "applied": { "liquidity_min": null, "txns_min": null, "age_hours_max": null, "hide_high_risk": false, "has_social": false },
      "defaults": { "liquidity_min": null, "txns_min": null, "age_hours_max": null, "hide_high_risk": false, "has_social": false }
    }
  }
}
```

The example's values are illustrative, and `filters` shows five of its twenty keys.

| Field | Type | Notes |
|:--|:--|:--|
| `items[]` | array | `[]` past the last page |
| `page`, `total_page`, `total` | number | As on `/assets`; `total` counts the tokens after `chain_slug` and the filters |
| `list`, `window` | string | What was served |
| `data_time` | string or `null` | When the list was built; `null` when it is missing or more than three hours old |
| `stale` | boolean | The list is more than two hours old, or missing |
| `filters.applied`, `filters.defaults` | object | Every filter above by name: what this request used, and the list's defaults. Amounts, percentages and `age_hours_*` are decimal strings, `txns_*` and `traders_*` integers, `null` no bound; `hide_high_risk` and `has_social` are booleans |
| `items[].id` | string | The token's id: one per chain and address |
| `items[].chain_slug`, `items[].address` | string | Name the token on the other `/dex` endpoints |
| `items[].symbol`, `items[].name`, `items[].logo` | string | Those of the asset we match the token to, CoinMarketCap's otherwise — and CoinMarketCap's logo when that asset has none; `logo` is `""` when there is none |
| `items[].price`, `items[].volume_24h`, `items[].liquidity`, `items[].market_cap`, `items[].fdv` | string or `null` | USD |
| `items[].percent_change` | object | Always the keys `5m`, `1h`, `4h`, `24h`; each a percentage string (`"2.31"` is 2.31%) or `null` |
| `items[].txns`, `items[].traders` | number or `null` | Over 24 hours |
| `items[].windows` | object | Always the keys `5m`, `1h`, `4h`, `24h`, each `{volume, txns, traders}`, any of them `null` |
| `items[].trending_rank`, `items[].chain_rank` | number or `null` | Its place in the 24-hour Trending list, overall and on its chain; `null` when it is not in it |
| `items[].launch_time` | string or `null` | When the token was created, as CoinMarketCap records it |
| `items[].last_trade_time` | string or `null` | The newest trade we have seen |
| `items[].risk_level` | string or `null` | `safe`, `caution`, `high_risk` or `unknown`, from CoinMarketCap. Tolerate a value you do not recognise |
| `items[].inactive` | boolean | No trade in 24 hours, or liquidity under $1,000 |

### Examples

```bash
# Trending, first page
curl -H "X-Api-Key: <your-api-key>" \
  "https://open-api.coinworldcap.com/openapi/v1/dex/tokens"

# The biggest 1-hour gainers on Solana with at least $50,000 of liquidity
curl -H "X-Api-Key: <your-api-key>" \
  "https://open-api.coinworldcap.com/openapi/v1/dex/tokens?list=gainers&window=1h&chain_slug=solana&liquidity_min=50000&sort=percent_change_1h:desc&limit=10"
```

| HTTP status | `code` | When |
|:--|:--|:--|
| 400 | 40000 | `list`, `window` or `sort` outside the values above; a filter that is not a number of its kind (a count that is not a whole number, an amount below zero, more than 64 characters, an exponent beyond ±64), or a switch other than `true`/`false`; a `select` name that is not an `items[]` field, or more than 100 names; the paging limits of `/assets` |
| 503 | 50300 | No Trending list younger than three hours |

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