machinewitness

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.

Ambas operaciones devuelven únicamente metadatos. Ninguna devuelve el contenido de un archivo observado, y no existe ningún punto de acceso que enumere o busque en el conjunto observado. Lo que un archivo decía un día determinado forma parte de un extracto probatorio, que se expide a petición; véase extracto probatorio.

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.

https://machinewitness.eu/mcp

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.

¿Algo no funciona, o una respuesta parece equivocada? Escriba a contact@machinewitness.eu. El acceso automatizado que cause problemas se limitará en lugar de bloquearse en silencio, y se le comunicará.