N8N avancé : webhooks, API et code personnalisé (niveau intermédiaire)
Maîtrisez les fonctionnalités avancées de N8N : webhooks pour déclencher vos workflows, appels API REST/GraphQL, injection de code JavaScript personnalisé et gestion d'erreurs professionnelle.
Passer au niveau supérieur avec N8N
Tu maîtrises les bases de N8N et tu veux aller plus loin ? Ce guide est fait pour toi. 🚀
On va explorer les fonctionnalités avancées qui transforment N8N d'un simple outil d'automatisation en une vraie plateforme de développement :
- 🪝 Webhooks : déclencher des workflows depuis n'importe quelle application
- 🌐 API REST & GraphQL : appeler n'importe quelle API externe
- 💻 Code JavaScript : logique personnalisée et transformations complexes
- ⚠️ Gestion d'erreurs : workflows robustes et professionnels
- 🔒 Sécurité : authentification, variables d'environnement
Webhooks : la puissance des déclencheurs HTTP
Qu'est-ce qu'un webhook ?
Un webhook, c'est une URL unique qui déclenche un workflow N8N quand elle reçoit une requête HTTP. C'est l'inverse d'un trigger classique : au lieu que N8N interroge un service (polling), c'est le service externe qui "push" les données vers N8N.
Cas d'usage des webhooks
- 📱 Recevoir des webhooks de Stripe, Shopify, GitHub...
- 🔗 Connecter N8N à des outils sans intégration native
- 🤖 Créer des API pour tes applications front-end
- ⚡ Déclencher des workflows en temps réel (vs polling toutes les X minutes)
Créer ton premier webhook
Étape 1 : Ajouter le node Webhook
- Crée un nouveau workflow
- Ajoute le node Webhook en premier
- Configuration :
- HTTP Method : POST (ou GET selon ton besoin)
- Path :
mon-webhook - Authentication : None (pour débuter)
- Response Mode : Last Node
- N8N génère automatiquement une URL :
https://ton-n8n.com/webhook/mon-webhook
Étape 2 : Tester le webhook
Utilise cURL ou Postman pour envoyer une requête :
curl -X POST https://ton-n8n.com/webhook/mon-webhook -H "Content-Type: application/json" -d '{"nom": "Alexandre", "email": "alex@example.com"}'
Le workflow se déclenche et les données sont disponibles dans {{ $json }}
Étape 3 : Traiter les données reçues
- Ajoute un node Function ou directement l'action souhaitée (Airtable, Gmail, etc.)
- Accède aux données POST :
{{ $json["nom"] }},{{ $json["email"] }}
Webhook avec authentification
Pour sécuriser ton webhook, utilise Header Auth :
- Authentication : Header Auth
- Header Name :
X-API-Key - Header Value :
ton-secret-key-123456
Les requêtes devront inclure le header :
curl -X POST https://ton-n8n.com/webhook/mon-webhook -H "X-API-Key: ton-secret-key-123456" -H "Content-Type: application/json" -d '{"data": "test"}'
Exemple concret : Bot Discord avec webhook
Crée un bot Discord qui répond automatiquement aux commandes :
Webhook (POST /discord) → Function (parse command) → IF (command type) → Discord API (respond)
Code du node Function :
const body = $input.item.json;
const command = body.content.split(' ')[0]; // ex: "!ping"
const args = body.content.split(' ').slice(1);
return {
json: {
command: command,
args: args,
channelId: body.channel_id,
userId: body.author.id
}
};
Appeler des API externes (REST & GraphQL)
Node HTTP Request : ton couteau suisse
Le node HTTP Request permet d'appeler n'importe quelle API REST ou GraphQL.
Exemple 1 : Appeler une API REST (GET)
Récupérer des données depuis l'API JSONPlaceholder :
- Node : HTTP Request
- Method : GET
- URL :
https://jsonplaceholder.typicode.com/users - Response Format : JSON
Les données sont accessibles via {{ $json }}
Exemple 2 : Appeler une API REST (POST)
Créer une ressource via API :
- Method : POST
- URL :
https://api.example.com/v1/users - Headers :
Content-Type: application/jsonAuthorization: Bearer {{ $env.API_TOKEN }}
- Body (JSON) :
{ "name": "{{ $json["name"] }}", "email": "{{ $json["email"] }}", "role": "user" }
Exemple 3 : Appeler une API GraphQL
Query GraphQL sur l'API GitHub :
- Method : POST
- URL :
https://api.github.com/graphql - Headers :
Authorization: Bearer {{ $env.GITHUB_TOKEN }}Content-Type: application/json
- Body (JSON) :
{ "query": "query { viewer { login name repositories(first: 5) { nodes { name stargazerCount } } } }" }
Gérer les erreurs API
Ajoute un node IF après l'HTTP Request pour vérifier le status code :
IF : {{ $json["statusCode"] }} === 200
→ Success path
ELSE
→ Error handling (Slack notification, log, retry...)
Code Node : la puissance du JavaScript
Quand utiliser le Code Node ?
- 🔀 Transformer des données complexes (mapping, filtering, grouping)
- 🧮 Calculs mathématiques avancés
- 📝 Manipuler des chaînes de caractères (regex, parsing)
- 🔗 Logique métier spécifique à ton business
Structure du Code Node
// Accéder aux données du node précédent
const items = $input.all();
// Traiter chaque item
const output = items.map(item => {
return {
json: {
// Tes transformations ici
fullName: item.json.firstName + ' ' + item.json.lastName,
email: item.json.email.toLowerCase(),
createdAt: new Date().toISOString()
}
};
});
// Retourner les résultats
return output;
Exemple 1 : Calculer la somme d'une commande
const items = $input.all();
const result = items.map(item => {
const products = item.json.products;
const total = products.reduce((sum, product) => {
return sum + (product.price * product.quantity);
}, 0);
return {
json: {
orderId: item.json.orderId,
total: total,
currency: 'EUR'
}
};
});
return result;
Exemple 2 : Parser des données CSV
const csvData = $input.first().json.data;
const lines = csvData.split('
');
const headers = lines[0].split(',');
const output = lines.slice(1).map(line => {
const values = line.split(',');
const obj = {};
headers.forEach((header, index) => {
obj[header.trim()] = values[index]?.trim();
});
return { json: obj };
});
return output;
Exemple 3 : Générer des slugs SEO
const items = $input.all();
const output = items.map(item => {
const title = item.json.title;
const slug = title
.toLowerCase()
.normalize('NFD')
.replace(/[̀-ͯ]/g, '') // Retire accents
.replace(/[^a-z0-9]+/g, '-') // Remplace non-alphanumériques par -
.replace(/^-+|-+$/g, ''); // Retire - en début/fin
return {
json: {
...item.json,
slug: slug
}
};
});
return output;
Librairies JavaScript disponibles
N8N inclut plusieurs librairies utiles :
- Luxon : manipulation de dates (
DateTime.now()) - Lodash : utilitaires JS (
_.groupBy(),_.uniq()) - Crypto : hashing et encryption
// Exemple avec Luxon
const { DateTime } = require('luxon');
const now = DateTime.now().setZone('Europe/Paris');
const formatted = now.toFormat('dd/MM/yyyy HH:mm');
return [{ json: { date: formatted } }];
Gestion d'erreurs professionnelle
1. Try/Catch dans le Code Node
try {
const items = $input.all();
const output = items.map(item => {
// Ton code ici
return { json: item.json };
});
return output;
} catch (error) {
// Log l'erreur
console.error('Error:', error.message);
// Retourne un objet d'erreur
return [{
json: {
error: true,
message: error.message,
stack: error.stack
}
}];
}
2. Error Trigger Workflow
Crée un workflow dédié qui se déclenche en cas d'erreur :
Error Trigger → Slack (Send Alert) → Airtable (Log Error)
Configuration du Error Trigger :
- Workflow : Tous (ou workflows spécifiques)
- Error Only : True
3. Retry automatique
Dans les settings du node HTTP Request :
- Retry On Fail : True
- Max Tries : 3
- Wait Between Tries : 1000ms
Sécurité : variables d'environnement
Pourquoi utiliser des variables d'environnement ?
- 🔒 Ne jamais hardcoder de secrets dans les workflows
- 🔄 Faciliter le passage dev → prod
- 👥 Partager des workflows sans exposer les credentials
Définir des variables d'environnement
Méthode 1 : Fichier .env (Docker)
# .env
API_KEY=sk-abc123
DATABASE_URL=postgresql://localhost/mydb
SLACK_WEBHOOK=https://hooks.slack.com/...
Dans docker-compose.yml :
version: '3'
services:
n8n:
image: docker.n8n.io/n8nio/n8n
env_file:
- .env
ports:
- "5678:5678"
Méthode 2 : Variables N8N Cloud
- Settings → Environment Variables
- Ajoute tes variables
Utiliser les variables dans les workflows
{{ $env.API_KEY }}
{{ $env.DATABASE_URL }}
Cas pratique complet : API de gestion de leads
Objectif
Créer une API complète pour gérer des leads avec :
- ✅ Endpoint POST /leads (créer un lead)
- ✅ Validation des données
- ✅ Stockage dans Airtable
- ✅ Email de confirmation
- ✅ Gestion d'erreurs
Structure du workflow
Webhook (POST /leads)
→ Code (Validate Input)
→ IF (Valid)
→ Airtable (Create Record)
→ Gmail (Send Email)
→ Respond to Webhook (Success)
→ ELSE
→ Respond to Webhook (Error)
Code de validation
const body = $input.first().json.body;
// Validation
const errors = [];
if (!body.email || !body.email.includes('@')) {
errors.push('Email invalide');
}
if (!body.name || body.name.length < 2) {
errors.push('Nom trop court');
}
if (!body.company) {
errors.push('Entreprise requise');
}
// Retour
if (errors.length > 0) {
return [{
json: {
valid: false,
errors: errors
}
}];
} else {
return [{
json: {
valid: true,
data: {
email: body.email.toLowerCase(),
name: body.name.trim(),
company: body.company.trim(),
createdAt: new Date().toISOString()
}
}
}];
}
Ressources pour approfondir
Conclusion
Avec les webhooks, les appels API et le code JavaScript, N8N devient bien plus qu'un simple outil d'automatisation : c'est une véritable plateforme de développement low-code.
Tu peux maintenant :
- ✅ Créer des APIs personnalisées
- ✅ Connecter N8N à n'importe quel service (même sans intégration native)
- ✅ Implémenter une logique métier complexe
- ✅ Construire des workflows robustes et sécurisés
La limite, c'est ton imagination. Alors, quel sera ton prochain projet N8N ? 🚀