Are you the author? Sign in to claim
One API call stamps any content with a permanent, publicly verifiable provenance record. Works from any language, any ag
A working answer to EU AI Act Article 50. Article 50(4) requires providers of general-purpose AI systems to mark AI-generated content with machine-readable provenance metadata by 2 August 2026. Tatastu Proof is one API call: hash the content locally, get back a permanent, publicly verifiable record of who signed it and when. Works from any language, any agent, any pipeline. (This is not legal advice; whether a given stamp satisfies your specific Article 50 obligation depends on your use case and counsel, see docs/eu-ai-act.md.)
import { stamp, hashText } from "@tatastu/proof"
const hash = await hashText("Hello, world!")
const receipt = await stamp({ contentHash: hash, title: "My post" })
console.log(receipt.verifyUrl)
// → https://proof.tatastu.dev/p/prf_01jz...
Live service: proof.tatastu.dev — verification is always free.
Open the printed verifyUrl in a browser to see the public record: signer, timestamp,
and the Arweave/Base anchor once it lands.
A stamp takes the SHA-256 of any content (text, file, JSON, code, binary) and records:
Within 24 hours, stamps are batched into an RFC 6962 Merkle tree. The root is anchored to Arweave (permanent storage) and Base (EVM on-chain calldata). After anchoring, you can verify the stamp with zero network calls using the offline verifier in this repo.
What a stamp does not prove: authorship truth. The service records "this signer
claimed this content at this time." The claimed time (signedAt) and proven time
(anchored) are distinct and both shown on every verify page.
npm install @tatastu/proof
Or use without installing:
npx tsx examples/eu-ai-act-label.ts
import { stamp, hashText } from "@tatastu/proof"
const hash = await hashText("The report content goes here.")
const receipt = await stamp({ contentHash: hash, title: "Q3 Report" })
console.log(receipt.verifyUrl) // https://proof.tatastu.dev/p/prf_...
console.log(receipt.byline) // "Verified · https://proof.tatastu.dev/p/prf_..."
import { stamp, hashNodeBuffer } from "@tatastu/proof"
import { readFile } from "node:fs/promises"
const bytes = await readFile("./report.pdf")
const receipt = await stamp({
contentHash: await hashNodeBuffer(bytes),
contentType: "application/pdf",
title: "Q3 Financial Report",
apiKey: process.env.TATASTU_API_KEY,
})
import { verify, hashText } from "@tatastu/proof"
const { proofs } = await verify(await hashText("The report content goes here."))
if (proofs.length > 0) {
console.log("Authentic:", proofs[0].verifyUrl)
console.log("Status:", proofs[0].status) // SIGNED | ANCHORED | CONFIRMED
}
import { stamp, hashBlob } from "@tatastu/proof"
const file = dropEvent.dataTransfer.files[0]
const receipt = await stamp({
contentHash: await hashBlob(file),
title: file.name,
})
See examples/browser-drop.html for a complete self-contained verify page with no build step.
Add proof.tatastu.dev/mcp to your Claude Code, Cursor, or Windsurf config:
{
"mcpServers": {
"tatastu-proof": {
"url": "https://proof.tatastu.dev/mcp"
}
}
}
The agent can then call create_proof and verify_proof directly. See
examples/agent-mcp.md for the full config and tool reference.
EU AI Act Article 50(4) requires machine-readable provenance on AI-generated content. The deadline is 2 August 2026.
import { stamp, hashText } from "@tatastu/proof"
const aiOutput = "AI-generated text goes here."
const receipt = await stamp({ contentHash: await hashText(aiOutput) })
const labeledOutput = {
text: aiOutput,
_proof: {
contentHash: receipt.contentHash,
proofId: receipt.proofId,
verifyUrl: receipt.verifyUrl,
signedAt: receipt.signedAt,
bylineHtml: receipt.bylineHtml,
},
}
Run the full example with no setup:
npx tsx examples/eu-ai-act-label.ts
See docs/eu-ai-act.md for the compliance guide.
Every stamp is:
After anchoring you can verify with the public key and inclusion path — no network, no trust, no service required.
After a stamp reaches ANCHORED status, you can verify it with no network calls:
import { getBundle, hashNodeBuffer } from "@tatastu/proof"
import { verifyOffline } from "@tatastu/proof/verify/offline"
import { readFile } from "node:fs/promises"
const bytes = await readFile("./report.pdf")
const bundle = await getBundle("prf_01jz...")
const result = await verifyOffline(bundle, await hashNodeBuffer(bytes))
console.log(result.valid, result.signatureVerified, result.merkleVerified)
verify/offline.ts is a single 200-line file with zero dependencies. Copy it into
any project. It uses only the Web Crypto API (SubtleCrypto), available in Node 18+,
Deno, and modern browsers.
| Tier | Price | Stamps | Status |
|---|---|---|---|
| Free | $0 | 5/month | Live |
| Tatastu membership | $20/month (the whole Tatastu app) | 100/month included | Live |
| Starter bundle | $8 | 100 (no expiry) | Launching soon |
| Creator bundle | $35 | 500 (no expiry) | Launching soon |
| Creator subscription | $12/month | 100/month | Launching soon |
| Pay-per-stamp (x402) | $0.10, or $0.05 with API key | n/a | Launching soon |
Verification is always free and requires no account.
"Launching soon" tiers are priced and committed but not yet purchasable; the API never routes you to a paywall that doesn't exist. Full, always-current pricing: proof.tatastu.dev/pricing (mirrored in docs/pricing.md).
| Framework / target | File |
|---|---|
| LangChain (tool-calling agent) | examples/langchain-tool.ts |
| Vercel AI SDK | examples/vercel-ai-tool.ts |
| CrewAI / AutoGen (Python) | examples/crewai-autogen-tool.py |
| MCP (Claude Code, Cursor, Windsurf) | examples/agent-mcp.md |
| ChatGPT Actions (OpenAPI 3.1) | hosted at proof.tatastu.dev/.well-known/gpt-actions.json, source: examples/gpt-actions.json |
| Browser, no build step | examples/browser-drop.html |
| Node.js CLI | examples/node-stamp.ts |
| EU AI Act labeling | examples/eu-ai-act-label.ts |
Full REST reference (every endpoint, error table, rate limits): docs/api.md.
See CONTRIBUTING.md. Found a security issue? See SECURITY.md instead of opening a public issue. The service, Worker, and D1 schema are in a private repo — this repo contains only the public SDK, offline verifier, and examples.
Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots
Google's universal MCP server supporting PostgreSQL, MySQL, MongoDB, Redis, and 10+ databases
Official GitHub integration for repos, issues, PRs, and CI/CD workflows