curl --request GET \
--url https://api.blockworks.com/query/timeseries/perp-dex-protocols/{granularity} \
--header 'X-Blockworks-API-Key: <api-key>'import requests
url = "https://api.blockworks.com/query/timeseries/perp-dex-protocols/{granularity}"
headers = {"X-Blockworks-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Blockworks-API-Key': '<api-key>'}};
fetch('https://api.blockworks.com/query/timeseries/perp-dex-protocols/{granularity}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.blockworks.com/query/timeseries/perp-dex-protocols/{granularity}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Blockworks-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.blockworks.com/query/timeseries/perp-dex-protocols/{granularity}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Blockworks-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.blockworks.com/query/timeseries/perp-dex-protocols/{granularity}")
.header("X-Blockworks-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.blockworks.com/query/timeseries/perp-dex-protocols/{granularity}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Blockworks-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"point_schema": [
{
"description": "Timestamp of the data point.",
"field": "time",
"name": "Time",
"time": true,
"type": "time"
},
{
"description": "Total perp trading volume in USD.",
"field": "volumeUSD",
"name": "Volume (USD)",
"time": false,
"type": "float64"
},
{
"description": "Total open interest in USD.",
"field": "openInterestUSD",
"name": "Open Interest (USD)",
"time": false,
"type": "float64"
}
],
"series": [
{
"entity": {
"name": "<name>",
"slug": "<slug>"
},
"key": "<Project ID>",
"points": [
[
1704067200,
123.45,
123.45
]
]
}
]
},
"error": null
}{
"data": null,
"error": "too many series requested: 11 exceeds the maximum of 10"
}{
"data": null,
"error": "this model requires authentication"
}{
"data": null,
"error": "this model requires the \"perp-dex-protocols-dataset\" permission; see https://app.blockworks.com/account/api for the public API permissions you hold"
}{
"data": null,
"error": "model \"perp-dex-protocols\" does not support granularity \"1h\" (supported: 1d)"
}Batch Get Perp DEX Protocol timeseries
Perpetual futures DEX metrics for a protocol: volume, open interest, trades, liquidations and active markets, with breakdowns by market category, core versus builder-deployed markets and major USD pairs. Each series is one protocol, keyed by its slug. Most protocols populate only part of the columns, so pass selections.
curl --request GET \
--url https://api.blockworks.com/query/timeseries/perp-dex-protocols/{granularity} \
--header 'X-Blockworks-API-Key: <api-key>'import requests
url = "https://api.blockworks.com/query/timeseries/perp-dex-protocols/{granularity}"
headers = {"X-Blockworks-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Blockworks-API-Key': '<api-key>'}};
fetch('https://api.blockworks.com/query/timeseries/perp-dex-protocols/{granularity}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.blockworks.com/query/timeseries/perp-dex-protocols/{granularity}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Blockworks-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.blockworks.com/query/timeseries/perp-dex-protocols/{granularity}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Blockworks-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.blockworks.com/query/timeseries/perp-dex-protocols/{granularity}")
.header("X-Blockworks-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.blockworks.com/query/timeseries/perp-dex-protocols/{granularity}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Blockworks-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"point_schema": [
{
"description": "Timestamp of the data point.",
"field": "time",
"name": "Time",
"time": true,
"type": "time"
},
{
"description": "Total perp trading volume in USD.",
"field": "volumeUSD",
"name": "Volume (USD)",
"time": false,
"type": "float64"
},
{
"description": "Total open interest in USD.",
"field": "openInterestUSD",
"name": "Open Interest (USD)",
"time": false,
"type": "float64"
}
],
"series": [
{
"entity": {
"name": "<name>",
"slug": "<slug>"
},
"key": "<Project ID>",
"points": [
[
1704067200,
123.45,
123.45
]
]
}
]
},
"error": null
}{
"data": null,
"error": "too many series requested: 11 exceeds the maximum of 10"
}{
"data": null,
"error": "this model requires authentication"
}{
"data": null,
"error": "this model requires the \"perp-dex-protocols-dataset\" permission; see https://app.blockworks.com/account/api for the public API permissions you hold"
}{
"data": null,
"error": "model \"perp-dex-protocols\" does not support granularity \"1h\" (supported: 1d)"
}Authorizations
API key sent in the X-Blockworks-API-Key header; x-messari-api-key is accepted for existing integrations. The catalog endpoints and models open to everyone need no key.
Path Parameters
Data granularity.
1d Query Parameters
Comma-separated Project ID values naming the series to return (up to 10). Omit it to get every Perp DEX Protocol as a series in one response.
Time window, one of: to-date (ytd, qtd, mtd, dtd, htd); relative, followed by m, h, d or w (30d, 12h, 4w; 1y and 1M are not accepted, use 365d, 52w, ytd or a calendar year); a calendar day (YYYY-MM-DD), month (YYYY-MM) or year (YYYY); or an RFC3339 instant, which runs from then to now. Mutually exclusive with start/end. Optional: with no window at all the query runs from the beginning of the data to now, which is only served where it fits the cap of 9000 points of the requested granularity, so a window is in practice required at fine granularities.
Window start, inclusive (RFC3339, unix seconds, or YYYY-MM-DD). Optional; defaults to the beginning of the data.
Window end, exclusive (RFC3339, unix seconds, or YYYY-MM-DD). Optional; defaults to now.
If true, return only the first and last point of the resolved time window instead of every point in it. A bounds request is exempt from the 9000-point maximum, since it returns at most two points per series however wide the window is.
Comma-separated metric fields to return; defaults to every metric. A point always leads with its timestamp, and the values that follow are described by point_schema in catalog order regardless of the order requested here.
volumeUSD, openInterestUSD, tradeCount, liquidationVolumeUSD, liquidationCount, marketCount, marketLevelVolumeUSD, marketLevelOpenInterestUSD, marketLevelTradeCount, marketLevelLiquidationVolumeUSD, marketLevelLiquidationCount, hip3VolumeUSD, hip3OpenInterestUSD, hip3TradeCount, hip3LiquidationVolumeUSD, hip3LiquidationCount, coreVolumeUSD, coreOpenInterestUSD, coreTradeCount, coreLiquidationVolumeUSD, coreLiquidationCount, categoryBondVolumeUSD, categoryCommodityVolumeUSD, categoryCryptoVolumeUSD, categoryFXVolumeUSD, categoryIndexVolumeUSD, categoryPreIPOVolumeUSD, categoryStockVolumeUSD, categoryRWAVolumeUSD, categoryBondOpenInterestUSD, categoryCommodityOpenInterestUSD, categoryCryptoOpenInterestUSD, categoryFXOpenInterestUSD, categoryIndexOpenInterestUSD, categoryPreIPOOpenInterestUSD, categoryStockOpenInterestUSD, categoryRWAOpenInterestUSD, categoryBondTradeCount, categoryCommodityTradeCount, categoryCryptoTradeCount, categoryFXTradeCount, categoryIndexTradeCount, categoryPreIPOTradeCount, categoryStockTradeCount, categoryRWATradeCount, categoryBondLiquidationVolumeUSD, categoryCommodityLiquidationVolumeUSD, categoryCryptoLiquidationVolumeUSD, categoryFXLiquidationVolumeUSD, categoryIndexLiquidationVolumeUSD, categoryPreIPOLiquidationVolumeUSD, categoryStockLiquidationVolumeUSD, categoryRWALiquidationVolumeUSD, categoryBondLiquidationCount, categoryCommodityLiquidationCount, categoryCryptoLiquidationCount, categoryFXLiquidationCount, categoryIndexLiquidationCount, categoryPreIPOLiquidationCount, categoryStockLiquidationCount, categoryRWALiquidationCount, pairBitcoinUSDVolumeUSD, pairEthereumUSDVolumeUSD, pairSolanaUSDVolumeUSD, pairHyperliquidUSDVolumeUSD, pairBNBUSDVolumeUSD, pairXRPUSDVolumeUSD, pairAvalancheUSDVolumeUSD, pairBitcoinUSDOpenInterestUSD, pairEthereumUSDOpenInterestUSD, pairSolanaUSDOpenInterestUSD, pairHyperliquidUSDOpenInterestUSD, pairBNBUSDOpenInterestUSD, pairXRPUSDOpenInterestUSD, pairAvalancheUSDOpenInterestUSD, pairBitcoinUSDTradeCount, pairEthereumUSDTradeCount, pairSolanaUSDTradeCount, pairHyperliquidUSDTradeCount, pairBNBUSDTradeCount, pairXRPUSDTradeCount, pairAvalancheUSDTradeCount, pairBitcoinUSDLiquidationVolumeUSD, pairEthereumUSDLiquidationVolumeUSD, pairSolanaUSDLiquidationVolumeUSD, pairHyperliquidUSDLiquidationVolumeUSD, pairBNBUSDLiquidationVolumeUSD, pairXRPUSDLiquidationVolumeUSD, pairAvalancheUSDLiquidationVolumeUSD, pairBitcoinUSDLiquidationCount, pairEthereumUSDLiquidationCount, pairSolanaUSDLiquidationCount, pairHyperliquidUSDLiquidationCount, pairBNBUSDLiquidationCount, pairXRPUSDLiquidationCount, pairAvalancheUSDLiquidationCount Response format, overriding the Accept header: json (default), csv, or jsonl (NDJSON). csv and jsonl return the rows as a downloadable file.
json, csv, jsonl