Russian oil exports to European countries in 2025, by destination country
Russian oil exports to European countries in 2025
Using Eurostat's monthly "Oil and petroleum products imports" statistics (reported imports by the receiving country from Russia — the mirror image of Russian exports)1, here is the 2025 breakdown by destination country, in thousand tonnes (total oil & petroleum products, category O4000):
| Destination country | Crude oil | Refined products | Other oil* | Total |
|---|---|---|---|---|
| Türkiye | 15,229.3 | 16,776.7 | 45.8 | 32,051.8 |
| Slovakia | 4,922.9 | 0.3 | 0.0 | 4,923.2 |
| Hungary | 3,762.0 | 0.0 | 0.0 | 3,762.0 |
| Netherlands | 0.0 | 0.0 | 1,715.5 | 1,715.5 |
| Georgia | 225.3 | 846.6 | 0.0 | 1,071.8 |
| Czechia | 527.0 | 0.0 | 0.0 | 527.0 |
| Croatia | 0.0 | 0.0 | 423.4 | 423.4 |
| Poland | 0.0 | 294.7 | 0.0 | 294.7 |
| France | 0.0 | 0.0 | 29.0 | 29.0 |
| Finland | 0.0 | 15.0 | 0.0 | 15.0 |
| Germany | 7.9 | 0.0 | 0.0 | 7.9 |
| Lithuania | 0.0 | 6.7 | 0.0 | 6.7 |
| Latvia | 0.0 | 2.7 | 0.0 | 2.7 |
| Moldova | 0.0 | 0.4 | 0.0 | 0.4 |
| North Macedonia | 0.0 | 0.1 | 0.0 | 0.1 |
| Total (listed) | 24,674.4 | 17,943.2 | 2,213.7 | 44,831.3 |
*"Other oil" = NGL, refinery feedstocks, additives and other hydrocarbons (reported under O4000 but not in the crude-oil or refined-product sub-totals).
All other European reporters in the dataset (Belgium, Austria, Spain, Italy, Ireland, Cyprus, Bulgaria, Denmark, Estonia, Greece, Montenegro, Norway, Malta, Luxembourg, Portugal, Serbia, Romania, Slovenia, Sweden, Albania) recorded zero imports of Russian oil in 2025.
Key points
- Türkiye dominates, taking ~32.1 million tonnes — about 71% of the European total — split fairly evenly between crude (15.2 Mt) and refined products (16.8 Mt)23.
- Slovakia and Hungary are the only EU members still importing significant volumes, and both are essentially crude-only (via pipeline): 4.9 Mt and 3.8 Mt respectively2.
- The EU-27 aggregate for 2025 was 11.71 million tonnes (9.22 Mt crude + 0.32 Mt refined products + the rest other oil), consistent with the sum of its member states3.
- For context, total 2025 flows to the listed European destinations came to ~44.8 million tonnes32.
The accompanying chart (generated in 2) shows these flows as a horizontal bar chart, broken down by crude oil, refined products and other oil.
Caveats: figures are volumes (thousand tonnes) reported by importing countries in Eurostat energy statistics; value (€) data are not reported for Russian partners. The dataset covers EU countries plus a set of neighbouring European economies (e.g. Türkiye, Georgia, Moldova, Western Balkan countries, Norway) — a few other European destinations outside Eurostat's coverage would not appear.
- Eurostat dataset: Oil and petroleum products imports - monthly data
- Code Run 2Dataset: nrg_ti_oilm
Images
russian_oil_2025.svgDataset filters for
nrg_ti_oilmFilter Value(s) partner RU siec O4000, O4100_TOT, O4600 unit THS_T sinceTimePeriod 2025-01 untilTimePeriod 2025-12 Program output
saved siec O4100_TOT O4600 other O4000 geo TR 15229.3 16776.7 45.8 32051.8 SK 4922.9 0.3 0.0 4923.2 HU 3762.0 0.0 0.0 3762.0 NL 0.0 0.0 1715.5 1715.5 GE 225.3 846.6 0.0 1071.8 CZ 527.0 0.0 0.0 527.0 HR 0.0 0.0 423.4 423.4 PL 0.0 294.7 0.0 294.7 FR 0.0 0.0 29.0 29.0 FI 0.0 15.0 0.0 15.0 DE 7.9 0.0 0.0 7.9 LT 0.0 6.7 0.0 6.7 LV 0.0 2.7 0.0 2.7 MD 0.0 0.4 0.0 0.4 MK 0.0 0.1 0.0 0.1Code
import pandas as pd, numpy as np import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt df = pd.read_csv(DATASET_FILE, dtype=str) df['value'] = pd.to_numeric(df['value'], errors='coerce') df = df.dropna(subset=['value']) agg = df.groupby(['geo','siec'])['value'].sum().reset_index() piv = agg.pivot(index='geo', columns='siec', values='value').fillna(0) piv = piv.drop(index=['EU27_2020','EA21'], errors='ignore') piv = piv[piv['O4000'] > 0].sort_values('O4000', ascending=True) piv['other'] = (piv['O4000'] - piv['O4100_TOT'] - piv['O4600']).clip(lower=0) labels = {'TR':'Türkiye','SK':'Slovakia','HU':'Hungary','NL':'Netherlands','GE':'Georgia', 'CZ':'Czechia','HR':'Croatia','PL':'Poland','FR':'France','FI':'Finland', 'DE':'Germany','LT':'Lithuania','LV':'Latvia','MD':'Moldova','MK':'North Macedonia'} names=[labels.get(g,g) for g in piv.index] fig,ax=plt.subplots(figsize=(10,7)) y=np.arange(len(piv)) ax.barh(y,piv['O4100_TOT'],color='#1f4e79',label='Crude oil') ax.barh(y,piv['O4600'],left=piv['O4100_TOT'],color='#e07b39',label='Refined oil products') ax.barh(y,piv['other'],left=piv['O4100_TOT']+piv['O4600'],color='#7f7f7f',label='Other oil (NGL, feedstocks, etc.)') ax.set_yticks(y); ax.set_yticklabels(names) ax.set_xlabel('Thousand tonnes (2025)') ax.set_title('Russian oil exports to European countries, 2025 (by destination, thousand tonnes)') ax.legend(loc='lower right') for i,t in enumerate(piv['O4000']): ax.text(t+250,i,f'{t:,.0f}',va='center',fontsize=9) ax.set_xlim(0,piv['O4000'].max()*1.13) plt.tight_layout(); plt.savefig('russian_oil_2025.svg') print('saved'); print(piv[['O4100_TOT','O4600','other','O4000']].round(1).sort_values('O4000',ascending=False).to_string()) - Code Run 1Dataset: nrg_ti_oilm
Dataset filters for
nrg_ti_oilmFilter Value(s) partner RU siec O4000, O4100_TOT, O4600 unit THS_T sinceTimePeriod 2025-01 untilTimePeriod 2025-12 Program output
siec Total oil & petroleum products Crude oil Refined oil products geo TR 32051.8 15229.3 16776.7 SK 4923.2 4922.9 0.3 HU 3762.0 3762.0 0.0 NL 1715.5 0.0 0.0 GE 1071.8 225.3 846.6 CZ 527.0 527.0 0.0 HR 423.4 0.0 0.0 PL 294.7 0.0 294.7 FR 29.0 0.0 0.0 FI 15.0 0.0 15.0 DE 7.9 7.9 0.0 LT 6.7 0.0 6.7 LV 2.7 0.0 2.7 MD 0.4 0.0 0.4 MK 0.1 0.0 0.1 BE 0.0 0.0 0.0 AT 0.0 0.0 0.0 AL 0.0 0.0 0.0 ES 0.0 0.0 0.0 IT 0.0 0.0 0.0 IE 0.0 0.0 0.0 CY 0.0 0.0 0.0 BG 0.0 0.0 0.0 DK 0.0 0.0 0.0 EE 0.0 0.0 0.0 EL 0.0 0.0 0.0 ME 0.0 0.0 0.0 NO 0.0 0.0 0.0 MT 0.0 0.0 0.0 LU 0.0 0.0 0.0 PT 0.0 0.0 0.0 RS 0.0 0.0 0.0 RO 0.0 0.0 0.0 SI 0.0 0.0 0.0 SE 0.0 0.0 0.0 EU27 total reported (aggregate row): siec Total oil & petroleum products Crude oil Refined oil products geo EU27_2020 11707.2 9219.8 319.5 EA21 7123.4 4930.8 24.7 Sum across listed European countries: siec Total oil & petroleum products 44831.3 Crude oil 24674.4 Refined oil products 17943.2 dtype: float64Code
import pandas as pd, numpy as np df = pd.read_csv(DATASET_FILE, dtype=str) df['value'] = pd.to_numeric(df['value'], errors='coerce') df = df.dropna(subset=['value']) agg = df.groupby(['geo','siec'])['value'].sum().reset_index() piv = agg.pivot(index='geo', columns='siec', values='value').fillna(0) piv = piv.rename(columns={'O4000':'Total oil & petroleum products', 'O4100_TOT':'Crude oil', 'O4600':'Refined oil products'}) # exclude aggregates aggs = ['EU27_2020','EA21'] countries = piv.drop(index=[a for a in aggs if a in piv.index], errors='ignore') countries = countries.sort_values('Total oil & petroleum products', ascending=False) pd.set_option('display.width', 200) print(countries.round(1).to_string()) print() print('EU27 total reported (aggregate row):') print(piv.loc[[a for a in aggs if a in piv.index]].round(1).to_string()) print() print('Sum across listed European countries:') print(countries.sum().round(1))