Skip to Content

Spanish Autonomous Community Codes: Complete ISO 3166-2 Guide

Spain is divided into 17 autonomous communities (comunidades autonomas), 2 autonomous cities, and 50 provinces, all with standardized ISO 3166-2 codes. These codes are used in address forms, shipping, tax calculations, and applications serving the Spanish market.

This page lists every Spanish community and key provinces, and shows how to work with them using @koshmoney/countries.

Autonomous Communities (17)

Spain’s 17 autonomous communities are the primary administrative divisions, each with significant self-governing powers:

CodeNameCapitalProvinces
ES-ANAndaluciaSeville8
ES-ARAragonZaragoza3
ES-ASAsturias, Principado deOviedo1
ES-CBCantabriaSantander1
ES-CLCastilla y LeonValladolid9
ES-CMCastilla-La ManchaToledo5
ES-CNCanariasLas Palmas / Santa Cruz2
ES-CTCatalunyaBarcelona4
ES-EXExtremaduraMerida2
ES-GAGaliciaSantiago de Compostela4
ES-IBIlles BalearsPalma1
ES-MCMurcia, Region deMurcia1
ES-MDMadrid, Comunidad deMadrid1
ES-NCNavarraPamplona1
ES-PVEuskal Herria (Basque Country)Vitoria-Gasteiz3
ES-RILa RiojaLogrono1
ES-VCValenciana, ComunidadValencia3

Autonomous Cities (2)

Spain’s two autonomous cities are located in North Africa:

CodeNameType
ES-CECeutaAutonomous city in north africa
ES-MLMelillaAutonomous city in north africa

Key Provinces

Spain has 50 provinces (type “Province” in ISO 3166-2). Here are the most commonly referenced:

CodeProvinceCommunity
ES-MMadridMadrid
ES-BBarcelonaCatalunya
ES-VValenciaComunidad Valenciana
ES-SESevillaAndalucia
ES-BIBizkaiaBasque Country
ES-MAMalagaAndalucia
ES-ZZaragozaAragon
ES-GCLas PalmasCanarias
ES-TFSanta Cruz de TenerifeCanarias
ES-CA CorunaGalicia
ES-CACadizAndalucia
ES-GRGranadaAndalucia
ES-BABadajozExtremadura
ES-SASalamancaCastilla y Leon
ES-SSGipuzkoaBasque Country

[!NOTE] Some Spanish provinces use names in regional languages. Codes marked with asterisks in the ISO data (e.g. Alacant*, Bizkaia*, Gipuzkoa*) indicate names in Catalan, Basque, or other co-official languages.

Understanding Spanish Subdivision Codes

Spain uses alphabetic codes of varying lengths (1-2 letters):

ComponentExampleMeaning
Country prefixESSpain (Espana)
Separator-Standard delimiter
Community/Province codeCTCatalunya
Full codeES-CTCatalunya, Spain

Community codes are typically 2 letters, while some historical province codes use a single letter (ES-B for Barcelona, ES-M for Madrid).

Using Spanish Codes in Code

Look Up a Subdivision

import { subdivision } from '@koshmoney/countries'; // Community subdivision.whereCode('ES-CT'); // { code: 'ES-CT', name: 'Catalunya', type: 'Autonomous community', countryCode: 'ES' } // Province subdivision.whereCode('ES-B'); // { code: 'ES-B', name: 'Barcelona', type: 'Province', countryCode: 'ES' } // Autonomous city subdivision.whereCode('ES-CE'); // { code: 'ES-CE', name: 'Ceuta', type: 'Autonomous city in north africa', countryCode: 'ES' }

Get All Spanish Subdivisions

import { subdivision } from '@koshmoney/countries'; const allES = subdivision.forCountry('ES'); // Filter by type const communities = allES.filter(s => s.type === 'Autonomous community'); console.log(communities.length); // 17 const provinces = allES.filter(s => s.type === 'Province'); console.log(provinces.length); // 50 const cities = allES.filter(s => s.type === 'Autonomous city in north africa'); console.log(cities.length); // 2

Validate a Code

import { subdivision } from '@koshmoney/countries'; subdivision.isValidCode('ES-CT'); // true (Catalunya) subdivision.isValidCode('ES-M'); // true (Madrid province) subdivision.isValidCode('ES-XX'); // false subdivision.isValidRegion('ES', 'AN'); // true (Andalucia)

Tree-Shaking for Spanish Data Only

import '@koshmoney/countries/subdivision/ES'; import { whereCode, forCountry } from '@koshmoney/countries/subdivision'; const catalunya = whereCode('ES-CT'); const allES = forCountry('ES');

Postal Code System

Spain uses a 5-digit postal code system. The first two digits indicate the province:

First DigitsProvince
01Alava
08Barcelona
15A Coruna
28Madrid
29Malaga
38Santa Cruz de Tenerife
41Sevilla
46Valencia
48Bizkaia
50Zaragoza
51Ceuta
52Melilla
import { postalCode } from '@koshmoney/countries'; postalCode.isValid('ES', '28001'); // true (Madrid) postalCode.isValid('ES', '08001'); // true (Barcelona) postalCode.isValid('ES', '1234'); // false (only 4 digits)

EU Membership and Currency

Spain is an EU member and uses the Euro:

import { membership } from '@koshmoney/countries/membership'; import { currency } from '@koshmoney/countries/currency'; membership.getMemberships('ES'); // { EU: true, SEPA: true, EEA: true, Eurozone: true, Schengen: true } currency.getCurrency('ES'); // { code: 'EUR', symbol: '\u20ac', name: 'Euro' }

[!TIP] The Canary Islands (ES-CN) are part of the EU but have a special tax regime (IGIC instead of IVA/VAT). Ceuta and Melilla also have distinct tax rules (IPSI).

Common Use Cases

Address Forms

Spanish address forms typically require the province. Build a province dropdown:

import { subdivision } from '@koshmoney/countries'; const provinces = subdivision.forCountry('ES') .filter(s => s.type === 'Province') .sort((a, b) => a.name.localeCompare(b.name, 'es')); const dropdown = provinces.map(p => ({ label: p.name, value: p.code, }));

IVA Tax Calculation

Spanish VAT (IVA) is 21% on the peninsula, but different rates apply in special territories:

function getVATRate(communityCode: string): number { if (communityCode === 'ES-CN') return 7; // Canary Islands (IGIC) if (communityCode === 'ES-CE' || communityCode === 'ES-ML') return 0.5; // Ceuta/Melilla (IPSI) return 21; // Standard IVA }

Regional Language Support

Spain has several co-official languages. Community codes help determine language preferences:

const communityLanguages: Record<string, string[]> = { 'ES-CT': ['ca', 'es'], // Catalan + Spanish 'ES-PV': ['eu', 'es'], // Basque + Spanish 'ES-GA': ['gl', 'es'], // Galician + Spanish 'ES-VC': ['ca', 'es'], // Valencian (Catalan) + Spanish 'ES-IB': ['ca', 'es'], // Catalan + Spanish 'ES-NC': ['eu', 'es'], // Basque + Spanish (parts) }; function getLanguages(communityCode: string): string[] { return communityLanguages[communityCode] ?? ['es']; }

Shipping Zones

Shipping to the Canary Islands, Ceuta, and Melilla requires customs declarations:

function requiresCustoms(code: string): boolean { return ['ES-CN', 'ES-CE', 'ES-ML'].includes(code); }