Internal transfers of an address
Open WETH on its entity page →
The ETH an address sent or received inside transactions, newest first. A contract moves ETH by making a call that carries value; each such call frame is one row, with its position in the call tree, its depth, the kind of call, the value it moved and its own outcome.
GET https://tracefast.xyz/api/v1/chains/1/entities/{address}/internal-transfers
| Parameter | In | Type | Notes |
|---|---|---|---|
address | path | string | 0x-prefixed, 40 hex characters, any case |
limit | query | integer, optional | 1..100, default 25 |
cursor | query | string, optional | nextCursor of the previous page, unchanged |
direction | query | string, optional | sent or received |
fromBlock | query | integer, optional | inclusive lower block bound |
toBlock | query | integer, optional | inclusive upper block bound |
Access — an API key on the Investigation plan or higher (plans), or no key at all: pay per call with x402 at the same path on https://mpp.tracefast.xyz/api/v1, at the price its 402 states. As a tool for AI agents: get_entity_internal_transfers on the MCP server. Stable — see stability.
chains/1 is a literal: the method serves Ethereum mainnet data. Other chain
ids answer 404 chain_not_supported. An unknown parameter is refused rather
than ignored.
What it covers, and what it does not
- The transaction's own top-level call is never a row here. That call is
the transaction itself, with its
value, and it is in transactions of an address. This feed starts at depth 2. - Only frames that carry value. A call with zero value moves nothing and is not listed. For every frame of one transaction, value or not, use the execution trace.
- Each frame has its own outcome. A frame can revert while the
transaction succeeds, and a reverted frame moved nothing. Check
statuson the row, not only the transaction's receipt. - Filters on a very active address need a block window. Paging without
filters always works. The
directionfilter searches the address's history, so on an address with a very large history it is answered only inside afromBlock/toBlockwindow. The refusal names the widest window it accepts.
Response
200 application/json, here with ?limit=2:
{
"data": {
"address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"transfers": [
{
"blockNumber": 25925232,
"txIndex": 267,
"timestamp": 1788781127,
"txHash": "0x1bca0d23b265970dca726b50771f9f8fc797318bd874686b97b398b1bd8c2edc",
"callPath": "0000000100010000",
"callDepth": 4,
"callType": "call",
"from": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"to": "0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45",
"valueWei": "55816973655364",
"status": "success",
"role": "sender",
"counterparty": "0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45"
},
{
"blockNumber": 25925232,
"txIndex": 266,
"timestamp": 1788781127,
"txHash": "0x853149beeb924d2c56fcb9e879ec2ac08d3d681831da0c5740f87b383a6ec5b6",
"callPath": "0000000100010000",
"callDepth": 4,
"callType": "call",
"from": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"to": "0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45",
"valueWei": "205294798941043",
"status": "success",
"role": "sender",
"counterparty": "0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45"
}
],
"nextCursor": "AVsyNTkyNTIzMiwyNjYsIjAwMDAwMDAxMDAwMTAwMDAiXefv_7JX5tZ-p3sfzz3Lr-s"
},
"meta": {
"chain": "ethereum",
"timestamp": 1789047648468,
"cached": false,
"docs": "https://docs.tracefast.xyz/api/entity-internal-transfers"
}
}Here the WETH contract pays out ETH on a withdrawal, four calls deep inside each transaction.
data
| Field | Meaning |
|---|---|
address | the address the feed is about, lowercase |
transfers[] | at most limit rows, newest first |
nextCursor | pass it back as cursor for the next page. Absent on the last page |
A transfer
| Field | Meaning |
|---|---|
blockNumber | the block of the transaction |
txIndex | the transaction's position in the block |
timestamp | block time, Unix seconds |
txHash | the transaction the frame ran in |
callPath | the frame's position in the call tree, as the trace encodes it. Use it to find the frame in the execution trace |
callDepth | depth in the call tree. 1 is the top-level call, which never appears here |
callType | the kind of frame, for example call, delegatecall, create, create2, selfdestruct |
from | the account the value left |
to | the account the value reached. Absent where the trace records none |
valueWei | value moved by this frame, in wei, a decimal string |
status | the frame's own outcome, for example success or reverted |
role | sender, receiver or self — this address's part in the frame |
counterparty | the other party of the frame, when there is one |
Pagination
The feed pages by keyset. Pass nextCursor back as cursor, with the same
filters, until nextCursor is absent. A cursor is valid only for this
method, this address and these filters; any other use answers
400 invalid_cursor, and the recovery is to restart from the first page. A
page can hold fewer than limit rows while nextCursor is still present. See
pagination.
Errors
Every error is JSON: { "error": { "code": "...", "message": "...", "details": { … } } }
| Status | code | When | details |
|---|---|---|---|
| 400 | bad_request | direction on an address this active, without a narrow enough block window | reason: filter_needs_block_window, filters, rowCount, maxUnboundedRowCount, spanBlocks, maxSpanBlocks |
| 400 | bad_request | direction outside sent / received | reason: direction_invalid, direction |
| 400 | bad_request | fromBlock above toBlock | reason: block_window_inverted, fromBlock, toBlock |
| 400 | bad_request | limit outside 1..100 | reason: limit_out_of_range, maxLimit: 100 |
| 400 | invalid_cursor | the cursor is not valid for this request — restart from the first page | — |
When a filter is refused, pass a fromBlock/toBlock window no wider than
details.maxSpanBlocks, or drop the filter. The refusal has the same shape as
on transfers of a token.
Malformed input, unknown parameters and the key check's 401/403/429 are the same for every method — see conventions and API keys.
Related pages
- Transactions of an address — the top-level calls
- Execution trace of a transaction — every frame of one transaction
- Token transfers of an address — tokens, not ETH
- Activity Feeds — the same feed in the app
Last updated 22 Oct 2026, 08:06 UTC · verified against TraceFast v1.0.261 · Markdown