Guide/FX for taxes

IRS yearly average exchange rates, recomputed from daily data

The IRS has no official exchange rate — it accepts any posted rate used consistently. We recomputed its 2025 yearly average table from daily data and matched it within a tenth of a percent, then computed two currencies the table stops short of.

ERexchangerate.dev·Aug 7, 2026·5 min read

US taxpayers reporting foreign income convert amounts to dollars, and the IRS publishes a yearly average exchange rate table for that. Two things about that table are less known: the IRS states it has no official exchange rate and generally accepts "any posted exchange rate that is used consistently" — and the table covers a fixed list of currencies and years. Both facts matter the moment your currency or year is missing. This guide recomputes the IRS averages from daily data so you can see the method, then shows how to produce the same average for any of our supported currencies and any year back to 1999.

Key points
The IRS accepts "any posted exchange rate that is used consistently" and states it has no official exchange rate.
Its yearly average table is quoted as foreign currency units per 1 USD — to convert foreign income to dollars, divide by the average.
Averaging our daily USD-base series over 2025 reproduces the IRS table within roughly a tenth of a percent: EUR 0.887 vs 0.886, GBP 0.759 vs 0.759, JPY 149.655 vs 149.632, CAD 1.398 vs 1.398.
The same one-line computation works for any supported currency and any year back to 1999 — including ones the IRS table does not carry.
Rates are indicative and this is not tax advice; pick one posted source and use it consistently.

What the IRS actually requires

The rule is looser than most people expect. Per the IRS yearly average currency exchange rates page: "Generally, it accepts any posted exchange rate that is used consistently" — and the same page states the IRS has no official exchange rate of its own. The published table is a convenience, not a mandate. The direction convention matters: the table lists foreign currency units per 1 US dollar, so you divide a foreign amount by the yearly average to get dollars.

The 2025 table, recomputed from daily data

A yearly average should be reproducible: take every daily observation for the year, average them. Here is the IRS 2025 figure next to the arithmetic mean of our own daily USD-base series (ECB/FRED business-day fixes plus live-source dailies) for the same year:

CurrencyIRS 2025 averageRecomputed from daily data
Euro (EUR)0.8860.887
UK Pound (GBP)0.7590.759
Japanese Yen (JPY)149.632149.655
Canadian Dollar (CAD)1.3981.398
Australian Dollar (AUD)1.5511.552
Swiss Franc (CHF)0.8310.831
Indian Rupee (INR)87.13387.166
Mexican Peso (MXN)19.21219.213

Every row lands within about a tenth of a percent. The residual comes from calendar choices — which days count, and how holidays are handled — not from different market data. The point of the exercise: the IRS average is an ordinary average of daily rates, and you can produce one yourself for anything the table leaves out.

Two currencies we carry that the IRS 2025 table does not list: the Philippine Peso and the Indonesian Rupiah. Computed the same way for the 2025 full year: PHP 57.509 and IDR 16,478.44 — each foreign units per 1 USD, divide to convert.

Compute it for any currency and any year

One request to the historical range endpoint returns the daily series; one jq expression averages it. No API key needed to try it:

Yearly average from daily rates — EUR, full year 2025copy
curl -s "https://api.exchangerate.dev/v1/range?base=USD&symbols=EUR&start_date=2025-01-01&end_date=2025-12-31" \
  | jq '[.data[].rates.EUR] | add/length'

# 0.8867047450980384  <- foreign units per 1 USD; divide income by this

Swap the symbol and the dates for any other currency or year — daily history runs back to 1999 on every tier, including Free. For a mid-year arrival or departure (a partial tax year), change the date range and the same expression yields a partial-period average. Every response carries `source` and `market_session` so you can state exactly what kind of observations your average was built from — a stronger consistency story than a screenshot of a table.

Not tax advice
This article describes how published exchange-rate averages are computed and reproduced. It is not tax, legal, or financial advice, and exchangerate.dev rates are indicative — published for reference and analytics, not an official or settlement rate. Rules differ for specific transactions (property sales, foreign tax credits, functional-currency elections). For anything beyond straightforward income conversion, ask a tax professional.
ER
exchangerate.dev
FX data guides for developers building with indicative rates.

Keep reading

ReferenceHistorical FX time series to 1999Read ReferenceReading source and market_sessionRead GuideECB reference rates, explainedRead ReferenceLive USD/JPY exchange rateRead
More ComparisonsFixer vs exchangerate.devOpen Exchange Rates vs exchangerate.devCurrencylayer vs exchangerate.devCurrencylayer vs ExchangeRate-API
LearnReading source and market_session in your pipelineIndicative vs executable FX rates: what a rates API actually gives youECB reference rates, explained
Live RatesEUR/USDGBP/USDUSD/JPY