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
| Parameter | In | Type | Notes |
|---|---|---|---|
hash | path | string | 0x-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: 0in both cases. For the outcome, readstatuson 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_availablewithreason: coverage_gapandmaxAvailableBlock, 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.
framesTruncatedsays when there are more;framesis 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
| Field | Meaning |
|---|---|
chainId | 1, Ethereum mainnet |
hash | the transaction, lowercase |
blockNumber | the block that includes it. Absent when there are no failed frames |
frameCount | failed frames returned |
framesTruncated | true when the transaction has more than 100 failed frames |
frames[] | failed frames, root first, then nested frames in tree order |
A failed frame
| Field | Meaning |
|---|---|
callPath | position in the call tree: four hex characters per level, the root frame is 0000 |
callDepth | depth from the root, 1 = root. Sort by callDepth, then callPath, to render the tree |
callType | CALL, CALLCODE, DELEGATECALL, STATICCALL, CREATE, CREATE2, SELFDESTRUCT, EOA_TRANSFER |
from, to | the frame's caller and target |
status | Revert (the frame reverted) or Halt (the EVM halted it) |
errorKind | Revert, Panic, CustomError, OutOfGas, StackOverflow, InvalidOpcode, PrecompileError, Other |
revertSelector | the first four bytes of the revert payload; 0x00000000 when the payload is shorter |
errorName, errorSignature | the error's name and canonical signature, for example Error(string), when the selector is known. Both absent otherwise — show revertSelector then |
revertData | the revert payload, lowercase 0x-hex; 0x when the frame reverted with no data. Capped at 4 KB |
revertDataTruncated | true when revertData was cut at the cap. A cut payload decodes into a plausible but wrong argument list |
revertDataLength | the payload's full length, bytes |
gasUsed | gas used by this frame, an integer |
Errors
| Status | code | When | details |
|---|---|---|---|
| 400 | bad_request | the hash is not 0x plus 64 hex characters | reason: tx_hash_invalid |
| 422 | block_not_available | the transaction is known, but the failure classification has not reached its block yet; ask again later | reason: coverage_gap, maxAvailableBlock, coverageGapFromBlock — no coverageGapToBlock: the range is open-ended |
| 422 | block_not_available | the block sits in a coverage gap; ask again later | reason: 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.
Related pages
- Execution trace of a transaction — the full call tree, caught reverts included
- One transaction — the outcome, in
status - Function selectors of a contract — what the target exposes
- Transactions — the transaction page in the app
Last updated 22 Oct 2026, 08:06 UTC · verified against TraceFast v1.0.261 · Markdown