What Beckn changes
The default shape of a digital market is a platform in the middle. Buyers join it, sellers join it, and the platform owns discovery, transactions and the relationship with both sides.
Beckn removes the middle. It specifies a protocol that buyer-side and provider-side software use to transact directly, so any compliant app can discover and buy from any compliant provider without either having integrated with the other beforehand. Discovery is federated rather than centralised.
For EV charging in India this matters because the alternative is what already happened: a driver carrying five apps because five networks each built their own walled garden. On an open network one app reaches every operator, and operators compete on service rather than on app installs.
The actors
| Acronym | Meaning | In EV charging |
|---|---|---|
| BAP | Beckn Application Platform | The consumer-facing app — typically an eMSP |
| BPP | Beckn Provider Platform | The provider platform — typically a CPO |
| BG | Beckn Gateway | Broadcasts discovery — see the gateway |
| NO | Network Operator | Governance, onboarding and the registry |
| CDS | Catalog Discovery Service | Enables discovery across BPPs |
| EVSE | Electric Vehicle Supply Equipment | An individual charging unit |
The specification uses standard requirement language throughout — MUST, MUST NOT, SHOULD and MAY — and the distinction is worth respecting when assessing whether an implementation is conformant or merely functional.
The transaction lifecycle
Every action has an on_ twin. The BAP sends; the BPP acknowledges immediately and calls back later. Each of these has a full guide.
| Action | Callback | Does |
|---|---|---|
| search | on_search | Broadcast discovery — returns catalogues of chargers and prices |
| select | on_select | Narrow to one provider and item; returns a quote |
| init | on_init | Attach billing; returns payment and cancellation terms |
| confirm | on_confirm | Create the order; returns the authorization token |
| status | on_status | Current fulfilment state and live charging progress |
| update | on_update | Change a live order — including stopping a charge |
| cancel | on_cancel | Void an order before fulfilment |
The four phases
- Discovery. The BAP searches; catalogues stream back from multiple BPPs over several seconds.
- Selection and booking. select, init and confirm turn a listing into an order with an authorization token.
- Charging session. The driver presents the token, the session starts, and status and update track it.
- Completion. The BPP issues the final settled quote; billing follows from it.
Cross-cutting concepts
| Concept | Why it matters |
|---|---|
| The context object | Every message carries it. transaction_id threads the whole transaction; message_id pairs one request with its callback. Correlation depends entirely on getting these right. |
| Signing and the registry | On an open network you have never met most participants. Ed25519 signatures plus a network registry are what make an inbound callback trustworthy. |
| The gateway and ACK/NACK | How one search reaches every provider, why the gateway leaves after discovery, and why an ACK is a receipt rather than a result. |
Everything is asynchronous
This is the single structural fact that shapes every Beckn implementation. There are no synchronous responses carrying business data. A request receives 200 ACK — meaning accepted for processing — and the answer arrives later as a separate HTTP request in the opposite direction.
BAP BPP
│ │
├──── POST /select ─────────────────►│
│◄─── 200 { "ack": "ACK" } ──────────┤ receipt, not an answer
│ │
│ (BPP works) │
│ │
│◄─── POST /on_select ───────────────┤ the actual answer
├──── 200 { "ack": "ACK" } ─────────►│
│ │Three consequences worth designing for from the start:
- Both parties run a server. A BAP is not just a client; it must receive callbacks at a publicly reachable, signature-verifying endpoint.
- State lives on your side. There is no request-scoped context to hold a transaction in. Every open transaction is persisted state with a TTL.
- Callbacks can be late, lost or duplicated. Idempotency and expiry are baseline requirements, not refinements.
Beckn and OCPI together
These are complementary layers, not alternatives, and the confusion between them is common enough to be worth stating plainly.
| Beckn | OCPI | |
|---|---|---|
| Solves | Open discovery and booking across any provider | Bilateral roaming between two known parties |
| Relationship | None required in advance | Registered pairwise beforehand |
| Discovery | Broadcast via gateway | Pull the partner's Locations |
| Shape | Async action + callback | REST, plus async for Commands |
| Billing record | Final settled quote on the order | CDR |
A realistic Indian deployment runs both. A CPO exposes a Beckn BPP so any buyer app can find and book its chargers, and simultaneously maintains OCPI connections with the eMSPs it has commercial agreements with. Underneath both, OCPP talks to the hardware.
The mapping is direct where it needs to be: a Beckn confirm produces an authorization token; when the driver uses it the CPO starts a session, and that session yields a CDR. Keeping transaction_id joined to the session and CDR is what makes Beckn orders and charging records reconcile — and skipping that join is why they often do not.
An implementation roadmap
| Phase | Build | You can now |
|---|---|---|
| 1 | context + signing | Send and verify a well-formed, trusted message |
| 2 | search / on_search | Discover chargers across the whole network |
| 3 | select + init + confirm | Book a charger and receive an authorization token |
| 4 | status + update | Show live progress and stop a charge remotely |
| 5 | cancel | Handle cancellation by either party, with fees |
Phases 1 to 3 are a working booking flow. Phase 4 is what makes it feel like a real product. Do not defer phase 1 — retrofitting signature verification onto a live endpoint means running an unverified endpoint in the meantime.
Production lessons
- Verify every inbound message. No staging bypass, no exceptions.
- One
transaction_idper business transaction; a newmessage_idper request. The most common source of hard-to-reproduce bugs. - Never treat ACK as success. Wait for the callback before telling a driver anything.
- Make confirm idempotent. Duplicate orders are the expensive failure mode.
- Handle unsolicited callbacks. Natural completion, faults and expiries all arrive without you asking.
- Render search results progressively and close the window at a few seconds. You never know how many providers will answer.
- Join
transaction_idto the charging session and CDR, or reconciliation becomes guesswork. - Serve catalogues from cache as a BPP. Broadcast search volume is not under your control.
Official references
The normative sources are the Beckn Protocol core specification and the domain specification for EV charging, alongside the UBC Technical Specification Document, which formalises EV charging semantics while keeping alignment with OCPI for CPO communication. A UBC EV sandbox is available for testing implementations against the network before onboarding.
The intended audience for that material is broad: consumer application developers building BAPs, eMSPs and aggregators mapping services across multiple CPOs, charge point operators exposing services as BPPs, and architects designing interoperable EV ecosystems.
Frequently asked questions
An open protocol that lets buyer-side and provider-side platforms transact directly without a central marketplace in between. Any compliant application can discover and buy from any compliant provider without the two having integrated beforehand.
BAP is Beckn Application Platform, the buyer side — typically a consumer-facing app run by an eMSP. BPP is Beckn Provider Platform, the seller side — typically a charge point operator. The expansion 'Buyer Provider Platform' sometimes seen for BPP is incorrect.
search and on_search for discovery, select and on_select for a quote, init and on_init for terms, confirm and on_confirm to create the order and issue an authorization token, then status, update and cancel to track, modify or void it. Every action has a matching callback.
No, they are complementary layers. Beckn provides open discovery and booking across providers with no prior relationship; OCPI provides bilateral roaming between two parties who have registered with each other. A CPO commonly runs both, with OCPP underneath talking to the hardware.
Because discovery is a broadcast that many providers answer at different speeds, so no single synchronous response could carry the result. Every request is answered with an immediate ACK receipt, and the real answer arrives later as a separate callback in the opposite direction.
Yes. A BAP is not just a client — it must expose a publicly reachable callback endpoint that verifies signatures, because every answer arrives as an inbound HTTP request rather than as a response to the one it sent.