> ## Documentation Index
> Fetch the complete documentation index at: https://docs.beaconcha.in/llms.txt
> Use this file to discover all available pages before exploring further.

# Consolidations

> Returns the EIP-7251 requests carried by the block at the specified slot: validator consolidations and switches to compounding withdrawal credentials.

Both kinds arrive through the same execution-layer contract with the same fields, including a source and a target public key. The consensus layer distinguishes them by whether those keys are equal:

- `consolidation` — the keys differ. The source validator exits and its balance moves to the target, which must already have compounding (`0x02`) withdrawal credentials.
- `compounding_switch` — the keys are identical. Nothing exits and no balance moves; the request only changes that validator's withdrawal credentials from `0x01` to `0x02`.

The `type` field reports which kind an entry is, so you do not have to compare public keys yourself. Use `type_filter` to narrow the response to one kind.

Results are anchored to the slot whose block body carried the request. For a consolidation the resulting balance transfer settles later, when the pending consolidation queue drains to it; that settlement slot is reported in `stage_history.consensus_layer_processed` and is not used for filtering. A compounding switch is applied at inclusion, so both slots are the same.

Rejected requests are included. A request rejected at inclusion reached a block but changed no state, so `stage_history.consensus_layer_processed` is null and, for consolidations, a `reject_reason` is set.

Because of that delay a past slot's response is **not** immutable straight away: a `queued` consolidation keeps its inclusion slot but gains `amount` and `stage_history.consensus_layer_processed`, and flips to `completed`, long after the slot itself finalized. Cache a slot's response indefinitely only once no entry in it is `queued`; entries that are `completed` or `rejected` are terminal.

Data is available from the Pectra fork (epoch 364032, first slot 11649024, 7 May 2025) onwards. On mainnet the earliest request observed is in slot 11649029. Slots before Pectra, and slots that carried no such request, return `200` with an empty `data` array.

The validator filter is optional; if omitted, results include every request in the slot. A validator matches when it is either the source or the target of the request.

You can combine this endpoint with:
- Track consolidations for your own validators across all slots:
   [/api/v2/ethereum/validators/queues/consolidations](/api-reference/ethereum/validators/queues/consolidations)
- Track compounding switches for your own validators:
   [/api/v2/ethereum/validators/queues/compounding-switches](/api-reference/ethereum/validators/queues/compounding-switches)
- Compare the fee in `request.fee` against every other request submitted in the same execution layer block:
   [/api/v2/ethereum/queues/request-fees](/api-reference/ethereum/queues/request-fees)




## OpenAPI

````yaml /v3/bundled.yaml post /api/v2/ethereum/slot/consolidations
openapi: 3.0.4
info:
  title: External Service API
  version: 1.0.3
servers:
  - url: https://beaconcha.in
    description: Production API
security:
  - ApiKeyAuth: []
paths:
  /api/v2/ethereum/slot/consolidations:
    post:
      tags:
        - Slot
      summary: Consolidations
      description: >
        Returns the EIP-7251 requests carried by the block at the specified
        slot: validator consolidations and switches to compounding withdrawal
        credentials.


        Both kinds arrive through the same execution-layer contract with the
        same fields, including a source and a target public key. The consensus
        layer distinguishes them by whether those keys are equal:


        - `consolidation` — the keys differ. The source validator exits and its
        balance moves to the target, which must already have compounding
        (`0x02`) withdrawal credentials.

        - `compounding_switch` — the keys are identical. Nothing exits and no
        balance moves; the request only changes that validator's withdrawal
        credentials from `0x01` to `0x02`.


        The `type` field reports which kind an entry is, so you do not have to
        compare public keys yourself. Use `type_filter` to narrow the response
        to one kind.


        Results are anchored to the slot whose block body carried the request.
        For a consolidation the resulting balance transfer settles later, when
        the pending consolidation queue drains to it; that settlement slot is
        reported in `stage_history.consensus_layer_processed` and is not used
        for filtering. A compounding switch is applied at inclusion, so both
        slots are the same.


        Rejected requests are included. A request rejected at inclusion reached
        a block but changed no state, so
        `stage_history.consensus_layer_processed` is null and, for
        consolidations, a `reject_reason` is set.


        Because of that delay a past slot's response is **not** immutable
        straight away: a `queued` consolidation keeps its inclusion slot but
        gains `amount` and `stage_history.consensus_layer_processed`, and flips
        to `completed`, long after the slot itself finalized. Cache a slot's
        response indefinitely only once no entry in it is `queued`; entries that
        are `completed` or `rejected` are terminal.


        Data is available from the Pectra fork (epoch 364032, first slot
        11649024, 7 May 2025) onwards. On mainnet the earliest request observed
        is in slot 11649029. Slots before Pectra, and slots that carried no such
        request, return `200` with an empty `data` array.


        The validator filter is optional; if omitted, results include every
        request in the slot. A validator matches when it is either the source or
        the target of the request.


        You can combine this endpoint with:

        - Track consolidations for your own validators across all slots:
           [/api/v2/ethereum/validators/queues/consolidations](/api-reference/ethereum/validators/queues/consolidations)
        - Track compounding switches for your own validators:
           [/api/v2/ethereum/validators/queues/compounding-switches](/api-reference/ethereum/validators/queues/compounding-switches)
        - Compare the fee in `request.fee` against every other request submitted
        in the same execution layer block:
           [/api/v2/ethereum/queues/request-fees](/api-reference/ethereum/queues/request-fees)
      operationId: GetSlotConsolidations
      requestBody:
        $ref: '#/components/requestBodies/slotConsolidationsRequest'
      responses:
        '200':
          $ref: '#/components/responses/SlotConsolidation'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '405':
          $ref: '#/components/responses/MethodNotAllowed'
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
        '500':
          $ref: '#/components/responses/InternalServerError'
        default:
          $ref: '#/components/responses/DefaultError'
