// AGENT PROVENANCE PLATFORM

Every AI action.
Logged. Chained. Verifiable.

Your agents report what they did. Every entry is SHA-256 hashed against the previous. If you record the chain head, you can verify later whether anything changed. Any edit to a past entry produces a different head — detectable by anyone who checks.

agent.ts
const BASE = "https://api.chainproof.ai/v1";
const h = { "Authorization": "Bearer cp_live_…", "Content-Type": "application/json" };

// 1. start a chain
const { chain_id } = await fetch(`${BASE}/chains`, {
  method: "POST", headers: h,
  body: JSON.stringify({ agent_id: "agt_summarizer", trust_level: "high" }),
}).then(r => r.json());

// 2. log an action
await fetch(`${BASE}/chains/${chain_id}/entries`, {
  method: "POST", headers: h,
  body: JSON.stringify({ entry_type: "action", action: { tool: "read_file", status: "completed" } }),
});

// 3. verify chain integrity
const proof = await fetch(`${BASE}/chains/${chain_id}/verify`, { headers: h }).then(r => r.json());
// → { valid: true, entry_count: 1 }
append-only ledger
# sha-256 hash chain
content-addressed artifacts
durable object ledger
api-first

Your agent writes the log. The chain makes edits detectable.

ChainProof wraps around your agent's existing workflow. No SDK required — plain HTTP and a Bearer token.

01
Start a chain
Each agent execution gets its own chain. Your agent tells ChainProof what it's doing — the trust level, the instruction, the agent ID. ChainProof records that claim and opens the ledger.
POST /v1/chains → { chain_id, chain_head }
02
Agent reports each action
As your agent works, it appends entries — actions, decisions, tool calls, human approvals. Each entry is SHA-256 hashed against the previous. ChainProof records exactly what the agent said it did.
POST /v1/chains/:id/entries → { entry_hash }
03
Prove the log is unaltered
Chain verification doesn't tell you whether the agent succeeded. It tells you whether the log was touched after the fact. A broken link means an entry was modified post-commit — not that a task failed.
GET /v1/chains/:id/verify → { valid: true }

Everything you need to know.


A notary, not a watchdog.

ChainProof only knows what your agent tells it. That's not a limitation — it's the design. An external system that claims to independently verify agent behavior is guessing. ChainProof makes a narrower, harder guarantee.

✓  What ChainProof gives you
A structured, queryable record of what your agents reported doing.
A hash chain you can recompute yourself — you don't have to trust our verify endpoint.
Detection of post-hoc edits, if you record chain heads independently at write time.
Content hashes for artifacts — if the hash matches, the payload hasn't changed.
✗  What ChainProof doesn't give you
Independent verification that agents told the truth.
A guarantee that ChainProof itself hasn't altered records — only external anchoring would provide that.
Any signal about whether a chain's task succeeded at its real-world goal.
Protection against an agent that deliberately logs false entries.

Chain validity and chain status are independent signals. status: failed with a valid chain means the agent reported failure and nothing in the log changed since. status: completed with a broken chain means an entry was edited after it was written — by someone, somewhere. ChainProof can tell you the second happened. It can't tell you who did it or why.


The full lifecycle in one file.

Bootstrap a tenant, register an agent, run the full provenance cycle. No SDK needed — works with fetch, curl, or any HTTP client.

TypeScript
cURL
const BASE = "https://api.chainproof.ai/v1";
const headers = {
  "Authorization": `Bearer ${process.env.CHAINPROOF_API_KEY}`,
  "Content-Type": "application/json",
};

// 1 ── register an agent
const agent = await fetch(`${BASE}/agents`, {
  method: "POST", headers,
  body: JSON.stringify({ name: "summarizer", trust_level: "high" }),
}).then(r => r.json());

// 2 ── start a chain
const chain = await fetch(`${BASE}/chains`, {
  method: "POST", headers,
  body: JSON.stringify({ agent_id: agent.agent_id, trust_level: "high" }),
}).then(r => r.json());
// → { chain_id: "ba7d...", chain_head: "0000...genesis" }

// 3 ── append a ledger entry
const entry = await fetch(`${BASE}/chains/${chain.chain_id}/entries`, {
  method: "POST", headers,
  body: JSON.stringify({
    entry_type: "action",
    previous_entry_hash: chain.chain_head,
    action: { tool: "read_file", status: "completed" },
  }),
}).then(r => r.json());
// → { sequence: 0, entry_hash: "c1f9..." }

// 4 ── complete the chain
await fetch(`${BASE}/chains/${chain.chain_id}/complete`, {
  method: "POST", headers,
  body: JSON.stringify({ status: "completed" }),
});

// 5 ── verify the chain
const proof = await fetch(`${BASE}/chains/${chain.chain_id}/verify`, { headers })
  .then(r => r.json());
// → { valid: true, entry_count: 1, chain_head: "c1f9..." }

// GET STARTED

Your agents are running.
Is there a record?

Wire in ChainProof in under 10 minutes. Three API calls — open a chain, append entries, close it. Free tier is permanent, no credit card required.

Free: 500 chains & 50k entries/month. Upgrade when you need more.