curl -H 'Authorization: Bearer $HD_KEY' 'https://data.hyperdash.com/v1/accounts/0x…/completed-trades?sort=net_pnl&limit=20'import requests
url = "https://data.hyperdash.com/v1/accounts/{address}/completed-trades"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://data.hyperdash.com/v1/accounts/{address}/completed-trades', 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://data.hyperdash.com/v1/accounts/{address}/completed-trades",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://data.hyperdash.com/v1/accounts/{address}/completed-trades"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://data.hyperdash.com/v1/accounts/{address}/completed-trades")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://data.hyperdash.com/v1/accounts/{address}/completed-trades")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"coin": "<string>",
"side": "<string>",
"open_time": 123,
"close_time": 123,
"duration_ms": 123,
"entry_px": "<string>",
"exit_px": "<string>",
"size": "<string>",
"max_size": "<string>",
"notional": "<string>",
"volume": "<string>",
"gross_pnl": "<string>",
"funding_pnl": "<string>",
"fees": "<string>",
"net_pnl": "<string>",
"fills": 123,
"maker_fills": 123,
"leverage": 123,
"is_cross": true
}
],
"has_more": true,
"next_cursor": "<string>",
"meta": {}
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"code": "<string>",
"request_id": "<string>",
"detail": "<string>",
"hint": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"code": "<string>",
"request_id": "<string>",
"detail": "<string>",
"hint": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"code": "<string>",
"request_id": "<string>",
"detail": "<string>",
"hint": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"code": "<string>",
"request_id": "<string>",
"detail": "<string>",
"hint": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"code": "<string>",
"request_id": "<string>",
"detail": "<string>",
"hint": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"code": "<string>",
"request_id": "<string>",
"detail": "<string>",
"hint": "<string>"
}Completed trades of one wallet: whole history, filters and sorts (hyperdash.com's Completed Trades tab)
Every round trip (a position opened and fully closed) from hyperdash.com’s completed-trades table, the source of the site’s Completed Trades and Best Trades tabs and of GET /v1/accounts//stats: whole history, filtered by market, side, result and minimum notional (|size| × entry price), sorted by any of the site’s columns (default: newest close first). limit trades per page; page with the cursor, pages start at offsets ≤ 10,000 (as the site), so one query reaches at most 10,000 + limit trades (meta.truncated = more exist: narrow with a filter or reverse the order). Pages are offsets into the live table, as on the site: trades that close while you page shift newest-first pages (a trade can repeat); order=asc walks stably. meta.total: matching trades when a filter is set (null without filters, and null on plans with limited history: the count would include trades outside it). Coverage: wallets Hyperdash has admitted to that table (every wallet trading since ~August 2025 and any wallet viewed on hyperdash.com; an older inactive wallet can have no rows), trades from the fills archive (2025-03). Your plan’s history window applies (meta.history_from): older trades are not delivered, newest-first by close time ends at the window, other sorts leave them out of each page, and oldest-first by close time is refused on a limited window. Same round trips as GET /v1/accounts//trades, which pages a close-time range (≤ 90 days, ascending) from the node trade store instead. net_pnl = gross − signed fees (maker rebates add) + funding; fees = Σ |fee| (as /stats).
Pricing: base + per trade. Scope: analytics:read.
curl -H 'Authorization: Bearer $HD_KEY' 'https://data.hyperdash.com/v1/accounts/0x…/completed-trades?sort=net_pnl&limit=20'import requests
url = "https://data.hyperdash.com/v1/accounts/{address}/completed-trades"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://data.hyperdash.com/v1/accounts/{address}/completed-trades', 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://data.hyperdash.com/v1/accounts/{address}/completed-trades",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://data.hyperdash.com/v1/accounts/{address}/completed-trades"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://data.hyperdash.com/v1/accounts/{address}/completed-trades")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://data.hyperdash.com/v1/accounts/{address}/completed-trades")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"coin": "<string>",
"side": "<string>",
"open_time": 123,
"close_time": 123,
"duration_ms": 123,
"entry_px": "<string>",
"exit_px": "<string>",
"size": "<string>",
"max_size": "<string>",
"notional": "<string>",
"volume": "<string>",
"gross_pnl": "<string>",
"funding_pnl": "<string>",
"fees": "<string>",
"net_pnl": "<string>",
"fills": 123,
"maker_fills": 123,
"leverage": 123,
"is_cross": true
}
],
"has_more": true,
"next_cursor": "<string>",
"meta": {}
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"code": "<string>",
"request_id": "<string>",
"detail": "<string>",
"hint": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"code": "<string>",
"request_id": "<string>",
"detail": "<string>",
"hint": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"code": "<string>",
"request_id": "<string>",
"detail": "<string>",
"hint": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"code": "<string>",
"request_id": "<string>",
"detail": "<string>",
"hint": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"code": "<string>",
"request_id": "<string>",
"detail": "<string>",
"hint": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"code": "<string>",
"request_id": "<string>",
"detail": "<string>",
"hint": "<string>"
}Authorizations
hdk_sk_live_v1_… or hdk_sk_test_v1_…
Headers
Refuse (free) if the request could cost more.
Expected price version; 409 price_changed if it differs.
Path Parameters
Wallet, 0x + 40 hex.
^0x[0-9a-fA-F]{40}$Query Parameters
One market, e.g. BTC, xyz:TSLA (case-insensitive).
^[A-Za-z0-9:_\-/@.]{1,40}$long or short (omit for both).
long, short win (net PnL > 0) or loss (net PnL < 0); omit for all.
win, loss Minimum notional (|size| × entry price, USD): 1000, 10000, 100000 or 1000000.
1000, 10000, 100000, 1000000 Sort column (ties: newest close first).
close_time, net_pnl, notional, duration, entry_px, exit_px, funding_pnl, coin, side Sort order.
desc, asc Trades per page.
1 <= x <= 200Opaque cursor from next_cursor (same filters, sort and limit).

