API REST Unificada

13 productos de ciberseguridad, un unico endpoint. Cifrado post-cuantico, analisis de vulnerabilidades, firma digital, cumplimiento normativo y mas — todo accesible via HTTP con respuestas JSON.

Introduccion

La API de PWR.es expone todas las funcionalidades de la plataforma a traves de una interfaz REST sencilla. Cada producto tiene un prefijo y un conjunto de acciones.

URL base

EntornoURL
Produccionhttps://pwr.es/api/v1/{producto}/{accion}
Desarrollohttp://localhost/pwr.es/api-v2.php?p={producto}&a={accion}

Formato de respuesta

Todas las respuestas son JSON con la estructura base:

JSON
{
    "ok": true,
    "producto": "cuantica",
    "accion": "cifrar",
    "datos": { ... },
    "ms": 12.4
}
Versionado: La API actual es v1. Todas las URLs incluyen el prefijo de version. Las versiones futuras mantendran retrocompatibilidad o se publicaran como v2.

Content-Type

Las peticiones POST deben enviar el body como application/json. El payload maximo es de 1 MB.

Autenticacion

Los endpoints POST requieren autenticacion mediante token Bearer. Los endpoints GET de informacion (info, health, routes) son publicos.

Cabecera de autorizacion

HTTP Header
Authorization: Bearer <tu-token>

Obtener un token

  1. Accede a tu panel en https://pwr.es/panel
  2. Ve a Ajustes → API → Generar token
  3. Copia el token (solo se muestra una vez)
Importante: Tu token es secreto. No lo expongas en codigo frontend, repositorios publicos ni lo compartas. Si sospechas que se ha filtrado, revocalo inmediatamente desde el panel.

Ejemplo con cURL

cURL
curl -X POST https://pwr.es/api/v1/cuantica/cifrar \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer TU_TOKEN_AQUI" \
  -d '{"texto":"Hola mundo","clave":"mi-clave-secreta"}'

Rate Limiting

Las peticiones se limitan por IP y por token segun el plan contratado.

PlanLimiteVentana
Gratis (sin token)100 req1 hora
Pro10.000 req1 hora
Agencia100.000 req1 hora
EnterpriseIlimitado

Cuando se supera el limite, la API responde con 429 Too Many Requests:

JSON — Error 429
{
    "ok": false,
    "error": "Rate limit excedido. Reintenta en 42 segundos.",
    "retry_after": 42
}
Cabeceras de rate limit: Cada respuesta incluye X-RateLimit-Limit, X-RateLimit-Remaining y X-RateLimit-Reset para que puedas controlar tu consumo.

Modos de despliegue

PWR.es soporta 4 modos de despliegue segun tus necesidades de soberania, rendimiento e infraestructura.

100% Local

Modo A: FFI Local

Todo se ejecuta en tu servidor. Criptografia via FFI (liboqs). Sin llamadas externas. Maxima soberania.

Hibrido

Modo B: API PQC

Cifrado simetrico local. Operaciones Kyber (keygen, encapsular, decapsular) via API de PWR.es.

Docker

Modo C: Docker

Todo en un contenedor Docker con liboqs precompilado. Ideal para CI/CD y despliegue reproducible.

Nuevo

Modo D: 100% API

Todo via API, nada local. Cero dependencias en tu servidor. Solo necesitas HTTP y un token.

Modo D es el mas sencillo de integrar: cualquier lenguaje con soporte HTTP puede usar todos los productos de PWR.es sin instalar nada.

Cuantica

Cifrado post-cuantico multicapa (AES-256-GCM + ChaCha20 + capas adicionales).

cifrar

POST /api/v1/cuantica/cifrar Auth requerida

Cifra un texto con cifrado multicapa.

Request body

CampoTipoDescripcion
textostringTexto plano a cifrar
clavestringClave de cifrado

Respuesta

JSON
{
    "ok": true,
    "cifrado": "base64...",
    "capas": 6,
    "ms": 8.2
}

descifrar

POST /api/v1/cuantica/descifrar Auth requerida

Descifra un texto cifrado con Cuantica.

CampoTipoDescripcion
cifradostringTexto cifrado (base64)
clavestringClave utilizada al cifrar

cifrar-campo / descifrar-campo

POST /api/v1/cuantica/cifrar-campo Auth requerida

Cifra/descifra un campo individual dentro de un objeto JSON. Ideal para cifrar campos de base de datos.

CampoTipoDescripcion
datosobjectObjeto JSON con los datos
campostringNombre del campo a cifrar
clavestringClave de cifrado

cifrar-lote / descifrar-lote

POST /api/v1/cuantica/cifrar-lote Auth requerida

