BlockVectra Traces API

Historical callTracer call trees.

Operations 2

GET /{chain}/blocks/{number}/traces Historical callTracer trace tree for a whole block #
GET /{chain}/transactions/{hash}/trace Historical callTracer trace tree for one transaction #

Specifications

Schemas & Data

📊
JSONSchema
https://artifacts.apis.io/blockvectra/json-schema/blockvectra-freshness-envelope-schema.json
📊
JSONSchema
https://artifacts.apis.io/blockvectra/json-schema/blockvectra-token-transfer-list-envelope-schema.json
📊
JSONSchema
https://artifacts.apis.io/blockvectra/json-schema/blockvectra-address-transfer-list-envelope-schema.json
📊
JSONSchema
https://artifacts.apis.io/blockvectra/json-schema/blockvectra-tokens-batch-envelope-schema.json
📊
JSONSchema
https://artifacts.apis.io/blockvectra/json-schema/blockvectra-dex-swap-list-envelope-schema.json
📊
JSONSchema
https://artifacts.apis.io/blockvectra/json-schema/blockvectra-transaction-list-envelope-schema.json
📊
JSONSchema
https://artifacts.apis.io/blockvectra/json-schema/blockvectra-key-view-schema.json
📊
JSONSchema
https://artifacts.apis.io/blockvectra/json-schema/blockvectra-balance-response-schema.json
📊
JSONSchema
https://artifacts.apis.io/blockvectra/json-schema/blockvectra-plans-response-schema.json
📊
JSONSchema
https://artifacts.apis.io/blockvectra/json-schema/blockvectra-resets-response-schema.json
📊
JSONSchema
https://artifacts.apis.io/blockvectra/json-schema/blockvectra-identity-view-schema.json
📊
JSONSchema
https://artifacts.apis.io/blockvectra/json-schema/blockvectra-session-response-schema.json
📊
JSONSchema
https://artifacts.apis.io/blockvectra/json-schema/blockvectra-subscription-create-schema.json
📊
JSONSchema
https://artifacts.apis.io/blockvectra/json-schema/blockvectra-subscription-patch-schema.json
📊
JSONSchema
https://artifacts.apis.io/blockvectra/json-schema/blockvectra-remove-result-schema.json
📊
JSONSchema
https://artifacts.apis.io/blockvectra/json-schema/blockvectra-add-result-schema.json
📊
JSONSchema
https://artifacts.apis.io/blockvectra/json-schema/blockvectra-event-history-page-schema.json
📊
JSONSchema
https://artifacts.apis.io/blockvectra/json-schema/blockvectra-subscription-list-schema.json
📊
JSONSchema
https://artifacts.apis.io/blockvectra/json-schema/blockvectra-faucet-claim-accepted-schema.json
📊
JSONSchema
https://artifacts.apis.io/blockvectra/json-schema/blockvectra-faucet-claim-request-schema.json
📊
JSONSchema
https://artifacts.apis.io/blockvectra/json-schema/blockvectra-json-rpc-response-body-schema.json

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/blockvectra:blockvectra-traces-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

blockvectra-traces-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: BlockVectra Data Traces API
  version: 0.1.3
  description: BlockVectra Data API — read-only REST endpoints over indexed data for each supported chain. The base URL is `https://api.blockvectra.com/v1/data`; supply your API key in the `x-api-key` header.
  contact:
    name: BlockVectra
servers:
- url: https://api.blockvectra.com/v1/data
  description: BlockVectra Data API
security:
- ApiKeyHeader: []
tags:
- name: Traces
  description: Historical callTracer call trees.
