Perps daily activity
curl --request GET \
--url https://api.polynode.dev/v3/perps/activity/daily \
--header 'x-api-key: <api-key>'import requests
url = "https://api.polynode.dev/v3/perps/activity/daily"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.polynode.dev/v3/perps/activity/daily', 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.polynode.dev/v3/perps/activity/daily",
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-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.polynode.dev/v3/perps/activity/daily"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-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.polynode.dev/v3/perps/activity/daily")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.polynode.dev/v3/perps/activity/daily")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"interval": "day",
"timezone": "UTC",
"period": "1d",
"start_date": "2023-12-25",
"end_date": "2023-12-25",
"coverage_start": "2026-07-08",
"complete_through": "2023-12-25",
"first_returned_date": "2023-12-25",
"last_returned_date": "2023-12-25",
"latest_trade_at": 123,
"notional_unit": "pUSD",
"side_semantics": "<string>",
"total": {
"label": "All perps",
"days": [
{
"date": "2023-12-25",
"complete": true,
"trade_count": 1,
"taker_buy_trade_count": 1,
"taker_sell_trade_count": 1,
"notional_volume_pusd": "<string>",
"taker_buy_notional_pusd": "<string>",
"taker_sell_notional_pusd": "<string>",
"net_taker_notional_pusd": "<string>"
}
]
},
"instruments": [
{
"instrument_id": 1,
"symbol": "<string>",
"days": [
{
"date": "2023-12-25",
"complete": true,
"trade_count": 1,
"taker_buy_trade_count": 1,
"taker_sell_trade_count": 1,
"notional_volume_pusd": "<string>",
"taker_buy_notional_pusd": "<string>",
"taker_sell_notional_pusd": "<string>",
"net_taker_notional_pusd": "<string>",
"base_quantity": "<string>",
"taker_buy_base_quantity": "<string>",
"taker_sell_base_quantity": "<string>"
}
]
}
]
}{
"error": "<string>"
}{
"error": "unknown instrument",
"instrument": "<string>"
}{
"error": "warming up",
"missing": "daily activity"
}Perps Market Data
Perps Daily Activity
Chart complete UTC-day perps notional and taker flow for the platform and selected instruments.
GET
/
v3
/
perps
/
activity
/
daily
Perps daily activity
curl --request GET \
--url https://api.polynode.dev/v3/perps/activity/daily \
--header 'x-api-key: <api-key>'import requests
url = "https://api.polynode.dev/v3/perps/activity/daily"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.polynode.dev/v3/perps/activity/daily', 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.polynode.dev/v3/perps/activity/daily",
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-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.polynode.dev/v3/perps/activity/daily"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-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.polynode.dev/v3/perps/activity/daily")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.polynode.dev/v3/perps/activity/daily")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"interval": "day",
"timezone": "UTC",
"period": "1d",
"start_date": "2023-12-25",
"end_date": "2023-12-25",
"coverage_start": "2026-07-08",
"complete_through": "2023-12-25",
"first_returned_date": "2023-12-25",
"last_returned_date": "2023-12-25",
"latest_trade_at": 123,
"notional_unit": "pUSD",
"side_semantics": "<string>",
"total": {
"label": "All perps",
"days": [
{
"date": "2023-12-25",
"complete": true,
"trade_count": 1,
"taker_buy_trade_count": 1,
"taker_sell_trade_count": 1,
"notional_volume_pusd": "<string>",
"taker_buy_notional_pusd": "<string>",
"taker_sell_notional_pusd": "<string>",
"net_taker_notional_pusd": "<string>"
}
]
},
"instruments": [
{
"instrument_id": 1,
"symbol": "<string>",
"days": [
{
"date": "2023-12-25",
"complete": true,
"trade_count": 1,
"taker_buy_trade_count": 1,
"taker_sell_trade_count": 1,
"notional_volume_pusd": "<string>",
"taker_buy_notional_pusd": "<string>",
"taker_sell_notional_pusd": "<string>",
"net_taker_notional_pusd": "<string>",
"base_quantity": "<string>",
"taker_buy_base_quantity": "<string>",
"taker_sell_base_quantity": "<string>"
}
]
}
]
}{
"error": "<string>"
}{
"error": "unknown instrument",
"instrument": "<string>"
}{
"error": "warming up",
"missing": "daily activity"
}GET /v3/perps/activity/daily returns one UTC-day row for the complete perps
trade archive, plus matching rows for any instruments you select. One request
can therefore power a platform-total chart and up to 20 instrument series.
Trade coverage begins on 2026-07-08. The current UTC day has
complete: false because more trades can still arrive.
Request
GET /v3/perps/activity/daily
Query parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
period | string | 30d | 1d, 7d, or 30d. Do not combine it with explicit dates. |
start_date | date | none | Inclusive UTC date in YYYY-MM-DD format. Requires end_date. |
end_date | date | none | Inclusive UTC date in YYYY-MM-DD format. Requires start_date. |
interval | string | day | Only day is supported. |
instruments | CSV | none | Up to 20 instrument IDs, full symbols, or bare assets, for example 6,ETH-USD,sol. |
2026-07-08 or end after the current UTC date.
Examples
Get the platform total for the last seven UTC days:curl "https://api.polynode.dev/v3/perps/activity/daily?period=7d" \
-H "x-api-key: $POLYNODE_API_KEY"
curl "https://api.polynode.dev/v3/perps/activity/daily?period=7d&instruments=BTC-USD,ETH-USD" \
-H "x-api-key: $POLYNODE_API_KEY"
{
"interval": "day",
"timezone": "UTC",
"period": "7d",
"start_date": "2026-08-23",
"end_date": "2026-08-29",
"coverage_start": "2026-07-08",
"complete_through": "2026-08-28",
"first_returned_date": "2026-08-23",
"last_returned_date": "2026-08-29",
"latest_trade_at": 1788000000,
"notional_unit": "pUSD",
"side_semantics": "taker direction; long is taker buy and short is taker sell",
"total": {
"label": "All perps",
"days": [
{
"date": "2026-08-23",
"complete": true,
"trade_count": 3812,
"taker_buy_trade_count": 2010,
"taker_sell_trade_count": 1802,
"notional_volume_pusd": "12845000.25",
"taker_buy_notional_pusd": "6740000.25",
"taker_sell_notional_pusd": "6105000",
"net_taker_notional_pusd": "635000.25"
}
]
},
"instruments": [
{
"instrument_id": 6,
"symbol": "BTC-USD",
"days": [
{
"date": "2026-08-23",
"complete": true,
"trade_count": 1250,
"taker_buy_trade_count": 700,
"taker_sell_trade_count": 550,
"notional_volume_pusd": "5100000.25",
"taker_buy_notional_pusd": "2900000.25",
"taker_sell_notional_pusd": "2200000",
"net_taker_notional_pusd": "700000.25",
"base_quantity": "79.25",
"taker_buy_base_quantity": "45.75",
"taker_sell_base_quantity": "33.5"
}
]
}
]
}
period is returned as custom. Every requested day is
present even when its counts and decimal strings are zero.
Metric semantics
| Fields | Meaning |
|---|---|
trade_count | Archived executions across all instruments or within the selected instrument. |
notional_volume_pusd | Sum of price × base quantity, returned as an exact decimal pUSD string. |
taker_buy_* | Trades where the taker side is long. |
taker_sell_* | Trades where the taker side is short. |
net_taker_notional_pusd | Taker-buy notional minus taker-sell notional. It can be negative. |
base_quantity and side splits | Base-asset units for one selected instrument only. |
total deliberately has no base-quantity fields. BTC, ETH, gold,
and other base units are not additive, while pUSD notional is.
Completeness and freshness
complete_throughis yesterday in UTC. The current UTC day hascomplete: false.first_returned_dateandlast_returned_datedescribe days with archived trades; they arenullfor an entirely empty range. Thedaysarrays still contain the requested zero-filled rectangle.latest_trade_atis Unix seconds for the newest archived trade in the response, ornullfor an empty range.- When a requested window includes today, the whole request returns
503if the market trade archive tip is more than 15 minutes old. A stale current window is never presented as complete or as zero activity.
No-go interpretations
- Taker BUY/SELL is market-side direction, not maker direction and not a wallet-attributed action.
- The trade archive does not attribute these rows to wallets. Do not derive a trader leaderboard, wallet flow, or wallet P&L from this route.
- Notional is pUSD, not base quantity. Base quantities can be compared only within the same instrument.
- This route is trade activity, not open interest, funding, positions, or liquidations.
Errors
| Status | Error | When it occurs |
|---|---|---|
400 | descriptive request error | Unsupported period/interval, conflicting or incomplete dates, a future/reversed/over-30-day range, a date before coverage, empty instrument values, or more than 20 instruments. |
400 | unknown parameter | A query parameter is not in this route’s allowlist. |
401 | authentication error | The API key is missing or invalid. |
404 | unknown instrument | An instrument ID, symbol, or asset cannot be resolved. |
503 | warming up with missing: "daily activity" | A current window cannot pass the 15-minute archive-freshness gate, or the archive is unavailable. |
503; do not render it as a zero-activity window.Authorizations
Query Parameters
Rolling UTC window. Do not combine with start_date or end_date.
Available options:
1d, 7d, 30d Inclusive UTC start date. Requires end_date; coverage begins 2026-07-08.
Inclusive UTC end date. Requires start_date; the range can contain at most 30 days.
Bucket interval. Only day is supported.
Available options:
day Comma-separated instrument ids, full symbols, or bare assets. At most 20 values.
Maximum array length:
20Response
Complete bounded platform and selected-instrument UTC-day series.
Available options:
day Available options:
UTC Available options:
1d, 7d, 30d, custom Available options:
2026-07-08 Newest archived trade timestamp in Unix seconds.
Available options:
pUSD Show child attributes
Show child attributes
Maximum array length:
20Show child attributes
Show child attributes

