Accès machine
Interroger l'archive depuis un logiciel
Cette archive relève ce que le web déclare aux machines. Ce serait une étrange archive si seul un humain remplissant un formulaire pouvait l'interroger. Deux opérations sont ouvertes aux logiciels : demander si un domaine est observé, et en proposer un à l'observation. Sans clé, sans inscription, sans compte.
Pour un assistant : le serveur MCP
Si vous utilisez Claude, ChatGPT ou tout autre outil qui parle le Model Context Protocol, ajoutez ce point d'accès et les deux outils apparaissent dans votre conversation.
Il utilise le transport Streamable HTTP et est sans état : aucune session à établir, aucun flux maintenu ouvert, aucune information d'authentification. Ajoutez-le comme serveur MCP distant dans les réglages de votre client, ou depuis la ligne de commande :
claude mcp add --transport http machinewitness https://machinewitness.eu/mcp
check_coverage
check_coverage(domain)
Si cette archive observe un domaine, à partir de quelle journée scellée, quels fichiers lisibles par machine elle demande, et à quelle fréquence. Une URL collée est acceptée et réduite au nom de domaine.
Une réponse négative est une affirmation sur cette archive, non sur le domaine : l'essentiel du web n'est pas observé. Une réponse positive ne dit rien de ce que contiennent les fichiers observés.
suggest_domain
suggest_domain(domain, email, reason)
Proposer qu'un domaine soit observé. La réponse est toujours received avec guarantee: none. C'est une demande, non une instruction. Voir ci-dessous ce qu'une proposition fait et ne fait pas.
Pour tout le reste : du HTTP simple
Les deux mêmes opérations sans MCP, ainsi que le registre des racines en un seul document. Rien ici n'exige de bibliothèque.
Le registre des racines en entier
GET /log.json
Chaque journée scellée, les deux témoins, en un seul document : le nombre d'observations, la racine de Merkle, l'heure exacte du scellement et les ancrages externes que porte cette journée. C'est la forme lisible par machine du registre public : sans clé, sans pagination, sans limite de fréquence.
$ curl -s https://machinewitness.eu/log.json | jq '.days[0]'
{
"day": "2026-08-23",
"url": "https://machinewitness.eu/log/2026-08-23",
"witnesses": {
"witness-1": {
"sealed": true,
"observations": 645785,
"merkle_root": "a86d011c...",
"anchors": {"opentimestamps": true, "rfc3161": true, "qualified_eidas": true}
},
"witness-2": { "sealed": true, "observations": 608542, "merkle_root": "eb3e7e97..." }
}
}
Les deux témoins scellent de manière indépendante ; leurs racines diffèrent donc par construction et ne sont jamais présentées comme concordantes. Un témoin sans scellement pour une journée le dit explicitement ("sealed": false avec un motif) plutôt que d'être omis. Une ligne absente ne doit jamais se lire comme « sans objet ». Ce document énonce ce qui a été scellé, jamais ce qu'un domaine a servi.
Un domaine est-il observé ?
GET /coverage/{sha256(domain)}
La clé est l'empreinte SHA-256 du nom de domaine nu, en hexadécimal minuscule : sans schéma, sans www., sans point final. Vous calculez l'empreinte vous-même, si bien que le nom n'est jamais transmis et n'apparaît dans aucun journal. C'est délibéré : un témoin neutre ne doit pas accumuler la trace de qui s'est renseigné sur qui.
$ printf 'example.eu' | shasum -a 256
5a9f... -
$ curl https://machinewitness.eu/coverage/5a9f...
{"observed": false}
Un domaine observé répond avec les dates scellées, les ressources demandées et l'anneau qui détermine la 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
}
Un domaine qui n'est plus observé répond "active": false. Ses enregistrements scellés de la période indiquée subsistent. Une archive ne dés-observe pas le passé.
Proposer un domaine
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. ..."}
Les trois champs sont obligatoires. Une proposition rejetée répond "status": "rejected" avec un motif : un nom de domaine inutilisable, une adresse de réponse manquante, ou un motif trop court pour en être un.
Ce qu'une proposition fait, et ce qu'elle ne fait pas
Une proposition est enregistrée et examinée par une personne au regard de critères documentés : un lien avec l'Union européenne, et des fichiers lisibles par machine servis publiquement. La décision appartient à l'exploitant de cette archive.
Elle ne crée aucune obligation d'observer le domaine, aucun délai et aucune assurance qu'il sera ajouté. Ce n'est pas un ornement juridique, c'est la position honnête. Une archive qui promettrait d'observer sur demande devrait une disponibilité qu'elle ne peut pas garantir, et celui qui aurait compté sur cette promesse découvrirait la preuve manquante le jour où une exploration échouerait. Ce qui est promis ici est plus modeste et peut être tenu : la proposition est enregistrée, elle est examinée, et il y est répondu à l'adresse indiquée.
La terminaison du domaine est un indice parmi d'autres, non un verdict. Un domaine situé hors des 28 terminaisons européennes n'est pas rejeté automatiquement. Il est soumis à une personne, car une terminaison n'est qu'une approximation grossière du lieu où se trouve réellement un exploitant. Cette limite est décrite dans comment ça marche.
Limites et bon usage
- Limites de fréquence
- Les propositions sont limitées par adresse et au total par jour. Dépasser une limite renvoie 429. La consultation de couverture est mise en cache en périphérie et n'est pas limitée en fréquence pour un usage ordinaire.
- Énumération
- Aucun point d'accès n'énumère les domaines observés, et la clé sous forme d'empreinte fait qu'on ne peut pas parcourir la consultation. Chaque consultation répond pour un domaine que l'appelant connaît déjà.
- Données à caractère personnel
- La consultation de couverture ne transmet ni nom de domaine ni donnée à caractère personnel. Une proposition transmet le domaine et votre adresse en clair. Elle le doit, parce qu'une personne la lit. Voir la politique de confidentialité.
- Stabilité
- Ce sont les opérations publiques d'une archive en service, non l'API versionnée d'un produit. Des champs pourront être ajoutés ; la signification des champs existants ne sera pas modifiée en silence. Une API de données plus large est une question ultérieure et distincte.
Descriptions lisibles par machine
Ce site publie ce qu'il demande aux autres. llms.txt décrit les deux voies d'accès sous une forme qu'un modèle de langage peut lire directement ; ai.txt et tdmrep.json énoncent qu'aucune réserve n'est formulée contre la fouille de textes et de données du contenu propre à ce site.