Pular para o conteúdo
OpENEMdocs

DocumentaçãoPara quem contribui

Referência da API

Todas as rotas da API do OpENEM, geradas do código: método, caminho, parâmetros, corpo e se a rota exige login.

A API tem 118 rotas. As de domínio ficam em /api/v1; a raiz e o /health ficam fora do prefixo. Esta página é gerada do próprio código do backend, a partir dos decorators do Swagger: rota nova aparece aqui no próximo build. Numa instância de desenvolvimento, o Swagger interativo fica em /api.

Para usar a API, crie uma conta em POST /api/v1/auth/register ou entre em POST /api/v1/auth/login, e mande o accessToken da resposta no cabeçalho Authorization: Bearer <token>. As rotas têm limite de requisições; os números estão em Produção.

answers

POST /api/v1/answers

Registra uma tentativa e retorna a correção comentada

Exige login (token no cabeçalho Authorization: Bearer).

Corpo (JSON): CreateAnswerDto

CampoTipoObrigatórioDescrição
questionIdstringsim
chosenIdstringnãoAlternativa escolhida (ausente = em branco)
timeSpentSecnumbernãoTempo gasto na questão, em segundos
simulationIdstringnãoVincula a tentativa a um simulado

Respostas: 201.

App

GET /

Sem login.

Respostas: 200.

auth

POST /api/v1/auth/register

Cria uma conta e retorna um token de acesso

Sem login.

Corpo (JSON): RegisterDto

CampoTipoObrigatórioDescrição
emailstringsim
passwordstringsim
displayNamestringnão
acceptTermsbooleansimAceite dos Termos de Uso e da Política de Privacidade (menores de 18 anos usam com ciência do responsável). Tem de ser true.

Respostas: 201.

POST /api/v1/auth/login

Autentica e retorna um token de acesso

Sem login.

Corpo (JSON): LoginDto

CampoTipoObrigatórioDescrição
emailstringsim
passwordstringsim

Respostas: 200.

GET /api/v1/auth/options

Formas de entrar ligadas neste servidor (recuperação de senha por e-mail, Google)

Sem login.

Respostas: 200.

POST /api/v1/auth/forgot-password

Manda um link de redefinição de senha, se o e-mail tiver conta (a resposta é sempre a mesma)

Sem login.

Corpo (JSON): ForgotPasswordDto

CampoTipoObrigatórioDescrição
emailstringsim

Respostas: 202, 503.

POST /api/v1/auth/reset-password

Cria a senha nova com o token do e-mail, encerra as outras sessões e retorna um token de acesso

Sem login.

Corpo (JSON): ResetPasswordDto

CampoTipoObrigatórioDescrição
tokenstringsimToken do link enviado por e-mail
passwordstringsim

Respostas: 200.

POST /api/v1/auth/logout-all

Sai de todos os dispositivos: nenhum token emitido até agora vale mais

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 204.

GET /api/v1/auth/google

Começa o login com Google (redireciona para o Google)

Sem login.

Respostas: 302, 404.

GET /api/v1/auth/google/callback

