Detalha um curso (por slug ou id)
GET/api/courses/{identifier}
- Auth
- Public
- Qui peut l’appeler:
- owner
- admin
- SuperAdmin
- Clé d’API:
- courses:read
- X-CommunityId
X-CommunityIdEnvoyez le X-CommunityId de la communauté où l’opération a lieu.
Autenticação opcional. O acesso é o do **espaço** do curso: sem acesso ao espaço, 403 sem título nem conteúdo; curso de outra comunidade (`X-CommunityId` trocado), 404. O `requiredPlanTier` do curso **não é mais conferido** (fica no banco e na resposta). Rascunho e arquivado só para a equipe (owner, admin, moderador, financeiro, SuperAdmin).
**Badge ao concluir:** `data.completionBadge` `{ id, name, imageUrl, visibility }` é o badge que quem conclui ganha, ou `null`. Badge privado só aparece para owner e admin (para os demais, `null`).
**Conteúdo só para quem pode ler** (mudança de contrato, 2026-10-10): `body` e `contentUrl` das aulas só voltam para owner, admin e SuperAdmin, ou para quem está matriculado (`enrolled` ou `completed`). Moderador sem matrícula, membro sem matrícula, matrícula `cancelled` e visitante recebem o sumário (título, tipo, duração, `hasContent`), com as chaves `body` e `contentUrl` ausentes. `canViewContent` diz qual é o caso.
**Número de alunos só para a equipe** (mudança de contrato, 2026-10-11): `stats.enrollments` só vem para owner, admin, moderador, financeiro e SuperAdmin (para o membro, `stats` vem vazio). Conta as matrículas `enrolled` e `completed` de perfis que ainda existem (`cancelled` fica de fora), o mesmo total da lista `GET /api/courses/{id}/enrollments`.
**Contagem para o aviso de exclusão:** para owner, admin e SuperAdmin cada módulo e cada aula trazem `studentsWithProgress`, quantos alunos concluíram ou avançaram (progresso acima de zero) ali; o módulo conta cada aluno uma vez. O app usa o número para avisar antes de excluir.
Rascunho ou arquivado para quem não é da equipe: 403 com `errors[]`.
**Equipe lê sem se matricular:** moderador e financeiro também recebem `body` e `contentUrl` (e `canViewContent: true`) sem matrícula, em pré-visualização: nada é gravado e eles nunca veem aula travada. Editar, criar e excluir seguem só de owner e admin. O financeiro ainda precisa de acesso ao espaço do curso.
**Sequência e liberação por módulo:** com `requireSequential`, cada aula abre quando a anterior está concluída; um módulo com `availableAt` (data fixa) ou `availableAfterDays` (N dias, contados da **primeira** matrícula; abre às 00:00 no fuso da comunidade) fica fechado até lá. Por aula: `locked`, `lockReason` (`sequence` ou `date`), `unlocksAt`, `pendingLesson`; por módulo: `locked`, `lockReason`, `unlocksAt`. Aula travada vem **sem** `body`/`contentUrl`; aula já concluída nunca trava. A conta é feita na hora do pedido, sem job.
Campos novos (opcionais): `lastLessonId` (para o "Continuar": a última aula acessada, se não concluída; senão a primeira não concluída; senão a primeira; `null` sem login ou sem aulas), `canViewContent`, e por aula `hasContent` e `userProgress` (o registro do próprio usuário). `userProgress` do curso vem preenchido para quem tem matrícula ou algum progresso.
Paramètres
| Nom | Emplacement | Type | Description |
|---|---|---|---|
identifierobligatoire | path | string | Slug (resolvido dentro da comunidade do `X-CommunityId`) ou id do curso. |
En-têtes
| Nom | Type | Description |
|---|---|---|
X-CommunityIdfacultatif | string (uuid) | ID da comunidade em que a operação acontece. Obrigatório na maioria dos endpoints com escopo de comunidade. |
Réponses
| Statut | Description |
|---|---|
200 | O curso com módulos e aulas. |
400 | Requisição inválida — falha de validação. |
403 | Autenticado, mas sem permissão para esta operação. |
404 | Recurso não encontrado. |
500 | Erro interno do servidor. |
Exemple curl
curl -X GET "https://api.memberfy.net/api/courses/<identifier>" \
-H "X-CommunityId: $COMMUNITY_ID"