Quick answer: OCPI 2.2.1 is a superset of OCPI 2.1.1 with three structural changes that matter most. (1) Roles: 2.2.1 adds Hub, NSP, NAP, and SCSP on top of 2.1.1's CPO/EMSP/OTHER. (2) Modules: 2.2.1 adds ChargingProfiles (smart charging through the roaming chain) and HubClientInfo (hub-aware participant discovery). (3) Identifiers: 2.1.1 uses ISO 3166-1 alpha-3 country codes (FRA, NLD); 2.2.1 switches to alpha-2 (FR, NL) plus a separate party_id. OCPI 2.2.1 also adds a 4xxx Hub-error status-code class and a third credentials token (Token C) for hub-mediated routing.
OCPI 2.1.1 and OCPI 2.2.1 are the two versions most EV charging teams evaluate when they build roaming integrations, both published by the EVRoaming Foundation. The specifications and reference schemas are hosted on GitHub at ocpi/ocpi. OCPI 2.1.1 remains a common baseline for partner interoperability, while OCPI 2.2.1 expands the protocol for hubs, smarter tariff handling, and charging-profile workflows.
If you need version-specific validation, start with OCPI 2.1.1 testing and OCPI 2.2.1 testing.
If you are preparing for roaming rollout or partner onboarding, continue with OCPI roaming testing or book an OCPI demo.
What Are the Key Differences Between OCPI 2.1.1 and 2.2.1?
| Feature | OCPI 2.1.1 | OCPI 2.2.1 |
|---|---|---|
| Core roaming modules | Yes | Yes |
| Credentials + version discovery | Yes | Yes |
| Locations, Sessions, CDRs, Tariffs, Tokens, Commands | Yes | Yes |
| Roles | CPO, EMSP, OTHER (no Hub role) | CPO, EMSP, HUB, NSP, NAP, SCSP, OTHER |
| Country codes | ISO 3166-1 alpha-3 (e.g. FRA, NLD, DEU) |
ISO 3166-1 alpha-2 (e.g. FR, NL, DE) plus separate party_id |
| Hub support | No native Hub role; hubs operate as CPO/eMSP peers | Native HUB role with hub-aware routing headers (OCPI-from-* / OCPI-to-*) |
| HubClientInfo module | No | Yes |
| ChargingProfiles module | No | Yes |
| Credentials handshake | Token A → Token B | Token A → Token B → Token C (hub-aware) |
| Status codes | 1xxx success, 2xxx client, 3xxx server | Same plus 4xxx Hub errors |
| Tariff model | Core pricing model | Richer tariff metadata and structure |
| Migration difficulty | Lower implementation surface | Larger implementation surface |
| Best fit | Direct roaming partners and baseline interoperability | Hubs, smart charging, and broader future-ready roaming |
The Short Answer
Choose OCPI 2.1.1 when you need the fastest path to stable roaming interoperability with the core modules: credentials, locations, sessions, CDRs, tariffs, tokens, and commands.
Choose OCPI 2.2.1 when you need hub-oriented behavior, smarter charging workflows, or a broader protocol surface for future roaming requirements.
In practice, many teams still need to support both: 2.1.1 for existing partner compatibility and 2.2.1 for newer integrations.
By the numbers — as of 2025, per the EVRoaming Foundation and the published OCPI specifications:
- OCPI 2.1.1 defines 6 modules (Locations, Sessions, CDRs, Tariffs, Tokens, Commands) plus Credentials and Versions. Roles: CPO, EMSP, OTHER.
- OCPI 2.2.1 defines 8 modules — the same 6 plus ChargingProfiles and HubClientInfo. Roles add Hub, NSP, NAP, SCSP.
- Country codes: 2.1.1 uses ISO 3166-1 alpha-3 (
FRA,NLD,DEU); 2.2.1 switches to alpha-2 + a separateparty_id. - Status codes: 2.1.1 uses ranges 1xxx / 2xxx / 3xxx; 2.2.1 adds a 4xxx Hub-error class (15 codes).
- Credentials handshake: 2.1.1 uses Token A → Token B (2 tokens); 2.2.1 uses Token A → Token B → Token C (3 tokens) for hub-aware routing.
What Stays the Same Between the Two Versions?
The good news is that the two versions share the same core model:
- REST APIs over HTTPS
- credentials handshake and token exchange
- version discovery through
/versions - core roaming entities such as locations, EVSEs, sessions, CDRs, tariffs, and tokens
- CPO and eMSP role separation
That means an upgrade from 2.1.1 to 2.2.1 is usually not a full rewrite. It is more often an expansion of your existing roaming implementation.
Where Does OCPI 2.2.1 Add Real Value?
1. Hub-Centric Integrations
OCPI 2.2.1 is a better fit for hub-connected ecosystems because it adds structures that are more practical for multi-party roaming environments. The most visible example is HubClientInfo, which helps systems exchange participant information in hub-based topologies.
If your roadmap includes hub onboarding, version 2.2.1 is usually the safer long-term choice.
2. ChargingProfiles
OCPI 2.2.1 introduces ChargingProfiles, which matters when smart charging needs to pass through the roaming chain instead of staying entirely inside the local CPO backend.
This becomes relevant when:
- an eMSP wants to influence charging behavior
- a roaming workflow needs schedule-aware energy management
- the backend stack must coordinate with OCPP 2.0.1 smart charging flows, the charger-side protocol maintained by the Open Charge Alliance
3. Richer Tariff and Field Coverage
OCPI 2.2.1 gives teams more expressive tariff and metadata structures. That matters when pricing presentation, settlement clarity, or country-specific compliance expectations become stricter.
How Do the Modules Compare?
Credentials and Version Discovery
No major conceptual change here. Both versions rely on the same practical sequence:
GET /versionsGET /versions/{version}POST /credentials- token exchange and endpoint discovery
This is why many teams can run both versions side by side without changing the whole architecture.
Locations, Sessions, and CDRs
Both versions support the core data flows roaming teams need every day:
- publish charger locations and EVSE data
- exchange live or near-real-time session updates
- submit CDRs for settlement and invoicing
For many operators, this is enough to ship a production roaming connection on 2.1.1.
Tokens and Commands
Again, both versions cover the main operational paths:
- driver token synchronization
- remote start and stop behavior
- reservation and unlock style command flows
If your product only needs baseline roaming enablement, 2.1.1 can remain perfectly serviceable.
ChargingProfiles
This is one of the clearest reasons to move to 2.2.1. When your roaming program needs charging control beyond static authorization and billing, 2.2.1 gives you the protocol surface to model it.
HubClientInfo
This is the other major differentiator. Hub-oriented roaming is easier to reason about in 2.2.1 because the protocol acknowledges those integration patterns more explicitly.
When Should You Choose OCPI 2.1.1?
Choose OCPI 2.1.1 if:
- you need fast partner onboarding with the core roaming modules
- your partners already standardize on 2.1.1
- you do not need ChargingProfiles right now
- your current architecture is direct CPO-to-eMSP interoperability rather than hub-heavy orchestration
- you want a narrower implementation scope for the first production release
For many teams, 2.1.1 is the right operational baseline and remains worth supporting for years.
When Should You Choose OCPI 2.2.1?
Choose OCPI 2.2.1 if:
- you need hub integration workflows
- you need
HubClientInfo - you need
ChargingProfiles - your tariff and metadata requirements are growing
- you want to reduce the risk of building against an older functional baseline while your product roadmap expands
If you are building a newer roaming platform from scratch, 2.2.1 is often the better strategic default.
Should You Support Both OCPI Versions?
The safest commercial approach is often:
- support OCPI 2.1.1 for baseline compatibility
- support OCPI 2.2.1 for advanced and future-facing integrations
This mirrors what many backend teams already do on the charger side with OCPP 1.6 testing and OCPP 2.0.1 testing.
How Do You Migrate from OCPI 2.1.1 to 2.2.1?
Step 1: Keep Your Core Modules Stable
Before adding 2.2.1-only features, make sure your 2.1.1 baseline is fully reliable:
- credentials lifecycle
- locations synchronization
- sessions and CDR exchange
- token authorization
- command callbacks and error handling
Step 2: Add Version-Aware Routing
Make sure your implementation can distinguish version-specific endpoints and payload handling cleanly. This reduces regression risk and lets you run 2.1.1 and 2.2.1 side by side.
Step 3: Add 2.2.1-Only Modules Deliberately
Treat ChargingProfiles and HubClientInfo as explicit additions, not incidental changes. They usually need:
- new payload validation
- new persistence models
- new async workflow handling
- new interoperability tests
Step 4: Test with Simulated Counterparties
Do not wait for a live roaming partner or hub to discover payload mismatches. Simulate the opposite party and test the full flow before launch with OCPI roaming testing.
Step 5: Validate Mixed-Version Behavior
If your platform will support both versions, test:
- 2.1.1-only partner flows
- 2.2.1-only partner flows
- shared core modules across both versions
- error handling when payload expectations diverge
Example Decision Framework
| Situation | Recommended Version |
|---|---|
| Launching a simple direct roaming integration | OCPI 2.1.1 |
| Connecting to hub-oriented ecosystems | OCPI 2.2.1 |
| Need smart charging over roaming | OCPI 2.2.1 |
| Need maximum compatibility with existing partners | OCPI 2.1.1 plus 2.2.1 roadmap |
| Building a future-facing roaming platform | Support both, prioritize 2.2.1 depth |
Frequently Asked Questions
Is OCPI 2.2.1 backward compatible with 2.1.1?
Not automatically in the sense of using identical endpoints and payload expectations everywhere. The versions are closely related, but your implementation still needs explicit version-aware handling.
Should I skip OCPI 2.1.1 and only implement 2.2.1?
Only if you are certain your target partners and hubs do not require 2.1.1. Many teams still need 2.1.1 for practical interoperability.
Is ChargingProfiles the main reason to adopt 2.2.1?
It is one of the strongest reasons, especially for smart charging and advanced roaming workflows. Hub support is the other big reason.
What is the safest production strategy?
Support the 2.1.1 baseline cleanly, then expand to 2.2.1 where partner demand or product scope requires it.