Volta do Google: redireciona ao app com um código de uso único (#code=) ou o motivo da recusa (#erro=)

Sem login.

ParâmetroOndeTipoObrigatórioDescrição
errorqueryobjetonãoEx.: access_denied
statequeryobjetonãoDeve bater com o cookie da ida
codequeryobjetonãoCódigo do Google

Respostas: 302.

POST /api/v1/auth/google/exchange

Troca o código de uso único da volta do Google por um token de acesso

Sem login.

Corpo (JSON): GoogleExchangeDto

CampoTipoObrigatórioDescrição
codestringsimCódigo de uso único da volta do Google

Respostas: 200.

community

GET /api/v1/community/threads

Lista os tópicos do fórum (mais recentes primeiro)

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

POST /api/v1/community/threads

Cria um tópico no fórum

Exige login (token no cabeçalho Authorization: Bearer).

Corpo (JSON): CreateThreadDto

CampoTipoObrigatórioDescrição
titlestring, até 140 caracteressim
bodystring, até 5000 caracteressim
questionIdstringnãoQuestão relacionada (opcional)

Respostas: 201.

GET /api/v1/community/threads/{id}

Detalha um tópico com a primeira página de respostas

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Respostas: 200.

DELETE /api/v1/community/threads/{id}

Apaga um tópico próprio, com as respostas (o de outro aluno é 404)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Respostas: 200.

GET /api/v1/community/threads/{id}/posts

Próxima página de respostas de um tópico (cursor)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim
cursorquerystringnãoValor de nextCursor da página anterior
limitquerynumber, de 1 a 50não

Respostas: 200.

POST /api/v1/community/threads/{id}/posts

Responde a um tópico

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Corpo (JSON): CreatePostDto

CampoTipoObrigatórioDescrição
bodystring, até 5000 caracteressim

Respostas: 201.

POST /api/v1/community/threads/{id}/posts/{postId}/like

Curtir/descurtir uma resposta do fórum (toggle)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim
postIdcaminhostringsim

Respostas: 201.

DELETE /api/v1/community/threads/{id}/posts/{postId}

Apaga uma resposta própria (a de outro aluno é 404)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim
postIdcaminhostringsim

Respostas: 200.

POST /api/v1/community/threads/{id}/report

Denuncia um tópico do fórum

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Corpo (JSON): ReportDto

CampoTipoObrigatórioDescrição
reasonstring, até 500 caracteressimMotivo da denúncia, lido por quem modera a instalação

Respostas: 201.

POST /api/v1/community/threads/{id}/posts/{postId}/report

Denuncia uma resposta do fórum

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim
postIdcaminhostringsim

Corpo (JSON): ReportDto

CampoTipoObrigatórioDescrição
reasonstring, até 500 caracteressimMotivo da denúncia, lido por quem modera a instalação

Respostas: 201.

essays

GET /api/v1/essays/prompts

Lista os temas de redação disponíveis

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

GET /api/v1/essays/prompts/{id}

Detalha um tema de redação

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Respostas: 200.

GET /api/v1/essays/submissions

Lista as redações enviadas pelo usuário

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

POST /api/v1/essays/submissions

Envia uma redação para um tema

Exige login (token no cabeçalho Authorization: Bearer).

Corpo (JSON): CreateSubmissionDto

CampoTipoObrigatórioDescrição
promptIdstringsimTema (EssayPrompt) escolhido
contentstring, até 8000 caracteressimTexto da redação

Respostas: 201.

GET /api/v1/essays/submissions/{id}

Detalha uma redação (com a avaliação, se houver)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Respostas: 200.

POST /api/v1/essays/submissions/{id}/evaluation

Corrige a redação por competência (rubrica manual)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Corpo (JSON): EvaluateEssayDto

CampoTipoObrigatórioDescrição
c10 \40 \80 \
c20 \40 \80 \
c30 \40 \80 \
c40 \40 \80 \
c50 \40 \80 \
feedbackstringnãoComentário geral do corretor

Respostas: 201.

favorites

GET /api/v1/favorites

Lista as questões favoritadas do usuário

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

POST /api/v1/favorites

Favorita uma questão

Exige login (token no cabeçalho Authorization: Bearer).

Corpo (JSON): CreateFavoriteDto

CampoTipoObrigatórioDescrição
questionIdstringsimQuestão a favoritar

Respostas: 201.

DELETE /api/v1/favorites/{questionId}

Remove uma questão dos favoritos

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
questionIdcaminhostringsim

Respostas: 200.

flashcards

POST /api/v1/flashcards/decks

Cria um deck de flashcards

Exige login (token no cabeçalho Authorization: Bearer).

Corpo (JSON): CreateDeckDto

CampoTipoObrigatórioDescrição
titlestringsimTítulo do deck
descriptionstringsimDescrição do deck
subjectstringsimMatéria/área do knowledge (ex: "Matemática e suas Tecnologias")
topicstringnãoTópico dentro da matéria (opcional)
subthemestringnãoSubtema dentro do tópico (opcional)
iconstringnãoNome do ícone do deck (chave semântica, não emoji)
isPublicbooleansimDeck público (visível para todos)

Respostas: 201.

GET /api/v1/flashcards/decks/mine

Decks do usuário logado

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

GET /api/v1/flashcards/decks/public

Decks públicos votados (opcionalmente por matéria)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
subjectquerystringsim

Respostas: 200.

GET /api/v1/flashcards/decks/progress

Progresso por deck para a árvore (novos, vistos, revistos)

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

GET /api/v1/flashcards/decks/{deckId}

Detalhe de um deck (com flashcards)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
deckIdcaminhostringsim

Respostas: 200.

PATCH /api/v1/flashcards/decks/{deckId}

Atualiza um deck (apenas o dono)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
deckIdcaminhostringsim

Corpo (JSON): UpdateDeckDto

CampoTipoObrigatórioDescrição
titlestringnãoTítulo do deck
descriptionstringnãoDescrição do deck
subjectstringnãoMatéria/área do knowledge
topicstringnãoTópico dentro da matéria
subthemestringnãoSubtema dentro do tópico
iconstringnãoÍcone do deck (emoji)
isPublicbooleannãoDeck público

Respostas: 200.

DELETE /api/v1/flashcards/decks/{deckId}

Remove um deck com seus cards (apenas o dono)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
deckIdcaminhostringsim

Respostas: 200.

POST /api/v1/flashcards/decks/{deckId}/vote

Vota (up/down) em um deck público: um voto por aluno

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
deckIdcaminhostringsim

Corpo (JSON): VoteDeckDto

CampoTipoObrigatórioDescrição
vote"up" \"down"sim

Respostas: 201.

POST /api/v1/flashcards/decks/{deckId}/flashcards

Adiciona um flashcard ao deck

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
deckIdcaminhostringsim

Corpo (JSON): CreateFlashcardDto

CampoTipoObrigatórioDescrição
frontstringsimFrente do card (Markdown: pergunta)
backstringsimVerso do card (Markdown: resposta)

Respostas: 201.

DELETE /api/v1/flashcards/flashcards/{flashcardId}

Remove um flashcard

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
flashcardIdcaminhostringsim

Respostas: 200.

GET /api/v1/flashcards/study/queue

Fila otimizada de estudo (SM-2 + Pareto): filtros por escopo

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
limitquerystringsim
subjectquerystringsim
topicquerystringsim
subthemequerystringsim
deckIdquerystringsim

Respostas: 200.

POST /api/v1/flashcards/flashcards/{flashcardId}/review

Registra uma revisão SM-2 (qualidade 0-5)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
flashcardIdcaminhostringsim

Corpo (JSON): ReviewFlashcardDto

CampoTipoObrigatórioDescrição
qualitynumber, de 0 a 5simQualidade da lembrança (0-5)

Respostas: 201.

GET /api/v1/flashcards/stats

Dashboard de revisão espaçada do usuário

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

GET /api/v1/flashcards/flashcards/{flashcardId}/preview

Preview do próximo agendamento SM-2 sem salvar (antes de avaliar)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
flashcardIdcaminhostringsim

Respostas: 200.

GET /api/v1/flashcards/forecast

Previsão de carga de revisão dos próximos dias

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
daysquerystringsim

Respostas: 200.

formulas

GET /api/v1/formulas

Cheat sheet de fórmulas com busca por texto, filtro por matéria/assunto e favoritas (issue #38)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
qquerystringnãoBusca por texto (título/descrição/LaTeX)
subjectIdquerystringnãoFiltra por matéria
topicIdquerystringnãoFiltra por assunto (tópico)
onlyFavoritesquerybooleannãoApenas favoritas do usuário

Respostas: 200.

POST /api/v1/formulas

Cria uma fórmula personalizada

Exige login (token no cabeçalho Authorization: Bearer).

Corpo (JSON): CreateFormulaDto

CampoTipoObrigatórioDescrição
titlestringsimNome da fórmula
latexstringsimExpressão em LaTeX
descriptionstringnãoContexto/observação
subjectIdstringsimMatéria da fórmula
topicIdstringnãoAssunto (tópico) relacionado

Respostas: 201.

POST /api/v1/formulas/pdf

Caderno de fórmulas em PDF: capa, sumário, fórmulas desenhadas do LaTeX e legenda

Exige login (token no cabeçalho Authorization: Bearer).

Corpo (JSON): FormulasPdfDto

CampoTipoObrigatórioDescrição
formulaIdsstring[]nãoFórmulas escolhidas
subjectIdsstring[]nãoMatérias
topicIdsstring[]nãoAssuntos
onlyFavoritesbooleannãoSó as fórmulas favoritas do aluno
titlestringnãoTítulo na capa e no cabeçalho
studentNamestringnãoNome do aluno na capa
themestringnãoTema de cor (mesmos temas do app)
brandColorstringnão
coverbooleannão
tocbooleannãoSumário por assunto
legendbooleannãoLegenda dos símbolos
descriptionsbooleannãoExplicação curta
twoColumnsbooleannão

Respostas: 200.

GET /api/v1/formulas/{id}

Detalhe de uma fórmula com estado de favorito

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Respostas: 200.

POST /api/v1/formulas/{id}/favorite

Favorita/desfavorita uma fórmula (toggle)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Respostas: 201.

gamification

GET /api/v1/gamification/me

Resumo de gamificação (pontos, sequência, conquistas)

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

GET /api/v1/gamification/achievements

Catálogo de conquistas com status de desbloqueio

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

GET /api/v1/gamification/leaderboard

Ranking de XP (global ou por liga do solicitante)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
scopequerystringsim
limitquerystringsim

Respostas: 200.

GET /api/v1/gamification/history

Histórico de XP ganho (logs + agregado por dia)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
daysquerystringsim

Respostas: 200.

GET /api/v1/gamification/daily-challenge

Desafio diário do dia (meta, progresso, recompensa)

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

POST /api/v1/gamification/daily-challenge/claim

Resgata a recompensa do desafio diário concluído

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 201.

health

GET /health

Verificação de saúde da API, do banco e do cache

Sem login.

Respostas: 200.

performance

GET /api/v1/performance

Desempenho do usuário por área, por assunto e tendência recente (filtro 7d/30d/all)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
periodquery"7d" \"30d" \"all"

Respostas: 200.

GET /api/v1/performance/weeks

Semana a semana: a semana atual e as anteriores (acerto, minutos de foco, dias estudados, áreas) e as prioridades do último mês

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
weeksquerynumber, de 1 a 12nãoQuantas semanas devolver, contando a atual (segunda a domingo, horário de Brasília)

Respostas: 200.

GET /api/v1/performance/heatmap

Mapa de calor da taxonomia canônica: todos os tópicos por área → matéria com o desempenho do usuário (issue #43)

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

pomodoro

POST /api/v1/pomodoro/sessions

Registra uma sessão de foco concluída com XP proporcional (issue #41)

Exige login (token no cabeçalho Authorization: Bearer).

Corpo (JSON): CompleteFocusSessionDto

CampoTipoObrigatórioDescrição
durationSecnumber, de 30 a 14400simDuração da sessão em segundos (30s a 4h)
startedAtstringsimMomento em que a sessão começou (ISO 8601)
subjectIdstringnãoMatéria estudada na sessão

Respostas: 201.

GET /api/v1/pomodoro/history

Histórico de sessões dos últimos N dias

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
daysquerystringsim

Respostas: 200.

GET /api/v1/pomodoro/by-subject

Minutos de foco por matéria nos últimos N dias

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
daysquerystringsim

Respostas: 200.

GET /api/v1/pomodoro/today

Minutos de foco de hoje (widget do Pomodoro)

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

question-notes

GET /api/v1/question-notes

Lista as anotações do usuário (todas, ou filtradas por questionIds)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
questionIdsquerystringsim

Respostas: 200.

PUT /api/v1/question-notes

Cria ou atualiza uma anotação pessoal em uma questão

Exige login (token no cabeçalho Authorization: Bearer).

Corpo (JSON): UpsertQuestionNoteDto

CampoTipoObrigatórioDescrição
questionIdstringsimQuestão associada à nota
contentstringsimConteúdo da nota (Markdown)

Respostas: 200.

GET /api/v1/question-notes/{questionId}

Retorna a anotação do usuário para uma questão

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
questionIdcaminhostringsim

Respostas: 200.

DELETE /api/v1/question-notes/{questionId}

Remove a anotação do usuário de uma questão

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
questionIdcaminhostringsim

Respostas: 200.

questions

GET /api/v1/questions

Busca questões por área, assunto, nível e ano (paginado)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
subjectAreaIdquerystringnãoFiltra pela área do conhecimento (SubjectArea)
subjectIdquerystringnãoFiltra pela matéria (Subject)
topicIdquerystringnãoFiltra pelo assunto (Topic)
difficultyquerynumber, de 1 a 5nãoNível 1..5
yearquerynumbernãoAno da prova oficial
examSlugquerystringnãoProva específica: "2023", "2023-reaplicacao"
languagequery"ingles" \"espanhol"não
codequerystringnãoBusca pelo código da questão, por prefixo: "ENEM-2023-136", "2023 136", "2023".
pagequeryobjeto, mínimo 1não
limitqueryobjeto, de 1 a 50não

Respostas: 200.

GET /api/v1/questions/facets

Contagem de questões por área, assunto e prova (para o painel de filtros)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
languagequerystringsim

Respostas: 200.

GET /api/v1/questions/exams

Lista as provas disponíveis, da mais recente para a mais antiga

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

GET /api/v1/questions/{id}

Detalha uma questão comentada (com gabarito)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Respostas: 200.

POST /api/v1/questions/{id}/explanation

Devolve o comentário da questão, gerando-o por IA na primeira vez (se houver provedor)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Respostas: 200.

recommendation

GET /api/v1/recommendation/next

Questões recomendadas a partir dos assuntos com mais erros

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
limitquerynumbersim

Respostas: 200.

review

GET /api/v1/review/queue

Fila de revisão (assuntos com revisão vencida)

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

GET /api/v1/review/next

Próxima revisão agendada (dueAt > agora)

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

POST /api/v1/review/{id}

Reagenda um item de revisão pela lembrança (0..5)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Corpo (JSON): GradeReviewDto

CampoTipoObrigatórioDescrição
qualitynumber, de 0 a 5simQualidade da lembrança (0 = esqueceu, 5 = perfeito)

Respostas: 201.

simulations

GET /api/v1/simulations/templates

Lista os simulados disponíveis e os que o aluno salvou

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

POST /api/v1/simulations/templates

Salva um simulado personalizado (por tema)

Exige login (token no cabeçalho Authorization: Bearer).

Corpo (JSON): CreateTemplateDto

CampoTipoObrigatórioDescrição
subjectAreaIdsstring[]nãoÁreas do conhecimento. É o filtro que alcança as questões oficiais ainda não classificadas em matéria.
subjectIdsstring[]nãoMatérias
topicIdsstring[]nãoAssuntos (temas)
examSlugsstring[]nãoProvas: "2023", "2023-reaplicacao"
subjectAreaIdstringnão
subjectIdstringnão
topicIdstringnão
yearFromnumbernãoAno mínimo da prova
yearTonumbernãoAno máximo da prova
difficultynumber, de 1 a 5não
language"ingles" \"espanhol"não
questionCountnumber, de 3 a 180não
timeLimitMinnumbernãoTempo do simulado, em minutos
paretobooleannãoSorteio ponderado pela incidência no ENEM (Pareto)
unseenOnlybooleannãoSó questões nunca respondidas
onlyFavoritesbooleannãoSó questões favoritadas
wrongOnlybooleannãoSó questões que o aluno errou antes
namestring, até 60 caracteressim

Respostas: 201.

DELETE /api/v1/simulations/templates/{id}

Remove um simulado personalizado do aluno

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Respostas: 200.

POST /api/v1/simulations/preview

Quantas questões existem para um recorte, antes de iniciar

Exige login (token no cabeçalho Authorization: Bearer).

Corpo (JSON): SimulationFiltersDto

CampoTipoObrigatórioDescrição
subjectAreaIdsstring[]nãoÁreas do conhecimento. É o filtro que alcança as questões oficiais ainda não classificadas em matéria.
subjectIdsstring[]nãoMatérias
topicIdsstring[]nãoAssuntos (temas)
examSlugsstring[]nãoProvas: "2023", "2023-reaplicacao"
subjectAreaIdstringnão
subjectIdstringnão
topicIdstringnão
yearFromnumbernãoAno mínimo da prova
yearTonumbernãoAno máximo da prova
difficultynumber, de 1 a 5não
language"ingles" \"espanhol"não
questionCountnumber, de 3 a 180não
timeLimitMinnumbernãoTempo do simulado, em minutos
paretobooleannãoSorteio ponderado pela incidência no ENEM (Pareto)
unseenOnlybooleannãoSó questões nunca respondidas
onlyFavoritesbooleannãoSó questões favoritadas
wrongOnlybooleannãoSó questões que o aluno errou antes

Respostas: 201.

GET /api/v1/simulations/pdf-themes

Temas de cor disponíveis para o caderno em PDF

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

POST /api/v1/simulations

Inicia um simulado (de um template ou por filtros)

Exige login (token no cabeçalho Authorization: Bearer).

Corpo (JSON): StartSimulationDto

CampoTipoObrigatórioDescrição
subjectAreaIdsstring[]nãoÁreas do conhecimento. É o filtro que alcança as questões oficiais ainda não classificadas em matéria.
subjectIdsstring[]nãoMatérias
topicIdsstring[]nãoAssuntos (temas)
examSlugsstring[]nãoProvas: "2023", "2023-reaplicacao"
subjectAreaIdstringnão
subjectIdstringnão
topicIdstringnão
yearFromnumbernãoAno mínimo da prova
yearTonumbernãoAno máximo da prova
difficultynumber, de 1 a 5não
language"ingles" \"espanhol"não
questionCountnumber, de 3 a 180não
timeLimitMinnumbernãoTempo do simulado, em minutos
paretobooleannãoSorteio ponderado pela incidência no ENEM (Pareto)
unseenOnlybooleannãoSó questões nunca respondidas
onlyFavoritesbooleannãoSó questões favoritadas
wrongOnlybooleannãoSó questões que o aluno errou antes
templateIdstringnãoTemplate do simulado (prova oficial, por área ou personalizado salvo). Sem ele, o simulado é montado só com os filtros.
saveAsstringnãoSalva este recorte como um simulado personalizado com o nome dado

Respostas: 201.

POST /api/v1/simulations/pdf

Gera o caderno de prova em PDF no padrão ENEM, com a capa do OpENEM

Exige login (token no cabeçalho Authorization: Bearer).

Corpo (JSON): SimulationPdfDto

CampoTipoObrigatórioDescrição
subjectAreaIdsstring[]nãoÁreas do conhecimento. É o filtro que alcança as questões oficiais ainda não classificadas em matéria.
subjectIdsstring[]nãoMatérias
topicIdsstring[]nãoAssuntos (temas)
examSlugsstring[]nãoProvas: "2023", "2023-reaplicacao"
subjectAreaIdstringnão
subjectIdstringnão
topicIdstringnão
yearFromnumbernãoAno mínimo da prova
yearTonumbernãoAno máximo da prova
difficultynumber, de 1 a 5não
language"ingles" \"espanhol"não
questionCountnumber, de 3 a 180não
timeLimitMinnumbernãoTempo do simulado, em minutos
paretobooleannãoSorteio ponderado pela incidência no ENEM (Pareto)
unseenOnlybooleannãoSó questões nunca respondidas
onlyFavoritesbooleannãoSó questões favoritadas
wrongOnlybooleannãoSó questões que o aluno errou antes
templateIdstringnãoGera o PDF de um template (prova oficial ou salvo)
titlestringnãoTítulo impresso na capa
studentNamestringnãoNome do aluno na capa
themestringnãoTema de cor do caderno (mesmos temas do app)
brandColorstringnãoCor da marca em hexadecimal, para o tema personalizado
coverbooleannão
answerSheetbooleannão
answerKeybooleannão
explanationsbooleannãoInclui os comentários das questões que têm resolução
twoColumnsbooleannãoDuas colunas, como o caderno oficial

Respostas: 201.

GET /api/v1/simulations/{id}

Estado de um simulado

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Respostas: 200.

POST /api/v1/simulations/{id}/pdf

Gera o PDF de um simulado que o aluno já fez

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Corpo (JSON): SimulationPdfDto

CampoTipoObrigatórioDescrição
subjectAreaIdsstring[]nãoÁreas do conhecimento. É o filtro que alcança as questões oficiais ainda não classificadas em matéria.
subjectIdsstring[]nãoMatérias
topicIdsstring[]nãoAssuntos (temas)
examSlugsstring[]nãoProvas: "2023", "2023-reaplicacao"
subjectAreaIdstringnão
subjectIdstringnão
topicIdstringnão
yearFromnumbernãoAno mínimo da prova
yearTonumbernãoAno máximo da prova
difficultynumber, de 1 a 5não
language"ingles" \"espanhol"não
questionCountnumber, de 3 a 180não
timeLimitMinnumbernãoTempo do simulado, em minutos
paretobooleannãoSorteio ponderado pela incidência no ENEM (Pareto)
unseenOnlybooleannãoSó questões nunca respondidas
onlyFavoritesbooleannãoSó questões favoritadas
wrongOnlybooleannãoSó questões que o aluno errou antes
templateIdstringnãoGera o PDF de um template (prova oficial ou salvo)
titlestringnãoTítulo impresso na capa
studentNamestringnãoNome do aluno na capa
themestringnãoTema de cor do caderno (mesmos temas do app)
brandColorstringnãoCor da marca em hexadecimal, para o tema personalizado
coverbooleannão
answerSheetbooleannão
answerKeybooleannão
explanationsbooleannãoInclui os comentários das questões que têm resolução
twoColumnsbooleannãoDuas colunas, como o caderno oficial

Respostas: 201.

POST /api/v1/simulations/{id}/finish

Finaliza e corrige um simulado

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Corpo (JSON): FinishSimulationDto

CampoTipoObrigatórioDescrição
answersSimulationAnswerDto[]sim

Respostas: 201.

study-plan

GET /api/v1/study-plan

Retorna o cronograma atual com as sessões por dia

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

DELETE /api/v1/study-plan

Recomeça o cronograma vazio, com a semana a partir de hoje

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

POST /api/v1/study-plan/sessions

Adiciona um bloco livre em um dia do calendário (issue #46)

Exige login (token no cabeçalho Authorization: Bearer).

Corpo (JSON): CreateSessionDto

CampoTipoObrigatórioDescrição
labelstringsimNome do bloco: "Matemática", "Inglês", "Revisar simulado"
dayIndexnumbersimDia do plano (0 = primeiro dia)
minutesnumbernãoDuração em minutos (padrão 45)

Respostas: 201.

PATCH /api/v1/study-plan/sessions/{id}

Edita nome, duração, dia ou conclusão de um bloco

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Corpo (JSON): UpdateSessionDto

CampoTipoObrigatórioDescrição
labelstringnãoNome livre do bloco
minutesnumbernãoDuração do bloco em minutos
dayIndexnumbernãoDia do plano (0 = primeiro dia)
donebooleannãoMarca a sessão como concluída ou não

Respostas: 200.

DELETE /api/v1/study-plan/sessions/{id}

Remove um bloco do calendário

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Respostas: 200.

subjects

GET /api/v1/subjects

Lista as áreas do conhecimento e seus assuntos

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

themes

GET /api/v1/themes/mine

Temas de cores criados pelo aluno

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

GET /api/v1/themes/community

Temas publicados pela comunidade (populares ou recentes)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
sortquery"popular" \"recent"não
takequerynumber, de 1 a 50não
skipquerynumber, mínimo 0não

Respostas: 200.

POST /api/v1/themes

Cria um tema (nasce privado se isPublic não vier)

Exige login (token no cabeçalho Authorization: Bearer).

Corpo (JSON): CreateThemeDto

CampoTipoObrigatórioDescrição
namestringsimNome do tema (único por aluno)
lightobjectsimLado claro: as 10 cores em #rrggbb
darkobjectsimLado escuro: as 10 cores em #rrggbb
isPublicbooleannãoPublica na aba Comunidade (nasce privado)

Respostas: 201.

PATCH /api/v1/themes/{id}

Edita, publica ou despublica um tema próprio

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Corpo (JSON): UpdateThemeDto

CampoTipoObrigatórioDescrição
namestringnãoNome do tema (único por aluno)
lightobjectnãoLado claro: as 10 cores em #rrggbb
darkobjectnãoLado escuro: as 10 cores em #rrggbb
isPublicbooleannãoPublica na aba Comunidade (nasce privado)

Respostas: 200.

DELETE /api/v1/themes/{id}

Apaga um tema próprio

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Respostas: 200.

POST /api/v1/themes/{id}/like

Curtir/descurtir um tema publicado (toggle)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Respostas: 201.

tools

GET /api/v1/tools

Ferramentas abertas no GitHub, com a contagem de estrelas (cache de 1 hora)

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

users

GET /api/v1/users/me

Retorna o usuário autenticado e seu perfil

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

DELETE /api/v1/users/me

Exclui a conta e todos os dados do aluno, confirmando a senha atual (LGPD, art. 18)

Exige login (token no cabeçalho Authorization: Bearer).

Corpo (JSON): DeleteAccountDto

CampoTipoObrigatórioDescrição
passwordstringsimSenha atual, para confirmar a exclusão

Respostas: 204.

GET /api/v1/users/me/export

Baixa todos os dados do aluno em JSON (LGPD, art. 18)

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

GET /api/v1/users/{id}/profile

Perfil público de um usuário (sem PII)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Respostas: 200.

PUT /api/v1/users/me/profile

Atualiza o perfil de estudo do usuário

Exige login (token no cabeçalho Authorization: Bearer).

Corpo (JSON): UpdateProfileDto

CampoTipoObrigatórioDescrição
goal"SISU" \"PROUNI" \"TREINEIRO"
minutesPerDaynumber, de 5 a 1440nãoMinutos disponíveis para estudo por dia
displayNamestring, até 80 caracteresnão
focusModebooleannãoModo sem distrações (interface minimalista)
gamificationEnabledbooleannãoAtiva pontos, sequência e conquistas (Fase 3)
onboardedbooleannãoMarcado como true ao concluir o onboarding inicial
foreignLanguage"ingles" \"espanhol"não

Respostas: 200.

PUT /api/v1/users/me/password

Troca a senha (pede a atual), encerra as outras sessões e retorna um token novo para este aparelho

Exige login (token no cabeçalho Authorization: Bearer).

Corpo (JSON): ChangePasswordDto

CampoTipoObrigatórioDescrição
currentPasswordstringsim
newPasswordstringsim

Respostas: 200.

videos

GET /api/v1/videos

Biblioteca de vídeos do usuário (issue #37)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
subjectIdquerystringsim

Respostas: 200.

POST /api/v1/videos

Salva um vídeo por link do YouTube (metadados via oEmbed)

Exige login (token no cabeçalho Authorization: Bearer).

Corpo (JSON): CreateVideoDto

CampoTipoObrigatórioDescrição
urlstringsimLink do YouTube (ou ID do vídeo)
subjectIdstringnãoMatéria do vídeo

Respostas: 201.

PATCH /api/v1/videos/{id}

Re-classifica a matéria (ou limpa com null)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Corpo (JSON): UpdateVideoDto

CampoTipoObrigatórioDescrição
subjectIdobjectnãoNova matéria (null para limpar)

Respostas: 200.

DELETE /api/v1/videos/{id}

Remove o vídeo e suas notas

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Respostas: 200.

POST /api/v1/videos/{id}/watched

Marca/desmarca como assistido (toggle)

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Respostas: 201.

GET /api/v1/videos/{id}/notes

Notas do vídeo com timestamp

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Respostas: 200.

POST /api/v1/videos/{id}/notes

Adiciona uma nota com timestamp

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Corpo (JSON): AddVideoNoteDto

CampoTipoObrigatórioDescrição
timestampSecnumber, mínimo 0simInstante da nota, em segundos
contentstringsimConteúdo da nota

Respostas: 201.

DELETE /api/v1/videos/notes/{noteId}

Remove uma nota própria

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
noteIdcaminhostringsim

Respostas: 200.

weekly-goals

GET /api/v1/weekly-goals

Metas da semana corrente com o progresso calculado (issue #44)

Exige login (token no cabeçalho Authorization: Bearer).

Respostas: 200.

POST /api/v1/weekly-goals

Cria uma meta para a semana corrente

Exige login (token no cabeçalho Authorization: Bearer).

Corpo (JSON): CreateWeeklyGoalDto

CampoTipoObrigatórioDescrição
subjectAreaIdstringnãoEscopo: área do conhecimento
subjectIdstringnãoEscopo: matéria
topicIdstringnãoEscopo: assunto (tópico)
targetMinutesnumber, mínimo 0nãoMeta de tempo na semana, em minutos (0 = sem meta de tempo)
targetQuestionsnumber, mínimo 0nãoMeta de questões na semana (0 = sem meta de questões)

Respostas: 201.

PATCH /api/v1/weekly-goals/{id}

Atualiza os alvos de uma meta própria

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Corpo (JSON): UpdateWeeklyGoalDto

CampoTipoObrigatórioDescrição
targetMinutesnumber, mínimo 0nãoNova meta de tempo na semana, em minutos
targetQuestionsnumber, mínimo 0nãoNova meta de questões na semana

Respostas: 200.

DELETE /api/v1/weekly-goals/{id}

Remove uma meta própria

Exige login (token no cabeçalho Authorization: Bearer).

ParâmetroOndeTipoObrigatórioDescrição
idcaminhostringsim

Respostas: 200.