INAT ParanaguáPortal
Referência técnicaAPI v1 · setembro/2026Página estática

O backend INAT,do contexto à API.

Um mapa do sistema Spring: arquitetura, autenticação, autorização, domínios, políticas, automações, persistência e cada operação HTTP disponível hoje.

151operações HTTP
18módulos de código
4papéis de sistema
8rotas públicas

01 · Visão geral

Uma API modular para a jornada de aprendizagem

O backend é um monólito modular orientado aos fluxos do INAT. Cada pacote concentra controller, DTOs, serviços, repositórios e modelos do seu assunto; as regras que cruzam assuntos ficam explícitas em políticas transversais.

Java 21Spring Boot 4.0.6Spring MVCSpring SecuritySpring Data JPAHibernate validateFlywayMySQLJWTSMTPFilesystemVirtual Threads

Monólito modular

Uma aplicação implantável, com fronteiras organizadas por domínio em vez de camadas globais.

Autorização em duas etapas

O filtro exige autenticação e o Method Security decide papel, identidade e vínculo com o objeto.

Domínio temporal

Agendadores reconciliam contratos, aulas, atividades, documentos, contas e entregas de e-mail.

02 · Arquitetura

O caminho de uma requisição

Os controllers cuidam do contrato HTTP. Serviços coordenam casos de uso e transações; políticas concentram invariantes que atravessam agregados; repositórios isolam a persistência. Integrações externas permanecem nas bordas.

ClientesNext.js · mobile
ControllersHTTP · validação · DTO
Serviços e políticascasos de uso · transações
RepositóriosSpring Data JPA
MySQL + Flyway

Dados relacionais, schema versionado e Hibernate apenas validando o mapeamento.

Filesystem

Binários fora do banco; metadados, checksum e relacionamentos dentro da transação.

SMTP + schedulers

Códigos e notificações por e-mail, processados de forma desacoplada dos fluxos principais.

03 · Contratos HTTP

Uma forma previsível de conversar com a API

A API usa /api como prefixo, JSON para operações comuns e multipart apenas nos uploads. Em desenvolvimento, o backend escuta a porta 8080; o frontend real acessa-o pelo BFF do Next.js.

ApiResponse<T>
{
  "timestamp": "2026-09-20T17:30:00Z",
  "status": "OK",
  "message": "Resource found",
  "data": { ... }
}
PageResponse<T> dentro de data
{
  "content": [ ... ],
  "page": 0,
  "size": 20,
  "totalElements": 48,
  "totalPages": 3,
  "first": true,
  "last": false
}

Identificadores

ULID de 26 caracteres nos agregados; catálogos pequenos usam short.

Tempo

Instantes persistidos em UTC; datas civis críticas usam America/Sao_Paulo.

Paginação

page começa em 0; size usa 20 por padrão e aceita no máximo 100.

Erros

400 validação, 401 autenticação, 403 acesso, 404 ausência, 409 conflito e 422 regra.

Contrato de upload

Documentos de pessoa, documentos contratuais e materiais de atividade recebemmetadataem JSON efilecomo binário. Anexos de entrega precisam apenas de file. O limite padrão é 25 MB.

04 · Segurança

JWT na borda, contexto no domínio

Spring Security opera sem sessão de servidor. Um JWT válido identifica o ator; a autorização por método avalia papel, identidade, organização, aula, aprendiz ou outro objeto antes de executar o caso de uso.

01

Senha

Login valida a credencial e cria o desafio.

02

Código

Seis dígitos, validade de 10 min e até 5 tentativas.

03

Tokens

A confirmação emite access e refresh token.

04

Validação ativa

Estado e versão de sessão são conferidos no banco.

Sessão web e mobile

Mesmo domínio, transporte adequado a cada cliente.

X-Client-Type: web

Refresh token em cookie HttpOnly, SameSite=Lax e Secure por padrão.

X-Client-Type: mobile

Refresh token devolvido e recebido no corpo da requisição.

Superfície pública

São públicos os sete POSTs de autenticação e o POST de contato. Todo o restante exige JWT; regras mais restritas são aplicadas nos controllers.

8 de 151 operações

Matriz resumida de acesso por papel
ÁreaADMININSTRUCTORLEARNEREMPLOYER_MANAGER
Pessoas e documentosGerenciaParticipantesPróprio contextoContratados
Organizações e vínculosGerencia——Própria empresa
ContratosGerencia—PrópriosDa empresa
Aulas e frequênciaGerenciaAulas atribuídasPróprias—
Atividades e entregasGerenciaCria e corrigeEntrega—
ComunicaçõesCompõe e acompanhaCaixa própriaCaixa própriaCaixa própria
Usuários e papéisGerenciaPrópria contaPrópria contaPrópria conta

05 · Módulos

O mapa completo dos pacotes

Os 18 pacotes de primeiro nível incluem domínios de negócio, capacidades transversais e integrações de infraestrutura. Abra um módulo para ver modelos e responsabilidades centrais.

acAtividadesDomínioactivityAtividades pedagógicas, materiais, entregas, anexos e avaliação.
Peças centrais
ActivityActivityFileActivitySubmissionSubmissionFile
  • Uma entrega por atividade/aprendiz
  • Atraso calculado pelo prazo
  • Nota limitada ao maxScore
adEndereçosDomínioaddressEndereço postal reutilizado nos cadastros de pessoas e organizações.
Peças centrais
Address
  • CEP e UF normalizados
  • Persistência com identidade ULID
auAutenticaçãoTransversalauthJWT, refresh token, cookies, desafios por código, bloqueio de conta e autorização por objeto.
Peças centrais
AuthChallengeRefreshToken
  • MFA após senha válida
  • Sessão versionada
  • Bloqueio após falhas consecutivas
coTurmasDomíniocohortTurmas, calendário-base, matrículas e ciclo do treinamento.
Peças centrais
CohortCohortEnrollment
  • Matrícula vinculada a contrato
  • Conclusão automática pela data final
coContatoDomíniocontactMensagens públicas da landing page e fluxo administrativo de leitura e arquivamento.
Peças centrais
ContactMessage
  • Criação pública
  • Consulta e triagem exclusivas de ADMIN
coContratosDomíniocontractRelação de aprendizagem entre jovem, empregador e escola, incluindo documentos e histórico escolar.
Peças centrais
ContractContractDocumentContractSchoolChange
  • Carga semanal em minutos
  • Vigência coerente
  • Histórico de troca de escola
doDocumentosDomíniodocumentCatálogo documental, arquivos, verificação, validade e histórico de mudanças.
Peças centrais
DocumentTypePersonDocumentPersonDocumentStatusHistoryStoredFile
  • Expiração automática
  • Hash SHA-256
  • Arquivo físico fora do banco
leAprendizesDomíniolearnerPerfil do aprendiz, onboarding e relações com responsáveis.
Peças centrais
LearnerLearnerGuardian
  • Pessoa e perfil separados
  • Responsável primário consistente
  • Elegibilidade por status
leAulas e frequênciaDomíniolessonAulas, participantes esperados, remanejamento, frequência e reconciliação temporal.
Peças centrais
LessonLessonFileLessonParticipantAttendanceRecord
  • Sem sobreposição
  • Estados guiados pelo relógio
  • Presença online por conclusão
maE-mailInfraestruturamailContrato de envio e adaptação SMTP usados por códigos de autenticação e notificações.
Peças centrais
EmailSenderSmtpEmailSenderEmailDeliveryException
  • SMTP configurável
  • Conteúdo seguro
  • Falhas sem exposição de credenciais
noNotificaçõesDomínionotificationComposição, audiência, destinatários, leitura e entrega multicanal.
Peças centrais
NotificationNotificationRecipient
  • Audiência materializada
  • Retentativa de e-mail
  • Estado individual por canal
orOrganizaçõesDomínioorganizationEmpresas, escolas e vínculos funcionais das pessoas.
Peças centrais
OrganizationOrganizationTypeEntryOrganizationMembership
  • Um ou mais tipos: EMPLOYER e/ou SCHOOL
  • Tipos exigidos por contratos não podem ser removidos
  • Gestor limitado à empresa vinculada
pePessoasDomíniopersonIdentidade civil compartilhada por usuários, aprendizes, instrutores, gestores e responsáveis.
Peças centrais
PersonPersonType
  • E-mail de contato único
  • Classificações explícitas
  • Cadastro independente da conta
prPolíticas do projetoTransversalprojectRegras INAT que atravessam contratos, aulas, atividades e frequência.
Peças centrais
ApprenticeshipPolicyOnlineAttendanceClosingPolicy
  • Aula online exige contrato ativo de 30 h
  • Carga de 30 h protegida em aulas abertas
  • Fechamento mensal usa America/Sao_Paulo
seBusca do portalTransversalsearchPesquisa paginada e lookups pequenos, sempre filtrados pelo contexto do ator.
Peças centrais
PortalSearchControllerPortalSearchServicePageResponse<Object>
  • Recursos permitidos em catálogo
  • Lookups limitados a cinco itens
shNúcleo compartilhadoTransversalsharedContratos de paginação, enums, histórico de ciclo de vida, ULIDs e abstrações CRUD.
Peças centrais
PageResponseLifecycleStatusHistoryUlidGenerator
  • Instantes em UTC
  • IDs ULID
  • Estados tipados
usUsuários e papéisDomíniouserConta de acesso, papéis do sistema e contexto atual do portal.
Peças centrais
UserRoleUserRole
  • Quatro papéis fechados
  • Um usuário por pessoa
  • Concessão explícita
weCamada HTTPInfraestruturawebEnvelope de respostas e tradução centralizada de exceções para a API.
Peças centrais
ApiResponseGlobalExceptionHandlerBusinessRuleException
  • Envelope uniforme
  • Erros de validação estruturados
  • Exceções mapeadas para status HTTP

06 · Regras de negócio

Onde o sistema protege o processo

As invariantes abaixo são os pontos em que o backend faz mais do que persistir formulários. Elas coordenam estados, prazos, vínculos e efeitos automáticos.

Agenda e ciclo acadêmico

Horários são parte do domínio, não apenas informação visual.

  • Instrutor, turma e aprendiz não podem ter aulas ativas sobrepostas; aulas adjacentes são permitidas.
  • Aulas evoluem de SCHEDULED para IN_PROGRESS e COMPLETED pelo relógio; CANCELLED e COMPLETED são terminais.
  • Atividades PUBLISHED fecham após dueAt; DRAFT nunca é publicado automaticamente.

Aprendizagem profissional

As políticas em project conectam diferentes agregados.

  • Uma aula ONLINE exige contrato ativo na data e carga semanal de 1.800 minutos (30 h).
  • A carga de 30 h do contrato não pode ser alterada enquanto houver participação online aberta dependente dela.
  • Vigências de contrato, turma e matrícula são reconciliadas sem apagar o histórico.

Frequência online

O scheduler reconhece a presença depois da correção de todas as atividades.

  • A cada 60 segundos por padrão, o backend verifica se todas as atividades PUBLISHED ou CLOSED da aula online estão GRADED com nota maior que 6 em cada uma.
  • O fechamento mensal respeita attendanceClosingDay da empresa e o fuso America/Sao_Paulo.
  • Após o fim da aula, a falta automática pode virar presença quando as correções se completarem; lançamentos manuais são preservados.

Entregas e avaliação

O estado da aula, da atividade e da entrega trabalha em conjunto.

  • Só existe uma entrega por atividade e aprendiz; envios após o prazo tornam-se LATE.
  • O aprendiz edita apenas DRAFT ou RETURNED; o instrutor avalia SUBMITTED ou LATE.
  • A nota não pode superar maxScore e anexos seguem política de tipo, tamanho e conteúdo.

Documentos e arquivos

Metadados transacionais no banco, binários protegidos no filesystem.

  • Uploads estruturados usam multipart com as partes metadata e file.
  • O cliente nunca define storageKey, checksum ou tamanho; o backend calcula e protege esses dados.
  • Documentos verificados vencidos mudam para EXPIRED com histórico da transição.

Notificações

A audiência é resolvida no momento da criação.

  • USER, COHORT e ALL geram um retrato de destinatários; mudanças futuras não alteram o envio criado.
  • Publicação, prazo próximo e entrega de atividade podem gerar notificações automáticas.
  • E-mail aceito pelo SMTP torna-se SENT; FAILED pode voltar a PENDING por ação administrativa.

07 · Automações

Cinco ciclos mantêm o estado coerente

Os agendadores usam fixed delay configurável. Cada serviço revalida o estado dentro da transação, trabalha em lotes quando necessário e registra apenas mudanças efetivas.

AccountLockScheduler
60 s

Desbloqueia contas cujo bloqueio automático expirou.

TrainingLifecycleScheduler
60 s

Encerra contratos e conclui turmas e matrículas vencidas.

AcademicLifecycleScheduler
60 s

Move aulas/atividades, cria lembretes e registra ausências online pendentes.

PersonDocumentLifecycleScheduler
60 s

Expira, em lote, documentos verificados cuja validade terminou.

NotificationEmailScheduler
5 s

Busca destinatários de e-mail pendentes e tenta a entrega via SMTP.

08 · Referência da API

151 operações, pesquisáveis por contexto

Pesquise por rota, ação, DTO ou regra; filtre por domínio e nível de acesso. Cada item mostra parâmetros, cabeçalhos, payload esperado, resposta e um exemplo completo com curl.

Nível de acesso

151 operações encontradas

Autenticação

Conta, MFA por código, recuperação de senha, renovação e encerramento de sessão.

7 operações
POST/api/auth/loginValidar credenciais e iniciar MFAPúblico