Cifra/descifra multiples textos en una sola peticion.

CampoTipoDescripcion
textosarrayArray de strings a cifrar
clavestringClave de cifrado

info

GET /api/v1/cuantica/info Sin auth

Devuelve informacion del modulo: version, capas disponibles, algoritmos.

PQC (Post-Quantum Crypto)

Operaciones de criptografia post-cuantica basadas en ML-KEM (Kyber).

keygen

POST /api/v1/pqc/keygen Auth requerida

Genera un par de claves ML-KEM (publica + privada).

CampoTipoDescripcion
nivelstring"512", "768" o "1024" (por defecto "768")
JSON — Respuesta
{
    "ok": true,
    "publica": "base64...",
    "privada": "base64...",
    "algoritmo": "ML-KEM-768"
}

encapsular

POST /api/v1/pqc/encapsular Auth requerida

Encapsula un secreto compartido usando la clave publica.

CampoTipoDescripcion
clave_publicastringClave publica en base64

decapsular

POST /api/v1/pqc/decapsular Auth requerida

Decapsula el secreto compartido usando la clave privada.

CampoTipoDescripcion
ciphertextstringCiphertext en base64
clave_privadastringClave privada en base64

info

GET /api/v1/pqc/info Sin auth

Informacion del modulo PQC: algoritmos soportados, niveles de seguridad.

Escudo

Firewall de aplicacion web (WAF). Analiza payloads en busca de inyecciones, XSS y patrones maliciosos.

analizar

POST /api/v1/escudo/analizar Auth requerida

Analiza un payload (string, formulario, URL) en busca de amenazas.

CampoTipoDescripcion
inputstringTexto o payload a analizar
contextostring(Opcional) "url", "body", "header"
JSON — Respuesta
{
    "ok": true,
    "seguro": false,
    "amenazas": ["sqli", "xss"],
    "puntuacion": 92,
    "detalles": [...]
}

Umbral

Autenticacion segura: hashing de contrasenas y generacion/verificacion TOTP.

hash

POST /api/v1/umbral/hash Auth requerida

Genera un hash seguro de una contrasena (Argon2id).

CampoTipoDescripcion
passwordstringContrasena a hashear

verificar

POST /api/v1/umbral/verificar Auth requerida

Verifica una contrasena contra un hash existente.

CampoTipoDescripcion
passwordstringContrasena a verificar
hashstringHash almacenado

totp-generar

POST /api/v1/umbral/totp-generar Auth requerida

Genera un secreto TOTP y su URI para codigos QR.

CampoTipoDescripcion
usuariostringIdentificador del usuario
emisorstring(Opcional) Nombre de la aplicacion
JSON — Respuesta
{
    "ok": true,
    "secreto": "JBSWY3DPEHPK3PXP",
    "uri": "otpauth://totp/PWR:usuario?secret=...",
    "qr_url": "https://..."
}

totp-verificar

POST /api/v1/umbral/totp-verificar Auth requerida

Verifica un codigo TOTP contra el secreto almacenado.

CampoTipoDescripcion
codigostringCodigo TOTP de 6 digitos
secretostringSecreto TOTP base32

Rubrica

Firma digital post-cuantica basada en ML-DSA (Dilithium).

firmar

POST /api/v1/rubrica/firmar Auth requerida

Firma digitalmente un mensaje con clave privada ML-DSA.

CampoTipoDescripcion
mensajestringMensaje a firmar
clave_privadastringClave privada en base64

verificar

POST /api/v1/rubrica/verificar Auth requerida

Verifica una firma digital con la clave publica.

CampoTipoDescripcion
mensajestringMensaje original
firmastringFirma en base64
clave_publicastringClave publica en base64

keygen

POST /api/v1/rubrica/keygen Auth requerida

Genera un par de claves ML-DSA para firma digital.

CampoTipoDescripcion
nivelstring(Opcional) "44", "65" o "87". Por defecto "65"

Vigia

Escaner pasivo de vulnerabilidades web: headers, SSL, cookies, directorios, tecnologias, DNS.

analizar

POST /api/v1/vigia/analizar Auth requerida

Ejecuta un analisis completo de seguridad sobre una URL.

