Trades
curl --request GET \
--url https://api.polynode.dev/v3/perps/trades/{instrument} \
--header 'x-api-key: <api-key>'import requests
url = "https://api.polynode.dev/v3/perps/trades/{instrument}"
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/trades/{instrument}', 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/trades/{instrument}",
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/trades/{instrument}"
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/trades/{instrument}")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.polynode.dev/v3/perps/trades/{instrument}")
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{
"data": [
{
"instrument_id": 6,
"price": "64112",
"quantity": "0.00248",
"side": "long",
"symbol": "BTC-USD",
"timestamp": 1783739244501,
"trade_id": 5350393841404889
},
{
"instrument_id": 6,
"price": "64112",
"quantity": "0.0026",
"side": "long",
"symbol": "BTC-USD",
"timestamp": 1783739244501,
"trade_id": 1918549746534175
}
],
"instrument_id": 6,
"symbol": "BTC-USD",
"more": true,
"has_more": true,
"next_cursor": "<opaque_cursor>"
}{
"error": "invalid cursor"
}Perps Market Data
Trades
Recent executions (price, quantity, side, time). Add after/before for archived history. Archived pages are newest first and return has_more, next_cursor, and the existing more field. Reuse the same filters with each cursor.
GET
/
v3
/
perps
/
trades
/
{instrument}
Trades
curl --request GET \
--url https://api.polynode.dev/v3/perps/trades/{instrument} \
--header 'x-api-key: <api-key>'import requests
url = "https://api.polynode.dev/v3/perps/trades/{instrument}"
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/trades/{instrument}', 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/trades/{instrument}",
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/trades/{instrument}"
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/trades/{instrument}")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.polynode.dev/v3/perps/trades/{instrument}")
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{
"data": [
{
"instrument_id": 6,
"price": "64112",
"quantity": "0.00248",
"side": "long",
"symbol": "BTC-USD",
"timestamp": 1783739244501,
"trade_id": 5350393841404889
},
{
"instrument_id": 6,
"price": "64112",
"quantity": "0.0026",
"side": "long",
"symbol": "BTC-USD",
"timestamp": 1783739244501,
"trade_id": 1918549746534175
}
],
"instrument_id": 6,
"symbol": "BTC-USD",
"more": true,
"has_more": true,
"next_cursor": "<opaque_cursor>"
}{
"error": "invalid cursor"
}Live filters
Narrow the live tape withside (long or short), min_qty, max_qty,
and min_notional. For example, set min_notional=25000 to keep only
trades worth at least $25,000. Unknown parameters return HTTP 400.
Historical windows
Addafter and/or before (Unix seconds or milliseconds) to query historical
trades. History covers every execution from July 9, 2026 onward and keeps
growing. The same side, quantity, and notional filters apply to the archive.
GET /v3/perps/trades/BTC-USD?after=1787875200&before=1787961600&limit=100
more flag and also return
has_more and an opaque next_cursor. When has_more is true, send the
returned cursor with the same instrument and filters:
GET /v3/perps/trades/BTC-USD?after=1787875200&before=1787961600&limit=100&cursor=<next_cursor>
| Parameter | Description |
|---|---|
limit | Max rows (default 100, up to 1000) |
after | Only trades after this time |
before | Only trades before this time |
cursor | Opaque next_cursor from the preceding archived page |
400 with {"error":"invalid cursor"}. An
expired cursor returns {"error":"cursor has expired"}. Reusing a cursor
with a different instrument or filter returns HTTP 400 and a clean mismatch
message. Start again without the cursor in each case.
side is the taker’s direction: long means the taker bought, and short
means the taker sold. Trades carry no account attribution. For position-level
tracking, use wallet portfolios.Authorizations
Path Parameters
Instrument id (e.g. 6), symbol (BTC-USD), or bare asset (btc).
Query Parameters
Max rows to return.
Only rows after this time (Unix seconds or ms).
Only rows before this time (Unix seconds or ms).
Filter: long | short
Minimum quantity
Maximum quantity
Minimum notional (price x qty), USD
Opaque next_cursor from the preceding archived page. Reuse the same instrument and filters within 24 hours.
Response
Success

