n8n
Valida documentos con Constaia desde n8n usando el nodo HTTP Request con multipart y la cabecera Authorization, y enruta el flujo según el veredicto.
n8n se ejecuta en tu servidor (o en n8n Cloud), así que la clave queda guardada como credencial y nunca llega a quien sube el documento. Esta guía usa el nodo genérico HTTP Request.
Nodos nativos
El nodo nativo de Constaia para n8n llegará próximamente, igual que las integraciones con Make y Zapier. Hasta entonces, el nodo HTTP Request cubre toda la API.
Requisitos
- n8n 1.x (self-hosted o Cloud).
- Una clave de test
ck_test_…del panel. - Un nodo anterior que aporte el documento como dato binario: Form Trigger con un campo de fichero, un adjunto de Gmail u Outlook, Read/Write Files from Disk, Google Drive…
1. Credencial
En Credentials → New → Header Auth:
| Campo | Valor |
|---|---|
| Name | Authorization |
| Value | Bearer ck_test_… |
Llámala, por ejemplo, Constaia (test). Cuando pases a producción, crea otra con la clave ck_live_….
2. Nodo HTTP Request
| Parámetro | Valor |
|---|---|
| Method | POST |
| URL | https://api.constaia.com/v1/analyze |
| Authentication | Generic Credential Type → Header Auth → Constaia (test) |
| Send Body | activado |
| Body Content Type | Form-Data |
| Options → Timeout | 60000 |
Parámetros del cuerpo:
| Parameter Type | Name | Valor |
|---|---|---|
| n8n Binary File | file | Input Data Field Name: el nombre del binario de entrada (a menudo data) |
| Form Data | options | el JSON de abajo |
{
"expect": "es_dni",
"checks": { "not_expired": true, "holder": { "full_name": "{{ $json.full_name }}" } },
"storage": "none",
"language": "es"
}Las opciones van en snake_case, como en la API. Si el nombre del titular viene de un paso anterior, usa una expresión
como la de arriba; si no, quita holder.
Si el documento está en una URL en lugar de en un binario, cambia Body Content Type a JSON y envía:
{ "file_url": "https://…/dni.jpg", "expect": "es_dni", "checks": { "not_expired": true }, "storage": "none" }3. Enrutar según el veredicto
Añade un nodo Switch con la regla {{ $json.verdict.status }} y tres salidas:
| Salida | Condición | Ejemplo de acción |
|---|---|---|
| Válido | is equal to valid | Marcar la inscripción como completa en tu hoja o CRM. |
| No válido | is equal to invalid | Enviar un email con {{ $json.verdict.reasons.map(r => r.message).join(" ") }} pidiendo otro documento. |
| Revisión | is equal to review | Crear una tarea o un mensaje en el canal del equipo con el {{ $json.id }}. |
Para errores de la API (clave incorrecta, formato no admitido, créditos agotados), activa Settings → On Error → Continue (using error output) en el nodo HTTP Request y trata esa salida aparte.
4. Recibir webhooks (opcional)
Para análisis con "async": true, crea un flujo con un nodo Webhook (método POST, opción Raw Body activada)
y registra su URL de producción en el panel de Constaia. Verifica la firma en un nodo Code antes de seguir:
const crypto = require("crypto"); // requiere NODE_FUNCTION_ALLOW_BUILTIN=crypto
const { headers } = $input.first().json;
const body = (await this.helpers.getBinaryDataBuffer(0, "data")).toString("utf8");
const secret = Buffer.from($env.CONSTAIA_WEBHOOK_SECRET.replace(/^whsec_/, ""), "base64");
const signed = `${headers["webhook-id"]}.${headers["webhook-timestamp"]}.${body}`;
const expected = crypto.createHmac("sha256", secret).update(signed).digest("base64");
const fresh = Math.abs(Date.now() / 1000 - Number(headers["webhook-timestamp"])) <= 300;
const valid = headers["webhook-signature"].split(" ").some((s) => s === `v1,${expected}`);
if (!fresh || !valid) throw new Error("Firma de Constaia no válida");
return [{ json: JSON.parse(body) }];Según tu instalación, puede que tengas que permitir el acceso a variables de entorno desde los nodos
(N8N_BLOCK_ENV_ACCESS_IN_NODE=false). Detalles de la firma en Webhooks.
Probar en modo test
Con la credencial ck_test_…, pasa al nodo HTTP Request un binario llamado dni_valid.jpg (valid),
dni_expired.jpg (invalid, motivo expired) o blurry.jpg (review). El nombre del fichero binario es lo que
decide el resultado, así que comprueba que el nodo anterior lo conserva.
Siguiente paso
- Webhooks para flujos asíncronos y lotes.
- Tipos de documento para cambiar
expectpor certificados médicos, justificantes de pago y más.