API Examples
Introdução ao documento
Este documento reúne exemplos rastreáveis de request e response para os endpoints cobertos em openapi.yaml. Os exemplos foram derivados apenas do código local: strings literais dos handlers, interfaces TypeScript, validações do frontend e chamadas reais feitas pelo próprio app.
Critério dos exemplos
- Quando o handler monta o JSON diretamente, o exemplo reflete esse shape.
- Quando a resposta é repassada de um backend externo, o exemplo é parcial e isso é explicitado.
- Quando o código não comprova body para um status, o documento diz isso em vez de inventar payload.
Evidências:
Exemplos públicos
GET /api/liveness
Response 200:
{
"status": "alive",
"timestamp": "2026-03-20T12:00:00.000Z",
"uptime": 12.34,
"message": "Application is running"
}
Response 500:
{
"status": "error",
"message": "Application liveness check failed"
}
Evidências:
GET /api/health
Response 200 ou 503:
{
"status": "healthy",
"timestamp": "2026-03-20T12:00:00.000Z",
"uptime": {
"seconds": 123.45,
"human": "0h 2m 3s"
},
"memory": {
"used": 120,
"total": 256,
"external": 12,
"usage": "46.88%",
"unit": "MB"
},
"metrics": {
"totalRequests": 10,
"healthCheckCount": 3,
"timeSinceLastRequest": "5ms",
"healthCheckDuration": "2ms",
"consecutiveSlowChecks": 0
},
"environment": {
"nodeVersion": "v20.0.0",
"platform": "linux",
"env": "development"
},
"application": {
"name": "dhedalos-app-onboarding-nextjs",
"version": "1.0.0"
}
}
Response 500:
{
"status": "unhealthy",
"timestamp": "2026-03-20T12:00:00.000Z",
"error": "Unknown error"
}
Evidências:
GET /api/readiness
Response 200:
{
"status": "ready",
"timestamp": "2026-03-20T12:00:00.000Z",
"uptime": 10,
"checks": {
"environment": true,
"memory": true,
"uptime": true
},
"memory": {
"used": 120,
"total": 256,
"usage": "46.88%",
"unit": "MB"
},
"message": "Application is ready to serve requests"
}
Response 503:
{
"status": "not_ready",
"message": "Application is not ready to serve requests",
"checks": {
"environment": false,
"memory": true,
"uptime": true
},
"details": {
"missingEnvVars": [
"NEXTAUTH_SECRET"
]
},
"timestamp": "2026-03-20T12:00:00.000Z"
}
Evidências:
GET /api/config/keycloak
Response 200 com integração desabilitada:
{
"enabled": false
}
Response 200 com integração habilitada:
{
"enabled": true,
"url": "https://amei.sebrae.com.br/auth",
"realm": "externo",
"clientId": "conecta-sebrae"
}
Response 500:
{
"error": "Internal server error while loading Keycloak configuration"
}
Evidências:
../../pages/api/config/keycloak.ts#L29-L33../../pages/api/config/keycloak.ts#L52-L64../../.env.example#L29-L33
GET /api/v1/cursos/{slug}
Response 200:
{
"slug": "seu-curso",
"title": "Curso",
"description": "Descrição",
"logo": "https://exemplo/logo.png",
"banner": "https://exemplo/banner.png",
"subscribers": 0
}
Observação: os ramos 400 e 404 não têm body comprovado no handler.
Evidências:
GET /api/envs
Response 200:
{
"appVersion": "1.0.0",
"datadog": {
"appId": "",
"clientToken": "",
"serviceName": "",
"env": "",
"sessionSampleRate": 100,
"sessionReplaySampleRate": 20
}
}
Evidências:
Exemplos autenticados
GET /api/v1/participantes/{cpf}
Autenticação observada: sessão NextAuth via getServerSession(). O handler não comprova body JSON para 401.
Response 200:
{
"id": 1,
"cpf": "00000000000",
"name": "Nome",
"email": "nome@exemplo.com",
"phone": "+55 11 99999-9999",
"gender": "Masculino",
"race": "Branca",
"birthday": "01/01/2000"
}
Evidências:
../../pages/api/v1/participantes/[cpf].ts#L11-L27../../src/features/api/external/wp/getUserByCpf/getUserByCpf.interface.ts#L11-L20
PUT /api/v1/participantes/{cpf}
Autenticação observada: sessão NextAuth via getServerSession().
Request body parcial:
{
"id": "",
"cpf": "00000000000",
"name": "Nome Sobrenome",
"email": "nome@exemplo.com",
"phone": "+55 11 99999-9999",
"birthday": "01/01/2000",
"gender": "Masculino",
"race": "Branca"
}
Esse exemplo é rastreável pela combinação entre o body enviado pelo frontend e os campos validados no formulário.
Response 200 parcial de criação:
{
"ok": true,
"id": "123",
"cpf": "00000000000",
"name": "Nome Sobrenome",
"email": "nome@exemplo.com",
"phone": "+55 11 99999-9999",
"race": "Branca"
}
Response 400:
{
"message": "Falha na atualização dos dados"
}
Evidências:
../../src/features/api/subscribeToCourse/subscribeToCourse.api.ts#L8-L13../../src/features/components/SignupConfirmation/components/ProfileForm/ProfileForm.component.tsx#L97-L104../../src/features/components/SignupConfirmation/components/ProfileForm/ProfileForm.schema.ts#L5-L47../../pages/api/v1/participantes/[cpf].ts#L29-L47../../src/features/api/external/wp/createUser/createUser.interface.ts#L12-L20
POST /api/v1/otp/send
Autenticação observada: sessão NextAuth via getServerSession().
Request:
{
"phone": "+55 11 99999-9999"
}
Response 200:
{
"message": "OK"
}
Response 400:
{
"message": "Telefone inválido"
}
Observação: o handler não comprova body JSON para 401 e 405.
Evidências:
../../pages/api/v1/otp/send.ts#L10-L35../../src/features/api/sendOtpCode/sendOtpCode.api.ts#L10-L23
POST /api/v1/otp/confirm
Autenticação observada: sessão NextAuth via getServerSession().
Request:
{
"phone": "+55 11 99999-9999",
"code": "123456"
}
Response 200 parcial:
{
"message": "OK"
}
Observação: o shape acima é parcial. O handler faz json(await otpResponse.json()), então a resposta real depende do backend de OTP. A única evidência local de shape é a interface com message: string.
Response 400:
{
"message": "Código ou telefone inváidos"
}
Response 500:
{
"message": "erro retornado pelo sendTemplate"
}
Evidências:
../../pages/api/v1/otp/confirm.ts#L22-L56../../src/features/api/confirmOtpCode/confirmOtpCode.api.ts#L7-L20../../src/features/api/external/whats/otpConfirm/otpConfirm.interface.ts#L1-L3../../src/features/components/OTPConfirmation/components/Form/Form.schema.ts#L3-L8
POST /api/v1/flow/resend
Autenticação observada: sessão NextAuth via getServerSession().
Request body observado: nenhum.
Response 200:
{
"ok": true
}
Response 400:
{
"message": "Erro no envio de template"
}
Response 401:
{
"message": "Não autorizado"
}
Evidências:
../../pages/api/v1/flow/resend.ts#L11-L43../../src/features/api/resendTemplate/resendTemplate.api.ts#L8-L20../../src/features/api/external/whats/sendFlowTemplate/sendFlowTemplate.interface.ts#L2-L10
Exemplo de tracking
POST /api/meta-conversion
O próprio frontend envia um exemplo real deste endpoint ao completar cadastro.
Request observado:
{
"event_name": "CompleteRegistration",
"user_data": {
"em": "nome@exemplo.com",
"ph": "+55 11 99999-9999",
"fn": "Nome Sobrenome"
},
"event_source_url": "https://exemplo.com/curso/inscricao/confirmacao"
}
Response 500 quando faltar configuração:
{
"error": "Configuração ausente"
}
Response 500 por erro interno:
{
"error": "Internal error"
}
Evidências:
../../src/features/components/SignupConfirmation/components/ProfileConfirmation/ProfileConfirmation.component.tsx#L22-L34../../app/api/meta-conversion/route.ts#L7-L10../../app/api/meta-conversion/route.ts#L44-L46
Endpoints sem cobertura suficiente
/api/auth/[...nextauth]Evidência:../../pages/api/auth/[...nextauth].ts#L25-L155Motivo: o repositório delega o catch-all aoNextAuth(authOptions), sem detalhar de forma local todos os métodos, query params, cookies e payloads efetivamente expostos.
Pendências
- O payload de sucesso de
POST /api/v1/otp/confirmdepende diretamente do backend de OTP e tem apenas shape parcial confirmado. - O retorno de sucesso de
PUT /api/v1/participantes/{cpf}é parcial; o adapter de update retornaany. GET /api/v1/cursos/{slug}não fecha corretamente os ramos400e404, então esses exemplos não podem ser afirmados.
Versionamento
Atualizar este arquivo quando exemplos, handlers ou openapi.yaml divergirem do código.
Evidências:
Referencial teórico
- OpenAPI Example Object.
- Documentação de exemplos orientada a evidência.