Skip to content
TraceFast Docs

Attributes of an address at a block

Open this address in TraceFast →

The attributes an address held at the end of one block, each with the window of blocks it held for. Use it to ask "was this true then?" in the same vocabulary the current attributes use for "is this true now?".

GET https://tracefast.xyz/api/v1/chains/1/entities/{address}/attributes/at-block?block={block}
ParameterInTypeNotes
addresspathstring0x-prefixed, 40 hex characters, any case
blockqueryinteger, requiredthe block to answer about — the state at the end of it

Access — an API key on the Intelligence 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_attributes_at_block on the MCP server. Stable — see stability.

chains/1 is a literal: other chain ids answer 404 chain_not_supported. An unknown parameter is refused rather than ignored.

What it covers, and what it does not

  • Only what coveredFamilies and coveredAttributeIds name. The history is built for some attribute families whole, and for some single ids of other families. An attribute is covered when its family is in coveredFamilies or its id is in coveredAttributeIds. Any other attribute is not listed whether or not it held — for those, only the current attributes can answer.
  • For a covered attribute, absence is an answer. With addressKnown: true, a covered attribute missing from intervals did not hold at that block. For an attribute covered by neither field, absence says nothing.
  • block is required. Without it there is no question; "what is true now" is the current attributes method.
  • A block past the covered history is refused with the highest block that can be answered, never answered with the latest state.

Response

200 application/json, here with ?block=25000000:

{
  "data": {
    "chainId": 1,
    "address": "0x4838b106fce9647bdf1e7877bf73ce8b0bad5f97",
    "block": 25000000,
    "coverageBlock": 26246351,
    "addressKnown": true,
    "intervals": [
      { "attributeId": "address_nature:account_state_ever_touched", "startBlock": 16976894 },
      { "attributeId": "address_nature:eoa_currently", "startBlock": 16976894, "endBlock": 25251272 },
      { "attributeId": "address_nature:has_onchain_existence", "startBlock": 16976894 },
      { "attributeId": "address_presence:call_callee_ever", "startBlock": 16976894 },
      { "attributeId": "address_presence:call_caller_ever", "startBlock": 16983719 },
      { "attributeId": "address_presence:token_transfer_recipient_ever", "startBlock": 16983730 },
      { "attributeId": "address_presence:token_transfer_sender_ever", "startBlock": 16983759 },
      { "attributeId": "address_presence:tx_recipient_ever", "startBlock": 16976894 },
      { "attributeId": "address_presence:tx_sender_ever", "startBlock": 16983719 }
    ],
    "coveredFamilies": ["address_nature", "address_presence"],
    "coveredAttributeIds": [
      "architecture:proxy",
      "architecture:beacon_proxy",
      "standard:erc20_interface",
      "capability:mint_surface_present",
      "dex:pool"
    ]
  },
  "meta": {
    "chain": "ethereum",
    "timestamp": 1792654704709,
    "cached": false,
    "asOfBlock": 26246351,
    "docs": "https://docs.tracefast.xyz/api/address-attributes-at-block"
  }
}

At block 25,000,000 the address was still a plain externally owned account: address_nature:eoa_currently held from 16,976,894 until 25,251,272, when the address was delegated under EIP-7702 and the interval closed.

coveredAttributeIds is shortened here: this answer named 50 single ids, from architecture:* and standard:* interfaces to dex:* and lending:* roles. None of them is in intervals: none held for this address at that block.

data

FieldMeaning
chainId1, Ethereum mainnet
addressthe address, lowercase
blockthe block you asked about, echoed so a forwarded answer cannot be mistaken for another block's
coverageBlockthe highest block the history has been computed up to. block is at or below it
addressKnownfalse when the history does not know the address at all — a different answer from an empty intervals, which means "known, no covered attribute held at this block". Absent when the history does not state it
intervals[]the attributes that held at block, each with its window
coveredFamiliesthe attribute families the history is built for, whole
coveredAttributeIdssingle attribute ids with a history although their family is not in coveredFamilies. An attribute covered by neither field is never listed here

An interval

FieldMeaning
attributeIdfamily:name — the same ids as the current attributes, explained in the dictionary
startBlockthe first block the attribute held at
endBlockthe last block it held at. Absent when the interval was still open at the end of the covered history — an end that was not observed is not stated
valuethe attribute's value over the interval, for attributes that carry one; absent otherwise

The ids that describe a contract's code — the standard:* interfaces, capability:*_surface_present, architecture:* and the like — follow the code the address executes. Their intervals are cut at each change of that code and not merged, so two adjacent intervals of one id mean it held through a code change. At one block there is only ever one.

An interval can end after block: it is listed because it held at block, and its full window is shown.

Errors

StatuscodeWhendetails
400bad_requestblock absentreason: block_required
400bad_requestblock is 0 or not a numberreason: block_not_positive, block
422block_not_availableblock is past the covered historyreason: block_not_available, maxAvailableBlock

Malformed input, unknown parameters and the key check's 401/403/429 are the same for every method — see conventions and API keys.


Last updated 22 Oct 2026, 08:06 UTC · verified against TraceFast v1.0.261 · Markdown