Licencias

Claves firmadas.
Verdad en el servidor.

Cada herramienta con licencia de Devolith usa el mismo motor. Esto es exactamente cómo se comporta — para quien compra y quiere saber qué está activando, y para developers que lo integran.

Regla 01

El servidor decide

Nada en el producto marca localmente un "está licenciado". El cliente pregunta a nuestro servidor y recibe un veredicto; eso es lo único que se le permite creer.

Regla 02

Claves firmadas, no secuenciales

Cada clave lleva una firma HMAC-SHA256 sobre su propio cuerpo. Una clave inventada falla las matemáticas antes de llegar a la base de datos: los generadores de claves no tienen nada que atacar.

Regla 03

Veredictos firmados con Ed25519

Las respuestas se firman con nuestra clave privada y se verifican en el cliente con la pública. Falsear una respuesta "válida" significa forjar una firma, no editar un JSON.

Regla 04

Atado a la máquina y al momento

Cada veredicto incluye la huella de la máquina, el nonce que envió tu cliente y una caducidad. Una respuesta capturada no se puede reproducir en otra máquina ni mantener viva para siempre.

Regla 05

Las plazas se aplican, no se sugieren

Tres máquinas por licencia por defecto. La cuarta se rechaza en el servidor, y tú liberas una plaza desde tu panel con un clic.

Regla 06

El abuso se mide

La validación tiene límite de frecuencia por clave y por IP. Una clave respondiendo desde una multitud de redes se marca y se revisa. Los reembolsos y disputas revocan la clave automáticamente.

La letra pequeña, honesta

No te vamos a decir que es inquebrantable.

Cualquier software que corre en el ordenador de otra persona se puede acabar parcheando — quien diga lo contrario te está vendiendo algo. Lo que hace este motor es que compartirlo por descuido no sirva de nada, que los generadores de claves no funcionen, que la licencia sea revocable en cualquier momento, y que veamos el abuso mientras ocurre. Ese es el nivel de protección que de verdad usan las empresas de software reales.

Compradores

Nada raro corre en tu máquina

La comprobación envía una clave de licencia, una huella de máquina con hash y el nombre del producto. No se escanean archivos, no se recogen datos personales, y el producto sigue funcionando sin conexión hasta que expira el margen de gracia.

Sin conexión

Siete días de gracia por defecto

Cada veredicto firmado es válido siete días, así que vuelos, caídas de VPN o servidores de build sin red no rompen tu trabajo. Pasado ese plazo, el producto pregunta una vez al servidor y sigue.

Agencias

Licencia Extended, mismo motor

El nivel Extended sube el número de plazas y permite proyectos de cliente ilimitados. Misma validación, mismo panel: simplemente ves más máquinas listadas bajo una clave.

API para developers

Tres endpoints. Esa es toda la integración.

Aplica a las herramientas vendidas con licencia (no a las suscripciones SaaS, que no emiten clave Devolith).

POST /api/licence/validate

Activa una máquina y devuelve un veredicto firmado. Consume una plaza la primera vez que se ve una huella.

POST https://devolith.dev/api/licence/validate
Content-Type: application/json

{
  "key": "DV-XXXX-XXXX-XXXX-XXXX",
  "fingerprint": "sha256-de-la-maquina",
  "product": "perfex-ai-assistant",
  "nonce": "aleatorio-por-peticion"
}
200 OK
{
  "valid": true,
  "alg": "ed25519",
  "keyId": "…",
  "signature": "base64…",
  "payload": {
    "sku": "perfex-ai-assistant",
    "status": "valid",
    "machine": "…",
    "seats": 3,
    "seatsUsed": 1,
    "nonce": "aleatorio-por-peticion",
    "expiresAt": "2026-08-22T10:04:11.000Z"
  }
}

Los errores son deliberadamente vagos — invalid_key cubre tanto claves mal formadas como desconocidas, así el endpoint no sirve para enumerar claves válidas. Otros códigos: seat_limit (409), licence_revoked / licence_refunded (403), rate_limited (429).

POST /api/licence/heartbeat

Mismo contrato, pero nunca consume una plaza: solo refresca una activación existente. Llámalo con una frecuencia periódica —una vez al día es suficiente—, no solo al arrancar. Comprobar solo al inicio es el error que vuelve la licencia inútil.

GET /api/licence/public-key

Devuelve la clave pública Ed25519 usada para verificar veredictos. Fíjala dentro de tu build; descárgala solo como respaldo.

Verificar un veredicto

const crypto = require('crypto');
const ok = crypto.verify(
  null,
  Buffer.from(res.body),                 // bytes exactos devueltos
  crypto.createPublicKey(DEVOLITH_PUBLIC_KEY),
  Buffer.from(res.signature, 'base64')
);
if (!ok || res.payload.nonce !== miNonce) throw new Error('manipulado');

Reglas del lado cliente que enviamos con cada producto

  • Verifica la firma y el nonce, nunca solo valid: true.
  • Guarda en caché el veredicto firmado, no un booleano, y respeta expiresAt.
  • Vuelve a comprobar periódicamente en segundo plano, y tras cada actualización.
  • Publica los builds de producción minificados y ofuscados, con la comprobación repetida en varios puntos en lugar de una única función isLicensed().
  • Degrada con educación cuando falla una comprobación: explica, enlaza al panel de cuenta, y nunca destruyas los datos del usuario.

El cliente de referencia se incluye con cada compra (devolith-licence.js para Node, Electron y extensiones de navegador, devolith-licence.php para plugins y temas de WordPress) y está listo para usar.

Ya eres comprador

Gestiona tus claves.

Rota una clave comprometida, libera una máquina, descarga la última versión.