ION layers governance, a network profile, and three core services on top of the Beckn protocol — connecting buyer apps, providers, and consumers across Indonesian commerce.
The Council ratifies the network. The network profile codifies what's allowed. Three core services keep the directory, catalogue, and discovery live. Participants — buyer and provider platforms — speak the Beckn protocol across the shared rail. The consumer is the only layer that doesn't run code.
ION Council is the council. It sets policies, approves changes to the network profile, and arbitrates disputes between participants. Everything below this layer derives its authority from the Council's ratification.
Council decisions are encoded into ion.yaml (the next
layer down) so that participants don't follow opinions — they
follow the file.
ion.yaml defines the network. The Policy Registry encodes
what's allowed; the Error Registry standardises how participants
report failure. Together they make the network legible to humans and
machines alike.
Participants register, providers publish, buyer apps discover. Everything in the protocol exchange below this layer presumes these three services are live.
Every commerce event on the network is one BAP talking to one BPP,
with verbs going one way and on_* callbacks coming back.
Specific verticals (Trade, Logistics, Payment) define the message
bodies; the shapes are always the same.
/select to express intent and consumes the
/on_* callbacks.
The pattern is symmetric. For every verb a BAP calls, there
is a matching on_* callback the BPP returns. Beckn is
asynchronous by design, so callbacks may arrive seconds or minutes
later from a different participant on the network.
Every BAP and every BPP speaks the same verbs across the same endpoints. The protocol carries no money and no goods — only messages — but those messages move the contract forward.
# the shared protocol — every BAP ↔ BPP exchange uses these verbs verbs: discover: /search · /select commit: /init · /confirm observe: /status · /track · /update finalize: /rate · /reconcile · /cancel # every verb pairs with an on_* callback returned asynchronously callbacks: /on_search · /on_select · /on_confirm · /on_status · ...
See the trade × logistics walk-through
for a worked example: thirty-two messages over fourteen phases joined
by one linkedContractId.
The consumer doesn't run code. The consumer opens a buyer app. Everything above this layer — Council, profile, services, participants, protocol — exists so a consumer in Jakarta can search one storefront and transact with any registered provider on the network.
That single mouse-click is the success criterion for the entire architecture.