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

# Staking Queues History

> Returns a history of the staking queue sizes — how much ETH is waiting to enter and leave staking over time. Each entry is a snapshot of the staking queues at one epoch.

History begins at the Pectra fork, which is where the queues themselves begin: the pending deposit, consolidation and partial-withdrawal queues are Pectra state fields, so there is nothing to report before it. How far back a given request reaches also depends on `granularity` — see that field for the two floors and how out-of-range requests are handled.

An epoch with no usable snapshot is omitted from the series rather than returned as an empty entry, so entries are not guaranteed to be evenly spaced. Read `epoch` and `timestamp` on each entry rather than inferring them from position.

Each entry covers the four queues the snapshot records. The `withdrawal_sweep` and `compounding_switch_queue` entries of the live endpoint have no historical counterpart and are not returned here.

For the current point-in-time queue state, see [/api/v2/ethereum/queues](/api-reference/ethereum/queues).




## OpenAPI

````yaml /v3/bundled.yaml post /api/v2/ethereum/queues/history
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/history:
    post:
      tags:
        - Network
      summary: Staking Queues History
      description: >
        Returns a history of the staking queue sizes — how much ETH is waiting
        to enter and leave staking over time. Each entry is a snapshot of the
        staking queues at one epoch.


        History begins at the Pectra fork, which is where the queues themselves
        begin: the pending deposit, consolidation and partial-withdrawal queues
        are Pectra state fields, so there is nothing to report before it. How
        far back a given request reaches also depends on `granularity` — see
        that field for the two floors and how out-of-range requests are handled.


        An epoch with no usable snapshot is omitted from the series rather than
        returned as an empty entry, so entries are not guaranteed to be evenly
        spaced. Read `epoch` and `timestamp` on each entry rather than inferring
        them from position.


        Each entry covers the four queues the snapshot records. The
        `withdrawal_sweep` and `compounding_switch_queue` entries of the live
        endpoint have no historical counterpart and are not returned here.


        For the current point-in-time queue state, see
        [/api/v2/ethereum/queues](/api-reference/ethereum/queues).
      operationId: GetStakingQueuesHistory
      requestBody:
        $ref: '#/components/requestBodies/queueStatsHistory'
      responses:
        '200':
          $ref: '#/components/responses/QueueStatsHistory'
        '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:
    queueStatsHistory:
      x-go-name: QueueStatsHistoryRequestBody
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/QueueStatsHistoryRequest'
  responses:
    QueueStatsHistory:
      description: Successful response.
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/QueueStatsHistory.ContainerList'
              - $ref: '#/components/schemas/PagingRangeTemplate'
            description: >-
              Response containing the staking queues history with the resolved
              range.
    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:
    QueueStatsHistoryRequest:
      type: object
      properties:
        chain:
          $ref: '#/components/schemas/Chain'
        range:
          $ref: '#/components/schemas/timeRangeSelectorNullable'
          description: >
            Time window to query, given as Unix timestamps, epoch numbers, or
            slot numbers (inclusive). If omitted or null, the last 30 days are
            returned. The newest epochs may not yet be finalized — each snapshot
            carries a `finality` field. Results are paginated via
            `cursor`/`page_size`.
          example:
            timestamp:
              start: 1746057600
              end: 1748649599
        granularity:
          $ref: '#/components/schemas/QueueStatsHistoryGranularity'
        cursor:
          $ref: '#/components/schemas/Cursor'
        page_size:
          $ref: '#/components/schemas/PageSize'
    QueueStatsHistory.ContainerList:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/QueueStatsHistory.Data'
      description: >-
        Response containing the staking queues history, ordered by epoch
        descending (newest first).
      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'
    QueueStatsHistoryGranularity:
      type: string
      description: >
        Resolution of the returned time series.


        - `daily` — one entry per UTC day, taken at the first epoch that started
        on that day.

        - `epoch` — one entry per epoch (225 epochs per day on mainnet).


        The two resolutions reach back different distances, because the queue
        snapshots were recomputed from archived beacon state at daily resolution
        only.


        `daily` covers the whole recorded range, which begins at the Pectra fork
        — the pending deposit, consolidation and partial-withdrawal queues are
        Pectra state fields, so no queue history exists before it.


        `epoch` is served only from the point where every consecutive epoch was
        recorded correctly, which is a shorter window ending at the chain head.


        A range reaching below either floor is served from that floor, and a
        range entirely below it returns an empty series rather than an error.
        Read `range` on the response to see the span actually served.
      enum:
        - daily
        - epoch
      default: daily
      example: daily
    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
    QueueStatsHistory.Data:
      type: object
      description: >
        Staking queue sizes captured at one snapshot epoch. Balances reflect the
        chain state as observed at the time the snapshot was taken (head state;
        values are not retroactively adjusted).
      properties:
        epoch:
          $ref: '#/components/schemas/Epoch'
          description: The epoch the snapshot was taken at.
        timestamp:
          $ref: '#/components/schemas/timestamp'
          description: Unix timestamp of the start of `epoch`.
        finality:
          $ref: '#/components/schemas/FinalityParams'
          description: >
            Whether this snapshot's epoch is finalized. The newest epochs are
            `not_finalized` and may still change on a reorg; older epochs are
            `finalized` and immutable.
        deposit_queue:
          $ref: '#/components/schemas/QueueStatsHistory.QueueSize'
          description: >-
            ETH waiting to enter staking — all pending deposits, including
            top-ups.
        exit_queue:
          $ref: '#/components/schemas/QueueStatsHistory.QueueSize'
          description: >
            Full validator exits waiting to leave staking — validators whose
            exit has been requested but whose exit epoch has not yet been
            reached. `estimated_processed_at` covers the exit churn (when the
            balance leaves staking at the exit epoch), not the later withdrawal
            payout (the withdrawability delay and sweep are excluded).
        manual_withdrawal_queue:
          $ref: '#/components/schemas/QueueStatsHistory.ManualQueueSize'
          description: >
            Pending manual (EIP-7002) partial withdrawals — excess balance
            withdrawn from validators that stay active. Disjoint from
            `exit_queue` (full exits route there instead).
        consolidation_queue:
          $ref: '#/components/schemas/QueueStatsHistory.QueueSize'
          description: >
            ETH queued to move between validators via consolidations. This is an
            internal movement — the ETH stays staked. `balance` is the total
            balance of the source validators at the snapshot epoch.
      required:
        - epoch
        - timestamp
        - finality
        - deposit_queue
        - exit_queue
        - manual_withdrawal_queue
        - consolidation_queue
    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
    Epoch:
      type: integer
      minimum: 0
    timestamp:
      type: integer
      minimum: 0
    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
    QueueStatsHistory.QueueSize:
      type: object
      description: >-
        Size of a churn-limited staking queue at the snapshot epoch, with its
        churn rate and processing estimate.
      properties:
        count:
          $ref: '#/components/schemas/count'
          description: >-
            Number of entries in the queue (validators, deposits, or
            consolidation requests, depending on the queue).
        balance:
          $ref: '#/components/schemas/wei'
          description: Total balance in the queue.
        churn:
          $ref: '#/components/schemas/ChurnRate'
          description: >-
            Rate at which the protocol processes this queue, as recorded at the
            snapshot epoch.
        estimated_processed_at:
          $ref: '#/components/schemas/EstimatedWithEpoch'
          description: >
            Estimated point at which the queue is fully processed (the last item
            cleared), projected from the queue's balance and churn rate at the
            snapshot epoch. It assumes the churn rate holds and no new entries
            arrive, so it is a forward projection — not a realized time. It can
            also be derived client-side from `balance` and `churn`.
      required:
        - count
        - balance
        - churn
        - estimated_processed_at
    QueueStatsHistory.ManualQueueSize:
      type: object
      description: >
        Size of the manual (partial) withdrawal queue at the snapshot epoch. It
        carries no churn rate: partial withdrawals share the exit churn with
        voluntary exits rather than having one of their own.
      properties:
        count:
          $ref: '#/components/schemas/count'
          description: Number of pending partial (EIP-7002) withdrawal requests.
        balance:
          description: Total balance queued for partial withdrawal.
          allOf:
            - $ref: '#/components/schemas/wei'
        last_withdrawable_at:
          $ref: '#/components/schemas/EstimatedWithEpoch'
          description: >
            Point at which the last request queued at this snapshot epoch
            reaches its withdrawable epoch. Unlike `estimated_processed_at` on
            the churn-limited queues this is not a projection: every queued
            request already carries the withdrawable epoch assigned when it was
            processed, and this reports the latest of them. Treat it as a lower
            bound on payout — the sweep pays at most
            `MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP` requests per block, so
            a queue deeper than that capacity settles later than this point. An
            empty queue reports the snapshot epoch itself.
      required:
        - count
        - balance
        - last_withdrawable_at
    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
    count:
      type: integer
      minimum: 0
    wei:
      type: string
      description: Amount in wei (1 ETH = 10^18 wei)
      pattern: ^(0|-?[1-9][0-9]*)$
    ChurnRate:
      type: object
      description: >
        Rate at which the protocol can process queued balance (deposits or
        exits) per interval.

        The `amount` is denominated in wei and the `interval_seconds` defines
        the length of one processing cycle (e.g. 384 seconds for one Ethereum
        epoch = 32 slots × 12s each).
      properties:
        amount:
          $ref: '#/components/schemas/wei'
          description: Amount of ether (in wei) that can be processed in one interval.
        interval_seconds:
          type: integer
          description: >-
            Length of the processing interval in seconds (e.g. 384 for one
            epoch).
      required:
        - amount
        - interval_seconds
    EstimatedWithEpoch:
      type: object
      properties:
        epoch:
          $ref: '#/components/schemas/Epoch'
          description: Epoch number
        timestamp:
          $ref: '#/components/schemas/timestamp'
          description: Unix timestamp
      required:
        - epoch
        - timestamp
    Slot:
      type: integer
      minimum: 0
      description: Slot by number.
    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.

````