> ## 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.

# Painel

> Os números da tela inicial do admin: ritmo, conclusão, primeira resposta, pendências, agenda, semana e onde os alunos param.



## OpenAPI

````yaml GET /v1/clubs/{clubId}/overview
openapi: 3.0.3
info:
  title: weve API
  description: >
    Contrato entre a API Go e o dashboard. **Este arquivo é a fonte de
    verdade**:

    os tipos e a interface de servidor em Go, e o client TypeScript, são todos

    gerados daqui (`make openapi`). Handler que divergir da interface não
    compila.


    A superfície interna (`/internal/*`) fica de fora de propósito: é acesso de

    máquina, protegido por segredo dedicado, e não é contrato de cliente.
  version: 0.2.0
servers:
  - url: https://api.weve.cx
    description: produção
  - url: http://localhost:8080
    description: desenvolvimento
security: []
tags:
  - name: health
  - name: session
  - name: account
  - name: clubs
  - name: members
  - name: webhooks
  - name: outgoing-webhooks
  - name: sales-platforms
  - name: catalog
  - name: content
  - name: classroom
  - name: community
  - name: mentorships
  - name: agents
  - name: lives
  - name: students
  - name: auth
  - name: campaigns
  - name: workflows
  - name: email
  - name: exports
paths:
  /v1/clubs/{clubId}/overview:
    parameters:
      - $ref: '#/components/parameters/OrgId'
    get:
      tags:
        - clubs
      summary: O Painel do club
      description: |
        Os números da tela inicial do admin, numa leitura só: o ritmo dos
        alunos, a conclusão média e a primeira resposta no período, o nível do
        studio, o que resolver hoje, a agenda dos próximos 7 dias, a semana
        corrente, as aulas assistidas nos últimos 7 dias e onde os alunos param.

        `period` recorta só o ritmo, a conclusão e a primeira resposta — o resto
        tem janela própria. Os dias são os de São Paulo (o club ainda não tem
        fuso): a semana começa na segunda. Os períodos com anterior (`week`,
        `last_30_days`, `month`) trazem o número dele para comparar; `all`, não.

        "Aluno ativo" é quem tem matrícula não revogada e não vencida. "Estudou"
        é ter tocado numa aula no dia — o registro diário começou com esta
        rota; antes dele, só o começo, a conclusão e o último toque de cada
        progresso são conhecidos. Exige administrar o club.
      operationId: getClubOverview
      parameters:
        - name: period
          in: query
          required: false
          schema:
            $ref: '#/components/schemas/OverviewPeriod'
      responses:
        '200':
          description: O Painel
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClubOverviewResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '500':
          $ref: '#/components/responses/InternalError'
      security:
        - userSession: []