Validar credenciais e iniciar MFA

Não exige access token.

Retorna 202 e envia um código. Tokens só são emitidos após a verificação do desafio.

Autorização
Público
Requisição
LoginRequest
Content-Type
application/json
Resposta
AuthChallengeResponse

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
X-Client-Typeweb | mobileopcionalPadrão: web. Define se o refresh token usa cookie ou corpo.
Payload esperado
{
  "email": "usuario@example.com",
  "password": "SenhaSegura123!"
}
Campos e validações
  • email — obrigatório, formato de e-mail, máximo de 254 caracteres
  • password — obrigatório, máximo de 72 bytes em UTF-8
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/auth/login' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'X-Client-Type: web' \
  --data '{
  "email": "usuario@example.com",
  "password": "SenhaSegura123!"
}'
POST/api/auth/registerCriar conta vinculada a uma pessoaPúblico

Criar conta vinculada a uma pessoa

Não exige access token.

Cria a conta como INVITED e retorna um desafio de verificação de e-mail.

Autorização
Público
Requisição
RegisterRequest
Content-Type
application/json
Resposta
AuthChallengeResponse

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
X-Client-Typeweb | mobileopcionalPadrão: web. Define se o refresh token usa cookie ou corpo.
Payload esperado
{
  "name": "Maria da Silva",
  "email": "maria@example.com",
  "regulationAccepted": true,
  "regulationAcceptedAt": "2026-09-22T12:00:00Z",
  "password": "SenhaSegura123!"
}
Campos e validações
  • name — obrigatório, máximo de 100 caracteres
  • regulationAccepted — deve ser true
  • regulationAcceptedAt — obrigatório, instante ISO 8601
  • password — de 8 caracteres até 72 bytes em UTF-8
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/auth/register' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'X-Client-Type: web' \
  --data '{
  "name": "Maria da Silva",
  "email": "maria@example.com",
  "regulationAccepted": true,
  "regulationAcceptedAt": "2026-09-22T12:00:00Z",
  "password": "SenhaSegura123!"
}'
POST/api/auth/forgot-passwordSolicitar recuperação de senhaPúblico

Solicitar recuperação de senha

Não exige access token.

Autorização
Público
Requisição
ForgotPasswordRequest
Content-Type
application/json
Resposta
AuthChallengeResponse

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
X-Client-Typeweb | mobileopcionalPadrão: web. Define se o refresh token usa cookie ou corpo.
Payload esperado
{
  "email": "usuario@example.com"
}
Campos e validações
  • email — obrigatório, formato de e-mail, máximo de 254 caracteres
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/auth/forgot-password' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'X-Client-Type: web' \
  --data '{
  "email": "usuario@example.com"
}'
POST/api/auth/reset-passwordRedefinir a senha com código válidoPúblico

Redefinir a senha com código válido

Não exige access token.

Invalida as sessões existentes e não autentica automaticamente.

Autorização
Público
Requisição
ResetPasswordRequest
Content-Type
application/json
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "challengeId": "01K5X3M8Y7ABCD1234EFGH5687",
  "code": "123456",
  "newPassword": "NovaSenha123!"
}
Campos e validações
  • challengeId — obrigatório, máximo de 26 caracteres
  • code — exatamente 6 dígitos
  • newPassword — de 8 caracteres até 72 bytes em UTF-8
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/auth/reset-password' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "challengeId": "01K5X3M8Y7ABCD1234EFGH5687",
  "code": "123456",
  "newPassword": "NovaSenha123!"
}'
POST/api/auth/challenge/verifyConfirmar código de autenticaçãoPúblico

Confirmar código de autenticação

Não exige access token.

Autorização
Público
Requisição
VerifyAuthChallengeRequest
Content-Type
application/json
Resposta
AccessTokenResponse (web) | AuthResponse (mobile)

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
X-Client-Typeweb | mobileopcionalPadrão: web. Define se o refresh token usa cookie ou corpo.
Payload esperado
{
  "challengeId": "01K5X3M8Y7ABCD1234EFGH5687",
  "code": "123456"
}
Campos e validações
  • challengeId — obrigatório, máximo de 26 caracteres
  • code — exatamente 6 dígitos
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/auth/challenge/verify' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'X-Client-Type: web' \
  --data '{
  "challengeId": "01K5X3M8Y7ABCD1234EFGH5687",
  "code": "123456"
}'
POST/api/auth/refreshRenovar o par de tokensPúblico

Renovar o par de tokens

Não exige access token.

No navegador, o refresh token pode vir do cookie HttpOnly; em cliente mobile, vem no corpo.

Autorização
Público
Requisição
RefreshRequest (opcional no cliente web)
Content-Type
application/json
Resposta
AccessTokenResponse (web) | AuthResponse (mobile)

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
X-Client-Typeweb | mobileopcionalPadrão: web. Define se o refresh token usa cookie ou corpo.
Cookierefresh_token=<refresh_token>opcionalAlternativa usada pelo cliente web ao refreshToken no corpo.
Payload esperado
{
  "refreshToken": "<refresh_token_de_43_caracteres>"
}
Campos e validações
  • refreshToken — 43 caracteres URL-safe; opcional quando o cliente web envia o cookie HttpOnly
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/auth/refresh' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'X-Client-Type: web' \
  --data '{
  "refreshToken": "<refresh_token_de_43_caracteres>"
}'
POST/api/auth/logoutRevogar o refresh tokenPúblico

Revogar o refresh token

Não exige access token.

Autorização
Público
Requisição
RefreshRequest (opcional no cliente web)
Content-Type
application/json
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
X-Client-Typeweb | mobileopcionalPadrão: web. Define se o refresh token usa cookie ou corpo.
Cookierefresh_token=<refresh_token>opcionalAlternativa usada pelo cliente web ao refreshToken no corpo.
Payload esperado
{
  "refreshToken": "<refresh_token_de_43_caracteres>"
}
Campos e validações
  • refreshToken — 43 caracteres URL-safe; opcional quando o cliente web envia o cookie HttpOnly
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/auth/logout' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'X-Client-Type: web' \
  --data '{
  "refreshToken": "<refresh_token_de_43_caracteres>"
}'

Contexto do ator atual e consultas enxutas usadas por listas e seletores do portal.

10 operações
GET/api/meObter o contexto do usuário atualAutenticado

Obter o contexto do usuário atual

Exige JWT válido, sem papel específico nesta rota.

Autorização
Autenticado
Requisição
Sem corpo
Content-Type
—
Resposta
CurrentUserContextResponse

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/me' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/search/{resource}Pesquisar recursos do portalAutenticado

Pesquisar recursos do portal

Exige JWT válido, sem papel específico nesta rota.

O serviço aplica o escopo permitido ao ator para cada resource. O filtro status aceita os valores do enum do recurso em people, learners, organizations, contracts, cohorts, lessons, activities e users.

Parâmetros de rota

  • resource (string) — Recurso de busca aceito pelo catálogo do backend

Query parameters

  • view=summary — leitura paginada e enxuta para o portal, inclusive sem texto
  • q — texto, até 160 caracteres
  • page — índice baseado em zero (padrão: 0)
  • size — entre 1 e 100 (padrão: 20)
  • personType, status — filtros por tipo e situação
  • learnerId, organizationId, cohortId, contractId, lessonId, activityId — escopo contextual conforme o recurso
  • workflow, priority, read, verificationStatus, current, documentTypeId, startDate, endDate, deliveryMode — filtros específicos
Autorização
Autenticado
Requisição
Sem corpo
Content-Type
—
Resposta
PageResponse<Object>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/search/people?q=maria&startDate=2026-09-01&endDate=2026-09-30&learnerId=01K5X3M8Y7ABCD1234EFGH5680&organizationId=01K5X3M8Y7ABCD1234EFGH5681&personType=LEARNER&verificationStatus=VERIFIED&page=0&size=20' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/dashboardObter contadores e próximas aulasAutenticado

Obter contadores e próximas aulas

Exige JWT válido, sem papel específico nesta rota.

Contadores calculados no banco; no máximo cinco aulas e quatro avisos.

Autorização
Autenticado
Requisição
Sem corpo
Content-Type
—
Resposta
DashboardSummary

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/dashboard' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/organizations/{id}/summaryContar vínculos acessíveis da organizaçãoContextual

Contar vínculos acessíveis da organização

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
OrganizationSummary

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/organizations/01K5X3M8Y7ABCD1234EFGH5678/summary' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/lessons/{id}/summaryContar participantes, presenças e atividadesContextual

Contar participantes, presenças e atividades

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
LessonSummary

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/lessons/01K5X3M8Y7ABCD1234EFGH5678/summary' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/contracts/{id}/document-types/{typeId}/summaryConsultar próxima versão e versão atualADMIN

Consultar próxima versão e versão atual

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
  • typeId (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
ContractVersionSummary

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/contracts/01K5X3M8Y7ABCD1234EFGH5678/document-types/01K5X3M8Y7ABCD1234EFGH5678/summary' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/lessons/{lessonId}/attendance/missing-countContar participantes elegíveis sem presençaContextual

Contar participantes elegíveis sem presença

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • lessonId (ULID) — ULID da aula

Query parameters

  • q, status — mesmos filtros da chamada
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
{ count: number }

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/lessons/01K5X3M8Y7ABCD1234EFGH5678/attendance/missing-count' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
POST/api/lessons/{lessonId}/attendance/batchSalvar rascunhos de presençaContextual

Salvar rascunhos de presença

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Até 100 alterações por requisição; confirmação ou erro por participante.

Parâmetros de rota

  • lessonId (ULID) — ULID da aula
Autorização
Contextual
Requisição
PortalAttendance.Batch
Content-Type
application/json
Resposta
AttendanceOutcome[]

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "items": [
    {
      "values": {
        "lessonParticipantId": "01K5X3M8Y7ABCD1234EFGH5685",
        "status": "PRESENT",
        "checkInAt": "2026-09-10T13:00:00Z",
        "checkOutAt": "2026-09-10T15:00:00Z",
        "notes": null
      },
      "recordId": null,
      "expectedUpdatedAt": null
    }
  ]
}
Campos e validações
  • items — entre 1 e 100 alterações
  • expectedUpdatedAt — instante da presença carregada para detectar alterações concorrentes
  • recordId — identificador da presença, se já existir
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/lessons/01K5X3M8Y7ABCD1234EFGH5678/attendance/batch' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "items": [
    {
      "values": {
        "lessonParticipantId": "01K5X3M8Y7ABCD1234EFGH5685",
        "status": "PRESENT",
        "checkInAt": "2026-09-10T13:00:00Z",
        "checkOutAt": "2026-09-10T15:00:00Z",
        "notes": null
      },
      "recordId": null,
      "expectedUpdatedAt": null
    }
  ]
}'
POST/api/lessons/{lessonId}/attendance/fill-missingPreencher participantes sem registro do filtroContextual

Preencher participantes sem registro do filtro

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Processa até 100 participantes elegíveis; repetir enquanto remaining > 0. Não sobrescreve presenças.

Parâmetros de rota

  • lessonId (ULID) — ULID da aula
Autorização
Contextual
Requisição
PortalAttendance.Selection
Content-Type
application/json
Resposta
{ saved, failed, remaining }

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "q": "Maria",
  "status": "EXPECTED"
}
Campos e validações
  • Seleção pelos mesmos filtros da chamada
  • Somente participantes elegíveis sem presença são preenchidos
  • A seleção é mantida pelo navegador e enviada apenas ao salvar
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/lessons/01K5X3M8Y7ABCD1234EFGH5678/attendance/fill-missing' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "q": "Maria",
  "status": "EXPECTED"
}'
GET/api/lookups/{resource}Buscar opções para campos de seleçãoAutenticado

Buscar opções para campos de seleção

Exige JWT válido, sem papel específico nesta rota.

Parâmetros de rota

  • resource (string) — Recurso de busca aceito pelo catálogo do backend

Query parameters

  • q — texto, até 160 caracteres
  • page — índice baseado em zero
  • size — entre 1 e 5 (padrão: 5)
  • personType, purpose e contextId — filtros opcionais
Autorização
Autenticado
Requisição
Sem corpo
Content-Type
—
Resposta
PageResponse<Object>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/lookups/people?q=maria&personType=LEARNER&purpose=selector&contextId=01K5X3M8Y7ABCD1234EFGH5678&page=0&size=5' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'

Usuários e papéis

Contas de acesso, catálogo fechado de papéis e concessões explícitas.

13 operações
POST/api/usersCriar usuárioADMIN

Criar usuário

Exige o papel ADMIN.

Autorização
ADMIN
Requisição
UserDtos.CreateRequest
Content-Type
application/json
Resposta
UserResponse

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "personId": "01K5X3M8Y7ABCD1234EFGH5678",
  "displayName": "Maria da Silva",
  "loginEmail": "maria@example.com",
  "password": "SenhaSegura123!",
  "status": "ACTIVE"
}
Campos e validações
  • personId — obrigatório; a pessoa ainda não pode estar vinculada a outro usuário
  • displayName — obrigatório, máximo de 150 caracteres
  • password — de 8 caracteres até 72 bytes em UTF-8
  • status — INVITED, ACTIVE, LOCKED ou DISABLED
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/users' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "personId": "01K5X3M8Y7ABCD1234EFGH5678",
  "displayName": "Maria da Silva",
  "loginEmail": "maria@example.com",
  "password": "SenhaSegura123!",
  "status": "ACTIVE"
}'
GET/api/users/{id}Consultar usuárioContextual

