curl --request GET \
--url https://api.range.org/v2/transfers \
--header 'X-API-KEY: <api-key>'import requests
url = "https://api.range.org/v2/transfers"
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/transfers', 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/transfers",
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/transfers"
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/transfers")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.range.org/v2/transfers")
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{
"items": [
{
"id": "9359/AX/2352",
"time": "2024-05-08T13:05:57.779Z",
"status": "SUCCEEDED",
"type": "cctp",
"sender": {
"address": "AuZrspySopxfZUiXY6YxDyfS211KvXLe197kj3M2cLpq",
"network": "solana"
},
"receiver": {
"address": "noble14h2xp3fcfsgwmr24wrurfpv5t0chaal238k9wq",
"network": "noble-1"
},
"sender_tx_hash": "76b9922b6c8968d328e56930b4bbe26665d2ed12f2bdff45b2e9a43b09f5ab9c",
"receiver_tx_hash": "e607dba4c1e138dabb1d534ba0e14645786ca892907563c388d7de7f65ba7bb3",
"note": "<string>",
"category": "<string>",
"direction": "in"
}
],
"meta": {
"next_cursor": "eyJpZCI6IjkxeFFlV3Z...",
"previous_cursor": "eyJpZCI6IjkxeFFlV3Z...",
"first_page_cursor": "eyJpZCI6IjkxeFFlV3Z...",
"last_page_cursor": "eyJpZCI6IjkxeFFlV3Z...",
"total_count": 100,
"page_number": 1
}
}Get token transfers
Returns a list of token transfers that match the specified search term.
curl --request GET \
--url https://api.range.org/v2/transfers \
--header 'X-API-KEY: <api-key>'import requests
url = "https://api.range.org/v2/transfers"
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/transfers', 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/transfers",
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/transfers"
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/transfers")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.range.org/v2/transfers")
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{
"items": [
{
"id": "9359/AX/2352",
"time": "2024-05-08T13:05:57.779Z",
"status": "SUCCEEDED",
"type": "cctp",
"sender": {
"address": "AuZrspySopxfZUiXY6YxDyfS211KvXLe197kj3M2cLpq",
"network": "solana"
},
"receiver": {
"address": "noble14h2xp3fcfsgwmr24wrurfpv5t0chaal238k9wq",
"network": "noble-1"
},
"sender_tx_hash": "76b9922b6c8968d328e56930b4bbe26665d2ed12f2bdff45b2e9a43b09f5ab9c",
"receiver_tx_hash": "e607dba4c1e138dabb1d534ba0e14645786ca892907563c388d7de7f65ba7bb3",
"note": "<string>",
"category": "<string>",
"direction": "in"
}
],
"meta": {
"next_cursor": "eyJpZCI6IjkxeFFlV3Z...",
"previous_cursor": "eyJpZCI6IjkxeFFlV3Z...",
"first_page_cursor": "eyJpZCI6IjkxeFFlV3Z...",
"last_page_cursor": "eyJpZCI6IjkxeFFlV3Z...",
"total_count": 100,
"page_number": 1
}
}Authorizations
Authorization method required to allow user to access the api endpoints.
Query Parameters
"solana"
"n0192376853"
usd "usd"
1 <= x <= 10010
"0xbe667b06979c46e186cebb4ad2c6fb6af8fb034e4723518416b2e7d3aeeb4753"
Comma-separated list of transaction hashes to filter by
"0xbe667b06979c46e186cebb4ad2c6fb6af8fb034e4723518416b2e7d3aeeb4753,0xabc123"
"eth,solana"
"eth,solana"
Only find transfers on one specific network
"cosmoshub-4"
Only find transfers on one specific address
"C6RarBbo5zxMzFiVhYAvbGUWiJGuVsSczawdXdGzeEoj"
Only find transfers involving this specific address as sender and reciever
"C6RarBbo5zxMzFiVhYAvbGUWiJGuVsSczawdXdGzeEoj,C6RarBbo5zxMzFiVhYAvbGUWiJGuVsSczawdXdGzeEoj"
"e.g. partial address"
Current status(es) of the transfer, comma-separated (e.g. 'SUCCEEDED,FAILED')
SUCCEEDED, PENDING, ERROR_ON_DESTINATION, TIMEOUT "SUCCEEDED,FAILED"
Direction(s) relative to the workspace's saved addresses, comma-separated: 'in' (received from an external address), 'out' (sent to an external address), 'internal' (both sides owned by the workspace). Requires only_workspace=true. group_ids narrows which transfers are returned, but direction is always classified against every workspace account — the same set as the per-item direction field, so the two never disagree.
in, out, internal "in,internal"
Bridges or networks used for the transfer
"ibc,cctp"
Token symbols involved in the transfer
"USDC,DAI"
Limit workspace address entries to those belonging to these group IDs (comma-separated UUIDs)
"uuid1,uuid2"
Minimum USD amount (decimal). Converted to number.
"100.50"
Maximum USD amount (decimal). Converted to number.
"1000"
Comma-separated category names to filter by (workspace-specific enrichment). Requires workspace authentication.
"defi,exchange"
Start time (ISO 8601). Converted to Date.
"2025-01-01T00:00:00Z"
End time (ISO 8601). Converted to Date.
"2025-12-31T23:59:59Z"
Opaque workspace id passed by some clients. Ignored for auth; workspace membership comes from the API key / bearer token.
"cmrxtfh5m0005xqu7x46k8uko"
Comma-separated category names. Only returns transfers that the authenticated workspace has labelled with one of these categories.
"Revenue,Payroll"
If true, only returns transfers that the authenticated workspace has labelled with a category. If false, returns all transfers regardless of whether they have a category. Also gates own-feed token whitelist filtering: with only_workspace=true, transfers hidden by the workspace token whitelist (or with no attached USD value) are excluded by default — see show_all to opt out per request. Note priced here means the transfer indexer attached a USD value at index time, which can differ from the token catalog's priced used on balances — a genuinely curated token whose transfer predates its pricing (backfill gaps, a newly-curated token, dust rounding to zero) can be hidden on the feed while still visible in balances. Recoverable via an explicit on-override or show_all=true. On Solana, only per-token overrides (pinning a specific mint) affect this feed — a symbol-level override (e.g. pinning "SPAM" workspace-wide) has no effect here, since the feed queries the raw mint address before it resolves to a symbol.
"true"
Only applies when only_workspace=true. Restores the unfiltered own-feed response exactly as it was before token whitelisting — every transfer is returned regardless of the workspace token whitelist, byte-for-byte identical to the pre-whitelisting response. A pure read-time view toggle; never mutates stored overrides.
INTERCHAIN, INTRACHAIN, ALL Was this page helpful?