Logs de ejecución
El JSONL de una sesión, las llamadas a herramientas y sus respuestas, el diff que aplicó. Un registro de auditoría (audit trail) que nadie puede retocar después sin que se note.
Agentes de IA · API · x402
Tu agente calcula el hash SHA-256 de un registro —un log de ejecución, una decisión con sus entradas, un resultado entregado— y lo envía a Sellat. Recibe una prueba anclada en Polygon y en Bitcoin que cualquiera puede verificar sin confiar en Sellat. Si la fecha tiene que valer ante un tercero, añade un sello de tiempo cualificado eIDAS.
Sellat no certifica que una acción se ejecutara ni que su resultado sea correcto. Certifica que esos bytes exactos existían en ese momento y que no han cambiado desde entonces.
Qué se sella
Sellat no lee el registro ni sabe qué contiene: trabaja con su huella. Eso permite sellar evidencias de ejecución de cualquier modelo, framework o plataforma con la misma llamada HTTP.
El JSONL de una sesión, las llamadas a herramientas y sus respuestas, el diff que aplicó. Un registro de auditoría (audit trail) que nadie puede retocar después sin que se note.
La instrucción recibida, los datos consultados y la decisión tomada, en un mismo documento. Si algo sale mal, se puede demostrar qué había escrito en ese momento.
El informe, el contrato redactado, el dataset generado o el código entregado al cliente: la prueba fija la versión exacta y la fecha.
Tu sistema encadena cada entrada con el hash de la anterior y sella la cabeza de la cadena cada cierto tiempo. El registro sigue en tus manos; Sellat solo fecha su estado.
Límites claros
La llamada
Un agente con una cartera USDC en Base paga cada llamada con x402: sin cuenta, sin clave y sin formulario. Las respuestas de este ejemplo son las reales de la API, recortadas.
El hash se calcula donde está el registro. A Sellat solo viajan 64 caracteres hexadecimales.
sha256sum agent-run.jsonl
# 9f2b…c41e agent-run.jsonl La API responde 402 con el precio, la red, el token y la dirección. El sobre está en la cabecera PAYMENT-REQUIRED y también en el cuerpo, junto con la URL y la versión de las condiciones que se aceptan al pagar.
curl -i https://sellat.app/api/v2/proofs \
-H "Content-Type: application/json" \
-d '{"hash":"<sha256 de 64 hex>","name":"agent-run.jsonl"}'
HTTP/2 402
payment-required: eyJ4NDAyVmVyc2lvbiI6Mi…
{
"x402Version": 2,
"accepts": [{ "scheme": "exact", "network": "eip155:8453",
"amount": "10000", "asset": "0x8335…2913" }],
"error": { "code": "payment_required",
"message": "This call costs 0.01 USD, paid per call with x402 (USDC)." }
} El cliente lee el 402, firma una autorización EIP-3009 por el importe exacto y repite la llamada. El gas lo paga el facilitador. Por defecto el cliente no paga más de 1 $ por llamada, y ninguna llamada de Sellat lo supera.
import { createHash } from "node:crypto";
import { readFileSync } from "node:fs";
import { x402Client, wrapFetchWithPayment } from "@x402/fetch";
import { ExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";
const client = new x402Client();
client.setSpendControls({ maxAmountPerPayment: "$1" });
client.register("eip155:8453", new ExactEvmScheme(privateKeyToAccount(process.env.AGENT_KEY)));
const pay = wrapFetchWithPayment(fetch, client);
const hash = createHash("sha256").update(readFileSync("agent-run.jsonl")).digest("hex");
const res = await pay("https://sellat.app/api/v2/proofs", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ hash, name: "agent-run.jsonl", metadata: { run: "2026-10-31-0142" } }),
});
const proof = await res.json(); // 201: proof_id, urls, api_key (una sola vez) La respuesta trae el identificador, el estado y las URL de la prueba portable, el certificado y el paquete de evidencias. La primera prueba de una cartera devuelve una sola vez una clave de solo lectura para consultar sus pruebas gratis.
{
"id": "6f2c9b1e-0d1a-4b9f-8e7c-2a4d5b6c7d8e",
"created": true,
"state": "queued",
"anchoring": { "policy": "fast" },
"urls": {
"proof_json": "https://sellat.app/api/v2/proof/6f2c9b1e-….json",
"certificate": "https://sellat.app/certificate/…",
"evidence_zip": "https://sellat.app/api/v2/proofs/6f2c9b1e-…/evidence.zip"
},
"api_key": "sellat_…",
"payment": { "charged": true, "amount_usd": "0.01", "transaction": "0x…" }
} Sobre el mismo proof_id y sin volver a calcular nada. Un prestador cualificado de la lista de confianza de la UE emite el token RFC 3161 en segundos.
await pay(`https://sellat.app/api/v2/proofs/${proof.id}/qualified`, { method: "POST" });
// 200: qualified.state = "issued", qualified.time, tsr_url Mismos bytes, misma cartera: la segunda llamada devuelve la prueba existente y no se cobra. Una llamada que falla tampoco se cobra: el pago se verifica antes del trabajo y se liquida después.
Con una clave de API de una cuenta gratuita, la misma llamada no pasa por x402: 1000 pruebas al día, ancladas en el lote que se cierra cada cuatro horas. La Cuenta Pro las ancla en minutos.
curl https://sellat.app/api/v2/proofs \
-H "Authorization: Bearer sellat_…" \
-H "Content-Type: application/json" \
-d '{"hash":"<sha256 de 64 hex>","name":"agent-run.jsonl"}' Cómo crear una clave → Asistentes y MCP
Claude Code, Gemini CLI, Cursor o ChatGPT no llevan cartera: trabajan con la cuenta de la persona que los usa. Sellat les llega como servidor MCP, como habilidad o como plugin, y el hash se calcula siempre en el dispositivo de la persona.
sellat-mcp corre en local, encuentra el archivo, calcula su hash y llama a la API con la clave de la cuenta. Una línea en Claude Code; Gemini CLI, Cursor y Claude Desktop en el README.
claude mcp add sellat -e SELLAT_API_TOKEN=sellat_… -- npx -y sellat-mcp Un archivo en el formato abierto de Agent Skills que enseña al agente cuándo sellar, qué demuestra la prueba y cómo pagar: con la clave de la cuenta o por llamada con x402. Sirve para Claude Code, Codex, Cursor, Gemini CLI y Copilot, entre otros.
npx skills add skanthemore/sellat-cli --skill sellat El plugin de Sellat en el directorio de ChatGPT: la persona conecta su cuenta de Sellat, el archivo se calcula en el navegador y no sale de su dispositivo. Sin clave de API.
Sellar desde ChatGPT →Un asistente sin cartera no paga por llamada: usa las pruebas de la cuenta a la que está conectado. Si el agente tiene su propia cartera, la habilidad le enseña a pagar con x402.
La respuesta
Todo lo que hace falta para defender el registro sin Sellat, en formatos abiertos.
proof_idstateanchorsbitcoinqualifiedproof_jsoncertificateevidence_zipVerificación independiente
La verificación recalcula el hash, recorre el camino Merkle hasta la raíz y busca esa raíz en una transacción pública. Si Sellat desapareciera mañana, la prueba seguiría siendo verificable.
El verificador abierto recalcula todo en local y consulta un nodo público de Polygon.
curl -o proof.json https://sellat.app/api/v2/proof/<proof_id>.json
npx sellat-verify agent-run.jsonl proof.json El paquete de evidencias trae el .tsr y el certificado de la autoridad que lo firmó: OpenSSL lo valida sin conexión y sin Sellat.
openssl ts -verify -in sello-cualificado-<id>.tsr -data agent-run.jsonl -CAfile autoridad-sellado.pem -partial_chain El paquete incluye el .ots de la raíz del lote, que también va dentro de proof.json. El cliente estándar de OpenTimestamps lo comprueba contra tu nodo de Bitcoin; sin nodo, te dice qué bloque mirar en cualquier explorador.
ots verify -d "$(jq -r .merkle.root proof.json)" anclaje-bitcoin.ots
# sin nodo propio:
ots --no-bitcoin verify -d "$(jq -r .merkle.root proof.json)" anclaje-bitcoin.ots
# To verify manually, check that Bitcoin block … has merkleroot … También en el navegador: la página de verificación comprueba un archivo contra su prueba sin subirlo. sellat.app/verify →
Registros a prueba de manipulación
Para documentar una secuencia de pasos no hace falta sellar cada uno. Tu agente escribe su registro como siempre y añade a cada entrada el hash de la anterior. Cada cierto tiempo, o al terminar la tarea, sella solo el hash de la última entrada.
Esa prueba fija toda la cadena hasta ese punto: cambiar, quitar o reordenar una entrada anterior rompe los hashes que la siguen. Cuanto más a menudo se sella la cabeza, más corta es la ventana en la que alguien podría reescribir el registro antes de que quede fechado.
El registro, su formato y su contenido se quedan en tu sistema. Sellat no ve los pasos, no los monitoriza y no guarda nada más que la huella.
{"seq": 41, "prev": "3a7f…e2", "at": "2026-10-31T09:14:02Z", "tool": "crm.update", "input_sha256": "…", "output_sha256": "…"}
{"seq": 42, "prev": "sha256(línea 41)", "at": "2026-10-31T09:14:05Z", "decision": "close_deal", "evidence_sha256": "…"}
# al cerrar la tarea: POST /api/v2/proofs con el hash de la línea 42 El formato es el que tú elijas. Si sigues un estándar de registros de auditoría para agentes, la prueba lo fecha igual.
Precio por llamada
Precios con IVA incluido. Pagar acepta las condiciones de Sellat, cuya versión se guarda con cada pago.
Red: Base. Token: USDC. La lista de precios en JSON está en GET /api/v2/x402.
Preguntas frecuentes
No. Sellat certifica la integridad y la existencia en el tiempo del registro: que esos bytes exactos existían en una fecha y no han cambiado. Que el agente ejecutara la acción, que el registro esté completo o que la decisión fuera correcta depende de quién y cómo lo escribió.
No. Solo viaja el hash SHA-256. El registro, sus datos personales y sus secretos se quedan en tu sistema. Sellat no puede reconstruir el contenido a partir de la huella.
Con x402, no: la cartera que paga es la cuenta, y la primera prueba devuelve una clave de solo lectura. Si el agente trabaja para una cuenta de Sellat, puede usar su clave de API y no pagar por llamada.
Un cliente x402 y una cartera con USDC en Base con un límite de gasto: los SDK oficiales de x402, Coinbase Agentic Wallets o AWS Bedrock AgentCore Payments, por ejemplo. Los asistentes de chat sin cartera no pueden pagar por su cuenta: para ellos está la clave de API o el conector de Sellat.
Una prueba pagada con x402 entra en el lote rápido y queda anclada en Polygon en minutos; la atestación de Bitcoin llega horas después. El sello cualificado se emite en segundos.
Encadena las entradas en tu propio registro y sella la cabeza de la cadena cada cierto tiempo o al terminar la tarea. Una prueba fija todo lo anterior.
Sí. Es una llamada HTTP con un hash: no depende del modelo, del framework ni de la plataforma donde corre el agente.
La prueba portable, el paquete de evidencias, la transacción de Polygon, la atestación de Bitcoin y el token cualificado se verifican con herramientas abiertas, sin Sellat.
Un hash, una llamada y una prueba que cualquiera puede comprobar.
Ver la llamada Referencia de la API →