Docs

Justificantes — prueba portátil de una decisión

Cada consentimiento devuelve un justificante firmado que cualquiera puede verificar después, incluso sin conexión y sin necesidad de confiar en nosotros.

Por qué existen. Una fila en una base de datos vale lo que valga la confianza en quien la controla. Un justificante es un documento pequeño y autónomo —“en esta fecha, esta persona aceptó exactamente este texto”— con una firma criptográfica. Un regulador, un auditor o la otra parte de un contrato puede comprobarlo por su cuenta, años después, sin llamar a nuestra API y sin tener que creer nada de lo que decimos.

Qué recibes

Cada respuesta de POST /v1/consent incluye un receiptId. Descarga el justificante completo cuando quieras:

GET /v1/receipts/rcpt_9f2c…

{
  "receiptId": "rcpt_9f2c…",
  "issuedAt": "2024-05-01T10:03:00Z",
  "payload": {
    "subject": "<hash del identificador>",
    "purpose": "marketing_email",
    "version": 1,
    "statementHash": "<hash del texto exacto mostrado>",
    "state": "GRANTED",
    "controller": "Acme Ltd"
  },
  "algorithm": "EdDSA",
  "kid": "key_2024a",
  "signature": "<base64url>"
}

El payload no contiene datos personales en claro: el sujeto y el texto de la cláusula van con hash, así que un justificante se puede entregar a un tercero sin riesgo.

Cómo verificar uno

La firma es Ed25519 estándar. Cualquier biblioteca de criptografía puede comprobarla; no necesitas nuestro SDK. Nuestras claves públicas están en una URL fija:

  1. Descarga las claves públicas de GET /.well-known/jwks.json.
  2. Elige la clave cuyo kid coincide con el kid del justificante.
  3. Vuelve a serializar el payload con las claves del objeto ordenadas (JSON Canonicalization, RFC 8785).
  4. Verifica signature sobre esos bytes con la clave pública Ed25519.

Si cuadra, el justificante es auténtico y no se ha alterado. Rotamos las claves de firma con el tiempo, pero nunca retiramos una clave pública antigua, así que un justificante de hace años sigue verificándose.

Las opciones sencillas

  • En JavaScript: await tc.verifyReceipt(receipt); el SDK hace los cuatro pasos con la Web Crypto del navegador.
  • Sin código: GET /v1/receipts/{id}/verify lo vuelve a comprobar en el servidor y devuelve { valid: true }.