The public Receipts page
The same trust document the JSON route returns, rendered as a static HTML page. **No bearer token is required.** §7.1 day 4 asks for "a live Receipts page" and this is the page half of that: the JSON read is for a client, and this is the link a holder pastes into a post, a bio, or a DM. The page reads the chain at request time exactly as the JSON route does, so the two cannot disagree about what a contract says. **Every string on it is attacker-controlled and every one is escaped.** A token's `symbol()`, a module's `label`, and a split recipient's `label` are all chosen by whoever deployed the contract, and this page is reached by pasting a URL into a social post — so the page's implicit claim is "trust this document". Every such value is HTML-escaped at its interpolation, every `href` is built from a value putty itself composed, and the response carries a `Content-Security-Policy` with `script-src 'none'`, so a missed escape could not execute anything even if it got through. The page carries no script of its own and no forms. A 404 (no contract at the address) and a 422 (a contract that is not an ERC-20) are rendered as the same document shape rather than as a JSON body, so a reader who followed a bad link lands on a page that says what went wrong.
The same trust document the JSON route returns, rendered as a static HTML page. No bearer token is required. §7.1 day 4 asks for "a live Receipts page" and this is the page half of that: the JSON read is for a client, and this is the link a holder pastes into a post, a bio, or a DM. The page reads the chain at request time exactly as the JSON route does, so the two cannot disagree about what a contract says. Every string on it is attacker-controlled and every one is escaped. A token's symbol(), a module's label, and a split recipient's label are all chosen by whoever deployed the contract, and this page is reached by pasting a URL into a social post — so the page's implicit claim is "trust this document". Every such value is HTML-escaped at its interpolation, every href is built from a value putty itself composed, and the response carries a Content-Security-Policy with script-src 'none', so a missed escape could not execute anything even if it got through. The page carries no script of its own and no forms. A 404 (no contract at the address) and a 422 (a contract that is not an ERC-20) are rendered as the same document shape rather than as a JSON body, so a reader who followed a bad link lands on a page that says what went wrong.
Path Parameters
The @putty/chains slug for the chain the token is on.
1 <= lengthThe ERC-20 whose trust setup is being read.
1 <= lengthResponse Body
text/html
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/trust/receipts/string/string/page""string"Read a token's trust receipts GET
Reads a token's Trust Kit setup straight from the chain and returns it as a public document: every module found, every wallet it references with its live balance, and — the part that matters — exactly what can change, who can change it, and how fast. **It works for any token on any supported chain.** There is no allowlist and no putty-only path: a module is recognised by the getters its contract answers, so a token launched on Pons or Hookr reads the same as one launched here, and a token putty never heard of reads too. A token with no modules returns an empty `modules` array, not a 404 — the token is real, its setup is simply empty. **Every amount is a decimal string in the token's base unit.** Divide by `10^decimals` to display one; do not parse with `Number()`, which loses precision on exactly the values a trust page exists to be precise about. **`mutable` is the load-bearing field.** A control with `mutable: false` is a Solidity `immutable`: there is no setter in the bytecode, so nothing can change it. A control with `mutable: true` always carries a `range` and a `timelockSeconds` — the projector's one invariant — so a bounded, delayed change cannot be rendered as an instant one. When a bound or a timelock could not be read from the chain, the parameter is reported as immutable and a warning is recorded, because showing an unbounded parameter as bounded is the one failure this page must not have. `provenance.warnings` is empty only when the whole document was read. A partial read is reported as partial rather than presented as complete, and a node that could not answer never becomes a silent zero.
List the caller's community bots GET
Every bot the caller has registered, newest first. Scoped to the caller: another user's bot is not in this list and is not reachable by id either. There is no community-wide list, because a bot carries a chat id on it and the community's membership is not putty's to publish.