Integración
Integración con n8n – automatización de audio autoalojada
Tu n8n + tus servidores DeepScript = plena soberanía de datos. Sin automatización en la nube, sin riesgo Schrems II.
n8n es la alternativa autoalojable a Zapier y Make – ejecutas el motor de workflow tú mismo, por ejemplo en el mismo servidor de Hetzner que el resto de tu infraestructura. Combinado con DeepScript (también alojado en Alemania), se crea una pipeline en la que los datos de audio, de workflow y los metadatos nunca tocan proveedores de nube estadounidenses – ideal para hospitales, despachos de abogados y administración pública. Un nodo comunitario oficial de DeepScript está en preparación; hasta entonces, usa el nodo HTTP Request genérico de n8n con la cabecera `X-API-KEY`. A continuación encontrarás una exportación completa del flujo en JSON que puedes importar en tu instancia de n8n (`Workflows → Import from File`). Los webhooks de vuelta a n8n funcionan mediante el nodo Webhook, de modo que incluso las transcripciones largas (> 30 min) se ejecutan sin problemas y sin un bucle de polling.
Documentación de n8n: nodo HTTP RequestLo que puedes crear
- Todo autoalojado: n8n + contenedores DeepScript + tu reverse proxy = plena soberanía de datos en un solo servidor.
- Nodo HTTP Request con cabecera `X-API-KEY` – sin plugin adicional, funciona de fábrica.
- Nodo Webhook para los eventos `transcription.completed`, un flujo asíncrono limpio sin polling.
- Ramificaciones, bucles, code nodes (JavaScript/Python) – lógica compleja directamente en el flujo.
- Ideal para administración pública, hospitales y despachos de abogados: nada va a la nube estadounidense, todo permanece en tu máquina.
Ejemplos de código
{
"name": "DeepScript: Upload and Process",
"nodes": [
{
"name": "Manual Trigger",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [240, 300],
"parameters": {}
},
{
"name": "Read Audio File",
"type": "n8n-nodes-base.readBinaryFile",
"typeVersion": 1,
"position": [440, 300],
"parameters": { "filePath": "/data/audio/meeting.mp3" }
},
{
"name": "Upload to DeepScript",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [640, 300],
"parameters": {
"method": "POST",
"url": "https://api.deepscript.com/v1/transcriptions",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{ "name": "X-API-KEY", "value": "={{ $env.DEEPSCRIPT_API_KEY }}" }
]
},
"sendBody": true,
"contentType": "multipart-form-data",
"bodyParameters": {
"parameters": [
{ "name": "file", "value": "={{ $binary.data }}", "parameterType": "formBinaryData" },
{ "name": "model", "value": "premium" },
{ "name": "language", "value": "de" }
]
}
}
},
{
"name": "Webhook (transcription.completed)",
"type": "n8n-nodes-base.webhook",
"typeVersion": 1,
"position": [840, 300],
"parameters": {
"path": "deepscript-completed",
"responseMode": "responseNode"
}
},
{
"name": "Get Transcript",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [1040, 300],
"parameters": {
"method": "GET",
"url": "=https://api.deepscript.com/v1/transcriptions/{{ $json.data.transcriptionId }}",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{ "name": "X-API-KEY", "value": "={{ $env.DEEPSCRIPT_API_KEY }}" }
]
}
}
}
],
"connections": {
"Manual Trigger": { "main": [[{ "node": "Read Audio File", "type": "main", "index": 0 }]] },
"Read Audio File": { "main": [[{ "node": "Upload to DeepScript", "type": "main", "index": 0 }]] },
"Webhook (transcription.completed)": { "main": [[{ "node": "Get Transcript", "type": "main", "index": 0 }]] }
}
}// In an n8n Code node placed right after the Webhook node.
// Verifies the X-DeepScript-Signature header against the raw body.
const crypto = require("crypto");
const SIGNING_SECRET = $env.DEEPSCRIPT_WEBHOOK_SECRET; // "whsec_xxx"
const header = $input.first().json.headers["x-deepscript-signature"];
const rawBody = $input.first().json.body;
const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
const { t: timestamp, v1: signature } = parts;
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) {
throw new Error("Webhook timestamp out of tolerance (>5min)");
}
const signedPayload = `${timestamp}.${JSON.stringify(rawBody)}`;
const expected = crypto
.createHmac("sha256", SIGNING_SECRET)
.update(signedPayload)
.digest("hex");
const valid = crypto.timingSafeEqual(
Buffer.from(signature, "hex"),
Buffer.from(expected, "hex")
);
if (!valid) throw new Error("Invalid webhook signature");
return [{ json: { verified: true, event: rawBody } }];Configuración en pocos pasos
- 1
Instalar n8n o iniciar el contenedor Docker
Vía Docker: `docker run -d --name n8n -p 5678:5678 -v ~/.n8n:/home/node/.n8n n8nio/n8n`. Para producción recomendamos ejecutar n8n detrás de Caddy o Traefik con TLS de Let's Encrypt en el mismo servidor que el resto de tu infraestructura.
- 2
Guardar la clave API como credential
En n8n, en Credentials, crea un nuevo «Generic Credential Type» con el nombre de cabecera `X-API-KEY` y el valor `ds_live_xxx`. Alternativa: monta la clave API como variable de entorno `DEEPSCRIPT_API_KEY` y referénciala en los nodos HTTP mediante `{{ $env.DEEPSCRIPT_API_KEY }}`.
- 3
Importar el flujo
Copia la exportación JSON de arriba en un archivo `.json`, luego `Workflows → Import from File`. n8n detecta los nodos automáticamente – solo tienes que asociar el credential de DeepScript y ajustar las rutas de archivo si hace falta.
- 4
Registrar el webhook en DeepScript
El nodo Webhook de n8n te da una URL como `https://your-n8n.example.com/webhook/deepscript-completed`. Registra esta URL en `POST /v1/webhooks` con el evento `transcription.completed`. Guarda el secret devuelto en el nodo Code de verificación HMAC.
Preguntas frecuentes
¿Necesito el nodo comunitario o basta con HTTP Request?
HTTP Request basta para cualquier caso de uso – la API es lo bastante sencilla. Un nodo comunitario está en desarrollo, pero aportará sobre todo funciones de comodidad (bucle de auto-polling, salidas tipadas). Funcionalmente nada que no puedas hacer ya hoy.
¿Puedo ejecutar n8n en el mismo servidor que mi reverse proxy?
Sí – recomendado. Setup de Docker Compose con Caddy o Traefik delante de n8n. Con varios flujos por segundo tiene sentido la arquitectura de queue mode de n8n (workers + Redis). Para volúmenes bajos basta con el modo de instancia única.
¿Qué tamaño pueden tener los archivos de audio en el nodo HTTP Request?
El límite de body por defecto de n8n es de 16 MB. Para aprovechar el límite de subida de 500 MB de DeepScript, configura `N8N_PAYLOAD_SIZE_MAX=512` (en MB) en tu instancia de n8n. Alternativa para archivos muy grandes: súbelos primero a un almacenamiento compatible con S3 y envía solo la URL a la API de DeepScript.
¿Algún dato sale de mi infraestructura?
Solo el archivo de audio y los metadatos van a DeepScript (Hetzner DE). Si también ejecutas DeepScript en tu propio hardware (setup enterprise), incluso eso se queda en casa. Los datos de los flujos de n8n, los credentials y los logs permanecen siempre en tu servidor.
¿Puedo versionar los flujos en Git?
Sí – desde la versión 1.0, n8n admite integración nativa con Git mediante Source Control (función enterprise). Community edition: exporta los flujos como JSON y haz commit manualmente. Esto último basta para la mayoría de los setups.
¿Listo para llevarlo a producción?
Crea una cuenta, genera una clave API y a producir. Tres transcripciones gratis para probar. Documentación OpenAPI 3.1 completa en api.deepscript.com/docs.