Aller au contenu

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-CommunityId Envoyez le X-CommunityId de la communauté où l’opération a lieu.
Les descriptions des endpoints viennent directement de la spécification de l’API et sont en portugais pour l’instant. L’interface autour est traduite.

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

NomEmplacementTypeDescription
identifierobligatoirepathstringSlug (resolvido dentro da comunidade do `X-CommunityId`) ou id do curso.

En-têtes

NomTypeDescription
X-CommunityIdfacultatifstring (uuid)ID da comunidade em que a operação acontece. Obrigatório na maioria dos endpoints com escopo de comunidade.

Réponses

StatutDescription
200O curso com módulos e aulas.
400Requisição inválida — falha de validação.
403Autenticado, mas sem permissão para esta operação.
404Recurso não encontrado.
500Erro interno do servidor.

Exemple curl

curl -X GET "https://api.memberfy.net/api/courses/<identifier>" \
  -H "X-CommunityId: $COMMUNITY_ID"