Sign in

Concessio IDs

A Concessio ID is the canonical 12-character identifier assigned to every infrastructure concession in the Concessio database — a stable, machine-readable, citation-grade reference.

Last updated July 29, 2026

A Concessio ID is the canonical 12-character identifier assigned to every infrastructure concession in the Concessio database. It functions for infrastructure concessions the way ISIN functions for securities or CUSIP functions for North American debt and equity instruments — a stable, machine-readable, citation-grade reference.

Concessio IDs are stable for the life of the concession. They do not change if the asset is renamed, sold, restructured, or transferred between operators. Cite them in filings, press releases, research reports, term sheets, and contracts. The registry is free and public — no authentication required for ID lookups.

Quick example. The Lyon-Saint Exupéry Airport concession:

concessio.io/id/FR10C0000401

What is the format of a Concessio ID?

The 12-character format is CC-AA-S-NNNNNN-K, displayed without hyphens in storage and with hyphens for human reading.

Stored:    FR10C0000401
Display:   FR-10-C-000040-1

CC      France                    (ISO 3166-1 alpha-2)
AA      10  Airport               (asset class code)
S       C   Concession            (structure code)
NNNNNN  000040                    (sequence within prefix)
K       1                         (Luhn check digit)

Asset class codes group infrastructure into families. The first digit indicates the family (10s transport, 20s utilities, 30s environmental, 40s social); the second digit identifies the specific asset class:

CodeAsset classFamily
10AirportTransport
11Toll RoadTransport
12PortTransport
13RailTransport
14MarinaTransport
20WaterUtilities
21Power DistributionUtilities
22Gas DistributionUtilities
23District HeatingUtilities
30WasteEnvironmental
40SocialSocial
99Other InfrastructureOther

Structure codes identify the contract type:

CodeStructure
CConcession (pure operational)
BBOT — Build-Operate-Transfer
OBOOT — Build-Own-Operate-Transfer
TBTO — Build-Transfer-Operate
WBOO — Build-Own-Operate
DDBFOM — Design-Build-Finance-Operate-Maintain
FDBFO — Design-Build-Finance-Operate
RROT — Rehabilitate-Operate-Transfer
LLease (long-term)
AAffermage
MManagement Contract
PPPP — Public-Private Partnership (generic)
XOther / unknown

How do I look up a Concessio ID?

Every Concessio ID resolves to a free public registry page and a JSON lookup endpoint. No API key required.

TypeURL pattern
HTML pagehttps://concessio.io/id/{ID}
JSON APIhttps://concessio.io/api/v1/id/{ID}

Live examples

Click any ID below to see its public registry page:

Concessio IDAssetCountrySector
FR10C0000401Lyon-Saint Exupéry AirportFranceAirport
CL11C0000011Accesos a ValdiviaChileToll Road
AU12C0000014Port Botany SydneyAustraliaPort
GB13X0000155Eurotunnel Freight Shuttle ServiceUnited KingdomRail
IN10R0000014Delhi Indira Gandhi Airport ExpansionIndiaAirport
ES11C0000103R-3 and R-5 Radial Autopistas MadridSpainToll Road
PT11P0000034Transmontana MotorwayPortugalToll Road
BR20R0000019Rio de Janeiro Water Bloc 4BrazilWater

JSON response

GET https://concessio.io/api/v1/id/CL11C0000011

{
  "id": "CL11C0000011",
  "display_id": "CL-11-C-000001-1",
  "name": "Accesos a Valdivia",
  "country": "Chile",
  "country_code": "CL",
  "sector": "Toll Road",
  "sector_family": "Transport",
  "asset_class_code": "11",
  "contract_type": "Concession",
  "structure_code": "C",
  "structure_name": "Concession (pure operational)",
  "start_date": "2010-01-01",
  "end_date": "2035-01-01",
  "operator": null,
  "grantor": "Ministerio de Obras Publicas (MOP)",
  "registry_url": "https://concessio.io/id/CL11C0000011",
  "retrieved_at": "2026-04-22T12:00:00.000Z"
}

How is a Concessio ID validated?

The 12th character is a Luhn check digit using the ISIN variant (letters expanded to two-digit numbers, A=10 through Z=35). The check digit catches accidental typos and casually fabricated identifiers before they ever reach the database. A Concessio ID with a wrong check digit returns 400 invalid_check_digit from the API.

// Reference implementation — JavaScript
function validateConcessioId(id) {
  const s = String(id).replace(/[^A-Z0-9]/gi, "").toUpperCase();
  if (!/^[A-Z]{2}[0-9]{2}[A-Z0-9][0-9]{6}[0-9]$/.test(s)) return false;
  let expanded = "";
  for (const ch of s.slice(0, 11)) {
    const c = ch.charCodeAt(0);
    if (c >= 48 && c <= 57) expanded += ch;
    else if (c >= 65 && c <= 90) expanded += String(c - 55);
  }
  let total = 0, alt = true;
  for (let i = expanded.length - 1; i >= 0; i--) {
    const d = parseInt(expanded[i], 10);
    if (alt) { const dd = d * 2; total += dd >= 10 ? Math.floor(dd / 10) + (dd % 10) : dd; }
    else total += d;
    alt = !alt;
  }
  const expected = String((10 - (total % 10)) % 10);
  return expected === s[11];
}

validateConcessioId("CL11C0000011");      // true
validateConcessioId("CL-11-C-000001-1");  // true (hyphens allowed)
validateConcessioId("CL11C0000099");      // false (bad check digit)

Error responses

StatusCodeWhen
400invalid_formatNot 12 alphanumeric characters in the canonical layout
400invalid_check_digitFormat correct but Luhn fails — typo or fabricated
404not_foundFormat and Luhn valid but ID is not in the registry
200Concession found, full record returned

Concessio mints a Concessio ID for every infrastructure concession ingested into the database — currently 22,000+ concessions across 185 countries and 15 asset classes. The registry adds new IDs as new concessions are ingested. IDs are never reused, never re-issued, and never reassigned.