---
updatedAt: 2025-09-18T22:06:52.000Z
agentTools:
  projectIndex: https://docs.nodereal.io/llms.txt
---

# Get attester duties

Requests the beacon node to provide a set of attestation duties, which should be performed by validators, for a particular epoch.
Duties should only need to be checked once per epoch, however a chain reorganization (of > MIN_SEED_LOOKAHEAD epochs) could occur, resulting in a change of duties. For full safety, you should monitor head events and confirm the dependent root in this response matches:
- event.previous_duty_dependent_root when `compute_epoch_at_slot(event.slot) == epoch`
- event.current_duty_dependent_root when `compute_epoch_at_slot(event.slot) + 1 == epoch`
- event.block otherwise

The dependent_root value is `get_block_root_at_slot(state, compute_start_slot_at_epoch(epoch - 1) - 1)` or the genesis block root in the case of underflow.

# OpenAPI definition

```json
{
  "openapi": "3.0.3",
  "info": {
    "title": "Eth Beacon Node API",
    "description": "API specification for the beacon node, which enables users to query and participate in Ethereum 2.0 phase 0 beacon chain.\n\nAll requests by default send and receive JSON, and as such should have either or both of the \"Content-Type: application/json\"\nand \"Accept: application/json\" headers.  In addition, some requests can return data in the SSZ format.  To indicate that SSZ\ndata is required in response to a request the header \"Accept: application/octet-stream\" should be sent.  Note that only a subset\nof requests can respond with data in SSZ format; these are noted in each individual request.\n\nAPI endpoints are individually versioned.  As such, there is no direct relationship between all v1 endpoints, all v2 endpoints,\n_etc._ and no such relationship should be inferred.  All JSON responses return the requested data under a `data` key in the top\nlevel of their response.  Additional metadata may or may not be present in other keys at the top level of the response, dependent\non the endpoint.  The rules that require an increase in version number are as follows:\n\n  - no field that is listed in an endpoint shall be removed without an increase in the version number\n  - no field that is listed in an endpoint shall be altered in terms of format (_e.g._ from a string to an array) without an\n    increase in the version number\n\nNote that it is possible for a field to be added to an endpoint's data or metadata without an increase in the version number.\n",
    "version": "v2.3.0 - Eth2Spec v1.1.0",
    "contact": {
      "name": "Ethereum Github",
      "url": "https://github.com/ethereum/beacon-apis/issues"
    },
    "license": {
      "name": "CC0-1.0",
      "url": "https://creativecommons.org/publicdomain/zero/1.0/"
    }
  },
  "servers": [
    {
      "url": "{server_url}/{api_key}",
      "variables": {
        "server_url": {
          "description": "Beacon node API url",
          "default": "eth2-beacon-mainnet.nodereal.io/v1"
        },
        "api_key": {
          "description": "Beacon node API key",
          "default": "api_key"
        }
      }
    }
  ],
  "tags": [
    {
      "name": "Validator",
      "description": "Endpoints intended for validator clients"
    },
    {
      "name": "ValidatorRequiredApi",
      "description": "Minimal set of endpoints to enable a working validator implementation.\n\n[Checkout validator flow](./validator-flow.md) to learn how to use this api.\n"
    }
  ],
  "paths": {
    "/eth/v1/validator/duties/attester/{epoch}": {
      "post": {
        "tags": [
          "ValidatorRequiredApi",
          "Validator"
        ],
        "summary": "Get attester duties",
        "operationId": "getAttesterDuties",
        "description": "Requests the beacon node to provide a set of attestation duties, which should be performed by validators, for a particular epoch.\nDuties should only need to be checked once per epoch, however a chain reorganization (of > MIN_SEED_LOOKAHEAD epochs) could occur, resulting in a change of duties. For full safety, you should monitor head events and confirm the dependent root in this response matches:\n- event.previous_duty_dependent_root when `compute_epoch_at_slot(event.slot) == epoch`\n- event.current_duty_dependent_root when `compute_epoch_at_slot(event.slot) + 1 == epoch`\n- event.block otherwise\n\nThe dependent_root value is `get_block_root_at_slot(state, compute_start_slot_at_epoch(epoch - 1) - 1)` or the genesis block root in the case of underflow.",
        "parameters": [
          {
            "name": "epoch",
            "description": "Should only be allowed 1 epoch ahead",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "example": "1"
            }
          }
        ],
        "requestBody": {
          "description": "An array of the validator indices for which to obtain the duties.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "title": "GetAttesterDutiesBody",
                "type": "array",
                "items": {
                  "type": "string",
                  "example": "1",
                  "minItems": 1
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success response",
            "content": {
              "application/json": {
                "schema": {
                  "title": "GetAttesterDutiesResponse",
                  "type": "object",
                  "properties": {
                    "dependent_root": {
                      "allOf": [
                        {
                          "type": "string",
                          "example": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2",
                          "pattern": "^0x[a-fA-F0-9]{64}$"
                        },
                        {
                          "description": "The block root that this response is dependent on."
                        }
                      ]
                    },
                    "execution_optimistic": {
                      "allOf": [
                        {
                          "type": "boolean"
                        },
                        {
                          "example": false
                        },
                        {
                          "description": "True if the response references an unverified execution payload. Optimistic information may be invalidated at a later time. If the field is not present, assume the False value."
                        }
                      ]
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "pubkey": {
                            "type": "string",
                            "pattern": "^0x[a-fA-F0-9]{96}$",
                            "description": "The validator's BLS public key, uniquely identifying them. _48-bytes, hex encoded with 0x prefix, case insensitive._",
                            "example": "0x93247f2209abcacf57b75a51dafae777f9dd38bc7053d1af526f220a7489a6d3a2753e5f3e8b1cfe39b56f43611df74a"
                          },
                          "validator_index": {
                            "allOf": [
                              {
                                "type": "string",
                                "example": "1"
                              },
                              {
                                "description": "Index of validator in validator registry"
                              }
                            ]
                          },
                          "committee_index": {
                            "allOf": [
                              {
                                "type": "string",
                                "example": "1"
                              },
                              {
                                "description": "The committee index"
                              }
                            ]
                          },
                          "committee_length": {
                            "allOf": [
                              {
                                "type": "string",
                                "example": "1"
                              },
                              {
                                "description": "Number of validators in committee"
                              }
                            ]
                          },
                          "committees_at_slot": {
                            "allOf": [
                              {
                                "type": "string",
                                "example": "1"
                              },
                              {
                                "description": "Number of committees at the provided slot"
                              }
                            ]
                          },
                          "validator_committee_index": {
                            "allOf": [
                              {
                                "type": "string",
                                "example": "1"
                              },
                              {
                                "description": "Index of validator in committee"
                              }
                            ]
                          },
                          "slot": {
                            "allOf": [
                              {
                                "type": "string",
                                "example": "1"
                              },
                              {
                                "description": "The slot at which the validator must attest."
                              }
                            ]
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid epoch or index",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "type": "object",
                      "properties": {
                        "code": {
                          "description": "Either specific error code in case of invalid request or http status code",
                          "type": "number",
                          "example": 404
                        },
                        "message": {
                          "description": "Message describing error",
                          "type": "string"
                        },
                        "stacktraces": {
                          "description": "Optional stacktraces, sent when node is in debug mode",
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    {
                      "example": {
                        "code": 400,
                        "message": "Invalid epoch: -2"
                      }
                    }
                  ]
                }
              }
            }
          },
          "500": {
            "description": "Beacon node internal error.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "description": "Either specific error code in case of invalid request or http status code",
                      "type": "number",
                      "example": 404
                    },
                    "message": {
                      "description": "Message describing error",
                      "type": "string"
                    },
                    "stacktraces": {
                      "description": "Optional stacktraces, sent when node is in debug mode",
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                },
                "example": {
                  "code": 500,
                  "message": "Internal server error"
                }
              }
            }
          },
          "503": {
            "description": "Beacon node is currently syncing, try again later.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "description": "Either specific error code in case of invalid request or http status code",
                      "type": "number",
                      "example": 404
                    },
                    "message": {
                      "description": "Message describing error",
                      "type": "string"
                    },
                    "stacktraces": {
                      "description": "Optional stacktraces, sent when node is in debug mode",
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                },
                "example": {
                  "code": 503,
                  "message": "Beacon node is currently syncing and not serving request on that endpoint"
                }
              }
            }
          }
        }
      }
    }
  },
  "x-readme": {
    "explorer-enabled": true,
    "proxy-enabled": true
  }
}
```