CertLister Aide
Accéder à l'app
Sur cette page

Intégrations

Connecter Moodle à CertLister

Émettez des attestations numériques automatiquement quand vos apprenants terminent un cours Moodle — via le plugin Event Trigger et les webhooks, l'API REST ou l'export CSV.

Page Intégrations de CertLister avec un point de terminaison webhook Moodle

Connecter Moodle à CertLister

Temps de lecture : 10 minutes

Forfait requis : Pro (les chemins A et B utilisent les intégrations API & Webhooks) · Tous les forfaits pour le chemin C

Moodle est l'une des plateformes d'apprentissage (LMS) les plus utilisées au monde — et l'une des questions qu'on nous pose le plus souvent est : « CertLister peut-il émettre une attestation automatiquement quand un apprenant termine un cours Moodle ? »

Oui. Moodle n'envoie pas de webhooks nativement, mais il existe trois façons fiables de le connecter à CertLister. Ce guide les présente toutes les trois, de la plus automatique à la plus manuelle.


Quel chemin choisir ?

Chemin A — Plugin Event TriggerChemin B — Script d'interrogationChemin C — Export CSV
Émission en temps réel✅ Instantanée⚠️ Quasi temps réel (intervalle d'interrogation)❌ Manuelle
Code requis❌ Aucun✅ Un petit script❌ Aucun
Plugin Moodle requis✅ Oui (Event Trigger)❌ Non❌ Non
Compatible MoodleCloud❌ Non (installation de plugins impossible)✅ Oui✅ Oui
Accès Moodle nécessaireAdministrateur du siteAdministrateur du site (configuration des services web)Enseignant/gestionnaire
Forfait CertListerProProTous

Notre recommandation : si vous hébergez votre propre Moodle (ou si votre hébergeur peut installer des plugins), utilisez le chemin A — temps réel, sans code, environ 20 minutes de configuration. Si vous êtes sur MoodleCloud ou ne pouvez pas installer de plugins, utilisez le chemin B si vous disposez d'un développeur, ou le chemin C sinon.


Chemin A — Plugin Event Trigger + Webhook entrant (recommandé)

Dans cette configuration, le plugin gratuit Event Trigger (tool_trigger, maintenu par Catalyst IT) surveille l'événement Cours terminé dans Moodle et envoie une requête HTTP POST vers un webhook entrant CertLister. CertLister crée l'attestation — et peut l'envoyer par courriel à l'apprenant — dès que le cours est terminé.

Cours Moodle terminé → Workflow Event Trigger → HTTP POST → Webhook CertLister → Attestation émise → Courriel envoyé

Étape 1 — Créer le webhook entrant dans CertLister

  1. Dans CertLister, allez dans Intégrations → onglet Webhooks
  2. Cliquez sur Créer un webhook
  3. Remplissez :
    • Nom — p. ex. « Complétions de cours Moodle »
    • ModeCréer (crée automatiquement une attestation à partir des données reçues)
    • Catégorie — la catégorie dans laquelle classer les nouvelles attestations
    • Design — choisissez éventuellement un design enregistré pour appliquer votre modèle
    • Envoyer le courriel — activez pour envoyer automatiquement son attestation à chaque apprenant
  4. Configurez les correspondances de champs — associez les champs JSON envoyés par Moodle aux champs de l'attestation :
Champ de l'attestationChemin JSON
recipient_namerecipient_name
recipient_emailrecipient_email
titletitle

(Ces champs correspondent au corps JSON que vous construirez dans Moodle à l'étape 3. Vous pouvez ajouter d'autres correspondances pour des attributs personnalisés — voir Ajouter plus de données ci-dessous.)

  1. Cliquez sur Créer, puis copiez l'URL du webhook. Elle ressemble à :
https://app.certlister.com/api/v1/hooks/votre-jeton-de-point-de-terminaison

Gardez cette URL secrète. Le jeton contenu dans l'URL est ce qui autorise les requêtes. Toute personne disposant de l'URL peut créer des attestations dans votre compte — traitez-la comme un mot de passe, et régénérez-la depuis la carte du point de terminaison en cas de fuite.

Étape 2 — Installer le plugin Event Trigger dans Moodle

  1. Dans Moodle, allez dans Administration du sitePluginsInstaller des plugins
  2. Recherchez Event Trigger (tool_trigger) dans le répertoire de plugins, ou téléversez le ZIP depuis la page du plugin
  3. Terminez l'installation et la mise à niveau

Remarque : l'installation de plugins nécessite un accès administrateur du site et n'est pas possible sur MoodleCloud. Dans ce cas, passez au chemin B ou au chemin C.

Étape 3 — Créer le workflow dans Moodle

  1. Allez dans Administration du siteServeurEvent Trigger
  2. Cliquez sur Ajouter un workflow et remplissez :
    • Nom — p. ex. « Envoyer les complétions à CertLister »
    • Événement — recherchez et sélectionnez Cours terminé (\core\event\course_completed)
    • Actif — laissez désactivé pour l'instant ; vous l'activerez après le test
  3. Ajoutez les étapes du workflow, dans cet ordre :

Étape 3a — Recherche d'utilisateur (User lookup). L'événement brut ne contient que l'identifiant numérique userid de l'apprenant. Ajoutez une étape User lookup (lisant le champ relateduserid — pour les complétions de cours, c'est l'apprenant) afin que le workflow dispose de champs comme {user_fullname} et {user_email}.

Étape 3b — Recherche de cours (Course lookup). Même principe pour le cours : ajoutez une étape Course lookup lisant le champ courseid, ce qui ajoute {course_fullname} et {course_shortname}.

Étape 3c — Action HTTP POST. Ajoutez une étape d'action HTTP POST :

  • URL — l'URL de votre webhook CertLister de l'étape 1
  • En-têtes HTTP :
Content-Type: application/json
  • Paramètres HTTP (corps) :
{
  "recipient_name": "{user_fullname}",
  "recipient_email": "{user_email}",
  "title": "{course_fullname}"
}

Les {placeholders} sont remplacés par les vraies valeurs issues des étapes de recherche au déclenchement du workflow.

  1. Enregistrez le workflow.

Astuce — Mode apprentissage : si vous ne savez pas quels champs de données sont disponibles, activez le Learning mode du workflow, terminez un cours de test une fois, et Event Trigger enregistrera l'événement en vous montrant tous les champs utilisables comme placeholders.

Étape 4 — Tester de bout en bout

  1. Dans Moodle, inscrivez un utilisateur de test à un cours dont les critères d'achèvement sont configurés (Cours → paramètres d'Achèvement de cours — l'achèvement doit être activé, sinon l'événement ne se déclenche jamais)
  2. Terminez le cours avec l'utilisateur de test (ou marquez-le comme terminé manuellement en tant qu'enseignant)
  3. Moodle déclenche l'événement en une minute ou deux (les workflows s'exécutent via le cron de Moodle — vérifiez que le cron tourne)
  4. Dans CertLister, allez dans IntégrationsWebhooks et ouvrez les journaux du point de terminaison — vous devriez voir la requête, sa charge utile et le résultat
  5. Vérifiez votre page Attestations : la nouvelle attestation doit s'y trouver, et si Envoyer le courriel est activé, l'apprenant l'a reçue

