# Proof
Analytics for agent-built apps. One tag instruments the app, events and metrics
live under contracts your agents write and approve, and both humans and agents
ask questions in plain English. When the data cannot answer, the answer says so
instead of guessing. Early access is invite-gated; keys are per workspace.
Site: https://proof.dorsr.com/
Wiring guide (for humans): https://proof.dorsr.com/docs
AGENTS: fetch https://proof.dorsr.com/wire.md and follow it. It is the complete
install procedure, and its last step verifies the install by reading the numbers
back. Do not report success until that step returns a number you
did not write.
## Wire it in (agent instructions)
1. Proxy /_p/p.js -> https://proof.dorsr.com/p.js and
/_p/e -> https://proof.dorsr.com/api/collect on the app's own domain
(Next.js rewrites or vercel.json), then add the tag once to the root layout:
Without the proxy, Brave Shields and uBlock Origin drop every event.
Autocaptured immediately: pageviews, sessions, clicks, Core Web Vitals,
JS errors, outbound clicks, SPA route changes. Dev hosts are ignored
unless the tag carries data-dev.
2. Mark the 404 page:
3. Verify ingestion after one page load:
POST https://proof.dorsr.com/api/ask
headers: x-proof-key: YOUR_AGENT_KEY, content-type: application/json
body: {"question":"pageviews today"}
4. Custom product events:
window.proof.track("myapp.thing_happened", { plan: "pro" })
Then propose a contract for it; it is approved on arrival:
POST https://proof.dorsr.com/api/propose
headers: x-proof-key: YOUR_AGENT_KEY, content-type: application/json
body: {"kind":"event","proposed_by":"agent:",
"definition":{"name":"myapp.thing_happened","version":1,
"human_meaning":"...","properties":{...}}}
5. Emit agent actions (deploys) through the collect door with source "agent"
and a stable external_id so retries dedupe.
## The agent door (plain HTTP)
- POST /api/ask { question, filters? } -> plain-English answer, the value,
its confidence, and how it was computed (the `receipt` field)
filters narrow it like a dashboard filter: { referrer, entry, country, utm, page }
(or say it: "sessions from t.co last week"); receipt.filters lists what applied,
and a filter the matched metric cannot take is refused, never dropped
- GET /api/schema -> every contract and its certification status
- POST /api/collect { write_key, events[] } -> ingest under contracts
- POST /api/propose -> add a new event contract (agent key required)
A contract proposed with the agent key is approved on arrival (status
"certified") under the workspace's standing grant, and the record names the
proposing agent. Nobody approves by hand. Only certified metrics answer with
high confidence.
## MCP (hosted, nothing to install)
The same verbs speak MCP over Streamable HTTP at https://proof.dorsr.com/api/mcp
Authenticate with `Authorization: Bearer YOUR_AGENT_KEY`. For .mcp.json:
{ "mcpServers": { "proof": { "type": "http",
"url": "https://proof.dorsr.com/api/mcp",
"headers": { "Authorization": "Bearer YOUR_AGENT_KEY" } } } }
Four tools: list_metrics, ask, emit_event, propose_event. No certify tool and no
free-form SQL.
## Privacy defaults
First-party only; no third-party requests; no fingerprinting (random id in a
first-party cookie); id-looking path segments scrubbed before storage; click
text masked under data-proof-mask; coarse country only. Kill switch:
window.proofConsent = false, or cookie proof-consent=denied.
## What we never do with your data (v1.0, effective 2026-07-28)
- Your events are never used to train a model. Not ours, not anyone else's.
- There is no opt-in by default, and no exception by region, plan, or account age.
- Your workspace is never pooled with another workspace to build anything.
- Changing any line above requires a new version and a new date, in public git history.
Source of truth: src/lib/commitments.ts in the Proof repo. The version and date
move forward in the same commit that changes the words, so the history shows
when the promise changed and to what.
## Your data
The data is yours. Raw events are kept until you remove them (no silent
auto-purge); approved definitions are kept as your schema. From the
account page you can export the whole workspace as JSON, or hard-delete every event.