Consultar usuário

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
UserResponse

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/users/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/usersListar usuáriosADMIN

Listar usuários

Exige o papel ADMIN.

Query parameters

  • page — índice baseado em zero (padrão: 0)
  • size — entre 1 e 100 (padrão: 20)
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
PageResponse<UserResponse>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/users?page=0&size=20' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
PUT/api/users/{id}Atualizar usuárioADMIN

Atualizar usuário

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
UserDtos.UpdateRequest
Content-Type
application/json
Resposta
UserResponse

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "displayName": "Maria da Silva",
  "loginEmail": "maria@example.com",
  "password": null,
  "status": "ACTIVE"
}
Campos e validações
  • displayName — obrigatório, máximo de 150 caracteres
  • password — opcional; quando informado, mínimo de 8 caracteres e máximo de 72 bytes
  • status — INVITED, ACTIVE, LOCKED ou DISABLED
Exemplo com curl
bash
curl --request PUT \
  --url 'http://localhost:8080/api/users/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "displayName": "Maria da Silva",
  "loginEmail": "maria@example.com",
  "password": null,
  "status": "ACTIVE"
}'
DELETE/api/users/{id}Excluir usuárioADMIN

Excluir usuário

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/users/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
POST/api/rolesCriar papelADMIN

Criar papel

Exige o papel ADMIN.

Autorização
ADMIN
Requisição
RoleDtos.Request
Content-Type
application/json
Resposta
RoleDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "code": "INSTRUCTOR",
  "name": "Instructor",
  "description": "Assigned lesson management"
}
Campos e validações
  • code — ADMIN, INSTRUCTOR, LEARNER ou EMPLOYER_MANAGER
  • name — obrigatório, máximo de 100 caracteres
  • description — opcional, máximo de 255 caracteres
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/roles' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "code": "INSTRUCTOR",
  "name": "Instructor",
  "description": "Assigned lesson management"
}'
GET/api/roles/{id: short}Consultar papelADMIN

Consultar papel

Exige o papel ADMIN.

Parâmetros de rota

  • id (short) — Identificador numérico do catálogo
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
RoleDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/roles/1' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/rolesListar papéisADMIN

Listar papéis

Exige o papel ADMIN.

Query parameters

  • page — índice baseado em zero (padrão: 0)
  • size — entre 1 e 100 (padrão: 20)
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
PageResponse<RoleDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/roles?page=0&size=20' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
PUT/api/roles/{id: short}Atualizar papelADMIN

Atualizar papel

Exige o papel ADMIN.

Parâmetros de rota

  • id (short) — Identificador numérico do catálogo
Autorização
ADMIN
Requisição
RoleDtos.Request
Content-Type
application/json
Resposta
RoleDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "code": "INSTRUCTOR",
  "name": "Instructor",
  "description": "Assigned lesson management"
}
Campos e validações
  • code — ADMIN, INSTRUCTOR, LEARNER ou EMPLOYER_MANAGER
  • name — obrigatório, máximo de 100 caracteres
  • description — opcional, máximo de 255 caracteres
Exemplo com curl
bash
curl --request PUT \
  --url 'http://localhost:8080/api/roles/1' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "code": "INSTRUCTOR",
  "name": "Instructor",
  "description": "Assigned lesson management"
}'
DELETE/api/roles/{id: short}Excluir papelADMIN

Excluir papel

Exige o papel ADMIN.

Parâmetros de rota

  • id (short) — Identificador numérico do catálogo
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/roles/1' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/users/{userId}/rolesListar papéis do usuárioContextual

Listar papéis do usuário

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • userId (ULID) — ULID do usuário
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
List<UserRoleDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/users/01K5X3M8Y7ABCD1234EFGH5678/roles' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
POST/api/users/{userId}/rolesConceder papel ao usuárioADMIN

Conceder papel ao usuário

Exige o papel ADMIN.

A pessoa vinculada deve possuir o personType compatível; LEARNER também exige perfil ativo.

Parâmetros de rota

  • userId (ULID) — ULID do usuário
Autorização
ADMIN
Requisição
UserRoleDtos.GrantRequest
Content-Type
application/json
Resposta
UserRoleDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "roleId": 2
}
Campos e validações
  • roleId — short obrigatório; a pessoa do usuário deve possuir o personType correspondente
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/users/01K5X3M8Y7ABCD1234EFGH5678/roles' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "roleId": 2
}'
DELETE/api/users/{userId}/roles/{roleId}Revogar papel do usuárioADMIN

Revogar papel do usuário

Exige o papel ADMIN.

Parâmetros de rota

  • userId (ULID) — ULID do usuário
  • roleId (short) — Identificador short do papel
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/users/01K5X3M8Y7ABCD1234EFGH5678/roles/1' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'

Pessoas

Cadastro civil central, tipos de pessoa e endereço associado.

5 operações
POST/api/peopleCriar pessoaADMIN

Criar pessoa

Exige o papel ADMIN.

Autorização
ADMIN
Requisição
PersonDtos.Request
Content-Type
application/json
Resposta
PersonDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "address": {
    "postalCode": "83252000",
    "street": "RUA JOÃO TEIXEIRA",
    "streetNumber": "1257",
    "addressLine2": "CASA 2",
    "district": "VILA BELA",
    "city": "PARANAGUÁ",
    "stateCode": "PR",
    "countryCode": "BR"
  },
  "fullName": "Maria da Silva",
  "taxId": "12345678901",
  "contactEmail": "maria@example.com",
  "phoneNumber": "41987654321",
  "birthDate": "2005-01-25",
  "gender": "F",
  "status": "ACTIVE",
  "personTypes": [
    "LEARNER"
  ]
}
Campos e validações
  • address — obrigatório; postalCode possui 8 dígitos e UF/país possuem 2 letras
  • taxId — exatamente 11 dígitos
  • phoneNumber — DDD + telefone sem formatação, com 10 ou 11 dígitos
  • birthDate — data ISO anterior à data atual
  • status — ACTIVE, INACTIVE ou SUSPENDED
  • personTypes — ADMIN, INSTRUCTOR, LEARNER, EMPLOYER_MANAGER e/ou GUARDIAN; pode ser omitido
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/people' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "address": {
    "postalCode": "83252000",
    "street": "RUA JOÃO TEIXEIRA",
    "streetNumber": "1257",
    "addressLine2": "CASA 2",
    "district": "VILA BELA",
    "city": "PARANAGUÁ",
    "stateCode": "PR",
    "countryCode": "BR"
  },
  "fullName": "Maria da Silva",
  "taxId": "12345678901",
  "contactEmail": "maria@example.com",
  "phoneNumber": "41987654321",
  "birthDate": "2005-01-25",
  "gender": "F",
  "status": "ACTIVE",
  "personTypes": [
    "LEARNER"
  ]
}'
GET/api/people/{id}Consultar pessoaADMIN

Consultar pessoa

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
PersonDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/people/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/peopleListar pessoasADMIN

Listar pessoas

Exige o papel ADMIN.

Query parameters

  • page — índice baseado em zero (padrão: 0)
  • size — entre 1 e 100 (padrão: 20)
  • personType — ADMIN, INSTRUCTOR, LEARNER, EMPLOYER_MANAGER ou GUARDIAN
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
PageResponse<PersonDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/people?personType=LEARNER&page=0&size=20' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
PUT/api/people/{id}Atualizar pessoaADMIN

Atualizar pessoa

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
PersonDtos.Request
Content-Type
application/json
Resposta
PersonDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "address": {
    "postalCode": "83252000",
    "street": "RUA JOÃO TEIXEIRA",
    "streetNumber": "1257",
    "addressLine2": "CASA 2",
    "district": "VILA BELA",
    "city": "PARANAGUÁ",
    "stateCode": "PR",
    "countryCode": "BR"
  },
  "fullName": "Maria da Silva",
  "taxId": "12345678901",
  "contactEmail": "maria@example.com",
  "phoneNumber": "41987654321",
  "birthDate": "2005-01-25",
  "gender": "F",
  "status": "ACTIVE",
  "personTypes": [
    "LEARNER"
  ]
}
Campos e validações
  • address — obrigatório; postalCode possui 8 dígitos e UF/país possuem 2 letras
  • taxId — exatamente 11 dígitos
  • phoneNumber — DDD + telefone sem formatação, com 10 ou 11 dígitos
  • birthDate — data ISO anterior à data atual
  • status — ACTIVE, INACTIVE ou SUSPENDED
  • personTypes — ADMIN, INSTRUCTOR, LEARNER, EMPLOYER_MANAGER e/ou GUARDIAN; pode ser omitido
Exemplo com curl
bash
curl --request PUT \
  --url 'http://localhost:8080/api/people/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "address": {
    "postalCode": "83252000",
    "street": "RUA JOÃO TEIXEIRA",
    "streetNumber": "1257",
    "addressLine2": "CASA 2",
    "district": "VILA BELA",
    "city": "PARANAGUÁ",
    "stateCode": "PR",
    "countryCode": "BR"
  },
  "fullName": "Maria da Silva",
  "taxId": "12345678901",
  "contactEmail": "maria@example.com",
  "phoneNumber": "41987654321",
  "birthDate": "2005-01-25",
  "gender": "F",
  "status": "ACTIVE",
  "personTypes": [
    "LEARNER"
  ]
}'
DELETE/api/people/{id}Excluir pessoaADMIN

Excluir pessoa

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/people/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'

Organizações e vínculos

Organizações podem atuar como empresas, escolas ou ambos; vínculos ligam pessoas a cada organização.

10 operações
POST/api/organizationsCriar organizaçãoADMIN

Criar organização

Exige o papel ADMIN.

Autorização
ADMIN
Requisição
OrganizationDtos.Request
Content-Type
application/json
Resposta
OrganizationDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "parentOrganizationId": null,
  "address": {
    "postalCode": "83252000",
    "street": "RUA JOÃO TEIXEIRA",
    "streetNumber": "1257",
    "addressLine2": "CASA 2",
    "district": "VILA BELA",
    "city": "PARANAGUÁ",
    "stateCode": "PR",
    "countryCode": "BR"
  },
  "organizationTypes": [
    "EMPLOYER",
    "SCHOOL"
  ],
  "legalName": "EMPRESA EXEMPLO LTDA.",
  "tradeName": "EMPRESA EXEMPLO",
  "taxId": "12345678000195",
  "contactEmail": "contato@empresa.example",
  "phoneNumber": "4134567890",
  "attendanceClosingDay": 25,
  "status": "ACTIVE"
}
Campos e validações
  • organizationTypes — obrigatório, ao menos um de EMPLOYER e/ou SCHOOL; envie como array no POST e no PUT
  • Ao editar, tipos já usados por contratos não podem ser removidos; outros podem ser adicionados
  • taxId — sem formatação: 12 letras de A a Z e/ou números, seguidos de 2 dígitos; CNPJs numéricos continuam válidos
  • Letras do CNPJ são normalizadas para maiúsculas; duplicidade e vínculos de contratos usam o valor normalizado
  • attendanceClosingDay — opcional, entre 1 e 31
  • status — ACTIVE, INACTIVE ou SUSPENDED
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/organizations' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "parentOrganizationId": null,
  "address": {
    "postalCode": "83252000",
    "street": "RUA JOÃO TEIXEIRA",
    "streetNumber": "1257",
    "addressLine2": "CASA 2",
    "district": "VILA BELA",
    "city": "PARANAGUÁ",
    "stateCode": "PR",
    "countryCode": "BR"
  },
  "organizationTypes": [
    "EMPLOYER",
    "SCHOOL"
  ],
  "legalName": "EMPRESA EXEMPLO LTDA.",
  "tradeName": "EMPRESA EXEMPLO",
  "taxId": "12345678000195",
  "contactEmail": "contato@empresa.example",
  "phoneNumber": "4134567890",
  "attendanceClosingDay": 25,
  "status": "ACTIVE"
}'
GET/api/organizations/{id}Consultar organizaçãoContextual

Consultar organização

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
OrganizationDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/organizations/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/organizationsListar organizaçõesADMIN

Listar organizações

Exige o papel ADMIN.

Query parameters

  • page — índice baseado em zero (padrão: 0)
  • size — entre 1 e 100 (padrão: 20)
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
PageResponse<OrganizationDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/organizations?page=0&size=20' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
PUT/api/organizations/{id}Atualizar organizaçãoADMIN

Atualizar organização

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
OrganizationDtos.Request
Content-Type
application/json
Resposta
OrganizationDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "parentOrganizationId": null,
  "address": {
    "postalCode": "83252000",
    "street": "RUA JOÃO TEIXEIRA",
    "streetNumber": "1257",
    "addressLine2": "CASA 2",
    "district": "VILA BELA",
    "city": "PARANAGUÁ",
    "stateCode": "PR",
    "countryCode": "BR"
  },
  "organizationTypes": [
    "EMPLOYER",
    "SCHOOL"
  ],
  "legalName": "EMPRESA EXEMPLO LTDA.",
  "tradeName": "EMPRESA EXEMPLO",
  "taxId": "12345678000195",
  "contactEmail": "contato@empresa.example",
  "phoneNumber": "4134567890",
  "attendanceClosingDay": 25,
  "status": "ACTIVE"
}
Campos e validações
  • organizationTypes — obrigatório, ao menos um de EMPLOYER e/ou SCHOOL; envie como array no POST e no PUT
  • Ao editar, tipos já usados por contratos não podem ser removidos; outros podem ser adicionados
  • taxId — sem formatação: 12 letras de A a Z e/ou números, seguidos de 2 dígitos; CNPJs numéricos continuam válidos
  • Letras do CNPJ são normalizadas para maiúsculas; duplicidade e vínculos de contratos usam o valor normalizado
  • attendanceClosingDay — opcional, entre 1 e 31
  • status — ACTIVE, INACTIVE ou SUSPENDED