Une fois le test réussi, passez le workflow Moodle en Actif. Chaque complétion de cours émet désormais une attestation automatiquement.

Ajouter plus de données depuis Moodle

Vous voulez le nom court du cours ou d'autres champs sur l'attestation ? Ajoutez-les au corps JSON dans Moodle :

{
  "recipient_name": "{user_fullname}",
  "recipient_email": "{user_email}",
  "title": "{course_fullname}",
  "course_code": "{course_shortname}"
}

Puis associez course_code à un attribut personnalisé dans les correspondances de champs CertLister. Les attributs personnalisés peuvent être imprimés sur le design de l'attestation et affichés sur la page de vérification — voir Attributs personnalisés.

Vous pouvez laisser issue_date sans correspondance — CertLister date l'attestation au moment de sa création, ce qui, pour un webhook en temps réel, correspond à la date de complétion.

Un cours, un type d'attestation

Un point de terminaison webhook a une seule catégorie et un seul design. Si différents cours Moodle doivent émettre des attestations différentes :

  1. Créez un webhook CertLister par cours (ou par type d'attestation), chacun avec sa catégorie et son design
  2. Dans Moodle, créez un workflow par cours, en ajoutant une étape de filtre sur courseid pour que chaque workflow ne se déclenche que pour son cours, et pointez chacun vers l'URL de webhook correspondante

Pour quelques cours, c'est rapide ; pour de grands catalogues, préférez le chemin B, où un script peut router dynamiquement.


Chemin B — Script d'interrogation via les services web Moodle

Si vous ne pouvez pas installer de plugins Moodle (p. ex. MoodleCloud), un petit script peut interroger l'API de services web intégrée de Moodle pour détecter les complétions et créer les attestations via l'API REST de CertLister. C'est du quasi temps réel — aussi frais que votre intervalle d'interrogation.

Cron/planificateur → Services web Moodle (complétions) → API REST CertLister → Attestation émise

Étape 1 — Activer les services web dans Moodle

Dans Moodle, en tant qu'administrateur du site :

  1. Administration du siteGénéralFonctions avancées → activez Services web
  2. Administration du siteServeurServices webGérer les protocoles → activez REST
  3. Services webServices externes → ajoutez un service personnalisé et ajoutez-y ces fonctions :
    • core_enrol_get_enrolled_users — lister les apprenants d'un cours
    • core_completion_get_course_completion_status — vérifier la complétion d'un apprenant
  4. Créez un utilisateur Moodle dédié à l'intégration, donnez-lui un rôle avec uniquement les capacités requises par ces fonctions, et autorisez-le pour votre service
  5. Services webGérer les jetons → créez un jeton pour cet utilisateur

La documentation des services web de Moodle détaille chaque écran.

Étape 2 — Créer une clé API CertLister

  1. Dans CertLister, allez dans Intégrations → onglet Clés API
  2. Cliquez sur Créer une clé API, nommez-la (p. ex. « Synchro Moodle ») et donnez-lui les portées credentials:read et credentials:write
  3. Copiez la clé (cl_live_...) — elle n'est affichée qu'une seule fois

Étape 3 — Exécuter un script d'interrogation

Le script ci-dessous vérifie un cours Moodle et émet une attestation à toute personne l'ayant terminé et n'en ayant pas encore. Exécutez-le sur un planificateur (cron, GitHub Actions, Cloud Scheduler — toutes les 15 minutes fonctionne bien).

// moodle-sync.js — Node.js 18+
const MOODLE_URL = "https://votre-site-moodle.example.com";
const MOODLE_TOKEN = "votre-jeton-services-web";
const COURSE_ID = 42; // identifiant du cours Moodle
const COURSE_NAME = "Formation Sécurité au travail";
const CERTLISTER_KEY = "cl_live_votre_cle_api";
const CERTLISTER_API = "https://app.certlister.com/api/v1/external";

async function moodle(wsfunction, params) {
  const query = new URLSearchParams({
    wstoken: MOODLE_TOKEN,
    wsfunction,
    moodlewsrestformat: "json",
    ...params,
  });
  const res = await fetch(`${MOODLE_URL}/webservice/rest/server.php?${query}`);
  return res.json();
}

async function certlister(path, options = {}) {
  const res = await fetch(`${CERTLISTER_API}${path}`, {
    ...options,
    headers: {
      Authorization: `Bearer ${CERTLISTER_KEY}`,
      "Content-Type": "application/json",
      ...options.headers,
    },
  });
  return res.json();
}

async function main() {
  const users = await moodle("core_enrol_get_enrolled_users", {
    courseid: COURSE_ID,
  });

  for (const user of users) {
    const status = await moodle("core_completion_get_course_completion_status", {
      courseid: COURSE_ID,
      userid: user.id,
    });
    if (!status.completionstatus?.completed) continue;

    // Ignorer les apprenants qui ont déjà cette attestation
    const existing = await certlister(
      `/credentials?search=${encodeURIComponent(user.email)}`
    );
    const alreadyIssued = (existing.data || []).some(
      (c) => c.title === COURSE_NAME && c.recipient_email === user.email
    );
    if (alreadyIssued) continue;

    await certlister("/credentials", {
      method: "POST",
      body: JSON.stringify({
        recipient_name: user.fullname,
        recipient_email: user.email,
        title: COURSE_NAME,
        send_email: true,
      }),
    });
    console.log(`Attestation émise pour ${user.fullname}`);
  }
}

main();

Adaptez selon vos besoins : bouclez sur plusieurs cours, définissez category_id et design_id par cours (listez-les via GET /external/categories et GET /external/designs), ou ajoutez des custom_attributes. La référence complète des points de terminaison se trouve dans Intégrations API & Webhooks.


Chemin C — Export CSV + Import en masse

Sans plugin, sans code, fonctionne partout — y compris sur MoodleCloud. Idéal pour émettre les attestations à la fin d'une session de cours plutôt qu'en continu.

  1. Dans Moodle, ouvrez le cours et allez dans le rapport d'achèvement de cours (RapportsAchèvement de cours) — ou le carnet de notes — et téléchargez le rapport en CSV
  2. Dans un tableur, conservez les colonnes utiles : nom de l'apprenant, courriel et date d'achèvement
  3. Dans CertLister, allez dans AttestationsImporter et téléversez le CSV, en associant les colonnes aux champs des attestations
  4. Vérifiez et confirmez — CertLister crée les attestations et peut les envoyer par courriel en masse

Guide complet : Import en masse d'attestations.


Bon à savoir

Limites de débit. Les webhooks entrants acceptent 30 requêtes par minute par point de terminaison, et l'API REST autorise 100 requêtes par minute par clé. Les complétions de cours normales n'approchent jamais ces limites — mais si vous marquez en masse une grande cohorte comme terminée dans Moodle, Event Trigger peut déclencher des centaines de webhooks d'un coup et certains seront rejetés avec un code 429. Pour les grosses opérations par lots, préférez le chemin B (le script se régule) ou le chemin C.

Protection contre les doublons. En mode « Créer », le webhook crée une attestation pour chaque requête reçue. Moodle ne déclenche Cours terminé qu'une fois par apprenant et par cours, donc les doublons sont rares en pratique — mais si vous rejouez des complétions (p. ex. en réinitialisant puis re-terminant un cours), vérifiez les journaux du webhook et votre liste d'attestations.

L'achèvement doit être configuré. L'événement Cours terminé ne se déclenche que pour les cours dont les critères d'achèvement sont activés dans Moodle (Cours → paramètres d'achèvement de cours). Si aucun webhook n'arrive, c'est la première chose à vérifier — puis confirmez que le cron de Moodle tourne, car les workflows Event Trigger s'exécutent via le cron.

