Contexto: por qué la LGPD pesa más en EAD
Las plataformas EAD recopilan más datos sensibles que el e-commerce o las redes sociales:
- Datos educativos (LGPD Art. 11 — dato personal sensible cuando revela condición de salud/bienestar)
- Datos conductuales ricos — tiempo en cada lección, patrones de estudio, dificultades, ansiedad previa al examen
- Datos de menores — primaria + secundaria + bachillerato = ~80% del mercado K-12 brasileño
- Datos de padres/responsables (vinculación GuardianLink)
- Datos biométricos cuando hay proctoring con webcam (Studeia no lo tiene nativo, pero LTI a Examity/ProctorU sí)
La ANPD ya realizó fiscalizaciones en edtechs brasileñas en 2024-2025. Multas de R$50 millones (2% de la facturación bruta, hasta R$50M de tope) son una realidad.
8 frentes obligatorias
1. DPO (Data Protection Officer) — Art. 41
La empresa debe designar a una persona física como encargada del tratamiento de datos. Responsabilidades:
- Aceptar reclamaciones y comunicaciones de los titulares
- Recibir comunicaciones de la ANPD
- Orientar a los empleados sobre la LGPD
- Ejecutar planes de adecuación
Opciones:
| Modelo | Costo | Adecuado para |
|---|---|---|
| DPO interno (empleado) | R$8-20k/mes salario | Empresas >100 empleados |
| DPO externo (consultoría especializada) | R$2-8k/mes | Empresas 10-100 empleados |
| DPO virtual (estudio de abogados) | R$1-3k/mes | Microempresas |
Indicar públicamente: nombre + email del DPO en la política de privacidad.
2. Consentimiento parental real para menores — Art. 14
LGPD Art. 14 §1: "El tratamiento de datos personales de niños deberá realizarse con el consentimiento específico y destacado otorgado por al menos uno de los padres o por el responsable legal."
Las plataformas que lo ignoran pagan caro:
- ❌ Anti-patrón: checkbox "Tengo más de 13 años" sin verificación
- ❌ Anti-patrón: campo "Email del padre" sin verificar si es real
- ✅ Patrón Studeia: el estudiante se registra → estado
pending_parental_consent→ email/SMS al padre → el padre hace clic en el enlace + responde verificación SMS (anti-fraude) → estadoactive
Además: el padre elige el nivel de acceso por hijo mediante ProgressSharingConfig. Estudiante menor de 13: el padre tiene acceso TOTAL por defecto. 13-17: el padre configura.
Implementación concreta:
// El estudiante se registra
if (user.age < 18) {
user.isMinor = true;
user.status = "pending_parental_consent";
// GuardianLink creado pero inactivo
await prisma.guardianLink.create({
data: {
childId: user.id,
parentEmail: parentEmail,
parentPhone: parentPhone,
verified: false,
verificationToken: generateSecureToken(),
}
});
// Email + SMS al padre con enlace de verificación
await sendVerification({ ... });
}
El estudiante NO puede acceder al contenido mientras el estado sea != "active". Sin brechas.
3. Exportación de datos — Art. 18 IV
El titular puede solicitar una copia de TODOS los datos personales que procesas sobre él. En formato estructurado y legible.
Studeia: GET /api/user/data-export devuelve JSON con:
{
"user": { id, email, name, role, ... },
"enrollments": [ ... ],
"lessonCompletions": [ ... ],
"quizAttempts": [ ... ],
"chatSessions": [ ... ], // historial de chat con tutor IA
"messages": [ ... ], // mensajes directos + foro
"badges": [ ... ],
"gamificationProfile": { ... },
"aiSupervisorIncidents": [ ... ], // si los hubiera
"consentRecords": [ ... ]
}
Rate limit: 1 exportación por 24h por usuario (anti-abuso). Redis key data-export-cooldown:{userId} TTL 86400.
Disponible en hasta 15 días desde la solicitud (la LGPD no define un plazo exacto, pero 15 días es el estándar de la ANPD).
4. Eliminación de cuenta — Art. 18 VI
El titular puede solicitar la eliminación de sus datos personales. Pero hay matices:
- PII (datos personales identificables) — DEBE ser eliminado/anonimizado
- Datos académicos históricos — puede RETENERSE por finalidad legítima (retención fiscal, prueba de formación del estudiante, defensa en eventual litigio)
Studeia hace:
// DELETE /api/user/account
await prisma.$transaction(async (tx) => {
// 1. Anonimiza PII
await tx.user.update({
where: { id: userId },
data: {
email: `deleted-${userId}@anonymous.studeia.com`,
name: "Usuario eliminado",
phone: null,
address: null,
avatarUrl: null,
cpf: null, // CPF también
status: "deleted",
deletedAt: new Date(),
}
});
// 2. Elimina datos conversacionales
await tx.chatSession.deleteMany({ where: { userId } });
await tx.directMessage.deleteMany({ where: { senderId: userId } });
await tx.directMessage.updateMany({ where: { recipientId: userId }, data: { recipientId: ANONYMIZED } });
// 3. Anonimiza datos académicos (mantiene historial pero sin PII)
// LessonCompletion, QuizAttempt, Grade ya referencian por User.id (mantenido)
// Como User.email y User.name fueron anonimizados, los datos académicos quedan "anónimos"
// 4. Anonimiza incidentes de safety (mantiene severity + categoría para compliance)
await tx.aiSupervisorIncident.updateMany({
where: { userId },
data: {
messagesSnapshot: [],
supervisorReasoning: null,
appealText: null,
}
});
// 5. Cron purga datos académicos > 5 años automáticamente
});
5 años = retención fiscal compatible con LGPD (Lei 10.406/2002 + Constitución Federal Art. 7º XXIX).
5. DPA con terceros — divulgación obligatoria
El tenant DEBE listar en su política de privacidad TODOS los procesadores de datos terceros.
Studeia proporciona a cada tenant una lista:
- Anthropic (Claude) — procesa prompts + respuestas. DPA GDPR/LGPD. Sede USA. Retención de datos: 30 días.
- OpenAI (GPT fallback) — ídem. Sede USA. Retención de datos: 30 días.
- Voyage AI (embeddings primary) — procesa texto para embedding. Sede USA. Retención de datos: 30 días.
- Stripe (pagos USD) — PCI-DSS Level 1. Sede USA. Retención: 7 años (fiscal).
- Asaas (pagos BR PIX/boleto) — sede BR. Retención: 7 años.
- Supabase (base de datos + auth + storage) — sede USA. Región: us-east-1 (por defecto) u sa-east-1 opcional.
- Sentry (observabilidad) — Session replay con maskAllText:true + blockAllMedia:true (compatible con LGPD).
- PostHog (analytics) — anonimización de IP activada. Sin seguimiento de PII.
- Resend / SendGrid (email) — sede USA. Retención: 30 días.
El tenant copia esta lista en su política de privacidad. Cubre la divulgación.
6. Aislamiento real de tenant — RLS + filtro obligatorio
LGPD Art. 6 V: los datos personales deben tratarse con seguridad apropiada.
LMS multi-tenant = los datos de la Escuela A NUNCA pueden aparecer en una consulta de la Escuela B. Studeia lo implementa en 3 capas:
- Filtro obligatorio en queries de Prisma: toda llamada
prisma.X.findMany()en el código de la aplicación DEBE incluirwhere: { tenantId }. Regla crítica #6 del proyecto. - RLS de Supabase: política automática en todas las tablas relevantes:
CREATE POLICY tenant_isolation_courses ON courses FOR SELECT USING (tenant_id = current_setting('app.current_tenant_id')::uuid); - RAG tenantOnlyMode: el retrieve nunca cita material de otra institución.
7. Audit log inmutable
LGPD Art. 37 + Resolución ANPD CD/ANPD nº 4/2023: registro de operaciones de tratamiento.
Studeia: modelo AdminAuditLog con:
model AdminAuditLog {
id String @id @default(uuid())
actorId String // quién realizó la acción
action AdminAuditAction
targetType String // "user", "tenant", "course", etc
targetId String?
metadata Json?
ip String?
userAgent String?
createdAt DateTime @default(now())
}
Acciones auditadas (15+ tipos):
- impersonate.start / stop
- tenant.create / plan.change / config.update / delete
- user.role.change / tenant.link
- ai_supervisor.* (transiciones de incidentes, actualizaciones de prompts, etc.)
- subscription.admin_update
- payment.manual.record
Inmutable: solo append. No existe endpoint para eliminar (intencional).
8. Plan de respuesta a incidentes
LGPD Art. 48: incidente de seguridad que pueda generar riesgo/daño relevante = comunicación a la ANPD en plazo razonable (interpretación: 24h).
Studeia: runbook en docs/runbooks/incident-response.md con tabla SEV:
| SEV | Trigger | Acción primaria | SLA notif |
|---|---|---|---|
| SEV1 | Filtración PII > 100 usuarios | Reporte a ANPD + clientes + status page | <2h |
| SEV2 | Outage > 30min O PII < 100 usuarios | Clientes + status page | <4h |
| SEV3 | Degradación de rendimiento | Status page | <12h |
| SEV4 | Bug funcional sin PII | Backlog priorizado | NA |
Además: postmortem público (sanitizado) en docs/incidents/ para SEV1/SEV2.
Adiciones específicas para Studeia
Logging de prompts LLM
Antes de enviar el prompt a Anthropic/OpenAI:
// Redactar PII conocida
function redactPIIBeforeLLM(prompt: string, user: User): string {
return prompt
.replace(new RegExp(user.email, 'gi'), '[EMAIL_REDACTED]')
.replace(new RegExp(user.cpf ?? '', 'g'), '[CPF_REDACTED]')
.replace(new RegExp(user.phone ?? '', 'g'), '[PHONE_REDACTED]');
}
Antes de registrar el prompt en AiUsageLog:
function redactPIIBeforeLog(prompt: string): string {
// Patrones genéricos
return prompt
.replace(/\b\d{3}\.\d{3}\.\d{3}-\d{2}\b/g, '[CPF]')
.replace(/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g, '[EMAIL]')
.replace(/\b\d{4,5}-?\d{4}\b/g, '[PHONE]');
}
AiUsageLog.prompt almacena la versión redactada. Los costos + analytics funcionan sin exponer PII.
Tutor IA + historial de chat
El estudiante accede a "Mis conversaciones" y ve el historial. Los padres con permiso también (dependiendo de ProgressSharingConfig.viewChatHistory).
Pero: la ANPD puede requerirlo por vía judicial. Respuesta:
- Studeia mantiene el historial de chat por 1 año (retención por defecto, configurable por tenant)
- Después de 1 año: cron
/api/cron/chat-cleanupanonimiza (mantiene el conteo de turnos para analytics, elimina el texto) - En requerimiento judicial: exporta JSON con el contenido solicitado
- Registro del acceso en AdminAuditLog (action:
data.judicial_request)
Lo que NUNCA se debe hacer
❌ Recopilar más datos de los necesarios (principio de minimización Art. 6 III) ❌ Compartir datos de estudiantes con fines de marketing (incluso "internamente") ❌ Entrenar modelo de IA con datos de estudiantes sin consentimiento explícito ❌ Vender datos de comportamiento de estudio a terceros ❌ Usar datos de menores para publicidad dirigida (prohibido por ley) ❌ Retener datos sin una finalidad clara (Art. 16) ❌ Usar tutor IA sin informar que es IA (transparencia, Art. 6 VI)
Avatar IA en tiempo real (disponible — opt-in)
Studeia ya ofrece avatar parlante en tiempo real con video/voz (HeyGen LiveAvatar / D-ID, BYO key del proveedor) como función opt-in por curso. Consideraciones LGPD al habilitarlo:
- Se recomienda consentimiento adicional explícito (uso de "imagen virtual de tutor")
- Divulgación de que es IA (pie de página "Tutor virtual generado por IA")
- No usar voz real de persona pública sin licenciamiento (riesgo de deepfake)
- La API key maestra del proveedor permanece en el servidor y nunca llega al cliente; solo tokens efímeros de sesión llegan al navegador. Ver Avatar & TTS.