components:
  parameters:
    OrgId:
      name: clubId
      in: path
      required: true
      description: >
        Id público da organização — o mesmo que `GET /v1/me` devolve em

        `organization_id`.


        Na URL o recurso se chama **club**; no contrato e no domínio,
        organization.

        A divergência é deliberada: `clubs` é a palavra do produto, e a URL é o
        que

        as pessoas leem.


        É o identificador do provedor de autenticação, e é assim de propósito:

        o cliente precisa nomear a organização ao pedir o token, e o token é o

        que prova o escopo. Um id só nosso obrigaria a traduzir um no outro

        antes de ter um token — e a tradução exigiria uma chamada escopada, que

        é justamente a que ainda não dá para fazer.


        O uuid interno da organização não aparece no contrato: ele é o que as

        chaves estrangeiras do domínio referenciam, e continua sendo nosso.
      schema:
        type: string
        format: uuid
  schemas:
    OverviewPeriod:
      description: |
        O recorte do Painel: a semana corrente (segunda a domingo), os últimos
        30 dias (hoje incluído), o mês corrente ou desde a criação do club.
      type: string
      enum:
        - week
        - last_30_days
        - month
        - all
      default: week
      x-enum-varnames:
        - OverviewPeriodWeek
        - OverviewPeriodLast30Days
        - OverviewPeriodMonth
        - OverviewPeriodAll
    ClubOverviewResponse:
      type: object
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/ClubOverview'
    ClubOverview:
      type: object
      required:
        - period
        - from
        - to
        - members
        - pace
        - completion
        - response
        - todo
        - upcoming
        - week
        - daily_views
        - stuck
      properties:
        period:
          $ref: '#/components/schemas/OverviewPeriod'
        from:
          description: O primeiro dia do período.
          type: string
          format: date
        to:
          description: O último dia do período (incluído).
          type: string
          format: date
        members:
          description: Alunos ativos — a régua dos níveis do studio.
          type: integer
        pace:
          $ref: '#/components/schemas/OverviewPace'
        completion:
          $ref: '#/components/schemas/OverviewCompletion'
        response:
          $ref: '#/components/schemas/OverviewResponse'
        todo:
          description: O que pede ação hoje; só entra o que tem algo pendente.
          type: array
          items:
            $ref: '#/components/schemas/OverviewTodo'
        upcoming:
          description: Os próximos 7 dias, na ordem, até cinco.
          type: array
          items:
            $ref: '#/components/schemas/OverviewEvent'
        week:
          $ref: '#/components/schemas/OverviewWeek'
        daily_views:
          description: Os últimos 7 dias, hoje por último.
          type: array
          items:
            $ref: '#/components/schemas/OverviewDay'
        stuck:
          $ref: '#/components/schemas/OverviewStuck'
    ErrorEnvelope:
      type: object
      description: >-
        Envelope único de erro da API. O `code` é o contrato com o cliente — a
        `message` é diagnóstico, e pode mudar.
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
          properties:
            code:
              type: string
            message:
              type: string
    OverviewPace:
      description: |
        Os alunos ativos que estudaram no período (`on_pace`), de `active`.
        `stopped` estudou no período anterior e não neste. `series` são sete
        pontos acumulados do período, em alunos, o último igual a `on_pace`.
      type: object
      required:
        - active
        - on_pace
        - stopped
        - series
      properties:
        active:
          type: integer
        on_pace:
          type: integer
        previous_on_pace:
          type: integer
          nullable: true
        stopped:
          type: integer
        series:
          type: array
          items:
            type: integer
    OverviewCompletion:
      description: |
        A média, entre os pares (aluno ativo, curso publicado que ele tem), da
        fração das aulas publicadas concluídas — de 0 a 1. `series`: sete pontos
        do período. `courses` são os cursos com aluno; `cohorts`, as turmas em
        andamento com aluno.
      type: object
      required:
        - rate
        - series
        - courses
        - cohorts
      properties:
        rate:
          type: number
          format: double
        previous_rate:
          type: number
          format: double
          nullable: true
        series:
          type: array
          items:
            type: number
            format: double
        courses:
          type: integer
        cohorts:
          type: integer
    OverviewResponse:
      description: |
        A média do tempo até a primeira resposta da equipe, em segundos, nas
        conversas que alunos abriram no período e que já foram respondidas.
        Nulo quando nenhuma foi. `series`: sete faixas do período, nulo na faixa
        sem resposta.
      type: object
      required:
        - goal_seconds
        - series
      properties:
        average_seconds:
          type: integer
          nullable: true
        previous_average_seconds:
          type: integer
          nullable: true
        goal_seconds:
          type: integer
        series:
          type: array
          items:
            type: integer
            nullable: true
    OverviewTodo:
      type: object
      required:
        - kind
        - count
      properties:
        kind:
          $ref: '#/components/schemas/OverviewTodoKind'
        count:
          type: integer
        since:
          description: >-
            Desde quando o mais antigo espera (`unanswered`, `moderation`,
            `overdue_draft`).
          type: string
          format: date-time
        in_community:
          description: Quantos dos retidos são da comunidade (`moderation`).
          type: integer
        names:
          description: Até dois alunos (`tasks_due`).
          type: array
          items:
            type: string
        lesson_title:
          description: A primeira aula atrasada (`overdue_draft`).
          type: string
        course_id:
          type: string
          format: uuid
        course_title:
          type: string
    OverviewEvent:
      description: |
        Um compromisso da agenda. `id` é da live, da sessão ou da aula;
        `course_id` leva à aula que vai ao ar.
      type: object
      required:
        - kind
        - id
        - starts_at
        - title
      properties:
        kind:
          $ref: '#/components/schemas/OverviewEventKind'
        id:
          type: string
          format: uuid
        starts_at:
          type: string
          format: date-time
        title:
          description: >-
            O título da live, da sessão em grupo ou da aula; na individual, o
            nome do aluno.
          type: string
        format:
          $ref: '#/components/schemas/MentorshipSessionFormat'
        channel_name:
          type: string
        mentorship_id:
          type: string
          format: uuid
        mentorship_name:
          type: string
        course_id:
          type: string
          format: uuid
        course_title:
          type: string
    OverviewWeek:
      description: |
        A semana corrente, que fecha no domingo, contra três metas: publicar uma
        aula; responder toda pergunta de aluno dentro de `goal_seconds` da
        resposta; trazer de volta ao menos metade dos alunos que estavam
        parados (sem estudar havia 7 dias) no começo dela. `history` diz se as
        quatro semanas anteriores fecharam as três, da mais antiga à última.
      type: object
      required:
        - from
        - to
        - published
        - questions
        - answered_in_time
        - stalled
        - returned
        - history
      properties:
        from:
          type: string
          format: date
        to:
          type: string
          format: date
        published:
          type: integer
        questions:
          type: integer
        answered_in_time:
          type: integer
        stalled:
          type: integer
        returned:
          type: integer
        history:
          type: array
          items:
            type: boolean
    OverviewDay:
      type: object
      required:
        - day
        - views
      properties:
        day:
          type: string
          format: date
        views:
          description: Pares (aluno, aula) com estudo no dia.
          type: integer
    OverviewStuck:
      description: |
        Os cursos com mais alunos parados — com acesso, sem terminar e sem
        estudar o curso nos últimos 7 dias —, até três, cada um com a aula em
        que mais gente parou. `courses` são os cursos com aluno.
      type: object
      required:
        - courses
        - items
      properties:
        courses:
          type: integer
        items:
          type: array
          items:
            $ref: '#/components/schemas/OverviewStuckCourse'
    OverviewTodoKind:
      description: |
        `unanswered`: conversas com fala de aluno não lida. `moderation`:
        comentários retidos. `overdue_draft`: aula em rascunho cuja data de
        liberação já passou. `tasks_due`: tarefas de mentoria que vencem hoje.
      type: string
      enum:
        - unanswered
        - moderation
        - overdue_draft
        - tasks_due
      x-enum-varnames:
        - OverviewTodoUnanswered
        - OverviewTodoModeration
        - OverviewTodoOverdueDraft
        - OverviewTodoTasksDue
    OverviewEventKind:
      type: string
      enum:
        - live
        - mentorship_session
        - lesson_release
      x-enum-varnames:
        - OverviewEventLive
        - OverviewEventMentorshipSession
        - OverviewEventLessonRelease
    MentorshipSessionFormat:
      type: string
      enum:
        - individual
        - group
      x-enum-varnames:
        - SessionFormatIndividual
        - SessionFormatGroup
    OverviewStuckCourse:
      type: object
      required:
        - course_id
        - course_title
        - lesson_id
        - lesson_title
        - lesson_number
        - students
      properties:
        course_id:
          type: string
          format: uuid
        course_title:
          type: string
        lesson_id:
          type: string
          format: uuid
        lesson_title:
          type: string
        lesson_number:
          description: A posição da aula no curso, contando de 1.
          type: integer
        students:
          type: integer
  responses:
    Unauthorized:
      description: Sessão ausente, expirada ou revogada
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    Forbidden:
      description: >
        A sessão é válida, mas não age nesta organização. É a mesma resposta
        para

        uma organização que não existe — distinguir as duas deixaria enumerar

        organizações alheias.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    UnprocessableEntity:
      description: Campos obrigatórios ausentes ou inválidos
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    InternalError:
      description: >-
        Falha inesperada. O corpo nunca traz o erro real — ele fica no log e no
        rastreamento.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
  securitySchemes:
    userSession:
      type: http
      scheme: bearer
      description: |
        Token OPACO de sessão de quem administra, emitido por
        `/v1/auth/admin/sign-in` e verificado contra a nossa tabela — o mesmo
        desenho do `studentSession`, para a outra identidade.

        É o esquema de quem ADMINISTRA — o dashboard. O aluno do classroom usa o
        `studentSession`; uma rota consumida pelos dois declara os dois
        esquemas, e o middleware aceita qualquer um deles. As duas credenciais
        são opacas e chegam pelo mesmo cabeçalho: quem as separa é a tabela em
        que cada uma existe.

        O dashboard o guarda em cookie httpOnly, que o BFF troca pelo
        `Authorization` a cada chamada.

````

## Related topics

- [Ligar plataforma](/api-reference/webhooks/connections-create.md)
- [Receber evento de plataforma](/api-reference/webhooks/receive.md)
- [Pastas da biblioteca](/api-reference/media/folders-list.md)
- [Webhooks de saída](/essentials/webhooks.md)
- [Campanhas e automações](/essentials/campaigns-and-workflows.md)
