Skip to Content

Schengen Countries List: All 27 Members of the Schengen Area

The Schengen Area is a zone of 27 European countries that have abolished passport and border controls at their mutual borders. If you build travel, logistics, shipping, or compliance applications that serve European users, understanding Schengen membership is important for border-crossing logic, shipping estimates, and user experience.

This reference lists every Schengen member with their ISO codes, explains how Schengen relates to the EU, and provides code examples for checking membership programmatically.

What Is the Schengen Area?

The Schengen Area was established by the 1985 Schengen Agreement (named after the town of Schengen in Luxembourg). It enables free movement of people across internal borders without passport checks. Key characteristics:

  • 27 member countries with no internal border controls
  • Common visa policy for non-EU visitors (Schengen visa)
  • Shared border security at external borders
  • Not identical to the EU — some EU countries are not in Schengen, and some non-EU countries are

For developers, Schengen membership affects shipping estimates (no customs delays at internal borders), travel planning applications, and visa eligibility calculations.

Quick Access with Code

import { membership } from '@koshmoney/countries/membership'; // Get all 27 Schengen member codes const schengenCountries = membership.getMembers('Schengen'); // ['AT', 'BE', 'CH', 'CZ', 'DE', 'DK', 'EE', 'ES', 'FI', 'FR', // 'GR', 'HR', 'HU', 'IS', 'IT', 'LI', 'LT', 'LU', 'LV', 'MT', // 'NL', 'NO', 'PL', 'PT', 'SE', 'SI', 'SK'] console.log(schengenCountries.length); // 27 // Check if a specific country is in Schengen membership.isSchengen('FR'); // true membership.isSchengen('CH'); // true (non-EU Schengen member) membership.isSchengen('IE'); // false (Ireland opted out) membership.isSchengen('GB'); // false (UK never joined)

All 27 Schengen Members

EU Members in Schengen (23)

CountryAlpha-2Alpha-3NumericEUEurozone
AustriaATAUT040YesYes
BelgiumBEBEL056YesYes
CroatiaHRHRV191YesYes
Czech RepublicCZCZE203Yes
DenmarkDKDNK208Yes
EstoniaEEEST233YesYes
FinlandFIFIN246YesYes
FranceFRFRA250YesYes
GermanyDEDEU276YesYes
GreeceGRGRC300YesYes
HungaryHUHUN348Yes
ItalyITITA380YesYes
LatviaLVLVA428YesYes
LithuaniaLTLTU440YesYes
LuxembourgLULUX442YesYes
MaltaMTMLT470YesYes
NetherlandsNLNLD528YesYes
PolandPLPOL616Yes
PortugalPTPRT620YesYes
SlovakiaSKSVK703YesYes
SloveniaSISVN705YesYes
SpainESESP724YesYes
SwedenSESWE752Yes

Non-EU Schengen Members (4)

CountryAlpha-2Alpha-3NumericEUEFTAEEA
IcelandISISL352YesYes
LiechtensteinLILIE438YesYes
NorwayNONOR578YesYes
SwitzerlandCHCHE756Yes

These four countries participate in Schengen through separate agreements. Iceland, Liechtenstein, and Norway are EEA members; Switzerland has bilateral agreements with the EU. All four are EFTA (European Free Trade Association) members.

import { membership } from '@koshmoney/countries/membership'; // Switzerland: Schengen but not EU or EEA membership.getMemberships('CH'); // { EU: false, SEPA: true, EEA: false, Eurozone: false, Schengen: true } // Norway: Schengen and EEA but not EU membership.getMemberships('NO'); // { EU: false, SEPA: true, EEA: true, Eurozone: false, Schengen: true }

EU Members NOT in Schengen

Four EU member states are not part of the Schengen Area:

CountryAlpha-2Reason
BulgariaBGApplied, awaiting full admission (partial air/sea since 2024)
CyprusCYApplied, pending resolution of Northern Cyprus situation
IrelandIEFormal opt-out (maintains Common Travel Area with UK)
RomaniaROApplied, awaiting full admission (partial air/sea since 2024)

[!NOTE] Bulgaria and Romania joined Schengen for air and sea borders in March 2024 but do not yet have full Schengen membership for land borders. The isSchengen() function reflects the current full membership status per the official Schengen agreement.

import { membership } from '@koshmoney/countries/membership'; import { country } from '@koshmoney/countries'; // Find EU members NOT in Schengen const euMembers = membership.getMembers('EU'); const nonSchengen = euMembers.filter((code) => !membership.isSchengen(code)); nonSchengen.map((code) => country.toName(code)); // ['Bulgaria', 'Cyprus', 'Ireland', 'Romania']

Schengen vs EU vs EEA

