curl --request GET \
--url https://api.range.org/v2/accounts/transfers/{transferId} \
--header 'X-API-KEY: <api-key>'import requests
url = "https://api.range.org/v2/accounts/transfers/{transferId}"
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.range.org/v2/accounts/transfers/{transferId}', 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.range.org/v2/accounts/transfers/{transferId}",
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.range.org/v2/accounts/transfers/{transferId}"
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.range.org/v2/accounts/transfers/{transferId}")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.range.org/v2/accounts/transfers/{transferId}")
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{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"account_id": "acc_abc123",
"kind": "TRADE",
"status": "CONFIRMED",
"raw": {},
"transaction_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"provider_transaction_id": "0x9a3f...",
"account": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Treasury wallet",
"type": "eoa",
"groups": [
{
"id": "uuid-1",
"name": "Finance"
}
],
"network": "solana",
"address": "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG",
"details": {}
},
"provider": "hyperliquid",
"timestamp": "2026-01-15T10:00:00.000Z",
"hash": "0xabc...",
"network": "networks/ethereum-mainnet",
"block_number": "21000000",
"direction": "in",
"usd_amount": "250.50",
"transfers": [
{
"direction": "IN",
"asset": "USDC",
"amount": "100.50",
"usd_amount": "9.831",
"source_address": "0xabc...",
"destination_address": "0xdef...",
"source_label": "Coinbase",
"source_malicious": true,
"source_icon_urls": [
"https://icons.range.org/icons/coinbase.webp"
],
"destination_label": "Treasury",
"destination_malicious": false,
"destination_icon_urls": [
"https://icons.range.org/icons/entity.webp"
]
}
],
"trade": {
"side": "BUY",
"base_asset": "BTC",
"base_amount": "0.01",
"quote_asset": "USDC",
"quote_amount": "500.0",
"price": "50000.0",
"fee": "0.45",
"fee_asset": "USDC",
"realized_pnl": "25.11",
"liquidation": false
},
"fee": {
"amount": "5000",
"denom": "uatom"
},
"category": "Payroll",
"note": "Wire from payroll run"
}Get a single account transfer by id
Fetches one persisted account transfer by its transfer id (the transaction_id field returned by the list endpoints), scoped to the caller workspace.
curl --request GET \
--url https://api.range.org/v2/accounts/transfers/{transferId} \
--header 'X-API-KEY: <api-key>'import requests
url = "https://api.range.org/v2/accounts/transfers/{transferId}"
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.range.org/v2/accounts/transfers/{transferId}', 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.range.org/v2/accounts/transfers/{transferId}",
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.range.org/v2/accounts/transfers/{transferId}"
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.range.org/v2/accounts/transfers/{transferId}")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.range.org/v2/accounts/transfers/{transferId}")
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{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"account_id": "acc_abc123",
"kind": "TRADE",
"status": "CONFIRMED",
"raw": {},
"transaction_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"provider_transaction_id": "0x9a3f...",
"account": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Treasury wallet",
"type": "eoa",
"groups": [
{
"id": "uuid-1",
"name": "Finance"
}
],
"network": "solana",
"address": "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG",
"details": {}
},
"provider": "hyperliquid",
"timestamp": "2026-01-15T10:00:00.000Z",
"hash": "0xabc...",
"network": "networks/ethereum-mainnet",
"block_number": "21000000",
"direction": "in",
"usd_amount": "250.50",
"transfers": [
{
"direction": "IN",
"asset": "USDC",
"amount": "100.50",
"usd_amount": "9.831",
"source_address": "0xabc...",
"destination_address": "0xdef...",
"source_label": "Coinbase",
"source_malicious": true,
"source_icon_urls": [
"https://icons.range.org/icons/coinbase.webp"
],
"destination_label": "Treasury",
"destination_malicious": false,
"destination_icon_urls": [
"https://icons.range.org/icons/entity.webp"
]
}
],
"trade": {
"side": "BUY",
"base_asset": "BTC",
"base_amount": "0.01",
"quote_asset": "USDC",
"quote_amount": "500.0",
"price": "50000.0",
"fee": "0.45",
"fee_asset": "USDC",
"realized_pnl": "25.11",
"liquidation": false
},
"fee": {
"amount": "5000",
"denom": "uatom"
},
"category": "Payroll",
"note": "Wire from payroll run"
}Authorizations
Authorization method required to allow user to access the api endpoints.
Path Parameters
Response
Unique identifier for this event. On persisted reads this is the DB row id (stable across accounts that share a provider-native event). On live adapter responses it is the provider-native id used as the upsert key.
"a1b2c3d4-e5f6-7890-abcd-ef1234567890"
Account (in this API) the event belongs to.
"acc_abc123"
Discriminator: which event-specific payload is populated.
TRANSFER, TRADE "TRADE"
PENDING, CONFIRMED, FAILED "CONFIRMED"
Provider-native fields that are not part of the canonical shape (escape hatch; never relied upon by consumers).
{}
Persisted row id for this transaction. Present on reads from storage; absent on live adapter responses. Used to update category. On persisted reads this matches id.
"a1b2c3d4-e5f6-7890-abcd-ef1234567890"
Provider-native event id used as the upsert key. Present on persisted reads; on live adapter responses the same value lives in id.
"0x9a3f..."
Workspace Account this event belongs to. Present on persisted reads so clients do not need to join GET /v2/accounts by account_id. Balances are omitted — fetch the account directly for holdings.
Show child attributes
Show child attributes
Connection provider that produced this event. Null for on-chain-sourced rows (On-chain data provider ≠ Connection Provider).
"hyperliquid"
Canonical event time (ISO 8601).
"2026-01-15T10:00:00.000Z"
"0xabc..."
"networks/ethereum-mainnet"
"21000000"
Workspace-relative direction, judged on the first transfer leg against every saved account in the workspace (not narrowed by group_ids): internal when the counterparty is also a saved account or the leg is SELF, otherwise in / out from the leg. Null for trades and for transfers with no parsed legs. Unlike transfers[].direction, which is relative to the owning account.
in, out, internal "in"
Unsigned USD magnitude for this event (transfer notional or trade notional). Encrypted at rest with the financial payload; used by min_usd / max_usd filters.
"250.50"
Value movement legs. Populated when kind === 'TRANSFER' (may be empty when the provider has not parsed the underlying transfers yet).
Show child attributes
Show child attributes
Populated when kind === 'TRADE'.
Show child attributes
Show child attributes
Network fee paid, in base units of the native asset. Present only for on-chain transactions on networks with indexed fee data (cosmos, stellar today); absent for CEX/bank connections, unsupported networks, or when the underlying transaction record has no fee.
Show child attributes
Show child attributes
User-assigned category label. Null when unset. Survives provider re-sync.
"Payroll"
User-authored note. Null when unset. Survives provider re-sync.
"Wire from payroll run"
Was this page helpful?