Tickers, funding rates, open interest and volume from 14 perpetual DEXs, in one REST API.
X-API-Key header with every request.curl "https://api.coinperps.com/api/v1/metrics/totals" \
-H "X-API-Key: YOUR_API_KEY" Every endpoint sits under https://api.coinperps.com/api/v1 and takes a GET request. Requests without a valid key return 401 UNAUTHORIZED. Keep your key on the server: anyone with it can use your quota.
| Limit | Requests |
|---|---|
| Per minute | 600 |
| Per day | 100,000 |
Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (Unix time). The API plan costs $39 a month, or $30 a month billed yearly (pricing).
Responses are JSON with a success flag. meta.cached and meta.cacheAge tell you whether the data came from cache. Prices and volumes are strings to keep full precision, so parse them before doing maths.
{
"success": true,
"data": { ... },
"meta": {
"timestamp": 1704067200000,
"cached": false,
"cacheAge": null
}
}{
"success": false,
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded"
}
}19 endpoints, all GET, relative to the base URL.
| Endpoint | Returns | Parameters |
|---|---|---|
/exchanges | Every supported exchange | None |
/exchanges/{exchangeId} | One exchange’s details | exchangeId path, requiredExchange ID, e.g. hyperliquid |
| Endpoint | Returns | Parameters |
|---|---|---|
/tickers | Ticker data for every market on every exchange | exchange queryFilter by exchange, comma-separated |
/tickers/{exchangeId} | Every market on one exchange | exchangeId path, requiredExchange ID, e.g. hyperliquid |
/ticker/{exchangeId}/{symbol} | One market | exchangeId path, requiredExchange ID, e.g. hyperliquid symbol path, requiredMarket symbol, e.g. BTC-PERP |
| Endpoint | Returns | Parameters |
|---|---|---|
/metrics | Aggregated metrics for every exchange | None |
/metrics/totals | Totals across all exchanges | None |
/metrics/rankings | Exchanges ranked by a metric | sortBy query, default volume24hvolume24h, volume30d, openInterest or fees24h order query, default descasc or desc |
/metrics/{exchangeId} | Detailed metrics for one exchange | exchangeId path, requiredExchange ID, e.g. hyperliquid |
/metrics/volume/history | Daily trading volume | startDate query, default 30 days agoYYYY-MM-DD endDate query, default todayYYYY-MM-DD exchangeId query, default allOne exchange only limit query, default 365Maximum days returned |
/metrics/volume/cumulative | Running total of trading volume | None |
/metrics/dex-cex-ratio | DEX perpetual volume as a share of CEX volume, now | None |
/metrics/dex-cex-ratio/history | The DEX to CEX volume ratio over time | None |
| Endpoint | Returns | Parameters |
|---|---|---|
/logos/exchanges | Logo URLs for every exchange | None |
/logos/exchanges/{exchangeId} | One exchange’s logo URL | exchangeId path, requiredExchange ID, e.g. hyperliquid |
/logos/coins | Logo URLs for every coin | None |
/logos/coins/{symbol} | One coin’s logo URL | symbol path, requiredCoin symbol, e.g. BTC |
/tickers/icons | Map of coin symbols to icon URLs | None |
/tickers/icons/{symbol} | One coin’s icon URL | symbol path, requiredCoin symbol |
What /ticker/hyperliquid/BTC-PERP returns. The other ticker endpoints return arrays of the same object.
| Field | Type | Meaning |
|---|---|---|
exchange | string | Exchange ID |
symbol | string | Market symbol |
price | string | Last traded price |
markPrice | string | Mark price used for margin and liquidations |
indexPrice | string | Spot index price |
bid / ask | string | Best bid and best ask |
volume24h | string | 24h volume in the base coin |
volumeUsd24h | string | 24h volume in USD |
priceChange24h | string | 24h price change |
priceChangePercent24h | string | 24h price change in percent |
openInterest | string | Open interest in the base coin |
openInterestUsd | string | Open interest in USD |
fundingRate | string | Current funding rate as a decimal (0.0001 = 0.01%) |
nextFundingTime | number | Next funding time, Unix milliseconds |
timestamp | number | When the data was read, Unix milliseconds |
iconUrl | string | Coin icon URL |
{
"success": true,
"data": {
"exchange": "hyperliquid",
"symbol": "BTC-PERP",
"price": "43250.50",
"markPrice": "43250.50",
"indexPrice": "43248.00",
"bid": "43249.00",
"ask": "43251.00",
"volume24h": "15234.567",
"volumeUsd24h": "658234567.89",
"priceChange24h": "250.50",
"priceChangePercent24h": "0.58",
"openInterest": "5000.25",
"openInterestUsd": "216256343.13",
"fundingRate": "0.0001",
"nextFundingTime": 1704070800000,
"timestamp": 1704067200000,
"iconUrl": "https://static.edgex.exchange/icons/coin/BTC.png"
}
}| Exchange | ID | Chain |
|---|---|---|
hyperliquid | Hyperliquid L1 | |
apex | Multi-chain | |
aster | BNB Chain | |
lighter | Ethereum L2 | |
edgex | Ethereum L2 | |
grvt | GRVT L2 | |
jupiter | Solana | |
reya | Reya Network | |
drift | Solana | |
synfutures | Base | |
dydx | dYdX Chain (Cosmos) | |
gains | Arbitrum / Polygon | |
paradex | Starknet | |
gmx | Arbitrum / Avalanche |
See the same data live on Top decentralized perpetual exchanges.
| Code | HTTP | Meaning |
|---|---|---|
UNAUTHORIZED | 401 | Missing or invalid API key |
INVALID_API_KEY | 401 | API key format is invalid |
API_KEY_EXPIRED | 401 | API key has expired |
API_KEY_DISABLED | 401 | API key has been disabled |
VALIDATION_ERROR | 400 | Invalid request parameters |
EXCHANGE_NOT_FOUND | 404 | Exchange ID not recognised |
SYMBOL_NOT_FOUND | 404 | Market not found |
RATE_LIMIT_EXCEEDED | 429 | Per-minute limit reached |
DAILY_LIMIT_EXCEEDED | 429 | Daily limit reached |
INTERNAL_ERROR | 500 | Server error |
On a 429, wait until X-RateLimit-Reset before retrying.
const res = await fetch('https://api.coinperps.com/api/v1/ticker/hyperliquid/BTC-PERP', {
headers: { 'X-API-Key': process.env.COINPERPS_API_KEY },
})
const body = await res.json()
if (!body.success) throw new Error(body.error.message)
console.log(Number(body.data.fundingRate) * 100, '% funding') import os, requests
r = requests.get(
"https://api.coinperps.com/api/v1/metrics/rankings",
params={"sortBy": "openInterest"},
headers={"X-API-Key": os.environ["COINPERPS_API_KEY"]},
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["message"])
print(body["data"]) Data comes from each exchange’s API and on-chain sources. It can be delayed, cached or wrong at the source, so do not use it to place or time trades. Nothing the API returns is financial advice.
You may use the data in your own apps and research within your plan’s limits and with credit to Coinperps. Reselling it as a competing feed is not allowed. The full rules are in our terms and conditions.
Questions, bugs or higher limits: [email protected]. Include your key prefix (never the full key), the endpoint and the response you got.