Skip to content
TraceFast Docs

Why a transaction reverted

Open this transaction in TraceFast →

The failed call frames of a reverted transaction. For each: its position in the call tree, caller and target, the kind of failure — revert, panic, custom error, out of gas and so on — the revert payload with its selector, and the error name when the selector is known. Root frame first, then nested frames in tree order, at most 100.

GET https://tracefast.xyz/api/v1/chains/1/transactions/{hash}/failures
ParameterInTypeNotes
hashpathstring0x-prefixed, 64 hex characters, any case

Access — an API key on the Enriched Data 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_transaction_failures 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. There are no query parameters — an unknown one is refused rather than ignored.

What it covers, and what it does not

  • Only the frames that failed. A transaction can succeed while an inner call reverts and is caught; the whole call tree, successes included, is the execution trace.
  • An empty list is "no failure recorded", never "succeeded". A successful transaction answers an empty list, and so does a hash that is not known at all — frameCount: 0 in both cases. For the outcome, read status on one transaction.
  • A transaction the failure classification has not reached is refused, not answered empty. The classification trails the chain by minutes to hours. A known transaction in a block they have not reached answers 422 block_not_available with reason: coverage_gap and maxAvailableBlock, the last block classified — an empty list there would read as success. It says nothing about the outcome; ask again later — see data freshness.
  • At most 100 frames. framesTruncated says when there are more; frames is then a prefix in tree order.

Response

200 application/json:

{
  "data": {
    "chainId": 1,
    "hash": "0xd1bed4098b76c7c1c064db3ab687325643cebb82abca705ae24d7f75021f1d05",
    "blockNumber": 25920002,
    "frameCount": 1,
    "framesTruncated": false,
    "frames": [
      {
        "callPath": "0000",
        "callDepth": 1,
        "callType": "CALL",
        "from": "0x34f41c98898ed0c2f7d004538a7cbde33b35404f",
        "to": "0xde7034b494cc4fc2479b4605c1b6e56d4a1c6154",
        "errorKind": "CustomError",
        "status": "Revert",
        "revertSelector": "0xc64fc372",
        "errorName": "Err",
        "errorSignature": "Err()",
        "revertData": "0xc64fc372",
        "revertDataTruncated": false,
        "revertDataLength": 4,
        "gasUsed": 3008
      }
    ]
  },
  "meta": {
    "chain": "ethereum",
    "timestamp": 1789063644369,
    "cached": false,
    "asOfBlock": 25920002,
    "docs": "https://docs.tracefast.xyz/api/transaction-failures"
  }
}

The top-level call reverted with the contract's custom error Err(): its four-byte selector is the whole payload.

data

FieldMeaning
chainId1, Ethereum mainnet
hashthe transaction, lowercase
blockNumberthe block that includes it. Absent when there are no failed frames
frameCountfailed frames returned
framesTruncatedtrue when the transaction has more than 100 failed frames
frames[]failed frames, root first, then nested frames in tree order

A failed frame

FieldMeaning
callPathposition in the call tree: four hex characters per level, the root frame is 0000
callDepthdepth from the root, 1 = root. Sort by callDepth, then callPath, to render the tree
callTypeCALL, CALLCODE, DELEGATECALL, STATICCALL, CREATE, CREATE2, SELFDESTRUCT, EOA_TRANSFER
from, tothe frame's caller and target
statusRevert (the frame reverted) or Halt (the EVM halted it)
errorKindRevert, Panic, CustomError, OutOfGas, StackOverflow, InvalidOpcode, PrecompileError, Other
revertSelectorthe first four bytes of the revert payload; 0x00000000 when the payload is shorter
errorName, errorSignaturethe error's name and canonical signature, for example Error(string), when the selector is known. Both absent otherwise — show revertSelector then
revertDatathe revert payload, lowercase 0x-hex; 0x when the frame reverted with no data. Capped at 4 KB
revertDataTruncatedtrue when revertData was cut at the cap. A cut payload decodes into a plausible but wrong argument list
revertDataLengththe payload's full length, bytes
gasUsedgas used by this frame, an integer

Errors

StatuscodeWhendetails
400bad_requestthe hash is not 0x plus 64 hex charactersreason: tx_hash_invalid
422block_not_availablethe transaction is known, but the failure classification has not reached its block yet; ask again laterreason: coverage_gap, maxAvailableBlock, coverageGapFromBlock — no coverageGapToBlock: the range is open-ended
422block_not_availablethe block sits in a coverage gap; ask again laterreason: coverage_gap, coverageGapFromBlock, coverageGapToBlock, maxAvailableBlock

An unknown hash is not an error here — it answers an empty list.

A recent transaction the classification has not reached:

{
  "error": {
    "code": "block_not_available",
    "message": "the failure classification of block 25948674 is not available yet: it is available up to block 25925050. This says nothing about the transaction's outcome — retry later, or ask about a transaction at or below block 25925050.",
    "details": {
      "reason": "coverage_gap",
      "maxAvailableBlock": 25925050,
      "coverageGapFromBlock": 25925051
    }
  }
}

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