paths:
  /{chain}/blocks/{number}/traces:
    get:
      tags:
      - Traces
      summary: Historical callTracer trace tree for a whole block
      description: Reconstructed call tree per transaction in a block using `callTracer`, wrapped in the standard response envelope. **Returns the whole block, unpaginated** (`next_cursor` is never present). A permanent coverage gap returns `422`, never an empty array; a recent block with transactions but no trace data yet returns `503` instead -- once it is further behind the indexed head than the chain's trace window, it is `422` too (see "Errors" above).
      operationId: getBlockTraces
      parameters:
      - $ref: '#/components/parameters/ChainParam'
      - $ref: '#/components/parameters/BlockNumberPath'
      responses:
        '200':
          description: One call tree per transaction in the block, in `tx_index` order (`[]` for a real, finalized block that has zero transactions).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BlockTracesEnvelope'
        '400':
          description: '`error.code = "bad_request"`: `{number}` is not a valid non-negative integer.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
        '401':
          $ref: '#/components/responses/GatewayUnauthorized'
        '402':
          $ref: '#/components/responses/GatewayPaymentRequired'
        '404':
          description: '`error.code = "not_found"`: either `{chain}` is unknown or not public, or block `{number}` does not exist (never indexed, or removed by a reorg).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
        '409':
          $ref: '#/components/responses/BlockAboveHead'
        '422':
          description: '`error.code = "no_coverage"`: the chain does not have the `traces` capability (checked first), or `{number}` falls in a permanent trace coverage gap -- the chain has no trace data at all yet (`coverage.traces_from_block` is `null`), `{number}` is before trace coverage started (below the chain''s `coverage.traces_from_block` in `GET /chains`), inside a recorded gap, or (distinct from the `503` case below) it has transactions but was never traced and is already too far behind the indexed head for that to still be a pending write. `message` names the chain and the reason.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
              examples:
                capability:
                  value:
                    error:
                      code: no_coverage
                      message: chain 'eth_mainnet' does not support traces
                no_trace_data:
                  value:
                    error:
                      code: no_coverage
                      message: 'block 12345 has no trace coverage on chain ''robinhood_mainnet'': no trace data available'
                before_coverage_start:
                  value:
                    error:
                      code: no_coverage
                      message: 'block 12345 has no trace coverage on chain ''robinhood_mainnet'': coverage starts at block <traces_from_block>'
                coverage_gap:
                  value:
                    error:
                      code: no_coverage
                      message: 'block 1500000 has no trace coverage on chain ''robinhood_mainnet'': trace data is not available for blocks 1499993-1500000'
                permanent_hole:
                  value:
                    error:
                      code: no_coverage
                      message: 'block 1200000 has no trace coverage on chain ''robinhood_mainnet'': trace data is not available'
        '429':
          $ref: '#/components/responses/GatewayRateLimited'
        '503':
          description: '`error.code = "unavailable"`: the data store is unreachable or slow (including while the chain''s trace coverage start cannot be determined), or (see "Errors" above) `{number}` is a recent block with transactions but no trace data yet -- always with `Retry-After`.'
          headers:
            Retry-After:
              required: true
              schema:
                type: integer
                minimum: 1
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
              example:
                error:
                  code: unavailable
                  message: trace data for this block is not written yet; retry shortly
  /{chain}/transactions/{hash}/trace:
    get:
      tags:
      - Traces
      summary: Historical callTracer trace tree for one transaction
      description: Reconstructed `callTracer` call frame for a single transaction by its transaction hash. Unpaginated; `next_cursor` is never present. `data` is the call frame object directly.
      operationId: getTransactionTrace
      parameters:
      - $ref: '#/components/parameters/ChainParam'
      - $ref: '#/components/parameters/TxHashPath'
      responses:
        '200':
          description: This transaction's call tree.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TxTraceEnvelope'
        '400':
          description: '`error.code = "bad_request"`: `{hash}` does not parse as a 32-byte hash (`0x` optional, either case).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
        '401':
          $ref: '#/components/responses/GatewayUnauthorized'
        '402':
          $ref: '#/components/responses/GatewayPaymentRequired'
        '404':
          description: '`error.code = "not_found"`: either `{chain}` is unknown or not public, or no transaction with this `{hash}` exists in the lookup table (a transaction submitted moments ago may take a few seconds to be indexed; `message` says so -- retry briefly before treating it as permanent), or it resolved to a block whose trace tree has no matching transaction. If the hash is found in the lookup table but resolves to a block above `as_of_block`, it returns `409 not_indexed_yet` instead.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
              examples:
                not_found:
                  value:
                    error:
                      code: not_found
                      message: transaction 0x1234...abcd not found (a just-submitted transaction may take a few seconds to be indexed)
        '409':
          description: '`error.code = "not_indexed_yet"`: the resolved block is above `as_of_block`. On a chain with no indexed block at all it is the same code without `indexed_through` (see "Errors").'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
        '422':
          description: '`error.code = "no_coverage"`: the chain does not have the `traces` capability (checked first), or the resolved block falls in a permanent trace coverage gap -- the chain has no trace data at all yet (`coverage.traces_from_block` is `null`), the block is before trace coverage started (below the chain''s `coverage.traces_from_block` in `GET /chains`), inside a recorded gap, or (distinct from the `503` case below) it has transactions but was never traced and is already too far behind the indexed head for that to still be a pending write. `message` names the chain and the reason.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
              examples:
                capability:
                  value:
                    error:
                      code: no_coverage
                      message: chain 'eth_mainnet' does not support traces
                no_trace_data:
                  value:
                    error:
                      code: no_coverage
                      message: 'block 12345 has no trace coverage on chain ''robinhood_mainnet'': no trace data available'
                before_coverage_start:
                  value:
                    error:
                      code: no_coverage
                      message: 'block 12345 has no trace coverage on chain ''robinhood_mainnet'': coverage starts at block <traces_from_block>'
                coverage_gap:
                  value:
                    error:
                      code: no_coverage
                      message: 'block 1500000 has no trace coverage on chain ''robinhood_mainnet'': trace data is not available for blocks 1499993-1500000'
                permanent_hole:
                  value:
                    error:
                      code: no_coverage
                      message: 'block 1200000 has no trace coverage on chain ''robinhood_mainnet'': trace data is not available'
        '429':
          $ref: '#/components/responses/GatewayRateLimited'
        '503':
          description: '`error.code = "unavailable"`: the data store is unreachable or slow (including while the chain''s trace coverage start cannot be determined), or (see "Errors" above) the resolved block is a recent block with transactions but no trace data yet -- always with `Retry-After`.'
          headers:
            Retry-After:
              required: true
              schema:
                type: integer
                minimum: 1
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
              example:
                error:
                  code: unavailable
                  message: trace data for this block is not written yet; retry shortly