Exemplo com curl
bash
curl --request PUT \
  --url 'http://localhost:8080/api/organizations/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "parentOrganizationId": null,
  "address": {
    "postalCode": "83252000",
    "street": "RUA JOÃO TEIXEIRA",
    "streetNumber": "1257",
    "addressLine2": "CASA 2",
    "district": "VILA BELA",
    "city": "PARANAGUÁ",
    "stateCode": "PR",
    "countryCode": "BR"
  },
  "organizationTypes": [
    "EMPLOYER",
    "SCHOOL"
  ],
  "legalName": "EMPRESA EXEMPLO LTDA.",
  "tradeName": "EMPRESA EXEMPLO",
  "taxId": "12345678000195",
  "contactEmail": "contato@empresa.example",
  "phoneNumber": "4134567890",
  "attendanceClosingDay": 25,
  "status": "ACTIVE"
}'
DELETE/api/organizations/{id}Excluir organizaçãoADMIN

Excluir organização

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/organizations/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
POST/api/organization-membershipsCriar vínculo organizacionalADMIN

Criar vínculo organizacional

Exige o papel ADMIN.

Autorização
ADMIN
Requisição
OrganizationMembershipDtos.Request
Content-Type
application/json
Resposta
OrganizationMembershipDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "personId": "01K5X3M8Y7ABCD1234EFGH5678",
  "organizationId": "01K5X3M8Y7ABCD1234EFGH5681",
  "membershipRole": "EMPLOYER_MANAGER",
  "jobTitle": "Gestora de pessoas",
  "startDate": "2026-01-15",
  "endDate": null,
  "status": "ACTIVE"
}
Campos e validações
  • membershipRole — obrigatório, máximo de 40 caracteres
  • startDate/endDate — datas ISO; endDate é opcional
  • status — ACTIVE, INACTIVE ou SUSPENDED
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/organization-memberships' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "personId": "01K5X3M8Y7ABCD1234EFGH5678",
  "organizationId": "01K5X3M8Y7ABCD1234EFGH5681",
  "membershipRole": "EMPLOYER_MANAGER",
  "jobTitle": "Gestora de pessoas",
  "startDate": "2026-01-15",
  "endDate": null,
  "status": "ACTIVE"
}'
GET/api/organization-memberships/{id}Consultar vínculo organizacionalADMIN

Consultar vínculo organizacional

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
OrganizationMembershipDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/organization-memberships/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/organization-membershipsListar vínculos organizacionaisADMIN

Listar vínculos organizacionais

Exige o papel ADMIN.

Query parameters

  • page — índice baseado em zero (padrão: 0)
  • size — entre 1 e 100 (padrão: 20)
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
PageResponse<OrganizationMembershipDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/organization-memberships?page=0&size=20' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
PUT/api/organization-memberships/{id}Atualizar vínculo organizacionalADMIN

Atualizar vínculo organizacional

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
OrganizationMembershipDtos.Request
Content-Type
application/json
Resposta
OrganizationMembershipDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "personId": "01K5X3M8Y7ABCD1234EFGH5678",
  "organizationId": "01K5X3M8Y7ABCD1234EFGH5681",
  "membershipRole": "EMPLOYER_MANAGER",
  "jobTitle": "Gestora de pessoas",
  "startDate": "2026-01-15",
  "endDate": null,
  "status": "ACTIVE"
}
Campos e validações
  • membershipRole — obrigatório, máximo de 40 caracteres
  • startDate/endDate — datas ISO; endDate é opcional
  • status — ACTIVE, INACTIVE ou SUSPENDED
Exemplo com curl
bash
curl --request PUT \
  --url 'http://localhost:8080/api/organization-memberships/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "personId": "01K5X3M8Y7ABCD1234EFGH5678",
  "organizationId": "01K5X3M8Y7ABCD1234EFGH5681",
  "membershipRole": "EMPLOYER_MANAGER",
  "jobTitle": "Gestora de pessoas",
  "startDate": "2026-01-15",
  "endDate": null,
  "status": "ACTIVE"
}'
DELETE/api/organization-memberships/{id}Excluir vínculo organizacionalADMIN

Excluir vínculo organizacional

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/organization-memberships/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'

Aprendizes e responsáveis

Perfil pedagógico do aprendiz, onboarding atômico e responsáveis legais.

9 operações
GET/api/learners/{id}Consultar aprendizContextual

Consultar aprendiz

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Inclui fullName e registrationNumber para identificação do aprendiz dentro do contexto autorizado.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
LearnerDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/learners/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/learnersListar aprendizesADMIN

Listar aprendizes

Exige o papel ADMIN.

Query parameters

  • page — índice baseado em zero (padrão: 0)
  • size — entre 1 e 100 (padrão: 20)
  • personId — filtro opcional
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
PageResponse<LearnerDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/learners?personId=01K5X3M8Y7ABCD1234EFGH5678&page=0&size=20' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
PUT/api/learners/{id}Atualizar aprendizADMIN

Atualizar aprendiz

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
LearnerDtos.Request
Content-Type
application/json
Resposta
LearnerDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "personId": "01K5X3M8Y7ABCD1234EFGH5678",
  "hasCompletedHighSchool": false,
  "status": "ACTIVE"
}
Campos e validações
  • personId — deve apontar para pessoa com personType LEARNER
  • registrationNumber — gerado pelo banco na criação; não é enviado nem alterado nas requisições
  • status — ACTIVE, INACTIVE ou SUSPENDED
Exemplo com curl
bash
curl --request PUT \
  --url 'http://localhost:8080/api/learners/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "personId": "01K5X3M8Y7ABCD1234EFGH5678",
  "hasCompletedHighSchool": false,
  "status": "ACTIVE"
}'
DELETE/api/learners/{id}Excluir aprendizADMIN

Excluir aprendiz

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/learners/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
POST/api/learner-onboardingsCadastrar pessoa e perfil de aprendizADMIN

Cadastrar pessoa e perfil de aprendiz

Exige o papel ADMIN.

Executa o onboarding completo em uma única transação.

Autorização
ADMIN
Requisição
LearnerOnboardingDtos.Request
Content-Type
application/json
Resposta
LearnerOnboardingDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "person": {
    "address": {
      "postalCode": "83252000",
      "street": "RUA JOÃO TEIXEIRA",
      "streetNumber": "1257",
      "addressLine2": "CASA 2",
      "district": "VILA BELA",
      "city": "PARANAGUÁ",
      "stateCode": "PR",
      "countryCode": "BR"
    },
    "fullName": "Maria da Silva",
    "taxId": "12345678901",
    "contactEmail": "maria@example.com",
    "phoneNumber": "41987654321",
    "birthDate": "2005-01-25",
    "gender": "F",
    "status": "ACTIVE",
    "personTypes": [
      "LEARNER"
    ]
  },
  "learner": {
    "hasCompletedHighSchool": false,
    "status": "ACTIVE"
  },
  "guardians": [
    {
      "guardianPersonId": "01K5X3M8Y7ABCD1234EFGH5688",
      "relationshipType": "MOTHER",
      "legalGuardian": true,
      "primaryContact": true
    }
  ]
}
Campos e validações
  • person.personTypes — deve incluir LEARNER
  • learner.registrationNumber — gerado pelo banco e retornado na resposta
  • guardians — obrigatório, aceita até 10 itens e pode ser [] quando as regras de idade permitirem
  • menor de 18 anos — exige ao menos um responsável legal adulto com personType GUARDIAN
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/learner-onboardings' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "person": {
    "address": {
      "postalCode": "83252000",
      "street": "RUA JOÃO TEIXEIRA",
      "streetNumber": "1257",
      "addressLine2": "CASA 2",
      "district": "VILA BELA",
      "city": "PARANAGUÁ",
      "stateCode": "PR",
      "countryCode": "BR"
    },
    "fullName": "Maria da Silva",
    "taxId": "12345678901",
    "contactEmail": "maria@example.com",
    "phoneNumber": "41987654321",
    "birthDate": "2005-01-25",
    "gender": "F",
    "status": "ACTIVE",
    "personTypes": [
      "LEARNER"
    ]
  },
  "learner": {
    "hasCompletedHighSchool": false,
    "status": "ACTIVE"
  },
  "guardians": [
    {
      "guardianPersonId": "01K5X3M8Y7ABCD1234EFGH5688",
      "relationshipType": "MOTHER",
      "legalGuardian": true,
      "primaryContact": true
    }
  ]
}'
POST/api/learners/{learnerId}/guardiansVincular responsávelADMIN

Vincular responsável

Exige o papel ADMIN.

Parâmetros de rota

  • learnerId (ULID) — ULID do aprendiz
Autorização
ADMIN
Requisição
LearnerGuardianDtos.Request
Content-Type
application/json
Resposta
LearnerGuardianDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "guardianPersonId": "01K5X3M8Y7ABCD1234EFGH5688",
  "relationshipType": "MOTHER",
  "legalGuardian": true,
  "primaryContact": true
}
Campos e validações
  • guardianPersonId — pessoa adulta com personType GUARDIAN
  • relationshipType — obrigatório, máximo de 30 caracteres
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/learners/01K5X3M8Y7ABCD1234EFGH5678/guardians' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "guardianPersonId": "01K5X3M8Y7ABCD1234EFGH5688",
  "relationshipType": "MOTHER",
  "legalGuardian": true,
  "primaryContact": true
}'
GET/api/learners/{learnerId}/guardiansListar responsáveisADMIN

Listar responsáveis

Exige o papel ADMIN.

Parâmetros de rota

  • learnerId (ULID) — ULID do aprendiz
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
List<LearnerGuardianDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/learners/01K5X3M8Y7ABCD1234EFGH5678/guardians' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
PUT/api/learners/{learnerId}/guardians/{guardianPersonId}Atualizar vínculo do responsávelADMIN

Atualizar vínculo do responsável

Exige o papel ADMIN.

Parâmetros de rota

  • learnerId (ULID) — ULID do aprendiz
  • guardianPersonId (ULID) — ULID da pessoa responsável
Autorização
ADMIN
Requisição
LearnerGuardianDtos.Request
Content-Type
application/json
Resposta
LearnerGuardianDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "guardianPersonId": "01K5X3M8Y7ABCD1234EFGH5688",
  "relationshipType": "MOTHER",
  "legalGuardian": true,
  "primaryContact": true
}
Campos e validações
  • guardianPersonId — pessoa adulta com personType GUARDIAN
  • relationshipType — obrigatório, máximo de 30 caracteres
Exemplo com curl
bash
curl --request PUT \
  --url 'http://localhost:8080/api/learners/01K5X3M8Y7ABCD1234EFGH5678/guardians/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "guardianPersonId": "01K5X3M8Y7ABCD1234EFGH5688",
  "relationshipType": "MOTHER",
  "legalGuardian": true,
  "primaryContact": true
}'
DELETE/api/learners/{learnerId}/guardians/{guardianPersonId}Desvincular responsávelADMIN

Desvincular responsável

Exige o papel ADMIN.

Parâmetros de rota

  • learnerId (ULID) — ULID do aprendiz
  • guardianPersonId (ULID) — ULID da pessoa responsável
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/learners/01K5X3M8Y7ABCD1234EFGH5678/guardians/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'

Contratos

Contrato de aprendizagem, empresa empregadora, escola, carga horária e documentos versionados.

13 operações
POST/api/contractsCriar contratoADMIN

Criar contrato

Exige o papel ADMIN.

Autorização
ADMIN
Requisição
ContractDtos.Request
Content-Type
application/json
Resposta
ContractDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "learnerId": "01K5X3M8Y7ABCD1234EFGH5680",
  "employerId": "01K5X3M8Y7ABCD1234EFGH5681",
  "schoolId": null,
  "startDate": "2026-02-02",
  "endDate": "2027-01-31",
  "monthlySalary": 1518,
  "weeklyWorkloadMinutes": 1800,
  "status": "DRAFT",
  "statusReason": null
}
Campos e validações
  • monthlySalary — maior que zero
  • weeklyWorkloadMinutes — entre 1 e 10080; aulas online exigem 1800
  • status — DRAFT, ACTIVE, SUSPENDED, ENDED ou CANCELLED; novos contratos nascem DRAFT
  • statusReason — até 500 caracteres, exigido em determinadas transições
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/contracts' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "learnerId": "01K5X3M8Y7ABCD1234EFGH5680",
  "employerId": "01K5X3M8Y7ABCD1234EFGH5681",
  "schoolId": null,
  "startDate": "2026-02-02",
  "endDate": "2027-01-31",
  "monthlySalary": 1518,
  "weeklyWorkloadMinutes": 1800,
  "status": "DRAFT",
  "statusReason": null
}'
GET/api/contracts/{id}Consultar contratoContextual

Consultar contrato

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
ContractDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/contracts/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/contractsListar contratosADMIN

Listar contratos

Exige o papel ADMIN.

Query parameters

  • page — índice baseado em zero (padrão: 0)
  • size — entre 1 e 100 (padrão: 20)
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
PageResponse<ContractDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/contracts?page=0&size=20' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
PUT/api/contracts/{id}Atualizar contratoADMIN

