> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ephra.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Área de membros

> Crie cursos, organize aulas, envie imagens e gerencie acesso manual pelo token da empresa ou pelo MCP.

* [Autenticação e descoberta](#autenticação-e-descoberta)
* [Criar e publicar](#criar-e-publicar)
* [Conteúdo e moderação](#conteúdo-e-moderação)
* [Imagens](#imagens)
* [Matrículas](#matrículas)

## Autenticação e descoberta

Estas operações correspondem à área do produtor no app v2, não à descoberta de telas do app legado. Elas pertencem ao domínio `catalog` e ao toolset MCP `catalog`.

Troque a chave e o segredo da empresa por um token em `POST /auth`, usando Basic Authentication. Todas as chamadas abaixo usam `Authorization: Bearer TOKEN`. Tokens de vendedor do app e de aluno não dão acesso. A empresa vem exclusivamente do token. Não envie `companyId` ou `company_id` no corpo ou na query.

`GET /v1/member-courses?page=1&pageSize=10` lista cursos em rascunho e publicados. O filtro opcional `productId` restringe o produto. A resposta é `{success:true,data:[],pagination:{page,pageSize,total,totalPages}}`, com o total do conjunto filtrado. As demais operações retornam `{success:true,data:...}`. Erros usam `{success:false,message:...}`. Recurso inexistente, de outra empresa ou de outro curso/aula responde 404.

No MCP, comece com `ephra_member_courses_list`. Depois use `ephra_member_courses_get` para obter a árvore e os IDs de módulos, aulas, materiais e comentários. Nunca reutilize um ID de outra árvore.

> [!NOTE]
>
> Use um produto com entrega `ephraMembers`. O curso começa em rascunho e só publica depois de receber conteúdo válido.

## Criar e publicar

![Editor do curso com módulos e aulas](https://mintcdn.com/ephraio-2770e271/j9pHfIg8y1UXAJx2/images/guias/area-de-membros.png?fit=max\&auto=format\&n=j9pHfIg8y1UXAJx2\&q=85\&s=ee87ceec004e58f1dcf729ebc23fd383)

Editor do curso na área de membros

O produto deve ser da empresa autenticada, não excluído e ter `deliveryType: "ephraMembers"`. Descubra seu `productId` com `GET /v1/products` ou `ephra_products_list`.

```http theme={"system"}
POST /v1/member-courses
Content-Type: application/json
Authorization: Bearer TOKEN

{"productId":"PRODUCT_ID","slug":"ia-pratica","title":"IA prática","instructorName":"Ana","status":"draft"}
```

1. Guarde o `courseId` de `data.id`.
2. `POST /v1/member-courses/COURSE_ID/modules` com `{"title":"Introdução"}`. Guarde o módulo retornado na árvore.
3. `POST /v1/member-courses/COURSE_ID/modules/MODULE_ID/lessons` com `{"slug":"boas-vindas","title":"Boas-vindas","kind":"video","youtubeVideoId":"dQw4w9WgXcQ"}`.
4. `PATCH /v1/member-courses/COURSE_ID` com `{"status":"published"}`.

Vídeos aceitam apenas ID ou URL do YouTube. Configure-os como não listados. A API valida o endereço, mas não verifica a privacidade no YouTube. Uma aula de leitura usa `kind: "reading"` e `body: ["Primeiro parágrafo"]`, sem vídeo. Publicação exige pelo menos um módulo e uma aula, e cada aula deve ter conteúdo válido. Alterações de um curso publicado também preservam essa regra.

`PATCH /v1/member-courses/COURSE_ID` altera os campos enviados. `DELETE` no mesmo caminho exclui permanentemente o curso, módulos, aulas, materiais, comentários, notas, progresso e certificados. Não revoga as matrículas do produto. Confirme a exclusão antes de chamar.

## Conteúdo e moderação

Cada criação ou alteração de conteúdo devolve a árvore completa atualizada. Consulte o OpenAPI para os campos de cada corpo.

| Recurso | Criar | Editar/excluir | Ordem completa |
| - | - | - | - |
| Módulos | `POST /v1/member-courses/{courseId}/modules` | `PATCH/DELETE /v1/member-courses/{courseId}/modules/{moduleId}` | `PUT /v1/member-courses/{courseId}/modules/order` |
| Aulas | `POST /v1/member-courses/{courseId}/modules/{moduleId}/lessons` | `PATCH/DELETE /v1/member-courses/{courseId}/lessons/{lessonId}` | `PUT /v1/member-courses/{courseId}/modules/{moduleId}/lessons/order` |
| Materiais | `POST /v1/member-courses/{courseId}/lessons/{lessonId}/materials` | `PATCH/DELETE /v1/member-courses/{courseId}/lessons/{lessonId}/materials/{materialId}` | `PUT /v1/member-courses/{courseId}/lessons/{lessonId}/materials/order` |

Materiais são links HTTP/HTTPS, classificados como `link`, `pdf` ou `sheet`. Esta operação não faz upload de arquivos. Exemplo de criação: `{"title":"Referência","kind":"link","url":"https://example.com/referencia"}`.

Reordenação exige `{"ids":["ID_1","ID_2"]}` com todos os IDs do conjunto exatamente uma vez. O array substitui a ordem completa. Um módulo excluído leva suas aulas e dependentes; uma aula excluída leva materiais, comentários, notas e progresso. Exclusões são permanentes.

Comentários vivem em `/v1/member-courses/{courseId}/lessons/{lessonId}/comments`. `GET` lista com `page/pageSize`; `POST` cria um comentário da equipe com `{"body":"Bem-vindos!"}`. `PATCH /{commentId}` edita somente comentários da equipe. `DELETE /{commentId}` modera comentários de alunos ou da equipe. Nenhuma operação publica como aluno.

## Imagens

Um curso tem uma capa opcional. Uma aula tem uma imagem opcional. Não há galeria nem imagem embutida em texto.

* Capa: `/v1/member-courses/{courseId}/cover`.
* Imagem da aula: `/v1/member-courses/{courseId}/lessons/{lessonId}/image`.

Para qualquer um desses caminhos:

1. `POST CAMINHO/upload` com `{"contentType":"image/webp"}`. A resposta contém `uploadUrl`, `key` e `expiresIn: 900`.
2. Faça `PUT` dos bytes em `uploadUrl`, com o mesmo `Content-Type`. A ferramenta MCP só devolve a URL; seu cliente precisa enviar os bytes fora do MCP.
3. `POST CAMINHO/finalize` com a `key` retornada e `alt` opcional. Exemplo: `{"key":"KEY_RETORNADA","alt":"Diagrama do fluxo"}`. A API valida o arquivo antes de substituir a imagem anterior.
4. Para remover, `DELETE CAMINHO`. Repetir a remoção é seguro.

A capa é pública. Não envie informação confidencial nela. A imagem da aula é privada e sua URL de leitura expira em 300 segundos. Alunos sem matrícula ou com a aula ainda bloqueada não recebem a imagem. Recarregue o curso para renovar uma URL expirada. O retorno é `{url,alt,expiresAt}` ou `null`.

Para mudar somente o texto alternativo, use `PATCH` do curso com `coverAlt` ou da aula com `imageAlt`. O limite é 500 caracteres; `null` remove o texto.

## Matrículas

Matrículas são do produto, não de um curso individual. Os caminhos são:

* `GET /v1/products/{productId}/member-enrollments?page=1&pageSize=10`.
* `POST /v1/products/{productId}/member-enrollments` com `{"email":"aluno@example.com","name":"Ana"}`.
* `DELETE /v1/products/{productId}/member-enrollments/{enrollmentId}`.

A listagem contém origens ativas separadas, `manual`, `purchase` e `subscription`. Um aluno pode ter várias origens para o mesmo produto. A concessão manual reutiliza a mesma matrícula e envia e-mail de acesso. A revogação permite somente matrícula manual do produto indicado e não remove acesso de compra ou assinatura. Repetir a revogação é seguro.

O MCP usa `ephra_products_member_enrollments_list`, `ephra_products_member_enrollments_grant` e `ephra_products_member_enrollments_revoke`. Não confunda matrícula manual com estorno ou cancelamento de assinatura.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.