Crear un custom node en n8n para verificar correos es más sencillo de lo que parece. Aquí verás cómo configurar las credenciales con una API key, ajustar el JSON de la interfaz y compilar con pnpm para probarlo en local. Se enfatiza el uso de expresiones, nombres que coincidan y pequeñas correcciones de tipado que evitan errores.
¿Cómo configurar credentials con API key en n8n?
Configura primero el fichero de credenciales. Copia el bloque de Setup Credentials y pégalo en tu IDE. Después ajusta cada campo con cuidado.
Asegura que el nombre coincide con el del archivo del nodo, por ejemplo en email.node.ts. Debe ser idéntico para que funcione.
Usa el campo display name. Si tu editor sugiere autocompletado, aprovéchalo.
Recuerda que no es un objeto JSON sino una variable. Si tu linter marca en rojo, probablemente espera punto y coma.
Añade la propiedad faltante en la documentación, type options, con el valor password true. Así la API key no se mostrará en texto plano.
En la sección de authenticate coloca exactamente el parámetro que tu API espera. En el ejemplo se usa API_key. Verifica y copia el nombre desde la plataforma de verificación de emails para evitar errores.
Observa el parámetro qs. Significa query string y define que la API key viaja en la URL. También podría ir en header o en body si así lo exige el servicio.
Usa una expresión para leer la credencial. En n8n las expresiones comienzan con signo igual, por eso se usa '={{$credentials.apiKey}}'.
Si renombras el parámetro a api_key, recuerda cambiarlo también en la expresión correspondiente para mantener la coincidencia.
Si el linter marca error de tipado, añade el tipo adecuado en authenticate. En el ejemplo se corrige con generic.
Agrega un ícono. Tras display name añade icon con el valor file:email.svg e importa el ícono. El archivo debe estar en la misma carpeta.
¿Qué editar en el JSON del nodo para la interfaz gráfica?
Copia el bloque de la sección add node metadata y pégalo en tu editor. Cambia el nombre del nodo a Verificar email. El resto queda igual.
Crea una carpeta llamada Verificar email y mueve dentro el nodo, el JSON y el ícono.
Edita package.json. Coloca el nombre de tu custom node, por ejemplo Verificar email. El enlace de GitHub puede quedar temporal si estás en desarrollo.
Actualiza los paths de credenciales y del nodo. Elimina referencias anteriores y cuida no dejar comas finales.
¿Cómo compilar, enlazar y probar el custom node?
Realiza la instalación y las pruebas locales para validar el flujo completo.
Instala dependencias con pnpm. Si es necesario, instala rimraf con pnpm install rimraf para limpiar directorios innecesarios.
Ejecuta pnpm install y después pnpm run build.
Para pruebas locales ve a la guía test your node y a run your node locally. Si es la primera vez, crea la carpeta .n8n y la subcarpeta custom y ejecuta los tres comandos indicados en troubleshooting.
Enlaza el paquete de forma local. Usa pnpm link y el path absoluto de tu proyecto. Copia el path desde tu IDE con copy path reference.
Arranca n8n. Si aparece el error verificar email API is not a constructor, revisa que el nombre del constructor coincida con el nombre del fichero y que el nombre de la credencial coincida con el del nodo, incluyendo mayúsculas y minúsculas. Vuelve a ejecutar el build y arranca de nuevo.
Abre la URL de n8n y crea un workflow con trigger manual. Busca el nodo Verificar email.
Crea la credencial desde el desplegable Create new credential con tipo API key. Copia la clave desde la plataforma de verificación y guárdala.
Prueba con un correo de ejemplo, como test@domain.com. El sistema informa que se rechazó, por tanto es inválido.
Prueba con play@gmail.com. Se acepta el email y confirma que el servicio y el nodo funcionan.
Palabras clave y habilidades aplicadas
Configuración de credentials con API key y opciones de seguridad con password true.
Uso de authenticate, parámetro API_key y transporte mediante query string con qs, o alternativas como header o body.
Empleo de expresiones en n8n con prefijo igual para leer credentials.apiKey.
Correcciones de tipado forzadas por el linter y ajuste a generic en authenticate.
Integración de íconos con file:email.svg y gestión de archivos.
Estructuración del proyecto con carpeta Verificar email y actualización de package.json.
Construcción con pnpm install y pnpm run build, limpieza con rimraf, y enlace local con pnpm link usando path absoluto.
Pruebas en n8n con workflow de trigger manual, creación de credenciales con Create new credential y ejecución con Execute step.
¿Probaste otra API gratuita con este flujo? Comparte tu experiencia y cuéntame qué retoques hiciste en credentials y en el JSON del nodo.
Construí un nodo para obtener el valor actual de distintas divisas. El icono es cualquiera que tenía a mano jaja
De que esta hablando este tio? ya me perdí y aburrí :(
Está creando un nodo para poder usar en un workflow.
N8N automatiza workflows (flujos de trabajo) y los elementos fundamentales para crear workflows son los nodos.
N8N ya incluye sus nodos y también hay nodos que construye la comunidad.
En este caso está creando un nodo personalizado. El nodo es sencillo, ya que solo es para ilustrar el flujo de creación de un nodo. Y, se necesita saber programar en JavaScript y Typescript.
Pero, no te preocupes. Si no necesitas crear un nodo personalizado, no es necesario que hagas todo esto. Y, puedes usar los nodos de n8n o de la comunidad.
Si al momento de testear el nodo les da el siguiente error:
.
Forbidden - perhaps check your credentials?
Invalid API key or access token.
.
Deben cambiar la seguridad del API Key a Private en lugar de Public.
.
hola buenos días profe, me sale el siguiente error cuando finalice de crear el código de verificar email.
los archivos verificaemail.node.ts y el json, package.json estan todo correcto. solo me falta este archivo de credential.ts
Muchas gracias.
estuvo dificil porque como tengo mi n8n instaldo en un VPS y en el curso lo enseñan de manera local pues claro eso es diferente en la practica.
yo utilize Antrugravity para crear mi nod tambien utilize claude para poder programar mi nodo y ver el paso a paso de como crearlo
el resultado final es que mi nodo atraves de las imagenes que se le envian ponen mi marca de agua Sexperfum totalmente funcional y buscando como puedo mejorar mis flujo de manera profesional y como programador
Para que me funcionara la API de emailable durante el testing tuve que configurarla privada.
Osea que cuando no use n8n cloud y uso mi propio server tengo que instalar todo yo? por ejemplo Email services, cron services, y todo? Cual es el beneficio de instalar n8n en mi server y no simplemente usar el cloud que ofrece n8n?
En ambas plataformas tienes que crear las credenciales, la diferencia es la facilidad para crear dichas credenciales.
En el caso de Oauth2 en n8n cloud en la mayoría de casos solo hay que darle a un botón para crear la credencial mientras que en self-hosted hay que proporcionar el client-id y el client-secret.
Una diferencia suele ser la del precio.
Cuando se trata de que uno ya tiene varios flujos que se ejecutan al mes que generen por ejemplo 10k de ejecuciones, la diferencia de precios es importante.
En n8n self-hosted por lo general sólo se paga por el servicio en el que se hostea, pero en n8n cloud se paga en función de la cantidad de ejecuciones que corres por mes.
#👨🍳 Receta: Creación de Nodos Personalizados en n8n
Esta guía está diseñada paso a paso, como una receta de cocina, para que puedas crear, programar y probar tu propio nodo de n8n en tu Mac de manera secuencial y lógica.
Creamos nodo de forma Declarativa: ideal para conexiones directas y transformación simple de datos.
---
##🛒 Ingredientes (Prerrequisitos)
Antes de empezar a cocinar, asegúrate de tener las herramientas preparadas en tu Mac:
1. **Node.js**: Se requiere una versión de largo soporte (LTS) como la **v20**.
- *Tip:* Instálala usando nvm install 22 ó con Homebrew brew install node@22 y luego brew link --overwrite node@22. Te ahorrará muchísimos problemas.
2. **Git**: Para descargar la "masa base" oficial de n8n.
3. **Editor de código**: VS Code es el mejor cuchillo para este trabajo (idealmente con extensiones como ESlint y Prettier).
---
##🥣 Paso 1: Preparar la Base (Clonar y Limpiar)
Vamos a descargar la plantilla vacía que nos da n8n y limpiar los ejemplos que trae por defecto para tener nuestro lienzo en blanco.
1. **Descarga la plantilla oficial:**
git clone mi-primer-nodo
cd mi-primer-nodo
2. **Limpia los sobrantes:**
Borra todo el contenido que viene dentro de las carpetas nodes/ y credentials/. Queremos empezar desde cero.
*⚠️ Muy importante:* Además de borrar los archivos, abre tu package.json y elimina las referencias a los viejos nodos y credenciales de ejemplo dentro del bloque "n8n". El arreglo "nodes" y "credentials" debe quedar vacío por ahora.
3. **Ponle nombre a tu platillo:**
Abre el archivo package.json y cambia el atributo "name" por el nombre de tu propio proyecto.
*Nota vital:* Para que n8n lo reconozca, **siempre debe empezar con n8n-nodes-**.
> Ejemplo: "name": "n8n-nodes-validador"
---
##🌪️ Paso 2: Mezclar los Ingredientes (Instalación)
Ahora vamos a instalar todas las herramientas y dependencias que requiere la masa para funcionar. Todo esto se hace en tu terminal, parado dentro del directorio de tu nodo.
npminstallnpminstall -g n8n-node-dev *#lo instala de manera global para poder usarlo en cualquier parte de la terminal*
>**⚠️ Posible Error al mezclar (isolated-vm falla):**
> Si al ejecutar npm install la terminal empieza a escupir texto rojo de errores (e.g. node-gyp rebuild), significa que tu versión actual de Node.js es demasiado moderna.
> *Solución rápida:* Verifica tu versión con node -v. Usa Node v20 (nvm use 20 ó brew link --overwrite node@20), borra archivos corruptos si quedaron (rm -rf node\_modules package-lock.json) y vuelve a ejecutar npm install.
---
##👨💻 Paso 3: ¡A Cocinar! (Creando el Código del Nodo)
Llegó la hora de la lógica. Crearemos como ejemplo un **Validador de CURP Mexicana**.
1. **Prepara tu Ícono:**
Crea una carpeta nueva en tu repositorio llamada nodes/CurpValidator.
Busca una imagen en formato .svg o .png (la bandera de México, un DNI) y guárdala ahí dentro llamándola, por ejemplo, curp-icon.svg.
2. **Escribe el Código principal (TypeScript):**
Dentro de esa misma carpeta (nodes/CurpValidator/), redacta un archivo llamado CurpValidator.node.ts con esta lógica:
import{ IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription, NodeOperationError,}from'n8n-workflow';exportclassCurpValidator*implements*INodeType{  description:INodeTypeDescription={  displayName:'Validador de CURP',  name:'curpValidator', *// Aquí usamos el parámetro 'icon' para vincular tu imagen personalizada*  icon:'file:curp-icon.svg',  group: \['transform'],  version:1,  description:'Valida si el formato de una CURP Mexicana es correcto',  defaults:{  name:'Validador de CURP', },  inputs: \['main'],  outputs: \['main'],  properties: \[ {  displayName:'CURP a Validar',  name:'curp',  type:'string', default:'',  placeholder:'Ej. GOZM930811HDFRNR08',  description:'La CURP de 18 caracteres a validar',  required:true, }, ], }; *async*execute(this:IExecuteFunctions):Promise\<INodeExecutionData\[]\[]>{ *const* items =this.getInputData(); *const* returnData:INodeExecutionData\[]= \[]; *// Regex estándar para validar la estructura de una CURP Mexicana* *const* curpRegex =/^(\[A-Z]\[AEIOUX]\[A-Z]{2}\d{2}(?:0\[1-9]|1\[0-2])(?:0\[1-9]|\[12]\d|3\[01])\[HM]\(?:AS|B\[CS]|C\[CLMSH]|D\[FG]|G\[TR]|HG|JC|M\[CNS]|N\[ETL]|OC|PL|Q\[TR]|S\[PLR]|T\[CSL]|VZ|YN|ZS)\[B-DF-HJ-NP-TV-Z]{3}\[A-Z\d])(\d)$/; for(*let* itemIndex =0; itemIndex \< items.length; itemIndex++){ try{ *const* curp =this.getNodeParameter('curp', itemIndex,'')asstring; *const* curpLimpia = curp.trim().toUpperCase(); *// Validamos contra la expresión regular* *const* isValid = curpRegex.test(curpLimpia);  returnData.push({  json:{  curp: curpLimpia,  es\_valido: isValid,  mensaje: isValid ?'El formato de la CURP es VÁLIDO':'El formato de la CURP es INCORRECTO' },  pairedItem:{  item: itemIndex, }, }); }catch(error){ if(this.continueOnFail()){  items.push({ json:this.getInputData(itemIndex)\[0].json, error, pairedItem: itemIndex }); }else{ if(error.context){  error.context.itemIndex= itemIndex; throw error; } thrownewNodeOperationError(this.getNode(), error asError,{ itemIndex }); } } } *return* \[this.helpers.returnJsonArray(returnData.map(i => i.json))]; }}
3. **Agrega el nodo al menú general (package.json):**
Tu aplicación necesita saber que este archivo fue creado. Abre de nuevo el package.json raíz y busca el contenedor de n8n para agregar la ruta del compilado (.js):
##🔥 Paso 4: Hornear el Código (Compilar a JavaScript)
El código anterior lo escribimos en TypeScript (TS), que es tu código en crudo. n8n solo corre el formato JavaScript (JS). Hay que hornearlo antes de consumirlo:
npm run build
*(Nota de Chef: Obligatorio repetir este paso/comando cada vez que modifiques tu código, o tus cambios no se probarán).*
---
##🍽️ Paso 5: Servir la Mesa y Probar (Ejecutar Nativo)
La documentación oficial recomienda **no usar Docker mientras desarrollas**, sino ejecutar n8n nativo, pues permite conectar tus carpetas mediante *links* y no requiere apagar o prender contenedores en cada cambio de prueba.
1. **Instala n8n en tu computadora Mac globalmente:**
```bash
npm install n8n -g
```
2. **Crea el enlace simbólico del proyecto local:**
Asegúrate de seguir ubicado en la carpeta del repositorio (mi-primer-nodo) y enlaza tu desarrollo a npm:
```bash
npm link
```
3. **Conecta tu nodo enlazado a los custom nodes de n8n:**
```bash
mkdir -p ~/.n8n/custom
cd ~/.n8n/custom
npm init -y
# ATENCIÓN: El link debe ser del nombre (name) que le hayas puesto a tu package.json en el Paso 1
npm link n8n-nodes-validador
```
4. **Arranca n8n para probarlo:**
```bash
n8n start
```
*(🚑 **Plan B:** Si la terminal te arroja un error que dice command not found: n8n, significa que tu computadora no registró la instalación global del comando. Ejecuta *****npx n8n start***** en su lugar. Nota: puedes ejecutar este comando desde cualquier carpeta de tu terminal, no tienes que estar dentro de .n8n).*
Visita http://localhost:5678 en tu navegador de internet, busca el bloque "Validador de CURP" y ahí estará tu plato terminado con el ícono listo.
5. **Tip de pro: Desarrollo Constante (Watch):**
Si vas a estar realizando ajustes continuos al código, mantenerte escribiendo npm run build en cada cambio es cansado. Para solucionarlo, abre otra pestaña en la terminal en tu carpeta mi-primer-nodo y corre:
```bash
npm run build:watch
```
Ese comando se queda "escuchando" indefinidamente, y cada que guardes un archivo TypeScript en tu editor, se encargará de hacer el build automáticamente. ¡Solo tendrás que reiniciar n8n para ver tus cambios!
Si fuiste firme en: *"Yo todo lo trabajo en entornos virtuales y Docker"*, o llegó la hora de mandar tu nodo a producción, n8n es igual de capaz.
Para inyectar tu nodo horneado (dist/) dentro de un contenedor Docker local (e ignorar el paso 5), usa la estrategia de volúmenes en tu archivo base docker-compose.yml. Quedaría así:
*#docker-compose.yml*services:  n8n:  image: n8nio/n8n  ports:  \- "5678:5678"  volumes:  *# Los configs de sistema*  \- \~/.n8n:/home/node/.n8n  *# AQUÍ INYECTAS TU NODO A DOCKER*  *# La estructura es -> Ruta/En/Tu/Servidor:/Ruta/En/El/Contenedor*  \- /Ruta/Completa/En/Tu/Mac/mi-primer-nodo:/home/node/.n8n/custom/node\_modules/n8n-nodes-validador
**¿Dónde se usa este archivo?**
Hay dos escenarios comunes:
1. **Producción/Servidor**: Si alojas n8n en un VPS (Ej. DigitalOcean, AWS), añadirás este volumen a tu docker-compose.yml que ya tienes en producción, apuntándolo hacia la carpeta del servidor donde subiste tus archivos del nodo.
2. **Pruebas Locales (En tu Mac)**: Si solo quieres experimentar con Docker localmente en lugar del paso 5 nativo, crea este archivo docker-compose.yml en la raíz de tu proyecto mi-primer-nodo, ajusta la /Ruta/Completa/En/Tu/Mac/... por tu ruta real absoluta y arranca el entorno con:
```bash
docker compose up -d
```
*Importante: Si actualizas tu código y el volumen está activo, los cambios se reflejan al compilar (npm run build), pero siempre deberás reiniciar el contenedor de Docker para que n8n cargue los nodos desde cero.*
Me surge la duda de si se pueden hostear los nodos en la infrastructura privada, para nodos que no deberían ser públicos o que realizan funciones puntuales que atienden asuntos de la compañía que lo desarrolla.
Información resumida de esta clase
#EstudiantesDePlatzi
Es importante configurar correctamente las credenciales
qs= query string
Es interesante ver como podemos crear estos nodos totalmente personalizables
Me da ese error
Me ocurrió lo mismo. Mira mi comentario arriba, donde explico la forma de cambiar por "NeverBounce", en vez de "Emailable"
Debido a que no me funcionó con "Emailable", ya que muy extrañamente siempre me aparecía error de la API key, aún cuando verifiqué una y otra vez que la estaba ingresando correctamente, me decidí por utilizar una alternativa a "Emailable", la cual es "NeverBounce".
Y para ésta hice los siguientes cambios en el código: