---
title: "The ledger chain | Recovea"
description: "recovea-chain-v1: SHA-256 over fourteen fields in a published order, joined with U+001F."
canonical: "https://recovea.ai/docs/products/prove/"
source: "https://recovea.ai/docs/products/prove/"
---

Docs

# recovea-chain-v1

SHA-256 over fourteen fields in a published order, joined with U+001F. Each row hashes the row before it.

## Field order

```
1. recipe_id
2. previous_hash
3. request_id
4. timestamp_ms
5. provider
6. model
7. route
8. tokens_in
9. tokens_out
10. tokens_cached
11. cost_micro_usd
12. price_list_version
13. basis
14. mandate_id
```

The first two inputs are the recipe id and the previous row’s hash; the remaining twelve are receipt fields.

## Genesis

```
0000000000000000000000000000000000000000000000000000000000000000
```

The first row in a chain uses sixty-four zeros as its previous hash.

## Canonicalisation

- The hash input is the UTF-8 bytes of the fields in order, joined by U+001F.
- The row hash is lowercase-hex SHA-256 of that input, and is never part of its own input.
- Integers are base-10 decimal strings with no leading zeros.
- timestamp_ms is Unix epoch milliseconds as a base-10 integer string.
- cost_micro_usd is integer microdollars; 1000000 is one dollar.
- The provider value is lowercased with separators removed, so open_ai hashes as openai.
- basis is measured or applied. It is never verified in v1.
- An absent mandate_id is the empty string.
- lever and row_hash are not hash inputs.

## Check it

The sample month’s ledger runs live on [the proof page](https://recovea.ai/proof/), re-derived in your own browser. Alter one field of one row there and watch every hash after it break.
