userCompletedTrades | Hyperliquid Info API
curl --request POST \
--url https://hypercore.goldrushdata.com/info \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "<string>",
"user": "<string>",
"builder": "<string>",
"dex": "<string>",
"limit": 123
}
'import requests
url = "https://hypercore.goldrushdata.com/info"
payload = {
"type": "<string>",
"user": "<string>",
"builder": "<string>",
"dex": "<string>",
"limit": 123
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
type: '<string>',
user: '<string>',
builder: '<string>',
dex: '<string>',
limit: 123
})
};
fetch('https://hypercore.goldrushdata.com/info', 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://hypercore.goldrushdata.com/info",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'type' => '<string>',
'user' => '<string>',
'builder' => '<string>',
'dex' => '<string>',
'limit' => 123
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://hypercore.goldrushdata.com/info"
payload := strings.NewReader("{\n \"type\": \"<string>\",\n \"user\": \"<string>\",\n \"builder\": \"<string>\",\n \"dex\": \"<string>\",\n \"limit\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://hypercore.goldrushdata.com/info")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"<string>\",\n \"user\": \"<string>\",\n \"builder\": \"<string>\",\n \"dex\": \"<string>\",\n \"limit\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://hypercore.goldrushdata.com/info")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"type\": \"<string>\",\n \"user\": \"<string>\",\n \"builder\": \"<string>\",\n \"dex\": \"<string>\",\n \"limit\": 123\n}"
response = http.request(request)
puts response.read_body{
"user": "<string>",
"coin": "<string>",
"position_type": "<string>",
"gross_pnl": "<string>",
"net_pnl": "<string>",
"funding_pnl": "<string>",
"entry_px": "<string>",
"exit_px": "<string>",
"position_closed_size": "<string>",
"fees": "<string>",
"fills": 123,
"open_time": 123,
"close_time": 123,
"duration_ms": 123,
"max_position_size": "<string>",
"maker_fills": 123,
"builder": {}
}Info API
userCompletedTrades | Hyperliquid Info API
Hyperliquid userCompletedTrades: fetch a wallet’s most recent fully-closed round-trip trades, newest-first, each with realized PnL, funding, fees, and volume-weighted entry/exit prices.
POST
/
info
userCompletedTrades | Hyperliquid Info API
curl --request POST \
--url https://hypercore.goldrushdata.com/info \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "<string>",
"user": "<string>",
"builder": "<string>",
"dex": "<string>",
"limit": 123
}
'import requests
url = "https://hypercore.goldrushdata.com/info"
payload = {
"type": "<string>",
"user": "<string>",
"builder": "<string>",
"dex": "<string>",
"limit": 123
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
type: '<string>',
user: '<string>',
builder: '<string>',
dex: '<string>',
limit: 123
})
};
fetch('https://hypercore.goldrushdata.com/info', 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://hypercore.goldrushdata.com/info",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'type' => '<string>',
'user' => '<string>',
'builder' => '<string>',
'dex' => '<string>',
'limit' => 123
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://hypercore.goldrushdata.com/info"
payload := strings.NewReader("{\n \"type\": \"<string>\",\n \"user\": \"<string>\",\n \"builder\": \"<string>\",\n \"dex\": \"<string>\",\n \"limit\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://hypercore.goldrushdata.com/info")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"<string>\",\n \"user\": \"<string>\",\n \"builder\": \"<string>\",\n \"dex\": \"<string>\",\n \"limit\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://hypercore.goldrushdata.com/info")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"type\": \"<string>\",\n \"user\": \"<string>\",\n \"builder\": \"<string>\",\n \"dex\": \"<string>\",\n \"limit\": 123\n}"
response = http.request(request)
puts response.read_body{
"user": "<string>",
"coin": "<string>",
"position_type": "<string>",
"gross_pnl": "<string>",
"net_pnl": "<string>",
"funding_pnl": "<string>",
"entry_px": "<string>",
"exit_px": "<string>",
"position_closed_size": "<string>",
"fees": "<string>",
"fills": 123,
"open_time": 123,
"close_time": 123,
"duration_ms": 123,
"max_position_size": "<string>",
"maker_fills": 123,
"builder": {}
}Credit Cost
10 per call
Processing
Realtime
type: "userCompletedTrades" is used to fetch a wallet’s most recent fully-closed round-trip trades, newest-first, each with realized PnL, funding, fees, and volume-weighted entry/exit prices.
Estimate your monthly cost for this API using the Pricing Calculator.
- GoldRush custom analytics product. Not available on the public Hyperliquid node - there is no
POST api.hyperliquid.xyz/infoequivalent. Served only fromPOST hypercore.goldrushdata.com/info. - Each record is one fully-closed round-trip position (opened, then brought fully flat), reconstructed from the wallet’s fills. Positions that are still open are not included.
- Returns up to
limitrecords, newest-first (default100, max500). - For a
close_timewindow with forward paging, useuserCompletedTradesByTime. For one aggregate roll-up across all a wallet’s trades, useuserPnlSummary.
limit fully-closed round-trip trades for a wallet, ordered newest-first by close time. Each row rolls up every fill that opened and then fully closed a position on one coin into a single record - realized gross and net PnL, the funding component, volume-weighted entry and exit prices, fees, fill counts, and the open/close timestamps. Use this when you want a wallet’s recent trading outcomes without stepping through raw fills.
User-keyed. GoldRush-native, so there is no upstream Hyperliquid /info equivalent.
Endpoint
POST https://hypercore.goldrushdata.com/info
Authorization: Bearer <GOLDRUSH_API_KEY>
Content-Type: application/json
Request
string
required
Always
"userCompletedTrades".string
required
The wallet address (lowercase 0x-prefixed hex).
string
Optional filter. When set, returns only trades whose closing fill was routed through this builder address (
0x-prefixed 42-character hex).string
Optional perp-DEX scope.
main_dex for the canonical Hyperliquid perp DEX, or a HIP-3 DEX identifier. Omit to include trades across every DEX.int
Maximum number of records to return. Default
100, maximum 500. Values above the maximum are clamped.Example
curl -X POST https://hypercore.goldrushdata.com/info \
-H "Authorization: Bearer $GOLDRUSH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "userCompletedTrades",
"user": "0x31ca8395cf837de08b24da3f660e77761dfb974b",
"limit": 100
}'
const response = await fetch("https://hypercore.goldrushdata.com/info", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.GOLDRUSH_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
type: "userCompletedTrades",
user: "0x31ca8395cf837de08b24da3f660e77761dfb974b",
limit: 100,
}),
});
const trades = await response.json();
import os, requests
response = requests.post(
"https://hypercore.goldrushdata.com/info",
headers={"Authorization": f"Bearer {os.environ['GOLDRUSH_API_KEY']}"},
json={
"type": "userCompletedTrades",
"user": "0x31ca8395cf837de08b24da3f660e77761dfb974b",
"limit": 100,
},
)
trades = response.json()
Response
An array of completed-trade objects, newest-first byclose_time.
[
{
"user": "0x31ca8395cf837de08b24da3f660e77761dfb974b",
"coin": "BTC",
"position_type": "Long",
"gross_pnl": "505.25",
"net_pnl": "498.11",
"funding_pnl": "0.98",
"entry_px": "63642.5",
"exit_px": "64150.75",
"position_closed_size": "1.0171",
"fees": "8.12",
"fills": 12,
"open_time": 1735689600000,
"close_time": 1735776000000,
"duration_ms": 86400000,
"max_position_size": "1.0171",
"maker_fills": 4,
"builder": null
}
]
Field descriptions
The PnL, price, size, and fee fields (
gross_pnl, net_pnl, funding_pnl, entry_px, exit_px, position_closed_size, fees, max_position_size) are returned as decimal strings, preserving full precision. Counts (fills, maker_fills) and timestamps (open_time, close_time, duration_ms) are JSON numbers. Do not parse the decimal strings as floats - keep them as strings or use a fixed-precision decimal type.string
The wallet address the trades belong to (lowercase 0x-prefixed hex), echoing the request.
string
Asset symbol - e.g.
"BTC", "ETH" for perps; HIP-3 markets use the dex:SYM form (e.g. "xyz:GOLD").string
Direction of the round-trip position -
"Long" or "Short".string
Realized trading PnL for the round-trip in USDC, before fees and funding.
string
Net realized PnL in USDC -
gross_pnl minus fees plus funding_pnl.string
Funding component of the round-trip in USDC (negative = paid, positive = received).
string
Volume-weighted average entry price across the opening fills (carried at 10 decimal places, then trimmed of trailing zeros).
string
Volume-weighted average exit price across the closing fills (carried at 10 decimal places, then trimmed of trailing zeros).
string
Peak absolute position size reached during the round-trip - the same value as
max_position_size.string
Total trading fees paid across all fills in the round-trip, in USDC.
int
Total number of fills that make up the round-trip (opening and closing).
int
Unix timestamp in milliseconds of the first opening fill.
int
Unix timestamp in milliseconds of the closing fill that brought the position flat.
int
Round-trip duration in milliseconds -
close_time minus open_time.string
Peak absolute position size reached during the round-trip.
int
Number of fills in the round-trip that were on the maker side.
string | null
Builder address routed through by the closing fill (
0x-prefixed hex), or null when the closing fill carried no builder code.Related endpoints
userCompletedTradesByTime
fetch a wallet’s fully-closed round-trip trades within a close-time window, oldest-first, with a keyset cursor for forward paging.
userAbstraction
fetch a user’s account-abstraction mode.
userBorrowLendInterest
fetch a user’s borrow/lend interest accrual history.
userFees
fetch a user’s fee schedule and recent daily trading volume.