Atualizar contrato

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
ContractDtos.Request
Content-Type
application/json
Resposta
ContractDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "learnerId": "01K5X3M8Y7ABCD1234EFGH5680",
  "employerId": "01K5X3M8Y7ABCD1234EFGH5681",
  "schoolId": null,
  "startDate": "2026-02-02",
  "endDate": "2027-01-31",
  "monthlySalary": 1518,
  "weeklyWorkloadMinutes": 1800,
  "status": "DRAFT",
  "statusReason": null
}
Campos e validações
  • monthlySalary — maior que zero
  • weeklyWorkloadMinutes — entre 1 e 10080; aulas online exigem 1800
  • status — DRAFT, ACTIVE, SUSPENDED, ENDED ou CANCELLED; novos contratos nascem DRAFT
  • statusReason — até 500 caracteres, exigido em determinadas transições
Exemplo com curl
bash
curl --request PUT \
  --url 'http://localhost:8080/api/contracts/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "learnerId": "01K5X3M8Y7ABCD1234EFGH5680",
  "employerId": "01K5X3M8Y7ABCD1234EFGH5681",
  "schoolId": null,
  "startDate": "2026-02-02",
  "endDate": "2027-01-31",
  "monthlySalary": 1518,
  "weeklyWorkloadMinutes": 1800,
  "status": "DRAFT",
  "statusReason": null
}'
DELETE/api/contracts/{id}Excluir contratoADMIN

Excluir contrato

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/contracts/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/contracts/learner/{learnerId}Listar contratos do aprendizContextual

Listar contratos do aprendiz

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • learnerId (ULID) — ULID do aprendiz
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
List<ContractDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/contracts/learner/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/contracts/organization/{organizationId}Listar contratos da organizaçãoContextual

Listar contratos da organização

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • organizationId (ULID) — ULID da organização
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
List<ContractDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/contracts/organization/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
POST/api/contract-documentsEnviar documento contratualADMIN

Enviar documento contratual

Exige o papel ADMIN.

Autorização
ADMIN
Requisição
metadata: ContractDocumentDtos.Request + file: binário
Content-Type
multipart/form-data
Resposta
ContractDocumentDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typemultipart/form-data; boundary=<automático>obrigatórioDeixe o cliente HTTP gerar o boundary; no curl, use --form.
Payload esperado
{
  "contractId": "01K5X3M8Y7ABCD1234EFGH5683",
  "documentTypeId": 1,
  "versionNumber": 1,
  "current": true
}
Partes multipart
  • metadata (application/json) — obrigatório. ContractDocumentDtos.Request serializado em JSON
  • file (tipo MIME do arquivo) — obrigatório. Documento contratual; tamanho e extensões seguem a política de upload
Campos e validações
  • versionNumber — inteiro igual ou maior que 1
  • metadata deve ser enviado como uma parte application/json, não como texto comum
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/contract-documents' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --form 'metadata={"contractId":"01K5X3M8Y7ABCD1234EFGH5683","documentTypeId":1,"versionNumber":1,"current":true};type=application/json' \
  --form 'file=@/caminho/arquivo.pdf'
GET/api/contract-documents/{id}Consultar metadados do documentoADMIN

Consultar metadados do documento

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
ContractDocumentDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/contract-documents/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/contract-documents/{id}/contentBaixar documento contratualADMIN

Baixar documento contratual

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
Resource (binário)

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/octet-streamopcionalO tipo real do arquivo também pode ser negociado.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/contract-documents/01K5X3M8Y7ABCD1234EFGH5678/content' \
  --header 'Accept: application/octet-stream' \
  --header 'Authorization: Bearer <access_token>'
GET/api/contract-documentsListar documentos contratuaisADMIN

Listar documentos contratuais

Exige o papel ADMIN.

Query parameters

  • page — índice baseado em zero (padrão: 0)
  • size — entre 1 e 100 (padrão: 20)
  • contractId — filtro opcional
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
PageResponse<ContractDocumentDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/contract-documents?page=0&size=20' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
PUT/api/contract-documents/{id}Atualizar metadados do documentoADMIN

Atualizar metadados do documento

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
ContractDocumentDtos.Request
Content-Type
application/json
Resposta
ContractDocumentDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "contractId": "01K5X3M8Y7ABCD1234EFGH5683",
  "documentTypeId": 1,
  "versionNumber": 2,
  "current": true
}
Campos e validações
  • versionNumber — inteiro igual ou maior que 1
Exemplo com curl
bash
curl --request PUT \
  --url 'http://localhost:8080/api/contract-documents/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "contractId": "01K5X3M8Y7ABCD1234EFGH5683",
  "documentTypeId": 1,
  "versionNumber": 2,
  "current": true
}'
DELETE/api/contract-documents/{id}Excluir documento contratualADMIN

Excluir documento contratual

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/contract-documents/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'

Documentos de pessoa

Catálogo de tipos, uploads, verificação, validade e histórico de status documental.

11 operações
POST/api/document-typesCriar tipo de documentoADMIN

Criar tipo de documento

Exige o papel ADMIN.

Autorização
ADMIN
Requisição
DocumentTypeDtos.Request
Content-Type
application/json
Resposta
DocumentTypeDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "code": "IDENTITY_DOCUMENT",
  "name": "Documento de identidade",
  "description": "Documento oficial com foto",
  "scope": "PERSON"
}
Campos e validações
  • code — começa com letra e contém apenas letras, números e underscore; máximo de 50 caracteres
  • scope — PERSON, CONTRACT ou BOTH
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/document-types' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "code": "IDENTITY_DOCUMENT",
  "name": "Documento de identidade",
  "description": "Documento oficial com foto",
  "scope": "PERSON"
}'
GET/api/document-types/{id: short}Consultar tipo de documentoADMIN

Consultar tipo de documento

Exige o papel ADMIN.

Parâmetros de rota

  • id (short) — Identificador numérico do catálogo
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
DocumentTypeDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/document-types/1' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/document-typesListar tipos de documentoADMIN

Listar tipos de documento

Exige o papel ADMIN.

Query parameters

  • page — índice baseado em zero (padrão: 0)
  • size — entre 1 e 100 (padrão: 20)
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
PageResponse<DocumentTypeDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/document-types?page=0&size=20' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
PUT/api/document-types/{id: short}Atualizar tipo de documentoADMIN

Atualizar tipo de documento

Exige o papel ADMIN.

Parâmetros de rota

  • id (short) — Identificador numérico do catálogo
Autorização
ADMIN
Requisição
DocumentTypeDtos.Request
Content-Type
application/json
Resposta
DocumentTypeDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "code": "IDENTITY_DOCUMENT",
  "name": "Documento de identidade",
  "description": "Documento oficial com foto",
  "scope": "PERSON"
}
Campos e validações
  • code — começa com letra e contém apenas letras, números e underscore; máximo de 50 caracteres
  • scope — PERSON, CONTRACT ou BOTH
Exemplo com curl
bash
curl --request PUT \
  --url 'http://localhost:8080/api/document-types/1' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "code": "IDENTITY_DOCUMENT",
  "name": "Documento de identidade",
  "description": "Documento oficial com foto",
  "scope": "PERSON"
}'
DELETE/api/document-types/{id: short}Excluir tipo de documentoADMIN

Excluir tipo de documento

Exige o papel ADMIN.

Parâmetros de rota

  • id (short) — Identificador numérico do catálogo
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/document-types/1' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
POST/api/person-documentsEnviar documento de pessoaADMIN

Enviar documento de pessoa

Exige o papel ADMIN.

Autorização
ADMIN
Requisição
metadata: PersonDocumentDtos.Request + file: binário
Content-Type
multipart/form-data
Resposta
PersonDocumentDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typemultipart/form-data; boundary=<automático>obrigatórioDeixe o cliente HTTP gerar o boundary; no curl, use --form.
Payload esperado
{
  "personId": "01K5X3M8Y7ABCD1234EFGH5678",
  "documentTypeId": 1,
  "documentNumber": "123456789",
  "issuedOn": "2024-01-10",
  "expiresOn": "2034-01-10"
}
Partes multipart
  • metadata (application/json) — obrigatório. PersonDocumentDtos.Request serializado em JSON
  • file (tipo MIME do arquivo) — obrigatório. Documento da pessoa; tamanho e extensões seguem a política de upload
Campos e validações
  • documentNumber — opcional, máximo de 80 caracteres
  • issuedOn/expiresOn — datas ISO opcionais
  • metadata deve ser enviado como uma parte application/json
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/person-documents' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --form 'metadata={"personId":"01K5X3M8Y7ABCD1234EFGH5678","documentTypeId":1,"documentNumber":"123456789","issuedOn":"2024-01-10","expiresOn":"2034-01-10"};type=application/json' \
  --form 'file=@/caminho/arquivo.pdf'
GET/api/person-documents/{id}Consultar metadados do documentoADMIN

Consultar metadados do documento

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
PersonDocumentDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/person-documents/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/person-documents/{id}/contentBaixar documento de pessoaADMIN

Baixar documento de pessoa

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
Resource (binário)

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/octet-streamopcionalO tipo real do arquivo também pode ser negociado.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/person-documents/01K5X3M8Y7ABCD1234EFGH5678/content' \
  --header 'Accept: application/octet-stream' \
  --header 'Authorization: Bearer <access_token>'
GET/api/person-documentsListar documentos de pessoaADMIN

Listar documentos de pessoa

Exige o papel ADMIN.

Query parameters

  • page — índice baseado em zero (padrão: 0)
  • size — entre 1 e 100 (padrão: 20)
  • personId — filtro opcional
  • verificationStatus — filtro opcional
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
PageResponse<PersonDocumentDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/person-documents?personId=01K5X3M8Y7ABCD1234EFGH5678&verificationStatus=VERIFIED&page=0&size=20' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
PUT/api/person-documents/{id}Atualizar e verificar documentoADMIN

Atualizar e verificar documento

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
PersonDocumentDtos.Request
Content-Type
application/json
Resposta
PersonDocumentDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "personId": "01K5X3M8Y7ABCD1234EFGH5678",
  "documentTypeId": 1,
  "documentNumber": "123456789",
  "issuedOn": "2024-01-10",
  "expiresOn": "2034-01-10"
}
Campos e validações
  • documentNumber — opcional, máximo de 80 caracteres
  • issuedOn/expiresOn — datas ISO opcionais
Exemplo com curl
bash
curl --request PUT \
  --url 'http://localhost:8080/api/person-documents/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "personId": "01K5X3M8Y7ABCD1234EFGH5678",
  "documentTypeId": 1,
  "documentNumber": "123456789",
  "issuedOn": "2024-01-10",
  "expiresOn": "2034-01-10"
}'
DELETE/api/person-documents/{id}Excluir documento de pessoaADMIN

Excluir documento de pessoa

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/person-documents/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'

Turmas e matrículas

Planejamento das turmas e vínculo temporal entre contrato e turma.

10 operações
POST/api/cohortsCriar turmaADMIN

Criar turma

Exige o papel ADMIN.

Autorização
ADMIN
Requisição
CohortDtos.Request
Content-Type
application/json
Resposta
CohortDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "code": "TURMA-2026-A",
  "name": "Aprendizagem 2026 — Turma A",
  "defaultWeekday": 2,
  "shiftCode": "AFTERNOON",
  "startDate": "2026-02-02",
  "endDate": "2026-12-18",
  "maxLearners": 30,
  "status": "PLANNED",
  "statusReason": null
}
Campos e validações
  • defaultWeekday — entre 1 e 7
  • maxLearners — opcional e maior ou igual a 1
  • status — PLANNED, ACTIVE, COMPLETED ou CANCELLED
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/cohorts' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "code": "TURMA-2026-A",
  "name": "Aprendizagem 2026 — Turma A",
  "defaultWeekday": 2,
  "shiftCode": "AFTERNOON",
  "startDate": "2026-02-02",
  "endDate": "2026-12-18",
  "maxLearners": 30,
  "status": "PLANNED",
  "statusReason": null
}'
GET/api/cohorts/{id}Consultar turmaADMIN

Consultar turma

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
CohortDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/cohorts/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/cohortsListar turmasADMIN

Listar turmas

Exige o papel ADMIN.

Query parameters

  • page — índice baseado em zero (padrão: 0)
  • size — entre 1 e 100 (padrão: 20)
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
PageResponse<CohortDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/cohorts?page=0&size=20' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
PUT/api/cohorts/{id}Atualizar turmaADMIN

Atualizar turma

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
CohortDtos.Request
Content-Type
application/json
Resposta
CohortDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "code": "TURMA-2026-A",
  "name": "Aprendizagem 2026 — Turma A",
  "defaultWeekday": 2,
  "shiftCode": "AFTERNOON",
  "startDate": "2026-02-02",
  "endDate": "2026-12-18",
  "maxLearners": 30,
  "status": "PLANNED",
  "statusReason": null
}
Campos e validações
  • defaultWeekday — entre 1 e 7
  • maxLearners — opcional e maior ou igual a 1
  • status — PLANNED, ACTIVE, COMPLETED ou CANCELLED
Exemplo com curl
bash
curl --request PUT \
  --url 'http://localhost:8080/api/cohorts/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "code": "TURMA-2026-A",
  "name": "Aprendizagem 2026 — Turma A",
  "defaultWeekday": 2,
  "shiftCode": "AFTERNOON",
  "startDate": "2026-02-02",
  "endDate": "2026-12-18",
  "maxLearners": 30,
  "status": "PLANNED",
  "statusReason": null
}'
DELETE/api/cohorts/{id}Excluir turmaADMIN

Excluir turma

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/cohorts/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
POST/api/cohort-enrollmentsCriar matrículaADMIN

Criar matrícula

Exige o papel ADMIN.

