Agent monetization
When an agent uses your product through a person's seat, you can offer it a better route: an API or an agent seat, metered by usage. This guide shows the pattern in three steps: detect, offer, meter. Telltale measures and reports; it never charges anyone. Billing stays in your own system.
1. Detect
Two signals matter, and they come from different places.
- The verdict (human, agent or unknown) is in the browser through
client.onVerdict()and on your server throughPOST /api/v1/verify. It is categorical, not a probability. Unknown means not enough evidence: never treat it as human, and never make an offer on it. - How we know the agent's name (the API field
strength) says how strongly the evidence ties an agent session to a named agent (controller): Verified (signed, a verified operator signature), Unconfirmed (weak-marker, a renamable trace on the page), Self-reported (declared, a self-declared user-agent token anyone can send) or Not named (unattributed-automation). It is returned by verify, inevidence.attribution. The browser verdict carries no strength. See Verdicts for what each one means.
Generic automation does not show which AI model, or whether any AI model, is driving. Make the offer only for an agent verdict whose agent is named as Verified or Unconfirmed, and always show the name together with how you know it.
2. Offer
Show your own offer in the page with the SDK's opt-in agent handler. Fetch the strength from your backend: /api/agent-attribution below is a route in your own application that calls Telltale's verify with the session token and returns its attribution ({ strength, controller }):
const resolveAttribution = async ({ sessionToken }) => {
const r = await fetch('/api/agent-attribution', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ sessionToken })
});
return r.ok ? (await r.json()).attribution : null; // { strength, controller }
};
client.onAgent(({ attribution }) => {
showOffer(`${attribution.controller} (${attribution.strength === 'signed' ? 'verified' : 'unconfirmed'}) is working here for someone. ` +
'Agents can use our API with an agent access plan.');
}, { pages: ['/', '/reports'], attribution: ['signed', 'weak-marker'], resolveAttribution });Keep the offer short and point it at your API documentation. Do not block the person whose session it is: the agent works for them. If you also want to stop a risky action, see "Interrupt agents in the page" in the Browser SDK guide. Either way, the browser UI is not security. Your server still verifies every protected action and applies its policy.
A typical pattern: an "Agent access plan" card for Verified or Unconfirmed agent names that links to its Reports API page. It sells nothing by itself: the card only points the agent at the route you offer.
3. Meter
Once an agent works through your API or an agent seat, report the completed work from your backend:
curl -sS -X POST https://app.trytelltale.dev/api/v1/usage \
-H "Authorization: Bearer $TELLTALE_SERVER_KEY" \
-H 'Content-Type: application/json' \
--data '{"sessionToken":"TOKEN","eventId":"export_000001","actionId":"export_report","units":1}'- Mark accounts that have an agent seat as Agent seat in Charge › Usage. Changes apply to new usage only and send an
account.seat_changedwebhook. The label is not a charge, a verdict or a permission. - Read agent minutes (
session-minutesin the API) and tool runs per account and category fromGET /api/v1/agent-usage.json, and import them into the system you charge your customers with with their usage IDs as idempotency keys. - Charge only for high-confidence AI agent use: verified identity, an automation trace, injected input, sustained behaviour, a behaviour change, or two or more independent behaviour families agreeing with no physical-device input. Agent minutes and work whose AI agent verdict rests on one behaviour pattern alone (medium confidence) are shown with
billable: false(billableis shown as chargeable in the dashboard) and left out ofmetered,includedand the pricing estimate; readbillableandbehaviourOnlyin the usage API (what counts as chargeable). - An agent minute counts once per session and minute. If the person signs in during that minute, the minute moves to the account your server confirmed:
agent_usage.recordedis sent again with the sameusageId,revised: trueand the account it moved from. Update the unit you already hold for thatusageId; it is not a second unit. - In the pricing estimate, included allowances (free minutes, tool uses, tasks) are per account per 30 days, so a 7-day period includes 7/30 of them and the monthly figure is the same for 7, 28 or 90 days. Seats are counted in each 30-day stretch of the period: a seat active in only one month of 90 days counts one month.
- Watch volume per site in Settings › Channels: live since, sessions in the last 30 days and an optional session warning level that only warns.
See the Usage metering guide for idempotency, periods, retention and reconciliation.
Checklist
- Offer only on an agent verdict with a Verified or Unconfirmed agent name, never on Unknown or an unnamed agent.
- Charge only chargeable units (the API field
billable, ormetered), never medium-confidence (behaviour-only) agent time. - Show the agent name with how you know it; never call automation an AI model on its own.
- Keep the offer and any interruption in the page as UX; enforce on the server.
- Meter completed work with stable event IDs, and keep your own ledger.