CampoTipoDescripcion
urlstringURL completa a analizar (incluir https://)
JSON — Respuesta
{
    "ok": true,
    "nota": "B+",
    "puntos": 78,
    "headers": {...},
    "ssl": {...},
    "cookies": [...],
    "directorios": [...],
    "tecnologias": [...],
    "dns": {...}
}

Norma

Auditor de cumplimiento normativo: RGPD, LOPDGDD, ENS, ISO 27001, PCI DSS, NIS2.

auditar

POST /api/v1/norma/auditar Auth requerida

Audita una URL o configuracion contra una o varias normativas.

CampoTipoDescripcion
urlstringURL del sitio a auditar
normativasarray(Opcional) ["rgpd","ens","iso27001"]. Por defecto: todas
JSON — Respuesta
{
    "ok": true,
    "cumplimiento": {
        "rgpd": { "nota": "B", "puntos": 75, "controles": [...] },
        "ens": { "nota": "A", "puntos": 90, "controles": [...] }
    }
}

Radar

Analisis de preparacion post-cuantica y configuracion TLS.

analizar-tls

POST /api/v1/radar/analizar-tls Auth requerida

Analiza la configuracion TLS de un dominio: version, cipher suites, certificado.

CampoTipoDescripcion
dominiostringDominio a analizar (sin protocolo)

pqc-readiness

POST /api/v1/radar/pqc-readiness Auth requerida

Evalua si un dominio esta preparado para la era post-cuantica.

CampoTipoDescripcion
dominiostringDominio a analizar
JSON — Respuesta
{
    "ok": true,
    "pqc_ready": false,
    "puntuacion": 35,
    "riesgos": ["Sin soporte ML-KEM", "Cipher suites clasicas"],
    "recomendaciones": [...]
}

Tunel

Canal de comunicacion cifrado punto a punto con claves efimeras.

crear-sesion

POST /api/v1/tunel/crear-sesion Auth requerida

Inicia una sesion de tunel cifrado. Devuelve un ID de sesion y claves efimeras.

CampoTipoDescripcion
ttlint(Opcional) Tiempo de vida en segundos. Por defecto: 3600

cifrar

POST /api/v1/tunel/cifrar Auth requerida

Cifra un mensaje dentro de una sesion de tunel activa.

CampoTipoDescripcion
sesion_idstringID de la sesion activa
mensajestringMensaje a cifrar

descifrar

POST /api/v1/tunel/descifrar Auth requerida

Descifra un mensaje recibido a traves del tunel.

CampoTipoDescripcion
sesion_idstringID de la sesion activa
cifradostringMensaje cifrado en base64

Malla

Cifrado para redes mesh y comunicacion multipunto.

generar-claves

POST /api/v1/malla/generar-claves Auth requerida

Genera un par de claves para un nodo de la malla.

CampoTipoDescripcion
nodo_idstringIdentificador del nodo

cifrar-paquete

POST /api/v1/malla/cifrar-paquete Auth requerida

Cifra un paquete para uno o varios nodos destino.

CampoTipoDescripcion
mensajestringMensaje a cifrar
destinosarrayArray de claves publicas destino

descifrar-paquete

POST /api/v1/malla/descifrar-paquete Auth requerida

Descifra un paquete recibido en la malla.

CampoTipoDescripcion
paquetestringPaquete cifrado en base64
clave_privadastringClave privada del nodo receptor

Antena

Auditoria y configuracion de headers de seguridad HTTP.

auditar

POST /api/v1/antena/auditar Auth requerida

Audita los headers de seguridad de una URL y devuelve recomendaciones.

CampoTipoDescripcion
urlstringURL a auditar
JSON — Respuesta
{
    "ok": true,
    "nota": "A-",
    "headers_presentes": ["HSTS", "CSP", "X-Frame-Options"],
    "headers_faltantes": ["Permissions-Policy"],
    "recomendaciones": [...]
}

generar-config

POST /api/v1/antena/generar-config Auth requerida

Genera configuracion de headers de seguridad para Apache, Nginx o PHP.

CampoTipoDescripcion
servidorstring"apache", "nginx" o "php"
dominiostringDominio para CSP y HSTS

Sistema

Endpoints de informacion y estado del servidor API.

info

GET /api/v1/sistema/info Sin auth

Version de la API, productos disponibles, modo de despliegue.

JSON — Respuesta
{
    "ok": true,
    "version": "1.0.0",
    "productos": 13,
    "modo": "D",
    "php": "8.3.0"
}

health

GET /api/v1/sistema/health Sin auth

Estado de salud de la API. Util para monitorizacion y load balancers.

JSON — Respuesta
{
    "ok": true,
    "status": "healthy",
    "uptime": 86400
}

routes

GET /api/v1/sistema/routes Sin auth

Lista todas las rutas disponibles con metodo, producto y accion.

Codigos de error

La API usa codigos HTTP estandar. El cuerpo siempre contiene ok: false y un mensaje descriptivo.

CodigoSignificadoCausa habitual
400Bad RequestParametros faltantes o formato JSON invalido
401UnauthorizedToken ausente, expirado o invalido
405Method Not AllowedMetodo HTTP incorrecto (ej: GET en endpoint POST)
413Payload Too LargeBody supera 1 MB
429Too Many RequestsRate limit excedido
500Internal Server ErrorError interno de la API
501Not ImplementedProducto o accion no existe
503Service UnavailableServicio en mantenimiento

Formato de error

JSON — Error
{
    "ok": false,
    "error": "Parametro 'texto' es obligatorio.",
    "codigo": 400
}

Ejemplos completos

Ejemplos funcionales en varios lenguajes para cifrar un texto con Cuantica.

cURL

cURL
# Cifrar un texto
curl -X POST https://pwr.es/api/v1/cuantica/cifrar \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer TU_TOKEN" \
  -d '{"texto":"Datos sensibles","clave":"clave-secreta-123"}'

# Consultar estado (sin auth)
curl https://pwr.es/api/v1/sistema/health

PHP

PHP
$token = 'TU_TOKEN';
$url   = 'https://pwr.es/api/v1/cuantica/cifrar';

$datos = json_encode([
    'texto' => 'Datos sensibles',
    'clave' => 'clave-secreta-123'
]);

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => $datos,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => [
        'Content-Type: application/json',
        'Authorization: Bearer ' . $token
    ]
]);

