> ## 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.

# Withdrawal & Consolidation Request Fees

> Returns what it costs to submit a withdrawal or consolidation request to the execution layer, as observed history: one entry per execution layer block that saw at least one request, most recent block first.

Two contracts charge such a fee, and `type_filter` selects between them — the EIP-7002 contract for execution-layer triggered partial withdrawals and full exits, and the EIP-7251 contract for consolidations and compounding switches. Deposits are free, so they do not appear here. Every request that a validator queue endpoint reports as `pending` paid one of these fees.

Both contracts price requests with an EIP-1559 style mechanism: the fee starts at a floor of 1 wei and climbs exponentially while submissions exceed the per-block target, then decays back toward the floor once demand drops. A mass exit or mass consolidation event therefore lifts the fee well above the floor for as long as it lasts. Operators batching many exits or consolidations can use this history to judge whether they are submitting into such a period.

### What these numbers are, and what they are not

This endpoint reports **fees actually paid**, derived from the value sent with each request transaction. It is not a fee oracle and does not read the contracts' current fee.

- `fee_min` is the best available estimate of the protocol-required fee in that block, because no submitter can pay less than the contract demands.
- `fee_max` may exceed it. The contracts do not refund an overpayment, and some tooling deliberately overpays so the transaction still succeeds if the fee rises between signing and inclusion.
- Blocks with no requests are absent from the response. A gap does not mean the fee is unknown: with no submissions the fee decays deterministically toward the 1 wei floor, so a long gap implies the fee has returned to the floor.

<Warning>
This endpoint reports historic state only and must not be used as a fee oracle. Its most recent entry is a fee that was already paid in a past block, not the fee your own submission has to pay. For the fee that applies to the next block, use [/api/v2/ethereum/queues/request-fees/current](/api-reference/ethereum/queues/request-fees/current). To obtain the exact fee for a request you are about to submit, call the contract itself with empty calldata — that is the only authoritative source.
</Warning>

Results can be filtered by a time range and are paginated. Omit `range` to cover the whole available history starting at the most recent block; this endpoint is network-wide, so no validator selection is involved. Supply a `range` to reach a past congestion event instead of paging back to it. The `range` in the response reports the span the returned entries actually cover, not the span you asked for.

You can combine this endpoint with:
- Inspect the individual requests that paid these fees, and the fee each one paid:
   [/api/v2/ethereum/slot/consolidations](/api-reference/ethereum/consolidations) and [/api/v2/ethereum/slot/withdrawals](/api-reference/ethereum/withdrawals)
- Check the fee environment your own validators' requests were submitted into, using the execution layer block from their `stage_history`:
   [/api/v2/ethereum/validators/queues/consolidations](/api-reference/ethereum/validators/queues/consolidations)

Data is available from the Pectra fork (7 May 2025) onwards. On mainnet the first consolidation request was submitted in execution layer block 22431119 and the first withdrawal request in block 22431159, both on 7 May 2025. A range that falls entirely before Pectra returns `200` with an empty `data` array.




## OpenAPI

