curl --request GET \
--url https://api.ironflow.sh/v1/analytics/user-summary \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.ironflow.sh/v1/analytics/user-summary"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.ironflow.sh/v1/analytics/user-summary', 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.ironflow.sh/v1/analytics/user-summary",
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://api.ironflow.sh/v1/analytics/user-summary"
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://api.ironflow.sh/v1/analytics/user-summary")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ironflow.sh/v1/analytics/user-summary")
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{
"address": "<string>",
"from": 123,
"to": 123,
"fills": 123,
"volume_usd": 123,
"realized_pnl": 123,
"wins": 123,
"losses": 123,
"win_rate": 123,
"maker_fills": 123,
"taker_fills": 123,
"pct_maker": 123,
"markets_count": 123,
"first_fill_ts": 123,
"last_fill_ts": 123
}{
"error": {
"code": "QUERY_WINDOW_EXCEEDED",
"message": "query time range exceeds maximum 24h0m0s per request for your tier — narrow your from/to window and paginate"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "An unexpected error occurred"
}
}{
"error": {
"code": "QUERY_TIMEOUT",
"message": "query took too long — narrow your time range, add a market filter, or reduce the limit"
}
}Hyperliquid wallet activity summary
GET /v1/analytics/user-summary returns a Hyperliquid wallet’s activity in one call: volume, realized PnL, fills, win rate, maker and taker mix, markets.
curl --request GET \
--url https://api.ironflow.sh/v1/analytics/user-summary \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.ironflow.sh/v1/analytics/user-summary"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.ironflow.sh/v1/analytics/user-summary', 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.ironflow.sh/v1/analytics/user-summary",
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://api.ironflow.sh/v1/analytics/user-summary"
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://api.ironflow.sh/v1/analytics/user-summary")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ironflow.sh/v1/analytics/user-summary")
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{
"address": "<string>",
"from": 123,
"to": 123,
"fills": 123,
"volume_usd": 123,
"realized_pnl": 123,
"wins": 123,
"losses": 123,
"win_rate": 123,
"maker_fills": 123,
"taker_fills": 123,
"pct_maker": 123,
"markets_count": 123,
"first_fill_ts": 123,
"last_fill_ts": 123
}{
"error": {
"code": "QUERY_WINDOW_EXCEEDED",
"message": "query time range exceeds maximum 24h0m0s per request for your tier — narrow your from/to window and paginate"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "An unexpected error occurred"
}
}{
"error": {
"code": "QUERY_TIMEOUT",
"message": "query took too long — narrow your time range, add a market filter, or reduce the limit"
}
}Authorizations
Ironflow API key, format if_xxxx. Free keys at https://ironflow.sh/key. Optional on read endpoints.
Query Parameters
Venue identifier. Defaults to hyperliquid.
hyperliquid Wallet address filter (hex string, e.g. 0xabc123).
"0xabc123def456"
Start time as Unix milliseconds. Defaults to 24 hours ago. Clamped to tier history window. On /v1/trades and /v1/fills, the time range (to - from) is limited per tier (no key 1h, free key 6h, Explorer 24h, Builder 7d, Enterprise unlimited; without market filter 4h for all tiers). Returns QUERY_WINDOW_EXCEEDED (400) if exceeded — paginate with narrower from/to windows.
1718313600000
End time as Unix milliseconds. Defaults to now.
1718400000000
Response
Wallet summary stats.
Aggregate stats for one address over a window. Single CH aggregation.