Acceso para máquinas
Consultar el archivo desde el software
Este archivo registra lo que la web comunica a las máquinas. Sería un archivo extraño si solo pudiera consultarlo una persona rellenando un formulario. Dos operaciones están abiertas al software: preguntar si un dominio está observado y proponer uno para su observación. Sin clave, sin registro, sin cuenta.
Para un asistente: el servidor MCP
Si utiliza Claude, ChatGPT o cualquier otra cosa que hable el Model Context Protocol, añada este punto de acceso y las dos herramientas aparecerán en su conversación.
Usa el transporte Streamable HTTP y no mantiene estado: sin sesión que establecer, sin flujo abierto, sin credenciales. Añádalo como servidor MCP remoto en los ajustes de su cliente, o desde la línea de comandos:
claude mcp add --transport http machinewitness https://machinewitness.eu/mcp
check_coverage
check_coverage(domain)
Si este archivo observa un dominio, desde qué día sellado, qué archivos legibles por máquinas solicita y con qué frecuencia. Admite una URL pegada y la reduce al nombre de dominio.
Una respuesta negativa es una afirmación sobre este archivo, no sobre el dominio: la mayor parte de la web no está observada. Una respuesta afirmativa no dice nada sobre lo que contienen los archivos observados.
suggest_domain
suggest_domain(domain, email, reason)
Propone que se observe un dominio. La respuesta es siempre received con guarantee: none. Es una solicitud, no una instrucción; véase más abajo qué hace y qué no hace una propuesta.
Para todo lo demás: HTTP simple
Las mismas dos operaciones sin MCP, y el registro de raíces como un solo documento. Nada de esto requiere una biblioteca.
El registro de raíces completo
GET /log.json
Cada día sellado, ambos testigos, en un solo documento: el número de observaciones, la raíz de Merkle, la hora exacta del sellado y qué anclajes externos lleva ese día. Es la forma legible por máquinas del registro público: sin clave, sin paginación, sin límite de frecuencia.
$ 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..." }
}
}
Los dos testigos sellan de forma independiente, de modo que sus raíces difieren por construcción y nunca se presentan como coincidentes. Un testigo sin sello para un día lo dice expresamente ("sealed": false con un motivo) en lugar de omitirse: una línea ausente no debe leerse nunca como «no procede». Este documento declara lo que se selló, nunca lo que sirvió un dominio.
¿Está observado un dominio?
GET /coverage/{sha256(domain)}
La clave es el SHA-256 hexadecimal en minúsculas del nombre de dominio desnudo: sin esquema, sin www., sin punto final. Usted calcula el hash del nombre, de modo que nunca se transmite y nunca aparece en un registro. Es deliberado: un testigo neutral no debería acumular un registro de quién pregunta por quién.
$ printf 'example.eu' | shasum -a 256
5a9f... -
$ curl https://machinewitness.eu/coverage/5a9f...
{"observed": false}
Un dominio observado responde con las fechas selladas, los artefactos solicitados y el anillo que determina la cadencia:
{
"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 dominio que ya no se observa responde "active": false. Sus registros sellados del periodo mostrado se mantienen: un archivo no deja de haber observado el pasado.
Proponer un dominio
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. ..."}
Los tres campos son obligatorios. Una propuesta rechazada responde "status": "rejected" con un motivo: un nombre de dominio inservible, una dirección de respuesta ausente, o un motivo demasiado breve para leerse como tal.
Qué hace una propuesta y qué no
Una propuesta se registra y la examina una persona conforme a criterios documentados: una conexión con la Unión Europea y archivos legibles por máquinas servidos públicamente. La decisión corresponde al operador de este archivo.
No genera obligación de observar el dominio, ni plazo, ni garantía de que vaya a añadirse. No es adorno jurídico, es la posición honesta. Un archivo que prometiera observar a petición debería una disponibilidad que no puede garantizar, y quien confiara en esa promesa encontraría que falta la prueba el día en que fallara un rastreo. Lo que aquí se promete es menor y puede cumplirse: la propuesta se registra, se examina y se responde a la dirección facilitada.
La terminación del dominio es una señal entre otras, no un veredicto. Un dominio fuera de las 28 terminaciones europeas no se rechaza automáticamente: se pone ante una persona, porque una terminación es solo un indicio aproximado de dónde está realmente un operador. Esa limitación se describe en cómo funciona.
Límites y buenas maneras
- Límites de frecuencia
- Las propuestas están limitadas por dirección y en total por día. Superar un límite responde 429. La consulta de cobertura se almacena en caché en el borde y no tiene límite de frecuencia para un uso ordinario.
- Enumeración
- No existe ningún punto de acceso que enumere los dominios observados, y la clave con hash impide recorrer la consulta. Cada consulta responde por un dominio que quien llama ya conoce.
- Datos personales
- La consulta de cobertura no transmite ningún nombre de dominio ni dato personal. Una propuesta envía el dominio y su dirección en claro: tiene que hacerlo, porque una persona la lee. Véase la política de privacidad.
- Estabilidad
- Estas son las operaciones públicas de un archivo en funcionamiento, no una API de producto versionada. Pueden añadirse campos; el significado de los campos existentes no se cambiará en silencio. Una API de datos más amplia es una cuestión posterior e independiente.
Descripciones legibles por máquinas
Este sitio publica lo que pide a los demás. llms.txt describe ambas vías de acceso en una forma que un modelo de lenguaje puede leer directamente; ai.txt y tdmrep.json declaran que no se formula reserva alguna frente a la minería de textos y datos sobre el contenido propio de este sitio.