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

# Tax Year Calculations

> Calculate validator rewards for specific tax years (January 1 - December 31) with per-epoch data for fiat conversion

<Warning>
  **API Usage:** A full tax year contains \~82,000 epochs. Each epoch requires a separate API call. See [Custom Range Rewards](/use-cases/rewards-custom-range#performance-considerations) for performance estimates and optimization tips.

  We are developing endpoints designed to streamline the retrieval of summarized data for user-defined periods. Manually summing up rewards epoch-by-epoch doesn't scale well for many validators over long timeframes.
</Warning>

## Overview

For tax reporting, you need **per-epoch reward data** to calculate the fiat value of rewards at the time they were received. This requires iterating through epochs using the [Custom Range Rewards](/use-cases/rewards-custom-range) approach.

<Note>
  **API Endpoint:** This guide uses `/api/v2/ethereum/validators/rewards-list` for per-epoch reward data required for tax calculations.
</Note>

<Warning>
  **Disclaimer:** This guide provides technical instructions for fetching reward data. It is not tax advice. Consult a qualified tax professional for guidance on how staking rewards should be reported in your jurisdiction.
</Warning>

## Why Per-Epoch or Per-Day Data is Required

Most tax jurisdictions require you to report the **fiat value** of staking rewards at the time they were received. This means you need:

1. **Reward amount** for each epoch or day
2. **Historical ETH-USD price** at that time
3. **Calculation**: `fiat_value = reward_eth × price_at_time`

<Note>
  The `all_time` or rolling period windows from Rewards Aggregated only provide a total sum—they cannot be used for tax calculations because you need per-epoch data to match with historical prices.
</Note>

## Obtaining Historical ETH Prices

You'll need historical ETH-USD prices for each day. Common sources include:

| Source                                              | Notes                                        |
| --------------------------------------------------- | -------------------------------------------- |
| [CoinGecko API](https://www.coingecko.com/en/api)   | Free tier available, daily historical prices |
| [CryptoCompare](https://min-api.cryptocompare.com/) | Hourly historical data available             |
| [Kraken](https://docs.kraken.com/rest/)             | Exchange prices, high accuracy               |
| Tax software                                        | Many crypto tax tools include price data     |

<Tip>
  For tax compliance, use a consistent price source throughout your calculations and document which source you used.
</Tip>

***

## Common Tax Year Time Zone Offsets

| Region            | Time Zone | UTC Offset | Notes              |
| ----------------- | --------- | ---------- | ------------------ |
| UK                | GMT/BST   | 0 / +1     | BST during summer  |
| Central Europe    | CET/CEST  | +1 / +2    | CEST during summer |
| US Eastern        | EST/EDT   | -5 / -4    | EDT during summer  |
| US Pacific        | PST/PDT   | -8 / -7    | PDT during summer  |
| Japan             | JST       | +9         | No daylight saving |
| Australia Eastern | AEST/AEDT | +10 / +11  | AEDT during summer |

<Note>
  For tax purposes, use your local time zone's **standard offset** (non-daylight-saving) or consult with your tax authority about which time zone to use. Some jurisdictions may require UTC.
</Note>

***

## Related Resources

* [Introduction](/use-cases/rewards-introduction) — Overview and endpoint comparison
* [Custom Range Rewards](/use-cases/rewards-custom-range) — Complete epoch iteration code
* [Epoch & Time Zone Conversion](/use-cases/rewards-epoch-conversion) — Detailed epoch/timestamp math
* [Pagination Guide](/api/pagination)

<Tip>
  **PRO Feature:** With a [Scale or Enterprise plan](https://beaconcha.in/pricing), you can query by `withdrawal` address to capture all validators, and benefit from significantly higher rate limits. Use [dashboards with groups](/use-cases/rewards-dashboard-private-sets) to organize validators and query them efficiently with a single `dashboard_id`.
</Tip>