components:
  schemas:
    TxTraceEnvelope:
      type: object
      required:
      - data
      - meta
      description: Unpaginated; `next_cursor` is never present.
      properties:
        data:
          $ref: '#/components/schemas/CallFrame'
        meta:
          $ref: '#/components/schemas/Meta'
    HexBytes:
      type: string
      description: Raw bytes of any length, `0x` + an even number of lowercase hex digits (`"0x"` alone for zero bytes).
      pattern: ^0x([0-9a-f]{2})*$
    Meta:
      type: object
      description: Metadata present on every success response.
      required:
      - chain
      - chain_slug
      - chain_external_id
      - as_of_block
      - safe_block
      - finalized_block
      - coverage
      - refreshed_at
      properties:
        chain:
          type: string
          description: Chain identifier; the value of the `{chain}` path parameter.
          example: robinhood_mainnet
        chain_slug:
          type: string
          description: Canonical uppercase chain slug; `chain` is always its lowercase form.
          example: ROBINHOOD_MAINNET
        chain_external_id:
          type: string
          description: CAIP-2 formatted external chain identifier (`eip155:{chain_id}`).
          example: eip155:4663
        as_of_block:
          type: integer
          format: int64
          description: 'The newest fully written block (the `blocks` table''s maximum height); the only serving bound for block-scoped endpoints. For snapshot endpoints (balances, holders, nfts, dex prices, stocks) it is the service''s current indexed head, not the block height of the snapshot: read the snapshot time from `meta.refreshed_at`, and treat the data as stale when `refreshed_at` is `null`.'
        safe_block:
          type:
          - integer
          - 'null'
          format: int64
          description: 'A marker only: the node''s consensus `safe` block. Always present; `null` while no value is known (the node has no such tag, or the indexer has not read one yet). Only grows, never below `finalized_block`, and may be above or below `as_of_block`. It never truncates, rejects or bounds a response; see Finality in the API description.'
        finalized_block:
          type:
          - integer
          - 'null'
          format: int64
          description: 'A marker only: the node''s consensus `finalized` block. Always present; `null` while no value is known (the node has no such tag, or the indexer has not read one yet). Only grows, and may be above or below `as_of_block`. It never truncates, rejects or bounds a response; see Finality in the API description.'
        coverage:
          type: string
          enum:
          - full
          - partial
          description: '`"partial"` appears only from `GET /{chain}/addresses/{address}/transactions` and `GET /{chain}/addresses/{address}/transfers`, when `clamp=true` narrowed the served window, and from those two, `GET /{chain}/tokens/{token}/transfers` and `GET /{chain}/dex/swaps` when the block window starts before the lower bound of the dataset the endpoint reads -- the chain''s first indexed block, or higher while that dataset is still being backfilled (see Coverage in the API description and each endpoint''s window description). Every other endpoint reports `"full"`.'
        refreshed_at:
          description: 'When the data behind this response was last updated (UTC): the timestamp of `as_of_block` for block-based endpoints, the latest snapshot time for snapshot endpoints, and the last update time for token metadata and status. `null` means the snapshot''s update time is currently unknown: treat the data as stale; it never means "just refreshed".'
          oneOf:
          - $ref: '#/components/schemas/Timestamp'
          - type: 'null'
    ErrorBody:
      type: object
      description: The only shape any non-2xx response ever takes. `code` and `message` are always present; `indexed_through` is present only on `error.code = "not_indexed_yet"` on a chain with an indexed block, and absent (never `null`) otherwise. No other field is ever added.
      required:
      - error
      additionalProperties: false
      properties:
        error:
          type: object
          required:
          - code
          - message
          additionalProperties: false
          properties:
            code:
              type: string
              description: Stable machine-readable identifier; see each operation for the exact set of values it can return.
            message:
              type: string
              description: Free-form English text for logs/debugging. Do not pattern-match on it.
            indexed_through:
              type: integer
              format: int64
              description: 'Highest indexed block on this chain. Present only when `code = "not_indexed_yet"` and the chain has at least one indexed block; absent when it has none at all (an absent value is not `0`: block 0 indexed is `indexed_through: 0`).'
            data:
              type: object
              description: Optional structured error details.
              additionalProperties: true
    Timestamp:
      type: string
      format: date-time
      description: '`YYYY-MM-DDTHH:MM:SSZ`, UTC, second precision.'
      example: 2026-09-26 05:41:07+00:00
    Address:
      type: string
      description: 20-byte address, canonical form always `0x` + 40 lowercase hex digits.
      pattern: ^0x[0-9a-f]{40}$
    BlockTracesEnvelope:
      type: object
      required:
      - data
      - meta
      description: Unpaginated; `next_cursor` is never present.
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/BlockTraceItem'
        meta:
          $ref: '#/components/schemas/Meta'
    HashInput:
      type: string
      description: 32-byte hash. `0x`/`0X` prefix optional; either hex digit case is accepted.
      pattern: ^(0[xX])?[0-9a-fA-F]{64}$
    CallFrame:
      type: object
      description: 'A single `callTracer` call frame in standard Ethereum `callTracer` format; `value`/`gas`/`gasUsed` are `0x`-prefixed hex quantities. Any additional fields in the call frame are preserved (`additionalProperties: true`).'
      required:
      - type
      - from
      - gas
      - gasUsed
      - input
      properties:
        type:
          type: string
          description: e.g. `CALL`, `DELEGATECALL`, `STATICCALL`, `CREATE`, `CREATE2`, `SELFDESTRUCT`.
        from:
          $ref: '#/components/schemas/Address'
        to:
          $ref: '#/components/schemas/Address'
          description: Absent for a `CREATE`/`CREATE2` frame's target (the address does not exist yet at call time in the node's own output).
        value:
          $ref: '#/components/schemas/HexQuantity'
          description: Absent for a `STATICCALL` frame (no value can move).
        gas:
          $ref: '#/components/schemas/HexQuantity'
        gasUsed:
          $ref: '#/components/schemas/HexQuantity'
        input:
          $ref: '#/components/schemas/HexBytes'
        output:
          $ref: '#/components/schemas/HexBytes'
          description: Absent when the call returned no data.
        error:
          type: string
          description: Absent on a successful call.
        revertReason:
          type: string
          description: Absent unless the call reverted with `Error(string)` data.
        calls:
          type: array
          description: Nested sub-calls, in call order. Absent for a leaf frame.
          items:
            $ref: '#/components/schemas/CallFrame'
      additionalProperties: true
    Hash32:
      type: string
      description: 32-byte hash/topic, canonical form always `0x` + 64 lowercase hex digits.
      pattern: ^0x[0-9a-f]{64}$
    HexQuantity:
      type: string
      description: '`0x`-prefixed hexadecimal integer in standard Ethereum `callTracer` format; `value`/`gas`/`gasUsed` are `0x`-prefixed hex quantities.'
      pattern: ^0x[0-9a-f]+$
    BlockTraceItem:
      type: object
      required:
      - txHash
      - result
      properties:
        txHash:
          $ref: '#/components/schemas/Hash32'
        result:
          $ref: '#/components/schemas/CallFrame'
  responses:
    GatewayPaymentRequired:
      description: 'Payment required: the paid balance or the free grant is exhausted. The response body is `{"error":{"code":"insufficient_balance"}}`. Rejected requests are not billed.'
    GatewayRateLimited:
      description: Rate limited. `{"error":{"code":"rate_limited"}}` when the key CU rate limit is exceeded (the response includes `Retry-After`) or the account call rate limit is exceeded (no `Retry-After`). `{"error":{"code":"cost_exceeds_burst"}}` when a single request exceeds the key burst capacity; split the request, retrying as sent never succeeds. Rejected requests are not billed.
    GatewayUnauthorized:
      description: 'HTTP 401: a missing API key returns missing_api_key; an unknown, disabled, or revoked key returns the same invalid_api_key error envelope. error.code and error.data.reason contain the reason. Rejected requests are not billed.'
      content:
        application/json:
          examples:
            missing_api_key:
              value:
                error:
                  code: missing_api_key
                  message: 'missing API key: send it in the x-api-key header'
                  data:
                    reason: missing_api_key
                    docs_url: https://docs.blockvectra.com/en/errors/#missing_api_key
                    retryable: false
            invalid_api_key:
              value:
                error:
                  code: invalid_api_key
                  message: 'invalid API key: it is unknown, disabled or revoked; check the key in the console'
                  data:
                    reason: invalid_api_key
                    docs_url: https://docs.blockvectra.com/en/errors/#invalid_api_key
                    retryable: false
    BlockAboveHead:
      description: After the operation passes its earlier routing, capability, parameter and permit checks and reaches the indexed-head check, `error.code = "not_indexed_yet"` when the requested block (a `{number}` path parameter, or the block a hash resolved to) is above `as_of_block`, the newest fully written block (see "Errors" above). It carries `indexed_through`, the highest indexed block. `meta.finalized_block` is a marker only and never rejects an indexed block. On a chain with no indexed block at all it is also `not_indexed_yet` but `indexed_through` is **absent** (block 0 is not indexed either).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorBody'
          examples:
            not_indexed_yet:
              value:
                error:
                  code: not_indexed_yet
                  message: block 999999999 has not been indexed yet (indexed through 12345)
                  indexed_through: 12345
            chain_has_no_data:
              value:
                error:
                  code: not_indexed_yet
                  message: 'chain ''hyperevm_mainnet'' has no indexed data yet: no block has been indexed'
  parameters:
    TxHashPath:
      name: hash
      in: path
      required: true
      description: 32-byte transaction hash, `0x` prefix optional, either digit case.
      schema:
        $ref: '#/components/schemas/HashInput'
    ChainParam:
      name: chain
      in: path
      required: true
      description: '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`.'
      schema:
        type: string
        pattern: ^[a-z][a-z0-9]*(_[a-z0-9]+)+$
      examples:
        robinhood_mainnet:
          value: robinhood_mainnet
        eth_mainnet:
          value: eth_mainnet
    BlockNumberPath:
      name: number
      in: path
      required: true
      description: Non-negative block height.
      schema:
        type: integer
        format: int64
        minimum: 0
  securitySchemes:
    ApiKeyHeader:
      type: apiKey
      in: header
      name: x-api-key
      description: Your BlockVectra API key.