Skip to content
looot docs
Esc
↑↓navigate↵open⌘Jpreview
On this page

Receipts

How to read what a run actually cost, attempt by attempt, with runs_evidence, GET /v1/runs/{id}/attempts and the exact money in route.summary.

Every run settles to one number, actualCost, and every attempt behind it has its own receipt.

One number: actualCost

actualCost is what you were charged for the run. Compare it against estimatedCost (what was held) to see how much of the hold came back to your balance. See Holds.

Exact money in route.summary

A fallback run’s route.summary states each attempt’s charge to the exact cent, or fraction of a cent, trimmed of trailing zeros: "$0.0198", "$0.005", "$0.000007", "$1", and "$0" for nothing charged. For example:

zerobounce: guessed ($0.01). hunter: found ($0.0245). Charged $0.0345.

The words describing each attempt fit the job: a people.email.verify route reads “verdict invalid” or “answered”; web.scrape.* reads “fetched” or “fetched, flagged”; a job with enrich in its name reads “matched” or “matched, flagged”; find jobs and everything else read “found” or “found, flagged”.

Every attempt, with its own receipt

looot runs evidence <run-id>
{ "runId": "<runId>" }

This is runs_evidence (MCP) or GET /v1/runs/{id}/attempts (REST). Each row carries the attempt’s status, the provider’s own response status, latency in milliseconds, a receipt id, and its cost, never raw provider headers or bodies:

{
  "attemptId": "att_...",
  "ordinal": 2,
  "status": "completed",
  "providerResponseStatus": 200,
  "latencyMs": 380,
  "receiptId": "rcpt_...",
  "cost": 0.0245
}

An attempt can also carry outcome, outcomeReason and routeAfterAttemptId (the attempt before a fallback step, when that earlier one was billed). Sum the attempts’ costs and you get the run’s charge: the receipts always sum to the ledger entry.

Your ledger

looot ledger list --limit 50

Needs the usage.read scope. Every balance change is one ledger entry: top_up, trial_credit (only on older workspaces), reservation (a hold), release (a hold returned), charge and refund. Pass nextCursor back as --cursor for the next page.

Worked example

Run job:web.scrape.markdown on https://example.com with fallback, get route.summary back as "steel: fetched, html only, no markdown ($0.005). jina: fetched ($0.003). Charged $0.008.", then pull runs_evidence for the two attempts to see each one’s own latency and receipt id.

Was this page helpful?