List an address's token transfers
Keyset-paginated list of token transfers involving an address within a mandatory block window (from_block and to_block are both required). Ordered by (block_number, log_index) descending.
direction=in|out|any (defaults to any) filters by transfer direction relative to {address}. token optionally filters transfers for a specific token contract. standard must be erc20 or erc721; erc1155 returns 422 no_coverage. Opaque pagination token from the previous response's next_cursor; pass it back unchanged.
Window and head clamping: to_block above as_of_block is 409 not_indexed_yet unless clamp=true, which truncates to_block down to as_of_block (never possible when from_block is itself already past it — that stays a hard 409 regardless of clamp). meta.finalized_block is a marker and never bounds a window. A window wider than 100,000 blocks is 409 window_too_large unless clamp=true, which truncates from the older end (raises from_block, keeps to_block fixed). The window's lower bound is computed per dataset, not from the chain's start alone: the per-address ERC-20 / ERC-721 transfer index is a derived dataset, and while its backfill is still filling older blocks its data starts above GET /chains coverage.from_block. The dataset's start only counts when it is higher than the start of the token-transfer data it is derived from (a chain with no transfer at its beginning is not a gap). A window entirely before that start is 422 no_coverage; one that starts before it is partial, and clamp=true raises from_block to that start before the 100,000-block limit is applied. Limitation: during an ascending backfill the hole between the backfilled tail and the live start is not detected (the dataset's start is its lowest covered block), so a window inside that hole is still 200 with an empty list. When clamped or partial, meta.coverage = "partial" ("full" otherwise).
Request
- Base URL: https://api.blockvectra.com/v1/data
- URL: https://api.blockvectra.com/v1/data/{chain}/addresses/{address}/transfers
- Auth: API key in header x-api-key
Path parameters
Chain identifier: the chain value of an entry in GET /chains (for example robinhood_mainnet), which lists every value this API accepts, i.e. the exact lowercase form of that entry's chain_slug. Matching is exact and case-sensitive; other spellings, aliases and numeric chain IDs are not accepted and return 404 not_found (unknown or not-public chain). What the chain serves differs per chain: see that entry's features and coverage.
20-byte address. 0x/0X prefix optional; either hex digit case is accepted.
20-byte address, 0x optional, either case.
Query parameters
Token standard to query. Must be one of erc20, erc721, or erc1155. Note that erc1155 returns 422 no_coverage.
20-byte address. 0x/0X prefix optional; either hex digit case is accepted.
Optional token contract address filter.
Window lower bound (inclusive), non-negative integer. Required — there is no unwindowed query.
Window upper bound (inclusive), non-negative integer. Required. Must be >= from_block.
Filter incoming (in), outgoing (out), or both (any). Defaults to any.
When true, truncate an out-of-range window instead of failing with 409. Any value other than the literal string true is treated as false.
Page size. Absent defaults to 50. 0 or a non-integer value is 400 bad_request. A value above 500 is clamped to 500, not rejected.
Opaque pagination token from the previous response's next_cursor; pass it back unchanged.
Response
This address's token transfers.
Example response
{
"data": [
{
"amount": "9007199254740993",
"block_timestamp": "2026-09-26T05:41:07Z"
}
],
"meta": {
"chain": "robinhood_mainnet",
"chain_slug": "ROBINHOOD_MAINNET",
"chain_external_id": "eip155:4663",
"refreshed_at": "2026-09-26T05:41:07Z"
}
}Changes
No recorded changes to this operation across all 1 revision of this API.