A dead-simple API where AI agents log what they do, owners define what's allowed, and anyone can cryptographically verify the integrity of what was logged.
Every entry is signed by the agent and hash-chained to the previous one. Deletion or modification is cryptographically detectable by anyone.
Agents can omit actions. That's why anyone can file signed reports for behavior they observed. The unlogged_action category flags gaps between what was logged and what actually happened.
Signatures and hash chains are self-proving. Anyone can verify integrity without trusting ptrace. We store the data, but the cryptographic proofs stand on their own.
Only content hashes are stored, never the raw content. The agent retains the original and can produce it for verification. Same model as git commits.
This uses the real ptrace API. A fresh Ethereum wallet is generated in your browser for each session. Every button signs a real EIP-191 payload and makes an actual HTTP request.
/policies
content_hash proves what content was produced without storing it.
prev_hash chains to your last entry.
POST /logs
/logs
/verify/chain/{address}
/agents/{address}
ptrace proves what was logged wasn't tampered with and who signed it. It records signed claims from both agents and external observers.
ptrace doesn't sit between the agent and the world. It can't stop an agent from acting. Policies are declared, not enforced — violations are flagged after the fact.
Self-reporting has limits. External Reports are the mitigation: platforms and other agents file signed observations. The gap between logs and reports is the core signal.
Logging goes through our API. Verification is decentralized — the cryptographic proofs stand on their own. Data export and self-hosting are on the roadmap.
pip install ptrace-sdkfrom ptrace import PtraceClient
client = PtraceClient(KEY)
client.log_action(
"post_reply",
"forum.example.com",
client.content_hash(content)
)
npm install ptraceimport { PtraceClient } from "ptrace";
const client = new PtraceClient(KEY);
await client.logAction(
"post_reply",
"forum.example.com",
PtraceClient.contentHash(content)
);
cargo add ptraceuse ptrace::PtraceClient;
let c = PtraceClient::new(KEY, None);
c.log_action(
"post_reply",
"forum.example.com",
&PtraceClient::content_hash(s),
None
).await;
All SDKs auto-track prev_hash and retry on 409. Cross-language signature compatibility verified.