Machine access
Ask the archive from software
This archive records what the web tells machines. It would be a strange archive if only a human filling in a form could question it. Two operations are open to software: ask whether a domain is observed, and suggest one for observation. No key, no registration, no account.
For an assistant: the MCP server
If you use Claude, ChatGPT, or anything else that speaks the Model Context Protocol, add this endpoint and the two tools appear in your conversation.
It uses the Streamable HTTP transport and is stateless: no session to establish, no stream held open, no credentials. Add it as a remote MCP server in your client's settings, or from the command line:
claude mcp add --transport http machinewitness https://machinewitness.eu/mcp
check_coverage
check_coverage(domain)
Whether this archive observes a domain, from which sealed day onward, which machine-readable files it requests, and how often. A pasted URL is accepted and reduced to the domain name.
A negative answer is a statement about this archive, not about the domain: most of the web is not observed. A positive answer says nothing about what the observed files contain.
suggest_domain
suggest_domain(domain, email, reason)
Suggest that a domain be observed. The answer is always received with guarantee: none. It is a request, not an instruction — see what suggesting does and does not do below.
For everything else: plain HTTP
The same two operations without MCP. Nothing here needs a library.
Is a domain observed?
GET /coverage/{sha256(domain)}
The key is the lowercase hexadecimal SHA-256 of the bare domain name — no scheme, no www., no trailing dot. You hash the name yourself, so it is never transmitted and never appears in a log. That is deliberate: a neutral witness should not accumulate a record of who asked about whom.
$ printf 'example.eu' | shasum -a 256
5a9f... -
$ curl https://machinewitness.eu/coverage/5a9f...
{"observed": false}
An observed domain answers with the sealed dates, the artefacts requested, and the ring that determines cadence:
{
"observed": true,
"first_sealed_observation": "2026-07-29",
"last_sealed_observation": "2026-08-02",
"artefacts": ["robots.txt", "ai.txt", "tdmrep.json", "llms.txt", "homepage"],
"ring": "core",
"active": true
}
A domain that is no longer observed answers "active": false. Its sealed records from the period shown remain — an archive does not un-observe the past.
Suggest a domain
POST /request
$ curl -X POST https://machinewitness.eu/request \
-H 'content-type: application/json' \
-d '{"domain": "example.eu",
"email": "you@example.eu",
"reason": "Why this domain should be observed."}'
{"status": "received",
"guarantee": "none",
"domain": "example.eu",
"detail": "Recorded for review against documented criteria. ..."}
All three fields are required. A rejected suggestion answers "status": "rejected" with a reason: an unusable domain name, a missing reply address, or a reason too short to be read as one.
What suggesting does, and what it does not
A suggestion is recorded and reviewed by a person against documented criteria: a connection to the European Union, and publicly served machine-readable files. The decision stays with the operator of this archive.
It creates no obligation to observe the domain, no timeline, and no assurance that it will be added. That is not legal decoration, it is the honest position. An archive that promised to observe on request would owe an availability it cannot guarantee, and the person who relied on that promise would find the evidence missing on the day a crawl failed. What is promised here is smaller and can be kept: the suggestion is recorded, it is reviewed, and it is answered at the address given.
The domain's ending is one signal among others, not a verdict. A domain outside the 28 European endings is not rejected automatically — it is put in front of a person, because an ending is a rough proxy for where an operator actually is. That limitation is described on how it works.
Limits and conduct
- Rate limits
- Suggestions are limited per address and in total per day. Exceeding a limit answers 429. The coverage lookup is cached at the edge and is not rate limited for ordinary use.
- Enumeration
- There is no endpoint that lists observed domains, and the hashed key means the lookup cannot be walked. Each lookup answers for one domain the caller already knows.
- Personal data
- The coverage lookup transmits no domain name and no personal data. A suggestion sends the domain and your address in the clear — it has to, because a person reads it. See the privacy notice.
- Stability
- These are the public operations of a working archive, not a versioned product API. Fields may be added; the meaning of existing fields will not be changed silently. A wider data API is a later, separate matter.
Machine-readable descriptions
This site publishes what it asks of others. llms.txt describes both access paths in a form a language model can read directly; ai.txt and tdmrep.json state that no reservation is made against text and data mining of this site's own content.