Transfer History
Fetch paginated transfer history for a wallet address across any supported chain.
GET
/v1/wallets/{address}/transfersParameters
| Parameter | Type | Description |
|---|---|---|
| address* | string | Wallet address (path parameter) |
| chainoptional | string | Chain slug (e.g., ethereum, bsc, polygon). Omit to search all chains. |
| fromBlockoptional | integer | Start block number |
| toBlockoptional | integer | End block number |
| fromDateoptional | ISO 8601 | Start date (e.g., 2026-01-01T00:00:00Z) |
| toDateoptional | ISO 8601 | End date. Max range: 365 days. |
| assetoptional | string | Filter by asset contract address |
| directionoptional | string = both | Filter: in, out, or both |
| includePricesoptional | boolean = false | Include USD/fiat prices at time of transfer |
| currencyoptional | string = USD | Fiat currency for prices (36 supported) |
| limitoptional | integer = 100 | Results per page (max 1000) |
| cursoroptional | string | Pagination cursor from previous response |
Request
bash
curl 'https://api.cryptachain.com/v1/wallets/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045/transfers?chain=ethereum&limit=2&includePrices=true' \
-H 'X-API-Key: $CRYPTACHAIN_API_KEY'typescript
const res = await fetch(
'https://api.cryptachain.com/v1/wallets/0xd8dA.../transfers?' +
new URLSearchParams({ chain: 'ethereum', limit: '2', includePrices: 'true' }),
{ headers: { 'X-API-Key': process.env.CRYPTACHAIN_API_KEY! } }
);
const data = await res.json();python
res = requests.get(
'https://api.cryptachain.com/v1/wallets/0xd8dA.../transfers',
params={'chain': 'ethereum', 'limit': 2, 'includePrices': True},
headers={'X-API-Key': os.environ['CRYPTACHAIN_API_KEY']}
)Response
Response 200 OK
json
{
"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"chain": "ethereum",
"transfers": [
{
"txHash": "0xabc123...",
"blockNumber": 21950000,
"timestamp": "2026-04-04T14:30:00Z",
"from": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"to": "0x1234567890abcdef1234567890abcdef12345678",
"value": "1.5",
"asset": "ETH",
"contractAddress": null,
"direction": "out",
"price_usd": 3850.25,
"value_usd": 5775.38
},
{
"txHash": "0xdef456...",
"blockNumber": 21949000,
"timestamp": "2026-04-04T12:15:00Z",
"from": "0xabcdef1234567890abcdef1234567890abcdef12",
"to": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"value": "100",
"asset": "USDC",
"contractAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"direction": "in",
"price_usd": 1.00,
"value_usd": 100.00
}
],
"cursor": "eyJibG9jayI6MjE5NDkwMDB9",
"hasMore": true
}Response fields
| Field | Type | Description |
|---|---|---|
txHash | string | Transaction hash |
blockNumber | integer | Block number |
timestamp | string | ISO 8601 UTC timestamp |
from | string | Sender address |
to | string | Recipient address |
value | string | Transfer amount (decimal string to preserve precision) |
asset | string | Asset symbol (ETH, USDC, etc.) |
contractAddress | string|null | Token contract address (null for native transfers) |
direction | string | in or out relative to the queried address |
price_usd | number | Price per unit at time of transfer (if includePrices=true) |
value_usd | number | Total value in fiat (if includePrices=true) |
cursor | string | Pass to next request for pagination |
hasMore | boolean | Whether more results exist |
Pagination
Use cursor-based pagination for large result sets:
typescript
let cursor: string | undefined;
do {
const params = new URLSearchParams({ chain: 'ethereum', limit: '100' });
if (cursor) params.set('cursor', cursor);
const res = await fetch(`${BASE}/v1/wallets/${addr}/transfers?${params}`, {
headers: { 'X-API-Key': key },
});
const data = await res.json();
process(data.transfers);
cursor = data.hasMore ? data.cursor : undefined;
} while (cursor);