curl --request GET \
--url https://api.ironflow.sh/v1/vault-operations \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.ironflow.sh/v1/vault-operations"
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/vault-operations', 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/vault-operations",
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/vault-operations"
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/vault-operations")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ironflow.sh/v1/vault-operations")
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": [
{
"source": "hyperliquid",
"issuer": "",
"base_market": "",
"market_type": "perp",
"timestamp": 1718400000000,
"block_number": 12345678,
"address": "0xabc123",
"vault": "0xvault123",
"operation": "deposit",
"token": "USDC",
"requested_amount": "10000.00",
"net_amount": "9990.00",
"commission": "10.00",
"closing_cost": "0.00",
"basis": "9985.50",
"sequence": 1,
"tx_hash": "0x..."
}
],
"pagination": {
"next_cursor": "MTcxODQwMDAwMDAwMC00Mg==",
"has_more": true
}
}{
"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": "UNAUTHORIZED",
"message": "Invalid or missing API key"
}
}{
"error": {
"code": "TIER_FORBIDDEN",
"message": "Export requires Builder tier or above"
}
}{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Retry after 60 seconds."
}
}{
"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 vault deposits and withdrawals
GET /v1/vault-operations returns Hyperliquid vault deposit and withdrawal events, filtered by vault address, depositor address or both, over a time range.
curl --request GET \
--url https://api.ironflow.sh/v1/vault-operations \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.ironflow.sh/v1/vault-operations"
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/vault-operations', 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/vault-operations",
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/vault-operations"
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/vault-operations")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ironflow.sh/v1/vault-operations")
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": [
{
"source": "hyperliquid",
"issuer": "",
"base_market": "",
"market_type": "perp",
"timestamp": 1718400000000,
"block_number": 12345678,
"address": "0xabc123",
"vault": "0xvault123",
"operation": "deposit",
"token": "USDC",
"requested_amount": "10000.00",
"net_amount": "9990.00",
"commission": "10.00",
"closing_cost": "0.00",
"basis": "9985.50",
"sequence": 1,
"tx_hash": "0x..."
}
],
"pagination": {
"next_cursor": "MTcxODQwMDAwMDAwMC00Mg==",
"has_more": true
}
}{
"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": "UNAUTHORIZED",
"message": "Invalid or missing API key"
}
}{
"error": {
"code": "TIER_FORBIDDEN",
"message": "Export requires Builder tier or above"
}
}{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Retry after 60 seconds."
}
}{
"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 Vault address to filter by.
Wallet address filter (hex string, e.g. 0xabc123).
"0xabc123def456"
Filter by operation type.
deposit, withdraw Base market symbol, stripped of any issuer namespace (e.g. GAS-PERP).
Matches both native HL markets (market == base_market) and every HIP-3
builder-deployed market with that base (e.g. flx:GAS-PERP). Use together
with issuer to scope to a single builder, or alone to query across all
issuers of the same base symbol.
"GAS-PERP"
HIP-3 builder/issuer namespace (e.g. flx). For native HL perps the issuer
is the empty string; do not combine issuer="" with this filter — omit the
parameter instead. Commonly paired with base_market to disambiguate a
builder-deployed market from its native counterpart.
"flx"
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
Maximum number of results per page. Default 100, max 1000.
x <= 1000100
Opaque pagination cursor from pagination.next_cursor in a previous response.
"MTcxODQwMDAwMDAwMC00Mg=="