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.
Desde octubre de 2026 el software también puede encargar una constancia a fecha; eso prepara un pago, nada más. Véase encargar una constancia a fecha.
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.
Encargar una constancia a fecha
El software también puede encargar una constancia a fecha: ambos testigos obtienen las direcciones indicadas, toman una imagen de página completa de cada una y dan a cada captura su propio sello de tiempo electrónico cualificado. Un encargo por esta vía prepara un pago y nada más. La respuesta es un enlace de pago; no se cobra ni se captura nada hasta que una persona haya pagado en esa página. La constancia se entrega por correo, normalmente en pocos minutos; tras el sellado nocturno sigue un segundo correo con el sello del día. Tarifas: servicios y tarifas.
Antes de crear el enlace se comprueba gratis cada dirección: un nombre de dominio público, que no esté en la lista de exclusión, que el robots.txt permita el acceso a nuestro rastreador y que responda sin inicio de sesión. Una dirección que no lo cumple se indica con el motivo, y no se crea ningún enlace. Solo se piden direcciones, nunca una finalidad ni un asunto.
order_capture · POST /order/capture
order_capture(addresses, language, email, timezone)
$ curl -X POST https://machinewitness.eu/order/capture \
-H 'content-type: application/json' \
-d '{"addresses": ["https://example.eu/terms"],
"language": "en",
"email": "you@example.eu",
"timezone": "Europe/Berlin"}'
{"status": "ok",
"reference": "MW-K-3F9A2C1D",
"checkout_url": "https://checkout.stripe.com/...",
"expected_start": "2026-10-02T09:02:00.000Z",
"delivery_notice": "...",
"status_url": "https://machinewitness.eu/order/capture/MW-K-3F9A2C1D"}
{"status": "precheck_failed",
"refused": [{"address": "https://example.eu/account",
"reason": "login", "detail": "This address asks for a login."}],
"detail": "..."}
Hasta veinte direcciones de un mismo dominio. language es en, de, es, fr, it o pl y fija la página de pago y los correos; email rellena de antemano la página de pago; timezone (IANA, por ejemplo Europe/Madrid, valor por defecto) es la zona en la que delivery_notice indica la hora. expected_start es el inicio prometido antes del pago (UTC): ahora si los testigos están libres, si no el final de su trabajo diario más un margen; null si no han dado estimación. Después de las 21:30 UTC no empieza ninguna captura; un encargo posterior empieza en la primera ventana libre del día siguiente.
capture_status · GET /order/capture/{reference}
capture_status(reference)
$ curl https://machinewitness.eu/order/capture/MW-K-3F9A2C1D
{"reference": "MW-K-3F9A2C1D",
"status": "first_delivery_sent",
"addresses": 1,
"capture_day": "2026-10-02",
"witnesses": {"witness-1": "captured", "witness-2": "captured"},
"first_delivery_at": "2026-10-02T09:14:03Z",
"complete_delivery_at": null}
En qué punto está un encargo, en conjunto y por testigo: pendiente de pago, en cola, capturando, primera entrega enviada, completado. Nunca devuelve la dirección de correo, las direcciones encargadas ni ningún otro dato del cliente.
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.