# Tree nodes: bulk Merkle summaries vs itemized chain seals The main Verae chain stores **hash + time + block + certificate**. A Zap that timestamps one document writes that document’s SHA-256 as its own seal. A **batch** of many documents is different: middleware builds a Merkle tree of the item hashes, seals **only the Merkle root** on the chain, and writes each **leaf proof** to external tree-node NATS archives. A later lookup of a member hash will **miss** on the central chain unless the Zap also queries tree nodes. ```text Zapier HTTPS zappier-edge HTTPS middleware | Merkle root | verae.archive.put kind=tree (chain seal) | (leaf proof, sharded) v tree-node-east/west/central bloom miss = silence ^ hash lookup includeTree | verae.archive.query | kinds=["tree"] aggregator merges proof + root seal ``` ## When to use which Zapier search | Search | Hits | |--------|------| | Find Timestamp by SHA256 | Hash was registered as its own chain seal | | Find Hash (tree nodes + central chain) | Chain first, then `includeTree=true` broadcast | ## Receipt shape for a bulk leaf ```json { "sha256": "", "exists": true, "itemizedOnMainChain": false, "merkleRoot": "", "proofOk": true, "receipts": [ { "kind": "seal", "of": "merkleRoot", "sha256": "", "certificate": "…" }, { "kind": "tree-leaf", "archiveId": "tree-node-east", "proof": […], "leafIndex": 1 } ] } ``` Validate this path in the simulator (`packages/verae-zapier-simulator`) before pushing the Zapier app.