# Cours

> Des cours avec modules et leçons en texte, image, vidéo ou lien. Ce que fait le membre : voir les cours, commencer, regarder, marquer les leçons et terminer. Comment l’équipe crée, construit, publie et suit les élèves, le mode Un seul cours, et comment le vendre.

Le module **Cours** organise l’apprentissage sur trois niveaux :

<div class="flow">
<div class="flow-row"><span class="flow-node">Espace Cours</span><span class="flow-arrow">→</span><span class="flow-node">Cours</span><span class="flow-arrow">→</span><span class="flow-node">Module</span><span class="flow-arrow">→</span><span class="flow-node">Leçon (texte, image, vidéo ou lien)</span></div>
</div>

Les membres commencent le cours, suivent les leçons, marquent chacune comme terminée et suivent leur progression jusqu’à la fin. L’espace peut être une **liste de cours** ou, en mode [Un seul cours](#cours-en-mode-un-seul-cours), un seul cours.

## À quoi ça sert

| Communauté | Cours |
|---|---|
| École en ligne | *Excel de zéro* : 6 modules, 30 leçons vidéo |
| RH d’entreprise | *Intégration* : 3 modules avec les politiques de l’entreprise |
| Mentorat | *Parcours du mentoré* : un module par mois |

## Ce que fait le membre

### La liste des cours

Dans l’espace Cours, le membre voit les cours de la communauté sous forme de cartes. Chaque carte montre le **niveau**, le **titre**, le nombre de **modules** et de **leçons**, et la **durée** (ou « Sans durée »). Qui a commencé voit la **barre de progression** ; qui n’a pas commencé voit « Pas commencé ».

- Le cours mis à la une apparaît en grand en haut, avec le badge **Cours à la une**. Sans cours à la une, il n’y a pas de bloc à la une.
- En haut, le sélecteur **Tous**, **Mon contenu**, **En cours**, **Terminés** et **Enregistrés** réduit la liste (voir [Mon contenu](#mon-contenu)) ; le choix reste dans l’adresse de la page.

![Un espace Cours (interface en portugais)](/screens/cursos.png "Le sélecteur Tous, En cours, Terminés et Enregistrés, et le cours à la une en haut.")
- **Brouillon** et **archivé** n’apparaissent que pour l’équipe, avec un badge. Les membres ne les voient pas.
- Le nombre d’élèves n’apparaît que pour l’équipe.
- En mode [Un seul cours](#cours-en-mode-un-seul-cours), il n’y a pas de liste : le membre arrive directement sur le cours.

Quand il n’y a rien à montrer, l’écran dit pourquoi :

| Situation | Message |
|---|---|
| L’espace n’a aucun cours publié | Aucun cours disponible |
| Filtre **Mon contenu** sans résultat | Aucun de vos cours ici pour l’instant |
| Filtre **En cours** sans résultat | Aucun cours en cours |
| Filtre **Terminés** sans résultat | Aucun cours terminé pour l’instant |
| Le chargement a échoué | Erreur de chargement des cours, avec le bouton **Réessayer** |

### Commencer le cours

Sur la page du cours, le membre voit la couverture, le niveau, la description et le **Contenu du cours** : le plan avec les modules et les leçons, et le type et la durée de chacune. **Sans inscription, le plan n’ouvre pas les leçons.**

**L’en-tête du cours.** Juste sous la couverture viennent le titre et une ligne avec le niveau, combien de modules et de leçons, la durée totale (quand chaque leçon a une durée) et combien d’élèves ; en dessous, les tags et le formateur. Il remplace l’ancienne carte **Détails du cours**. Les rubriques de la page (**Contenu**, **Élèves** et **Évaluations**, les deux dernières seulement pour qui peut les voir) sont des onglets soulignés.

**Dans le plan,** chaque module montre combien de leçons il a et leur durée, et se replie ou se déplie d’un clic ; chaque leçon montre l’icône du type, le titre, la durée et la coche de leçon terminée ou le cadenas.

**La colonne latérale** a un seul bouton principal (**Commencer le cours**, **Continuer le cours** ou **Revoir le cours**). Qui est inscrit y voit sa progression et la **Leçon suivante**, qui s’ouvre directement. **Partager**, **Enregistrer le cours** et **Quitter le cours** deviennent de petites icônes, en ligne, sous le bouton.

**Commencer le cours** inscrit le membre en un clic et ouvre la première leçon. À côté du bouton, un avis : *« En commençant, l’équipe de la communauté peut suivre votre progression dans ce cours. »*

| Situation | Ce que montre la page |
|---|---|
| Pas encore commencé | **Commencer le cours** |
| Déjà commencé | **Continuer le cours** et la barre de progression |
| Toutes les leçons terminées | **Cours terminé**, **Terminé le {date}** et **Revoir le cours** |

**Continuer le cours** ouvre la dernière leçon consultée, si elle n’est pas terminée ; sinon, la première leçon en attente. S’inscrire à nouveau n’est pas une erreur : l’inscription existante reste valable, sans points en plus.

### Suivre la leçon

Chaque leçon s’affiche selon son type :

| Type | Comment elle s’affiche |
|---|---|
| Vidéo | Intégrée dans la page, **seulement depuis YouTube, Vimeo et Loom**. Une vidéo venant d’ailleurs devient une leçon lien |
| Texte | Texte mis en forme |
| Lien | Un bouton **Ouvrir**, qui ouvre un autre onglet. Avis : *« Ce lien s’ouvre dans un nouvel onglet et vous fait sortir de cette communauté. Vérifiez l’adresse avant de continuer. »* |
| Image | L’image dans la page |

À côté de la leçon se trouve le **Contenu du cours** avec la progression ; sur le téléphone, le bouton **Contenu du cours** ouvre un tiroir avec le même plan.

- **Marquer comme terminée** enregistre la leçon. Il n’est pas possible de la décocher. Une fois marquée, la leçon affiche **Leçon terminée** et le bouton **Leçon suivante**.
- Sur la dernière leçon, l’écran affiche **Vous avez terminé ce cours !**.
- La fin ne se fait que par le bouton : regarder la vidéo jusqu’au bout ne marque pas la leçon.
- Une leçon sans contenu n’a pas de bouton de fin.
- Ouvrir une leçon enregistre l’accès, pour que **Continuer le cours** revienne là où la personne s’est arrêtée.

- **Leçon précédente** et **Leçon suivante** se trouvent aux bords de la leçon (sur mobile, **Précédente** et **Suivante**). Le bouton **Terminer la leçon** marque la leçon, qui affiche alors **Terminée**.
- **Fin automatique.** La leçon se termine toute seule quand la vidéo se termine : vidéo envoyée, Drop, YouTube et Vimeo. Pour les autres vidéos intégrées, utilisez **Terminer la leçon**.
- **Reprendre là où vous vous êtes arrêté.** La position de la vidéo est enregistrée environ toutes les 15 secondes ; quand vous revenez, la leçon affiche *« Reprise à 04:32 »* et **Recommencer**. Près de la fin compte comme vu.
- **Évaluez cette leçon** de 1 à 5 étoiles, avec un commentaire facultatif. Les élèves ne voient que leur propre évaluation. Avec **Montrer la moyenne des évaluations aux élèves**, dans le formulaire du cours (propriétaire et administrateur), les élèves voient aussi la moyenne et le nombre d’évaluations. L’équipe voit la moyenne, la répartition et les commentaires de chaque leçon et du cours dans l’onglet **Évaluations** de la page du cours.

### Quand quelque chose n’est pas disponible

| Message | Quand |
|---|---|
| Commencez le cours pour voir cette leçon | Le membre a ouvert une leçon sans avoir commencé le cours |
| Le contenu de cette leçon n’a pas encore été publié | La leçon existe, mais l’équipe n’a pas encore ajouté le contenu |
| Leçon introuvable | La leçon a été retirée du cours |
| Cours introuvable | Le cours a été retiré ou l’adresse est erronée |
| Cet espace est restreint | Le membre n’a pas accès à l’espace. L’accès au cours est celui de l’espace |

### L’équipe prévisualise

Le propriétaire, l’administrateur, le modérateur et les finances ouvrent le cours et les leçons **sans s’inscrire**, y compris dans un cours d’un espace payant. **Aperçu** se trouve dans la barre **Gérer le cours** et ouvre la première leçon comme l’élève la verrait. Dans l’aperçu, l’écran prévient : *« Vous prévisualisez ce cours. Votre progression n’est pas enregistrée. »* L’équipe ne compte pas comme élève et ne gagne pas de points dans cet aperçu.

## Comment ça marche

### Le cours

| Champ | À quoi il sert |
|---|---|
| Titre et slug | Le nom et l’adresse du cours |
| Description | Ce qu’on y apprend |
| Niveau | Débutant, intermédiaire ou avancé |
| Image | La couverture |
| Statut | Commence en **brouillon** ; publié, il accepte les inscriptions ; archivé, il quitte la liste du membre |

### Modules et leçons

Chaque cours a des modules, dans l’ordre, et chaque module a des leçons, dans l’ordre. Une leçon a un type, une durée et le contenu :

| Type | Contenu de la leçon | Règle |
|---|---|---|
| Texte | Le texte, mis en forme | Le texte est obligatoire |
| Vidéo | L’adresse de la vidéo | Seulement YouTube, Vimeo et Loom |
| Lien | L’adresse d’une page | Commence par `http://` ou `https://` |
| Image | L’adresse de l’image | Commence par `http://` ou `https://` |

La durée s’écrit `mm:ss` ou `hh:mm:ss` (par exemple `12:30`). La durée du cours dans la liste est la somme des leçons ; si une durée ne peut pas être lue, la liste affiche « Sans durée ».

### Inscription et progression

Un membre commence un cours **publié**. L’inscription devient **terminée** quand toutes les leçons du cours sont terminées, et elle **ne revient pas en arrière** : si l’équipe ajoute une leçon plus tard, la progression affiche « 9 leçons sur 10 », mais le cours reste terminé. Un cours sans leçons ne peut pas être terminé.

Commencer le cours et terminer des leçons rapporte des [points d’engagement](/espacos/ranking) : 10 points pour s’inscrire et 25 par leçon terminée, une fois par leçon. Terminer le cours lui-même ne rapporte pas de points.

### Le contenu n’est que pour qui peut le voir

Le contenu des leçons (le texte et l’adresse de la vidéo, du lien ou de l’image) n’est livré qu’à l’équipe (propriétaire, administrateur, modérateur et finances) ou à qui a commencé le cours. Qui n’a pas commencé et qui a vu son inscription annulée ne reçoivent que le plan : titre, type et durée de chaque leçon.

### Qui peut

| Action | Qui |
|---|---|
| Voir les cours publiés et commencer | Qui a accès à l’espace |
| Voir les brouillons et les cours archivés | Propriétaire, administrateur, modérateur et finances |
| Voir le contenu sans commencer le cours | Propriétaire, administrateur, modérateur et finances (lecture seule, sans progression) |
| Créer l’espace Cours | Propriétaire et administrateur |
| Créer, modifier, publier, archiver et supprimer des cours, modules et leçons | Propriétaire et administrateur |
| Voir l’onglet **Élèves** | Propriétaire, administrateur, modérateur et finances (modérateur et finances en lecture seule) |
| Choisir et changer le mode de l’espace | Propriétaire et administrateur |

**Affichage.** Le propriétaire et l’administrateur choisissent comment les éléments apparaissent dans cet espace : **Cartes**, **Liste** ou **Vitrine** (par défaut : **Cartes** ; voir [Vitrine](#vitrine-format-de-couverture-et-reprendre-la-ou-vous-vous-etes-arrete)). Voir [Affichage](/conceitos/espacos#display).

## Construire le cours

### Qui fait quoi

| Qui | Ce qu’il voit et fait |
|---|---|
| Propriétaire et administrateur | Créent, modifient, publient, archivent et suppriment cours, modules et leçons, et voient l’onglet **Élèves** |
| Modérateur et finances | Voient l’onglet **Élèves**, en lecture seule. Aucun outil d’édition n’apparaît |
| Membre | Ne voit rien pour l’édition |

### Créer le cours

*Rôle : propriétaire ou administrateur.*

1. Dans l’espace Cours, cliquez sur **Nouveau cours**.
2. Dans l’onglet **Général**, remplissez :
   - **Titre** ;
   - **Adresse (slug)**, remplie à partir du titre et modifiable. Si un cours avec la même adresse existe déjà, l’erreur apparaît sur le champ lui-même ;
   - **Description**, dans l’éditeur de texte ;
   - **Niveau** : Débutant, Intermédiaire ou Avancé ;
   - **Tags** ;
   - **Couverture** : une image 16:9 (par exemple 1600×900). Sur la page et dans les cartes, elle s’affiche recadrée en format panoramique. Sans image, la carte et la page affichent un dégradé aux [couleurs de la communauté](/configuracoes/cores).
3. Dans l’onglet **Publication**, choisissez le **Statut** et, si vous le souhaitez, cochez **Cours à la une**.
4. En option, dans l’onglet **Fin du cours**, le certificat et le **Badge à la fin** : qui termine le cours reçoit le [badge](/membros/engajamento#badges), sans workflow.
5. Cliquez sur **Créer le cours**.

Le cours **commence toujours en brouillon**, visible seulement par l’équipe. Vous construisez le contenu sur sa page et publiez ensuite. En modification, changer l’adresse change le lien du cours : les anciens liens cessent de fonctionner.

Chaque cours est aussi créé avec son propre **produit**, en brouillon gratuit, lié au cours un pour un. Tant que le produit n’est pas publié, rien ne change pour l’élève. Voir [Vendre le cours](#vendre-le-cours).

### Construire les modules et les leçons

Sur la page du cours, l’onglet **Contenu** est le constructeur.

**Modules :** utilisez **Ajouter un module**, à la fin de la liste, donnez-lui un titre et enregistrez. Chaque module montre combien de leçons il a et leur durée, et se replie ou se déplie. Le **⋯** du module propose **Monter**, **Descendre**, **Programmer l’ouverture**, **Renommer** et **Supprimer le module**.

**Leçons :** dans **Ajouter une leçon**, à la fin du module, choisissez le **Type de leçon** et remplissez le contenu. Le **⋯** de la leçon propose **Monter**, **Descendre**, **Modifier la leçon** et **Supprimer la leçon**.

**Glisser :** chaque ligne a une poignée à gauche (*« Faites glisser pour réordonner »*) : les modules se glissent entre modules, et les leçons dans leur propre module. Sur ordinateur, la poignée et le **⋯** apparaissent quand la souris passe sur la ligne ou qu’elle reçoit le focus ; sur téléphone et tablette, ils sont toujours visibles. Pour envoyer une leçon dans un autre module, modifiez la leçon et changez le champ **Module** : elle va à la fin du module choisi.

| Type | Ce qu’il faut remplir |
|---|---|
| Vidéo | Le lien de la vidéo, de YouTube, Vimeo, Loom, Bunny Stream, Cloudflare Stream, Panda Video, ou un HLS (`.m3u8`). La durée (`mm:ss`) est facultative |
| Texte | Le texte de la leçon, dans l’éditeur de texte |
| Lien | L’adresse et le titre. C’est ainsi qu’entre un PDF hébergé ailleurs ou une vidéo d’un fournisseur que la leçon vidéo n’accepte pas (Wistia, par exemple) |
| Image | L’adresse d’une image déjà hébergée |

Avec le type **Vidéo**, une leçon accepte aussi une vidéo envoyée depuis votre ordinateur, et il existe le type **Fichier**. Voir [Vidéo et fichier hébergés](#video-et-fichier-heberges).

> [!WARNING]
> Pour du contenu payant, utilisez une vidéo **non répertoriée** : l’adresse de la vidéo est visible par qui est inscrit.

- **Durée :** elle est facultative. Si une leçon n’a pas de durée, le cours n’affiche pas la durée totale.
- **Leçon sans contenu :** elle reçoit le badge **Sans contenu**, et l’élève y voit « contenu bientôt disponible ».
- **Réordonner :** en faisant glisser la poignée ou avec **Monter** et **Descendre** dans le **⋯**.

### Vidéo et fichier hébergés

*Rôle : propriétaire ou administrateur.* En plus du lien YouTube, Vimeo ou Loom, une leçon peut garder son propre fichier sur Memberfy :

| Type de leçon | Ce qu’il accepte | Limite |
|---|---|---|
| **Vidéo** | Le **lien** habituel, ou une **vidéo hébergée** envoyée depuis votre ordinateur : MP4, WebM ou MOV | 500 Mo |
| **Fichier** (nouveau) | PDF, Word (`.doc`, `.docx`), Excel (`.xls`, `.xlsx`), PowerPoint (`.ppt`, `.pptx`), ZIP et images PNG, JPEG, GIF ou WebP | 50 Mo |

Les SVG, HTML, scripts et exécutables ne sont jamais acceptés. Memberfy vérifie le contenu du fichier, pas seulement l’extension : un exécutable renommé en `.mp4` est refusé.

- **Envoyer :** dans **Choisir un fichier**, choisissez le fichier ; la barre affiche *« Envoi… 40 % »* et **Annuler l’envoi** l’arrête. L’envoi va directement au stockage, sans passer par le serveur de Memberfy. S’il échoue ou est annulé, la leçon reste telle qu’elle était.
- **Contenu bientôt disponible :** vous pouvez créer la leçon sans le fichier (*« Sans fichier, la leçon est créée en “contenu bientôt disponible” et vous envoyez la vidéo plus tard. »*) et **publier le cours avant** que le média soit prêt ; l’élève voit **Contenu bientôt disponible** sur cette leçon.
- **Remplacer** met un autre fichier et supprime le précédent. **Retirer** demande confirmation (*« Le fichier sera supprimé et la leçon redevient “contenu bientôt disponible”. »*) et libère l’espace.
- **Un seul par leçon :** une vidéo hébergée et un lien externe ne coexistent pas ; choisir l’un efface l’autre.

#### Qui le voit

Seulement l’**élève inscrit**, avec le cours publié et la leçon **débloquée** (la séquence et la date s’appliquent comme pour toute leçon). L’**équipe** (propriétaire, administrateur, modérateur et finances) le voit toujours. Le fichier est privé : l’élève reçoit un **lien temporaire**, **1 heure** pour la vidéo (on peut sauter au milieu) et **5 minutes** pour le fichier, qui se télécharge avec son nom d’origine ; l’écran en redemande un tout seul quand il expire. Qui quitte le cours ne reçoit plus de nouveaux liens, mais un lien déjà émis fonctionne jusqu’à son expiration.

#### Hébergée ou lien externe

| | Vidéo hébergée | Lien externe (YouTube, Vimeo, Loom) |
|---|---|---|
| Quand l’utiliser | Contenu payant ou privé : seuls les inscrits accèdent au fichier | Vidéos longues ou lourdes, avec une qualité qui s’adapte à la connexion de l’élève |
| Espace | Utilise le stockage de la communauté | Non |
| Format | Un seul fichier MP4, WebM ou MOV, sans changement automatique de qualité | Ce que le service accepte |
| Attention | Les gros fichiers mettent du temps à s’envoyer | Pour du contenu payant, utilisez une vidéo non répertoriée : l’adresse est visible par les inscrits |

#### Bunny Stream, Cloudflare Stream, Panda Video et HLS

En plus de YouTube, Vimeo et Loom, une leçon vidéo accepte le lien d’une vidéo de qui héberge déjà ses vidéos sur son propre service. Le pas à pas de chaque fournisseur et l’écran des clés sont dans [Intégrations vidéo](/integracoes/integracoes-de-video).

| Fournisseur | Le lien de la leçon |
|---|---|
| **Bunny Stream** | `https://iframe.mediadelivery.net/embed/{library}/{video}` (ou `/play/`), ou `https://video.bunnycdn.com/play/{library}/{video}` |
| **Cloudflare Stream** | `https://customer-{code}.cloudflarestream.com/{id}`, `https://iframe.videodelivery.net/{id}` ou `https://watch.videodelivery.net/{id}` |
| **Panda Video** | `https://{player}.tv.pandavideo.com.br/embed/?v={id}` |
| **HLS** | Une adresse `https://…/fichier.m3u8` sur un serveur public |

- L’adresse doit être exactement d’un de ces services : un domaine qui imite, un HLS en `http`, une IP, un port ou un serveur interne sont refusés. Memberfy ne télécharge pas la vidéo ; le lecteur lit directement depuis le fournisseur.
- Le lecteur ne part qu’à qui peut voir la leçon, selon la même règle que le lien : qui ne voit que le plan du cours ou une leçon verrouillée ne reçoit pas la vidéo.
- Un lien de ces fournisseurs collé dans une publication devient aussi un lecteur, comme un lien YouTube.
- La vidéo de bienvenue reste limitée à YouTube et Vimeo (voir [Bienvenue](/membros/boas-vindas)).

**Vidéo protégée (Bunny et Cloudflare).** Si la bibliothèque Bunny ou le compte Cloudflare exige un jeton pour lire, enregistrez la clé de signature de la communauté : celle de Bunny est l’*Embed token authentication key* de la bibliothèque ; celle de Cloudflare est la clé de signature (le `keyId` et la clé privée). Avec la clé enregistrée :

- **La vidéo part signée, valable 6 heures**, seulement à qui la leçon (ou la publication) laissait déjà voir. Qui copie l’adresse du lecteur ne peut plus la lire ensuite.
- La clé est en écriture seule : une fois enregistrée, seuls ses 4 derniers caractères s’affichent. L’enregistrement, le remplacement, la vérification et la suppression vont dans les [Journaux](/membros/registros-de-atividades), sans la valeur.
- **Vérifier** signe le lien d’une de vos vidéos et demande au fournisseur s’il l’accepte : acceptée, la clé est **valide** ; refusée, **invalide**.
- **Si le fournisseur refuse la clé**, les vidéos de ce fournisseur deviennent **indisponibles** (le lecteur ne s’ouvre pas) jusqu’à ce que vous enregistriez la bonne clé, et le propriétaire et l’administrateur reçoivent un avis dans la cloche, au plus une fois par jour. Les vidéos des autres fournisseurs continuent de se lire.
- Seuls le propriétaire et l’administrateur enregistrent et voient les clés.

Collez le lien dans le formulaire de la leçon, comme un lien YouTube. Les clés de signature sont dans **Paramètres › Intégrations vidéo**, pour le propriétaire et l’administrateur : **Enregistrer la clé**, **Vérifier avec une de vos vidéos** et **Vérifier**, **Remplacer la clé** et **Retirer la clé**, avec le statut **Pas de clé**, **Non vérifiée**, **Valide** ou **Invalide**. Quand le fournisseur refuse la clé, les spectateurs voient *« Vidéo indisponible »* et *« Prévenez l’équipe de la communauté pour qu’elle corrige le problème. »*, et l’avis de la cloche ouvre **Intégrations vidéo**. **Retirer la clé** demande *« Retirer la clé Bunny Stream ? »* (ou celle de Cloudflare Stream). Pour le propriétaire et l’administrateur, une vidéo indisponible affiche le bouton **Ouvrir Intégrations vidéo**.

#### Combien d’espace est utilisé

Le propriétaire voit l’utilisation dans **Paramètres › Offre et utilisation**, dans le bloc **Stockage de vidéos et de fichiers** : le stockage utilisé et sa limite, ce qui a été envoyé ce mois-ci et sa limite, une barre et un avertissement à partir de 80 % de la limite et au-delà de 100 %. Le stockage a la limite de l’offre (de 5 à 250 Go) : à la limite, les nouveaux envois sont refusés, et ce qui est déjà stocké reste ; le volume d’envoi du mois ne fait qu’avertir. Voir [Offre et extensions](/configuracoes/plano#quotas-de-l-offre). **Supprimer** (média, leçon, module ou cours) rend le stockage mais ne baisse pas le volume du mois, qui correspond à ce qui a été envoyé ; le compteur mensuel **repart le 1er, à minuit dans le fuseau horaire de la communauté**. Seuls les médias hébergés des cours comptent.

### Gérer le cours

La barre **Gérer le cours**, sur la page du cours, montre dans quel état est le cours et a les boutons :

| Bouton | Ce qu’il fait |
|---|---|
| **Publier** (ou **Publier à nouveau**) | Les membres qui ont accès à l’espace commencent à voir le cours |
| **Revenir au brouillon** | Le cours redevient visible seulement par l’équipe |
| **Archiver** | Retire le cours aux membres. Les inscriptions et la progression sont conservées |
| **Supprimer** | Demande confirmation |

- **Publier un cours sans leçons, ou avec une leçon sans contenu**, prévient (« Publier quand même ? ») et demande confirmation : **Continuer l’édition** ou **Publier quand même**.
- **Supprimer le cours** montre ce qui disparaît (le cours, les modules et les leçons, avec leur contenu) et indique que la progression des élèves est conservée.
- **Supprimer une leçon ou un module** prévient combien d’élèves y ont de la progression. La progression est conservée, et la barre de chaque élève ne compte plus que les leçons qui existent.

Supprimer un espace Cours supprime aussi ses cours : ils quittent la liste et les élèves perdent l’accès. Les certificats déjà émis restent valables et personne ne reçoit de nouveaux certificats de ces cours. L’application prévient avant que vous confirmiez : *« Les cours de cet espace seront aussi supprimés : ils quittent la liste et les élèves perdent l’accès. Les certificats déjà émis restent valables, et personne ne recevra de nouveaux certificats de ces cours. »*.

### Suivre les élèves

*Rôle : propriétaire, administrateur, modérateur ou finances (modérateur et finances en lecture seule).*

L’onglet **Élèves** liste qui a commencé le cours, l’inscription la plus récente d’abord, par pages, sans recherche. Chaque ligne montre :

- la date d’inscription (« Inscrit le … ») ;
- le **pourcentage de progression** et « N leçons terminées sur M » ;
- la **dernière activité** (« Pas encore d’activité », s’il n’y en a pas eu) ;
- le badge **Terminé**, quand l’élève a fini.

Cliquez sur un élève pour ouvrir son profil. Une inscription **annulée** n’apparaît pas et ne compte pas dans le total (« N élèves inscrits »). Le total est le même nombre que l’équipe voit dans la liste des cours.

## Cours en mode « Un seul cours »

Par défaut, l’espace Cours est une **Liste de cours**. En mode **Un seul cours**, l’espace est un cours : qui l’ouvre arrive directement sur la page du cours, sans liste, sans filtres et sans bouton **Retour**.

### Choisir le mode

*Rôle : propriétaire ou administrateur.*

1. Dans **Ajouter un espace**, choisissez le module **Cours**. Dans **Fonctionnement de l’espace**, choisissez **Liste de cours** (par défaut) ou **Un seul cours**.
2. Avec **Un seul cours**, le bouton **Suivant** mène à l’étape **Cours** : donnez le **titre** (obligatoire), le **niveau** et la **description**.
3. Terminez. L’espace et le cours sont créés ensemble ; si quelque chose échoue, rien n’est créé. Le cours commence en **brouillon**. À la création, la fenêtre se termine ouverte sur la page du cours.

### Ce que voit chacun

| Qui | Ce qu’il voit |
|---|---|
| Membre | Le cours, avec **Commencer le cours** ou **Continuer le cours**. Avec le cours en brouillon, archivé ou absent, il affiche toujours « Ce cours n’est pas encore disponible » |
| Propriétaire et administrateur | La page du cours avec tous les outils, sans liste et sans **Nouveau cours**. Si le cours est supprimé, elle affiche « Cet espace n’a pas encore de cours », avec **Créer le cours** |

### Un cours par espace

Vous ne pouvez pas créer de deuxième cours dans un espace en mode **Un seul cours**, ni dans l’application, ni par l’API, ni par l’assistant. **Les brouillons et les cours archivés comptent.** Pour avoir plus de cours, changez de mode.

### Changer de mode

*Rôle : propriétaire ou administrateur.* Dans **Modifier l’espace**, dans le champ **Fonctionnement de l’espace** :

| Changement | Ce qui se passe |
|---|---|
| Liste de cours vers **Un seul cours** | Avec 0 ou 1 cours, ça passe. Avec 2 ou plus, c’est refusé, en indiquant combien de cours il y a et en demandant de les supprimer jusqu’à ce qu’il en reste un. Rien n’est supprimé |
| **Un seul cours** vers liste de cours | Passe toujours. Les inscriptions et la progression restent |

Supprimer le cours d’un espace en mode **Un seul cours** ne change pas le mode : l’espace attend un nouveau cours.

## Vitrine, format de couverture et « Reprendre là où vous vous êtes arrêté »

### Format de couverture

Dans le formulaire du cours, le propriétaire et l’administrateur choisissent le format de la couverture :

| Format | Proportion | À quoi il sert |
|---|---|---|
| **Bannière** (par défaut) | 3:1 | La couverture large d’aujourd’hui |
| **Affiche** | 2:3 | Une couverture verticale, comme celle d’un film ou d’une série, faite pour la Vitrine |
| **Vidéo** | 16:9 | La forme d’une miniature de vidéo |

L’envoi recadre l’image à la proportion choisie, et le titre du cours se place **sous** la couverture. Chaque cours existant commence en **Bannière** : rien ne change tant que vous ne changez pas.

### Vitrine

**Vitrine** est l’une des options du champ **Affichage** d’un espace Cours (Cours seulement) : une grille d’affiches, 2 par ligne sur le téléphone et 4 à 6 sur ordinateur. Pour les inscrits, une fine barre de progression se trouve juste sous la couverture ; le titre vient en dessous. Un cours sans couverture affiche en reçoit une générée avec la couleur de la communauté et le titre. Qui a terminé le cours voit le badge **Cours terminé** sous le titre. Un cours [verrouillé](/conceitos/visibilidade-e-acesso) affiche le cadenas, comme dans les autres affichages.

### « Reprendre là où vous vous êtes arrêté »

En haut de la liste des cours de l’espace, dans la vue **Tous** et dans n’importe quel affichage, qui a commencé un cours là-bas voit **Reprendre là où vous vous êtes arrêté** : ses cours en cours, le plus récent d’abord. Chacun s’ouvre directement sur la leçon où la personne s’est arrêtée et, dans une leçon vidéo, **au moment de la vidéo** où elle en était. Quand cette leçon est déjà terminée, il ouvre la suivante pas encore terminée et non verrouillée.

Seuls entrent les cours que la personne **peut encore ouvrir** : inscription active, cours publié et espace auquel elle a accès. Un cours devenu verrouillé (le plan a pris fin, la personne a quitté le groupe) sort de la liste. Sans cours en cours, le bloc n’apparaît pas.

### Mon contenu

La vue **Mon contenu** montre les cours qui appartiennent déjà à la personne : ceux avec une inscription (active ou terminée) et ceux débloqués par son plan ou par un achat, même sans inscription. Les cours qui restent à acheter et les cours gratuits auxquels elle ne s’est pas inscrite restent dehors. L’équipe n’y voit que les cours auxquels elle est inscrite : un rôle ne fait pas d’un cours le sien.

## Avec l’assistant et l’API

### Avec l’assistant

Demandez en langage courant, et l’assistant crée l’espace, le cours, les modules et les leçons, avec le contenu de chacune :

> *« Crée le cours Excel de zéro avec deux modules. Dans le premier, une leçon texte de bienvenue et une leçon vidéo avec ce lien YouTube. Dans le second, une leçon avec un lien vers la feuille d’exercices et une leçon avec l’image des raccourcis. »*

Le texte des leçons s’écrit en Markdown et devient le texte mis en forme de l’application. Un lien Bunny Stream, Cloudflare Stream ou Panda Video, ou un flux HLS (`.m3u8`), devient une leçon vidéo, et avec la [clé de signature](/mcp/ferramentas-comunidade#update-video-key) la vidéo se lit signée ; tout autre fournisseur devient une leçon lien. L’administrateur change aussi l’ordre des modules et des leçons, choisit le mode de l’espace et voit les élèves (modérateur, finances ou au-dessus). Voir [Outils · Cours](/mcp/ferramentas-cursos) et les recettes [Build a course with modules and lessons of every type](/mcp/receitas#20-build-a-course-with-modules-and-lessons-of-every-type), [A single-course space, with its course](/mcp/receitas#22-a-single-course-space-with-its-course), [Build and publish the course](/mcp/receitas#23-build-and-publish-the-course) et [Follow the students of a course](/mcp/receitas#24-follow-the-students-of-a-course).

*« Où est-ce que je me suis arrêté ? »* : l’assistant appelle `list_my_courses_in_progress` avec `limit: 1` et ouvre la leçon avec `get_course` (le slug du cours). *« Mets une couverture affiche sur le cours Excel de zéro »* : `update_course` avec `cover_format: "POSTER"`. La Vitrine se choisit à la création ou à la modification de l’espace (`layout: "showcase"`, Cours seulement). Voir [Outils · Cours](/mcp/ferramentas-cursos#list-my-courses-in-progress).

`create_course` renvoie aussi le produit du cours et suggère de **définir le prix** et de **publier** ; `enroll_in_course` explique le refus d’un cours payant et d’un cours complet, et propose la liste d’attente. Voir [Outils · Cours](/mcp/ferramentas-cursos).

Pour le certificat du cours, demandez : *« Active le certificat du cours Excel de zéro avec le modèle Fin de cours. »* L’assistant montre aussi ce qu’émet le cours et prévient quand le modèle choisi est archivé. Voir [Outils · Cours](/mcp/ferramentas-cursos#certificate-on-completion) et les recettes [Set up this course's certificate](/mcp/receitas#25-set-up-this-course-s-certificate), [What does the course issue?](/mcp/receitas#26-what-does-the-course-issue) et [I finished the course](/mcp/receitas#27-i-finished-the-course).

### Avec l’API

1. Créez l’espace : [`POST /api/spaces`](/api/referencia/sections-spaces/post-spaces) avec `module: "courses"`. Pour un espace en mode **Un seul cours**, envoyez `moduleConfig: { "mode": "single" }` et, avec, `course` (`title`, `level`, `description`) : l’espace et le cours sont créés dans une seule transaction.
2. Créez le cours (en mode liste) : `POST /api/courses` avec `communityId`, `spaceId`, `title`, `slug` et `level`. Gardez l’`id`.
3. Créez chaque module : `POST /api/courses/module` avec `courseId` et `title`.
4. Créez chaque leçon : `POST /api/courses/lesson` avec `moduleId`, `title`, `type` et le contenu (`body` pour le texte, `contentUrl` pour la vidéo, le lien et l’image). Le `contentUrl` vidéo accepte YouTube, Vimeo, Loom, Bunny Stream, Cloudflare Stream, Panda Video et HLS (`https://…/*.m3u8`) ; toute autre adresse renvoie `400` sur `contentUrl`. `GET /api/courses/{identifier}` renvoie, sur chaque leçon vidéo que la personne peut voir, `videoEmbed` (`provider`, `kind` `iframe` ou `hls`, `src`) ; avec la clé de signature, un `src` signé, `signed: true` et `expiresAt` (6 heures), ou `unavailable: true` quand la clé a été refusée.
5. Publiez : `PUT /api/courses/{id}` avec `status: "published"`.

**Clés de signature vidéo** (propriétaire et administrateur ; les autres rôles reçoivent `403`) : `GET /api/video-integrations`, `PUT` et `DELETE /api/video-integrations/{provider}` (`bunny` avec `tokenKey` ; `cloudflare` avec `keyId` et `privateKey`, en PEM ou JWK) et `POST /api/video-integrations/{provider}/verify` (avec le lien d’une vidéo du même fournisseur : acceptée, `status: valid` ; refusée, `invalid` ; une vidéo qui n’existe pas, `422` `videoNotFound` ; pas de réponse du fournisseur, `502`). La réponse ne porte que `masked`/`last4`, `status` et `checkedAt` ; jamais la clé. L’avis de la cloche est `videoIntegrations.keyInvalid`.

## La communauté autour du cours

Le cours n’est plus seulement un plan de leçons : les élèves échangent avec la promotion, voient qui enseigne le cours, enregistrent ce qu’ils veulent faire plus tard et, si l’équipe le souhaite, comparent leur progression dans un classement.

### Drop, couverture et texte de la leçon

*Rôle : propriétaire ou administrateur.* Dans une leçon **Vidéo**, **Source de la vidéo** propose **Drops**, **Lien** et **Envoyer une vidéo** :

- **Drops** enregistre la vidéo de la leçon sur le moment avec la caméra, jusqu’à 10 minutes (*« La caméra s’ouvre ici ; le Drop devient la vidéo de cette leçon quand vous enregistrez. »*). Elle se lit sur la page de la leçon elle-même, pour l’équipe et pour les élèves inscrits. Voir [Drops](/espacos/drops).
- **Durée.** Sur une leçon sans durée, la durée du Drop (ou de la vidéo envoyée) se remplit toute seule.
- **Choisir la couverture** montre jusqu’à six images de la vidéo ; cliquez sur l’une pour l’utiliser comme couverture.
- **Générer le texte de la leçon à partir de la vidéo** rédige le **Texte de la leçon** à partir de ce qui a été dit. Le texte est modifiable (*« Facultatif. S’affiche sous la vidéo ; relisez-le avant d’enregistrer. »*) et l’élève le lit sous la vidéo.

Sur la page de la leçon, qui peut modifier le cours voit **Modifier la leçon** et **Modifier le cours**, qui ouvrent les mêmes éditeurs que la page du cours, sans revenir au constructeur.

### Quitter le cours

Un élève inscrit dont le cours n’est pas encore terminé voit **Quitter le cours** sur la page. La confirmation indique que **la progression est conservée** : s’il recommence le cours, il continue là où il s’est arrêté. Après le départ, le contenu des leçons redevient seulement le plan, et la personne sort du nombre d’élèves et de l’onglet **Élèves**. Partir ne retire aucun point et ne révoque aucun certificat. **Qui a terminé le cours ne peut pas le quitter.**

### Discussion du cours et discussion de la leçon

Il y a **deux discussions** : la **Discussion du cours**, sur la page du cours (questions générales, avis à la promotion), et la **Discussion de la leçon**, dans chaque leçon. Les deux fonctionnent de la même façon :

- **Commentaires avec un niveau de réponses** : on peut répondre à un commentaire, pas à une réponse. Le texte est simple, de 1 à 2 000 caractères ; le HTML n’est pas interprété.
- **Qui lit :** les élèves inscrits et l’équipe (propriétaire, administrateur, modérateur et finances). Qui n’est pas inscrit, ou a quitté le cours, lit *« La discussion est réservée aux inscrits du cours. »*
- **Qui écrit :** les élèves inscrits et l’équipe.
- **Modifier et supprimer :** l’auteur modifie son propre commentaire (il affiche *modifié*) et le supprime. Le propriétaire, l’administrateur, le modérateur et les finances **suppriment le commentaire de n’importe qui**, après confirmation. Un commentaire supprimé qui a des réponses devient *« Commentaire retiré »* et les réponses restent.
- **Sans validation préalable :** le commentaire apparaît tout de suite, et l’équipe supprime ce qui ne doit pas rester.
- **Réactions :** les sept habituelles (👍 ❤️ 🔥 🙌 😊 👏 🎉), sur le commentaire, la leçon et le cours. Chaque personne en a une par cible : toucher la même la retire, en toucher une autre la change.
- **Cours en brouillon ou archivé :** qui peut lire lit, mais personne n’écrit ni ne réagit.
- **Points :** commenter rapporte les points d’[engagement de la communauté](/espacos/ranking), une fois par commentaire et seulement pour l’élève. Aucun e-mail ni notification ne part.

### Formateur et « Ce que vous allez apprendre »

*Rôle : propriétaire ou administrateur.* Dans le formulaire du cours, choisissez le **Formateur** (facultatif, un seul) parmi le propriétaire, les administrateurs, les modérateurs et les finances, avec une recherche par nom. La page du cours affiche le nom et l’avatar et ouvre le profil. Sans formateur, le bloc n’apparaît pas.

Dans **Ce que vous allez apprendre**, listez jusqu’à 8 éléments de jusqu’à 140 caractères, en texte simple (les éléments vides sont écartés). La liste apparaît à tous ceux qui ouvrent le cours, y compris qui ne s’est pas inscrit. Sans éléments, le bloc n’apparaît pas.

### Enregistrer des cours

Sur chaque carte et sur la page du cours, **Enregistrer le cours** garde le cours pour plus tard (**Retirer des enregistrés** l’annule). Le filtre **Enregistrés** de la liste montre les vôtres. C’est **personnel** : même l’équipe ne voit pas ce que vous avez enregistré. Un cours qui cesse d’être visible disparaît du filtre.

### Combien d’élèves

Un membre voit *« N élèves »* sur la carte et sur la page **seulement à partir de 10 élèves** ; en dessous, aucun nombre n’apparaît. L’équipe voit toujours le nombre réel. Personne ne reçoit le nom des autres élèves par ce nombre.

### Classement du cours

*Rôle : propriétaire ou administrateur.* Dans l’onglet **Publication**, l’interrupteur **Afficher le classement du cours** commence **désactivé**. Activé, les élèves inscrits et l’équipe voient le **Classement du cours** : le **top 10** par leçons terminées (en cas d’égalité, qui a fini le plus tôt l’emporte), avec **nom et avatar**, et la position de qui regarde, même hors du top 10 (*« Vous êtes en position 14, avec 3 leçons terminées. »*). Qui a quitté le cours et l’aperçu de l’équipe ne comptent pas.

Le classement est **celui du cours** et compte les leçons terminées, pas les points. Comme il montre le nom et l’avatar des élèves aux autres élèves, l’activer est un choix de l’équipe, cours par cours ; l’élève n’a pas de moyen de s’en retirer.

## Leçons en séquence et ouverture par date

Deux contrôles facultatifs et indépendants guident le rythme de l’élève : l’**ordre des leçons** et la **date d’ouverture de chaque module**.

### Leçons en séquence

*Rôle : propriétaire ou administrateur.* Dans l’onglet **Publication** du cours, activez **Exiger la séquence** (désactivé au départ). Activé, un élève n’ouvre une leçon qu’après avoir terminé la précédente, dans l’ordre du plan : module par module, leçon par leçon, d’un module à l’autre.

Une leçon est ouverte si c’est la première, si la précédente est terminée, **ou si elle est elle-même déjà terminée**. Ainsi, activer la séquence avec le cours en route, réordonner, insérer ou supprimer des leçons ne ferme jamais ce que l’élève a déjà fait. La désactiver ouvre tout d’un coup. Les modérateurs, les finances et les membres ne voient pas le contrôle.

### Ouverture par module

*Rôle : propriétaire ou administrateur.* Sur chaque module, le bouton **Ouverture** (dans le nouveau constructeur, **Programmer l’ouverture**, dans le **⋯** du module) ouvre la fenêtre *« Ouverture du module »*. Choisissez **un** des deux modes et cliquez sur **Enregistrer l’ouverture** :

| Mode | Quand le module s’ouvre |
|---|---|
| **Date fixe** (*« Disponible à partir du »*) | À la date et à l’heure choisies, dans le fuseau horaire de la communauté. Une date passée ouvre tout de suite |
| **Jours après l’inscription** (0 à 3650) | À **minuit (00:00) dans le fuseau horaire de la communauté** du jour situé autant de jours après la **première inscription** de chaque élève. Avec 0, il s’ouvre tout de suite. Chaque élève a sa propre date |

- Un seul mode s’applique à chaque module ; passer de l’un à l’autre efface le précédent. Vide, le module s’ouvre tout de suite.
- **Quitter le cours et revenir ne relance pas le compteur** : c’est toujours la première inscription qui compte.
- Il n’y a ni tâche ni e-mail : le module s’ouvre tout seul, à la prochaine ouverture du cours après l’heure.
- Une leçon que l’élève a déjà terminée reste ouverte même si vous changez la date ou les jours ensuite.

### Séquence et date ensemble

Avec la séquence activée, un module programmé au milieu du cours verrouille aussi les leçons des modules suivants, car la précédente ne peut pas être terminée tant qu’il n’est pas ouvert. Qui avait déjà terminé des leçons là-bas les garde ouvertes. Si une leçon est retenue pour les deux raisons, le message montre d’abord la date. Le cours ne se termine que lorsque **toutes** les leçons sont terminées, donc qui a tout fini sauf le module programmé attend la date ; la barre de progression montre le nombre réel et le certificat suit la règle habituelle.

### Ce que voit l’élève

Une leçon verrouillée apparaît dans le plan avec un cadenas et **sans contenu** (le texte et l’adresse de la leçon ne sont pas livrés). Le message dit pourquoi :

| Situation | Message |
|---|---|
| Date fixe | *« S’ouvre le 13/10 à 9:00 »* (mis en forme selon la langue) |
| Jours après l’inscription | *« S’ouvre le 18/10, 7 jours après votre inscription »*, avec la date réelle de cette personne. Qui n’est pas encore inscrit lit *« S’ouvre 7 jours après l’inscription »* |
| Séquence | *« Terminez d’abord “X” »* |

Ouvrir une leçon verrouillée par son adresse vous ramène au cours avec *« Cette leçon n’est pas encore ouverte »*. **Continuer** et **Leçon suivante** mènent toujours à une leçon ouverte. Par l’API ou l’assistant, terminer une leçon verrouillée est refusé avec `409`, en indiquant quelle leçon manque ou quand elle s’ouvre.

### Ce que voit l’équipe

Les propriétaires, administrateurs, modérateurs et finances ouvrent toutes les leçons, en aperçu, avec les badges **Séquence** et **Programmée** là où il y aurait un verrou. L’aperçu n’enregistre ni progression, ni points, ni certificat.

**Les modérateurs et les finances lisent le contenu des leçons sans s’inscrire**, y compris dans un cours d’un espace payant. Créer, modifier et supprimer restent réservés aux propriétaires et administrateurs. Les membres, les visiteurs et les personnes qui ont quitté le cours ne reçoivent toujours pas de contenu.

## Leçons quiz

Une leçon **Quiz** teste ce que l’élève a appris, avec correction automatique et une note minimale pour terminer.

### Construire le quiz

*Rôle : propriétaire ou administrateur.* En ajoutant une leçon, choisissez le **Type de leçon** **Quiz**. Définissez la **Note de réussite (%)** (1 à 100 ; par défaut 70) et les questions :

- **1 à 30 questions**, chacune avec un énoncé (jusqu’à 1 000 caractères), **2 à 6 options** et **exactement une correcte** (cochez le cercle de l’option). Toutes sont à réponse unique.
- Une **explication** facultative par question.
- Enregistrer remplace tout l’ensemble. Changer le type d’un quiz qui a déjà des tentatives est refusé.

### Ce que voit l’élève

L’élève répond à **toutes** les questions et clique sur **Envoyer les réponses** ; c’est le serveur qui corrige. Une leçon quiz n’a pas de **Marquer comme terminée** : c’est la réussite qui termine la leçon.

| Résultat | Ce qui s’affiche |
|---|---|
| **Réussi !** (note égale ou supérieure au minimum) | La note, ce qui est juste et faux, la bonne réponse et l’explication de chaque question. **La leçon est terminée**, une seule fois (les points aussi). Recommencer est permis |
| **Pas cette fois** | **Seulement la note** (*« Vous avez eu 3 bonnes réponses sur 5 »*) et la note minimale. Ni les questions ratées ni les bonnes réponses n’apparaissent : elles ne sont montrées qu’après la réussite. **Réessayer** est disponible |

Il y a **30 tentatives par heure** sur chaque leçon. **Vos dernières tentatives** liste les 10 plus récentes (note, réussie ou non, date et heure dans le fuseau horaire de la communauté) ; personne ne lit la tentative d’une autre personne. La séquence et l’ouverture par date s’appliquent au quiz comme à toute leçon.

### Tentatives, meilleure note et note finale

- **Les options sont mélangées à chaque tentative** (l’ordre reste le même au sein d’une tentative). L’équipe voit l’ordre écrit.
- **Tentatives autorisées :** dans l’éditeur du quiz, de 1 à 100 ; **vide signifie illimité** (la limite de 30 par heure s’applique toujours). L’élève voit *« Tentatives restantes : 2 sur 3 »*. Modifier le quiz sans toucher à ce champ garde la limite.
- **La meilleure note compte**, pour chaque élève sur ce quiz.
- **Tentatives épuisées sans réussite :** la leçon est marquée **Non réussi**, l’élève passe à la leçon suivante et n’envoie plus de tentatives sur celle-ci.
- **Note finale du cours :** la moyenne de la meilleure note de chaque quiz du cours, à poids égal. L’élève voit la **Note finale** et l’équipe la voit dans l’onglet **Élèves**.
- **Note minimale pour le certificat (%)** (onglet **Fin du cours**, 0 à 100, facultative) : avec elle, le certificat de fin ne part que lorsque la note finale est égale ou supérieure. Qui est en dessous lit *« Vous avez terminé le cours, mais votre note finale (62 %) est inférieure au minimum pour le certificat (70 %). »* Vide, terminer suffit. Un cours sans quiz n’utilise pas le minimum, et **changer le minimum ne révoque pas les certificats déjà émis**.

### Ce que voit l’équipe

Les propriétaires, administrateurs, modérateurs et finances voient l’**Aperçu de l’équipe** : les bonnes réponses et les explications, et ils peuvent tester le quiz. **Rien n’est enregistré** : ni tentative, ni progression, ni points. Les modérateurs et les finances le font sans s’inscrire.

### Modifier quand il y a déjà des tentatives

Qui a déjà réussi reste en réussite et le cours peut se terminer ; les nouvelles tentatives utilisent les nouvelles questions.

## Certificat de fin de cours

Qui termine le cours reçoit le certificat tout seul, par e-mail, et le trouve dans **Mes certificats**, sans que personne de l’équipe ne l’émette un par un. Le réglage vit sur le cours lui-même et est facultatif.

### Où c’est

*Rôle : propriétaire ou administrateur.* Dans **Modifier le cours** (ou **Nouveau cours**), dans l’onglet **Fin du cours**. En mode [Un seul cours](#cours-en-mode-un-seul-cours), il est dans l’étape **Cours** de l’assistant de création de l’espace, ouverte avec le bouton **Suivant**. Les modérateurs et les membres ne voient pas l’onglet.

### Activer le certificat

Dans **Émettre un certificat ?**, l’interrupteur commence **désactivé**. Activé, qui termine le cours reçoit le certificat par e-mail et le trouve dans **Mes certificats**.

- **Cela ne vaut qu’à partir de maintenant.** Les personnes qui avaient déjà terminé le cours avant l’activation n’en reçoivent pas : il n’y a pas d’émission rétroactive. Qui le termine pendant que l’interrupteur est désactivé n’en reçoit pas non plus, même si vous l’activez plus tard.
- **Un certificat par personne et par cours, pour toujours.** Terminer à nouveau n’en crée pas un autre. Deux cours avec le même modèle créent deux certificats, un pour chacun.
- **Le désactiver** arrête l’émission pour qui termine à partir de là. Les personnes qui ont déjà reçu le leur le gardent.

### Choisir le modèle

Le **Modèle de certificat** vient du module [Certificats](/espacos/certificados) de la communauté. La liste ne montre que les modèles **actifs** et a la zone **Rechercher des modèles par nom**.

- Le **modèle par défaut de la plateforme** est le premier de la liste, déjà sélectionné, et c’est celui utilisé quand personne n’en choisit un autre. La plateforme le crée toute seule, avec l’espace **Certificats** si la communauté n’en a pas encore. Il apparaît dans l’onglet **Modèles** de l’espace et peut être modifié ou dupliqué comme n’importe quel autre.
- Si le modèle choisi (ou celui par défaut) est **archivé ou supprimé**, le cours affiche l’avis *« Le modèle choisi a été archivé ou supprimé »* et **aucun certificat n’est émis** jusqu’à ce que quelqu’un choisisse un autre modèle actif ou réactive celui-ci. La plateforme ne change jamais de modèle toute seule et ne réactive pas un modèle archivé.

### Modifier le texte

Le **Texte du certificat** est déjà rempli et modifiable. Le texte par défaut est *« a terminé le cours {assunto}[ avec une charge horaire de {cargaHoraria}] »*.

| Variable | Ce qui s’affiche |
|---|---|
| `{nome}` | L’élève |
| `{assunto}` | Le titre du cours |
| `{cargaHoraria}` | La charge horaire, déjà avec son unité (« 2 heures », « 0,36 heure »). N’écrivez pas « heures » après |

- Le texte entre `[crochets]` disparaît quand la variable à l’intérieur est vide.
- Le HTML n’est pas accepté. La limite est de 5 000 caractères.
- **Rétablir le texte par défaut** revient à l’original. L’aperçu à côté utilise le nom « Maria Silva ».

### Charge horaire

Il n’y a pas de champ de charge horaire : c’est la **somme des durées des leçons**, en heures avec jusqu’à 2 décimales (59 minutes deviennent 0,98), et elle est **figée au moment de l’émission**.

- Si une leçon n’a pas de durée, le formulaire indique *« Indisponible : une leçon n’a pas de durée »* et liste ces leçons. Dans ce cas, la charge horaire propre du modèle est utilisée, s’il en a une.
- Sans l’une ni l’autre, la ligne de charge horaire est omise du certificat.
- Dans l’assistant du mode un seul cours, il est indiqué *« Calculée dès que le cours a des leçons avec une durée »*.

La **durée de la leçon** est facultative sur tous les types de leçon (texte, vidéo, lien ou image), écrite `mm:ss` ou `hh:mm:ss`.

### Ce que voit l’élève

En terminant la dernière leçon, l’élève voit **Votre certificat est en cours de génération**. Cela prend quelques secondes, et le certificat arrive aussi par e-mail. Une fois prêt, le message devient **Votre certificat est prêt**, avec le bouton **Voir le certificat**. Un certificat en échec ou révoqué n’apparaît pas, et un cours qui n’émet pas n’affiche rien.

### Révoquer et réémettre

Cela se fait toujours dans l’écran [Certificats](/espacos/certificados#revoking) (révoquer, réémettre, renvoyer l’e-mail). Un **certificat révoqué ne revient pas tout seul** : terminer le cours à nouveau n’en crée pas un autre.

La séquence complète, avec les ids qui passent d’une étape à l’autre et les erreurs de qui saute une étape, est dans [Ordre de création](/api/ordem-de-criacao#course).

Avec des quiz dans le cours, l’onglet **Fin du cours** gagne la **Note minimale pour le certificat (%)** : le certificat ne part qu’avec une note finale égale ou supérieure, et changer le minimum ne révoque pas les certificats déjà émis. Voir [Tentatives, meilleure note et note finale](#tentatives-meilleure-note-et-note-finale).

## Vendre le cours

| Modèle | Comment |
|---|---|
| Cours à l’unité | Un [produit](/monetizacao/produtos) qui débloque l’espace du cours (**Privé** › **Produits**) |
| Cours inclus dans l’abonnement | L’espace du cours en **Privé** et débloqué pour le [plan](/monetizacao/planos), ou **Abonnés** |
| Cours gratuit pour les membres | L’espace en **Membres** |

Le paiement appartient à l’espace ou au produit, pas au cours : qui a accès à l’espace peut commencer n’importe quel cours publié qui s’y trouve.

### Prix et vente du cours lui-même

Le cours a son propre produit, et vous pouvez vendre **un cours** sans vendre tout l’espace.

Chaque cours est créé avec un produit de type **Cours**, lié à lui un pour un : **brouillon**, **gratuit**, avec le titre et la couverture du cours. Sur la page du cours, en haut de la colonne de droite, l’équipe voit la carte **Vente**, avec le prix, le statut (*Brouillon*, *En vente* ou *Hors vente*), les places libres, le tag *« Équipe seulement »* et le bouton qui ouvre le produit pour tout régler. Voir [La carte Vente](/monetizacao/produtos#the-sale-card).

- **Un brouillon gratuit ne change rien pour l’élève :** l’inscription est ouverte, comme toujours, jusqu’à ce que vous publiiez le produit.
- **Prix et places :** définissez le **Prix** (zéro, c’est un [cours gratuit](/monetizacao/produtos#free-product), que l’élève obtient avec **S’inscrire gratuitement**), les **Places** et, si vous le souhaitez, un accès limité dans le temps, et **publiez**. Publier avec un prix exige des [Informations commerciales](/pagamentos/informacao-comercial) approuvées ; le gratuit, non.
- **Avec le produit publié et un prix**, l’élève voit **Acheter · {prix}** et ne s’inscrit qu’après l’achat (*« Ce cours est payant. Achetez-le pour vous inscrire. »*). L’achat approuvé **inscrit l’acheteur tout de suite**.
- **Qui entre sans payer :** l’équipe ; qui a un [plan qui inclut le cours](/monetizacao/produtos#plans-that-include-products) ; et qui était déjà inscrit quand le produit a été publié. L’accès à l’espace seul ne suffit pas pour un cours payant.
- **Places :** complet, le cours affiche *« Complet »* et la **liste d’attente** ; quand une place se libère, la personne suivante a 24 heures, par e-mail, pour accepter. Voir [Places et liste d’attente](/monetizacao/produtos#seats-and-waitlist).
- **Durée d’accès :** l’élève voit *« Accès jusqu’au … »* et **Renouveler** les 7 derniers jours ; il reçoit des e-mails 7 jours et 1 jour avant la fin. Voir [Accès limité dans le temps](/monetizacao/produtos#time-limited-access).
- **Un remboursement** annule l’inscription ; la progression et le certificat déjà émis restent.
- **Dépublier le produit** remet le cours en mode ouvert seulement pour les **nouvelles** inscriptions ; qui a acheté garde l’accès.
- **Qui voit le bouton :** le propriétaire, l’administrateur et les finances modifient le produit ; le modérateur voit **Voir le prix et la vente**, en lecture seule. Les membres ne voient pas le bandeau.
- **Supprimer le cours** archive le produit, et est refusé tant qu’il existe un achat payé qui donne encore accès.

## Limites actuelles

- Le certificat automatique ne vaut que pour les personnes qui terminent après l’activation de la fonction. Voir [Certificat de fin de cours](#certificat-de-fin-de-cours).
- La liste des élèves n’a pas de recherche.

## Questions fréquentes

**Où sont les vidéos ?**
La leçon vidéo pointe vers une vidéo sur YouTube, Vimeo ou Loom, et elle se lit dans la page elle-même ; ou c’est une [vidéo hébergée](#video-et-fichier-heberges) sur Memberfy. Bunny Stream, Cloudflare Stream, Panda Video et HLS fonctionnent aussi, en collant le lien de la vidéo (voir [Vidéo et fichier hébergés](#video-et-fichier-heberges)).

**Puis-je décocher une leçon terminée ?**
Non. Terminer est définitif, ce qui évite les points répétés dans l’engagement.

**Puis-je avoir plusieurs cours dans un espace ?**
Oui, en mode **Liste de cours**, qui est le mode par défaut. En mode **Un seul cours**, l’espace a un cours et n’en accepte pas de deuxième.

**Le membre voit-il le cours dans le Feed ?**
Oui, comme les autres éléments, s’il a accès à l’espace.

**L’équipe voit-elle qui suit le cours ?**
Oui. En commençant, le membre est prévenu que l’équipe suit sa progression. L’onglet **Élèves** du cours montre qui est inscrit et la progression de chacun (propriétaire, administrateur, modérateur et finances), et le nombre apparaît dans la liste des cours.

## Avis par e-mail

Quand vous publiez un cours pour la première fois, l’équipe voit la case **Avertir par e-mail · N personnes**, cochée par défaut : 10 minutes plus tard, qui a accès à l’espace et a gardé la catégorie **Cours** activée reçoit un e-mail. Il part une fois par élément ; modifier ou republier ne le renvoie pas. Voir [Avis de nouveaux contenus par e-mail](/notificacoes/avisos-de-novidade).

## Dans l’API

`POST /api/courses`, `POST /api/courses/module`, `POST /api/courses/lesson`, `PUT /api/courses/{id}`, `PUT` et `DELETE /api/courses/module/{moduleId}` (renommer, réordonner, supprimer un module avec ses leçons), `PUT` et `DELETE /api/courses/lesson/{lessonId}` (modifier, réordonner, déplacer vers un autre module, supprimer une leçon), `POST /api/courses/{courseId}/enroll`, `POST /api/courses/{courseId}/lesson/{lessonId}/progress`. Voir [Courses](/api/referencia/courses).

`POST /api/courses/lesson/{lessonId}/media/upload-url` (renvoie un envoi valable 10 minutes), `POST .../media/confirm` et `DELETE .../media` (propriétaire et administrateur) ; `GET /api/courses/{courseId}/lesson/{lessonId}/media` renvoie `{ url, expiresAt }` (vidéo 1 heure, fichier 5 minutes). `POST /api/courses/lesson` accepte `awaitingMedia: true` et le type `file`. La leçon porte `hasMedia` et, pour qui lit le contenu, `media: { name, size, mimeType }`. `GET /api/communities/media-usage` montre l’utilisation au propriétaire, avec `warning` (`nearLimit` à partir de 80 %, `overLimit` au-delà de 100 %).

`quiz.maxAttempts` (1 à 100 ; vide = illimité) à la création et à la modification de la leçon quiz, et `certificateMinGrade` (0 à 100) sur le cours. La tentative renvoie `maxAttempts`, `attemptsUsed`, `attemptsLeft`, `bestScorePercent` et `closedWithoutPassing` ; une tentative après épuisement : `409`. Le cours renvoie `userFinalGrade` à l’élève et `finalGrade` dans la liste des élèves ; en dessous de la note minimale, `userCertificate.status` vaut `BELOW_MIN_GRADE`, avec `finalGrade` et `minGrade`.

**Quiz.** `POST /api/courses/lesson` et `PUT /api/courses/lesson/{lessonId}` acceptent le bloc `quiz` (`passPercent` 1 à 100, 1 à 30 `questions`, 2 à 6 `options` avec exactement un `isCorrect`, `explanation` facultative), propriétaire et administrateur seulement ; une erreur de format : `400`, avec `errors[].param` sur le champ (par exemple `quiz.questions[0].options`) ; changer le type d’un quiz qui a des tentatives : `409`. `POST /api/courses/{courseId}/lesson/{lessonId}/quiz/attempts` envoie les réponses (toutes) et renvoie la note, la réussite et, seulement en cas de réussite, les bonnes réponses ; plus de 30 tentatives par heure sur la leçon : `429`, avec `Retry-After` ; `GET` sur la même route liste les 10 dernières. `POST .../progress` avec `completed: true` sur une leçon quiz : `409`.

Dans l’API : les réponses de cours portent `product` (`id`, `kind`, `status`, `price`, `currency`, `capacity`, `available`, `soldOut` ; `capacity` et `available` seulement pour l’équipe) et, dans le détail, `access` (`team`, `open`, `purchase`, `plan`, `grandfathered`, `paid`), `canEnter` et `waitlist`. `POST /api/courses/{courseId}/enroll` répond désormais `403` (avec `data: { productId, price, currency }`) quand le produit est publié avec un prix et que la personne ne l’a pas acheté, et `409` quand c’est complet. `DELETE /api/courses/{id}` répond `409` avec un achat payé qui donne encore accès ; sinon il archive le produit.

`POST /api/courses/{courseId}/leave` (quitter ; un cours terminé répond `409`) ; les discussions dans `/api/courses/{courseId}/comments` (avec `lessonId` pour la leçon ; `PUT` et `DELETE` dans `.../comments/{commentId}`, les réactions dans `.../comments/{commentId}/react` et `.../react`) ; `POST` et `DELETE /api/courses/{courseId}/favorite` et `GET /api/courses?saved=true` ; `GET /api/courses/{courseId}/leaderboard` (`403` avec le classement désactivé). `POST` et `PUT /api/courses` acceptent `instructorMemberId`, `learningPoints` et `leaderboardEnabled` (propriétaire et administrateur seulement). Le cours renvoie `instructor`, `learningPoints`, `studentsCount` (pour les membres seulement à partir de 10 élèves, sinon `null`) et `isSaved`.

`POST` et `PUT /api/courses` acceptent `requireSequential` (booléen, propriétaires et administrateurs seulement) ; les modules acceptent `availableAt` (date et heure) **ou** `availableAfterDays` (entier de 0 à 3650), jamais les deux (`400`). Le `GET` du cours renvoie, sur chaque module et chaque leçon, `locked`, `lockReason` (`sequence` ou `date`), `unlocksAt` et, pour la séquence, `pendingLesson`, et omet `body` et `contentUrl` de ce qui est verrouillé. `POST /api/courses/{courseId}/lesson/{lessonId}/progress` sur une leçon verrouillée répond `409`.

Vitrine et « Reprendre là où vous vous êtes arrêté » :

- [`GET /api/courses/continue`](/api/referencia/courses/get-courses-continue) (tout rôle) : les cours en cours de la personne, le plus récent d’abord, chacun avec `course` (`id`, `slug`, `title`, `bannerUrl`, `coverFormat`, `spaceId`), `lesson` (la leçon à ouvrir maintenant : `id`, `title`, `type`, `duration`, `moduleId`, `moduleTitle`), `resumeAt` (la seconde dans la vidéo ; `null` sans position), `lastAccessedAt` et `progress`. `limit` de 1 à 20 (par défaut 10). Seulement les cours publiés, avec une inscription active, dans un espace que la personne ouvre.
- `coverFormat` (`BANNER`, `POSTER` ou `VIDEO` ; par défaut `BANNER`) dans `POST` et `PUT /api/courses` et dans toute lecture de cours. Toute autre valeur renvoie `400`. Le cours créé avec un espace **Un seul cours** commence en `BANNER`.
- `layout: "showcase"` (Vitrine) dans `POST` et `PUT /api/spaces`, seulement dans le module `courses` ; `GET /api/spaces/modules` le liste parmi les options de Cours.

Nouveau avec l’édition dans le tableau de bord :

- `GET /api/courses/{id}/enrollments` : la liste de l’onglet **Élèves**, paginée (`page`, `limit`), de l’inscription la plus récente à la plus ancienne. Propriétaire, administrateur, modérateur et finances (lecture) ; un membre reçoit `403`. Une inscription annulée ne compte pas, et `totalCount` est le `stats.enrollments` du cours.
- `PUT /api/courses/{courseId}/modules/order` et `PUT /api/courses/module/{moduleId}/lessons/order` : enregistrent l’ordre de tous les modules (ou de toutes les leçons d’un module) d’un coup. La liste doit être exactement ce qui existe ; sinon `400` et rien ne change.
- `moduleConfig.mode` de l’espace Cours : `"multi"` (liste, par défaut) ou `"single"` (Un seul cours). Toute autre valeur, `400`. Dans `POST /api/spaces`, `course` (`title`, `level`, `description`) crée l’espace et le cours ensemble, en mode `single`.
- Erreurs de mode : un deuxième cours dans un espace `single` et un passage en `single` avec 2 cours ou plus renvoient `409`, avec le message sur le champ (`spaceId` et `moduleConfig.mode`). Un slug répété, un titre vide et un niveau invalide renvoient `400` sur le champ. Le cours commence toujours en brouillon.
- Le `stats.enrollments` du `GET` du cours ne revient que pour l’équipe (propriétaire, administrateur, modérateur et finances) ; pour le membre, `stats` revient vide.
- Dans chaque module et chaque leçon du `GET` du cours, `studentsWithProgress` (propriétaire et administrateur seulement) compte les élèves qui y ont de la progression.

Deux règles pour qui consomme l’API : le `GET` du cours omet `body` et `contentUrl` des leçons pour qui n’est ni propriétaire ni administrateur et n’est pas inscrit, et s’inscrire à nouveau renvoie `200` avec l’inscription qui existe déjà.

Certificat de fin de cours :

- `POST` et `PUT /api/courses` (et `course` dans `POST /api/spaces`) acceptent le bloc `certificate` : `enabled`, `templateId` et `text`. Propriétaire et administrateur seulement. Qui active le certificat n’envoie pas la date : le serveur l’enregistre quand l’interrupteur passe de désactivé à activé, et seules les personnes qui terminent après y ont droit.
- `templateId` est un modèle **actif** de la même communauté ; sans lui, le modèle par défaut de la plateforme s’applique. `text` est du texte simple, sans HTML, jusqu’à 5 000 caractères.
- `GET /api/courses/{id}` renvoie `certificate` (le réglage, avec la charge horaire calculée) au propriétaire et à l’administrateur, et `userCertificate` (`PENDING` ou `ISSUED`, avec `id`, `code` et `verificationUrl`) à l’élève qui a terminé. Un certificat en échec ou révoqué n’y apparaît pas.
- `GET /api/certificates/templates` fonctionne **sans `spaceId`** pour le propriétaire et l’administrateur : il liste les modèles actifs de tous les espaces Certificats, le modèle par défaut de la plateforme d’abord, et accepte `q` pour chercher par nom.
- Nouvelles erreurs : `certificate.templateId` (`404` pour un modèle d’une autre communauté, `400` pour un modèle archivé ou supprimé) et `certificate.text` (`400` pour un texte avec HTML ou au-delà de la limite).

## Voir aussi

- [Ordre de création](/api/ordem-de-criacao)
- [Outils · Cours](/mcp/ferramentas-cursos)
- [Créer et organiser les espaces](/espacos/criar-e-organizar-espacos)
- [Certificats](/espacos/certificados)
- [Produits](/monetizacao/produtos)
- [Modules](/conceitos/modulos)
