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

# PTC Duties

> Lists the Payload Timeliness Committee for a specific slot: every committee position, which validator held it, and whether it voted.
The validator filter is optional; if omitted, results include every position in the slot's committee.

The Payload Timeliness Committee attests to whether a block's execution payload was revealed on time. It exists from the Gloas fork onwards, so slots before the fork return `404` and no history is backfilled.

Results are one row per committee **position**, not per validator. The committee is sampled with replacement, so the same validator can hold several positions in one slot and each votes independently. Paging is on `ptc_position` for that reason - a validator index does not identify a row.

PTC duties are unpaid: missing one carries no penalty and earns no reward, so this endpoint returns no reward fields. Treat a missed position as a participation signal, not a lost-earnings one.

Combine this endpoint with others for deeper insights:
- The slots your own validators served on:   
  [v2/ethereum/validators/ptc-slots](/api-reference/ethereum/validators/ptc-slots)
- Consensus slot information:   
  [v2/ethereum/slot](/api-reference/ethereum/slot/overview)

Note: This endpoint supports **only finalized** data at this time, and stops one slot short of the finalized head: a slot's committee resolves with the block at the slot after it, so the newest finalized slot is not yet reportable and returns `404`.




## OpenAPI

````yaml /v3/bundled.yaml post /api/v2/ethereum/slot/ptc-duties
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/ptc-duties:
    post:
      tags:
        - Slot
      summary: PTC Duties
      description: >
        Lists the Payload Timeliness Committee for a specific slot: every
        committee position, which validator held it, and whether it voted.

        The validator filter is optional; if omitted, results include every
        position in the slot's committee.


        The Payload Timeliness Committee attests to whether a block's execution
        payload was revealed on time. It exists from the Gloas fork onwards, so
        slots before the fork return `404` and no history is backfilled.


        Results are one row per committee **position**, not per validator. The
        committee is sampled with replacement, so the same validator can hold
        several positions in one slot and each votes independently. Paging is on
        `ptc_position` for that reason - a validator index does not identify a
        row.


        PTC duties are unpaid: missing one carries no penalty and earns no
        reward, so this endpoint returns no reward fields. Treat a missed
        position as a participation signal, not a lost-earnings one.


        Combine this endpoint with others for deeper insights:

        - The slots your own validators served on:   
          [v2/ethereum/validators/ptc-slots](/api-reference/ethereum/validators/ptc-slots)
        - Consensus slot information:   
          [v2/ethereum/slot](/api-reference/ethereum/slot/overview)

        Note: This endpoint supports **only finalized** data at this time, and
        stops one slot short of the finalized head: a slot's committee resolves
        with the block at the slot after it, so the newest finalized slot is not
        yet reportable and returns `404`.
      operationId: GetSlotPtcDuties
      requestBody:
        $ref: '#/components/requestBodies/slotOptionalValidatorChainCursorPageSize'
      responses:
        '200':
          $ref: '#/components/responses/SlotPtc'
        '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:
    slotOptionalValidatorChainCursorPageSize:
      description: '`validator` is optional in this request body'
      content:
        application/json:
          schema:
            allOf:
              - type: object
                description: >
                  Specify a slot using one of the slot number. Selecting by a
                  consensus view may soon be available in a future update.
                properties:
                  slot:
                    $ref: '#/components/schemas/SlotByNumber'
                required:
                  - slot
              - type: object
                properties:
                  chain:
                    $ref: '#/components/schemas/Chain'
                  cursor:
                    $ref: '#/components/schemas/Cursor'
                  page_size:
                    $ref: '#/components/schemas/PageSize'
                  validator:
                    $ref: '#/components/schemas/nullableValidatorSelector'
            required:
              - slot
              - chain
          example:
            slot:
              number: 2375680
            chain: mainnet
  responses:
    SlotPtc:
      description: Successful response.
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/SlotPtc.ContainerList'
              - $ref: '#/components/schemas/PagingTemplate'
            description: >-
              Response containing the payload timeliness committee positions for
              the slot and how each of them voted.
    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:
    SlotByNumber:
      title: Number
      type: object
      properties:
        number:
          $ref: '#/components/schemas/Slot'
      required:
        - number
    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'
    SlotPtc.ContainerList:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/SlotPtc.Data'
      required:
        - data
    PagingTemplate:
      type: object
      properties:
        paging:
          $ref: '#/components/schemas/Paging'
    Error:
      type: object
      properties:
        error:
          type: string
    Slot:
      type: integer
      minimum: 0
      description: Slot by number.
    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'
    SlotPtc.Data:
      type: object
      properties:
        validator:
          $ref: '#/components/schemas/validator'
        ptc_position:
          type: integer
          description: >-
            Index of this position in the slot's committee vector. The committee
            is sampled with replacement, so the same validator can appear on
            more than one position in the same slot, and each position votes
            independently.
          minimum: 0
          x-sortable: true
        status:
          $ref: '#/components/schemas/PtcDutyStatus'
        payload_present:
          type: boolean
          nullable: true
          description: >-
            What this position voted on payload availability - whether the
            execution payload was revealed on time. Null when the position cast
            no vote.
        blob_data_available:
          type: boolean
          nullable: true
          description: >-
            What this position voted on blob data availability. Null when the
            position cast no vote.
        finality:
          $ref: '#/components/schemas/FinalityParams'
      required:
        - validator
        - ptc_position
        - status
        - 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
    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'
    PtcDutyStatus:
      type: string
      description: >
        Indicates whether the payload timeliness committee position cast a vote
        that was included in a block, and where a vote was possible at all.


        Possible values:
          - "voted": A payload timeliness vote from this position was included in a block at slot N+1, whether or not that block stayed canonical.
          - "missed": No vote from this position was included in any block at slot N+1, although one could have been. This is the only value that points at the validator.
          - "unvotable": Slot N or slot N+1 has no canonical block, so no vote for slot N could reach the chain from any position. The whole committee reads "unvotable" for such a slot. This is a property of those two proposers, not of these validators.

        A vote for slot N is includable only in a block at slot N+1 that builds
        on the block at N, which is why a missed or orphaned block at either
        slot makes the duty unvotable. Positions counted this way are the
        difference between `missed` and `missed_including_missed_slots` on the
        aggregate duty surfaces.


        One case still reads "missed" rather than "unvotable": both blocks exist
        but the proposer at slot N+1 included no payload attestation for slot N.
        The vote was possible and nothing on chain distinguishes it from a
        committee that stayed silent.


        A vote that reached a block which was later orphaned still reads
        "voted": the duty was performed and the reorg is the following
        proposer's loss. This matches the per-slot counts on
        [v2/ethereum/validators/ptc-slots](/api-reference/ethereum/validators/ptc-slots),
        and can differ from the aggregate duty surfaces, which count only votes
        that reached a canonical block.


        There is no "scheduled" value: this endpoint serves finalized slots
        only, and stops one slot short of the finalized head because a slot's
        committee resolves with the block after it.
      enum:
        - voted
        - missed
        - unvotable
      x-enum-varnames:
        - PtcDutyStatusVoted
        - PtcDutyStatusMissed
        - PtcDutyStatusUnvotable
      example: voted
    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
    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}$
    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.

````