machinewitness

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.

Les deux opérations ne renvoient que des métadonnées. Aucune des deux ne renvoie le contenu d'un fichier observé, et il n'existe aucun point d'accès qui énumère ou permette de rechercher dans l'ensemble observé. Ce qu'un fichier disait tel jour relève d'un extrait probatoire, délivré sur demande ; voir extrait probatoire.

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.

https://machinewitness.eu/mcp

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.

Quelque chose ne fonctionne pas, ou une réponse vous paraît erronée ? Écrivez à contact@machinewitness.eu. Un accès automatisé qui pose problème sera limité plutôt que bloqué en silence, et vous en serez informé.