> Bron: https://neuralex.nl/en/showcase/agentledger
> AgentLedger picks the cheapest suitable model per task, actually forwards the call, and records per call what happened: route, upstream, tokens, pricing status and savings. 67,309 calls in the ledger. Status: beta.

Showcase · AgentLedger

# Measuring, routing and accounting are one mechanism.

AgentLedger sits between your apps and the models. It picks the cheapest suitable model per task, **actually forwards the call**, and writes down what happened along the way: which route, which backend really executed it, how many tokens, what it cost — and when it does not know for sure. A meter next to a proxy is always one step behind the facts; this is the same movement.

**Status: beta.** Running in production in our own lab, not generally available yet. There is deliberately no release date — it follows once measurement coverage is complete.

[Product page agentledger.dev](https://agentledger.dev/en/) [See the screens](#rondleiding)

67,309

calls in the ledger

8

model providers behind one router

9

apps recognised automatically

14

screens in the Mac app

Figures from the running ledger, measured on 19 August 2026. Router v0.6.1.

Architecture

## One passage, four things at once

The app talks to a single endpoint. Behind it the source is recognised, that source's policy applied, the call forwarded to the chosen backend and the result written down — including what the backend itself chose, because that is rarely the same as what was asked for.

What it does

## Six things happening at the core

### A router that actually forwards

One OpenAI-compatible endpoint for all your apps. AgentLedger picks the model, forwards the call — streaming included — and writes the measurement while doing so. Not a meter next to a proxy: the same movement.

### Routes per app

Set per app: automatic, a fixed model, let AgentLedger choose, or off entirely. An empty policy means exactly the old behaviour — you can switch it on without breaking anything.

### A decision trail per call

For every call it is recorded why it went the way it did: which task type was recognised, which route setting applied, where it went, which backend actually executed it, and what that cost.

### Honest pricing

Every call carries a pricing status: priced, free, subscription, local or unpriced. Unpriced is not a zero but a gap — and any total containing one is shown as a lower bound.

### A spending brake

An hourly limit on real spend. Above it, paid calls go to the free model instead of running on. The brake fires on euros, never on subscription value.

### Loop and ghost detection

Near-identical calls repeating inside a time window are flagged even when they are free — a free loop costs no money but does cost quota and time. Calls that hang are counted separately.

From the running app

## Eight screens, unretouched

These are screenshots from the native Mac app in English, taken on 19 August 2026 with real production data from our own lab. Nothing was drawn in and nothing polished away — the failed calls and the unpriced gaps are simply there, because that is exactly what the product is about.

![AgentLedger overview with spend today, calls, savings, spend per hour, errors in the last 24 hours and the governor lanes](/img/agentledger/agentledger-overzicht-en.webp)

Overview **Today at a glance** Spent today, number of calls, what the cheaper route saved, and the DeepSeek balance marked almost empty before it bites. Below that: spend per hour with the hourly limit drawn in, the errors of the last 24 hours with their source, and the status of every lane behind the router.

![Detail view of one call: task type, routing setting, destination, actually executing backend, and a panel explaining that no rate is known](/img/agentledger/agentledger-workflow-en.webp)

Decision trail **A call that counts nowhere, and says so** This call has no price. Not zero — unknown: the governor did not report which endpoint it picked, so no rate applies. The panel says it in words: the amount is not zero but unknown, this call counts nowhere, add the rate to make it count. Most dashboards would have booked this as € 0.00 and moved on.

![Routes per app, with the apps listed and settings for automatic, fixed model, AgentLedger picks or off](/img/agentledger/agentledger-routes-en.webp)

Routes **Which app goes to which model** Every app that calls the router gets its own rule: automatic, a fixed model, let AgentLedger pick, or off. Plus an optional hourly limit and a note field for yourself three months from now. The forty callers that have not identified themselves sit at the top instead of vanishing into one anonymous pile.

![Live screen with active sessions per app, tokens in and out, cost, failed calls, unpriced calls and the models used](/img/agentledger/agentledger-live-en.webp)

Live **What is running right now** Sessions per app, with tokens in and out, cost, failed calls and unpriced calls counted separately — plus the models that session actually used. The duration keeps counting as long as the session runs.

![Sessions screen with totals and the note that 644 of 5,000 calls had no rate](/img/agentledger/agentledger-sessies-en.webp)

Sessions **Usage with the gaps left in** Above the list sits the total, and directly below it what that total is worth: lower bound — 644 of 5,000 calls without a rate. That one line is the difference between a number and a claim.

![Pricing screen filtered on deepseek, showing paid rates and one endpoint at EUR 0.000](/img/agentledger/agentledger-prijzen-en.webp)

Pricing **Free is a rate, not an assumption** The price book the router really uses, searchable per model. Note the last row: a free endpoint listed at EUR 0.000. That is what makes a free call provable instead of guessed — and it is why an unknown rate is left empty rather than rounded down to the same zero.

![Providers screen with a toggle per provider and the search sources for the news route](/img/agentledger/agentledger-providers-en.webp)

Providers **Switch off what you do not trust** Off means off here: the router rejects every call to that provider and the advisor never picks it. Useful for an exhausted trial. At the bottom, the search sources for the news route, with automatic fallback when the active source fails.

![Chat screen where you can ask questions about your own usage, routes and costs](/img/agentledger/agentledger-overleg-en.webp)

Ask **Ask the ledger itself** A chat that uses your own figures as its source: routes per app, recent calls, costs, recognition rules. The conversation runs through the router itself and therefore shows up in your own ledger — that too is kept measurable.

The core of the design

## A gap must not become a zero

Almost every cost dashboard has the same silent fault: whatever it cannot price, it books as zero. The total then looks healthy and nobody sees that a piece is missing. AgentLedger does it the other way round.

**priced**rate known, amount computed from the actual upstream

**free**explicitly € 0.00 in the price table — proven, not assumed

**subscription**covered by the monthly fee; never triggers the spending brake

**local**runs on your own hardware; no invoice, but time and power

**unpriced**empty, not zero — and any total containing one is called a lower bound

What we got wrong along the way

## Four measurement faults, and what they taught us

Each of these sat unnoticed for months inside a system that looked healthy. They are here because the correction is the product: these are exactly the places where a cost dashboard lies to you without knowing it.

### A gap in the measurement was booked as € 0.00

Every call without a known rate silently got zero euros. On a single day, 14,911 calls sat at € 0.00 against 1.17 billion input tokens. The total was therefore not a cost figure but a lower bound, without anyone being able to see it. Since then “unpriced” is its own status with an empty value instead of a zero.

### Source detection that had never once fired

Of 39,542 logged calls, all 39,542 sat under the source “http”. Every app was one app as far as the router was concerned, so per-app routes had nothing to grip on. Detection now runs in a fixed order — explicit header, own rule, sniffing — and records per call which rule actually fired.

### Orphaned calls came from lock contention, not from crashes

Under heavy concurrent streaming the finalising write failed with “database is locked”, leaving a call stuck in status “routing”. Eighty-three of them, two to fifteen days old. The fix was in the database settings, not the logic — plus a safety net that closes any dangling row anyway. Nothing was deleted; they are marked as aborted.

### Pricing the alias is guessing

If the router itself does not report which endpoint it became, the alias rate is an assumption. That assumption either costs tens of euros a day that do not exist, or it hides paid traffic. So pricing follows what the backend actually executed — or nothing at all.

From the ledger

## Where the measurement stands today

**67,309**calls recorded, 63,099 of them successful

**4,074**failed calls kept with their reason — previously visible only in the error response

**7.23 bn**input tokens against 85.8 million output tokens (roughly 84 : 1)

**9**apps the router tells apart, each with its own recognition rule

**€20.18**measured cost across the 29 sessions in view, against €1,376.53 saved by routing

**644 / 5,000**calls without a rate in the session overview — made visible, not rounded away

The same correlation thread runs through our [workflow automation](/en/showcase/workflows/).

Built with Python (stdlib)SQLite (WAL)SwiftUIMCPCloudflare Accesslaunchd

Beta — no release date yet

## Want to know what your agent team really costs?

AgentLedger runs in production in our own lab and is in beta. There is deliberately no release date: measurement coverage per provider has to be finished first, because a measuring instrument that papers over its gaps is worse than none at all. Looking along or thinking along is welcome.

[Get in touch](/en/contact) [Go to agentledger.dev](https://agentledger.dev/en/)

---
Volledige (opgemaakte) versie: https://neuralex.nl/en/showcase/agentledger