components:
  requestBodies:
    slotConsolidationsRequest:
      description: '`validator` and `type_filter` are optional in this request body'
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/NamedSlotSelector'
              - type: object
                properties:
                  chain:
                    $ref: '#/components/schemas/Chain'
                  cursor:
                    $ref: '#/components/schemas/Cursor'
                  page_size:
                    $ref: '#/components/schemas/PageSize'
                  validator:
                    $ref: '#/components/schemas/nullableValidatorSelector'
                  type_filter:
                    description: >-
                      Filter results by request type. Pass one or more types as
                      an array. If omitted, both consolidations and compounding
                      switches are returned.
                    type: array
                    nullable: true
                    items:
                      $ref: '#/components/schemas/ValidatorConsolidations.Type'
            required:
              - slot
              - chain
          example:
            slot:
              view: latest
            chain: mainnet
            type_filter:
              - consolidation
  responses:
    SlotConsolidation:
      description: Successful response.
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/SlotConsolidation.ContainerList'
              - $ref: '#/components/schemas/PagingTemplate'
            description: >-
              Response containing the EIP-7251 consolidation and compounding
              switch requests carried by the requested slot.
    BadRequest:
      description: Bad Request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Bad request. Please check your input and try again.
    Unauthorized:
      description: Unauthorized
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Unauthorized. Please provide a valid API key.
    Forbidden:
      description: Forbidden
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: >-
              endpoint not allowed for your subscription tier. upgrade your
              subscription at https://beaconcha.in/pricing.
    NotFound:
      description: Not Found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: The requested resource was not found.
    MethodNotAllowed:
      description: Method Not Allowed
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: 'method not allowed: GET. all public API endpoints use POST.'
    RateLimitExceeded:
      description: Rate Limit Exceeded
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Rate limit exceeded. Please try again later.
    InternalServerError:
      description: Internal Server Error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: internal server error. please try again later.
    DefaultError:
      description: An unexpected error response.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: An unexpected error occurred.
  schemas:
    NamedSlotSelector:
      type: object
      properties:
        slot:
          $ref: '#/components/schemas/SlotSelector'
      required:
        - slot
    Chain:
      type: string
      enum:
        - mainnet
        - hoodi
      default: mainnet
      description: The Ethereum chain to query.
    Cursor:
      type: string
      description: >-
        Cursor value for pagination. See our [pagination guide](/api/pagination)
        for more details.
      default: ''
    PageSize:
      type: integer
      description: The number of items to return per page.
      minimum: 1
      maximum: 10
      default: 10
    nullableValidatorSelector:
      description: >-
        `validator` is optional in this request body. If not provided, results
        will be unfiltered.
      nullable: true
      default: null
      allOf:
        - $ref: '#/components/schemas/validatorsSelector'
    ValidatorConsolidations.Type:
      type: string
      description: >
        The kind of EIP-7251 request. Both kinds are submitted to the same
        execution-layer contract (`0x0000BBdDc7CE488642fb579F8B00f3a590007251`)
        using the same request structure; the consensus layer tells them apart
        by whether the source and target public keys are equal.


        - `consolidation`: source and target are different validators. The
        source validator exits and its balance is transferred to the target,
        which must already have compounding (`0x02`) withdrawal credentials.

        - `compounding_switch`: source and target are the same validator.
        Nothing exits and no balance moves between validators; the validator's
        withdrawal credentials change from `0x01` to `0x02`, raising its
        effective balance ceiling from 32 ETH to 2048 ETH.
      enum:
        - consolidation
        - compounding_switch
      example: consolidation
      x-enum-varnames:
        - ValidatorConsolidationsTypeConsolidation
        - ValidatorConsolidationsTypeCompoundingSwitch
    SlotConsolidation.ContainerList:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/SlotConsolidation.Data'
      required:
        - data
    PagingTemplate:
      type: object
      properties:
        paging:
          $ref: '#/components/schemas/Paging'
    Error:
      type: object
      properties:
        error:
          type: string
    SlotSelector:
      description: |
        Specify a slot using one of the following methods.
        - Slot number
        - Consensus layer block root
        - View: "latest", "finalized" 
      oneOf:
        - $ref: '#/components/schemas/SlotByNumber'
        - $ref: '#/components/schemas/SlotByConsensusLayerBlockRoot'
        - $ref: '#/components/schemas/SlotByChainView'
      default: latest
    validatorsSelector:
      description: >-
        Free selectors available to all users:

        - validator_identifiers: One or more validator indices or public keys to
        filter by.

        - dashboard_id: Your beaconcha.in dashboard ID (requires a free
        account).
          
        **Premium selectors** for Scale & Enterprise plans
        (https://beaconcha.in/pricing):

        - withdrawal: The validator's withdrawal credential or the Ethereum
        wallet address used for withdrawals.

        - deposit_address: The Ethereum wallet address used for the validator's
        deposit.

        - entity: The name of the assigned entity (e.g., "Lido", "Coinbase").
        Optionally include `sub_entity` for more specific filtering. Matching is
        case-sensitive.


        Note: The set of validators matched by `deposit_address` and
        `withdrawal` selectors is updated once per epoch (~6.4 minutes). Newly
        deposited validators may take up to one epoch to appear in query
        results.


        Note: The set of validators matched by `entity` selector is updated once
        per day.
          
      oneOf:
        - $ref: '#/components/schemas/ValidatorsByIdentifiers'
        - $ref: '#/components/schemas/ValidatorsByDashboard'
        - $ref: '#/components/schemas/ValidatorsByDeposit'
        - $ref: '#/components/schemas/ValidatorsByWithdrawal'
        - $ref: '#/components/schemas/ValidatorsByEntity'
    SlotConsolidation.Data:
      type: object
      description: >
        A single EIP-7251 request carried by the block at the requested slot.


        Rows are anchored to the slot in which the request appeared in a block
        body, not to the slot in which the resulting balance transfer settled.
        For a `consolidation` those are different slots, and
        `stage_history.consensus_layer_processed` carries the settlement slot. A
        `compounding_switch` is applied at inclusion, so both are the same slot.
      properties:
        source_validator:
          allOf:
            - $ref: '#/components/schemas/validator'
          description: >-
            The validator named as the source of the request. For a
            `compounding_switch` this is the validator switching credentials,
            and it is identical to `target_validator`.
        target_validator:
          allOf:
            - $ref: '#/components/schemas/validator'
          description: >-
            The validator named as the target of the request. For a
            `compounding_switch` this is identical to `source_validator`,
            mirroring the on-chain request structure where both public keys are
            equal.
        type:
          allOf:
            - $ref: '#/components/schemas/ValidatorConsolidations.Type'
          description: >
            Whether the request is a cross-validator consolidation or a switch
            to compounding credentials. Every request in this response is one or
            the other, so this field is always set.

            Both values are accepted by `type_filter`.
          nullable: true
        status:
          allOf:
            - $ref: '#/components/schemas/ConsensusLayerEventStatus'
          description: >
            Outcome of the request at the consensus layer.

            - `queued`: accepted and appended to the pending consolidation
            queue. The source validator is exiting; the balance transfer has not
            settled yet. Only occurs for `consolidation`.

            - `completed`: for a `consolidation`, the balance transfer settled
            and `amount` is set; for a `compounding_switch`, the credentials
            were changed at inclusion.

            - `rejected`: the consensus layer discarded the request at
            inclusion. `reject_reason` is set for a `consolidation`.


            This field is always set: every request in this response has reached
            the consensus layer. A request that is still only on the execution
            layer has no inclusion slot, so it does not appear here at all — use
            [/api/v2/ethereum/validators/queues/consolidations](/api-reference/ethereum/validators/queues/consolidations)
            for those. That endpoint also has a status filter, which this one
            does not; otherwise, filter client-side.
          nullable: true
        reject_reason:
          allOf:
            - $ref: '#/components/schemas/ValidatorConsolidations.RejectReason'
          description: >
            Set when `status` is `rejected` and `type` is `consolidation`. Null
            when the request succeeded, when the reason was not recognised by
            the server (e.g. client-specific errors or future protocol
            additions), or when `type` is `compounding_switch` — the consensus
            layer reports `source_equals_target` for every switch, which says
            nothing about why that switch failed, so the field is left null.
          nullable: true
        amount:
          allOf:
            - $ref: '#/components/schemas/wei'
          description: >
            Balance transferred from the source validator to the target, in wei.
            Set only when `type` is `consolidation` and `status` is `completed`;
            null otherwise.

            This is `min(actual_balance, effective_balance)` of the source at
            settlement, so it can be less than the source's total balance — any
            excess stays on the source and is swept to its own withdrawal
            address as a regular withdrawal.
          nullable: true
        stage_history:
          allOf:
            - $ref: '#/components/schemas/clQueues'
          description: >
            Slot and block references for each stage this request passed
            through.


            - `execution_layer_queued`: the execution layer block containing the
            transaction that called the request contract.

            - `execution_layer_processed`: the execution layer block in which
            the request was read out of the contract and attached to the block.
            At most two consolidation requests are read out per block, so a
            request submitted while the contract holds a backlog waits for one
            or more blocks before it is picked up, and this block can be far
            later than `execution_layer_queued`.

            - `consensus_layer_queued`: the inclusion slot, the slot this
            endpoint is keyed on. It pairs with `execution_layer_processed`,
            being the same block viewed from the consensus layer.

            - `consensus_layer_processed`: the slot the request took effect in.
            For a `consolidation` that is the settlement slot, reached when the
            pending consolidation queue drains to it. For a `compounding_switch`
            it is the inclusion slot again, because the credential change
            applies immediately.


            A `rejected` request carries both execution layer stages and
            `consensus_layer_queued`, but `consensus_layer_processed` is null:
            the request reached a block and was then discarded without changing
            any state.
        request:
          $ref: '#/components/schemas/ConsolidationRequest'
        finality:
          $ref: '#/components/schemas/FinalityParams'
      required:
        - source_validator
        - target_validator
        - finality
    Paging:
      type: object
      properties:
        next_cursor:
          description: >-
            Cursor to the next page of results. See our [pagination
            guide](/api/pagination) for more details. If empty, there are no
            more pages to fetch.
          type: string
    SlotByNumber:
      title: Number
      type: object
      properties:
        number:
          $ref: '#/components/schemas/Slot'
      required:
        - number
    SlotByConsensusLayerBlockRoot:
      title: Root
      type: object
      properties:
        root:
          $ref: '#/components/schemas/ConsensusLayerBlockRoot'
      required:
        - root
    SlotByChainView:
      title: View
      type: object
      properties:
        view:
          allOf:
            - $ref: '#/components/schemas/ChainView'
          description: >
            - "latest": Refers to the most recent slot, which may be subject to
            reorganization.

            - "finalized": Refers to the latest slot that has been finalized and
            is not subject to change.
      required:
        - view
    ValidatorsByIdentifiers:
      type: object
      title: Indices/Pubkeys
      properties:
        validator_identifiers:
          $ref: '#/components/schemas/validatorIndexPublicKeys'
      required:
        - validator_identifiers
    ValidatorsByDashboard:
      type: object
      title: Dashboard
      properties:
        dashboard_id:
          $ref: '#/components/schemas/dashboardID'
        group_id:
          $ref: '#/components/schemas/dashboardGroupID'
      required:
        - dashboard_id
    ValidatorsByDeposit:
      type: object
      title: 💎 Deposit
      properties:
        deposit_address:
          $ref: '#/components/schemas/ExecutionLayerAddress'
      required:
        - deposit_address
    ValidatorsByWithdrawal:
      type: object
      title: 💎 Withdrawal
      properties:
        withdrawal:
          $ref: '#/components/schemas/AddressOrCredential'
      required:
        - withdrawal
    ValidatorsByEntity:
      type: object
      title: 💎 Entity
      description: >
        Select validators by their assigned entity (e.g., staking provider) and
        optionally a sub-entity.

        Entity and sub-entity names are matched exactly and are case-sensitive.
      properties:
        entity:
          type: string
          description: >
            The name of the entity to filter validators by (e.g., "Lido",
            "Coinbase"). Matching is case-sensitive; use the exact name as
            returned by the entities overview endpoint.
        sub_entity:
          type: string
          description: >
            Optional sub-entity name to further filter validators within the
            entity. Matching is case-sensitive; use the exact name as returned
            by the sub-entities overview endpoint.
      required:
        - entity
    validator:
      type: object
      properties:
        index:
          allOf:
            - $ref: '#/components/schemas/validatorIndex'
          nullable: true
        public_key:
          $ref: '#/components/schemas/validatorPublicKey'
    ConsensusLayerEventStatus:
      type: string
      enum:
        - queued
        - completed
        - rejected
      example: completed
      nullable: true
    ValidatorConsolidations.RejectReason:
      type: string
      description: Reason a consolidation request was rejected at the consensus layer.
      enum:
        - source_equals_target
        - full_queue
        - insufficient_consolidation_churn
        - source_unknown_pubkey
        - target_unknown_pubkey
        - source_no_execution_withdrawal_credentials
        - source_address_mismatch
        - target_not_compounding
        - source_inactive
        - target_inactive
        - source_exiting
        - target_exiting
        - source_too_young
        - source_pending_withdrawals
        - source_slashed
      example: source_inactive
    wei:
      type: string
      description: Amount in wei (1 ETH = 10^18 wei)
      pattern: ^(0|-?[1-9][0-9]*)$
    clQueues:
      type: object
      description: >
        Displays the complete queue stage history for an item.

        For example, a deposit that has been processed on the consensus layer
        will include the slot numbers for when it was queued on the execution
        layer and consensus layer, providing full traceability of its
        progression through each stage.
      properties:
        execution_layer_queued:
          allOf:
            - $ref: '#/components/schemas/ExecutionLayerReference'
          nullable: true
        execution_layer_processed:
          allOf:
            - $ref: '#/components/schemas/ExecutionLayerReference'
          nullable: true
        consensus_layer_queued:
          $ref: '#/components/schemas/ConsensusLayerReference'
          nullable: true
          x-sortable: true
        consensus_layer_processed:
          $ref: '#/components/schemas/ConsensusLayerReference'
          nullable: true
          x-sortable: true
    ConsolidationRequest:
      type: object
      nullable: true
      description: >
        The execution-layer transaction that submitted this request.


        The chain records no direct link between an execution-layer request and
        the consensus-layer row that processed it, so the two are paired by
        order: for a given pair of source and target public keys, the *n*-th
        request seen on the execution layer is matched to the *n*-th outcome
        seen on the consensus layer. Where one pair submitted several requests,
        the transaction attributed to an individual outcome can therefore be the
        wrong one of that pair's requests. Null when no execution-layer request
        could be paired at all.
      properties:
        tx_hash:
          $ref: '#/components/schemas/transactionHash'
        tx_from:
          $ref: '#/components/schemas/ExecutionLayerAddressDetails'
          description: >
            The address that originally initiated the transaction (`tx.origin`).
            This is always the externally owned account (EOA) that signed the
            transaction — typically the user's wallet.

            When the user sends the transaction directly, `tx_from` and
            `tx_msg_sender` are the same. When the user interacts through a
            contract (e.g. a multisig, smart wallet, or staking service),
            `tx_from` is the user's wallet while `tx_msg_sender` is the
            contract.
        tx_msg_sender:
          $ref: '#/components/schemas/ExecutionLayerAddressDetails'
          description: >
            The address that directly called the consolidation contract
            (`msg.sender`). This is the immediate caller — either the user's
            wallet (EOA) or an intermediary contract.

            When the user sends the transaction directly, this equals `tx_from`.
            When the user interacts through a contract (e.g. a multisig, smart
            wallet, or staking service), this is the contract address, not the
            user's wallet.
        fee:
          allOf:
            - $ref: '#/components/schemas/wei'
          description: >
            The amount paid to the EIP-7251 consolidation contract to submit
            this request, in wei. This is the value actually sent with the call,
            which is an upper bound on the protocol-required fee — the contract
            does not refund an overpayment, and some tooling deliberately
            overpays to avoid a revert when the fee rises between signing and
            inclusion.

            The required fee is dynamic: it starts at a floor of 1 wei and rises
            exponentially while submissions exceed the per-block target of one
            consolidation request. See
            [/api/v2/ethereum/queues/request-fees](/api-reference/ethereum/queues/request-fees)
            for the observed fee history.
      required:
        - tx_hash
        - tx_from
        - tx_msg_sender
        - fee
    FinalityParams:
      type: string
      description: |
        Indicates the finality status of the data provided. 
          - Finalized data cannot be changed without slashing at least one-third of all validators, providing strong economic guarantees.
          - Data marked as not_finalized does not have this guarantee and may still change.
      enum:
        - not_finalized
        - finalized
      example: finalized
    Slot:
      type: integer
      minimum: 0
      description: Slot by number.
    ConsensusLayerBlockRoot:
      type: string
      pattern: ^0x[a-fA-F0-9]{64}$
      description: A 32-byte block root represented as a hex string with 0x prefix.
    ChainView:
      type: string
      enum:
        - latest
        - finalized
      description: >
        - "latest": Refers to the most recent block, which may be subject to
        reorganization.

        - "finalized": Refers to the latest block that has been finalized and is
        not subject to change.
    validatorIndexPublicKeys:
      description: >
        An array containing either validator indices or public keys. Index and
        public key can be mixed in the same array.


        Subscribed users (Hobbyist, Business, and Scale tiers) can include up to
        100 entries; free trial users and legacy subscription users (Sapphire,
        Emerald, Diamond) are limited to 20.
      type: array
      items:
        $ref: '#/components/schemas/validatorIndexPublicKey'
      minItems: 1
      maxItems: 100
    dashboardID:
      description: >
        beaconcha.in dashboard ID. You can find your dashboard ID in the URL of
        your dashboard page on beaconcha.in (e.g.,
        https://beaconcha.in/dashboard/12345).
      type: integer
      x-go-type: '*int'
      minimum: 0
    dashboardGroupID:
      description: >-
        Optional beaconcha.in dashboard group ID. If no group ID is provided,
        all validators in the dashboard are considered.
      type: integer
      minimum: 0
      nullable: true
    ExecutionLayerAddress:
      type: string
      pattern: ^0x[a-fA-F0-9]{40}$
      description: A standard Ethereum address (20-byte hex string with 0x prefix).
    AddressOrCredential:
      type: string
      pattern: ^(0x)?[0-9a-fA-F]{40}$|^(0x)?0[012][0-9a-fA-F]{62}$
      description: >
        Either an execution layer address (20-byte hex string with 0x prefix) or
        a full 32-byte withdrawal credential.
    validatorIndex:
      description: Validator Index
      type: integer
      minimum: 0
    validatorPublicKey:
      type: string
      description: Public key of a validator
      pattern: ^0x[a-fA-F0-9]{96}$
    ExecutionLayerReference:
      type: object
      description: |
        Reference to an execution layer block if one exists for the given slot.
        This will be null for missed slots.
      properties:
        block:
          $ref: '#/components/schemas/Block'
        hash:
          $ref: '#/components/schemas/ExecutionLayerBlockHash'
      required:
        - block
        - hash
    ConsensusLayerReference:
      type: object
      description: |
        Reference to a consensus layer block if one exists for the given slot.
        This will be null for the PoW era.
      nullable: true
      properties:
        slot:
          $ref: '#/components/schemas/Slot'
        block_root:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/ConsensusLayerBlockRoot'
        epoch:
          $ref: '#/components/schemas/Epoch'
      required:
        - slot
        - epoch
    transactionHash:
      type: string
      pattern: ^0x[a-fA-F0-9]{64}$
    ExecutionLayerAddressDetails:
      type: object
      properties:
        address:
          $ref: '#/components/schemas/ExecutionLayerAddress'
        is_contract:
          type: boolean
      required:
        - address
        - is_contract
    validatorIndexPublicKey:
      oneOf:
        - $ref: '#/components/schemas/validatorIndex'
        - $ref: '#/components/schemas/validatorPublicKey'
    Block:
      type: integer
      minimum: 0
      description: Block by number.
    ExecutionLayerBlockHash:
      type: string
      pattern: ^0x[a-fA-F0-9]{64}$
      description: A 32-byte block hash represented as a hex string with 0x prefix.
    Epoch:
      type: integer
      minimum: 0
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      description: >-
        Authorization header with value: Bearer YOUR_TOKEN. Refer to the [API
        Keys](/api/overview#api-keys) section to create your API key.

````