Autorização
ADMIN
Requisição
CohortEnrollmentDtos.Request
Content-Type
application/json
Resposta
CohortEnrollmentDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "contractId": "01K5X3M8Y7ABCD1234EFGH5683",
  "cohortId": "01K5X3M8Y7ABCD1234EFGH5682",
  "startDate": "2026-02-02",
  "endDate": "2026-12-18",
  "status": "PENDING",
  "statusReason": null
}
Campos e validações
  • startDate/endDate — datas ISO dentro das vigências compatíveis
  • status — PENDING, ACTIVE, COMPLETED ou CANCELLED
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/cohort-enrollments' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "contractId": "01K5X3M8Y7ABCD1234EFGH5683",
  "cohortId": "01K5X3M8Y7ABCD1234EFGH5682",
  "startDate": "2026-02-02",
  "endDate": "2026-12-18",
  "status": "PENDING",
  "statusReason": null
}'
GET/api/cohort-enrollments/{id}Consultar matrículaADMIN

Consultar matrícula

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
CohortEnrollmentDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/cohort-enrollments/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/cohort-enrollmentsListar matrículasADMIN

Listar matrículas

Exige o papel ADMIN.

Query parameters

  • page — índice baseado em zero (padrão: 0)
  • size — entre 1 e 100 (padrão: 20)
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
PageResponse<CohortEnrollmentDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/cohort-enrollments?page=0&size=20' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
PUT/api/cohort-enrollments/{id}Atualizar matrículaADMIN

Atualizar matrícula

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
CohortEnrollmentDtos.Request
Content-Type
application/json
Resposta
CohortEnrollmentDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "contractId": "01K5X3M8Y7ABCD1234EFGH5683",
  "cohortId": "01K5X3M8Y7ABCD1234EFGH5682",
  "startDate": "2026-02-02",
  "endDate": "2026-12-18",
  "status": "PENDING",
  "statusReason": null
}
Campos e validações
  • startDate/endDate — datas ISO dentro das vigências compatíveis
  • status — PENDING, ACTIVE, COMPLETED ou CANCELLED
Exemplo com curl
bash
curl --request PUT \
  --url 'http://localhost:8080/api/cohort-enrollments/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "contractId": "01K5X3M8Y7ABCD1234EFGH5683",
  "cohortId": "01K5X3M8Y7ABCD1234EFGH5682",
  "startDate": "2026-02-02",
  "endDate": "2026-12-18",
  "status": "PENDING",
  "statusReason": null
}'
DELETE/api/cohort-enrollments/{id}Excluir matrículaADMIN

Excluir matrícula

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/cohort-enrollments/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'

Aulas e participantes

Agenda presencial/online, descrição, materiais, chamada esperada, conflitos de horário e remanejamento.

18 operações
POST/api/lessonsCriar aulaADMIN

Criar aula

Exige o papel ADMIN.

Autorização
ADMIN
Requisição
LessonDtos.Request
Content-Type
application/json
Resposta
LessonDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "cohortId": "01K5X3M8Y7ABCD1234EFGH5682",
  "instructorPersonId": "01K5X3M8Y7ABCD1234EFGH5678",
  "title": "Fundamentos de cidadania",
  "description": "Direitos, deveres e participação cidadã: objetivos e orientações da aula.",
  "startsAt": "2026-10-05T16:00:00Z",
  "endsAt": "2026-10-05T18:00:00Z",
  "deliveryMode": "ONLINE",
  "room": null,
  "meetingUrl": "https://meet.example.com/aula-01",
  "externalLessonUrl": null,
  "status": "SCHEDULED"
}
Campos e validações
  • description — obrigatória, até 5.000 caracteres
  • startsAt/endsAt — instantes ISO 8601; término posterior ao início
  • deliveryMode — ONSITE ou ONLINE
  • meetingUrl/externalLessonUrl — URL HTTP(S) opcional
  • status — SCHEDULED, IN_PROGRESS, COMPLETED ou CANCELLED
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/lessons' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "cohortId": "01K5X3M8Y7ABCD1234EFGH5682",
  "instructorPersonId": "01K5X3M8Y7ABCD1234EFGH5678",
  "title": "Fundamentos de cidadania",
  "description": "Direitos, deveres e participação cidadã: objetivos e orientações da aula.",
  "startsAt": "2026-10-05T16:00:00Z",
  "endsAt": "2026-10-05T18:00:00Z",
  "deliveryMode": "ONLINE",
  "room": null,
  "meetingUrl": "https://meet.example.com/aula-01",
  "externalLessonUrl": null,
  "status": "SCHEDULED"
}'
GET/api/lessons/{id}Consultar aulaContextual

Consultar aula

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Inclui description, cohortCode, cohortName e instructorName. Participantes incluem learnerName e learnerRegistrationNumber.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
LessonDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/lessons/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/lessonsListar aulasADMIN

Listar aulas

Exige o papel ADMIN.

Query parameters

  • page — índice baseado em zero (padrão: 0)
  • size — entre 1 e 100 (padrão: 20)
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
PageResponse<LessonDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/lessons?page=0&size=20' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/lessons/meListar aulas acessíveis ao atorAutenticado

Listar aulas acessíveis ao ator

Exige JWT válido, sem papel específico nesta rota.

Autorização
Autenticado
Requisição
Sem corpo
Content-Type
—
Resposta
List<LessonDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/lessons/me' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
PUT/api/lessons/{id}Atualizar aulaContextual

Atualizar aula

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
LessonDtos.Request
Content-Type
application/json
Resposta
LessonDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "cohortId": "01K5X3M8Y7ABCD1234EFGH5682",
  "instructorPersonId": "01K5X3M8Y7ABCD1234EFGH5678",
  "title": "Fundamentos de cidadania",
  "description": "Direitos, deveres e participação cidadã: objetivos e orientações da aula.",
  "startsAt": "2026-10-05T16:00:00Z",
  "endsAt": "2026-10-05T18:00:00Z",
  "deliveryMode": "ONLINE",
  "room": null,
  "meetingUrl": "https://meet.example.com/aula-01",
  "externalLessonUrl": null,
  "status": "SCHEDULED"
}
Campos e validações
  • description — obrigatória, até 5.000 caracteres
  • startsAt/endsAt — instantes ISO 8601; término posterior ao início
  • deliveryMode — ONSITE ou ONLINE
  • meetingUrl/externalLessonUrl — URL HTTP(S) opcional
  • status — SCHEDULED, IN_PROGRESS, COMPLETED ou CANCELLED
Exemplo com curl
bash
curl --request PUT \
  --url 'http://localhost:8080/api/lessons/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "cohortId": "01K5X3M8Y7ABCD1234EFGH5682",
  "instructorPersonId": "01K5X3M8Y7ABCD1234EFGH5678",
  "title": "Fundamentos de cidadania",
  "description": "Direitos, deveres e participação cidadã: objetivos e orientações da aula.",
  "startsAt": "2026-10-05T16:00:00Z",
  "endsAt": "2026-10-05T18:00:00Z",
  "deliveryMode": "ONLINE",
  "room": null,
  "meetingUrl": "https://meet.example.com/aula-01",
  "externalLessonUrl": null,
  "status": "SCHEDULED"
}'
DELETE/api/lessons/{id}Excluir aulaContextual

Excluir aula

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Somente aulas SCHEDULED sem participantes, atividades ou materiais podem ser removidas fisicamente.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/lessons/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
POST/api/lessons/{lessonId}/filesAnexar material à aulaContextual

Anexar material à aula

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

ADMIN ou instrutor da aula. Mesma política de tamanho, formatos e inspeção dos materiais de atividades.

Parâmetros de rota

  • lessonId (ULID) — ULID da aula
Autorização
Contextual
Requisição
metadata: LessonFileDtos.Request + file: binário
Content-Type
multipart/form-data
Resposta
LessonFileDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typemultipart/form-data; boundary=<automático>obrigatórioDeixe o cliente HTTP gerar o boundary; no curl, use --form.
Payload esperado
{
  "sortOrder": 0
}
Partes multipart
  • metadata (application/json) — obrigatório. LessonFileDtos.Request serializado em JSON
  • file (tipo MIME do arquivo) — obrigatório. Material da aula; tamanho e extensões seguem a política de materiais de atividades
Campos e validações
  • sortOrder — inteiro maior ou igual a zero
  • metadata deve ser enviado como uma parte application/json
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/lessons/01K5X3M8Y7ABCD1234EFGH5678/files' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --form 'metadata={"sortOrder":0};type=application/json' \
  --form 'file=@/caminho/arquivo.pdf'
GET/api/lessons/{lessonId}/files/{fileId}/contentBaixar material da aulaContextual

Baixar material da aula

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • lessonId (ULID) — ULID da aula
  • fileId (ULID) — ULID do arquivo
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
Resource (binário)

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/octet-streamopcionalO tipo real do arquivo também pode ser negociado.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/lessons/01K5X3M8Y7ABCD1234EFGH5678/files/01K5X3M8Y7ABCD1234EFGH5678/content' \
  --header 'Accept: application/octet-stream' \
  --header 'Authorization: Bearer <access_token>'
GET/api/lessons/{lessonId}/filesListar materiais da aulaContextual

Listar materiais da aula

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • lessonId (ULID) — ULID da aula
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
List<LessonFileDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/lessons/01K5X3M8Y7ABCD1234EFGH5678/files' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
DELETE/api/lessons/{lessonId}/files/{fileId}Remover material da aulaContextual

Remover material da aula

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • lessonId (ULID) — ULID da aula
  • fileId (ULID) — ULID do arquivo
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/lessons/01K5X3M8Y7ABCD1234EFGH5678/files/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
POST/api/lesson-participantsAdicionar participanteContextual

Adicionar participante

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Autorização
Contextual
Requisição
LessonParticipantDtos.Request
Content-Type
application/json
Resposta
LessonParticipantDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "lessonId": "01K5X3M8Y7ABCD1234EFGH5684",
  "learnerId": "01K5X3M8Y7ABCD1234EFGH5680",
  "sourceEnrollmentId": null,
  "participationType": "REGULAR",
  "status": "EXPECTED",
  "assignmentReason": null
}
Campos e validações
  • participationType — REGULAR, TRANSFERRED, MAKEUP ou EXTRA
  • status — EXPECTED ou CANCELLED
  • assignmentReason — opcional, máximo de 500 caracteres
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/lesson-participants' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "lessonId": "01K5X3M8Y7ABCD1234EFGH5684",
  "learnerId": "01K5X3M8Y7ABCD1234EFGH5680",
  "sourceEnrollmentId": null,
  "participationType": "REGULAR",
  "status": "EXPECTED",
  "assignmentReason": null
}'
GET/api/lesson-participants/{id}Consultar participanteContextual

Consultar participante

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
LessonParticipantDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/lesson-participants/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/lesson-participantsListar todos os participantesADMIN

Listar todos os participantes

Exige o papel ADMIN.

Query parameters

  • page — índice baseado em zero (padrão: 0)
  • size — entre 1 e 100 (padrão: 20)
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
PageResponse<LessonParticipantDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/lesson-participants?page=0&size=20' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/lesson-participants/lesson/{lessonId}Obter chamada da aulaContextual

Obter chamada da aula

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • lessonId (ULID) — ULID da aula
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
List<LessonParticipantDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/lesson-participants/lesson/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
PUT/api/lesson-participants/{id}Atualizar participanteContextual

Atualizar participante

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
LessonParticipantDtos.Request
Content-Type
application/json
Resposta
LessonParticipantDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "lessonId": "01K5X3M8Y7ABCD1234EFGH5684",
  "learnerId": "01K5X3M8Y7ABCD1234EFGH5680",
  "sourceEnrollmentId": null,
  "participationType": "REGULAR",
  "status": "EXPECTED",
  "assignmentReason": null
}
Campos e validações
  • participationType — REGULAR, TRANSFERRED, MAKEUP ou EXTRA
  • status — EXPECTED ou CANCELLED
  • assignmentReason — opcional, máximo de 500 caracteres
Exemplo com curl
bash
curl --request PUT \
  --url 'http://localhost:8080/api/lesson-participants/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "lessonId": "01K5X3M8Y7ABCD1234EFGH5684",
  "learnerId": "01K5X3M8Y7ABCD1234EFGH5680",
  "sourceEnrollmentId": null,
  "participationType": "REGULAR",
  "status": "EXPECTED",
  "assignmentReason": null
}'
DELETE/api/lesson-participants/{id}Excluir participanteContextual

Excluir participante

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/lesson-participants/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
POST/api/lesson-participants/lesson/{lessonId}/generate-rosterGerar chamada regularContextual

Gerar chamada regular

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • lessonId (ULID) — ULID da aula
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
LessonParticipantDtos.RosterGenerationResponse

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/lesson-participants/lesson/01K5X3M8Y7ABCD1234EFGH5678/generate-roster' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
POST/api/lesson-participants/reassignRemanejar aprendiz entre aulasADMIN

Remanejar aprendiz entre aulas

Exige o papel ADMIN.

Autorização
ADMIN
Requisição
LessonParticipantDtos.ReassignRequest
Content-Type
application/json
Resposta
LessonParticipantDtos.ReassignmentResponse

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "sourceParticipantId": "01K5X3M8Y7ABCD1234EFGH5685",
  "targetLessonId": "01K5X3M8Y7ABCD1234EFGH5689",
  "reason": "Reposição em outra data"
}
Campos e validações
  • reason — obrigatório, máximo de 500 caracteres
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/lesson-participants/reassign' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "sourceParticipantId": "01K5X3M8Y7ABCD1234EFGH5685",
  "targetLessonId": "01K5X3M8Y7ABCD1234EFGH5689",
  "reason": "Reposição em outra data"
}'