$respuesta = json_decode(curl_exec($ch), true);
curl_close($ch);

if ($respuesta['ok']) {
    echo 'Cifrado: ' . $respuesta['cifrado'];
} else {
    echo 'Error: ' . $respuesta['error'];
}

Python

Python
import requests

token = "TU_TOKEN"
url   = "https://pwr.es/api/v1/cuantica/cifrar"

resp = requests.post(url,
    json={"texto": "Datos sensibles", "clave": "clave-secreta-123"},
    headers={"Authorization": f"Bearer {token}"}
)

data = resp.json()
if data["ok"]:
    print(f"Cifrado: {data['cifrado']}")
else:
    print(f"Error: {data['error']}")

JavaScript (fetch)

JavaScript
const token = 'TU_TOKEN';

const resp = await fetch('https://pwr.es/api/v1/cuantica/cifrar', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${token}`
    },
    body: JSON.stringify({
        texto: 'Datos sensibles',
        clave: 'clave-secreta-123'
    })
});

const data = await resp.json();

if (data.ok) {
    console.log('Cifrado:', data.cifrado);
} else {
    console.error('Error:', data.error);
}

C#

C#
using System.Net.Http;
using System.Text;
using System.Text.Json;

var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer TU_TOKEN");

var body = JsonSerializer.Serialize(new {
    texto = "Datos sensibles",
    clave = "clave-secreta-123"
});

var content = new StringContent(body, Encoding.UTF8, "application/json");
var resp = await client.PostAsync("https://pwr.es/api/v1/cuantica/cifrar", content);
var json = await resp.Content.ReadAsStringAsync();

Console.WriteLine(json);

Ejemplo avanzado: Flujo PQC completo

cURL — Keygen + Encapsular + Decapsular
# 1. Generar par de claves
curl -X POST https://pwr.es/api/v1/pqc/keygen \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer TU_TOKEN" \
  -d '{"nivel":"768"}'

# 2. Encapsular (con la clave publica obtenida)
curl -X POST https://pwr.es/api/v1/pqc/encapsular \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer TU_TOKEN" \
  -d '{"clave_publica":"base64_de_clave_publica..."}'

# 3. Decapsular (con la clave privada y el ciphertext)
curl -X POST https://pwr.es/api/v1/pqc/decapsular \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer TU_TOKEN" \
  -d '{"ciphertext":"base64_del_ciphertext...","clave_privada":"base64_de_clave_privada..."}'

Ejemplo avanzado: Auditar y cifrar

PHP — Vigia + Cuantica combinados
// Analizar un sitio con Vigia y cifrar el informe con Cuantica
$token = 'TU_TOKEN';

// 1. Escanear vulnerabilidades
$scan = pwr_api('vigia/analizar', ['url' => 'https://ejemplo.com'], $token);

// 2. Cifrar el resultado para almacenamiento seguro
$cifrado = pwr_api('cuantica/cifrar', [
    'texto' => json_encode($scan),
    'clave' => 'clave-maestra-auditorias'
], $token);

// Funcion auxiliar
function pwr_api($endpoint, $datos, $token) {
    $ch = curl_init('https://pwr.es/api/v1/' . $endpoint);
    curl_setopt_array($ch, [
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => json_encode($datos),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER     => [
            'Content-Type: application/json',
            'Authorization: Bearer ' . $token
        ]
    ]);
    $r = json_decode(curl_exec($ch), true);
    curl_close($ch);
    return $r;
}