Publicada el · Actualizada el
N8n Automation Nodes Cheat Sheet de JSON para nodos
Chuleta práctica con los fragmentos JSON de los nodos más usados en n8n, lista para copiar, pegar y adaptar a tus flujos. Orientada a quien ya conoce el editor y quiere acelerar la construcción de automatizaciones mediante la estructura interna de los nodos.

Lo que hay dentro, de principio a fin
Estructura de datos en n8n cómo viaja la información
n8n mueve los datos entre nodos como un array de objetos. Cada objeto recibe el nombre de "item" y los nodos procesan los items uno a uno.
[
{
"json": {
"property1": "value1",
"property2": "value2"
},
"binary": {}
},
{
"json": {
"property1": "anotherValue1",
"property2": "anotherValue2"
},
"binary": {}
}
]A partir de la versión 0.166.0, los nodos Code y Function añaden la clave json automáticamente si falta y envuelven los items en un array cuando es necesario.
Para leer datos en expresiones:
| Origen | Sintaxis |
|---|---|
| Campo del item actual | {{ $json.property1 }} |
| Campo anidado | {{ $json.parent.child.property }} |
| Campo de un nodo concreto | {{ $node["NodeName"].json.property }} |
IA y modelos de lenguaje nodos LangChain en n8n
Chat Model de OpenAI (GPT-3.5 o GPT-4)
{
"name": "ChatGPT",
"type": "n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1,
"parameters": {
"model": "gpt-3.5-turbo",
"temperature": 0.7,
"maxTokens": 500,
"systemPrompt": "You are a helpful assistant.",
"userPrompt": "Hello! How can I automate tasks with n8n?"
},
"credentials": {
"openAiApi": {
"id": "YOUR_CRED_ID",
"name": "OpenAI API"
}
}
}Ajusta temperature para más o menos creatividad y maxTokens para limitar la longitud de la respuesta.
Text Completion de OpenAI
{
"name": "OpenAI Completion",
"type": "n8n-nodes-langchain.openai",
"typeVersion": 1,
"parameters": {
"model": "text-davinci-003",
"prompt": "Summarize the following text: {{$json[\"content\"]}}",
"temperature": 0.5,
"maxTokens": 200
},
"credentials": {
"openAiApi": {
"name": "OpenAI API"
}
}
}La sintaxis {{$json["content"]}} inserta datos del nodo anterior. La salida queda en el campo result del JSON del nodo.
AI Agent con herramientas
{
"name": "AI Agent (ReAct)",
"type": "n8n-nodes-langchain.agent",
"typeVersion": 1,
"parameters": {
"agentType": "react",
"model": "gpt-4",
"memory": false,
"tools": [
{
"name": "googleSearch",
"input": "What is n8n?"
}
]
}
}El array tools debe corresponderse con nodos Tool conectados al Agent. Añádelos desde el editor visual; allí pasan a ser subnodos. El agente decide cuándo invocar cada herramienta según la estrategia (ReAct, Functions, Plan and Execute o SQL).
Embeddings y Vector Stores
{
"name": "Text to Vector",
"type": "n8n-nodes-langchain.embeddingsOpenAi",
"typeVersion": 1,
"parameters": {
"model": "text-embedding-ada-002",
"text": "={{ $json[\"content\"] }}"
},
"credentials": {
"openAiApi": {
"name": "OpenAI API"
}
}
}El nodo convierte el campo content en un vector de 1536 dimensiones. Combínalo con un nodo Pinecone (o similar) para insertar o consultar vectores y montar búsqueda semántica o RAG.
APIs y webhooks HTTP, GraphQL y disparadores
HTTP Request: GET con query params
{
"name": "HTTP GET Example",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 1,
"parameters": {
"url": "https://api.example.com/data",
"method": "GET",
"responseFormat": "json",
"queryParametersUi": {
"parameter": [
{ "name": "q", "value": "search term" },
{ "name": "limit", "value": "10" }
]
}
}
}HTTP Request: POST con cuerpo JSON
{
"name": "HTTP POST Example",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 1,
"parameters": {
"url": "https://api.example.com/posts",
"method": "POST",
"responseFormat": "json",
"jsonParameters": true,
"options": {
"bodyContentType": "json"
},
"bodyParametersJson": {
"title": "Hello World",
"content": "This is an example post via n8n."
}
},
"credentials": {
"httpBasicAuth": {
"name": "Example API Auth"
}
}
}bodyContentType: "json" fuerza la cabecera Content-Type: application/json. En la sección credentials puedes referenciar HTTP Basic Auth, OAuth2 o API Key según lo que requiera el servicio.
GraphQL
{
"name": "GraphQL Query",
"type": "n8n-nodes-base.graphql",
"typeVersion": 1,
"parameters": {
"endpoint": "https://api.spacex.land/graphql/",
"query": "query Launches($limit:Int!) { launchesPast(limit: $limit) { mission_name launch_date_utc } }",
"variables": "{ \"limit\": 3 }",
"headerParametersUi": {
"parameter": [
{ "name": "Authorization", "value": "Bearer YOUR_API_TOKEN" }
]
}
}
}El nodo envía la consulta como POST en JSON y devuelve la respuesta como JSON. Puedes inyectar datos dinámicos con expresiones dentro de query o variables.
Webhook Trigger
{
"name": "Webhook Trigger",
"type": "n8n-nodes-base.webhook",
"typeVersion": 1,
"parameters": {
"path": "incoming-data",
"methods": ["POST"],
"responseMode": "onReceived",
"responseData": {
"statusCode": 200,
"body": "Webhook received successfully"
}
}
}| Modo de respuesta | Comportamiento |
|---|---|
onReceived | Responde de inmediato al recibir la petición, sin esperar al final del flujo |
lastNode | Espera a que termine el flujo y responde con la salida del último nodo |
Respond to Webhook
{
"name": "Webhook Response",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1,
"parameters": {
"responseMode": "responseNode",
"options": {
"responseData": {
"body": "{ \"success\": true, \"message\": \"Processed\" }",
"headers": {
"Content-Type": "application/json"
},
"statusCode": 200
}
}
}
}Útil para devolver un JSON a medida o un acuse de recibo antes de seguir procesando en segundo plano.
Procesamiento de datos lógica y transformaciones
Code (Function)
{
"name": "Add Field",
"type": "n8n-nodes-base.function",
"typeVersion": 1,
"parameters": {
"functionCode": "for (const item of items) {\n item.json.newField = item.json.someField + 100;\n}\nreturn items;"
}
}El código debe terminar con return items;. Si activas el modo "No Inputs" el nodo actúa como generador de datos desde cero. n8n también soporta Code (Python) cuando está habilitado.
IF: bifurcación por condición
{
"name": "Check Status",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"parameters": {
"conditions": {
"conditions": [
{
"leftValue": "={{ $json[\"status\"] }}",
"rightValue": "success",
"operator": {
"type": "string",
"operation": "equals"
}
}
],
"combinator": "and"
}
}
}El nodo IF enruta los items, no los filtra. Cada item va a una salida (true o false). Para descartar elementos, combínalo con Merge.
Switch: múltiples rutas
{
"name": "Route by Category",
"type": "n8n-nodes-base.switch",
"typeVersion": 1,
"parameters": {
"dataType": "string",
"value1": "={{ $json[\"category\"] }}",
"rules": {
"rules": [
{ "operation": "equal", "value2": "support" },
{ "operation": "equal", "value2": "sales" }
]
},
"fallbackOutput": 2
}
}Salida 0 para "support", salida 1 para "sales", salida 2 como fallback. En el editor configura "Number of Outputs" a 3.
Set: añadir o modificar campos
{
"name": "Set Fields",
"type": "n8n-nodes-base.set",
"typeVersion": 3,
"parameters": {
"keepOnlySet": false,
"values": {
"number": [
{ "name": "year", "value": 2025 }
],
"string": [
{ "name": "statusMessage", "value": "Processed by n8n" }
]
}
}
}Con keepOnlySet: false conserva los campos originales y añade los nuevos. Con true elimina todo lo que no listes.
Merge: unir dos flujos
{
"name": "Merge on ID",
"type": "n8n-nodes-base.merge",
"typeVersion": 1,
"parameters": {
"mode": "mergeByKey",
"propertyName": "id",
"outputDataFrom": "both"
}
}| Modo | Qué hace |
|---|---|
append | Concatena los items de ambas entradas |
wait | Espera a ambas entradas y emite juntas |
mergeByIndex | Empareja items por posición |
mergeByKey | Empareja items por un campo común |
Item Lists: partir y agrupar arrays
{
"name": "Split Array",
"type": "n8n-nodes-base.itemLists",
"typeVersion": 1,
"parameters": {
"operation": "splitIntoItems",
"property": "results"
}
}splitIntoItems rompe un array en items individuales. aggregateItems hace lo contrario: agrupa varios items en un único array.
Split In Batches: bucles por lotes
{
"name": "Batch Loop",
"type": "n8n-nodes-base.splitInBatches",
"typeVersion": 1,
"parameters": {
"batchSize": 10
}
}Para cerrar el bucle, conecta el último nodo del flujo de vuelta al input 2 del Split In Batches (opción "Execute Next Batch"). Cuando no queden items, el flujo termina o lo gestionas con un nodo Run IF conectado a la salida "No Items".
Stop And Error: cortar el flujo a propósito
{
"name": "Stop on Condition",
"type": "n8n-nodes-base.stopAndError",
"typeVersion": 1,
"parameters": {
"message": "Terminating workflow due to business rule X"
}
}Colócalo tras un IF cuando quieras abortar el workflow con un mensaje propio. Para capturar errores globales, añade el nodo Error Trigger en otro flujo.
Triggers cómo arrancar el flujo
Cron Trigger (Schedule)
{
"name": "Daily Schedule",
"type": "n8n-nodes-base.cron",
"typeVersion": 1,
"parameters": {
"triggerTimes": {
"item": [
{ "hour": 9, "minute": 0 },
{ "hour": 17, "minute": 0 }
]
}
}
}Para disparar cada 15 minutos:
{ "item": [ { "mode": "everyX", "value": 15, "unit": "minutes" } ] }Puedes añadir weekday o dayOfMonth para afinar la programación.
Email Trigger (IMAP)
{
"name": "Email Trigger",
"type": "n8n-nodes-base.emailReadImap",
"typeVersion": 1,
"parameters": {
"mailbox": "INBOX",
"postProcessAction": "read",
"options": {
"criteria": "UNSEEN"
}
},
"credentials": {
"imap": {
"name": "My Email Account"
}
}
}Cada correo no leído dispara el flujo y se marca como leído.
Manual Trigger
{
"name": "Manual Trigger",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"parameters": {}
}Sirve para lanzar el flujo con el botón "Execute Workflow" durante el desarrollo.
Execute Workflow
{
"name": "Run Sub-workflow",
"type": "n8n-nodes-base.executeWorkflow",
"typeVersion": 1,
"parameters": {
"workflowId": "123",
"waitForCompletion": true,
"inputs": {
"inputData": "={{ $json[\"data\"] }}"
}
}
}Con waitForCompletion: true el flujo padre espera al subflujo. Con false, dispara y sigue (fire-and-forget).
Integraciones destacadas servicios populares
Slack: enviar mensaje
{
"name": "Send Slack Message",
"type": "n8n-nodes-base.slack",
"typeVersion": 1,
"parameters": {
"resource": "message",
"operation": "send",
"channel": "C01234567",
"text": "Hello from n8n :tada:"
},
"credentials": {
"slackApi": {
"name": "Slack OAuth2"
}
}
}Activa jsonParameters: true cuando necesites enviar blocks o attachments en JSON.
Google Sheets: añadir fila
{
"name": "Append to Sheet",
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4,
"parameters": {
"operation": "append",
"spreadsheetId": "1A2b3C4D5E6FgHiJkLMnoPQrstu",
"sheetName": "Sheet1",
"dataMode": "autoMap",
"options": {
"valueInputMode": "USER_ENTERED"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "Google Sheets OAuth2"
}
}
}Con dataMode: "autoMap" n8n empareja los campos del item con las cabeceras de la hoja. valueInputMode: "USER_ENTERED" permite que las fórmulas se recalculen.
Notion: consultar base de datos
{
"name": "Query Notion DB",
"type": "n8n-nodes-base.notion",
"typeVersion": 2,
"parameters": {
"resource": "databasePage",
"operation": "getAll",
"databaseId": "YOUR_NOTION_DATABASE_ID",
"options": {
"filter": {
"singleCondition": {
"key": "Email|email",
"condition": "equals",
"emailValue": "={{ $json[\"email\"] }}"
}
}
}
},
"credentials": {
"notionApi": {
"name": "Notion API"
}
}
}La clave sigue el patrón PropertyName|propertyType para que n8n formatee correctamente el filtro.
GitHub: crear issue
{
"name": "Create GitHub Issue",
"type": "n8n-nodes-base.github",
"typeVersion": 1,
"parameters": {
"resource": "issue",
"operation": "create",
"owner": "octocat",
"repository": "Hello-World",
"title": "Automated Issue from n8n",
"body": "This issue was created by an n8n workflow."
},
"credentials": {
"githubApi": {
"name": "GitHub personal access token"
}
}
}La credencial debe ser un Personal Access Token con permisos de repo (o un token OAuth).
MySQL: ejecutar consulta
{
"name": "MySQL Query",
"type": "n8n-nodes-base.mySql",
"typeVersion": 2,
"parameters": {
"operation": "executeQuery",
"query": "SELECT * FROM users WHERE id = {{ $json[\"user_id\"] }}",
"additionalFields": {}
},
"credentials": {
"mySql": {
"name": "My MySQL DB"
}
}
}Si inyectas valores del usuario dentro del SQL, sánitalos o usa consultas parametrizadas para evitar inyección SQL. Para PostgreSQL cambia type a postgres y la credencial a postgreSql.
Otras integraciones habituales
| Servicio | Uso típico |
|---|---|
| AWS S3 | Subir y descargar ficheros |
| Google Drive | Operaciones con ficheros (subir, listar, descargar) |
| SMTP / SendGrid | Enviar correos |
| Twilio | SMS o WhatsApp |
| Stripe | Cobros y eventos de pago |
| Jira, Trello, Asana | Crear y actualizar tareas |
| HubSpot, Salesforce | Gestión de contactos y deals |
| CSV / XML | Parsear y generar ficheros |
El patrón común es resource (entidad) + operation (acción) + campos específicos. Configura el nodo en el editor y luego exporta el JSON como referencia.
Conexiones entre nodos el objeto connections
Cuando montas un flujo mediante JSON necesitas definir cómo se enlazan los nodos. Cada nodo expone una salida main que conecta con la entrada del siguiente.
{
"Cron": { "main": [ [ { "node": "GraphQL", "type": "main", "index": 0 } ] ] },
"GraphQL": { "main": [ [ { "node": "Summarize","type": "main", "index": 0 } ] ] },
"Summarize":{ "main": [ [ { "node": "Slack", "type": "main", "index": 0 } ] ] }
}Los IDs y posiciones (id, position) que aparecen en los JSON exportados no son obligatorios; sirven para colocar el nodo en el editor.
Consejos de uso expresiones, credenciales y test
- Expresiones. Todo lo que ves como
={{ $json["..."] }}se evalúa en tiempo de ejecución. Dentro de cadenas JSON escríbelo entre dobles llaves. - Acceso por nombre de nodo. Usa
$node["NodeName"].json["field"]para leer la salida de un nodo concreto.$items()referencia todos los items. - Credenciales. El bloque
credentialsreferencia credenciales ya creadas en n8n. Basta con elnamesi es único; elidsolo es necesario cuando creas workflows por la API. Crea la credencial antes de importar el flujo. - Test progresivo. Empieza con Manual Trigger más un nodo para validar la estructura JSON. Después ve añadiendo nodos. Puedes importar el JSON desde Workflow -> Import from JSON para revisarlo en el editor.

