FBAR and Form 8938 Exchange Rates: The Treasury Reporting Rate, via API
Two US filings ask for the dollar value of foreign accounts at year end: the FBAR (FinCEN Form 114, Report of Foreign Bank and Financial Accounts) and Form 8938 (Statement of Specified Foreign Financial Assets, filed with the tax return under FATCA). Both instructions point to the same exchange-rate table: the Treasury Reporting Rates of Exchange published by the Treasury's Bureau of the Fiscal Service, as of the last day of the year. This guide shows where that table lives, how to fetch it from an API without a key, how to get a past December 31 rate for a late or amended filing, and how to automate the conversion in Python or Google Sheets.
What the instructions say
The FinCEN FBAR instructions tell filers to determine the maximum value of each account during the calendar year in its own currency, then convert it to US dollars using the Treasury's Bureau of the Fiscal Service exchange rate for the last day of the calendar year. If the Treasury does not publish a rate for that currency, the instructions allow another verifiable exchange rate, with the source stated.
The Form 8938 instructions follow the same pattern for the maximum value of specified foreign financial assets: use the Bureau of the Fiscal Service rate on the last day of the tax year, and if none is available, another publicly available rate, disclosed on the form. In both cases the convention is deliberate: one table, one date, so that every filer's figures are built the same way.
The Treasury publishes the table quarterly through its Fiscal Data platform. The December 31 table is the one that matters here, and it is quoted as foreign currency units per one US dollar: a euro rate of 0.881 means 0.881 euro buys a dollar. To convert a euro balance to dollars you divide, not multiply.
The table, as an API
AllRatesToday serves the Treasury Reporting Rates of Exchange as published, with the publication date on every figure, on the US Treasury reporting rates source. The table currently in force is keyless. Ask for a single pair and you get one number with its provenance:
curl "https://allratestoday.com/api/open/central-bank/ustreasury?source=USD&target=EUR" {
"bank": "ustreasury",
"rate_date": "2026-10-15",
"source": "USD",
"target": "EUR",
"rate": 0.881,
"rate_type": "quarterly",
"derived": false,
"method": "published",
"age_days": 4,
"stale": false,
"cadence": "quarterly"
} Three fields do the work. rate_date is the date of the table in force, which is a quarter end or, as here, a mid-quarter amendment date when the Treasury has reissued a currency that moved sharply. rate_type: "quarterly" says which Treasury series it is. method: "published" and derived: false confirm the figure is the Treasury's own, not a cross-rate computed from other pairs.
Without the pair parameters the same URL returns the whole table (about 145 currencies against USD) as rates: [{base, quote, type, value}], and ?format=csv gives it as a spreadsheet with the columns rate_date, base, quote, rate_type, value.
The year-end rate for a past year
Between January and the filing deadline, the table in force is normally still the December 31 one, so the keyless call above returns the year-end rate and rate_date confirms it. Check that date before you rely on it: once the March quarter table is published, "latest" moves on. For a late filing, an amended FBAR, or a year-end that has already rolled over, ask for the table in force on the exact date instead. That is the dated endpoint, which is on paid plans:
curl "https://allratestoday.com/api/v1/central-bank/ustreasury/2025-12-31?source=USD&target=EUR" \
-H "Authorization: Bearer YOUR_API_KEY"
# adds "requested_date": "2025-12-31" and "published_on_requested_date": true|false
# to the same fields as the keyless response The response has the same shape plus requested_date and published_on_requested_date. For December 31 the Treasury's own quarter-end table carries that date, so you should see published_on_requested_date: true. If it is false, the API has fallen back to the most recent table published before the date you asked for, and tells you which one. Keep the whole response with your filing workpapers; it is the evidence of which rate you used and where it came from.
Python: convert a maximum balance
One function covers both cases. Pass no date for the table in force (keyless), or a year-end date for a specific past table (paid key):
import requests
BASE = "https://allratestoday.com/api"
KEY = "YOUR_API_KEY" # only needed for past year-ends
def treasury_rate(currency: str, year_end: str | None = None) -> dict:
"""Treasury Reporting Rate: foreign units per 1 USD.
year_end=None -> table currently in force (keyless).
year_end='2025-12-31' -> table in force on that date (paid plans)."""
if year_end is None:
r = requests.get(f"{BASE}/open/central-bank/ustreasury",
params={"source": "USD", "target": currency}, timeout=15)
else:
r = requests.get(f"{BASE}/v1/central-bank/ustreasury/{year_end}",
params={"source": "USD", "target": currency},
headers={"Authorization": f"Bearer {KEY}"}, timeout=15)
r.raise_for_status()
return r.json()
# Maximum balance of a euro account during 2025, converted for the FBAR
info = treasury_rate("EUR", "2025-12-31")
max_balance_eur = 48_250.00
usd_value = max_balance_eur / info["rate"] # divide: the table is EUR per 1 USD
print(info["rate_date"], info["rate"], info["published_on_requested_date"])
print(f"Max value in USD: {usd_value:,.2f}") Run it once per currency you hold accounts in, and log rate_date, rate and published_on_requested_date next to each converted figure. For accounts in a currency the Treasury does not list, the response is a 404 with an error message rather than a guessed figure; that is your signal to follow the instructions' fallback and document the alternative source you chose.
Google Sheets: the year-end table in a tab
Many filers keep their account maximums in a spreadsheet. Load the keyless table into a tab with IMPORTDATA, then look up the rate by currency code. The CSV columns are rate_date, base, quote, rate_type, value, so the quote currency is column 3 and the rate is column 5:
=QUERY(IMPORTDATA("https://allratestoday.com/api/open/central-bank/ustreasury?format=csv"),
"select Col5 where Col3 = 'EUR'", 1) With a currency code in A2 and the maximum balance in that currency in B2, this converts it to dollars in one cell:
=B2 / QUERY(IMPORTDATA("https://allratestoday.com/api/open/central-bank/ustreasury?format=csv"),
"select Col5 where Col3 = '" & A2 & "'", 0) Put the raw import in its own tab too, and copy the rate_date column into your workpapers so the sheet records which Treasury table it used. Sheets re-evaluates IMPORTDATA periodically, so a sheet you open in May will show the March table; for a frozen year-end table, paste the values once the December 31 table is in force, or use the dated endpoint through a script.
Where the other US rates fit
The Treasury reporting rate is the year-end convention for these two information returns. It is not the only official US series, and it is not the one for every purpose:
- Income and expenses on the tax return itself are generally translated at the rate prevailing when received or paid, and the IRS publishes a yearly average table for individuals who prefer one figure per year. How to compute and automate that is covered in IRS yearly average exchange rates.
- Financial reporting under US GAAP uses the rates ASC 830 specifies at transaction and balance-sheet dates, commonly from the Federal Reserve H.10 series. See exchange rates for ASC 830.
- Federal agencies, contractors and grantees use the Treasury table for official reporting throughout the year, not only at December 31, which is why the full quarterly history is kept.
FAQ
Do I have to use the Treasury rate for the FBAR?
The FinCEN FBAR instructions direct filers to the Treasury's Bureau of the Fiscal Service exchange rate for the last day of the calendar year, and to use another verifiable rate and state its source only if the Treasury does not publish one for that currency. Follow the current instructions for the year you are filing and ask a tax professional about your own situation.
Which direction is the Treasury rate quoted in?
Foreign currency units per 1 US dollar. The API returns it the same way (source USD, target EUR, rate 0.881 means 0.881 euro per dollar). To convert a foreign balance to dollars, divide by the rate.
Is the year-end rate free?
The table currently in force is keyless and free. A table for a specific past date, such as December 31 of a prior year, comes from the dated endpoint, which is on paid plans. A free account carries 300 free requests to the market-rate endpoints; the dated central-bank tables need a paid plan.
Does the API republish FinCEN or IRS guidance?
No. It serves the Treasury Reporting Rates of Exchange as the Bureau of the Fiscal Service published them, with their publication dates. Which rate you are required to use, and whether an alternative is acceptable, comes from the form instructions and your adviser.
Past year-end tables
Treasury reporting rates back to 2001 by date on paid plans, with the publication date on every figure.
See plansRelated Articles
- US Treasury reporting rates API — today’s table and endpoints
- IRS Yearly Average Exchange Rates: How to Compute and Automate Them
- Exchange Rates for ASC 830 Remeasurement and Translation
- US Treasury Reporting Rates API: Official Quarterly FX Rates as JSON
- Federal Reserve H.10 exchange rate API
- Exchange rates for finance teams