Frequência

Presença, ausência, atraso e frequência automática das aulas online.

6 operações
POST/api/attendance-recordsRegistrar frequênciaContextual

Registrar frequência

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Autorização
Contextual
Requisição
AttendanceRecordDtos.Request
Content-Type
application/json
Resposta
AttendanceRecordDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "lessonParticipantId": "01K5X3M8Y7ABCD1234EFGH5685",
  "status": "PRESENT",
  "checkInAt": "2026-10-05T16:00:00Z",
  "checkOutAt": "2026-10-05T18:00:00Z",
  "notes": null
}
Campos e validações
  • status — PRESENT, ABSENT, EXCUSED, LATE ou PARTIAL
  • checkInAt/checkOutAt — instantes ISO 8601 opcionais e coerentes com a aula
  • notes — opcional, máximo de 500 caracteres
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/attendance-records' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "lessonParticipantId": "01K5X3M8Y7ABCD1234EFGH5685",
  "status": "PRESENT",
  "checkInAt": "2026-10-05T16:00:00Z",
  "checkOutAt": "2026-10-05T18:00:00Z",
  "notes": null
}'
GET/api/attendance-records/{id}Consultar frequênciaContextual

Consultar frequência

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
AttendanceRecordDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/attendance-records/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/attendance-recordsPesquisar frequênciasContextual

Pesquisar frequências

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

ADMIN consulta qualquer combinação; INSTRUCTOR deve informar learnerId e recebe apenas registros de suas aulas.

Query parameters

  • startDate e endDate — datas ISO opcionais
  • learnerId e organizationId — filtros opcionais
  • activeContractsOnly — booleano (padrão: false)
  • page — índice baseado em zero (padrão: 0)
  • size — entre 1 e 100 (padrão: 20)
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
PageResponse<AttendanceRecordDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/attendance-records?startDate=2026-09-01&endDate=2026-09-30&learnerId=01K5X3M8Y7ABCD1234EFGH5680&organizationId=01K5X3M8Y7ABCD1234EFGH5681&activeContractsOnly=true&page=0&size=20' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/attendance-records/lesson/{lessonId}Listar frequências da aulaContextual

Listar frequências da aula

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • lessonId (ULID) — ULID da aula
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
List<AttendanceRecordDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/attendance-records/lesson/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
PUT/api/attendance-records/{id}Corrigir frequênciaContextual

Corrigir frequência

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
AttendanceRecordDtos.Request
Content-Type
application/json
Resposta
AttendanceRecordDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "lessonParticipantId": "01K5X3M8Y7ABCD1234EFGH5685",
  "status": "PRESENT",
  "checkInAt": "2026-10-05T16:00:00Z",
  "checkOutAt": "2026-10-05T18:00:00Z",
  "notes": null
}
Campos e validações
  • status — PRESENT, ABSENT, EXCUSED, LATE ou PARTIAL
  • checkInAt/checkOutAt — instantes ISO 8601 opcionais e coerentes com a aula
  • notes — opcional, máximo de 500 caracteres
Exemplo com curl
bash
curl --request PUT \
  --url 'http://localhost:8080/api/attendance-records/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "lessonParticipantId": "01K5X3M8Y7ABCD1234EFGH5685",
  "status": "PRESENT",
  "checkInAt": "2026-10-05T16:00:00Z",
  "checkOutAt": "2026-10-05T18:00:00Z",
  "notes": null
}'
DELETE/api/attendance-records/{id}Excluir frequênciaContextual

Excluir frequência

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/attendance-records/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'

Atividades e materiais

Atividades da aula, publicação, prazos, notas máximas e materiais anexos.

10 operações
POST/api/activitiesCriar atividadeContextual

Criar atividade

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Autorização
Contextual
Requisição
ActivityDtos.Request
Content-Type
application/json
Resposta
ActivityDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "lessonId": "01K5X3M8Y7ABCD1234EFGH5684",
  "title": "Atividade de fixação",
  "description": "Responda às questões propostas.",
  "availableAt": "2026-10-05T18:00:00Z",
  "dueAt": "2026-10-12T23:59:59Z",
  "maxScore": 10,
  "status": "DRAFT"
}
Campos e validações
  • availableAt/dueAt — instantes ISO 8601; prazo posterior à disponibilidade
  • maxScore — opcional e maior ou igual a zero
  • status — DRAFT, PUBLISHED, CLOSED ou CANCELLED
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/activities' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "lessonId": "01K5X3M8Y7ABCD1234EFGH5684",
  "title": "Atividade de fixação",
  "description": "Responda às questões propostas.",
  "availableAt": "2026-10-05T18:00:00Z",
  "dueAt": "2026-10-12T23:59:59Z",
  "maxScore": 10,
  "status": "DRAFT"
}'
GET/api/activities/{id}Consultar atividadeContextual

Consultar atividade

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
ActivityDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/activities/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/activitiesListar todas as atividadesADMIN

Listar todas as atividades

Exige o papel ADMIN.

Query parameters

  • page — índice baseado em zero (padrão: 0)
  • size — entre 1 e 100 (padrão: 20)
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
PageResponse<ActivityDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/activities?page=0&size=20' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/activities/lesson/{lessonId}Listar atividades da aulaContextual

Listar atividades da aula

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Rascunhos só são incluídos para quem pode gerenciar a aula.

Parâmetros de rota

  • lessonId (ULID) — ULID da aula
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
List<ActivityDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/activities/lesson/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
PUT/api/activities/{id}Atualizar atividadeContextual

Atualizar atividade

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
ActivityDtos.Request
Content-Type
application/json
Resposta
ActivityDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "lessonId": "01K5X3M8Y7ABCD1234EFGH5684",
  "title": "Atividade de fixação",
  "description": "Responda às questões propostas.",
  "availableAt": "2026-10-05T18:00:00Z",
  "dueAt": "2026-10-12T23:59:59Z",
  "maxScore": 10,
  "status": "DRAFT"
}
Campos e validações
  • availableAt/dueAt — instantes ISO 8601; prazo posterior à disponibilidade
  • maxScore — opcional e maior ou igual a zero
  • status — DRAFT, PUBLISHED, CLOSED ou CANCELLED
Exemplo com curl
bash
curl --request PUT \
  --url 'http://localhost:8080/api/activities/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "lessonId": "01K5X3M8Y7ABCD1234EFGH5684",
  "title": "Atividade de fixação",
  "description": "Responda às questões propostas.",
  "availableAt": "2026-10-05T18:00:00Z",
  "dueAt": "2026-10-12T23:59:59Z",
  "maxScore": 10,
  "status": "DRAFT"
}'
DELETE/api/activities/{id}Excluir atividadeContextual

Excluir atividade

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/activities/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
POST/api/activities/{activityId}/filesAnexar material à atividadeContextual

Anexar material à atividade

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • activityId (ULID) — ULID da atividade
Autorização
Contextual
Requisição
metadata: ActivityFileRequest + file: binário
Content-Type
multipart/form-data
Resposta
AttachmentDtos.ActivityFileResponse

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typemultipart/form-data; boundary=<automático>obrigatórioDeixe o cliente HTTP gerar o boundary; no curl, use --form.
Payload esperado
{
  "sortOrder": 0
}
Partes multipart
  • metadata (application/json) — obrigatório. ActivityFileRequest serializado em JSON
  • file (tipo MIME do arquivo) — obrigatório. Material da atividade; tamanho e extensões seguem a política de upload
Campos e validações
  • sortOrder — inteiro maior ou igual a zero
  • metadata deve ser enviado como uma parte application/json
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/activities/01K5X3M8Y7ABCD1234EFGH5678/files' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --form 'metadata={"sortOrder":0};type=application/json' \
  --form 'file=@/caminho/arquivo.pdf'
GET/api/activities/{activityId}/files/{fileId}/contentBaixar material da atividadeContextual

Baixar material da atividade

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • activityId (ULID) — ULID da atividade
  • fileId (ULID) — ULID do arquivo
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
Resource (binário)

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/octet-streamopcionalO tipo real do arquivo também pode ser negociado.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/activities/01K5X3M8Y7ABCD1234EFGH5678/files/01K5X3M8Y7ABCD1234EFGH5678/content' \
  --header 'Accept: application/octet-stream' \
  --header 'Authorization: Bearer <access_token>'
GET/api/activities/{activityId}/filesListar materiais da atividadeContextual

Listar materiais da atividade

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • activityId (ULID) — ULID da atividade
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
List<AttachmentDtos.ActivityFileResponse>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/activities/01K5X3M8Y7ABCD1234EFGH5678/files' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
DELETE/api/activities/{activityId}/files/{fileId}Remover material da atividadeContextual

Remover material da atividade

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • activityId (ULID) — ULID da atividade
  • fileId (ULID) — ULID do arquivo
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/activities/01K5X3M8Y7ABCD1234EFGH5678/files/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'

Entregas e anexos

Resposta do aprendiz, atraso, devolução, correção, nota e arquivos da entrega.

12 operações
POST/api/activity-submissionsCriar entregaContextual

Criar entrega

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Autorização
Contextual
Requisição
ActivitySubmissionDtos.SaveRequest
Content-Type
application/json
Resposta
ActivitySubmissionDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "activityId": "01K5X3M8Y7ABCD1234EFGH5686",
  "learnerId": "01K5X3M8Y7ABCD1234EFGH5680",
  "textAnswer": "Minha resposta para a atividade.",
  "status": "SUBMITTED"
}
Campos e validações
  • status — DRAFT ou SUBMITTED nas operações do aprendiz; demais estados são controlados pelo fluxo
  • textAnswer — opcional; anexos são enviados pela rota de arquivos da entrega
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/activity-submissions' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "activityId": "01K5X3M8Y7ABCD1234EFGH5686",
  "learnerId": "01K5X3M8Y7ABCD1234EFGH5680",
  "textAnswer": "Minha resposta para a atividade.",
  "status": "SUBMITTED"
}'
GET/api/activity-submissions/{id}Consultar entregaContextual

Consultar entrega

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Inclui learnerName e learnerRegistrationNumber; learnerId continua sendo a referência utilizada nas operações.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
ActivitySubmissionDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/activity-submissions/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/activity-submissionsListar todas as entregasADMIN

Listar todas as entregas

Exige o papel ADMIN.

Query parameters

  • page — índice baseado em zero (padrão: 0)
  • size — entre 1 e 100 (padrão: 20)
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
PageResponse<ActivitySubmissionDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/activity-submissions?page=0&size=20' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/activity-submissions/activity/{activityId}Listar entregas da atividadeContextual

Listar entregas da atividade

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • activityId (ULID) — ULID da atividade
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
List<ActivitySubmissionDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/activity-submissions/activity/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/activity-submissions/learner/{learnerId}Listar entregas do aprendizContextual

Listar entregas do aprendiz

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • learnerId (ULID) — ULID do aprendiz
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
List<ActivitySubmissionDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/activity-submissions/learner/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
PUT/api/activity-submissions/{id}Editar entregaContextual

Editar entrega

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
ActivitySubmissionDtos.SaveRequest
Content-Type
application/json
Resposta
ActivitySubmissionDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "activityId": "01K5X3M8Y7ABCD1234EFGH5686",
  "learnerId": "01K5X3M8Y7ABCD1234EFGH5680",
  "textAnswer": "Minha resposta para a atividade.",
  "status": "SUBMITTED"
}
Campos e validações
  • status — DRAFT ou SUBMITTED nas operações do aprendiz; demais estados são controlados pelo fluxo
  • textAnswer — opcional; anexos são enviados pela rota de arquivos da entrega
Exemplo com curl
bash
curl --request PUT \
  --url 'http://localhost:8080/api/activity-submissions/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "activityId": "01K5X3M8Y7ABCD1234EFGH5686",
  "learnerId": "01K5X3M8Y7ABCD1234EFGH5680",
  "textAnswer": "Minha resposta para a atividade.",
  "status": "SUBMITTED"
}'
PATCH/api/activity-submissions/{id}/gradeAvaliar ou devolver entregaContextual

Avaliar ou devolver entrega

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
ActivitySubmissionDtos.GradeRequest
Content-Type
application/json
Resposta
ActivitySubmissionDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "score": 8.5,
  "feedback": "Boa resposta; revise o segundo tópico.",
  "status": "GRADED"
}
Campos e validações
  • score — opcional, maior ou igual a zero e não pode superar maxScore
  • status — GRADED ou RETURNED na avaliação
Exemplo com curl
bash
curl --request PATCH \
  --url 'http://localhost:8080/api/activity-submissions/01K5X3M8Y7ABCD1234EFGH5678/grade' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "score": 8.5,
  "feedback": "Boa resposta; revise o segundo tópico.",
  "status": "GRADED"
}'
DELETE/api/activity-submissions/{id}Excluir entrega editávelContextual

Excluir entrega editável

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/activity-submissions/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
POST/api/activity-submissions/{submissionId}/filesAnexar arquivo à entregaContextual

Anexar arquivo à entrega

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • submissionId (ULID) — ULID da entrega
Autorização
Contextual
Requisição
file: binário
Content-Type
multipart/form-data
Resposta
AttachmentDtos.SubmissionFileResponse

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typemultipart/form-data; boundary=<automático>obrigatórioDeixe o cliente HTTP gerar o boundary; no curl, use --form.
Payload esperado
Esta operação recebe apenas partes de arquivo no formulário multipart.
Partes multipart
  • file (tipo MIME do arquivo) — obrigatório. Arquivo anexado à entrega
