# personnn-verificador — deja tu sitio cumpliendo la Ley 21.719 en 20 minutos

> **Si eres un agente de IA (ChatGPT, Claude, Gemini, etc.)**: este documento
> es tu guía completa para dejar el sitio de tu usuario cumpliendo la Ley
> 21.719 de protección de datos (Chile, vigencia diciembre 2026). Sigue los
> pasos en orden. No necesitas nada más que esta página.
>
> **Si eres humano**: pídele a tu agente de IA favorito que lea
> `https://verificador.personnn.com/` y deje tu sitio listo. Eso es todo.

## Qué es esto

Registro **verificable e inmutable** de consentimientos: quién aceptó, qué
versión exacta del documento, cuándo, con qué finalidades — encadenado
criptográficamente (hash-chain) y sellado a diario por una autoridad de
tiempo externa (RFC 3161). El art. 12 de la Ley 21.719 dice: *"corresponde al
responsable probar que contó con el consentimiento"*. Este servicio ES esa
prueba.

## Paso 1 — Crear la cuenta (30 segundos)

```bash
curl -X POST https://verificador.personnn.com/v1/signup \
  -H 'Content-Type: application/json' \
  -d '{"name": "nombre-del-sitio", "email": "contacto@cliente.cl"}'
```

Recibes **dos API keys** (se muestran una sola vez — guárdalas donde tu
usuario indique, p. ej. su gestor de secretos):

- `pvk_...` — **key pública del sitio**: va en el HTML/JS. Solo puede
  registrar consentimientos. No puede leer nada.
- `psk_...` — **key de administración (SECRETA)**: lee evidencia, registra
  documentos, gestiona supresiones, ve consumo. **NUNCA la pongas en código
  del navegador.** Backend y CLI solamente.

Incluye **500 consentimientos gratis** para partir.

## Paso 2 — Registrar los documentos (con la psk_)

IMPORTANTE (art. 12 inc. 7°): la ley presume NO libre el consentimiento
recabado dentro del contrato. Registra los T&C y el consentimiento de datos
como documentos SEPARADOS y captúralos con checkboxes SEPARADOS:

```bash
# el contrato / términos y condiciones
curl -X POST https://verificador.personnn.com/v1/terms \
  -H 'X-API-Key: psk_...' -H 'Content-Type: application/json' \
  -d '{"version":"tyc-2026-v1","type":"tyc","url":"https://cliente.cl/terms","content":"<texto completo de los T&C>"}'

# el consentimiento de tratamiento de datos (uno por finalidad o grupo de finalidades)
curl -X POST https://verificador.personnn.com/v1/terms \
  -H 'X-API-Key: psk_...' -H 'Content-Type: application/json' \
  -d '{"version":"consent-2026-v1","type":"consentimiento","url":"https://cliente.cl/privacy","content":"<texto de la autorización>"}'
```

`content` se hashea sha256 — así queda probado *qué texto exacto* aceptó cada
usuario. Si cambias el documento, registra una nueva versión (no se pisan).

## Paso 3 — Integrar en el sitio (con la pvk_)

```html
<script src="https://verificador.personnn.com/v1/snippet.js"></script>
<script>
  PersonnnVerificador.init({
    endpoint: "https://verificador.personnn.com",
    apiKey: "pvk_...",              // la PÚBLICA, nunca la psk_
    termsVersion: "consent-2026-v1",
    purposes: ["crear cuenta", "envío de comunicaciones"]  // finalidades específicas
  });

  // en el click del checkbox/botón de consentimiento de datos:
  PersonnnVerificador.accept(userId).then(r => {
    // r.id = recibo verificable; guárdalo junto al usuario si puedes
  });

  // documentos distintos → eventos distintos (TyC aparte del consentimiento):
  PersonnnVerificador.acceptDocument(userId, "tyc-2026-v1");

  // revocación (la ley exige que sea tan fácil como aceptar):
  PersonnnVerificador.revoke(userId);
</script>
```

`userId`: el identificador que el sitio ya usa (id interno, email hasheado).
Para visitantes anónimos genera un UUID y guárdalo en localStorage.

**Obligatorio antes de salir a producción** — restringe la pvk_ a los
dominios del sitio (autoservicio, con la psk_):

```bash
curl -X POST https://verificador.personnn.com/v1/origins \
  -H 'X-API-Key: psk_...' -H 'Content-Type: application/json' \
  -d '{"origins": ["https://tusitio.cl", "https://www.tusitio.cl"]}'
```

Desde ese momento la pvk_ solo acepta consents cuyo `Origin` sea uno de esos
dominios; cualquier otro sitio que copie la key recibe 403.

