POST https://zappier-edge/v1/timestamp
(x-api-key)POST middleware/zapier/v1/timestampverae.archive.putverae.zapier.jobs.watch
{ jobId, tenantId, … }{ jobId } back to Zapierverae.zapier.jobs.eventsSame as (1) but HTTP holds until jobs.events or
WAIT_TIMEOUT_MS →
{ status: pending, jobId }.
Step 4 returns original jobId + original seal. No second chain write.
receipts[0].kind = seal. Later archive attaches become
receipts[1…] if includeAttached.
After seal is known, aggregator publishes
verae.archive.query. Each WORM: bloom miss = no packet; hit
= verae.archive.reply.<correlationId>. Aggregator
merges into wait JSON.
Splitter emits one archive.put per file
(kind: file, contentSha256). Chain never
stores bytes.
POST /v1/timestamp/batch (one item per
line)verae.archive.put
kind: tree on a sharded tree nodeGET /hashes/{leaf} → miss
(itemizedOnMainChain: false)GET /hashes/{leaf}?includeTree=true → aggregator
broadcasts verae.archive.query
kinds=["tree"]archive.reply.<id> with
proof; others silenttree-leaf receiptpackages/verae-zapier-simulator replays flows 1–6
in-process with a trace console, fault injection, and modification
suggestions. It does not connect to live NATS.