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

  1. Crée un nouveau workflow
  2. Ajoute le node Webhook en premier
  3. Configuration :
    • HTTP Method : POST (ou GET selon ton besoin)
    • Path : mon-webhook
    • Authentication : None (pour débuter)
    • Response Mode : Last Node
  4. 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/json
    • Authorization: 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 ? 🚀