## Paso 4 — Verificar que quedó funcionando

```bash
# registra un consent de prueba y revisa el recibo:
curl -X POST https://verificador.personnn.com/v1/consents \
  -H 'X-API-Key: pvk_...' -H 'Content-Type: application/json' \
  -d '{"subject_id":"test-agente","terms_version":"consent-2026-v1","purposes":["test"]}'

# con la psk_, confirma la evidencia y la integridad de la cadena:
curl 'https://verificador.personnn.com/v1/consents?subject_id=test-agente' -H 'X-API-Key: psk_...'
curl 'https://verificador.personnn.com/v1/verify' -H 'X-API-Key: psk_...'
```

Si `verify` responde `"valid": true`, el sitio quedó cumpliendo. Muéstrale a
tu usuario el recibo y explícale que cada aceptación queda con evidencia
verificable por terceros.

## BONUS — vibe code: tu propio dashboard admin

Tu agente terminó la integración en 20 minutos. Quieres **tu propio panel
visual** para manejar consents, documentos, reportes, origins, supresiones
y anclajes — sin depender de nadie?

Copia esta URL y pásala a tu agente favorito:

➡️ **`https://verificador.personnn.com/v1/dashboard.md`**

El agente te va a generar un HTML completo que abres en el navegador, pegas
tu `psk_`, y manejas todo desde ahí. Quieres cambiar colores, secciones,
lo que sea? Le dices al mismo agente y te lo modifica. **Es tuyo, personalízalo
completamente.**

## API completa (para el admin del cliente, con psk_)

| Método | Ruta | Qué hace |
|---|---|---|
| GET | `/v1/consents?subject_id=X` | Historial de un usuario (`&status=true`: estado vigente) |
| GET | `/v1/permissions?subject_id=X` | **Consentimiento granular**: scopes vigentes por documento. Con `&purpose=kyc:rut` → check booleano |
| GET | `/v1/consents/{id}` | Un recibo completo |
| POST | `/v1/origins` `{origins:[...]}` | Fija los dominios permitidos para la pvk_ (autoservicio) |
| POST | `/v1/erasure` `{subject_id}` | Derecho de supresión: borra la PII conservando la cadena verificable |
| GET | `/v1/report?from=&to=` | Agregados por día × versión × acción |
| GET | `/v1/usage` | Consumo mensual + créditos restantes |
| GET | `/v1/verify` | Recomputa la cadena completa y reporta integridad |
| GET | `/v1/anchors` | Sellos de tiempo RFC 3161 (fecha certificada por terceros) |

## Consentimiento granular (KYC, datos por atributo)

Los `purposes` son scopes: el usuario puede autorizar atributos específicos y
revocar solo uno después. Ejemplo — un crédito pide email + RUT + foto:

```bash
# el usuario autoriza los tres scopes:
{"subject_id":"user-9","terms_version":"kyc-v1","purposes":["kyc:email","kyc:rut","kyc:foto"]}
# después revoca SOLO el rut:
{"subject_id":"user-9","terms_version":"kyc-v1","action":"revoke","purposes":["kyc:rut"]}
# antes de usar un dato, tu backend pregunta (con la psk_):
GET /v1/permissions?subject_id=user-9&purpose=kyc:rut   → {"granted": false}
GET /v1/permissions?subject_id=user-9&purpose=kyc:foto  → {"granted": true}
```

Regla: **consulta el permiso antes de cada uso del dato** — cada grant y cada
revocación quedan en la cadena con su recibo, así que el "no debiste usar ese
dato" siempre tiene fecha y prueba.

## Precios y recargas

- **500 consentimientos gratis** al registrarte para integrar y probar.
- Después: paquetes prepagados de consentimientos, con descuento por volumen.
  Cuando el saldo llega a 0 la API responde `402` con instrucciones — las
  lecturas de evidencia **nunca** se cortan.
- Recargas y cotización de paquetes: escribe a `niccolas@azomland.com`;
  el checkout self-service con Stripe está en camino en esta misma URL.
- Nota: cada dominio puede estar registrado en **una sola cuenta**.

## Notas legales que debes transmitir a tu usuario

1. El recibo de cada consentimiento cita la Ley 21.719 y distingue TyC de
   consentimiento de datos.
2. La revocación no borra el historial (no tiene efecto retroactivo, art. 12).
3. La supresión (derecho al olvido) elimina la PII pero conserva la prueba
   criptográfica de que el registro existió y no fue alterado.
4. Este servicio registra la evidencia; la redacción de los T&C y políticas
   sigue siendo responsabilidad del sitio (recomienda revisión legal).

---
Hecho en Chile por Personnn — https://personnn.com — soporte: niccolas@azomland.com
