ledger_search
One public search over the receipt sources, newest first. Not /v1/search
(that is the domain search).
Use this tool when:
you want to find a TunnelMind change by ref, kind or summary.
you want one newest-first view of TunnelMind's changes and the attested tollbooth commons.
you want a past day's signed station-health rows (
source=weather-health).you want the roster of attested agent keys (
source=agents).
Four public sources, and only these:
changes— the receipts ledger, lensconfigwithchange:*andtoolset:*subjects (the same set asGET /v1/changes; akindnarrows it to one), mapped likeGET /v1/changesso a row reads as a change, not a hash.commons— tollbooth receipts from attested sites only.weather-health— the signed station-health rows (lenswx-health), read from the public weather relay one CLOSED UTC day at a time. Every row is verified under the pinned weather key; a day that fails verification degrades the whole source. No row from the open (current) UTC day enters: the live 5-minute answer isstation_health(GET /v1/weather/station/{icao}/health).agents— the attested agent-key roster (tollbooth_agent_facts, attested sites only): one row per verified agent key, summed over its isolates and placed at the key's newest snapshot. A roster of keys, not receipts: each row points at the per-key recordGET /v1/tollbooth/agents/{key}(the row'sid), which names the signed snapshots behind the sums.
The default view (no source) is changes + commons only and makes no
relay call; weather-health rows appear only with source=weather-health,
agents rows only with source=agents.
API-verdict receipts (cross_lens, preflight, scry, self, …) are NOT public: ADR-010 keeps them hashes-only, so they are not in this ledger. The weather-health rows are not API-verdict receipts: they are TunnelMind's own judgements over public NWS observations, already public on the relay.
Searchable, NOT downloadable: limit is at most 100, there is no NDJSON,
no format= and no day dump. Bulk goes through the tollbooth export.
Changes rows carry public fields only — no receipt body, no
customer_id. Commons rows carry the signed tollbooth document
verbatim (receipt, or receipt_unreadable: true when the stored
document does not parse). Weather-health rows carry the signed health
receipt verbatim (receipt) with its day, station, verdict,
rules_version and chain sequence. Agents rows carry the key (id),
its newest ua, and the summed requests and isolates counts.
Each source is read and degraded on its own: sources.<name>.coverage is
observed_clean, never_observed (an honest absence, e.g. day= the open
day, or no closed day published yet; with a reason) or degraded with a
reason. A degraded source contributes no
rows; the response is still 200, never a crash and never an empty list
passed off as clean. Only the sources the filters can match are listed.
Paging: truncated is true when more rows exist; pass next_cursor as
cursor for the next page. Rows are ordered by issued_at (newest first),
then source (changes, then commons, then weather-health, then agents), then id, and the cursor marks the
last row returned, so rows sharing a timestamp are never skipped or repeated.
400 invalid_request on a malformed q, source, kind, day,
before, cursor or limit (including source=receipts), on cursor
with before, and on kind with source=commons, source=weather-health or source=agents.
?receipt=true attaches a signed Receipt v1.0 over the result. It is
not written to the receipts ledger (receipt_logged: false): the rows
are already signed at source, and logging each search would feed the
changes source.
Rate limits: anonymous: 10 per minute per IP; no daily cap on /v1/self, /v1/pricing, /v1/ledger and /v1/weather/station/{icao}/health; other anonymous probes 100 per day; free tier 50 per day. For anonymous callers this route has no daily cap and keeps 10/min; API-key tiers keep their daily cap.
Tool call template
This tool declares no required parameters. Add optional parameters from the input schema as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {},
"name": "ledger_search"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Substring to match (changes — subject or summary; commons — path class; weather-health — station or flag id; agents — the ua, any case, or a key prefix, exact case). 0-100 chars of letters, digits, space and `._:/#@-`. | |
| day | No | Only rows issued on this UTC day (YYYY-MM-DD). Not in the future. | |
| kind | No | Only changes of this kind. Applies to the `changes` source only. | |
| limit | No | Maximum rows returned, 1-100. | |
| before | No | Only rows strictly older than this ISO 8601 instant (timezone required). A time filter, not a paging cursor; cannot be combined with `cursor`. | |
| cursor | No | Opaque paging cursor: pass `next_cursor` from the previous page, unchanged, with the same other filters. 1-256 base64url characters encoding JSON `{t, s, i}` (the last row's issued_at, source and id); anything else, or `cursor` with `before`, is a 400. | |
| source | No | Only this source. Omit for the default view, `changes` + `commons` (weather-health and agents only when asked for). | |
| receipt | No | When true, attach a signed Receipt v1.0 over the result (not logged to the receipts ledger). Additive — a signing failure never costs you the observation (ADR-014). |