---
title: Receipts
description: 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.
sidebar:
  icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" class="looot-icon"><path class="li-i" d="M6 3h12v18l-2-1.5-2 1.5-2-1.5-2 1.5-2-1.5L6 21z"/><path class="li-i" d="M9 12h6"/><path class="li-a" d="M9 8h6M9 16h3"/></svg>'
---

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](/money/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

<CodeGroup>

```bash CLI
looot runs evidence <run-id>
```

```json MCP
{ "runId": "<runId>" }
```

</CodeGroup>

This is [`runs_evidence`](/mcp-tools/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:

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

An attempt can also carry [`outcome`](/concepts/outcomes), `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

```bash
looot ledger list --limit 50
```

Needs the `usage.read` scope. Every balance change is one ledger entry: [`top_up`](/mcp-tools/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.

<Related />