Vérification des attestations. Chaque attestation émise depuis Moodle bénéficie de la même page de vérification, du même code QR et du même accès au portail des titulaires que toute autre attestation CertLister — voir Portail des titulaires.


Dépannage

SymptômeCause probableSolution
Rien n'arrive dans CertListerAchèvement de cours non activé, ou cron Moodle arrêtéActivez les critères d'achèvement ; vérifiez Administration du siteServeurTâches
Le journal du webhook affiche une erreur de correspondance 400Les champs du corps JSON ne correspondent pas à vos correspondances de champsComparez la charge utile journalisée aux correspondances ; les fautes de frappe dans les placeholders comme {user_fullname } (espace parasite) sont fréquentes
Le journal du webhook affiche 401Jeton de point de terminaison erroné ou régénéré dans l'URLCopiez l'URL actuelle du webhook depuis la carte du point de terminaison dans le workflow Moodle
Attestation créée mais aucun courrielBascule Envoyer le courriel désactivée, ou apprenant sans courriel dans MoodleActivez la bascule ; confirmez que {user_email} est résolu (vérifiez le profil Moodle)
Erreurs 429 lors de complétions en masseLimite de débit (30/min par point de terminaison)Espacez le marquage en masse, ou utilisez le chemin B/C pour les lots
Le service web Moodle renvoie invalidtokenJeton expiré ou service non autorisé pour l'utilisateurRecréez le jeton dans Gérer les jetons ; confirmez que l'utilisateur est autorisé pour le service

Articles connexes

Toujours bloqué ? Nous répondons sous 24 h les jours ouvrables. Contacter le support →