````yaml /v3/bundled.yaml post /api/v2/ethereum/queues/request-fees
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/queues/request-fees:
    post:
      tags:
        - Network
      summary: Withdrawal & Consolidation Request Fees
      description: >
        Returns what it costs to submit a withdrawal or consolidation request to
        the execution layer, as observed history: one entry per execution layer
        block that saw at least one request, most recent block first.


        Two contracts charge such a fee, and `type_filter` selects between them
        — the EIP-7002 contract for execution-layer triggered partial
        withdrawals and full exits, and the EIP-7251 contract for consolidations
        and compounding switches. Deposits are free, so they do not appear here.
        Every request that a validator queue endpoint reports as `pending` paid
        one of these fees.


        Both contracts price requests with an EIP-1559 style mechanism: the fee
        starts at a floor of 1 wei and climbs exponentially while submissions
        exceed the per-block target, then decays back toward the floor once
        demand drops. A mass exit or mass consolidation event therefore lifts
        the fee well above the floor for as long as it lasts. Operators batching
        many exits or consolidations can use this history to judge whether they
        are submitting into such a period.


        ### What these numbers are, and what they are not


        This endpoint reports **fees actually paid**, derived from the value
        sent with each request transaction. It is not a fee oracle and does not
        read the contracts' current fee.


        - `fee_min` is the best available estimate of the protocol-required fee
        in that block, because no submitter can pay less than the contract
        demands.

        - `fee_max` may exceed it. The contracts do not refund an overpayment,
        and some tooling deliberately overpays so the transaction still succeeds
        if the fee rises between signing and inclusion.

        - Blocks with no requests are absent from the response. A gap does not
        mean the fee is unknown: with no submissions the fee decays
        deterministically toward the 1 wei floor, so a long gap implies the fee
        has returned to the floor.


        <Warning>

        This endpoint reports historic state only and must not be used as a fee
        oracle. Its most recent entry is a fee that was already paid in a past
        block, not the fee your own submission has to pay. For the fee that
        applies to the next block, use
        [/api/v2/ethereum/queues/request-fees/current](/api-reference/ethereum/queues/request-fees/current).
        To obtain the exact fee for a request you are about to submit, call the
        contract itself with empty calldata — that is the only authoritative
        source.

        </Warning>


        Results can be filtered by a time range and are paginated. Omit `range`
        to cover the whole available history starting at the most recent block;
        this endpoint is network-wide, so no validator selection is involved.
        Supply a `range` to reach a past congestion event instead of paging back
        to it. The `range` in the response reports the span the returned entries
        actually cover, not the span you asked for.


        You can combine this endpoint with:

        - Inspect the individual requests that paid these fees, and the fee each
        one paid:
           [/api/v2/ethereum/slot/consolidations](/api-reference/ethereum/consolidations) and [/api/v2/ethereum/slot/withdrawals](/api-reference/ethereum/withdrawals)
        - Check the fee environment your own validators' requests were submitted
        into, using the execution layer block from their `stage_history`:
           [/api/v2/ethereum/validators/queues/consolidations](/api-reference/ethereum/validators/queues/consolidations)

        Data is available from the Pectra fork (7 May 2025) onwards. On mainnet
        the first consolidation request was submitted in execution layer block
        22431119 and the first withdrawal request in block 22431159, both on 7
        May 2025. A range that falls entirely before Pectra returns `200` with
        an empty `data` array.
      operationId: GetQueueRequestFees
      requestBody:
        $ref: '#/components/requestBodies/queueRequestFeesRequest'
      responses:
        '200':
          $ref: '#/components/responses/QueueRequestFee'
        '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:
    queueRequestFeesRequest:
      x-go-name: QueueRequestFeesRequestBody
      description: '`range` and `type_filter` are optional in this request body'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/QueueRequestFeesRequest'
          example:
            chain: mainnet
            type_filter:
              - consolidation
  responses:
    QueueRequestFee:
      description: Successful response.
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/QueueRequestFee.ContainerList'
              - $ref: '#/components/schemas/PagingRangeTemplate'
            description: >-
              Response containing the fees observed per execution layer block
              for EIP-7002 and EIP-7251 requests, most recent block first.
    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:
    QueueRequestFeesRequest:
      type: object
      properties:
        chain:
          $ref: '#/components/schemas/Chain'
        range:
          $ref: '#/components/schemas/timeRangeSelectorNullable'
        type_filter:
          description: >-
            Filter results to one or more request contracts. If omitted, both
            contracts are returned and a block that saw activity on both
            contributes one entry per contract.
          type: array
          nullable: true
          items:
            $ref: '#/components/schemas/ExecutionRequestType'
        cursor:
          $ref: '#/components/schemas/Cursor'
        page_size:
          $ref: '#/components/schemas/PageSize'
      required:
        - chain
    QueueRequestFee.ContainerList:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/QueueRequestFee.Data'
      required:
        - data
    PagingRangeTemplate:
      type: object
      properties:
        paging:
          $ref: '#/components/schemas/Paging'
        range:
          $ref: '#/components/schemas/ResultRange'
      required:
        - range
    Error:
      type: object
      properties:
        error:
          type: string
    Chain:
      type: string
      enum:
        - mainnet
        - hoodi
      default: mainnet
      description: The Ethereum chain to query.
    timeRangeSelectorNullable:
      description: >
        Specify a time range using either Unix timestamps or epoch numbers. If
        left null, the API will query the entire available history of the
        selected validators.
      nullable: true
      default: null
      oneOf:
        - $ref: '#/components/schemas/timeRangeSelectorTime'
        - $ref: '#/components/schemas/timeRangeSelectorEpoch'
        - $ref: '#/components/schemas/timeRangeSelectorSlot'
    ExecutionRequestType:
      type: string
      description: >
        Which EIP-7685 execution-layer request contract the fee applies to.


        - `withdrawal`: the EIP-7002 withdrawal request contract
        (`0x00000961Ef480Eb55e80D19ad83579A64c007002`), used for execution-layer
        triggered partial withdrawals and full exits.

        - `consolidation`: the EIP-7251 consolidation contract
        (`0x0000BBdDc7CE488642fb579F8B00f3a590007251`), used for both
        consolidations and compounding switches.


        Deposits (EIP-6110) are not listed: the deposit contract charges no
        request fee.
      enum:
        - withdrawal
        - consolidation
      example: consolidation
      x-enum-varnames:
        - ExecutionRequestTypeWithdrawal
        - ExecutionRequestTypeConsolidation
    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
    QueueRequestFee.Data:
      type: object
      description: >
        Fees observed on one execution-layer block for a single request
        contract. A block appears only if at least one request was submitted to
        that contract in it.
      properties:
        request_type:
          $ref: '#/components/schemas/ExecutionRequestType'
        block:
          allOf:
            - $ref: '#/components/schemas/Block'
          description: The execution layer block number the requests were submitted in.
        timestamp:
          allOf:
            - $ref: '#/components/schemas/timestamp'
          description: Unix timestamp of the execution layer block.
        request_count:
          type: integer
          description: >-
            Number of requests submitted to this contract in this block. The
            protocol targets 2 requests per block for withdrawals and 1 for
            consolidations; sustained counts above the target are what drive the
            fee up.
        fee_min:
          allOf:
            - $ref: '#/components/schemas/wei'
          description: >
            Lowest fee paid in this block, in wei. This is the closest available
            estimate of the protocol-required fee, because a submitter cannot
            pay less than the contract demands.

            Use this field, not `fee_max`, when reasoning about what a request
            would have cost.
        fee_max:
          allOf:
            - $ref: '#/components/schemas/wei'
          description: >
            Highest fee paid in this block, in wei. A value above `fee_min`
            means at least one submitter overpaid — the contracts do not refund
            the excess, and some tooling deliberately overpays so the
            transaction still succeeds if the fee rises before inclusion.

            Treat a block where the two differ as one containing a deliberate
            overpayment rather than as an ambiguous fee.
        finality:
          $ref: '#/components/schemas/FinalityParams'
      required:
        - request_type
        - block
        - timestamp
        - request_count
        - fee_min
        - fee_max
        - 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
    ResultRange:
      type: object
      description: >
        The time span actually covered by the returned results — from the first
        to the last matching data point — specified in slots, epochs, and Unix
        timestamps.


        This reflects the data that was found, not the range that was queried.
        When no data is found, it falls back to the requested range, or to the
        full available history if no range was given.


        For arbitrary (custom) time-range queries the queried range is expanded
        outward to whole UTC days, so the covered range may be wider than
        requested. As stated above, the reported range still reflects the data
        that was actually found — a touched UTC day with no data for the
        selected validators will not extend it.
      properties:
        slot:
          $ref: '#/components/schemas/SlotRange'
        epoch:
          $ref: '#/components/schemas/EpochRange'
        timestamp:
          $ref: '#/components/schemas/TimeRange'
      required:
        - slot
        - epoch
        - timestamp
    timeRangeSelectorTime:
      type: object
      title: Unix Timestamp
      description: Range provided via Unix timestamp (inclusive)
      properties:
        timestamp:
          $ref: '#/components/schemas/timeRangeStartEnd'
      required:
        - timestamp
    timeRangeSelectorEpoch:
      type: object
      title: Epoch
      description: Range provided via epoch number
      properties:
        epoch:
          $ref: '#/components/schemas/epochRangeStartEnd'
      required:
        - epoch
    timeRangeSelectorSlot:
      type: object
      title: Slot
      description: Range provided via slot number
      properties:
        slot:
          $ref: '#/components/schemas/slotRangeStartEnd'
      required:
        - slot
    Block:
      type: integer
      minimum: 0
      description: Block by number.
    timestamp:
      type: integer
      minimum: 0
    wei:
      type: string
      description: Amount in wei (1 ETH = 10^18 wei)
      pattern: ^(0|-?[1-9][0-9]*)$
    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
    SlotRange:
      type: object
      properties:
        start:
          $ref: '#/components/schemas/Slot'
        end:
          $ref: '#/components/schemas/Slot'
      required:
        - start
        - end
    EpochRange:
      type: object
      properties:
        start:
          $ref: '#/components/schemas/Epoch'
        end:
          $ref: '#/components/schemas/Epoch'
      required:
        - start
        - end
    TimeRange:
      type: object
      properties:
        start:
          $ref: '#/components/schemas/timestamp'
        end:
          $ref: '#/components/schemas/timestamp'
      required:
        - start
        - end
    timeRangeStartEnd:
      type: object
      description: Unix timestamp range (inclusive)
      properties:
        start:
          $ref: '#/components/schemas/timestamp'
          example: 0
          description: Start Unix Timestamp
        end:
          $ref: '#/components/schemas/timestamp'
          example: 2147483647
          description: End Unix Timestamp
      required:
        - start
        - end
    epochRangeStartEnd:
      type: object
      description: Epoch range (inclusive)
      properties:
        start:
          $ref: '#/components/schemas/EpochSelector'
          description: Start Epoch
        end:
          $ref: '#/components/schemas/EpochSelector'
          description: End Epoch
      required:
        - start
        - end
    slotRangeStartEnd:
      type: object
      description: Slot range (inclusive)
      properties:
        start:
          $ref: '#/components/schemas/SlotSelector'
          description: Start Slot
        end:
          $ref: '#/components/schemas/SlotSelector'
          description: End Slot
    Slot:
      type: integer
      minimum: 0
      description: Slot by number.
    Epoch:
      type: integer
      minimum: 0
    EpochSelector:
      description: |
        Specify an epoch using one of the following methods.
        - epoch number
        - View: "latest", "finalized" 
      oneOf:
        - $ref: '#/components/schemas/EpochByNumber'
        - $ref: '#/components/schemas/EpochByChainView'
    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
    EpochByNumber:
      title: Number
      type: object
      properties:
        number:
          $ref: '#/components/schemas/Epoch'
      required:
        - number
    EpochByChainView:
      title: View
      type: object
      properties:
        view:
          allOf:
            - $ref: '#/components/schemas/ChainView'
          description: >
            - "latest": Refers to the most recent epoch, which may not yet be
            finalized.

            - "finalized": Refers to the latest epoch that has been finalized
            and is not subject to change.
      required:
        - view
    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
    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.
    ConsensusLayerBlockRoot:
      type: string
      pattern: ^0x[a-fA-F0-9]{64}$
      description: A 32-byte block root represented as a hex string with 0x prefix.
  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.

````