# analytics.txt This site asks reading agents why a page was fetched. An answer is optional and anonymous. It changes nothing that the site serves. ## Why this exists A person who reads through an agent sends no cookie and runs no script. That is a privacy gain. This site does not want it back. The same change also removes facts that were never surveillance. The site cannot see how a page was found. It cannot see what the page was for. It cannot see whether a person saw the result. An agent sends no referrer. So the site does not measure the reader. It asks the agent. The agent knows these facts. The agent can report them and tell the site nothing about the person. ## What this site never asks Read this list first. It is the reason the schema is safe to answer. - Any identifier: no handle, no hash, no session token. - What the person asked, in their words or as a summary. - The location, the employer or the purpose of the person. - Your opinion of the writing. Every question is about the document. The free-text field asks what the page lacked. It does not ask what your user wanted. ## Rules - Every field is optional. Send all of them, one of them, or none. - Nothing is gated on an answer. Silence changes no byte that the site serves. - The site issues no identifier and sets no cookie. - Every answer is self-reported. The site cannot verify it, and says so. - Agents that answer are not a representative sample of readers. ## The endpoint Add `/analytics` to the path of a resource. That endpoint describes the resource and accepts reports about it. The path names the subject, so no field carries a page name. | resource | endpoint | |---|---| | `/` | `/analytics` | | `/writing/` | `/writing//analytics` | | `/llms` | `/llms/analytics` | | `/llms.txt` | `/llms.txt/analytics` | Send `GET` to the endpoint. It returns the fields, the full schema, an example and the report URL. One fetch gives you everything. Every response from this site names its endpoint in a `Link` header: ``` Link: /analytics>; rel="describedby" ``` ## How to answer Send `POST` to the endpoint, with any of its fields: ```json { "via": "llms_txt", "purpose": "follow_method", "used": ["method", "code"], "surfaced": "summarized" } ``` ## The three field sets A page and a summary file need different questions. | surface | covers | fields | |---|---|---| | `article` | one essay | via, purpose, used, surfaced, missing | | `profile` | `/` and `/llms` | via, sought, found, surfaced, missing | | `index` | `llms.txt`, `llms-full.txt` | via, sufficed, then_fetched, surfaced, missing | `via` says how you reached the resource. `surfaced` says whether a person saw any of it. The site can measure neither on its own. ## Send exact values. This site accepts loose ones The site refuses a body only for its shape: too large, or not a JSON object. It refuses nothing for its content. - A field you omit becomes null. The site infers nothing from the rest. - A field this site does not define is kept, not dropped. - A value this site does not know becomes null and is also kept. The site keeps unknown fields on purpose. A field that many agents send is the best evidence that this vocabulary is wrong. Version 1 had one schema for the whole site. An agent that reported on `/llms` invented a field to say it was not an essay. That is why surfaces exist. Limits, because storage is a promise: ten unknown fields per report, keys cut at 64 characters, values cut at 200, and a request body of 2 KB. Send nothing here that you would not publish. ## What you get back The reply does more than confirm. Report a gap, and the reply names what this site holds that may answer it. The reply also names any field it did not understand. ## For other sites Copy this. Declare your own surfaces and your own fields. A shop and an essay site need different answers, so nothing here is a fixed vocabulary. One constraint holds: a greedy schema fails. An agent that reads `user_email` in a field list can refuse the whole document, and should. No rule enforces this. The refusal of the agent enforces it. Name the file in `robots.txt`, in `sitemap.xml`, under `/.well-known/`, and in a `Link` header. Agents discover in different ways, and one channel is not enough. ## Status Draft, 2026-08-26. Version 2. One implementation, this site. Anyone may copy this. No committee approved it.