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

# Lives

> A transmissão marcada que o club faz para quem tem acesso — na sala nossa ou fora dela.

Uma live é uma transmissão com hora marcada. Ela pode acontecer na **sala nossa** — com palco,
chat e gravação — ou fora dela, no YouTube, no Vimeo ou num link de reunião (Zoom, Meet).

## Quem assiste

A live mora num **canal**, e o canal é o **entregável**: o `id` dele é o que se põe numa entrega.
Quem assiste é quem tem uma matrícula ativa numa entrega que abre o canal. Reembolso, prazo de
acesso, bônus de turma e entrega aberta valem sem configuração a mais. A live marcada amanhã já
nasce com a audiência certa.

Um workshop vendido à parte é um canal de uma live só.

A visibilidade do canal decide o que quem **não** tem acesso vê:

| `visibility`        | quem não tem acesso                                                                    |
| ------------------- | -------------------------------------------------------------------------------------- |
| `entitled` (padrão) | não vê a live                                                                          |
| `members`           | vê a live trancada (`has_access: false`), com título e horário — sem sala e sem replay |

## Onde acontece

| `provider` | como o aluno assiste                     | chat e gravação |
| ---------- | ---------------------------------------- | --------------- |
| `livekit`  | na sala nossa, pela credencial de `join` | sim             |
| `youtube`  | o player do YouTube, embutido            | não             |
| `vimeo`    | o player do Vimeo, embutido              | não             |
| `link`     | abre a sala de fora numa aba             | não             |

O endereço da transmissão **nunca** vem numa listagem nem na leitura da live: ele sai de
[`join`](/api-reference/lives/classroom-join), depois de conferido o acesso e dentro da janela.
Peça de novo a cada entrada.

## O estado

O `status` é **derivado**. Ninguém o grava, e não há um cron que o troque:

| `status`    | na sala nossa                                                | fora dela            |
| ----------- | ------------------------------------------------------------ | -------------------- |
| `scheduled` | o horário não chegou                                         | o horário não chegou |
| `waiting`   | o horário chegou e quem apresenta não começou                | —                    |
| `live`      | quem apresenta começou e não encerrou                        | dentro do horário    |
| `ended`     | encerrada, ou a folga de duas horas depois do horário passou | o horário passou     |
| `cancelled` | cancelada                                                    | cancelada            |

Na sala nossa, "ao vivo" é quem apresenta ter começado
([`start`](/api-reference/lives/start)), não o relógio ter passado. A live que acaba cedo acaba
quando alguém encerra ([`end`](/api-reference/lives/end)). A que ninguém encerra fecha sozinha
quando a sala fica vazia por dez minutos.

## A sala nossa

Quem administra o club — e quem foi posto em [`hosts`](/api-reference/lives/hosts) — **apresenta**.
Duas horas antes do horário, quem apresenta já entra no **bastidor**
([`join`](/api-reference/lives/join)) para testar câmera e microfone. A plateia só entra depois de
`start`; antes disso, o `join` do aluno responde `409 live_not_started`, e a tela espera.

Na sala, o que cada pessoa pode fazer é decidido pela API e carregado no token:

| `role`     | publica câmera, microfone e tela | manda na sala |
| ---------- | -------------------------------- | ------------- |
| `host`     | sim                              | sim           |
| `speaker`  | sim                              | não           |
| `audience` | não                              | não           |

**O palco.** O aluno pede a palavra levantando a mão
([`hand`](/api-reference/lives/classroom-hand)), que vira o atributo `hand` dele na sala. Quem
apresenta chama ao palco ([`speakers`](/api-reference/lives/speakers-add)), e a mudança vale na
hora. O palco é registrado, então quem cai e volta continua nele.

**O chat.** A mensagem é gravada pela API e entregue a todos na sala, no tópico `chat`:

```json theme={null}
{ "type": "message", "message": { "id": "…", "body": "Boa noite!", "author_name": "Ana", "author_role": "student", "author_identity": "s:…", "hidden": false, "created_at": "…" } }
{ "type": "hidden", "id": "…" }
{ "type": "shown", "message": { "…": "…" } }
```

Ninguém da plateia publica dado na sala — é o que impede uma mensagem com o nome de outra pessoa.
Quem chega no meio lê as 200 mais recentes em
[`GET .../messages`](/api-reference/lives/classroom-messages-list). A equipe oculta mensagens.
O aluno **silenciado** no club assiste e não escreve (`403 comments_muted`), no chat e nos
comentários. Quem escreveu continua vendo a própria mensagem oculta.

<Note>
  O id da mensagem é gerado por quem envia. Repetir o envio depois de uma queda de rede responde
  `409 message_exists`, sem mensagem dobrada.
</Note>

## A gravação

Com `record`, começar a transmissão começa a gravar. Durante a live, a gravação liga e desliga em
[`recording`](/api-reference/lives/recording), e cada trecho vira um arquivo. O arquivo passa por
estes estados:

| `status`    | significa                                                  |
| ----------- | ---------------------------------------------------------- |
| `recording` | a sala está sendo gravada                                  |
| `uploaded`  | o arquivo chegou e está na fila para virar vídeo           |
| `imported`  | virou mídia da biblioteca — o estado do vídeo é o da mídia |
| `failed`    | o motivo está em `error`                                   |

A primeira gravação pronta vira o **replay**, que o aluno com acesso assiste depois da live, no
mesmo player das aulas. Quem administra troca o replay por qualquer vídeo da biblioteca
(`replay_media_id`) — por exemplo, o vídeo de uma live que aconteceu no YouTube. Como material de
aula, o replay não vira público.

## Os avisos

Quem tem acesso ao canal recebe dois e-mails:

* o **lembrete**, uma hora antes (ou na hora em que a live é publicada, se falta menos que isso);
* o de que a live **começou** — na sala nossa, quando quem apresenta começa; fora dela, no horário.

A lista é congelada na hora do aviso: quem compra antes dela recebe. Antes de sair, cada e-mail
confere a live como ela está naquele momento. O lembrete de uma live remarcada, cancelada ou que já
começou não sai, e remarcar arma um lembrete novo para a hora nova. O club desliga os dois em
[`notify_live_reminders`](/api-reference/clubs/settings-update). Os e-mails respeitam o descadastro
de cada pessoa.

## Quem assistiu

[`attendance`](/api-reference/lives/attendance) mostra, por aluno, a primeira entrada, quantas vezes
entrou e quanto tempo ficou. Na sala nossa, quem conta é a própria sala. Fora dela, a única coisa
que se sabe é o clique em "entrar", e o tempo fica em 0.

## O encontro de mentoria

A sessão de mentoria também acontece na sala nossa. Onde o encontro acontece (`meeting`) é escolha
da sessão, com o padrão no perfil de quem conduz:

| `meeting` | como se entra                                                                                                |
| --------- | ------------------------------------------------------------------------------------------------------------ |
| `room`    | [`join`](/api-reference/mentorships/classroom-session-join), na janela de `room_opens_at` a `room_closes_at` |
| `link`    | o endereço de fora em `meeting_url`                                                                          |

No encontro não há palco nem plateia: todo mundo fala. Com `record`, a primeira entrada de quem
conduz começa a gravação, que vira um arquivo da sessão, visível para quem participou. O aluno vê
`recorded` antes de entrar.


## Related topics

- [Uma live](/api-reference/lives/get.md)
- [Encerrar a live](/api-reference/lives/end.md)
- [Editar live](/api-reference/lives/update.md)
- [Marcar live](/api-reference/lives/create.md)
- [Agenda de lives](/api-reference/lives/list.md)
