# Canton Lens: A Ledger API Explorer for Participant-Scoped Data

**URL:** <https://forum.canton.network/t/canton-lens-a-ledger-api-explorer-for-participant-scoped-data/9135>\
**Category:** App Development\
**Tags:** discuss, feedback\
**Created:** [September 14, 2026, 3:45pm UTC](https://forum.canton.network/t/canton-lens-a-ledger-api-explorer-for-participant-scoped-data/9135 "2026-09-14T15:45:54Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![joonwon.lee](https://avatars.discourse-cdn.com/v4/letter/j/5f8ce5/32.png) [@joonwon.lee](https://forum.canton.network/u/joonwon.lee)\
**Post date:** [September 14, 2026, 3:45pm UTC](https://forum.canton.network/t/canton-lens-a-ledger-api-explorer-for-participant-scoped-data/9135/1 "2026-09-14T15:45:54Z")

</div>

Hi all,

We open-sourced **Canton Lens** , a web explorer for the ledger data visible to a Canton participant. It is Apache-2.0 and reads the JSON Ledger API v2 and nothing else.

The explorers most people link to focus on network-level Global Synchronizer data — validators, governance, CC transfers. This is the other half: the contracts and updates your participant can actually see.

Ledger visibility follows the Canton identity and ledger rights used for each request, so two ledger users on the same participant can legitimately see different screens. Canton Lens does not try to merge those views.

 ![image](https://canada1.discourse-cdn.com/flex034/uploads/canton/original/2X/1/186edbd80cd6e2636ed870cb27d535ef093964d8.png)

Inspecting this data usually means using Daml Shell over PQS, querying PQS directly, or working with the Ledger API using curl, jq, or custom scripts. We wanted a dedicated explorer that makes participant-scoped ledger data easier to inspect and navigate.

### What you can inspect

- Overview — ledger position, visible contracts, token kinds, pending offers, recent activity at one snapshot offset

- Transactions and contracts — update events, active contract payloads, signatories, observers, decoded template fields and choices

- Parties and tokens — party relationships, Splice token holdings, transfer instructions, preapprovals

- Timeline — contract creation and archival across a range of ledger offsets

- Developer tools — installed Daml-LF packages, template definitions, participant status, OpenAPI document

The React UI and backend API are independently runnable. The backend serves an OpenAPI document at `/openapi.json` if you only want the API.

### Two built-in authentication profiles

- **Browser OIDC** — per-user browser PKCE login; each request carries that user’s own access token

- **Shared Identity** — one Canton service identity held by the backend via client credentials; no Ledger API access token reaches browser JavaScript, and issued tokens are cached in memory only

For deployments that need per-user access while keeping the Ledger API token server-side, the repository also documents an Institution BFF setup. The BFF itself is operated by the institution and is not part of Canton Lens.

### What it does not do

The JSON Ledger API serves current state and update history retained by the participant. Canton Lens does not maintain a separate historical index, so it does not provide durable full history or full-text search.

Recent-activity and timeline views intentionally cover bounded offset ranges, and data pruned from the participant is no longer available through its Ledger API. Serving deeper historical queries requires a separate store fed from the ledger, such as PQS. We may add this later for Shared Identity deployments.

Shared Identity mode does not authenticate individual users — every viewer sees the same lens, and access control is the operator’s responsibility.

Repo: [GitHub - dsrvlabs/canton-lens](https://github.com/dsrvlabs/canton-lens)  
License: Apache-2.0

Any feedback would be appreciated — especially from people running Canton participants in production or internal environments.

---

<div class="post-metadata">

**Author:** ![dunebuggie](https://yyz2.discourse-cdn.com/flex034/user_avatar/forum.canton.network/dunebuggie/32/7377_2.png) [@dunebuggie](https://forum.canton.network/u/dunebuggie)\
**Post date:** [September 14, 2026, 4:15pm UTC](https://forum.canton.network/t/canton-lens-a-ledger-api-explorer-for-participant-scoped-data/9135/2 "2026-09-14T16:15:24Z")

</div>

Thanks for sharing this, @joonwon.lee!

Would be great if you could add Canton Lens to the [Dev Hub](https://dev-hub.canton.foundation/)? It’s the Foundation’s catalogue of Canton developer tools, SDKs and infrastructure that anyone can contribute to: [https://dev-hub.canton.foundation/](https://dev-hub.canton.foundation/)

---

<div class="post-metadata">

**Author:** ![joonwon.lee](https://avatars.discourse-cdn.com/v4/letter/j/5f8ce5/32.png) [@joonwon.lee](https://forum.canton.network/u/joonwon.lee)\
**Post date:** [September 14, 2026, 4:50pm UTC](https://forum.canton.network/t/canton-lens-a-ledger-api-explorer-for-participant-scoped-data/9135/3 "2026-09-14T16:50:19Z")

</div>

@dunebuggie Thanks for the suggestion! I’ve submitted a PR to add Canton Lens to the Dev Hub:

> <https://github.com/canton-network-devs/Canton-Developer-Hub/pull/169>
>
> Adds \*\*Canton Lens\*\* under \`Data & Indexing\`. One insertion at the end of the
> ar…ray, no existing entry touched.
> 
> \*\*What it is.\*\* A self-hosted, open-source (Apache-2.0) explorer for a single
> Canton participant's ledger. Unlike the network-wide explorers already in this
> category, it keeps no index of its own: every request goes to the participant's
> JSON Ledger API v2 carrying the selected identity's token, so Canton decides
> what is visible. It covers updates, active contract payloads, parties, Splice
> token holdings and transfer offers, and installed Daml-LF packages and
> templates, and ships a documented backend API with an OpenAPI document.
> Authentication is per-user Browser OIDC or a backend-held shared identity.
> Built against Canton 3.5.
> 
> \- Category: Data & Indexing
> \- Type: partner
> \- Daml SDK version: null (see below)
> \- Dev Fund: false
> \- Repo: https://github.com/dsrvlabs/canton-lens
> 
> \*\*Why \`daml\_sdk\_version\` is null.\*\* Canton Lens does not use, depend on, or
> build against the Daml SDK. It is a TypeScript/React application; no workspace
> manifest declares a Daml package, and the project ships no DAR. It reads
> Daml-LF package and template metadata from the participant over the JSON
> Ledger API at runtime.
> 
> Forum announcement:
> https://forum.canton.network/t/canton-lens-a-ledger-api-explorer-for-participant-scoped-data/9135
> 
> \### PR Checklist
> 
> \- \[x\] My entry is valid JSON.
> \- \[x\] All URLs are live and return a working page
> \- \[x\] \`type\` is exactly \`"official"\` or \`"partner"\` (no other values)
> \- \[x\] \`category\` matches one of the valid categories listed above
> \- \[x\] \`description\` is one to two sentences, specific, and free of marketing language
> \- \[x\] If my tool uses the Daml SDK, \`daml\_sdk\_version\` is set to the current version my tool is built against \*\*not\*\* \`null\` — N/A, the tool has no Daml SDK dependency (see above)
> \- \[x\] \`maintained\_by\` is filled in with the person or team responsible for keeping this up to date
> \- \[x\] \`"dev\_fund": false\` — Canton Lens is not funded from the Canton Foundation Dev Fund
> \- \[x\] \`"last\_updated": "2026-09-14"\`
> \- \[x\] I understand I am responsible for submitting a new PR if the Daml SDK version changes and I update my tool
