HMRC Euro to GBP Monthly Rates 2025/26

Author

Inma

Monthly rate extraction

This code retrieves the monthly EUR→GBP exchange rates for the 2025-26 financial year by calling the open HMRC exchange‑rate API developed by Matías J. S. and assembling the Euro rate for each month into a single tidy table.

You can double check values in the official site HMRC monthly Euro to Sterling exchange rates

# Define months for FY 2025/26 (April 2025 - March 2026)
fy_months <- seq(as.Date("2025-04-01"), as.Date("2026-03-01"), by = "month") %>%
  format("%Y-%m")

# Function to fetch rate for a month
fetch_hmrc_rate <- function(month_ym) {
  year_mon <- str_replace(month_ym, "-", "/")
  url <- paste0("https://hmrc.matchilling.com/rate/", year_mon, ".json")
  
  resp <- request(url) %>%
    req_timeout(10) %>%
    req_perform()
  
  if (resp_status(resp) == 200) {
    data <- resp %>%
      resp_body_json(simplifyVector = TRUE) %>%
      .$rates %>%
      enframe(name = "currency", value = "rate") %>%
      filter(currency == "EUR") %>%
      mutate(
        month = month_ym,
        period_start = ymd(paste0(month_ym, "-01")),
        period_end = period_start %m+% months(1) - days(1),
        eur_per_gbp = as.numeric(rate)
      ) %>%
      select(month, eur_per_gbp, period_start, period_end)
    return(data)
  } else {
    tibble(
      month = month_ym, 
      eur_per_gbp = NA_real_,
      period_start = ymd(paste0(month_ym, "-01")),
      period_end = period_start %m+% months(1) - days(1)
    )
  }
}

# Fetch all months
rates <- map_df(fy_months, fetch_hmrc_rate)

View the table

This bit creates a simple table visualization for the html file

rates %>%
  mutate(
    month_display = month,
    eur_per_gbp = round(eur_per_gbp, 4),
    gbp_per_eur = round(1/eur_per_gbp, 4)
  ) %>%
  select(month_display, eur_per_gbp, gbp_per_eur) %>%
  kbl(
    caption = "HMRC Monthly EUR/GBP Rates FY 2025/26",
    col.names = c("Month", "€ per £1", "£ per €1")
  ) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE
  ) %>%
  # Fixed: pack_rows() doesn't accept font_size argument
  pack_rows("2025", 1, 9) %>%
  pack_rows("2026", 10, 12)
HMRC Monthly EUR/GBP Rates FY 2025/26
Month € per £1 £ per €1
2025
2025-04 1.1897 0.8405
2025-05 1.1680 0.8562
2025-06 1.1846 0.8442
2025-07 1.1689 0.8555
2025-08 1.1547 0.8660
2025-09 1.1573 0.8641
2025-10 1.1528 0.8675
2025-11 1.1506 0.8691
2025-12 1.1328 0.8828
2026
2026-01 1.1382 0.8786
2026-02 1.1448 0.8735
2026-03 1.1469 0.8719

Export it for your Tax Returns

Here, we save the csv file with the 12 months you need and the currency you need. (if you are looking for any other currency , just change the line in the first chunck of code to match your currency filter(currency == “EUR”)

# Save clean CSV for HMRC filing
rates_export <- rates %>%
  select(month, eur_per_gbp) %>%
  mutate(
    eur_per_gbp = round(eur_per_gbp, 4),
    gbp_per_eur = round(1/eur_per_gbp, 4)
  )

write_csv(rates_export, "hmrc_eur_gbp_2025_26.csv")
print("CSV saved: hmrc_eur_gbp_2025_26.csv")
[1] "CSV saved: hmrc_eur_gbp_2025_26.csv"
# Preview
rates_export
# A tibble: 12 × 3
   month   eur_per_gbp gbp_per_eur
   <chr>         <dbl>       <dbl>
 1 2025-04        1.19       0.840
 2 2025-05        1.17       0.856
 3 2025-06        1.18       0.844
 4 2025-07        1.17       0.856
 5 2025-08        1.15       0.866
 6 2025-09        1.16       0.864
 7 2025-10        1.15       0.868
 8 2025-11        1.15       0.869
 9 2025-12        1.13       0.883
10 2026-01        1.14       0.879
11 2026-02        1.14       0.874
12 2026-03        1.15       0.872

My other repositories:

Tools for Narrative-Friendly Reporting