Campos e validações
  • Envie o arquivo na parte file; tamanho e extensões seguem a política de upload
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/activity-submissions/01K5X3M8Y7ABCD1234EFGH5678/files' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --form 'file=@/caminho/arquivo.pdf'
GET/api/activity-submissions/{submissionId}/files/{fileId}/contentBaixar anexo da entregaContextual

Baixar anexo da entrega

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • submissionId (ULID) — ULID da entrega
  • fileId (ULID) — ULID do arquivo
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
Resource (binário)

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/octet-streamopcionalO tipo real do arquivo também pode ser negociado.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/activity-submissions/01K5X3M8Y7ABCD1234EFGH5678/files/01K5X3M8Y7ABCD1234EFGH5678/content' \
  --header 'Accept: application/octet-stream' \
  --header 'Authorization: Bearer <access_token>'
GET/api/activity-submissions/{submissionId}/filesListar anexos da entregaContextual

Listar anexos da entrega

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • submissionId (ULID) — ULID da entrega
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
List<AttachmentDtos.SubmissionFileResponse>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/activity-submissions/01K5X3M8Y7ABCD1234EFGH5678/files' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
DELETE/api/activity-submissions/{submissionId}/files/{fileId}Remover anexo da entregaContextual

Remover anexo da entrega

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • submissionId (ULID) — ULID da entrega
  • fileId (ULID) — ULID do arquivo
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/activity-submissions/01K5X3M8Y7ABCD1234EFGH5678/files/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'

Notificações

Composição, audiência materializada, caixa pessoal e entrega por canal.

12 operações
POST/api/notificationsCriar e materializar notificaçãoADMIN

Criar e materializar notificação

Exige o papel ADMIN.

Autorização
ADMIN
Requisição
NotificationDtos.CreateRequest
Content-Type
application/json
Resposta
NotificationDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "notificationType": "LESSON_REMINDER",
  "title": "Aula amanhã",
  "message": "Sua próxima aula começa amanhã às 13h.",
  "actionUrl": "/sistema/aulas/01K5X3M8Y7ABCD1234EFGH5684",
  "contextType": "LESSON",
  "contextId": "01K5X3M8Y7ABCD1234EFGH5684",
  "payload": "{\"lessonId\":\"01K5X3M8Y7ABCD1234EFGH5684\"}",
  "priority": "NORMAL",
  "scheduledAt": null,
  "expiresAt": "2026-10-06T18:00:00Z",
  "audience": {
    "type": "COHORT",
    "targetId": "01K5X3M8Y7ABCD1234EFGH5682"
  },
  "channels": [
    "IN_APP",
    "EMAIL"
  ]
}
Campos e validações
  • notificationType — maiúsculas, números e underscore; máximo de 50 caracteres
  • priority — LOW, NORMAL, HIGH ou URGENT
  • audience.type — USER, COHORT ou ALL; targetId depende do tipo
  • channels — conjunto não vazio com IN_APP, EMAIL e/ou PUSH
  • payload — string opcional, inclusive quando seu conteúdo representa JSON
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/notifications' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "notificationType": "LESSON_REMINDER",
  "title": "Aula amanhã",
  "message": "Sua próxima aula começa amanhã às 13h.",
  "actionUrl": "/sistema/aulas/01K5X3M8Y7ABCD1234EFGH5684",
  "contextType": "LESSON",
  "contextId": "01K5X3M8Y7ABCD1234EFGH5684",
  "payload": "{\"lessonId\":\"01K5X3M8Y7ABCD1234EFGH5684\"}",
  "priority": "NORMAL",
  "scheduledAt": null,
  "expiresAt": "2026-10-06T18:00:00Z",
  "audience": {
    "type": "COHORT",
    "targetId": "01K5X3M8Y7ABCD1234EFGH5682"
  },
  "channels": [
    "IN_APP",
    "EMAIL"
  ]
}'
GET/api/notifications/{id}Consultar notificaçãoADMIN

Consultar notificação

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
NotificationDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/notifications/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/notificationsListar notificaçõesADMIN

Listar notificações

Exige o papel ADMIN.

Query parameters

  • page — índice baseado em zero (padrão: 0)
  • size — entre 1 e 100 (padrão: 20)
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
PageResponse<NotificationDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/notifications?page=0&size=20' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/notifications/context/{contextType}/{contextId}Listar notificações por contextoADMIN

Listar notificações por contexto

Exige o papel ADMIN.

Parâmetros de rota

  • contextType (string) — Tipo do contexto, por exemplo LESSON
  • contextId (ULID) — ULID do recurso usado como contexto
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
List<NotificationDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/notifications/context/LESSON/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
PUT/api/notifications/{id}Atualizar conteúdo e agendamentoADMIN

Atualizar conteúdo e agendamento

Exige o papel ADMIN.

Só é permitido antes de qualquer destinatário ter sido processado; audiência e canais são imutáveis.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
NotificationDtos.UpdateRequest
Content-Type
application/json
Resposta
NotificationDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "notificationType": "LESSON_REMINDER",
  "title": "Aula amanhã — horário atualizado",
  "message": "Sua próxima aula começa amanhã às 14h.",
  "actionUrl": "/sistema/aulas/01K5X3M8Y7ABCD1234EFGH5684",
  "contextType": "LESSON",
  "contextId": "01K5X3M8Y7ABCD1234EFGH5684",
  "payload": null,
  "priority": "HIGH",
  "scheduledAt": null,
  "expiresAt": "2026-10-06T19:00:00Z"
}
Campos e validações
  • Audiência e canais não fazem parte da atualização e permanecem imutáveis
  • priority — LOW, NORMAL, HIGH ou URGENT
Exemplo com curl
bash
curl --request PUT \
  --url 'http://localhost:8080/api/notifications/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "notificationType": "LESSON_REMINDER",
  "title": "Aula amanhã — horário atualizado",
  "message": "Sua próxima aula começa amanhã às 14h.",
  "actionUrl": "/sistema/aulas/01K5X3M8Y7ABCD1234EFGH5684",
  "contextType": "LESSON",
  "contextId": "01K5X3M8Y7ABCD1234EFGH5684",
  "payload": null,
  "priority": "HIGH",
  "scheduledAt": null,
  "expiresAt": "2026-10-06T19:00:00Z"
}'
DELETE/api/notifications/{id}Excluir notificaçãoADMIN

Excluir notificação

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/notifications/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/notification-recipients/{id}Consultar item da caixaContextual

Consultar item da caixa

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
NotificationRecipientDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/notification-recipients/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/notification-recipientsListar todos os destinatáriosADMIN

Listar todos os destinatários

Exige o papel ADMIN.

Query parameters

  • page — índice baseado em zero (padrão: 0)
  • size — entre 1 e 100 (padrão: 20)
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
PageResponse<NotificationRecipientDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/notification-recipients?page=0&size=20' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/notification-recipients/meAbrir a própria caixaAutenticado

Abrir a própria caixa

Exige JWT válido, sem papel específico nesta rota.

Query parameters

  • channel — filtro opcional
  • page — índice baseado em zero (padrão: 0)
  • size — entre 1 e 100 (padrão: 20)
Autorização
Autenticado
Requisição
Sem corpo
Content-Type
—
Resposta
PageResponse<NotificationRecipientDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/notification-recipients/me?channel=IN_APP&page=0&size=20' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/notification-recipients/me/unread-countContar notificações não lidasAutenticado

Contar notificações não lidas

Exige JWT válido, sem papel específico nesta rota.

Autorização
Autenticado
Requisição
Sem corpo
Content-Type
—
Resposta
NotificationRecipientDtos.UnreadCount

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/notification-recipients/me/unread-count' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
PATCH/api/notification-recipients/{id}/deliveryAlterar estado da entregaADMIN

Alterar estado da entrega

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
NotificationRecipientDtos.DeliveryRequest
Content-Type
application/json
Resposta
NotificationRecipientDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "deliveryStatus": "FAILED",
  "failureReason": "Caixa postal indisponível"
}
Campos e validações
  • deliveryStatus — PENDING, SENT, DELIVERED, FAILED ou CANCELLED
  • failureReason — opcional, máximo de 500 caracteres
Exemplo com curl
bash
curl --request PATCH \
  --url 'http://localhost:8080/api/notification-recipients/01K5X3M8Y7ABCD1234EFGH5678/delivery' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "deliveryStatus": "FAILED",
  "failureReason": "Caixa postal indisponível"
}'
PATCH/api/notification-recipients/{id}/readMarcar notificação como lidaContextual

Marcar notificação como lida

Acesso decidido pelo objeto e pelo vínculo do usuário autenticado.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
Contextual
Requisição
Sem corpo
Content-Type
—
Resposta
NotificationRecipientDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request PATCH \
  --url 'http://localhost:8080/api/notification-recipients/01K5X3M8Y7ABCD1234EFGH5678/read' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'

Mensagens de contato

Entrada pública da landing page e triagem administrativa das mensagens recebidas.

5 operações
POST/api/contact-messagesEnviar mensagem de contatoPúblico

Enviar mensagem de contato

Não exige access token.

Único endpoint de domínio público fora do conjunto /api/auth.

Autorização
Público
Requisição
ContactMessageDtos.CreateRequest
Content-Type
application/json
Resposta
ContactMessageDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "name": "Maria da Silva",
  "email": "maria@example.com",
  "phone": "41987654321",
  "contactType": "YOUTH_INTERESTED",
  "message": "Gostaria de saber mais sobre o programa de aprendizagem."
}
Campos e validações
  • phone — DDD + telefone sem formatação, com 10 ou 11 dígitos
  • contactType — YOUTH_INTERESTED, COMPANY, FAMILY_OR_GUARDIAN ou OTHER
  • message — obrigatório, máximo de 5000 caracteres
Exemplo com curl
bash
curl --request POST \
  --url 'http://localhost:8080/api/contact-messages' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "Maria da Silva",
  "email": "maria@example.com",
  "phone": "41987654321",
  "contactType": "YOUTH_INTERESTED",
  "message": "Gostaria de saber mais sobre o programa de aprendizagem."
}'
GET/api/contact-messagesPesquisar mensagensADMIN

Pesquisar mensagens

Exige o papel ADMIN.

Query parameters

  • search, status e contactType — filtros opcionais
  • page — índice baseado em zero (padrão: 0)
  • size — entre 1 e 100 (padrão: 20)
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
PageResponse<ContactMessageDtos.Response>

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/contact-messages?search=maria&status=NEW&contactType=YOUTH_INTERESTED&page=0&size=20' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
GET/api/contact-messages/{id}Consultar mensagemADMIN

Consultar mensagem

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
ContactMessageDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request GET \
  --url 'http://localhost:8080/api/contact-messages/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'
PATCH/api/contact-messages/{id}/statusAtualizar status da mensagemADMIN

Atualizar status da mensagem

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
ContactMessageDtos.StatusRequest
Content-Type
application/json
Resposta
ContactMessageDtos.Response

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Content-Typeapplication/jsonobrigatórioO corpo deve ser enviado como JSON UTF-8.
Payload esperado
{
  "status": "READ"
}
Campos e validações
  • status — NEW, READ ou ARCHIVED
Exemplo com curl
bash
curl --request PATCH \
  --url 'http://localhost:8080/api/contact-messages/01K5X3M8Y7ABCD1234EFGH5678/status' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "status": "READ"
}'
DELETE/api/contact-messages/{id}Excluir mensagemADMIN

Excluir mensagem

Exige o papel ADMIN.

Parâmetros de rota

  • id (ULID) — ULID do recurso
Autorização
ADMIN
Requisição
Sem corpo
Content-Type
—
Resposta
Void

Como consumir

Cabeçalhos, corpo e exemplo executável para o ambiente local.

http://localhost:8080
Cabeçalhos da requisição
NomeValorUso
Acceptapplication/jsonopcionalFormato padrão das respostas da API.
AuthorizationBearer <access_token>obrigatórioJWT de acesso emitido após a verificação do desafio.
Payload esperado
Esta operação não recebe corpo de requisição.
Exemplo com curl
bash
curl --request DELETE \
  --url 'http://localhost:8080/api/contact-messages/01K5X3M8Y7ABCD1234EFGH5678' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <access_token>'

09 · Persistência e operação

Flyway é a origem do schema

O banco nasce pelas migrations e o Hibernate apenas confere se as entidades correspondem ao schema. Isso torna estrutura e catálogos reproduzíveis, revisáveis e independentes do ambiente.

Banco e migrations

MySQL em produção, H2/Testcontainers nos testes.

  1. V1Cria tabelas, índices, constraints e relacionamentos do modelo completo.
  2. V2Insere papéis de sistema e tipos de pessoa, sem depender do contexto Spring.
  3. JPAddl-auto: validate em todos os ambientes.

O próprio banco guarda flyway_schema_history, com versão, checksum, data e resultado de cada migration.

Configuração externa

Segredos e infraestrutura chegam por variáveis de ambiente.

Banco
SPRING_DATASOURCE_URL / USERNAME / PASSWORD
JWT
API_SECURITY_JWT_SECRET / ISSUER
E-mail
EMAIL / EMAIL_PASS / SMTP_*
Arquivos
FILE_STORAGE_ROOT / MAX_SIZE / ALLOWED_*
Ciclos
ACADEMIC_* / DOCUMENT_* / NOTIFICATION_*

Esta documentação pertence ao frontend

A rota /documentacao é renderizada pelo Next.js com um catálogo versionado no código. Ela não cria endpoint no Spring, não chama o backend e continua disponível mesmo com a API desligada.

Voltar ao topo