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

# Performance

> Returns a list of a validator's performance for a specific epoch for a set of validators.

**Use case guide:** [Validator performance](/use-cases/performance-introduction) explains when to use per-epoch performance and how it complements the aggregate endpoint.

This endpoint includes the **BeaconScore** metric, which measures how well validators perform their duties. Learn more about [how BeaconScore is calculated](/beaconscore/introduction).




## OpenAPI

````yaml /v3/bundled.yaml post /api/v2/ethereum/validators/performance-list
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/validators/performance-list:
    post:
      tags:
        - Performance
      summary: Performance
      description: >
        Returns a list of a validator's performance for a specific epoch for a
        set of validators.


        **Use case guide:** [Validator
        performance](/use-cases/performance-introduction) explains when to use
        per-epoch performance and how it complements the aggregate endpoint.


        This endpoint includes the **BeaconScore** metric, which measures how
        well validators perform their duties. Learn more about [how BeaconScore
        is calculated](/beaconscore/introduction).
      operationId: GetValidatorPerformanceList
      requestBody:
        $ref: >-
          #/components/requestBodies/validatorChainCursorPageSizeEpochNoEpochEnums
      responses:
        '200':
          $ref: '#/components/responses/ValidatorPerformanceDetailed'
        '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:
    validatorChainCursorPageSizeEpochNoEpochEnums:
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/ValidatorChainCursorPageSizeBase'
              - $ref: '#/components/schemas/epochNoEnumsNamedParam'
            required:
              - epoch
              - validator
  responses:
    ValidatorPerformanceDetailed:
      description: Successful response.
      content:
        application/json:
          schema:
            allOf:
              - $ref: >-
                  #/components/schemas/ValidatorPerformanceDetailed.ContainerList
              - $ref: '#/components/schemas/PagingRangeTemplate'
            description: >-
              Response containing detailed performance information of the
              validators.
    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:
    ValidatorChainCursorPageSizeBase:
      type: object
      properties:
        chain:
          $ref: '#/components/schemas/Chain'
        cursor:
          $ref: '#/components/schemas/Cursor'
        page_size:
          $ref: '#/components/schemas/PageSize'
        validator:
          $ref: '#/components/schemas/validatorsSelector'
    epochNoEnumsNamedParam:
      type: object
      properties:
        epoch:
          $ref: '#/components/schemas/Epoch'
    ValidatorPerformanceDetailed.ContainerList:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/ValidatorPerformanceDetailed.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.
    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
    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'
    Epoch:
      type: integer
      minimum: 0
    ValidatorPerformanceDetailed.Data:
      type: object
      properties:
        validator:
          $ref: '#/components/schemas/validator'
        beaconscore:
          $ref: '#/components/schemas/performanceBeaconscore'
        duties:
          $ref: '#/components/schemas/PerformanceDuties.Duties'
        finality:
          $ref: '#/components/schemas/FinalityParams'
      required:
        - validator
        - beaconscore
        - duties
        - 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.
      properties:
        slot:
          $ref: '#/components/schemas/SlotRange'
        epoch:
          $ref: '#/components/schemas/EpochRange'
        timestamp:
          $ref: '#/components/schemas/TimeRange'
      required:
        - slot
        - epoch
        - timestamp
    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'
    performanceBeaconscore:
      type: object
      description: >-
        BeaconScore efficiency metrics for the selected scope and evaluation
        window. Values are ratios from 0 to 1, where 1 represents perfect duty
        performance.
      properties:
        total:
          allOf:
            - $ref: '#/components/schemas/percent'
          description: >-
            Overall BeaconScore combining attestation, proposal, and sync
            committee performance.
          nullable: true
        attestation:
          allOf:
            - $ref: '#/components/schemas/percent'
          description: BeaconScore component for attestation performance.
          nullable: true
        proposal:
          allOf:
            - $ref: '#/components/schemas/percent'
          description: >-
            BeaconScore component for proposal performance, normalized to reduce
            the effect of proposal luck.
          nullable: true
        sync_committee:
          allOf:
            - $ref: '#/components/schemas/percent'
          description: BeaconScore component for sync committee performance.
          nullable: true
    PerformanceDuties.Duties:
      type: object
      properties:
        attestation:
          $ref: '#/components/schemas/PerformanceDuties.Attestation'
        sync_committee:
          $ref: '#/components/schemas/ValidatorSyncCommitteeDutyParticipation'
        proposal:
          $ref: '#/components/schemas/PerformanceDuties.Proposal'
      required:
        - attestation
        - sync_committee
        - proposal
    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
    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
    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}$
    percent:
      type: number
      format: float
      minimum: 0
      maximum: 1
    PerformanceDuties.Attestation:
      type: object
      properties:
        included:
          type: integer
          description: >
            Number of times the validator's attestation was included on-chain.


            This count includes all attestations submitted by the validator,
            even if they were included too late to earn a reward (such late
            attestations are still considered "missed" for reward purposes).

            "Included" reflects every attestation that made it on-chain,
            regardless of timeliness or eligibility for rewards.


            This metric indicates whether your validator is actively submitting
            attestations to the network.
        assigned:
          type: integer
          description: >
            Number of times the validator was assigned an attestation duty.

            This represents the total opportunities to attest, regardless of
            whether the validator fulfilled the duty.
        correct_head:
          description: >
            Number of times the validator attested with the correct head block.

            Correct references are necessary to be rewarded by the chain but
            incorrect references result in no reward or a penalty.
          type: integer
        correct_source:
          description: >
            Number of times the validator attested with the correct source
            block.

            Correct references are necessary to be rewarded by the chain but
            incorrect references result in no reward or a penalty.
          type: integer
        correct_target:
          description: >
            Number of times the validator attested with the correct target
            block.

            Correct references are necessary to be rewarded by the chain but
            incorrect references result in no reward or a penalty.
          type: integer
        valuable_correct_head:
          description: >
            Counts the number of correct head attestations that were included
            early enough to receive a reward.


            Attestations that were included too late to earn a reward (and are
            treated as missed for reward purposes) are not counted as valuable.
          type: integer
        valuable_correct_source:
          description: >
            Counts the number of correct source attestations that were included
            early enough to receive a reward.


            Attestations that were included too late to earn a reward (and are
            treated as missed for reward purposes) are not counted as valuable.
          type: integer
        valuable_correct_target:
          description: >
            Counts the number of correct target attestations that were included
            early enough to receive a reward.


            Attestations that were included too late to earn a reward (and are
            treated as missed for reward purposes) are not counted as valuable.
          type: integer
        avg_inclusion_delay:
          description: >
            Average inclusion delay measures how quickly a validator's
            attestations are included in the chain, expressed in slots. 

            Lower values indicate more timely inclusion and better performance.


            An ideal value of 0 means every attestation was included at the
            earliest possible opportunity—one slot after it was assigned to you.


            Note: Do not confuse this metric with the `reward.inclusion_delay`
            field found in the rewards endpoint, which refers to a specific
            reward (measured in gwei) that was only applicable prior to the
            Altair hardfork. 
          type: number
          format: float
          example: 1.2
          minimum: 0
          maximum: 63
        avg_inclusion_delay_excluding_missed_slots:
          description: >
            This is your average inclusion delay, excluding any missed blocks.


            - If `avg_inclusion_delay_excluding_missed_slots` is close to zero
            but avg_inclusion_delay is higher, this indicates that most of your
            attestations are included promptly, and any lost rewards are
            primarily due to missed blocks on the network (outside your
            control). 

            - If both values are large, it suggests your validator is
            experiencing delays in submitting attestations, likely due to issues
            with your validator's setup or connectivity.             
              
            Note: avg_inclusion_delay is used for reward calculations.
            Therefore, an `avg_inclusion_delay_excluding_missed_slots` of zero
            does not mean there were no missed rewards.


            The `avg_inclusion_delay_excluding_missed_slots` is always less than
            or equal to your actual `avg_inclusion_delay`.
          type: number
          format: float
          example: 1.2
          minimum: 0
          maximum: 63
        missed:
          type: integer
          description: >
            Number of times the validator missed voting on an attestation duty,
            including missed blocks on the network.
      required:
        - included
        - assigned
        - correct_head
        - correct_source
        - correct_target
        - valuable_correct_head
        - valuable_correct_source
        - valuable_correct_target
        - avg_inclusion_delay
        - avg_inclusion_delay_excluding_missed_slots
        - missed
    ValidatorSyncCommitteeDutyParticipation:
      type: object
      properties:
        successful:
          type: integer
          description: >-
            Number of times the validator successfully participated in the sync
            committee.
          minimum: 0
        assigned:
          type: integer
          description: >-
            Number of times the validator has been assigned to participate in
            the sync committee, excluding missed slots.
          minimum: 0
        missed:
          type: integer
          description: >
            Number of times the validator missed participation in the sync
            committee, excluding missed network slots.


            The `missed` is always less than or equal to your actual
            `missed_including_missed_slots`.
          minimum: 0
        missed_including_missed_slots:
          type: integer
          description: >
            Number of times the validator missed participation in the sync
            committee, including missed network slots.


            Missed network slots are beyond your control. If this value is
            significantly higher than `missed`, it indicates that your validator
            is generally performing well, and most missed rewards are due to
            network issues rather than validator faults. 


            However, if both `missed` and `missed_including_missed_slots` are
            high, it suggests potential issues with your validator's setup or
            connectivity, leading to missed sync committee messages.
          minimum: 0
        scheduled:
          type: integer
          description: >-
            Number of scheduled sync committee votes for active and upcoming
            sync committees.
          minimum: 0
      required:
        - successful
        - assigned
        - missed
        - missed_including_missed_slots
        - scheduled
    PerformanceDuties.Proposal:
      type: object
      properties:
        successful:
          type: integer
          description: Number of times the validator successfully proposed a block.
        assigned:
          type: integer
          description: Number of times the validator was assigned to propose a block.
        missed:
          type: integer
          description: >-
            Number of times the validator either missed a scheduled block
            proposal or had their proposed block orphaned
        included_slashings:
          type: integer
          description: >
            Number of slashing proofs included in blocks proposed by the
            validator.

            A slashing proof provides cryptographic evidence that one or more
            validators proposing two different blocks for the same slot.
      required:
        - successful
        - assigned
        - missed
        - included_slashings
    Slot:
      type: integer
      minimum: 0
      description: Slot by number.
    timestamp:
      type: integer
      minimum: 0
    validatorIndexPublicKey:
      oneOf:
        - $ref: '#/components/schemas/validatorIndex'
        - $ref: '#/components/schemas/validatorPublicKey'
  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.

````