robots.txt was written for crawlers that fetch pages. It says nothing about retrieval, training, attribution or commercial use, and anyone can forge a copy of it. The Piruz Agent Receipt Protocol adds the missing half: a cryptographically signed statement of rights, bound to the exact bytes you served, plus an optional receipt an agent can issue to record what it did.
LLMBOO runs it in production today. Every manifest below is signed with our Ed25519 publisher key, and you can verify one yourself in about ten seconds.
That is the whole point of signing. Fetch our key, fetch a manifest, check the signature and check the digest against the bytes we actually serve. If any step fails, the claim is worthless, which is exactly the property robots.txt lacks.
# Node 20+, no dependencies const key = await (await fetch("https://llmboo.com/.well-known/piruz-agent-key.json")).json(); const token = await (await fetch("https://llmboo.com/agent-rights/llms.txt.parp")).text(); const [body, sig] = token.split("."); const k = await crypto.subtle.importKey("jwk", key.keys[0], {name:"Ed25519"}, true, ["verify"]); const ok = await crypto.subtle.verify("Ed25519", k, Buffer.from(sig,"base64url"), Buffer.from(body,"base64url")); const manifest = JSON.parse(Buffer.from(body,"base64url").toString()); // ok === true, and manifest.contentSha256 === sha256 of https://llmboo.com/llms.txt
https://llmboo.com/.well-known/piruz-agent-key.jsonhttps://llmboo.com/agent-rightshttps://llmboo.com/agent-rights/llms.txt.parpPOST https://llmboo.com/api/agent-receiptLink: <…llms.txt.parp>; rel="…SPEC.md#transport"; type="application/vnd.piruz.agent-rights"Signatures cover canonical JSON with sorted keys and no insignificant whitespace, so two implementations sign identical bytes and a re-serialised manifest cannot silently change meaning.
Each manifest carries the SHA-256 of the resource itself and an expiry. Edit the file and the digest stops matching, which is a feature, not a bug.
The public key is published separately from the manifests, as JWK. An agent that takes the key from the same response it is verifying has verified nothing.
We store exactly six fields: id, manifest digest, agent URL, purpose, issue time, arrival time. Anything else in the request body is discarded on the way in.
Sending a receipt is voluntary, the endpoint is public, and receipts are deleted after 90 days. The retention period is stated in the response, not buried in a policy.
Our own manifests allow retrieval and require attribution. Training and commercial use are left unspecified on purpose: that is a licensing conversation, not a header.
The protocol is open and the reference implementation is about a hundred lines. If you publish anything an AI assistant reads, you can state your terms in a way that cannot be forged or misattributed.
application/vnd.piruz.agent-rights and advertise it with a Link header on the resource.Or skip the steps: the free LLMBOO plugins for WordPress and OpenCart publish PARP out of the box, following the parp-integrations v1.0.1 conventions. Each store signs with its own key, generated on its own server and never sent to us. Starters for Node, PHP, .NET and Shopify are in the same repository.
We are looking for the second independent implementer. Two deployments with published interoperability evidence is the bar before a neutral media type and a short link relation can be proposed through the IANA procedures. If you run a publisher, a store platform or an agent, we will help you wire it and we will publish the evidence jointly.