Skip to Content

Complete List of EU Country Codes for Developers

The European Union has 27 member states as of 2024 (post-Brexit). If you are building applications that handle EU compliance, GDPR, SEPA payments, or Eurozone currency logic, you need a reliable and up-to-date reference for these codes.

This guide provides every EU-related membership list, explains the differences between EU, EEA, SEPA, Eurozone, and Schengen, and shows how to check membership programmatically with @koshmoney/countries.

EU Member States (27 Countries)

Alpha-2Alpha-3CountryJoined
ATAUTAustria1995
BEBELBelgium1957
BGBGRBulgaria2007
HRHRVCroatia2013
CYCYPCyprus2004
CZCZECzech Republic2004
DKDNKDenmark1973
EEESTEstonia2004
FIFINFinland1995
FRFRAFrance1957
DEDEUGermany1957
GRGRCGreece1981
HUHUNHungary2004
IEIRLIreland1973
ITITAItaly1957
LVLVALatvia2004
LTLTULithuania2004
LULUXLuxembourg1957
MTMLTMalta2004
NLNLDNetherlands1957
PLPOLPoland2004
PTPRTPortugal1986
ROROURomania2007
SKSVKSlovakia2004
SISVNSlovenia2004
ESESPSpain1986
SESWESweden1995

Understanding European Membership Groups

The EU is just one of several overlapping membership structures in Europe. Each has different implications for developers:

EU vs EEA vs SEPA vs Eurozone vs Schengen

GroupMembersPurposeKey for
EU27 countriesPolitical and economic unionGDPR, regulations, VAT
EEA30 countries (EU + IS, LI, NO)Single market accessGDPR applicability
SEPA36 countriesEuro payment transfersPayment processing
Eurozone20 countriesUse EUR currencyCurrency handling
Schengen27 countriesBorder-free travelUser location, shipping

EEA Members (30 Countries)

All 27 EU members plus:

CodeCountryNote
ISIcelandEFTA member
LILiechtensteinEFTA member
NONorwayEFTA member

GDPR applies to all EEA countries, not just EU members. This is a critical distinction for compliance.

SEPA Members (36 Countries)

All 30 EEA members plus:

CodeCountryNote
CHSwitzerlandEFTA, not EEA
MCMonacoVia France
SMSan MarinoVia Italy
ADAndorra
VAVatican City
GBUnited KingdomRemains in SEPA post-Brexit
GIGibraltarUK territory

Eurozone Members (20 Countries)

These EU members use the Euro as their official currency:

CodeCountryAdopted EUR
ATAustria1999
BEBelgium1999
CYCyprus2008
EEEstonia2011
FIFinland1999
FRFrance1999
DEGermany1999
GRGreece2001
HRCroatia2023
IEIreland1999
ITItaly1999
LVLatvia2014
LTLithuania2015
LULuxembourg1999
MTMalta2008
NLNetherlands1999
PTPortugal1999
SKSlovakia2009
SISlovenia2007
ESSpain1999

EU members not in the Eurozone: Bulgaria, Czech Republic, Denmark, Hungary, Poland, Romania, Sweden.

Schengen Area (27 Countries)

22 EU members plus 4 non-EU members (Iceland, Liechtenstein, Norway, Switzerland). EU members not in Schengen: Bulgaria, Cyprus, Ireland, Romania.

Checking Membership with @koshmoney/countries

Installation

npm install @koshmoney/countries

Check Individual Membership

import { membership } from '@koshmoney/countries/membership'; membership.isEU('FR'); // true membership.isEU('GB'); // false (post-Brexit) membership.isEU('NO'); // false (EEA but not EU) membership.isEEA('NO'); // true membership.isEEA('CH'); // false membership.isSEPA('CH'); // true membership.isSEPA('GB'); // true (still in SEPA) membership.isEurozone('DE'); // true membership.isEurozone('SE'); // false (Sweden uses SEK) membership.isSchengen('CH'); // true membership.isSchengen('IE'); // false

Get All Memberships at Once

import { membership } from '@koshmoney/countries/membership'; membership.getMemberships('FR'); // { EU: true, SEPA: true, EEA: true, Eurozone: true, Schengen: true } membership.getMemberships('NO'); // { EU: false, SEPA: true, EEA: true, Eurozone: false, Schengen: true } membership.getMemberships('GB'); // { EU: false, SEPA: true, EEA: false, Eurozone: false, Schengen: false }

Get All Members of a Group

import { membership } from '@koshmoney/countries/membership'; const euCountries = membership.getMembers('EU'); // ['AT', 'BE', 'BG', 'CY', 'CZ', 'DE', 'DK', 'EE', 'ES', 'FI', 'FR', 'GR', 'HR', 'HU', 'IE', 'IT', 'LT', 'LU', 'LV', 'MT', 'NL', 'PL', 'PT', 'RO', 'SE', 'SI', 'SK'] const eurozoneCountries = membership.getMembers('Eurozone'); // ['AT', 'BE', 'CY', 'DE', 'EE', 'ES', 'FI', 'FR', 'GR', 'HR', 'IE', 'IT', 'LT', 'LU', 'LV', 'MT', 'NL', 'PT', 'SI', 'SK']

Combine with Country Data

import { country } from '@koshmoney/countries'; import { membership } from '@koshmoney/countries/membership'; // Get full country data for all EU members const euMembers = membership.getMembers('EU'); const euCountryData = euMembers.map(code => country.whereAlpha2(code)); // Build a labeled list euCountryData.forEach(c => { if (c) console.log(`${c.alpha2} (${c.alpha3}) - ${c.name}`); });

Practical Applications

GDPR User Detection

import { membership } from '@koshmoney/countries/membership'; function isGDPRApplicable(countryCode: string): boolean { // GDPR applies to EEA countries, not just EU return membership.isEEA(countryCode); } isGDPRApplicable('DE'); // true (EU member) isGDPRApplicable('NO'); // true (EEA member) isGDPRApplicable('US'); // false

SEPA Payment Eligibility

import { membership } from '@koshmoney/countries/membership'; function canUseSEPA(countryCode: string): boolean { return membership.isSEPA(countryCode); } canUseSEPA('GB'); // true -- UK remains in SEPA canUseSEPA('US'); // false

Dynamic Currency Display

import { membership } from '@koshmoney/countries/membership'; import { currency } from '@koshmoney/countries/currency'; function getDisplayCurrency(countryCode: string) { if (membership.isEurozone(countryCode)) { return { code: 'EUR', symbol: '\u20ac' }; } return currency.getCurrency(countryCode); } getDisplayCurrency('DE'); // { code: 'EUR', symbol: '\u20ac' } getDisplayCurrency('SE'); // { code: 'SEK', symbol: 'kr', name: 'Swedish Krona' }

Common Mistakes

Treating EU and EEA as the same thing. Norway, Iceland, and Liechtenstein are in the EEA but not the EU. GDPR applies to the EEA, so excluding these three countries from compliance logic is a bug.

Assuming the UK left SEPA. The UK left the EU in 2020 but remains a SEPA member. EUR transfers to and from UK banks still use SEPA rails.

Hardcoding membership lists. Membership changes over time (Croatia joined the Eurozone in 2023). Use a maintained library rather than hardcoded arrays.