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
| Entorno | URL |
|---|---|
| Produccion | https://pwr.es/api/v1/{producto}/{accion} |
| Desarrollo | http://localhost/pwr.es/api-v2.php?p={producto}&a={accion} |
Formato de respuesta
Todas las respuestas son JSON con la estructura base:
{
"ok": true,
"producto": "cuantica",
"accion": "cifrar",
"datos": { ... },
"ms": 12.4
}
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
Authorization: Bearer <tu-token>
Obtener un token
- Accede a tu panel en
https://pwr.es/panel - Ve a Ajustes → API → Generar token
- Copia el token (solo se muestra una vez)
Ejemplo con 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.
| Plan | Limite | Ventana |
|---|---|---|
| Gratis (sin token) | 100 req | 1 hora |
| Pro | 10.000 req | 1 hora |
| Agencia | 100.000 req | 1 hora |
| Enterprise | Ilimitado | — |
Cuando se supera el limite, la API responde con 429 Too Many Requests:
{
"ok": false,
"error": "Rate limit excedido. Reintenta en 42 segundos.",
"retry_after": 42
}
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.
Modo A: FFI Local
Todo se ejecuta en tu servidor. Criptografia via FFI (liboqs). Sin llamadas externas. Maxima soberania.
Modo B: API PQC
Cifrado simetrico local. Operaciones Kyber (keygen, encapsular, decapsular) via API de PWR.es.
Modo C: Docker
Todo en un contenedor Docker con liboqs precompilado. Ideal para CI/CD y despliegue reproducible.
Modo D: 100% API
Todo via API, nada local. Cero dependencias en tu servidor. Solo necesitas HTTP y un token.
Cuantica
Cifrado post-cuantico multicapa (AES-256-GCM + ChaCha20 + capas adicionales).
cifrar
Cifra un texto con cifrado multicapa.
Request body
| Campo | Tipo | Descripcion |
|---|---|---|
texto | string | Texto plano a cifrar |
clave | string | Clave de cifrado |
Respuesta
{
"ok": true,
"cifrado": "base64...",
"capas": 6,
"ms": 8.2
}
descifrar
Descifra un texto cifrado con Cuantica.
| Campo | Tipo | Descripcion |
|---|---|---|
cifrado | string | Texto cifrado (base64) |
clave | string | Clave utilizada al cifrar |
cifrar-campo / descifrar-campo
Cifra/descifra un campo individual dentro de un objeto JSON. Ideal para cifrar campos de base de datos.
| Campo | Tipo | Descripcion |
|---|---|---|
datos | object | Objeto JSON con los datos |
campo | string | Nombre del campo a cifrar |
clave | string | Clave de cifrado |
cifrar-lote / descifrar-lote
Cifra/descifra multiples textos en una sola peticion.
| Campo | Tipo | Descripcion |
|---|---|---|
textos | array | Array de strings a cifrar |
clave | string | Clave de cifrado |
info
Devuelve informacion del modulo: version, capas disponibles, algoritmos.
PQC (Post-Quantum Crypto)
Operaciones de criptografia post-cuantica basadas en ML-KEM (Kyber).
keygen
Genera un par de claves ML-KEM (publica + privada).
| Campo | Tipo | Descripcion |
|---|---|---|
nivel | string | "512", "768" o "1024" (por defecto "768") |
{
"ok": true,
"publica": "base64...",
"privada": "base64...",
"algoritmo": "ML-KEM-768"
}
encapsular
Encapsula un secreto compartido usando la clave publica.
| Campo | Tipo | Descripcion |
|---|---|---|
clave_publica | string | Clave publica en base64 |
decapsular
Decapsula el secreto compartido usando la clave privada.
| Campo | Tipo | Descripcion |
|---|---|---|
ciphertext | string | Ciphertext en base64 |
clave_privada | string | Clave privada en base64 |
info
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
Analiza un payload (string, formulario, URL) en busca de amenazas.
| Campo | Tipo | Descripcion |
|---|---|---|
input | string | Texto o payload a analizar |
contexto | string | (Opcional) "url", "body", "header" |
{
"ok": true,
"seguro": false,
"amenazas": ["sqli", "xss"],
"puntuacion": 92,
"detalles": [...]
}
Umbral
Autenticacion segura: hashing de contrasenas y generacion/verificacion TOTP.
hash
Genera un hash seguro de una contrasena (Argon2id).
| Campo | Tipo | Descripcion |
|---|---|---|
password | string | Contrasena a hashear |
verificar
Verifica una contrasena contra un hash existente.
| Campo | Tipo | Descripcion |
|---|---|---|
password | string | Contrasena a verificar |
hash | string | Hash almacenado |
totp-generar
Genera un secreto TOTP y su URI para codigos QR.
| Campo | Tipo | Descripcion |
|---|---|---|
usuario | string | Identificador del usuario |
emisor | string | (Opcional) Nombre de la aplicacion |
{
"ok": true,
"secreto": "JBSWY3DPEHPK3PXP",
"uri": "otpauth://totp/PWR:usuario?secret=...",
"qr_url": "https://..."
}
totp-verificar
Verifica un codigo TOTP contra el secreto almacenado.
| Campo | Tipo | Descripcion |
|---|---|---|
codigo | string | Codigo TOTP de 6 digitos |
secreto | string | Secreto TOTP base32 |
Rubrica
Firma digital post-cuantica basada en ML-DSA (Dilithium).
firmar
Firma digitalmente un mensaje con clave privada ML-DSA.
| Campo | Tipo | Descripcion |
|---|---|---|
mensaje | string | Mensaje a firmar |
clave_privada | string | Clave privada en base64 |
verificar
Verifica una firma digital con la clave publica.
| Campo | Tipo | Descripcion |
|---|---|---|
mensaje | string | Mensaje original |
firma | string | Firma en base64 |
clave_publica | string | Clave publica en base64 |
keygen
Genera un par de claves ML-DSA para firma digital.
| Campo | Tipo | Descripcion |
|---|---|---|
nivel | string | (Opcional) "44", "65" o "87". Por defecto "65" |
Vigia
Escaner pasivo de vulnerabilidades web: headers, SSL, cookies, directorios, tecnologias, DNS.
analizar
Ejecuta un analisis completo de seguridad sobre una URL.
| Campo | Tipo | Descripcion |
|---|---|---|
url | string | URL completa a analizar (incluir https://) |
{
"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
Audita una URL o configuracion contra una o varias normativas.
| Campo | Tipo | Descripcion |
|---|---|---|
url | string | URL del sitio a auditar |
normativas | array | (Opcional) ["rgpd","ens","iso27001"]. Por defecto: todas |
{
"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
Analiza la configuracion TLS de un dominio: version, cipher suites, certificado.
| Campo | Tipo | Descripcion |
|---|---|---|
dominio | string | Dominio a analizar (sin protocolo) |
pqc-readiness
Evalua si un dominio esta preparado para la era post-cuantica.
| Campo | Tipo | Descripcion |
|---|---|---|
dominio | string | Dominio a analizar |
{
"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
Inicia una sesion de tunel cifrado. Devuelve un ID de sesion y claves efimeras.
| Campo | Tipo | Descripcion |
|---|---|---|
ttl | int | (Opcional) Tiempo de vida en segundos. Por defecto: 3600 |
cifrar
Cifra un mensaje dentro de una sesion de tunel activa.
| Campo | Tipo | Descripcion |
|---|---|---|
sesion_id | string | ID de la sesion activa |
mensaje | string | Mensaje a cifrar |
descifrar
Descifra un mensaje recibido a traves del tunel.
| Campo | Tipo | Descripcion |
|---|---|---|
sesion_id | string | ID de la sesion activa |
cifrado | string | Mensaje cifrado en base64 |
Malla
Cifrado para redes mesh y comunicacion multipunto.
generar-claves
Genera un par de claves para un nodo de la malla.
| Campo | Tipo | Descripcion |
|---|---|---|
nodo_id | string | Identificador del nodo |
cifrar-paquete
Cifra un paquete para uno o varios nodos destino.
| Campo | Tipo | Descripcion |
|---|---|---|
mensaje | string | Mensaje a cifrar |
destinos | array | Array de claves publicas destino |
descifrar-paquete
Descifra un paquete recibido en la malla.
| Campo | Tipo | Descripcion |
|---|---|---|
paquete | string | Paquete cifrado en base64 |
clave_privada | string | Clave privada del nodo receptor |
Antena
Auditoria y configuracion de headers de seguridad HTTP.
auditar
Audita los headers de seguridad de una URL y devuelve recomendaciones.
| Campo | Tipo | Descripcion |
|---|---|---|
url | string | URL a auditar |
{
"ok": true,
"nota": "A-",
"headers_presentes": ["HSTS", "CSP", "X-Frame-Options"],
"headers_faltantes": ["Permissions-Policy"],
"recomendaciones": [...]
}
generar-config
Genera configuracion de headers de seguridad para Apache, Nginx o PHP.
| Campo | Tipo | Descripcion |
|---|---|---|
servidor | string | "apache", "nginx" o "php" |
dominio | string | Dominio para CSP y HSTS |
Sistema
Endpoints de informacion y estado del servidor API.
info
Version de la API, productos disponibles, modo de despliegue.
{
"ok": true,
"version": "1.0.0",
"productos": 13,
"modo": "D",
"php": "8.3.0"
}
health
Estado de salud de la API. Util para monitorizacion y load balancers.
{
"ok": true,
"status": "healthy",
"uptime": 86400
}
routes
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.
| Codigo | Significado | Causa habitual |
|---|---|---|
400 | Bad Request | Parametros faltantes o formato JSON invalido |
401 | Unauthorized | Token ausente, expirado o invalido |
405 | Method Not Allowed | Metodo HTTP incorrecto (ej: GET en endpoint POST) |
413 | Payload Too Large | Body supera 1 MB |
429 | Too Many Requests | Rate limit excedido |
500 | Internal Server Error | Error interno de la API |
501 | Not Implemented | Producto o accion no existe |
503 | Service Unavailable | Servicio en mantenimiento |
Formato de error
{
"ok": false,
"error": "Parametro 'texto' es obligatorio.",
"codigo": 400
}
Ejemplos completos
Ejemplos funcionales en varios lenguajes para cifrar un texto con Cuantica.
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
$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
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)
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#
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
# 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
// 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;
}