Agent-usage ledger

View as Markdown

The ledger is the record you use to charge your own customers for agent use, or to talk to them about it. For every Site, customer account, user and UTC day it counts the completed-work units your backend reports (Usage metering) in four classes, and keeps the evidence behind every unit. Telltale reports units; it never charges anyone.

Agent-usage ledger
Class (dashboard)API and CSV nameWhat it meansChargeable?
Chargeable agentbillable (billableUnits)An AI agent did the work, with high confidence: verified identity (a verified operator signature), an automation trace (WebDriver, an automation framework or a headless browser), injected input, sustained behaviour, a behaviour change (a handover to software input), two or more independent behaviour families agreeing with no physical-device input, or Claude's cursor driving the clicks. The same list as what counts as chargeable.Yes, if you charge for it
Medium-confidence agentbehaviour (behaviourUnits)An AI agent reading on one behaviour pattern alone (medium confidence). Shown as AI agent activity, held for review at protected actions by default, never charged.No
Humanhuman (humanUnits)The session showed varied trusted input from a person.No
Unknownunknown (unknownUnits)Not enough evidence either way. Unknown is not human.No

The dashboard counts units: one report to POST /api/v1/usage carries units (1 or more), so the entries CSV can have fewer rows than the units it adds up to. The CSV downloads keep the API's names above; routeCalls and routeBillableCalls are the calls through your MCP server and API and the chargeable ones.

A unit is counted once, when it is reported. The ledger only counts units you report with POST /api/v1/usage; agent minutes and tool runs stay in agent usage.

Approved-route calls are counted too, as their own unit: routeCalls and routeBillableCalls on each day and account, and a route_call entry for each call. They are never added to the four classes, never sent to Stripe meters with the work units and never counted by account alerts, so a tool call that also reports completed work is not counted twice. A route call names an account only when your server named it (identify, an agent token, or the account your MCP server's or your API middleware's identify returned).

Route calls come from three channels, and each day and account also counts them per channel (routeChannels in the totals, for example {"browser": 12, "mcp": 340}): browser (reviewed tools in your pages), mcp (tool calls through your own MCP server, from Telltale for MCP servers) and api (calls to your API: verified agent tokens, and calls with agent evidence reported by Telltale for APIs). Only channels with calls are listed. An MCP call is chargeable when your server named its account and the call ran (a call your rule refused is counted, never chargeable); An API call from the middleware is a route call only when it carries agent evidence (Unknown calls are route counts, never ledger entries), and it is chargeable when your server or an agent token named its account, the evidence is high confidence (Verified by token, Verified or Published IP range; never Declared), the call ran and it was not sampled. Each entry's evidence.channel says which channel it came from. A person counts once across channels toward Telltale's own plans (Pricing).

Evidence for every unit

Each unit has a ledger entry with:

When a customer disputes a charge, the entry is your answer: which session, what we saw, and how we know.

Corrections, adjustments and erasure

The ledger is append-only. Nothing is rewritten in place:

Retention

Day counts are kept 400 days. Entries, with their evidence, are kept as long as the Site keeps usage (Settings › Data & privacy, 90 days by default, up to 400).

Plans

The ledger and the evidence behind every unit are on every plan. On Telltale's hosted plans, the CSV downloads are part of Starter, Growth and Enterprise (CSV exports), and the Stripe meter-events downloads, sending to Stripe and account alerts are part of Growth and Enterprise. Self-hosted Telltale includes everything.

Read the ledger

Shell
curl -sS "https://app.trytelltale.dev/api/v1/usage/ledger?from=2026-10-01&to=2026-11-01&view=accounts" \
  -H "Authorization: Bearer $TELLTALE_SERVER_KEY"

For billing, read closed days (a to at a UTC midnight in the past) and use each entry's idempotencyKey so nothing is charged twice.

Charge › Ledger shows the same and downloads CSV (GET /api/admin/ledger.csv?site=SITE_ID&view=days|accounts|entries), with the route calls in their own routeCalls and routeBillableCalls columns (and routeCallId and channel on route_call entries).

Stripe meters

Map your customer accounts to your own Stripe customer IDs (Charge › Ledger › Stripe meters). Then either:

Units of accounts without a mapping are not sent; they are sent once you map the account (within the 35 days).

Account alerts to sales and customer success

Turn on account alerts in Charge › Ledger › Account alerts to hear when an account starts using agents, or when its agent units in a calendar month reach a threshold you set (up to five). Choose what counts: chargeable agent units (default) or every agent unit, behaviour-only included.

Recipe: HubSpot or Salesforce

There is no built-in CRM connection yet. Point a webhook endpoint (filtered to the two account events) at a small handler of your own, or at your automation tool, and update the company record:

JavaScript
// After verifyWebhook() (see Webhooks), for account.agent_usage_started and account.agent_usage_threshold:
const { type, data } = event;
await crm.updateCompany(lookupCompany(data.accountId), {
  telltale_agent_use: type === 'account.agent_usage_started' ? 'started' : `over ${data.threshold} units in ${data.month}`,
  telltale_agent_name: data.controller ? `${data.controller} (${data.howWeKnow.label})` : 'Not named',
});

Show the agent name with how we know it, never on its own. See the Agent seat playbook for what to say to the customer.