Skip to content
TraceFast Docs

Attributes of an address

See these facts on an entity page →

The facts proven about one Ethereum address — what kind of account it is, how it has been present on-chain, what it is known to be — each with the block it was observed at. The first half of this page is the method; the second half is the dictionary for reading its answer.

GET https://tracefast.xyz/api/v1/chains/1/entities/{address}/attributes
ParameterInTypeNotes
addresspathstring0x-prefixed, 40 hex characters, any case

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 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. The method takes no query parameters — an unknown one is refused rather than ignored. For the attributes an address held at a past block, see attributes at a block.

Response

200 application/json:

{
  "data": {
    "chainId": 1,
    "entity": "0x4838b106fce9647bdf1e7877bf73ce8b0bad5f97",
    "attributes": [
      "address_nature:account_state_ever_touched",
      "address_nature:eoa_currently",
      "address_nature:has_onchain_existence",
      "address_nature:was_eip7702_delegated",
      "address_presence:call_callee_ever",
      "address_presence:call_caller_ever",
      "address_presence:token_transfer_recipient_ever",
      "address_presence:token_transfer_sender_ever",
      "address_presence:tx_recipient_ever",
      "address_presence:tx_sender_ever",
      "derived:account_type",
      "derived:code_history_notable",
      "derived:controller"
    ],
    "attributeDetails": [
      { "attributeId": "address_nature:eoa_currently", "result": "pass", "referenceBlock": 16983719 }
    ],
    "typeHints": { "source": "…" }
  },
  "meta": { "chain": "ethereum", "timestamp": 1788346425445, "cached": false }
}
  • attributes — the ids of every attribute that holds for the address. Absence means "not proven", not "false".
  • attributeDetails — one entry per id with result and referenceBlock, the block the fact was observed at.
  • typeHints — which source answered, and the provisional type hints used when the knowledge graph has not reached the address yet. See typeHints below.

Errors

StatuscodeWhen
400bad_requestmalformed address, or an unknown query parameter
404chain_not_supporteda chain id other than 1

Malformed input, unknown parameters and the key check's 401/403/429 are the same for every method — see conventions and API keys. Over x402, a 402 is the payment challenge or a rejected payment — see Paying with x402.

The rest of this page is the dictionary. The finished fields most consumers read first — account type, control model, DeFi role — are catalogued in derived address attributes.

How to read an entry

Every id has the shape family:fact. Ids are stable: an id that appears in a response keeps its meaning, and new ids are added over time rather than redefined.

attributes is the flat list of ids that hold for the address. attributeDetails carries one entry per id:

FieldMeaning
attributeIdthe id
resultpass — the fact holds for the address
referenceBlockthe block the fact was observed at — where the evaluation looked, not when the fact became true. Per attribute, not per response: a token can carry one block on its account-nature ids and a much later one on its behavioural ids
valuepresent only on ids that carry one: a JSON string for the categorical projections, or a JSON array naming the facts an umbrella projection was assembled from

Two rules that govern every id

  • A fact is listed only when it was proven. Absence means "not proven", never "false" — an address whose response carries no derived:privileged_controls is not thereby an address that has no privileged surface; it is one for which none was proven.
  • A fact claims exactly what it says. A projection about a surface (what the code can do) is never the same statement as one about an observation (what actually happened), and the two are never merged into one attribute.

The two layers

Proven facts are the base layer: each is established for an address by its own evaluation over chain data. They arrive in the response grouped by subject — the nature of the account, where it has been present on-chain, what asset it is, how the contract is put together, which interfaces it presents, which privileged capabilities exist, which protocol roles it holds, and how it is related to other addresses. Their evaluation is our implementation detail and is not published: what a consumer contracts on is the layer above.

Derived attributes are folds over those proven facts — one finished field instead of an OR over a dozen ids: derived:account_type, derived:control_model, derived:defi_role, derived:smart_account and the rest. They are computed once, on our side, and versioned with the data. The catalogue is here, with the values of every enumerated projection.

Both layers appear in the same attributes list, so a response can be filtered by the derived: prefix when only the finished fields are wanted.

typeHints

Not every address has been reached by the graph yet. typeHints says which source answered:

FieldMeaning
sourcewhich source answered: the knowledge graph, a provisional hint (hint), or neither (none)
hintsthe provisional type hints, e.g. contract, fungible_token, nft_collection, multi_token_collection, eoa. Empty unless source is hint
evidenceBlockthe newest block behind those hints — how fresh the guess is

Hints are positive and non-exclusive: a freshly deployed token carries both contract and fungible_token. A hint is a guess with evidence behind it, not a proven attribute — branch on hints being non-empty rather than on the absence of an attribute id.


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