EU migration flows panel (Eurostat)
Annual international-migration-flows panel from Eurostat's official keyless dissemination API: long-term immigration and emigration totals per European country and year (all ages, both sexes, all citizenships), with net migration, year-on-year changes, each country's share of EU immigration and within-year net-migration ranks. Eurostat observation flags kept verbatim; missing cells are honestly absent, never imputed, and derived metrics never bridge gaps. Who joins this: demographic and labour-supply models join net migration on (geo, year); housing-demand and consumer models read immigration momentum; country-risk desks track net-flow reversals. Eurostat datasets migr_imm1ctz ('Immigration by age group, sex and citizenship') and migr_emi2 ('Emigration by age and sex'). Fills the catalog's EU migration-flows gap: existing migration datasets cover asylum, migrant stocks and Canada/US-internal flows, none the EU-wide immigration/emigration flows.
- Rows
- 1,024
- Columns
- 15
- Source cadence
- Yearly
- Last refreshed
- Oct 9, 2026
- Theme
- demographics
| Column | Type | Description |
|---|---|---|
| year | integer | Observation year (1990 -> latest published, per-geo spans differ); panel join key with geo. (unit: year) |
| year_start | date | First day of the observation year. (unit: date) |
| geo | string | Eurostat country/aggregate code (e.g. DE, FR, EU27_2020). The discontinued United Kingdom series and Kosovo (XK) are excluded per the catalog's Eurostat geo rule. (unit: string) |
| geo_label | string | English label for geo as published by Eurostat. (unit: string) |
| immigration | integer | Long-term immigrants arriving in the reporting country during the year (all ages, both sexes, all citizenships). Eurostat migr_imm1ctz, freq=A, age=TOTAL, sex=T, citizen=TOTAL, agedef=REACH. Counts of persons; null where unpublished, never imputed. (unit: persons) |
| immigration_flag | string | Eurostat observation flag for immigration as published ('p' provisional, 'e' estimated, 'b' break in time series, ...); empty when unflagged. (unit: string) |
| emigration | integer | Long-term emigrants leaving the reporting country during the year (all ages, both sexes). Eurostat migr_emi2, freq=A, age=TOTAL, sex=T, agedef=REACH. Counts of persons; null where unpublished, never imputed. (unit: persons) |
| emigration_flag | string | Eurostat observation flag for emigration as published ('p' provisional, 'e' estimated, 'b' break in time series, ...); empty when unflagged. (unit: string) |
| net_migration | integer | immigration minus emigration, in persons. Negative values are net outflow years (real upstream prints). Null when either leg is missing; never imputed. (unit: persons) |
| immigration_yoy_pct | float | Year-on-year percent change of immigration (exact prior year); null for a geo's first published year or when the prior year is missing (never bridges gaps). (unit: percent) |
| emigration_yoy_pct | float | Year-on-year percent change of emigration (exact prior year); null for a geo's first published year or when the prior year is missing (never bridges gaps). (unit: percent) |
| net_change | float | Absolute year-on-year change in net_migration, in persons (net can cross zero, so a percent change is meaningless). Null when either year's net is missing. (unit: persons) |
| immigration_share_eu27_pct | float | 100 * immigration / the EU27_2020 immigration total in the same year. Null for EU27_2020 itself and where either side is missing. The EU total includes intra-EU moves, so member shares do not sum to 100 unless every member published that year. (unit: percent) |
| net_rank | integer | Within-year rank of net_migration across kept geos (1 = largest net inflow; ties share a rank). (unit: rank) |
| row_hash | string | Deterministic 16-hex sha256 of year + geo + the raw immigration count and flag (idempotency key). (unit: string) |
First 10 sample rows — a preview, not the complete dataset.
| year | year_start | geo | geo_label | immigration | immigration_flag | emigration | emigration_flag | net_migration | immigration_yoy_pct | emigration_yoy_pct | net_change | immigration_share_eu27_pct | net_rank | row_hash |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2,006 | 2006-01-01 | AM | Armenia | 1,335 | — | 8,053 | — | -6,718 | — | — | — | — | 27 | b318bd7b00479b8a |
| 2,007 | 2007-01-01 | AM | Armenia | 1,112 | — | 7,461 | — | -6,349 | -16.704 | -7.351 | 369 | — | 33 | 8d525576456591ca |
| 1,996 | 1996-01-01 | AT | Austria | — | — | 66,050 | — | — | — | — | — | — | — | fb0ca7c94a4bf225 |
| 1,997 | 1997-01-01 | AT | Austria | — | — | 68,585 | — | — | — | 3.838 | — | — | — | 053915c5eba02fa7 |
| 1,998 | 1998-01-01 | AT | Austria | 72,723 | — | 64,272 | — | 8,451 | — | -6.289 | — | — | 13 | 8bdb7daa8c75bd6e |
| 1,999 | 1999-01-01 | AT | Austria | 86,710 | — | 66,923 | — | 19,787 | 19.233 | 4.125 | 11,336 | — | 7 | 35dab8f3c0e92502 |
| 2,000 | 2000-01-01 | AT | Austria | 81,676 | — | 64,472 | — | 17,204 | -5.806 | -3.662 | -2,583 | — | 10 | 767dc42964af870b |
| 2,001 | 2001-01-01 | AT | Austria | 89,928 | — | 72,654 | — | 17,274 | 10.103 | 12.691 | 70 | — | 11 | 57461c2a3e8519ff |
| 2,002 | 2002-01-01 | AT | Austria | 108,125 | b | 74,831 | b | 33,294 | 20.235 | 2.996 | 16,020 | — | 9 | 30c1d21d19df4f07 |
| 2,003 | 2003-01-01 | AT | Austria | 111,869 | — | 71,996 | — | 39,873 | 3.463 | -3.789 | 6,579 | — | 5 | 461f6d5bbc429cfc |
Profiled Oct 9, 2026 from snapshot 20261009T171101Z-53159f534542
Measured- Completeness
- 87.2%
- Rows
- 1,024
- Columns
- 15
- Columns with gaps
- 10
| Column | Missing | Distinct | Range | Distribution |
|---|---|---|---|---|
| yearbigint | 0% | 35 | 1,990 → 2,024median 2,010 | |
| year_startdate | 0% | 36 | Jan 1, 1990 → Jan 1, 2024 | — |
| geovarchar | 0% | 56 | — |
|
| geo_labelvarchar | 0% | 52 | — |
|
| immigrationbigint | 16.6% | 733 | 35 → 6,997,284median 51,792 | 18 outside 1st–99th percentile |
| immigration_flagvarchar | 16.6% | 9 | — |
|
| emigrationbigint | 2.8% | 842 | 76 → 3,166,449median 32,344 | 20 outside 1st–99th percentile |
| emigration_flagvarchar | 2.8% | 7 | — |
|
| net_migrationbigint | 19.4% | 774 | -251,531 → 4,303,275median 13,588 | 18 outside 1st–99th percentile |
| immigration_yoy_pctdouble | 21.8% | 717 | -61.89 → 1,138median 3.64 | 17 outside 1st–99th percentile |
| emigration_yoy_pctdouble | 8% | 943 | -97.91 → 5,646median 1.87 | 20 outside 1st–99th percentile |
| net_changedouble | 24.4% | 985 | -1,309,507 → 2,863,869median 391.5 | 16 outside 1st–99th percentile |
| immigration_share_eu27_pctdouble | 60.5% | 455 | 0.011 → 38.95median 1.45 | 10 outside 1st–99th percentile |
| net_rankbigint | 19.4% | 37 | 1 → 37median 16 | 3 outside 1st–99th percentile |
| row_hashvarchar | 0% | 1,234 | — |
|
- CurrentFile published
20261009T171101Z-53159f534542 · sha256 53159f534542…
1,024 rows · first snapshot
Point any LLM at the metadata endpoint — the documentation above is machine-readable too (JSON-LD + Croissant).
curl "https://datazimuts.com/v1/datasets/eurostat_migration_intel/eu_migration_flows_annual" | jq '{title, rows, columns_count, license}'import requests
ds = requests.get("https://datazimuts.com/v1/datasets/eurostat_migration_intel/eu_migration_flows_annual").json()
print(ds["title"], ds["rows"], "rows")
# Sample rows for an LLM context window
for row in ds.get("sample_rows", [])[:5]:
print(row)API endpoint: https://datazimuts.com/v1/datasets/eurostat_migration_intel/eu_migration_flows_annual
Tip: fetch /llms.txt for the full machine-readable catalog.
Where this data comes from and what was made from it. Other people's work shows as counts; only shared projects are named.
Cite this snapshot
Pinned to snapshot 20261009T171101Z-53159f534542 and its content hash, so readers get exactly the data you used.
Eurostat Migration Flows Intelligence. (2026). EU migration flows panel (Eurostat) [Data set, snapshot 20261009T171101Z-53159f534542, sha256 53159f534542]. Datazimuts. Retrieved 2026-10-10, from https://datazimuts.com/en/datasets/eurostat_migration_intel/eu_migration_flows_annual?snapshot=20261009T171101Z-53159f534542
@misc{dz_eurostat_migration_intel_eu_migration_fl_53159f53,
title = {{EU migration flows panel (Eurostat)}},
author = {{Eurostat Migration Flows Intelligence}},
year = {2026},
publisher = {Datazimuts},
howpublished = {\url{https://datazimuts.com/en/datasets/eurostat_migration_intel/eu_migration_flows_annual?snapshot=20261009T171101Z-53159f534542}},
note = {Snapshot 20261009T171101Z-53159f534542, sha256 53159f53454251b16b2ddc606d02ba6c6d7968308808ff7a3677a19f301747e1; accessed 2026-10-10}
}Embed a table or a chart
Paste this into any page. The embed is pinned to the same snapshot, follows the reader's light or dark setting, and always shows the source, license and a link back.
<iframe src="https://datazimuts.com/embed/chart?dataset=eurostat_migration_intel%2Feu_migration_flows_annual&lang=en&theme=auto&snapshot=20261009T171101Z-53159f534542&x=year&y=year&agg=avg" title="EU migration flows panel (Eurostat)" width="100%" height="380" style="border:0" loading="lazy"></iframe>
Ask about this dataset. Answers come only from its catalog record, measured profile and change history, and list the facts they used.