GroupSizePurposeNon-EU Members
EU27Political and economic unionNone (by definition)
EEA30Single market accessIceland, Liechtenstein, Norway
Schengen27Border-free travelIceland, Liechtenstein, Norway, Switzerland
SEPA36EUR payment transfers9 non-EU members including UK
Eurozone20EUR as official currencyNone (EU-only institution)

The Schengen Area and the EU have 23 countries in common, but they are not identical. Four EU members are outside Schengen (Bulgaria, Cyprus, Ireland, Romania), and four non-EU members are inside Schengen (Iceland, Liechtenstein, Norway, Switzerland).

Why Developers Need Schengen Checks

Shipping and Logistics

Within the Schengen Area, goods move between countries without border checks. This affects delivery estimates and customs documentation:

import { membership } from '@koshmoney/countries/membership'; function getShippingInfo(originCountry: string, destCountry: string) { const bothSchengen = membership.isSchengen(originCountry) && membership.isSchengen(destCountry); if (bothSchengen) { return { customsRequired: false, estimatedDays: 2, note: 'Schengen internal shipment -- no border delays', }; } const bothEU = membership.isEU(originCountry) && membership.isEU(destCountry); if (bothEU) { return { customsRequired: false, estimatedDays: 3, note: 'EU internal shipment -- customs union applies', }; } return { customsRequired: true, estimatedDays: 5, note: 'International shipment -- customs clearance required', }; } getShippingInfo('DE', 'FR'); // { customsRequired: false, estimatedDays: 2, note: 'Schengen internal...' } getShippingInfo('DE', 'IE'); // { customsRequired: false, estimatedDays: 3, note: 'EU internal...' } getShippingInfo('DE', 'US'); // { customsRequired: true, estimatedDays: 5, note: 'International...' }

Travel and Visa Applications

For travel platforms, Schengen membership determines visa requirements. A Schengen visa grants access to all 27 Schengen countries:

import { membership } from '@koshmoney/countries/membership'; import { country } from '@koshmoney/countries'; function getSchengenTravelInfo(countryCode: string) { if (membership.isSchengen(countryCode)) { return { visaType: 'Schengen visa covers this country', borderCheck: false, schengenDaysApply: true, }; } if (membership.isEU(countryCode)) { return { visaType: 'Separate visa may be required', borderCheck: true, schengenDaysApply: false, }; } return { visaType: 'Country-specific visa required', borderCheck: true, schengenDaysApply: false, }; }

User Location Detection

For applications that detect user location and adjust content, Schengen membership can inform whether cross-border movement is likely:

import { membership } from '@koshmoney/countries/membership'; // Get all membership info at once for a user's country function getEuropeanContext(countryCode: string) { const memberships = membership.getMemberships(countryCode); return { isEuropean: memberships.EU || memberships.EEA || memberships.Schengen, gdprApplies: memberships.EEA, sepaAvailable: memberships.SEPA, euRegulations: memberships.EU, borderFreeTravel: memberships.Schengen, usesEuro: memberships.Eurozone, }; } getEuropeanContext('CH'); // { // isEuropean: true, // gdprApplies: false, // sepaAvailable: true, // euRegulations: false, // borderFreeTravel: true, // usesEuro: false, // }

Building a Schengen Country Dropdown

import { membership } from '@koshmoney/countries/membership'; import { country } from '@koshmoney/countries'; // Dropdown of Schengen countries for a travel form const schengenOptions = membership.getMembers('Schengen') .map((code) => ({ value: code, label: country.toName(code), isEU: membership.isEU(code), })) .sort((a, b) => (a.label || '').localeCompare(b.label || '')); // Group by EU / non-EU for an optgroup dropdown const euSchengen = schengenOptions.filter((c) => c.isEU); const nonEUSchengen = schengenOptions.filter((c) => !c.isEU);

Common Mistakes

Assuming Schengen equals the EU. They have different members. Switzerland and Norway are in Schengen but not the EU. Ireland and Cyprus are in the EU but not Schengen. Using isEU() when you mean isSchengen() (or vice versa) produces incorrect results.

Forgetting the non-EU Schengen members. Iceland, Liechtenstein, Norway, and Switzerland are full Schengen members. Excluding them from border-free shipping calculations or travel planning is a bug.

Treating Schengen as a customs union. Schengen eliminates passport controls, not customs checks. The EU Customs Union is separate. Switzerland is in Schengen but not the EU Customs Union, so goods crossing the Swiss border may still require customs declarations even though people cross freely.

Hardcoding the member list. Bulgaria and Romania are in the process of joining. Membership changes over time — use a maintained library rather than a static array.

Summary

The Schengen Area has 27 members: 23 EU member states plus Iceland, Liechtenstein, Norway, and Switzerland. It enables border-free movement of people and affects shipping logistics, travel planning, and visa calculations. The @koshmoney/countries library provides membership.isSchengen() and membership.getMembers('Schengen') for reliable programmatic checks.