{"openapi":"3.0.0","paths":{"/api":{"get":{"operationId":"AppController_getHello","parameters":[],"responses":{"200":{"description":""}},"tags":["App"]}},"/api/health":{"get":{"description":"Endpoint público sin autenticación para que agentes y monitores comprueben que la API responde.","operationId":"AppController_getHealth","parameters":[],"responses":{"200":{"description":"El servicio está operativo.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"service":{"type":"string","example":"satify-survey-api"},"version":{"type":"string","example":"1.0"},"timestamp":{"type":"string","format":"date-time"}}}}}}},"summary":"Estado del servicio","tags":["App","Health"]}},"/api/auth/check-org-name":{"get":{"description":"Comprueba si un nombre de organizacion esta disponible (no requiere autenticacion)","operationId":"AuthController_checkOrgName","parameters":[{"name":"name","required":true,"in":"query","description":"Nombre de la organizacion a verificar (minimo 2 caracteres)","schema":{"type":"string"}}],"responses":{"200":{"description":"Resultado de disponibilidad con sugerencias","content":{"application/json":{"schema":{"example":{"exists":false,"suggestions":[]}}}}}},"summary":"Verificar disponibilidad de nombre de organizacion","tags":["Auth"]}},"/api/auth/register":{"post":{"description":"Crea un nuevo usuario junto con su organizacion","operationId":"AuthController_register","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterDto"}}}},"responses":{"201":{"description":"Usuario registrado exitosamente"},"409":{"description":"El email ya esta registrado"},"429":{"description":"Demasiadas solicitudes"}},"summary":"Registrar nuevo usuario y organizacion","tags":["Auth"]}},"/api/auth/register-invited":{"post":{"description":"Registra un nuevo usuario usando un token de invitacion valido","operationId":"AuthController_registerInvited","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterInvitedDto"}}}},"responses":{"201":{"description":"Usuario registrado via invitacion"},"404":{"description":"Invitacion invalida o expirada"},"409":{"description":"El email ya esta registrado"},"429":{"description":"Demasiadas solicitudes"}},"summary":"Registrar usuario mediante token de invitacion","tags":["Auth"]}},"/api/auth/login":{"post":{"description":"Autentica un usuario con email y contrasena","operationId":"AuthController_login","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginDto"}}}},"responses":{"200":{"description":"Inicio de sesion exitoso o 2FA requerido"},"401":{"description":"Credenciales invalidas"},"403":{"description":"Cuenta bloqueada"},"429":{"description":"Demasiadas solicitudes"}},"summary":"Iniciar sesion","tags":["Auth"]}},"/api/auth/verify-2fa":{"post":{"description":"Valida el codigo de autenticacion de dos factores durante el login","operationId":"AuthController_verifyTwoFactor","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Verify2FALoginDto"}}}},"responses":{"200":{"description":"2FA verificado, inicio de sesion completo"},"401":{"description":"Codigo 2FA o token invalido"},"429":{"description":"Demasiadas solicitudes"}},"summary":"Verificar codigo 2FA para completar inicio de sesion","tags":["Auth"]}},"/api/auth/resend-2fa-email":{"post":{"description":"Reenvia el codigo OTP al correo electronico del usuario","operationId":"AuthController_resend2FAEmail","parameters":[],"responses":{"200":{"description":"OTP reenviado al email"},"400":{"description":"Demasiadas solicitudes"},"401":{"description":"Token temporal invalido"}},"summary":"Reenviar codigo 2FA por email durante el login","tags":["Auth"]}},"/api/auth/google":{"post":{"description":"Verifica un token de Google (credential de Google Sign-In) y crea una nueva cuenta o inicia sesion con un usuario existente. Si el email coincide con una cuenta local existente, la cuenta de Google se vincula automaticamente.","operationId":"AuthController_googleAuth","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAuthDto"}}}},"responses":{"200":{"description":"Inicio de sesion exitoso — retorna usuario, organizacion y tokens"},"401":{"description":"Credencial de Google invalida o email no verificado"},"429":{"description":"Demasiadas solicitudes"}},"summary":"Iniciar sesion o registrarse con Google OAuth","tags":["Auth"]}},"/api/auth/refresh":{"post":{"description":"Genera nuevos tokens usando el refresh token","operationId":"AuthController_refreshTokens","parameters":[],"responses":{"200":{"description":"Tokens refrescados exitosamente"},"401":{"description":"Refresh token invalido"},"429":{"description":"Demasiadas solicitudes"}},"summary":"Refrescar token de acceso","tags":["Auth"]}},"/api/auth/me":{"get":{"description":"Retorna el perfil del usuario autenticado","operationId":"AuthController_getMe","parameters":[],"responses":{"200":{"description":"Perfil de usuario obtenido"},"401":{"description":"No autorizado"}},"security":[{"bearer":[]}],"summary":"Obtener perfil del usuario actual","tags":["Auth"]}},"/api/auth/logout":{"post":{"description":"Invalida el token de acceso y opcionalmente el refresh token","operationId":"AuthController_logout","parameters":[],"responses":{"200":{"description":"Sesion cerrada exitosamente"},"401":{"description":"No autorizado"}},"security":[{"bearer":[]}],"summary":"Cerrar sesion del usuario actual","tags":["Auth"]}},"/api/auth/logout-all":{"post":{"description":"Invalida todas las sesiones activas del usuario","operationId":"AuthController_logoutAll","parameters":[],"responses":{"200":{"description":"Todas las sesiones cerradas exitosamente"},"401":{"description":"No autorizado"}},"security":[{"bearer":[]}],"summary":"Cerrar sesion en todos los dispositivos","tags":["Auth"]}},"/api/auth/forgot-password":{"post":{"description":"Envia un correo con el enlace para restablecer la contrasena","operationId":"AuthController_forgotPassword","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordDto"}}}},"responses":{"200":{"description":"Email de restablecimiento enviado"},"429":{"description":"Demasiadas solicitudes"}},"summary":"Solicitar email de restablecimiento de contrasena","tags":["Auth"]}},"/api/auth/reset-password":{"post":{"description":"Establece una nueva contrasena usando el token de restablecimiento","operationId":"AuthController_resetPassword","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordDto"}}}},"responses":{"200":{"description":"Contrasena restablecida exitosamente"},"400":{"description":"Token invalido o expirado"},"429":{"description":"Demasiadas solicitudes"}},"summary":"Restablecer contrasena con token","tags":["Auth"]}},"/api/auth/verify-email":{"post":{"description":"Confirma la direccion de correo electronico del usuario","operationId":"AuthController_verifyEmail","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailDto"}}}},"responses":{"200":{"description":"Email verificado exitosamente"},"400":{"description":"Token invalido o expirado"},"429":{"description":"Demasiadas solicitudes"}},"summary":"Verificar email con token","tags":["Auth"]}},"/api/auth/resend-verification":{"post":{"description":"Reenvia el enlace de verificacion. Responde igual exista o no la cuenta (anti-enumeracion).","operationId":"AuthController_resendVerification","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendVerificationDto"}}}},"responses":{"200":{"description":"Solicitud procesada"},"401":{"description":"Captcha invalido"},"429":{"description":"Demasiadas solicitudes"}},"summary":"Reenviar email de verificacion","tags":["Auth"]}},"/api/auth/profile":{"put":{"description":"Actualiza los datos del perfil del usuario autenticado","operationId":"AuthController_updateProfile","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProfileDto"}}}},"responses":{"200":{"description":"Perfil actualizado exitosamente"},"401":{"description":"No autorizado"},"409":{"description":"El email ya esta en uso"}},"security":[{"bearer":[]}],"summary":"Actualizar perfil de usuario","tags":["Auth"]}},"/api/auth/password":{"put":{"description":"Cambia la contrasena del usuario autenticado","operationId":"AuthController_changePassword","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordDto"}}}},"responses":{"200":{"description":"Contrasena cambiada exitosamente"},"400":{"description":"Las contrasenas no coinciden"},"401":{"description":"Contrasena actual incorrecta"}},"security":[{"bearer":[]}],"summary":"Cambiar contrasena del usuario","tags":["Auth"]}},"/api/auth/account/link-google":{"post":{"description":"Verifica un token de Google y vincula la cuenta correspondiente al usuario actual. El email de Google debe coincidir con el email del usuario en Satify.","operationId":"AuthController_linkGoogle","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAuthDto"}}}},"responses":{"200":{"description":"Cuenta de Google vinculada exitosamente"},"400":{"description":"Email no coincide, ya vinculado o googleId en uso"},"401":{"description":"Credencial de Google invalida o no autorizado"}},"security":[{"bearer":[]}],"summary":"Vincular cuenta de Google al usuario autenticado","tags":["Auth"]}},"/api/auth/onboarding":{"patch":{"description":"Fusiona los campos proporcionados en el JSON de onboarding del usuario. Solo los campos incluidos en la solicitud se actualizan; los campos existentes se preservan.","operationId":"AuthController_updateOnboarding","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOnboardingDto"}}}},"responses":{"200":{"description":"Estado de onboarding actualizado"},"401":{"description":"No autorizado"}},"security":[{"bearer":[]}],"summary":"Actualizar estado del asistente de onboarding","tags":["Auth"]}},"/api/auth/account/unlink-google":{"delete":{"description":"Elimina el vinculo de la cuenta de Google del usuario actual. El usuario debe tener una contrasena local configurada antes de desvincular para evitar bloqueo de cuenta.","operationId":"AuthController_unlinkGoogle","parameters":[],"responses":{"200":{"description":"Cuenta de Google desvinculada exitosamente"},"400":{"description":"No hay cuenta de Google vinculada o no tiene contrasena local"},"401":{"description":"No autorizado"}},"security":[{"bearer":[]}],"summary":"Desvincular cuenta de Google del usuario autenticado","tags":["Auth"]}},"/api/two-factor/status":{"get":{"operationId":"TwoFactorController_getStatus","parameters":[],"responses":{"200":{"description":"Estado de 2FA retornado"}},"security":[{"bearer":[]}],"summary":"Obtener estado de 2FA y metodos habilitados","tags":["Two-Factor Authentication"]}},"/api/two-factor/generate":{"post":{"operationId":"TwoFactorController_generateSecret","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Setup2FADto"}}}},"responses":{"201":{"description":"Configuracion de 2FA iniciada"}},"security":[{"bearer":[]}],"summary":"Generar secreto 2FA o enviar OTP por email","tags":["Two-Factor Authentication"]}},"/api/two-factor/enable":{"post":{"operationId":"TwoFactorController_enable","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Verify2FADto"}}}},"responses":{"200":{"description":"2FA habilitado con codigos de respaldo"},"401":{"description":"Token invalido"}},"security":[{"bearer":[]}],"summary":"Habilitar 2FA con verificacion","tags":["Two-Factor Authentication"]}},"/api/two-factor/disable":{"delete":{"operationId":"TwoFactorController_disable","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Disable2FADto"}}}},"responses":{"200":{"description":"2FA deshabilitado"},"401":{"description":"Token invalido"}},"security":[{"bearer":[]}],"summary":"Deshabilitar 2FA (metodo especifico o todos)","tags":["Two-Factor Authentication"]}},"/api/two-factor/verify":{"post":{"operationId":"TwoFactorController_verify","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Verify2FADto"}}}},"responses":{"200":{"description":"Token verificado"},"401":{"description":"Token invalido"}},"security":[{"bearer":[]}],"summary":"Verificar token 2FA","tags":["Two-Factor Authentication"]}},"/api/two-factor/backup-codes/count":{"get":{"operationId":"TwoFactorController_getBackupCodesCount","parameters":[],"responses":{"200":{"description":"Retorna la cantidad restante y total de codigos de respaldo","content":{"application/json":{"schema":{"type":"object","properties":{"remaining":{"type":"number","example":7},"total":{"type":"number","example":10}}}}}}},"security":[{"bearer":[]}],"summary":"Obtener cantidad de codigos de respaldo restantes","tags":["Two-Factor Authentication"]}},"/api/two-factor/backup-codes/regenerate":{"post":{"operationId":"TwoFactorController_regenerateBackupCodes","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Verify2FADto"}}}},"responses":{"200":{"description":"Codigos de respaldo regenerados"},"401":{"description":"Token invalido"}},"security":[{"bearer":[]}],"summary":"Regenerar codigos de respaldo","tags":["Two-Factor Authentication"]}},"/api/two-factor/email/resend":{"post":{"operationId":"TwoFactorController_resendEmailOtp","parameters":[],"responses":{"201":{"description":"OTP reenviado"},"400":{"description":"Demasiadas solicitudes"}},"security":[{"bearer":[]}],"summary":"Reenviar codigo OTP por email","tags":["Two-Factor Authentication"]}},"/api/two-factor/verify-sensitive":{"post":{"operationId":"TwoFactorController_verifySensitive","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Verify2FADto"}}}},"responses":{"200":{"description":"Token de accion sensible retornado"},"401":{"description":"Codigo 2FA invalido"}},"security":[{"bearer":[]}],"summary":"Verificar 2FA para accion sensible (cambio de contrasena/email)","tags":["Two-Factor Authentication"]}},"/api/audit-logs":{"get":{"description":"Devuelve una vista paginada del audit trail de la organización en sesión.\n      Solo accesible para roles ADMIN y OWNER. La cadena hash mantiene\n      tamper-evidence; usar GET /audit-logs/verify-chain para validar integridad.","operationId":"AuditController_list","parameters":[{"name":"page","required":false,"in":"query","description":"Página (1-indexed). Default: 1.","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Filas por página. Default: 20, max: 100.","schema":{"example":20,"type":"number"}},{"name":"action","required":false,"in":"query","description":"Filtra por acción exacta (valores del enum AuditAction).","schema":{"example":"USER_ROLE_CHANGED","type":"string"}},{"name":"resource","required":false,"in":"query","description":"Filtra por tipo de recurso (valores del enum AuditResource).","schema":{"example":"User","type":"string"}},{"name":"userId","required":false,"in":"query","description":"Filtra por el actor (userId que ejecutó la acción).","schema":{"type":"string"}}],"responses":{"200":{"description":"Listado paginado","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"action":{"type":"string","example":"USER_ROLE_CHANGED"},"resource":{"type":"string","example":"User"},"resourceId":{"type":"string","nullable":true},"userId":{"type":"string","nullable":true},"userEmail":{"type":"string","nullable":true},"ipAddress":{"type":"string","nullable":true},"userAgent":{"type":"string","nullable":true},"changes":{"type":"object","nullable":true},"createdAt":{"type":"string","format":"date-time"},"hash":{"type":"string","description":"SHA-256 hash de esta entrada en la cadena"},"previousHash":{"type":"string","nullable":true}}}},"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"}}}}}},"401":{"description":"JWT inválido o ausente"},"403":{"description":"Requiere rol ADMIN u OWNER"}},"security":[{"bearer":[]}],"summary":"Lista paginada de audit logs de la organización actual","tags":["Audit"]}},"/api/audit-logs/verify-chain":{"get":{"description":"Recalcula el hash SHA-256 de cada fila usando previousHash + payload\n      canónico y lo compara con el valor almacenado. Cualquier discrepancia indica que\n      la fila fue modificada por fuera del Proxy append-only (raw SQL, restore parcial,\n      etc.). Usar como diagnóstico ad-hoc; el cron diario en AuditScheduler ejecuta\n      esta verificación automáticamente y registra AUDIT_TAMPERING_DETECTED si detecta\n      alteraciones.","operationId":"AuditController_verifyChain","parameters":[{"name":"limit","required":false,"in":"query","description":"Cantidad máxima de filas a verificar. Default: 1000.","schema":{"example":1000,"type":"number"}}],"responses":{"200":{"description":"Resultado de la verificación","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number","description":"Filas verificadas","example":1000},"verified":{"type":"number","description":"Filas con hash correcto","example":1000},"brokenAt":{"type":"array","description":"IDs y hashes esperado/almacenado para filas con tampering","items":{"type":"object","properties":{"id":{"type":"string"},"expectedHash":{"type":"string"},"storedHash":{"type":"string"}}}}}}}}},"401":{"description":"JWT inválido o ausente"},"403":{"description":"Requiere rol ADMIN u OWNER"}},"security":[{"bearer":[]}],"summary":"Verifica la integridad de la cadena hash de audit logs","tags":["Audit"]}},"/api/users/me":{"get":{"description":"Retorna el perfil del usuario autenticado","operationId":"UsersController_getMe","parameters":[],"responses":{"200":{"description":"Perfil de usuario obtenido"}},"security":[{"bearer":[]}],"summary":"Obtener perfil del usuario actual","tags":["Users"]},"put":{"description":"Actualiza los datos del perfil del usuario autenticado","operationId":"UsersController_updateMe","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserDto"}}}},"responses":{"200":{"description":"Perfil de usuario actualizado"}},"security":[{"bearer":[]}],"summary":"Actualizar perfil del usuario actual","tags":["Users"]},"patch":{"description":"Actualiza los datos del perfil del usuario autenticado","operationId":"UsersController_patchMe","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserDto"}}}},"responses":{"200":{"description":"Perfil de usuario actualizado"}},"security":[{"bearer":[]}],"summary":"Actualizar perfil del usuario actual","tags":["Users"]}},"/api/users/me/export":{"get":{"operationId":"UsersController_exportMe","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Users"]}},"/api/users/organization":{"get":{"description":"Retorna la lista de usuarios pertenecientes a la organizacion","operationId":"UsersController_getOrganizationUsers","parameters":[],"responses":{"200":{"description":"Lista de usuarios obtenida"}},"security":[{"bearer":[]}],"summary":"Obtener todos los usuarios de la organizacion actual","tags":["Users"]}},"/api/users/{id}/role":{"patch":{"description":"Actualiza el rol de un usuario dentro de la organizacion","operationId":"UsersController_updateRole","parameters":[{"name":"id","required":true,"in":"path","description":"ID del usuario","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRoleDto"}}}},"responses":{"200":{"description":"Rol actualizado"},"403":{"description":"Solo el OWNER puede cambiar roles"}},"security":[{"bearer":[]}],"summary":"Cambiar rol de un usuario","tags":["Users"]}},"/api/users/{id}":{"delete":{"description":"Realiza un soft delete del usuario especificado","operationId":"UsersController_deleteUser","parameters":[{"name":"id","required":true,"in":"path","description":"ID del usuario","schema":{"type":"string"}}],"responses":{"200":{"description":"Usuario eliminado"},"400":{"description":"No se puede eliminar al propietario de la organizacion"}},"security":[{"bearer":[]}],"summary":"Eliminar un usuario (eliminacion logica)","tags":["Users"]}},"/api/organizations/check-name":{"get":{"description":"Comprueba la disponibilidad del nombre y retorna una sugerencia si ya existe","operationId":"OrganizationsController_checkName","parameters":[{"name":"name","required":true,"in":"query","description":"Nombre a verificar (2-100 caracteres)","schema":{"example":"Acme Inc.","type":"string"}}],"responses":{"200":{"description":"Retorna si el nombre existe y una sugerencia opcional","content":{"application/json":{"schema":{"example":{"exists":true,"suggestion":"Acme Inc. (2)"}}}}},"400":{"description":"Parametro de consulta \"name\" faltante o invalido"}},"security":[{"bearer":[]}],"summary":"Verificar si un nombre de organizacion ya esta en uso","tags":["Organizations"]}},"/api/organizations/current":{"get":{"description":"Retorna los datos de la organizacion a la que pertenece el usuario","operationId":"OrganizationsController_getCurrent","parameters":[],"responses":{"200":{"description":"Organizacion obtenida"}},"security":[{"bearer":[]}],"summary":"Obtener organizacion del usuario actual","tags":["Organizations"]},"put":{"description":"Actualiza los datos de la organizacion del usuario autenticado","operationId":"OrganizationsController_updateCurrent","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOrganizationDto"}}}},"responses":{"200":{"description":"Organizacion actualizada"},"403":{"description":"No autorizado"}},"security":[{"bearer":[]}],"summary":"Actualizar organizacion actual","tags":["Organizations"]}},"/api/organizations/current/stats":{"get":{"description":"Retorna metricas y estadisticas de la organizacion actual","operationId":"OrganizationsController_getStats","parameters":[],"responses":{"200":{"description":"Estadisticas obtenidas"}},"security":[{"bearer":[]}],"summary":"Obtener estadisticas de la organizacion","tags":["Organizations"]}},"/api/organizations/current/invite":{"post":{"description":"Envia una invitacion por email para unirse a la organizacion","operationId":"OrganizationsController_inviteUser","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteUserDto"}}}},"responses":{"201":{"description":"Invitacion enviada"},"403":{"description":"No autorizado o el usuario ya existe"}},"security":[{"bearer":[]}],"summary":"Invitar un usuario a la organizacion","tags":["Organizations"]}},"/api/organizations/current/invitations":{"get":{"description":"Retorna todas las invitaciones pendientes de la organizacion","operationId":"OrganizationsController_getPendingInvitations","parameters":[],"responses":{"200":{"description":"Lista de invitaciones pendientes"}},"security":[{"bearer":[]}],"summary":"Listar invitaciones pendientes","tags":["Organizations"]}},"/api/organizations/current/invitations/{id}":{"delete":{"description":"Cancela una invitacion pendiente de la organizacion","operationId":"OrganizationsController_revokeInvitation","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la invitacion","schema":{"type":"string"}}],"responses":{"200":{"description":"Invitacion revocada"}},"security":[{"bearer":[]}],"summary":"Revocar una invitacion","tags":["Organizations"]}},"/api/organizations/current/invitations/{id}/resend":{"post":{"description":"Reenvia el correo electronico de invitacion al destinatario","operationId":"OrganizationsController_resendInvitation","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la invitacion","schema":{"type":"string"}}],"responses":{"200":{"description":"Invitacion reenviada"}},"security":[{"bearer":[]}],"summary":"Reenviar email de invitacion","tags":["Organizations"]}},"/api/invitations/validate/{token}":{"get":{"description":"Verifica si un token de invitacion es valido y retorna los detalles","operationId":"InvitationsController_validateInvitation","parameters":[{"name":"token","required":true,"in":"path","description":"Token de invitacion","schema":{"type":"string"}}],"responses":{"200":{"description":"Detalles de la invitacion"},"404":{"description":"Token invalido"}},"summary":"Validar un token de invitacion (publico, solo lectura)","tags":["Invitations"]}},"/api/invitations/accept":{"post":{"description":"Acepta una invitacion pendiente usando el token proporcionado","operationId":"InvitationsController_acceptInvitation","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptInvitationDto"}}}},"responses":{"200":{"description":"Invitacion aceptada"},"404":{"description":"Token invalido o invitacion expirada"}},"security":[{"bearer":[]}],"summary":"Aceptar una invitacion mediante token","tags":["Invitations"]}},"/api/subscriptions/current":{"get":{"description":"Retorna los detalles de la suscripcion vigente","operationId":"SubscriptionsController_getCurrentSubscription","parameters":[],"responses":{"200":{"description":"Suscripcion actual obtenida"}},"security":[{"bearer":[]}],"summary":"Obtener suscripcion actual de la organizacion","tags":["Subscriptions"]}},"/api/subscriptions/usage":{"get":{"description":"Retorna el consumo actual de encuestas, respuestas, usuarios y creditos IA","operationId":"SubscriptionsController_getUsage","parameters":[],"responses":{"200":{"description":"Estadisticas de uso obtenidas"}},"security":[{"bearer":[]}],"summary":"Obtener estadisticas de uso actual","tags":["Subscriptions"]}},"/api/subscriptions/start-trial":{"post":{"description":"Activa un periodo de prueba gratuito para el plan seleccionado","operationId":"SubscriptionsController_startTrial","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartTrialDto"}}}},"responses":{"201":{"description":"Prueba gratuita iniciada"},"400":{"description":"Solicitud invalida o ya tiene una suscripcion activa"}},"security":[{"bearer":[]}],"summary":"Iniciar prueba gratuita de 14 dias","tags":["Subscriptions"]}},"/api/subscriptions/upgrade/initiate":{"post":{"description":"Prepara el cambio de plan generando la informacion necesaria para el pago","operationId":"SubscriptionsController_initiateUpgrade","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitiateUpgradeDto"}}}},"responses":{"201":{"description":"Proceso de upgrade iniciado"},"400":{"description":"Solicitud invalida o plan no disponible"}},"security":[{"bearer":[]}],"summary":"Iniciar proceso de upgrade","tags":["Subscriptions"]}},"/api/subscriptions/upgrade/confirm":{"post":{"description":"Confirma el cambio de plan una vez que el pago ha sido procesado","operationId":"SubscriptionsController_confirmUpgrade","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmUpgradeDto"}}}},"responses":{"200":{"description":"Upgrade confirmado exitosamente"},"400":{"description":"Pago no encontrado o ya procesado"}},"security":[{"bearer":[]}],"summary":"Confirmar upgrade despues de pago exitoso","tags":["Subscriptions"]}},"/api/subscriptions/cancel":{"delete":{"description":"Cancela la suscripcion al final del periodo o de forma inmediata","operationId":"SubscriptionsController_cancelSubscription","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelSubscriptionDto"}}}},"responses":{"200":{"description":"Suscripcion cancelada exitosamente"},"400":{"description":"No hay suscripcion activa para cancelar"}},"security":[{"bearer":[]}],"summary":"Cancelar suscripcion","tags":["Subscriptions"]}},"/api/subscriptions/reactivate":{"post":{"description":"Revierte la cancelacion de una suscripcion que aun no ha expirado","operationId":"SubscriptionsController_reactivateSubscription","parameters":[],"responses":{"200":{"description":"Suscripcion reactivada exitosamente"},"400":{"description":"La suscripcion no esta pendiente de cancelacion"}},"security":[{"bearer":[]}],"summary":"Reactivar suscripcion programada para cancelacion","tags":["Subscriptions"]}},"/api/subscriptions/limits/{limitType}":{"get":{"description":"Comprueba si la organizacion ha alcanzado el limite de un recurso especifico","operationId":"SubscriptionsController_checkLimit","parameters":[{"name":"limitType","required":true,"in":"path","description":"Tipo de limite a verificar (surveys, responses, users, ai_credits)","schema":{"example":"surveys","type":"string"}}],"responses":{"200":{"description":"Estado del limite obtenido"}},"security":[{"bearer":[]}],"summary":"Verificar si un limite ha sido alcanzado","tags":["Subscriptions"]}},"/api/instances":{"get":{"operationId":"InstancesController_findAll","parameters":[],"responses":{"200":{"description":"Instancias obtenidas"}},"security":[{"bearer":[]}],"summary":"Listar todas las instancias de la organizacion","tags":["Instances"]},"post":{"operationId":"InstancesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInstanceDto"}}}},"responses":{"201":{"description":"Instancia creada"}},"security":[{"bearer":[]}],"summary":"Crear una nueva instancia","tags":["Instances"]}},"/api/instances/{id}":{"get":{"operationId":"InstancesController_findById","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la instancia","schema":{"type":"string"}}],"responses":{"200":{"description":"Instancia obtenida"},"404":{"description":"Instancia no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener instancia por ID","tags":["Instances"]},"patch":{"operationId":"InstancesController_update","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la instancia","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateInstanceDto"}}}},"responses":{"200":{"description":"Instancia actualizada"},"404":{"description":"Instancia no encontrada"}},"security":[{"bearer":[]}],"summary":"Actualizar una instancia","tags":["Instances"]},"delete":{"operationId":"InstancesController_delete","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la instancia","schema":{"type":"string"}}],"responses":{"200":{"description":"Instancia eliminada"},"400":{"description":"No se puede eliminar la instancia por defecto o con encuestas asociadas"}},"security":[{"bearer":[]}],"summary":"Eliminar una instancia (soft delete)","tags":["Instances"]}},"/api/instances/{id}/default":{"post":{"operationId":"InstancesController_setDefault","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la instancia","schema":{"type":"string"}}],"responses":{"200":{"description":"Instancia establecida como predeterminada"},"404":{"description":"Instancia no encontrada"}},"security":[{"bearer":[]}],"summary":"Establecer instancia como predeterminada","tags":["Instances"]}},"/api/surveys":{"post":{"operationId":"SurveysController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSurveyDto"}}}},"responses":{"201":{"description":"Encuesta creada"},"403":{"description":"Prohibido - Permisos insuficientes"}},"security":[{"bearer":[]}],"summary":"Crear una nueva encuesta","tags":["Surveys"]},"get":{"operationId":"SurveysController_findAll","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":20,"type":"number"}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["DRAFT","ACTIVE","PAUSED","CLOSED"]}},{"name":"favorite","required":false,"in":"query","description":"Filter by favorite flag (true/false)","schema":{"type":"boolean"}},{"name":"instanceId","required":false,"in":"query","schema":{"type":"string"}},{"name":"archived","required":false,"in":"query","description":"Filter by archived flag (true/false)","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Lista de encuestas con paginacion"}},"security":[{"bearer":[]}],"summary":"Obtener todas las encuestas de la organizacion","tags":["Surveys"]}},"/api/surveys/bulk":{"post":{"operationId":"SurveysController_bulkOperation","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkOperationDto"}}}},"responses":{"200":{"description":"Resultado de la operacion masiva"},"403":{"description":"Prohibido - Permisos insuficientes"}},"security":[{"bearer":[]}],"summary":"Operacion masiva sobre encuestas (eliminar, archivar, activar, pausar)","tags":["Surveys"]}},"/api/surveys/public/{identifier}":{"get":{"operationId":"SurveysController_findBySlug","parameters":[{"name":"identifier","required":true,"in":"path","description":"Slug o ID publico de la encuesta","schema":{"type":"string"}}],"responses":{"200":{"description":"Encuesta obtenida"},"404":{"description":"Encuesta no encontrada o no activa"}},"summary":"Obtener una encuesta publica por ID o slug","tags":["Surveys"]}},"/api/surveys/{id}":{"get":{"operationId":"SurveysController_findById","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}}],"responses":{"200":{"description":"Encuesta obtenida"},"404":{"description":"Encuesta no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener una encuesta por ID","tags":["Surveys"]},"put":{"operationId":"SurveysController_update","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSurveyDto"}}}},"responses":{"200":{"description":"Encuesta actualizada"},"404":{"description":"Encuesta no encontrada"}},"security":[{"bearer":[]}],"summary":"Actualizar una encuesta","tags":["Surveys"]},"delete":{"operationId":"SurveysController_delete","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}}],"responses":{"200":{"description":"Encuesta eliminada"},"403":{"description":"Prohibido - Permisos insuficientes"}},"security":[{"bearer":[]}],"summary":"Eliminar una encuesta (eliminacion logica)","tags":["Surveys"]}},"/api/surveys/{id}/preview":{"get":{"operationId":"SurveysController_findForPreview","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}}],"responses":{"200":{"description":"Datos de vista previa obtenidos"},"404":{"description":"Encuesta no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener datos de vista previa de la encuesta con preguntas (ignora estado)","tags":["Surveys"]}},"/api/surveys/{id}/archive":{"put":{"operationId":"SurveysController_archiveSurvey","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}}],"responses":{"200":{"description":"Encuesta archivada"},"400":{"description":"No se puede archivar una encuesta activa"},"404":{"description":"Encuesta no encontrada"}},"security":[{"bearer":[]}],"summary":"Archivar una encuesta (ocultar de la lista principal)","tags":["Surveys"]}},"/api/surveys/{id}/unarchive":{"put":{"operationId":"SurveysController_unarchiveSurvey","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}}],"responses":{"200":{"description":"Encuesta desarchivada"},"404":{"description":"Encuesta no encontrada"}},"security":[{"bearer":[]}],"summary":"Desarchivar una encuesta (restaurar a la lista principal)","tags":["Surveys"]}},"/api/surveys/{id}/favorite":{"put":{"operationId":"SurveysController_toggleFavorite","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}}],"responses":{"200":{"description":"Estado de favorito alternado"}},"security":[{"bearer":[]}],"summary":"Alternar estado de favorito de la encuesta","tags":["Surveys"]}},"/api/surveys/{id}/duplicate":{"post":{"operationId":"SurveysController_duplicate","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}}],"responses":{"201":{"description":"Encuesta duplicada"}},"security":[{"bearer":[]}],"summary":"Duplicar una encuesta","tags":["Surveys"]}},"/api/surveys/{id}/qr":{"get":{"operationId":"SurveysController_generateQR","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}}],"responses":{"200":{"description":"Codigo QR generado","content":{"application/json":{"schema":{"type":"object","properties":{"surveyId":{"type":"string"},"surveyName":{"type":"string"},"surveyUrl":{"type":"string"},"qrCode":{"type":"string","description":"URL de datos Base64"},"format":{"type":"string","example":"png"},"size":{"type":"number","example":512}}}}}}},"security":[{"bearer":[]}],"summary":"Generar codigo QR para la encuesta","tags":["Surveys"]}},"/api/surveys/{id}/publish":{"post":{"operationId":"SurveysController_publishSurvey","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}}],"responses":{"201":{"description":"Encuesta publicada e instantanea creada"},"400":{"description":"La encuesta no tiene preguntas"},"404":{"description":"Encuesta no encontrada"}},"security":[{"bearer":[]}],"summary":"Publicar o republicar una encuesta (crea una instantanea de version)","tags":["Surveys"]}},"/api/surveys/{id}/versions":{"get":{"operationId":"SurveysController_getSurveyVersions","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}}],"responses":{"200":{"description":"Lista de versiones obtenida"},"404":{"description":"Encuesta no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener todas las instantaneas de version de una encuesta","tags":["Surveys"]}},"/api/surveys/{id}/versions/{version}":{"get":{"operationId":"SurveysController_getSurveyVersion","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"version","required":true,"in":"path","description":"Numero de version","schema":{"type":"number"}}],"responses":{"200":{"description":"Instantanea de version obtenida"},"404":{"description":"Encuesta o version no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener una instantanea de version especifica","tags":["Surveys"]}},"/api/surveys/{id}/stats":{"get":{"operationId":"SurveysController_getStats","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"ISO date string (YYYY-MM-DD or full ISO)","schema":{"type":"string"}},{"name":"endDate","required":false,"in":"query","description":"ISO date string (YYYY-MM-DD or full ISO)","schema":{"type":"string"}}],"responses":{"200":{"description":"Estadisticas obtenidas"}},"security":[{"bearer":[]}],"summary":"Obtener estadisticas de la encuesta","tags":["Surveys"]}},"/api/webhooks":{"get":{"operationId":"WebhooksController_findAll","parameters":[],"responses":{"200":{"description":"Lista de webhooks"}},"security":[{"bearer":[]}],"summary":"Listar todos los webhooks de la organizacion","tags":["Webhooks"]},"post":{"operationId":"WebhooksController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookDto"}}}},"responses":{"201":{"description":"Webhook creado"}},"security":[{"bearer":[]}],"summary":"Crear un nuevo webhook","tags":["Webhooks"]}},"/api/webhooks/{id}":{"get":{"operationId":"WebhooksController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"ID del webhook","schema":{"type":"string"}}],"responses":{"200":{"description":"Detalle del webhook"},"404":{"description":"Webhook no encontrado"}},"security":[{"bearer":[]}],"summary":"Obtener un webhook por ID","tags":["Webhooks"]},"patch":{"operationId":"WebhooksController_update","parameters":[{"name":"id","required":true,"in":"path","description":"ID del webhook","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookDto"}}}},"responses":{"200":{"description":"Webhook actualizado"},"404":{"description":"Webhook no encontrado"}},"security":[{"bearer":[]}],"summary":"Actualizar un webhook","tags":["Webhooks"]},"delete":{"operationId":"WebhooksController_remove","parameters":[{"name":"id","required":true,"in":"path","description":"ID del webhook","schema":{"type":"string"}}],"responses":{"200":{"description":"Webhook desactivado"},"404":{"description":"Webhook no encontrado"}},"security":[{"bearer":[]}],"summary":"Desactivar (soft-delete) un webhook","tags":["Webhooks"]}},"/api/webhooks/{id}/deliveries":{"get":{"operationId":"WebhooksController_getDeliveries","parameters":[{"name":"id","required":true,"in":"path","description":"ID del webhook","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Entradas del log de entregas"}},"security":[{"bearer":[]}],"summary":"Obtener registros de entregas de un webhook","tags":["Webhooks"]}},"/api/webhooks/{id}/test":{"post":{"operationId":"WebhooksController_testWebhook","parameters":[{"name":"id","required":true,"in":"path","description":"ID del webhook","schema":{"type":"string"}}],"responses":{"201":{"description":"Resultado de la entrega de prueba"},"404":{"description":"Webhook no encontrado"}},"security":[{"bearer":[]}],"summary":"Enviar un evento de prueba a la URL del webhook","tags":["Webhooks"]}},"/api/webhooks/{id}/rotate-secret":{"post":{"description":"Generates a new HMAC secret and replaces the existing one immediately. The new secret is returned ONCE — the caller must persist it. The old secret stops working as soon as this call succeeds.","operationId":"WebhooksController_rotateSecret","parameters":[{"name":"id","required":true,"in":"path","description":"ID del webhook","schema":{"type":"string"}}],"responses":{"200":{"description":"Secret rotated successfully"},"404":{"description":"Webhook not found"}},"security":[{"bearer":[]}],"summary":"Rotate webhook HMAC secret","tags":["Webhooks"]}},"/api/surveys/{surveyId}/questions":{"post":{"operationId":"QuestionsController_create","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateQuestionDto"}}}},"responses":{"201":{"description":"Pregunta creada"},"403":{"description":"Prohibido - Permisos insuficientes"}},"security":[{"bearer":[]}],"summary":"Crear una nueva pregunta","tags":["Questions"]},"get":{"operationId":"QuestionsController_findAll","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}}],"responses":{"200":{"description":"Lista de preguntas obtenida"}},"security":[{"bearer":[]}],"summary":"Obtener todas las preguntas de una encuesta","tags":["Questions"]}},"/api/surveys/{surveyId}/questions/{id}":{"get":{"operationId":"QuestionsController_findById","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"ID de la pregunta","schema":{"type":"string"}}],"responses":{"200":{"description":"Pregunta obtenida"},"404":{"description":"Pregunta no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener una pregunta por ID","tags":["Questions"]},"put":{"operationId":"QuestionsController_update","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"ID de la pregunta","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateQuestionDto"}}}},"responses":{"200":{"description":"Pregunta actualizada"},"404":{"description":"Pregunta no encontrada"}},"security":[{"bearer":[]}],"summary":"Actualizar una pregunta","tags":["Questions"]},"delete":{"operationId":"QuestionsController_delete","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"ID de la pregunta","schema":{"type":"string"}}],"responses":{"200":{"description":"Pregunta eliminada"},"403":{"description":"Prohibido - Permisos insuficientes"},"404":{"description":"Pregunta no encontrada"}},"security":[{"bearer":[]}],"summary":"Eliminar una pregunta","tags":["Questions"]}},"/api/surveys/{surveyId}/questions/reorder":{"put":{"operationId":"QuestionsController_reorder","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"questionIds":{"type":"array","items":{"type":"string"}}},"required":["questionIds"]}}}},"responses":{"200":{"description":"Preguntas reordenadas"}},"security":[{"bearer":[]}],"summary":"Reordenar preguntas","tags":["Questions"]}},"/api/surveys/{surveyId}/questions/{id}/options":{"post":{"operationId":"QuestionsController_addOption","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"ID de la pregunta","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"]}}}},"responses":{"201":{"description":"Opcion agregada"},"404":{"description":"Pregunta no encontrada"}},"security":[{"bearer":[]}],"summary":"Agregar una opcion a una pregunta","tags":["Questions"]}},"/api/surveys/{surveyId}/questions/{questionId}/options/{optionId}":{"delete":{"operationId":"QuestionsController_removeOption","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"questionId","required":true,"in":"path","description":"ID de la pregunta","schema":{"type":"string"}},{"name":"optionId","required":true,"in":"path","description":"ID de la opcion","schema":{"type":"string"}}],"responses":{"200":{"description":"Opcion eliminada"},"404":{"description":"Opcion no encontrada"}},"security":[{"bearer":[]}],"summary":"Eliminar una opcion de una pregunta","tags":["Questions"]}},"/api/surveys/{surveyId}/questions/{questionId}/logic-rules":{"get":{"operationId":"QuestionsController_getLogicRules","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"questionId","required":true,"in":"path","description":"ID de la pregunta","schema":{"type":"string"}}],"responses":{"200":{"description":"Reglas de logica obtenidas"},"404":{"description":"Pregunta no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener reglas de logica de una pregunta","tags":["Questions"]},"post":{"operationId":"QuestionsController_createLogicRule","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"questionId","required":true,"in":"path","description":"ID de la pregunta","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLogicRuleDto"}}}},"responses":{"201":{"description":"Regla de logica creada"},"404":{"description":"Pregunta no encontrada"}},"security":[{"bearer":[]}],"summary":"Crear una regla de logica para una pregunta","tags":["Questions"]}},"/api/surveys/{surveyId}/questions/{questionId}/logic-rules/{ruleId}":{"put":{"operationId":"QuestionsController_updateLogicRule","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"questionId","required":true,"in":"path","description":"ID de la pregunta","schema":{"type":"string"}},{"name":"ruleId","required":true,"in":"path","description":"ID de la regla de logica","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLogicRuleDto"}}}},"responses":{"200":{"description":"Regla de logica actualizada"},"404":{"description":"Regla de logica no encontrada"}},"security":[{"bearer":[]}],"summary":"Actualizar una regla de logica","tags":["Questions"]},"delete":{"operationId":"QuestionsController_deleteLogicRule","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"questionId","required":true,"in":"path","description":"ID de la pregunta","schema":{"type":"string"}},{"name":"ruleId","required":true,"in":"path","description":"ID de la regla de logica","schema":{"type":"string"}}],"responses":{"200":{"description":"Regla de logica eliminada"},"404":{"description":"Regla de logica no encontrada"}},"security":[{"bearer":[]}],"summary":"Eliminar una regla de logica","tags":["Questions"]}},"/api/responses/surveys/{surveyId}/can-respond":{"get":{"operationId":"ResponsesController_canRespond","parameters":[{"name":"surveyId","required":true,"in":"path","schema":{"type":"string"}},{"name":"respondentId","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Indica si el usuario puede responder","content":{"application/json":{"schema":{"type":"object","properties":{"canRespond":{"type":"boolean"},"reason":{"type":"string"}}}}}}},"summary":"Verificar si el usuario puede responder la encuesta","tags":["Responses"]}},"/api/responses/surveys/{surveyId}":{"post":{"operationId":"ResponsesController_submitResponses","parameters":[{"name":"surveyId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitResponseDto"}}}},"responses":{"201":{"description":"Respuestas enviadas"},"400":{"description":"Ya respondio o error de validacion"},"404":{"description":"Encuesta no encontrada o no activa"}},"summary":"Enviar respuestas de encuesta","tags":["Responses"]}},"/api/responses":{"get":{"operationId":"ResponsesController_getResponses","parameters":[{"name":"surveyId","required":false,"in":"query","schema":{"type":"string"}},{"name":"channel","required":false,"in":"query","schema":{"type":"string"}},{"name":"deviceType","required":false,"in":"query","schema":{"type":"string"}},{"name":"completedOnly","required":false,"in":"query","schema":{"type":"boolean"}},{"name":"startDate","required":false,"in":"query","schema":{"type":"string"}},{"name":"endDate","required":false,"in":"query","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Resultados por pagina (por defecto 20, maximo 100)","schema":{"type":"number"}},{"name":"showDiscarded","required":false,"in":"query","description":"Cuando es true, retorna solo sesiones descartadas (eliminadas logicamente)","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Respuestas obtenidas con paginacion"},"401":{"description":"No autenticado"},"403":{"description":"Sin permisos"}},"security":[{"bearer":[]}],"summary":"Obtener todas las respuestas de la organizacion","tags":["Responses"]}},"/api/responses/sessions/{sessionId}":{"get":{"operationId":"ResponsesController_getSession","parameters":[{"name":"sessionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Sesion obtenida"},"401":{"description":"No autenticado"},"403":{"description":"Sin permisos"},"404":{"description":"Sesion no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener una sesion de respuesta especifica","tags":["Responses"]},"delete":{"operationId":"ResponsesController_deleteSession","parameters":[{"name":"sessionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Sesion eliminada"},"401":{"description":"No autenticado"},"403":{"description":"Sin permisos"},"404":{"description":"Sesion no encontrada"}},"security":[{"bearer":[]}],"summary":"Eliminar una sesion de respuesta","tags":["Responses"]}},"/api/responses/analytics/{surveyId}":{"get":{"operationId":"ResponsesController_getAnalytics","parameters":[{"name":"surveyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Analiticas obtenidas"},"401":{"description":"No autenticado"},"403":{"description":"Sin permisos"}},"security":[{"bearer":[]}],"summary":"Obtener analiticas de una encuesta","tags":["Responses"]}},"/api/responses/backfill-device-types":{"patch":{"operationId":"ResponsesController_backfillDeviceTypes","parameters":[],"responses":{"200":{"description":"Tipos de dispositivo rellenados"},"401":{"description":"No autenticado"},"403":{"description":"Sin permisos"}},"security":[{"bearer":[]}],"summary":"Rellenar tipo de dispositivo para sesiones existentes","tags":["Responses"]}},"/api/responses/live/{surveyId}":{"get":{"operationId":"ResponsesController_liveResponses","parameters":[{"name":"surveyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Stream SSE. Eventos: { type: \"connected\" | \"keepalive\" } o { type: \"response\", sessionId, respondentId, channel, completedAt }"},"401":{"description":"No autenticado"},"403":{"description":"Sin permisos"},"404":{"description":"Encuesta no encontrada"}},"security":[{"bearer":[]}],"summary":"Stream SSE de nuevas respuestas para una encuesta","tags":["Responses"]}},"/api/responses/sessions/restore":{"patch":{"operationId":"ResponsesController_restoreSessions","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkSessionIdsDto"}}}},"responses":{"200":{"description":"Sesiones restauradas"},"401":{"description":"No autenticado"},"403":{"description":"Sin permisos"}},"security":[{"bearer":[]}],"summary":"Restaurar multiples sesiones descartadas","tags":["Responses"]}},"/api/responses/sessions/{sessionId}/restore":{"patch":{"operationId":"ResponsesController_restoreSession","parameters":[{"name":"sessionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Sesion restaurada"},"401":{"description":"No autenticado"},"403":{"description":"Sin permisos"},"404":{"description":"Sesion no encontrada o no descartada"}},"security":[{"bearer":[]}],"summary":"Restaurar una sesion descartada","tags":["Responses"]}},"/api/responses/sessions":{"delete":{"operationId":"ResponsesController_deleteSessions","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkSessionIdsDto"}}}},"responses":{"200":{"description":"Sesiones eliminadas"},"401":{"description":"No autenticado"},"403":{"description":"Sin permisos"}},"security":[{"bearer":[]}],"summary":"Eliminar sesiones de respuesta masivamente","tags":["Responses"]}},"/api/billing/usage":{"get":{"description":"Retorna el resumen de consumo de respuestas del periodo de facturacion vigente","operationId":"BillingController_getUsage","parameters":[],"responses":{"200":{"description":"Resumen de uso retornado correctamente"}},"security":[{"bearer":[]}],"summary":"Obtener resumen de uso del periodo actual","tags":["Billing"]}},"/api/billing/packs/catalog":{"get":{"description":"Lista todos los packs de respuestas disponibles para compra","operationId":"BillingController_getPackCatalog","parameters":[],"responses":{"200":{"description":"Catalogo de packs retornado correctamente"}},"security":[{"bearer":[]}],"summary":"Obtener catalogo de packs de respuestas","tags":["Billing"]}},"/api/billing/packs":{"get":{"description":"Lista los packs de respuestas adquiridos por la organizacion","operationId":"BillingController_getOrgPacks","parameters":[],"responses":{"200":{"description":"Packs de la organizacion retornados correctamente"}},"security":[{"bearer":[]}],"summary":"Obtener packs comprados por la organizacion","tags":["Billing"]}},"/api/billing/packs/purchase":{"post":{"description":"Inicia el proceso de compra de un pack de respuestas adicional","operationId":"BillingController_purchasePack","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchasePackDto"}}}},"responses":{"201":{"description":"Pack comprado correctamente"},"400":{"description":"Error de validacion en los datos de compra"}},"security":[{"bearer":[]}],"summary":"Comprar un pack de respuestas","tags":["Billing"]}},"/api/billing/settings":{"get":{"description":"Retorna los datos de facturacion de la organizacion","operationId":"BillingController_getBillingSettings","parameters":[],"responses":{"200":{"description":"Configuracion de facturacion retornada correctamente"}},"security":[{"bearer":[]}],"summary":"Obtener configuracion de facturacion","tags":["Billing"]},"patch":{"description":"Actualiza nombre, RUT, direccion, email y configuracion de compra automatica","operationId":"BillingController_updateBillingSettings","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBillingSettingsDto"}}}},"responses":{"200":{"description":"Configuracion de facturacion actualizada correctamente"},"400":{"description":"Error de validacion en los datos de facturacion"}},"security":[{"bearer":[]}],"summary":"Actualizar configuracion de facturacion","tags":["Billing"]}},"/api/invoices":{"get":{"description":"Obtiene todas las facturas de la organizacion con paginacion","operationId":"InvoicesController_getInvoices","parameters":[{"name":"limit","required":false,"in":"query","description":"Limite de resultados por pagina","schema":{"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Numero de resultados a omitir","schema":{"type":"number"}}],"responses":{"200":{"description":"Lista de facturas retornada correctamente"}},"security":[{"bearer":[]}],"summary":"Listar facturas","tags":["Invoices"]}},"/api/invoices/{id}":{"get":{"description":"Retorna la informacion completa de una factura especifica","operationId":"InvoicesController_getInvoice","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la factura","schema":{"type":"string"}}],"responses":{"200":{"description":"Detalle de factura retornado correctamente"},"404":{"description":"Factura no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener detalle de factura","tags":["Invoices"]}},"/api/invoices/{id}/pdf":{"get":{"description":"Genera y descarga el archivo PDF de la factura","operationId":"InvoicesController_downloadPdf","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la factura","schema":{"type":"string"}}],"responses":{"200":{"description":"PDF de factura generado y retornado correctamente"},"404":{"description":"Factura no encontrada"}},"security":[{"bearer":[]}],"summary":"Descargar factura en PDF","tags":["Invoices"]}},"/api/invoices/{id}/void":{"post":{"description":"Marca una factura como anulada","operationId":"InvoicesController_voidInvoice","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la factura a anular","schema":{"type":"string"}}],"responses":{"200":{"description":"Factura anulada correctamente"},"400":{"description":"La factura no puede ser anulada en su estado actual"},"404":{"description":"Factura no encontrada"}},"security":[{"bearer":[]}],"summary":"Anular una factura","tags":["Invoices"]}},"/api/payments/initiate":{"post":{"description":"Crea un checkout en el proveedor de pago seleccionado y retorna la URL de redireccion","operationId":"PaymentsController_initiatePayment","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitiatePaymentDto"}}}},"responses":{"201":{"description":"Pago iniciado correctamente, URL de checkout retornada"},"400":{"description":"Error de validacion en los datos del pago"}},"security":[{"bearer":[]}],"summary":"Iniciar un pago para upgrade de plan","tags":["Payments"]}},"/api/payments/webhook/webpay":{"post":{"description":"Recibe el token_ws (pago exitoso) o TBK_TOKEN (usuario abortó) tras el redirect desde Webpay.","operationId":"PaymentsController_handleWebpayWebhook","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookWebpayDto"}}}},"responses":{"200":{"description":"Webhook de Webpay procesado correctamente"}},"summary":"Endpoint de retorno de Webpay (Transbank)","tags":["Payments"]}},"/api/payments/webhook/mercadopago":{"post":{"description":"Recibe notificaciones de estado de pago desde Mercado Pago (firmadas con HMAC SHA256)","operationId":"PaymentsController_handleMercadoPagoWebhook","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookMercadoPagoDto"}}}},"responses":{"200":{"description":"Webhook de Mercado Pago procesado correctamente"}},"summary":"Endpoint de webhook de Mercado Pago","tags":["Payments"]}},"/api/payments/webhook/paypal":{"post":{"description":"Recibe notificaciones de estado de pago desde PayPal","operationId":"PaymentsController_handlePayPalWebhook","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookPayPalDto"}}}},"responses":{"200":{"description":"Webhook de PayPal procesado correctamente"}},"summary":"Endpoint de webhook de PayPal","tags":["Payments"]}},"/api/payments/webhook/flow":{"post":{"description":"Recibe notificaciones de estado de pago desde Flow","operationId":"PaymentsController_handleFlowWebhook","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookFlowDto"}}}},"responses":{"200":{"description":"Webhook de Flow procesado correctamente"}},"summary":"Endpoint de webhook de Flow","tags":["Payments"]}},"/api/payments/providers":{"get":{"description":"Lista los proveedores de pago habilitados en la plataforma","operationId":"PaymentsController_getProviders","parameters":[],"responses":{"200":{"description":"Lista de proveedores de pago retornada correctamente"}},"security":[{"bearer":[]}],"summary":"Obtener proveedores de pago disponibles","tags":["Payments"]}},"/api/payments":{"get":{"description":"Lista los pagos realizados por la organizacion con paginacion","operationId":"PaymentsController_getPaymentHistory","parameters":[{"name":"limit","required":false,"in":"query","description":"Limite de resultados por pagina","schema":{"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Numero de resultados a omitir","schema":{"type":"number"}}],"responses":{"200":{"description":"Historial de pagos retornado correctamente"}},"security":[{"bearer":[]}],"summary":"Obtener historial de pagos","tags":["Payments"]}},"/api/payments/{id}":{"get":{"description":"Retorna la informacion detallada de un pago especifico","operationId":"PaymentsController_getPayment","parameters":[{"name":"id","required":true,"in":"path","description":"ID del pago","schema":{"type":"string"}}],"responses":{"200":{"description":"Detalle del pago retornado correctamente"},"404":{"description":"Pago no encontrado"}},"security":[{"bearer":[]}],"summary":"Obtener detalle de un pago","tags":["Payments"]},"delete":{"description":"Cancela un pago que aun no ha sido completado","operationId":"PaymentsController_cancelPayment","parameters":[{"name":"id","required":true,"in":"path","description":"ID del pago a cancelar","schema":{"type":"string"}}],"responses":{"200":{"description":"Pago cancelado correctamente"},"404":{"description":"Pago no encontrado"}},"security":[{"bearer":[]}],"summary":"Cancelar un pago pendiente","tags":["Payments"]}},"/api/payments/{id}/refund":{"post":{"description":"Solicita un reembolso total o parcial de un pago ya completado","operationId":"PaymentsController_createRefund","parameters":[{"name":"id","required":true,"in":"path","description":"ID del pago a reembolsar","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"amount":{"type":"number","description":"Monto a reembolsar (omitir para reembolso total)"}}}}}},"responses":{"201":{"description":"Reembolso creado correctamente"},"404":{"description":"Pago no encontrado"}},"security":[{"bearer":[]}],"summary":"Crear reembolso de un pago completado","tags":["Payments"]}},"/api/reports/surveys/{surveyId}/summary":{"get":{"operationId":"ReportsController_getSurveySummary","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"Start date (ISO 8601)","schema":{"example":"2025-01-01T00:00:00.000Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"End date (ISO 8601)","schema":{"example":"2025-12-31T23:59:59.999Z","type":"string"}}],"responses":{"200":{"description":"Resumen obtenido exitosamente"},"401":{"description":"No autenticado"},"404":{"description":"Encuesta no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener resumen de encuesta con todas las métricas","tags":["Reports"]}},"/api/reports/surveys/{surveyId}/questions/{questionId}/csat":{"get":{"operationId":"ReportsController_getCSATSummary","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"questionId","required":true,"in":"path","description":"ID de la pregunta CSAT","schema":{"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"Start date (ISO 8601)","schema":{"example":"2025-01-01T00:00:00.000Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"End date (ISO 8601)","schema":{"example":"2025-12-31T23:59:59.999Z","type":"string"}}],"responses":{"200":{"description":"Resumen CSAT obtenido exitosamente"},"401":{"description":"No autenticado"},"404":{"description":"Encuesta o pregunta no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener resumen CSAT para una pregunta","tags":["Reports"]}},"/api/reports/surveys/{surveyId}/questions/{questionId}/nps":{"get":{"operationId":"ReportsController_getNPSSummary","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"questionId","required":true,"in":"path","description":"ID de la pregunta NPS","schema":{"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"Start date (ISO 8601)","schema":{"example":"2025-01-01T00:00:00.000Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"End date (ISO 8601)","schema":{"example":"2025-12-31T23:59:59.999Z","type":"string"}}],"responses":{"200":{"description":"Resumen NPS obtenido exitosamente"},"401":{"description":"No autenticado"},"404":{"description":"Encuesta o pregunta no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener resumen NPS para una pregunta","tags":["Reports"]}},"/api/reports/surveys/{surveyId}/questions/{questionId}/ces":{"get":{"operationId":"ReportsController_getCESSummary","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"questionId","required":true,"in":"path","description":"ID de la pregunta CES","schema":{"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"Start date (ISO 8601)","schema":{"example":"2025-01-01T00:00:00.000Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"End date (ISO 8601)","schema":{"example":"2025-12-31T23:59:59.999Z","type":"string"}}],"responses":{"200":{"description":"Resumen CES obtenido exitosamente"},"401":{"description":"No autenticado"},"404":{"description":"Encuesta o pregunta no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener resumen CES para una pregunta","tags":["Reports"]}},"/api/reports/surveys/{surveyId}/questions/{questionId}/options":{"get":{"operationId":"ReportsController_getOptionsDistribution","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"questionId","required":true,"in":"path","description":"ID de la pregunta de opciones","schema":{"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"Start date (ISO 8601)","schema":{"example":"2025-01-01T00:00:00.000Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"End date (ISO 8601)","schema":{"example":"2025-12-31T23:59:59.999Z","type":"string"}}],"responses":{"200":{"description":"Distribución de opciones obtenida exitosamente"},"401":{"description":"No autenticado"},"404":{"description":"Encuesta o pregunta no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener distribución de opciones para una pregunta","tags":["Reports"]}},"/api/reports/surveys/{surveyId}/comments":{"get":{"operationId":"ReportsController_getComments","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"Start date (ISO 8601)","schema":{"example":"2025-01-01T00:00:00.000Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"End date (ISO 8601)","schema":{"example":"2025-12-31T23:59:59.999Z","type":"string"}},{"name":"questionId","required":false,"in":"query","description":"Filter by question ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Comentarios obtenidos exitosamente"},"401":{"description":"No autenticado"},"404":{"description":"Encuesta no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener todos los comentarios de una encuesta","tags":["Reports"]}},"/api/reports/surveys/{surveyId}/trends":{"get":{"operationId":"ReportsController_getTrends","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"Start date (ISO 8601)","schema":{"example":"2025-01-01T00:00:00.000Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"End date (ISO 8601)","schema":{"example":"2025-12-31T23:59:59.999Z","type":"string"}},{"name":"groupBy","required":false,"in":"query","schema":{"default":"week","type":"string","enum":["day","week","month"]}}],"responses":{"200":{"description":"Tendencias obtenidas exitosamente"},"401":{"description":"No autenticado"},"404":{"description":"Encuesta no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener tendencias de respuestas a lo largo del tiempo","tags":["Reports"]}},"/api/reports/surveys/{surveyId}/questions/{questionId}/rating":{"get":{"operationId":"ReportsController_getRatingSummary","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"questionId","required":true,"in":"path","description":"ID de la pregunta de calificación","schema":{"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"Start date (ISO 8601)","schema":{"example":"2025-01-01T00:00:00.000Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"End date (ISO 8601)","schema":{"example":"2025-12-31T23:59:59.999Z","type":"string"}}],"responses":{"200":{"description":"Resumen de calificación obtenido exitosamente"},"401":{"description":"No autenticado"},"404":{"description":"Encuesta o pregunta no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener resumen de calificación para una pregunta","tags":["Reports"]}},"/api/reports/surveys/{surveyId}/questions/{questionId}/text":{"get":{"operationId":"ReportsController_getTextSummary","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"questionId","required":true,"in":"path","description":"ID de la pregunta de texto","schema":{"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"Start date (ISO 8601)","schema":{"example":"2025-01-01T00:00:00.000Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"End date (ISO 8601)","schema":{"example":"2025-12-31T23:59:59.999Z","type":"string"}}],"responses":{"200":{"description":"Análisis de texto obtenido exitosamente"},"401":{"description":"No autenticado"},"404":{"description":"Encuesta o pregunta no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener análisis de texto para una pregunta","tags":["Reports"]}},"/api/reports/surveys/{surveyId}/questions/{questionId}/date":{"get":{"operationId":"ReportsController_getDateSummary","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"questionId","required":true,"in":"path","description":"ID de la pregunta de fecha","schema":{"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"Start date (ISO 8601)","schema":{"example":"2025-01-01T00:00:00.000Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"End date (ISO 8601)","schema":{"example":"2025-12-31T23:59:59.999Z","type":"string"}}],"responses":{"200":{"description":"Distribución de fechas obtenida exitosamente"},"401":{"description":"No autenticado"},"404":{"description":"Encuesta o pregunta no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener distribución de fechas para una pregunta","tags":["Reports"]}},"/api/reports/surveys/{surveyId}/questions/{questionId}/data-collection":{"get":{"operationId":"ReportsController_getDataCollectionSummary","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"questionId","required":true,"in":"path","description":"ID de la pregunta de recopilación de datos","schema":{"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"Start date (ISO 8601)","schema":{"example":"2025-01-01T00:00:00.000Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"End date (ISO 8601)","schema":{"example":"2025-12-31T23:59:59.999Z","type":"string"}}],"responses":{"200":{"description":"Resumen de recopilación de datos obtenido exitosamente"},"401":{"description":"No autenticado"},"404":{"description":"Encuesta o pregunta no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener resumen de recopilación de datos para preguntas de email/telefono","tags":["Reports"]}},"/api/reports/surveys/{surveyId}/questions/{questionId}/binary":{"get":{"operationId":"ReportsController_getBinarySummary","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"questionId","required":true,"in":"path","description":"ID de la pregunta binaria","schema":{"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"Start date (ISO 8601)","schema":{"example":"2025-01-01T00:00:00.000Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"End date (ISO 8601)","schema":{"example":"2025-12-31T23:59:59.999Z","type":"string"}}],"responses":{"200":{"description":"Resumen binario obtenido exitosamente"},"401":{"description":"No autenticado"},"404":{"description":"Encuesta o pregunta no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener resumen binario para preguntas SI_NO/PULGARES","tags":["Reports"]}},"/api/reports/surveys/{surveyId}/export":{"post":{"description":"Exporta todas las respuestas de la encuesta como archivo CSV. Soporta filtrado por canal, tipo de dispositivo, rango de fechas y estado de completitud. Limitado a 50,000 sesiones por exportación. La truncación se indica mediante los headers X-Export-Truncated y X-Export-Total.","operationId":"ReportsController_exportToCSV","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta a exportar","schema":{"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"Start date (ISO 8601)","schema":{"example":"2025-01-01T00:00:00.000Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"End date (ISO 8601)","schema":{"example":"2025-12-31T23:59:59.999Z","type":"string"}},{"name":"includeComments","required":false,"in":"query","description":"Include comments in export","schema":{"default":true,"type":"boolean"}},{"name":"channel","required":false,"in":"query","description":"Filter by response channel","schema":{"type":"string","enum":["WEB","QR","EMAIL","EMBED","API","SDK"]}},{"name":"deviceType","required":false,"in":"query","description":"Filter by device type","schema":{"type":"string","enum":["DESKTOP","TABLET","MOBILE"]}},{"name":"completedOnly","required":false,"in":"query","description":"Only include completed sessions (true) or only abandoned (false). Omit for both.","schema":{"type":"boolean"}},{"description":"Start date (ISO 8601)","required":false,"name":"startDate","in":"query","schema":{"example":"2025-01-01T00:00:00.000Z","type":"string"}},{"description":"End date (ISO 8601)","required":false,"name":"endDate","in":"query","schema":{"example":"2025-12-31T23:59:59.999Z","type":"string"}},{"description":"Include comments in export","required":false,"name":"includeComments","in":"query","schema":{"default":true,"type":"boolean"}},{"description":"Filter by response channel","required":false,"name":"channel","in":"query","schema":{"type":"string"}},{"description":"Filter by device type","required":false,"name":"deviceType","in":"query","schema":{"type":"string"}},{"description":"Only include completed sessions (true) or only abandoned (false). Omit for both.","required":false,"name":"completedOnly","in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Descarga de archivo CSV","headers":{"X-Export-Truncated":{"description":"Presente con valor \"true\" cuando la exportación se limitó a 50,000 sesiones","schema":{"type":"string","enum":["true"]}},"X-Export-Total":{"description":"Número total de sesiones disponibles cuando el resultado fue truncado","schema":{"type":"string","example":"123456"}}}},"401":{"description":"No autenticado"},"403":{"description":"Sin permisos"},"404":{"description":"Encuesta no encontrada"}},"security":[{"bearer":[]}],"summary":"Exportar respuestas de encuesta a CSV","tags":["Reports"]}},"/api/reports/surveys/{surveyId}/export/pdf":{"post":{"description":"Genera un reporte PDF profesional con estadísticas resumidas y desgloses por pregunta. Requiere la función hasExportPdf (plan STARTER+). Limitado a 50,000 sesiones. La truncación se indica mediante headers de respuesta.","operationId":"ReportsController_exportToPDF","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta a exportar","schema":{"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"Start date (ISO 8601)","schema":{"example":"2025-01-01T00:00:00.000Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"End date (ISO 8601)","schema":{"example":"2025-12-31T23:59:59.999Z","type":"string"}},{"name":"includeComments","required":false,"in":"query","description":"Include comments in export","schema":{"default":true,"type":"boolean"}},{"name":"channel","required":false,"in":"query","description":"Filter by response channel","schema":{"type":"string","enum":["WEB","QR","EMAIL","EMBED","API","SDK"]}},{"name":"deviceType","required":false,"in":"query","description":"Filter by device type","schema":{"type":"string","enum":["DESKTOP","TABLET","MOBILE"]}},{"name":"completedOnly","required":false,"in":"query","description":"Only include completed sessions (true) or only abandoned (false). Omit for both.","schema":{"type":"boolean"}},{"description":"Start date (ISO 8601)","required":false,"name":"startDate","in":"query","schema":{"example":"2025-01-01T00:00:00.000Z","type":"string"}},{"description":"End date (ISO 8601)","required":false,"name":"endDate","in":"query","schema":{"example":"2025-12-31T23:59:59.999Z","type":"string"}},{"description":"Include comments in export","required":false,"name":"includeComments","in":"query","schema":{"default":true,"type":"boolean"}},{"description":"Filter by response channel","required":false,"name":"channel","in":"query","schema":{"type":"string"}},{"description":"Filter by device type","required":false,"name":"deviceType","in":"query","schema":{"type":"string"}},{"description":"Only include completed sessions (true) or only abandoned (false). Omit for both.","required":false,"name":"completedOnly","in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Descarga de archivo PDF"},"401":{"description":"No autenticado"},"403":{"description":"Se requiere actualizar el plan (PLAN_UPGRADE_REQUIRED)"},"404":{"description":"Encuesta no encontrada"}},"security":[{"bearer":[]}],"summary":"Exportar reporte de encuesta a PDF","tags":["Reports"]}},"/api/reports/surveys/{surveyId}/export/excel/authorize":{"get":{"description":"Valida que el plan de la organización permite exportación a Excel (hasExportExcel, plan STARTER+). El archivo Excel se genera del lado del cliente con ExcelJS. Retorna { authorized: true } en caso de éxito.","operationId":"ReportsController_authorizeExcelExport","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta (usado como contexto de autorización)","schema":{"type":"string"}}],"responses":{"200":{"description":"Exportacion autorizada","content":{"application/json":{"schema":{"properties":{"authorized":{"type":"boolean","example":true}}}}}},"401":{"description":"No autenticado"},"403":{"description":"Se requiere actualizar el plan (PLAN_UPGRADE_REQUIRED)"},"404":{"description":"Encuesta no encontrada"}},"security":[{"bearer":[]}],"summary":"Autorizar exportacion a Excel","tags":["Reports"]}},"/api/reports/export/pdf":{"post":{"operationId":"ReportsController_exportMultiPDF","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportMultiPdfDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["Reports"]}},"/api/dashboard/stats":{"get":{"description":"Retorna KPIs agregados de todas las encuestas: total de encuestas, encuestas activas, total de respuestas, respuestas mensuales, calificación promedio, tasa de respuesta, puntaje NPS, tasa de completado y tiempo promedio de respuesta","operationId":"DashboardController_getStats","parameters":[],"responses":{"200":{"description":"Estadísticas del dashboard obtenidas"},"401":{"description":"No autenticado"},"403":{"description":"Sin permisos"}},"security":[{"bearer":[]}],"summary":"Obtener estadísticas agregadas del dashboard","tags":["Dashboard"]}},"/api/dashboard/surveys":{"get":{"description":"Retorna una lista paginada de encuestas con conteos de respuestas, calificaciones promedio y porcentajes de tendencia","operationId":"DashboardController_getSurveys","parameters":[{"name":"page","required":false,"in":"query","schema":{"example":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","schema":{"example":20,"type":"number"}}],"responses":{"200":{"description":"Encuestas con estadísticas e información de paginación","content":{"application/json":{"schema":{"type":"object","properties":{"surveys":{"type":"array","items":{"$ref":"#/components/schemas/SurveyWithStatsDto"}},"pagination":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"pageSize":{"type":"number"},"totalPages":{"type":"number"}}}}}}}},"401":{"description":"No autenticado"},"403":{"description":"Sin permisos"}},"security":[{"bearer":[]}],"summary":"Obtener lista de encuestas con conteos y calificaciones","tags":["Dashboard"]}},"/api/dashboard/recent-responses":{"get":{"description":"Retorna las respuestas más recientes de todas las encuestas, con análisis de sentimiento","operationId":"DashboardController_getRecentResponses","parameters":[],"responses":{"200":{"description":"Respuestas recientes obtenidas"},"401":{"description":"No autenticado"},"403":{"description":"Sin permisos"}},"security":[{"bearer":[]}],"summary":"Obtener respuestas recientes de todas las encuestas","tags":["Dashboard"]}},"/api/dashboard/recent-sessions":{"get":{"description":"Retorna las sesiones completadas más recientes con una respuesta destacada y sentimiento","operationId":"DashboardController_getRecentSessions","parameters":[],"responses":{"200":{"description":"Sesiones recientes obtenidas"},"401":{"description":"No autenticado"},"403":{"description":"Sin permisos"}},"security":[{"bearer":[]}],"summary":"Obtener sesiones completadas recientes de todas las encuestas","tags":["Dashboard"]}},"/api/dashboard/setup-progress":{"get":{"description":"Retorna el estado de completado de cada paso de onboarding para el usuario autenticado","operationId":"DashboardController_getSetupProgress","parameters":[],"responses":{"200":{"description":"Progreso de configuración obtenido"},"401":{"description":"No autenticado"},"403":{"description":"Sin permisos"}},"security":[{"bearer":[]}],"summary":"Obtener progreso del checklist de configuración inicial","tags":["Dashboard"]}},"/api/plans":{"get":{"description":"Lista los planes activos y visibles para los usuarios","operationId":"PlansController_findAll","parameters":[],"responses":{"200":{"description":"Lista de planes activos"}},"summary":"Obtener todos los planes disponibles","tags":["Plans"]}},"/api/plans/compare":{"get":{"description":"Retorna una tabla comparativa de caracteristicas de todos los planes","operationId":"PlansController_comparePlans","parameters":[],"responses":{"200":{"description":"Tabla comparativa de planes"}},"summary":"Comparar caracteristicas entre planes","tags":["Plans"]}},"/api/plans/slug/{slug}":{"get":{"description":"Busca un plan usando su slug amigable (ej: \"professional\")","operationId":"PlansController_findBySlug","parameters":[{"name":"slug","required":true,"in":"path","description":"Slug amigable del plan (ej: professional)","schema":{"type":"string"}}],"responses":{"200":{"description":"Plan encontrado"},"404":{"description":"Plan no encontrado"}},"summary":"Obtener un plan por slug","tags":["Plans"]}},"/api/plans/type/{type}":{"get":{"description":"Busca un plan por su tipo (FREE, STARTER, etc.)","operationId":"PlansController_findByType","parameters":[{"name":"type","required":true,"in":"path","description":"Tipo del plan (FREE, STARTER, PROFESSIONAL, ENTERPRISE)","schema":{"type":"string"}}],"responses":{"200":{"description":"Plan encontrado"},"404":{"description":"Plan no encontrado"}},"summary":"Obtener un plan por tipo","tags":["Plans"]}},"/api/plans/{id}":{"get":{"description":"Retorna los detalles completos de un plan especifico","operationId":"PlansController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"ID del plan","schema":{"type":"string"}}],"responses":{"200":{"description":"Plan encontrado"},"404":{"description":"Plan no encontrado"}},"summary":"Obtener un plan por ID","tags":["Plans"]}},"/api/admin/plans":{"get":{"description":"Lista todos los planes del sistema sin filtrar por visibilidad","operationId":"PlansAdminController_findAll","parameters":[],"responses":{"200":{"description":"Lista completa de planes"}},"security":[{"bearer":[]}],"summary":"Listar todos los planes (incluyendo inactivos/privados)","tags":["Admin - Plans"]},"post":{"description":"Crea un plan con su configuracion de limites, precios y caracteristicas","operationId":"PlansAdminController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePlanDto"}}}},"responses":{"201":{"description":"Plan creado exitosamente"},"400":{"description":"Datos invalidos"}},"security":[{"bearer":[]}],"summary":"Crear un nuevo plan","tags":["Admin - Plans"]}},"/api/admin/plans/{id}":{"get":{"description":"Retorna los detalles completos de un plan incluyendo metadatos de administracion","operationId":"PlansAdminController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"ID del plan","schema":{"type":"string"}}],"responses":{"200":{"description":"Plan encontrado"},"404":{"description":"Plan no encontrado"}},"security":[{"bearer":[]}],"summary":"Obtener un plan por ID (admin)","tags":["Admin - Plans"]},"patch":{"description":"Modifica la configuracion de un plan existente","operationId":"PlansAdminController_update","parameters":[{"name":"id","required":true,"in":"path","description":"ID del plan","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePlanDto"}}}},"responses":{"200":{"description":"Plan actualizado exitosamente"},"404":{"description":"Plan no encontrado"}},"security":[{"bearer":[]}],"summary":"Actualizar un plan existente","tags":["Admin - Plans"]},"delete":{"description":"Realiza un soft delete del plan, ocultandolo de la lista publica","operationId":"PlansAdminController_deactivate","parameters":[{"name":"id","required":true,"in":"path","description":"ID del plan","schema":{"type":"string"}}],"responses":{"200":{"description":"Plan desactivado exitosamente"},"404":{"description":"Plan no encontrado"}},"security":[{"bearer":[]}],"summary":"Desactivar un plan","tags":["Admin - Plans"]}},"/api/ai/generate-survey":{"post":{"description":"Genera una estructura completa de encuesta con preguntas basada en un prompt. Puedes elegir entre Grok 2026 y Claude (Anthropic) como proveedor de IA.","operationId":"AIController_generateSurvey","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateSurveyDto"}}}},"responses":{"201":{"description":"Encuesta generada exitosamente","content":{"application/json":{"schema":{"type":"object","properties":{"survey":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"welcomeMessage":{"type":"string"},"thankYouMessage":{"type":"string"},"questions":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"type":{"type":"string"},"isRequired":{"type":"boolean"},"allowComment":{"type":"boolean"},"order":{"type":"number"},"scale":{"type":"number"},"options":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"order":{"type":"number"}}}}}}}}},"metadata":{"type":"object","properties":{"provider":{"type":"string"},"model":{"type":"string"},"tokensUsed":{"type":"number"},"processingTime":{"type":"number"},"interactionId":{"type":"string"}}}}}}}},"400":{"description":"Datos de entrada invalidos"}},"security":[{"bearer":[]}],"summary":"Generar una encuesta usando IA (Grok o Claude)","tags":["AI"]}},"/api/ai/interactions":{"get":{"operationId":"AIController_getInteractionHistory","parameters":[{"name":"limit","required":false,"in":"query","schema":{"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Historial de interacciones obtenido exitosamente"}},"security":[{"bearer":[]}],"summary":"Obtener historial de interacciones con IA","tags":["AI"]}},"/api/ai/interactions/{id}":{"get":{"operationId":"AIController_getInteraction","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la interaccion de IA","schema":{"type":"string"}}],"responses":{"200":{"description":"Interaccion obtenida exitosamente"},"404":{"description":"Interaccion no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener una interaccion de IA especifica con la respuesta completa","tags":["AI"]}},"/api/ai/analyze-sentiment/{surveyId}":{"post":{"operationId":"AIController_analyzeSentiment","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta a analizar","schema":{"type":"string"}},{"name":"questionId","required":false,"in":"query","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","schema":{"type":"string"}},{"name":"endDate","required":true,"in":"query","schema":{"type":"string"}},{"name":"forceRefresh","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":"Analisis de sentimiento completado exitosamente"},"404":{"description":"Encuesta no encontrada"}},"security":[{"bearer":[]}],"summary":"Analizar sentimiento de respuestas de texto usando IA","tags":["AI"]}},"/api/ai/analyze-keywords/{surveyId}":{"post":{"description":"Usa Claude para extraer keywords, resumen ejecutivo, alertas urgentes y sugerencias. Requiere plan Business+ (hasAiAdvanced). Resultados cacheados por 24h.","operationId":"AIController_analyzeKeywords","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"questionId","required":false,"in":"query","schema":{"type":"string"}},{"name":"startDate","required":false,"in":"query","schema":{"type":"string"}},{"name":"endDate","required":false,"in":"query","schema":{"type":"string"}},{"name":"forceRefresh","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Insights generados exitosamente"},"403":{"description":"Plan no permite IA avanzada"},"404":{"description":"Encuesta no encontrada"}},"security":[{"bearer":[]}],"summary":"Extraer insights con IA de las respuestas de texto","tags":["AI"]}},"/api/ai/sentiment-history/{surveyId}":{"get":{"description":"Retorna todos los analisis de sentimiento previos para la encuesta dada, ordenados del mas reciente al mas antiguo. Usa limit/offset para paginacion. El detalle por respuesta se omite en los items de la lista.","operationId":"AIController_getSentimentHistory","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Historial de sentimiento obtenido exitosamente"},"404":{"description":"Encuesta no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener historial de analisis de sentimiento de una encuesta","tags":["AI"]}},"/api/public/widget/{surveyId}/config":{"get":{"description":"Endpoint publico para obtener la configuracion de la encuesta para el SDK del widget. Valida el dominio CORS.","operationId":"WidgetController_getWidgetConfig","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"example":"abc123","type":"string"}},{"name":"origin","required":false,"in":"header","description":"Dominio de origen para validacion CORS","schema":{"type":"string"}}],"responses":{"200":{"description":"Configuracion del widget retornada exitosamente"},"403":{"description":"Dominio no permitido"},"404":{"description":"Encuesta no encontrada o no activa"}},"summary":"Obtener configuracion del widget","tags":["Widget"]}},"/api/public/widget/{surveyId}/track":{"post":{"description":"Rastrea impresiones, clics y otros eventos analiticos del widget","operationId":"WidgetController_trackEvent","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"example":"abc123","type":"string"}},{"name":"origin","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackEventDto"}}}},"responses":{"200":{"description":"Evento rastreado exitosamente"},"404":{"description":"Encuesta no encontrada"}},"summary":"Rastrear eventos del widget","tags":["Widget"]}},"/api/public/widget/{surveyId}/responses":{"post":{"description":"Envia respuestas de encuesta desde el widget con metadatos","operationId":"WidgetController_submitResponse","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"example":"abc123","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetResponseDto"}}}},"responses":{"201":{"description":"Respuestas enviadas exitosamente"},"404":{"description":"Encuesta no encontrada"}},"summary":"Enviar respuestas del widget","tags":["Widget"]}},"/api/surveys/{surveyId}/widget/analytics":{"get":{"description":"Obtiene datos analiticos del widget (impresiones, clics, tasa de conversion)","operationId":"WidgetController_getWidgetAnalytics","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"example":"abc123","type":"string"}}],"responses":{"200":{"description":"Analiticas retornadas exitosamente"},"404":{"description":"Encuesta no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener analiticas del widget","tags":["Widget"]}},"/api/surveys/{surveyId}/widget/config":{"patch":{"description":"Actualiza la configuracion del widget para una encuesta (formato SDK v2)","operationId":"WidgetController_updateWidgetConfig","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"example":"abc123","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWidgetConfigDto"}}}},"responses":{"200":{"description":"Configuracion actualizada exitosamente"},"404":{"description":"Encuesta no encontrada"}},"security":[{"bearer":[]}],"summary":"Actualizar configuracion del widget","tags":["Widget"]}},"/api/admin/billing/overview":{"get":{"description":"Retorna MRR, suscripciones activas e ingresos totales","operationId":"AdminBillingController_getOverview","parameters":[],"responses":{"200":{"description":"Resumen de facturacion retornado correctamente"}},"security":[{"bearer":[]}],"summary":"Obtener resumen de facturacion","tags":["Admin - Billing"]}},"/api/admin/billing/subscriptions":{"get":{"description":"Lista suscripciones de todas las organizaciones con paginacion y filtros","operationId":"AdminBillingController_listSubscriptions","parameters":[{"name":"limit","required":false,"in":"query","description":"Limite de resultados por pagina","schema":{"minimum":1,"maximum":200,"default":20,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Numero de resultados a omitir","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"status","required":false,"in":"query","description":"Filtrar por estado de suscripcion","schema":{"type":"string","enum":["TRIALING","ACTIVE","PAST_DUE","CANCELED","EXPIRED"]}}],"responses":{"200":{"description":"Lista de suscripciones retornada correctamente"}},"security":[{"bearer":[]}],"summary":"Listar todas las suscripciones","tags":["Admin - Billing"]}},"/api/admin/billing/payments":{"get":{"description":"Lista pagos de todas las organizaciones con paginacion y filtros","operationId":"AdminBillingController_listPayments","parameters":[{"name":"limit","required":false,"in":"query","description":"Limite de resultados por pagina","schema":{"minimum":1,"maximum":200,"default":20,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Numero de resultados a omitir","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"status","required":false,"in":"query","description":"Filtrar por estado de pago","schema":{"type":"string","enum":["PENDING","PROCESSING","PAID","FAILED","REFUNDED"]}}],"responses":{"200":{"description":"Lista de pagos retornada correctamente"}},"security":[{"bearer":[]}],"summary":"Listar todos los pagos","tags":["Admin - Billing"]}},"/api/admin/billing/invoices":{"get":{"description":"Lista facturas de todas las organizaciones con paginacion","operationId":"AdminBillingController_listInvoices","parameters":[{"name":"limit","required":false,"in":"query","description":"Limite de resultados por pagina","schema":{"minimum":1,"maximum":200,"default":20,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Numero de resultados a omitir","schema":{"minimum":0,"default":0,"type":"number"}}],"responses":{"200":{"description":"Lista de facturas retornada correctamente"}},"security":[{"bearer":[]}],"summary":"Listar todas las facturas","tags":["Admin - Billing"]}},"/api/admin/billing/export/revenue":{"get":{"description":"Genera y descarga un archivo CSV con los datos de ingresos filtrados por rango de fechas","operationId":"AdminBillingController_exportRevenueCsv","parameters":[{"name":"from","required":false,"in":"query","description":"Fecha de inicio (ISO)","schema":{"type":"string"}},{"name":"to","required":false,"in":"query","description":"Fecha de fin (ISO)","schema":{"type":"string"}}],"responses":{"200":{"description":"Archivo CSV de ingresos generado correctamente"}},"security":[{"bearer":[]}],"summary":"Exportar datos de ingresos en CSV","tags":["Admin - Billing"]}},"/api/admin/changelog/tasks":{"get":{"operationId":"ChangelogController_findAllTasks","parameters":[{"name":"status","required":false,"in":"query","schema":{"enum":["BACKLOG","TODO","IN_PROGRESS","IN_REVIEW","DONE"],"type":"string"}},{"name":"priority","required":false,"in":"query","schema":{"enum":["LOW","MEDIUM","HIGH","URGENT"],"type":"string"}},{"name":"assigneeId","required":false,"in":"query","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"labelId","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":200,"default":50,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"minimum":0,"default":0,"type":"number"}}],"responses":{"200":{"description":"Lista de tareas"}},"security":[{"bearer":[]}],"summary":"Listar todas las tareas con filtros opcionales y paginacion","tags":["Admin - Changelog"]},"post":{"operationId":"ChangelogController_createTask","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTaskDto"}}}},"responses":{"201":{"description":"Tarea creada exitosamente"}},"security":[{"bearer":[]}],"summary":"Crear una nueva tarea","tags":["Admin - Changelog"]}},"/api/admin/changelog/tasks/{id}":{"get":{"operationId":"ChangelogController_findOneTask","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la tarea","schema":{"type":"string"}}],"responses":{"200":{"description":"Tarea encontrada"},"404":{"description":"Tarea no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener una tarea con todas sus relaciones (comentarios, etiquetas, asignado)","tags":["Admin - Changelog"]},"patch":{"operationId":"ChangelogController_updateTask","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la tarea","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTaskDto"}}}},"responses":{"200":{"description":"Tarea actualizada exitosamente"},"404":{"description":"Tarea no encontrada"}},"security":[{"bearer":[]}],"summary":"Actualizar una tarea","tags":["Admin - Changelog"]},"delete":{"operationId":"ChangelogController_deleteTask","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la tarea","schema":{"type":"string"}}],"responses":{"200":{"description":"Tarea eliminada exitosamente"},"404":{"description":"Tarea no encontrada"}},"security":[{"bearer":[]}],"summary":"Eliminar una tarea (soft-delete)","tags":["Admin - Changelog"]}},"/api/admin/changelog/reorder":{"patch":{"operationId":"ChangelogController_reorderTasks","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderTasksDto"}}}},"responses":{"200":{"description":"Tareas reordenadas exitosamente"}},"security":[{"bearer":[]}],"summary":"Reordenar tareas en lote para el kanban drag-and-drop","tags":["Admin - Changelog"]}},"/api/admin/changelog/tasks/{taskId}/comments":{"post":{"operationId":"ChangelogController_createComment","parameters":[{"name":"taskId","required":true,"in":"path","description":"ID de la tarea","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCommentDto"}}}},"responses":{"201":{"description":"Comentario creado exitosamente"},"404":{"description":"Tarea no encontrada"}},"security":[{"bearer":[]}],"summary":"Agregar un comentario a una tarea","tags":["Admin - Changelog"]}},"/api/admin/changelog/comments/{id}":{"delete":{"operationId":"ChangelogController_deleteComment","parameters":[{"name":"id","required":true,"in":"path","description":"ID del comentario","schema":{"type":"string"}}],"responses":{"200":{"description":"Comentario eliminado exitosamente"},"404":{"description":"Comentario no encontrado"}},"security":[{"bearer":[]}],"summary":"Eliminar un comentario (soft-delete)","tags":["Admin - Changelog"]}},"/api/admin/changelog/labels":{"get":{"operationId":"ChangelogController_findAllLabels","parameters":[],"responses":{"200":{"description":"Lista de etiquetas"}},"security":[{"bearer":[]}],"summary":"Listar todas las etiquetas","tags":["Admin - Changelog"]},"post":{"operationId":"ChangelogController_createLabel","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLabelDto"}}}},"responses":{"201":{"description":"Etiqueta creada exitosamente"}},"security":[{"bearer":[]}],"summary":"Crear una nueva etiqueta","tags":["Admin - Changelog"]}},"/api/admin/changelog/labels/{id}":{"delete":{"operationId":"ChangelogController_deleteLabel","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la etiqueta","schema":{"type":"string"}}],"responses":{"200":{"description":"Etiqueta eliminada exitosamente"},"404":{"description":"Etiqueta no encontrada"}},"security":[{"bearer":[]}],"summary":"Eliminar una etiqueta permanentemente (se desvincula de las tareas automaticamente)","tags":["Admin - Changelog"]}},"/api/admin/changelog/assignees":{"get":{"operationId":"ChangelogController_findAssignees","parameters":[],"responses":{"200":{"description":"Lista de asignados disponibles"}},"security":[{"bearer":[]}],"summary":"Listar todos los usuarios superadmin disponibles como asignados de tareas","tags":["Admin - Changelog"]}},"/api/changelog/public":{"get":{"operationId":"ChangelogPublicController_getPublicSummary","parameters":[],"responses":{"200":{"description":"Resumen publico del changelog"}},"summary":"Obtener resumen publico del changelog (tareas completadas/en progreso/pendientes)","tags":["Changelog"]}},"/api/survey-templates":{"get":{"operationId":"SurveyTemplatesController_findAll","parameters":[{"name":"category","required":false,"in":"query","schema":{"enum":["CUSTOMER_SATISFACTION","NPS_SURVEY","CES_SURVEY","MARKET_RESEARCH","EMPLOYEE_FEEDBACK","PRODUCT_FEEDBACK","EVENT_FEEDBACK","OTHER"],"type":"string"}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Lista de plantillas"}},"security":[{"bearer":[]}],"summary":"Listar todas las plantillas disponibles (sistema + organizacion)","tags":["Survey Templates"]},"post":{"operationId":"SurveyTemplatesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTemplateDto"}}}},"responses":{"201":{"description":"Plantilla creada"}},"security":[{"bearer":[]}],"summary":"Crear una plantilla personalizada","tags":["Survey Templates"]}},"/api/survey-templates/{id}":{"get":{"operationId":"SurveyTemplatesController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"ID del template","schema":{"type":"string"}}],"responses":{"200":{"description":"Detalle de la plantilla"},"404":{"description":"Plantilla no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener detalle de plantilla con preguntas","tags":["Survey Templates"]},"delete":{"operationId":"SurveyTemplatesController_remove","parameters":[{"name":"id","required":true,"in":"path","description":"ID del template","schema":{"type":"string"}}],"responses":{"200":{"description":"Plantilla eliminada"},"404":{"description":"Plantilla no encontrada"}},"security":[{"bearer":[]}],"summary":"Eliminar una plantilla personalizada (soft delete)","tags":["Survey Templates"]}},"/api/survey-templates/from-survey/{surveyId}":{"post":{"operationId":"SurveyTemplatesController_saveFromSurvey","parameters":[{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta origen","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveAsTemplateDto"}}}},"responses":{"201":{"description":"Plantilla creada desde encuesta"},"404":{"description":"Encuesta no encontrada"}},"security":[{"bearer":[]}],"summary":"Guardar una encuesta existente como plantilla","tags":["Survey Templates"]}},"/api/survey-templates/{id}/use":{"post":{"operationId":"SurveyTemplatesController_useTemplate","parameters":[{"name":"id","required":true,"in":"path","description":"ID del template","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UseTemplateDto"}}}},"responses":{"201":{"description":"Encuesta creada desde plantilla"},"404":{"description":"Plantilla no encontrada"}},"security":[{"bearer":[]}],"summary":"Crear una encuesta a partir de una plantilla","tags":["Survey Templates"]}},"/api/api-keys":{"get":{"operationId":"ApiKeysController_findAll","parameters":[],"responses":{"200":{"description":"API keys obtenidas. El keyHash nunca se incluye."}},"security":[{"bearer":[]}],"summary":"Listar todas las API keys de la organizacion","tags":["API Keys"]},"post":{"operationId":"ApiKeysController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyDto"}}}},"responses":{"201":{"description":"API key creada. La clave completa se retorna SOLO en esta respuesta."},"400":{"description":"Error de validacion o expiresAt invalido"}},"security":[{"bearer":[]}],"summary":"Crear una nueva API key","tags":["API Keys"]}},"/api/api-keys/{id}":{"patch":{"operationId":"ApiKeysController_update","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la API key","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateApiKeyDto"}}}},"responses":{"200":{"description":"API key actualizada"},"404":{"description":"API key no encontrada"}},"security":[{"bearer":[]}],"summary":"Actualizar nombre o descripcion de una API key","tags":["API Keys"]},"delete":{"operationId":"ApiKeysController_delete","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la API key","schema":{"type":"string"}}],"responses":{"200":{"description":"API key eliminada"},"404":{"description":"API key no encontrada"}},"security":[{"bearer":[]}],"summary":"Eliminar permanentemente una API key","tags":["API Keys"]}},"/api/api-keys/{id}/revoke":{"post":{"operationId":"ApiKeysController_revoke","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la API key","schema":{"type":"string"}}],"responses":{"200":{"description":"API key revocada"},"400":{"description":"La API key ya esta revocada"},"404":{"description":"API key no encontrada"}},"security":[{"bearer":[]}],"summary":"Revocar una API key (mantiene el registro para auditoria)","tags":["API Keys"]}},"/api/analytics/comment-insights":{"get":{"description":"Retorna la distribución de sentimiento y las palabras más frecuentes de respuestas de texto y comentarios en todas las encuestas","operationId":"AnalyticsController_getCommentInsights","parameters":[],"responses":{"200":{"description":"Insights de comentarios obtenidos"},"401":{"description":"No autenticado"},"403":{"description":"Sin permisos o plan insuficiente"}},"security":[{"bearer":[]}],"summary":"Obtener insights de comentarios con sentimiento y frecuencia de palabras","tags":["Analytics"]}},"/api/analytics/audience-insights":{"get":{"description":"Retorna datos agregados de audiencia mostrando la distribución de respuestas por canal y tipo de dispositivo con tasas de completado","operationId":"AnalyticsController_getAudienceInsights","parameters":[],"responses":{"200":{"description":"Insights de audiencia obtenidos"},"401":{"description":"No autenticado"},"403":{"description":"Sin permisos o plan insuficiente"}},"security":[{"bearer":[]}],"summary":"Obtener insights de audiencia con distribución por canal y dispositivo","tags":["Analytics"]}},"/api/analytics/metric-surveys/{type}":{"get":{"description":"Retorna el ID, nombre y cantidad de respuestas de todas las encuestas con respuestas NPS/CSAT/CES/COMMENTS","operationId":"AnalyticsController_listMetricSurveys","parameters":[{"name":"type","required":true,"in":"path","description":"Tipo de métrica (NPS, CSAT, CES, COMMENTS)","schema":{"example":"NPS","type":"string"}}],"responses":{"200":{"description":"Lista de encuestas con métrica obtenida"},"401":{"description":"No autenticado"}},"security":[{"bearer":[]}],"summary":"Listar encuestas con respuestas para un tipo de métrica","tags":["Analytics"]}},"/api/analytics/score-breakdown/{type}":{"get":{"description":"Retorna el desglose detallado de puntaje agregado en todas las encuestas de la organización","operationId":"AnalyticsController_getScoreBreakdown","parameters":[{"name":"type","required":true,"in":"path","description":"Tipo de métrica (NPS, CSAT, CES)","schema":{"example":"NPS","type":"string"}}],"responses":{"200":{"description":"Desglose de puntaje obtenido"},"401":{"description":"No autenticado"},"403":{"description":"Sin permisos o plan insuficiente"}},"security":[{"bearer":[]}],"summary":"Obtener desglose de puntaje a nivel organización para NPS, CSAT o CES","tags":["Analytics"]}},"/api/analytics/trends":{"get":{"description":"Retorna datos de tendencia en serie temporal, distribución por categoría y distribución de calificaciones","operationId":"AnalyticsController_getTrends","parameters":[],"responses":{"200":{"description":"Tendencias y distribuciones","content":{"application/json":{"schema":{"type":"object","properties":{"trend":{"type":"array","items":{"$ref":"#/components/schemas/TrendDataPointDto"}},"categoryDistribution":{"type":"array","items":{"$ref":"#/components/schemas/CategoryDistributionDto"}},"ratingDistribution":{"type":"array","items":{"$ref":"#/components/schemas/RatingDistributionDto"}}}}}}},"401":{"description":"No autenticado"}},"security":[{"bearer":[]}],"summary":"Obtener tendencias y distribuciones agregadas","tags":["Analytics"]}},"/api/v1/surveys":{"get":{"operationId":"SurveysPublicController_findAll","parameters":[{"name":"x-api-key","in":"header","description":"API key (sk_live_...)","required":true,"schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"enum":["DRAFT","ACTIVE","PAUSED","CLOSED"],"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Lista paginada de encuestas"},"401":{"description":"API key invalida o faltante"},"403":{"description":"La API key no tiene permiso SURVEYS_READ"}},"summary":"Listar todas las encuestas de la organizacion","tags":["Public API - Surveys"]}},"/api/v1/surveys/{id}":{"get":{"operationId":"SurveysPublicController_findById","parameters":[{"name":"x-api-key","in":"header","description":"API key (sk_live_...)","required":true,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}}],"responses":{"200":{"description":"Detalle de la encuesta"},"404":{"description":"Encuesta no encontrada"}},"summary":"Obtener una encuesta por ID","tags":["Public API - Surveys"]}},"/api/v1/surveys/{id}/stats":{"get":{"operationId":"SurveysPublicController_getStats","parameters":[{"name":"x-api-key","in":"header","description":"API key (sk_live_...)","required":true,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}}],"responses":{"200":{"description":"Estadisticas de la encuesta (sesiones, tasa de completado, tiempo promedio)"},"404":{"description":"Encuesta no encontrada"}},"summary":"Obtener estadisticas de una encuesta","tags":["Public API - Surveys"]}},"/api/v1/surveys/{surveyId}/questions":{"get":{"operationId":"QuestionsPublicController_findBySurvey","parameters":[{"name":"x-api-key","in":"header","description":"API key (sk_live_...)","required":true,"schema":{"type":"string"}},{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}}],"responses":{"200":{"description":"Lista ordenada de preguntas con opciones y reglas de logica"},"404":{"description":"Encuesta no encontrada"}},"summary":"Listar todas las preguntas de una encuesta","tags":["Public API - Questions"]}},"/api/v1/surveys/{surveyId}/responses":{"get":{"operationId":"ResponsesPublicController_getResponses","parameters":[{"name":"x-api-key","in":"header","description":"API key (sk_live_...)","required":true,"schema":{"type":"string"}},{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}},{"name":"startDate","required":false,"in":"query","description":"Fecha ISO","schema":{"type":"string"}},{"name":"endDate","required":false,"in":"query","description":"Fecha ISO","schema":{"type":"string"}},{"name":"completedOnly","required":false,"in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Lista paginada de sesiones de respuestas"}},"summary":"Listar sesiones de respuestas de una encuesta","tags":["Public API - Responses"]},"post":{"description":"Consejo: usa GET /v1/surveys/:surveyId/questions primero para obtener los IDs de preguntas necesarios para el array de respuestas.","operationId":"ResponsesPublicController_submitResponse","parameters":[{"name":"x-api-key","in":"header","description":"API key (sk_live_...)","required":true,"schema":{"type":"string"}},{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitResponseDto"}}}},"responses":{"201":{"description":"Respuesta enviada exitosamente"},"400":{"description":"Error de validacion"},"404":{"description":"Encuesta no encontrada"}},"summary":"Enviar una respuesta a una encuesta","tags":["Public API - Responses"]}},"/api/v1/surveys/{surveyId}/analytics":{"get":{"operationId":"ResponsesPublicController_getAnalytics","parameters":[{"name":"x-api-key","in":"header","description":"API key (sk_live_...)","required":true,"schema":{"type":"string"}},{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}}],"responses":{"200":{"description":"Analiticas con estadisticas por pregunta"},"404":{"description":"Encuesta no encontrada"}},"summary":"Obtener analiticas por pregunta de una encuesta","tags":["Public API - Responses"]}},"/api/v1/surveys/{surveyId}/trigger":{"post":{"description":"Retorna una URL de encuesta lista para usar. Pasa respondentId para rastrear quien recibio la encuesta, y pares clave-valor de metadata para adjuntar contexto (ej. plan, region).","operationId":"TriggerPublicController_trigger","parameters":[{"name":"x-api-key","in":"header","description":"API key (sk_live_...)","required":true,"schema":{"type":"string"}},{"name":"surveyId","required":true,"in":"path","description":"ID de la encuesta","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"respondentId":{"type":"string","description":"Identificador del encuestado — se agrega como ?rid="},"metadata":{"type":"object","additionalProperties":{"type":"string"},"description":"Pares clave-valor arbitrarios agregados como ?m_key=value"}}}}}},"responses":{"200":{"description":"URL de encuesta lista para distribucion","content":{"application/json":{"schema":{"properties":{"surveyId":{"type":"string"},"surveyUrl":{"type":"string"},"status":{"type":"string"}}}}}},"400":{"description":"La encuesta no esta activa"},"404":{"description":"Encuesta no encontrada"}},"summary":"Obtener una URL de encuesta distribuible para activacion","tags":["Public API - Trigger"]}}},"info":{"title":"Satify Survey API","description":"API de la plataforma de encuestas Satify Survey (CSAT, NPS, CES). Los endpoints públicos no requieren autenticación; el resto usa un bearer JWT. Especificación OpenAPI: https://satify-survey.app/openapi.json","version":"1.0","contact":{"name":"Human Creative Lab","url":"https://satify-survey.app/contact","email":"soporte@satify-survey.app"},"termsOfService":"https://satify-survey.app/legal/terms"},"tags":[{"name":"Auth","description":"Authentication endpoints"},{"name":"Users","description":"User management"},{"name":"Organizations","description":"Organization/tenant management"},{"name":"Surveys","description":"Survey CRUD operations"},{"name":"Questions","description":"Question management"},{"name":"Responses","description":"Response submission and analytics"},{"name":"Two-Factor Authentication","description":"2FA TOTP management"}],"servers":[{"url":"https://satify-survey.app","description":"Producción"}],"components":{"securitySchemes":{"JWT-auth":{"scheme":"bearer","bearerFormat":"JWT","type":"http","name":"JWT","description":"Enter JWT token","in":"header"}},"schemas":{"RegisterDto":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com"},"password":{"type":"string","example":"Password123!","minLength":8},"name":{"type":"string","example":"John Doe"},"organizationName":{"type":"string","example":"Acme Inc."},"phone":{"type":"string","example":"+56912345678"},"captchaToken":{"type":"string","description":"Cloudflare Turnstile token from the widget. Required when captcha is enabled in the environment; ignored otherwise."}},"required":["email","password","name","organizationName"]},"RegisterInvitedDto":{"type":"object","properties":{"token":{"type":"string","example":"invitation-token-uuid"},"name":{"type":"string","example":"John Doe"},"password":{"type":"string","example":"Password123!","minLength":8}},"required":["token","name","password"]},"LoginDto":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com"},"password":{"type":"string","example":"Password123"},"captchaToken":{"type":"string","description":"Cloudflare Turnstile token from the invisible widget. Required when captcha is enabled in the environment; ignored otherwise."}},"required":["email","password"]},"Verify2FALoginDto":{"type":"object","properties":{"tempToken":{"type":"string","description":"Temporary token received from login when 2FA is required"},"token":{"type":"string","example":"123456","description":"6-digit TOTP code, email OTP, or backup code"},"method":{"type":"string","enum":["TOTP","EMAIL"],"description":"Preferred 2FA method to verify with (when user has multiple methods)"}},"required":["tempToken","token"]},"GoogleAuthDto":{"type":"object","properties":{"credential":{"type":"string","description":"Google ID token (credential) from Google Sign-In","example":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."},"accessToken":{"type":"string","description":"Google OAuth2 access token from useGoogleLogin popup flow","example":"ya29.a0AfB_byC..."}}},"ForgotPasswordDto":{"type":"object","properties":{"email":{"type":"string","description":"User email address","example":"user@example.com"},"captchaToken":{"type":"string","description":"Cloudflare Turnstile token from the widget. Required when captcha is enabled in the environment; ignored otherwise."}},"required":["email"]},"ResetPasswordDto":{"type":"object","properties":{"token":{"type":"string","description":"Password reset token sent via email","example":"abc123xyz789"},"password":{"type":"string","description":"New password (min 8 characters)","example":"NewPassword123!"},"password_confirmation":{"type":"string","description":"Password confirmation (must match password)","example":"NewPassword123!"}},"required":["token","password","password_confirmation"]},"VerifyEmailDto":{"type":"object","properties":{"token":{"type":"string","description":"Email verification token sent via email","example":"abc123xyz789"}},"required":["token"]},"ResendVerificationDto":{"type":"object","properties":{"email":{"type":"string","description":"Email address to resend the verification link to","example":"user@example.com"},"captchaToken":{"type":"string","description":"Cloudflare Turnstile token from the widget. Required when captcha is enabled in the environment; ignored otherwise."}},"required":["email"]},"UpdateProfileDto":{"type":"object","properties":{"name":{"type":"string","description":"User display name","example":"John Doe"},"email":{"type":"string","description":"User email address","example":"john@example.com"},"avatar_url":{"type":"object","description":"Avatar URL","example":"https://example.com/avatar.jpg"},"sensitiveActionToken":{"type":"string","description":"Sensitive action token from 2FA verification (required when changing email with 2FA enabled)"}}},"ChangePasswordDto":{"type":"object","properties":{"current_password":{"type":"string","description":"Current password (required when user already has a password, omit for Google-only accounts setting their first password)","example":"CurrentPassword123!"},"password":{"type":"string","description":"New password (min 8 characters)","example":"NewPassword123!"},"password_confirmation":{"type":"string","description":"Password confirmation (must match password)","example":"NewPassword123!"},"sensitiveActionToken":{"type":"string","description":"Sensitive action token from 2FA verification (required when 2FA is enabled)"}},"required":["password","password_confirmation"]},"UpdateOnboardingDto":{"type":"object","properties":{"wizardCompleted":{"type":"object","description":"Whether the user has completed the onboarding wizard","example":true},"wizardSkipped":{"type":"object","description":"Whether the user has skipped the onboarding wizard","example":false},"selectedCategories":{"description":"Survey categories selected by the user during onboarding","example":["customer-satisfaction","employee-engagement"],"type":"array","items":{"type":"string"}},"checklistDismissed":{"type":"object","description":"Whether the user has dismissed the setup checklist","example":false}}},"Setup2FADto":{"type":"object","properties":{"method":{"type":"string","enum":["TOTP","EMAIL"],"default":"TOTP"}}},"Verify2FADto":{"type":"object","properties":{"token":{"type":"string","example":"123456","description":"6-digit TOTP code or backup code"},"method":{"type":"string","enum":["TOTP","EMAIL"],"description":"Override which 2FA method to verify against"}},"required":["token"]},"Disable2FADto":{"type":"object","properties":{"token":{"type":"string","example":"123456","description":"6-digit TOTP code, email OTP, or backup code"},"method":{"type":"string","enum":["TOTP","EMAIL"],"description":"Specific method to disable. Omit to disable all methods."}},"required":["token"]},"UpdateUserDto":{"type":"object","properties":{"name":{"type":"string","example":"John Doe"},"phone":{"type":"string","example":"+56912345678"},"position":{"type":"string","example":"Product Manager"},"avatarUrl":{"type":"string","example":"https://example.com/avatar.jpg"},"emailNotifications":{"type":"boolean","example":true,"description":"Whether the user receives email notifications"}}},"UpdateRoleDto":{"type":"object","properties":{"role":{"type":"string","enum":["OWNER","ADMIN","EDITOR","MEMBER","VIEWER"]}},"required":["role"]},"UpdateOrganizationDto":{"type":"object","properties":{"name":{"type":"string","example":"Acme Inc."},"logoUrl":{"type":"string","example":"https://example.com/logo.png"},"industry":{"type":"string","example":"Technology"},"website":{"type":"string","example":"https://acme.com"},"billingName":{"type":"string","example":"Acme SpA"},"billingTaxId":{"type":"string","example":"76.123.456-7"},"billingAddress":{"type":"string","example":"Av. Providencia 1234, Of. 56"},"billingCity":{"type":"string","example":"Santiago"},"billingCountry":{"type":"string","example":"CL"},"billingEmail":{"type":"string","example":"billing@acme.com"}}},"InviteUserDto":{"type":"object","properties":{"email":{"type":"string","example":"newuser@example.com"},"role":{"type":"string","enum":["ADMIN","EDITOR","MEMBER","VIEWER"],"default":"MEMBER"}},"required":["email"]},"AcceptInvitationDto":{"type":"object","properties":{}},"StartTrialDto":{"type":"object","properties":{"planId":{"type":"string","description":"Plan ID to start a trial for"}},"required":["planId"]},"InitiateUpgradeDto":{"type":"object","properties":{"planId":{"type":"string","description":"Target plan ID to upgrade to"},"billingCycle":{"type":"string","enum":["MONTHLY","ANNUAL"],"description":"Billing cycle for the new plan"}},"required":["planId","billingCycle"]},"ConfirmUpgradeDto":{"type":"object","properties":{"planId":{"type":"string","description":"Target plan ID"},"billingCycle":{"type":"string","enum":["MONTHLY","ANNUAL"],"description":"Billing cycle"},"paymentId":{"type":"string","description":"Payment ID from the completed checkout"}},"required":["planId","billingCycle","paymentId"]},"CancelSubscriptionDto":{"type":"object","properties":{"immediate":{"type":"boolean","description":"If true, cancels immediately instead of at period end","default":false}}},"CreateInstanceDto":{"type":"object","properties":{"name":{"type":"string","example":"Production"},"description":{"type":"string","example":"Production surveys for the web app"},"color":{"type":"string","example":"#3B82F6","pattern":"^#[0-9A-Fa-f]{6}$"}},"required":["name"]},"UpdateInstanceDto":{"type":"object","properties":{"name":{"type":"string","example":"Staging"},"description":{"type":"string","example":"Staging environment surveys"},"color":{"type":"string","example":"#10B981","pattern":"^#[0-9A-Fa-f]{6}$"}}},"CreateSurveyDto":{"type":"object","properties":{"instanceId":{"type":"string","example":"cuid-instance-id"},"name":{"type":"string","example":"Customer Satisfaction Survey"},"description":{"type":"string","example":"Monthly customer satisfaction survey"},"welcomeMessage":{"type":"string","example":"Welcome to our survey!"},"thankYouMessage":{"type":"string","example":"Thank you for your feedback!"},"layout":{"type":"string","enum":["WIZARD","SINGLE_PAGE"],"default":"WIZARD"},"theme":{"type":"string","enum":["LIGHT","DARK"],"default":"LIGHT"},"category":{"type":"string","enum":["CUSTOMER_SATISFACTION","NPS_SURVEY","CES_SURVEY","MARKET_RESEARCH","EMPLOYEE_FEEDBACK","PRODUCT_FEEDBACK","EVENT_FEEDBACK","OTHER"],"description":"Survey category for classification"},"primaryColor":{"type":"string","example":"#FF5733","description":"Primary color in hex format (e.g., #FF5733)","pattern":"^#[0-9A-Fa-f]{6}$"},"paletteId":{"type":"string","example":"corporate-blue","description":"ID of the selected color palette (e.g., corporate-blue, sunset-orange)"},"paletteColors":{"type":"object","example":{"primary":"#2563eb","primaryLight":"#60a5fa","primaryDark":"#1e40af","secondary":"#7c3aed","secondaryLight":"#a78bfa","secondaryDark":"#5b21b6","background":"#ffffff","surface":"#f8fafc","card":"#ffffff","text":"#1e293b","textSecondary":"rgba(0, 0, 0, 0.6)","textMuted":"rgba(0, 0, 0, 0.4)","success":"#10b981","successLight":"#6ee7b7","warning":"#f59e0b","warningLight":"#fcd34d","error":"#ef4444","errorLight":"#fca5a5","info":"#3b82f6","infoLight":"#93c5fd","border":"rgba(0, 0, 0, 0.1)","divider":"rgba(0, 0, 0, 0.06)","hover":"rgba(0, 0, 0, 0.04)","focus":"#bfdbfe","shadow":"rgba(30, 41, 59, 0.1)"},"description":"Complete color palette with 25+ auto-generated colors"},"fontFamily":{"type":"string","example":"poppins","description":"Google Font family ID (e.g., inter, poppins, dm-sans)"},"transitionType":{"type":"string","example":"slide","description":"Transition type for question navigation","enum":["slide","fade","scale","none"]},"backgroundGradient":{"type":"string","example":"sunset","description":"Background gradient preset ID"},"allowMultipleResponses":{"type":"boolean","example":false,"description":"Allow the same user to respond multiple times"},"showProgressBar":{"type":"boolean","example":true,"description":"Show progress bar in WIZARD layout"},"progressBarStyle":{"type":"string","example":"steps","description":"Progress bar display style","enum":["bar","steps","minimal","percentage"]},"randomizeQuestions":{"type":"boolean","example":false,"description":"Randomize question order for each respondent"},"autoAdvance":{"type":"boolean","example":true,"description":"Auto-advance to next question on single-answer selection (WIZARD mode)"},"showKeyboardHints":{"type":"boolean","example":true,"description":"Show keyboard shortcut hints on questions"},"enableConfetti":{"type":"boolean","example":true,"description":"Fire confetti animation on survey completion"},"autoAdvanceDelay":{"type":"number","example":600,"description":"Delay in ms before auto-advancing to next question (default 600)"},"isAnonymous":{"type":"boolean","example":false,"description":"Hide respondent tracking (anonymous survey)"},"showPoweredBy":{"type":"boolean","example":true,"description":"Show \"Powered by Satify Survey\" branding"},"logoUrl":{"type":"string","example":"https://ejemplo.com/logo.png","description":"Custom logo URL for the survey"},"backgroundImageUrl":{"type":"string","example":"https://ejemplo.com/bg.jpg","description":"Custom background image URL"},"backgroundImageOpacity":{"type":"number","example":0.6,"description":"Overlay opacity for background image (0.0 = transparent, 1.0 = opaque)"},"redirectUrl":{"type":"string","example":"https://ejemplo.com/gracias","description":"Redirect URL after survey completion"},"embedEnabled":{"type":"boolean","example":false,"description":"Enable embeddable widget mode"},"widgetButtonText":{"type":"string","example":"Feedback","description":"Text for the floating widget button"},"widgetButtonIcon":{"type":"string","example":"💬","description":"Emoji icon for the widget button"},"allowedDomains":{"example":["ejemplo.com","*.ejemplo.com"],"description":"Allowed domains for embedding (CORS whitelist)","type":"array","items":{"type":"string"}}},"required":["instanceId","name"]},"BulkOperationDto":{"type":"object","properties":{"surveyIds":{"description":"Array of survey IDs","example":["id1","id2"],"type":"array","items":{"type":"string"}},"action":{"type":"string","enum":["DELETE","ARCHIVE","UNARCHIVE","ACTIVATE","PAUSE"],"description":"Action to perform"}},"required":["surveyIds","action"]},"UpdateSurveyDto":{"type":"object","properties":{"name":{"type":"string","example":"Updated Survey Name"},"description":{"type":"string","example":"Updated description"},"welcomeMessage":{"type":"string","example":"Welcome to our updated survey!"},"thankYouMessage":{"type":"string","example":"Thank you for your time!"},"status":{"type":"string","enum":["DRAFT","ACTIVE","PAUSED","CLOSED"]},"layout":{"type":"string","enum":["WIZARD","SINGLE_PAGE"]},"theme":{"type":"string","enum":["LIGHT","DARK"]},"primaryColor":{"type":"string","example":"#FF5733","description":"Primary color in hex format (e.g., #FF5733)","pattern":"^#[0-9A-Fa-f]{6}$"},"paletteId":{"type":"string","example":"corporate-blue","description":"ID of the selected color palette (e.g., corporate-blue, sunset-orange)"},"logoUrl":{"type":"string","example":"https://example.com/logo.png"},"isFavorite":{"type":"boolean"},"redirectUrl":{"type":"string","example":"https://example.com/thank-you"},"allowMultipleResponses":{"type":"boolean","description":"Allow multiple responses from same respondent"},"category":{"type":"string","enum":["CUSTOMER_SATISFACTION","NPS_SURVEY","CES_SURVEY","MARKET_RESEARCH","EMPLOYEE_FEEDBACK","PRODUCT_FEEDBACK","EVENT_FEEDBACK","OTHER"],"description":"Survey category for classification"},"showProgressBar":{"type":"boolean","example":true,"description":"Show progress bar in WIZARD layout"},"progressBarStyle":{"type":"string","example":"steps","description":"Progress bar display style","enum":["bar","steps","minimal","percentage"]},"randomizeQuestions":{"type":"boolean","example":false,"description":"Randomize question order for each respondent"},"fontFamily":{"type":"string","example":"poppins","description":"Google Font family ID (e.g., inter, poppins, dm-sans)"},"transitionType":{"type":"string","example":"slide","description":"Transition type for question navigation","enum":["slide","fade","scale","none"]},"backgroundGradient":{"type":"string","example":"sunset","description":"Background gradient preset ID"},"autoAdvance":{"type":"boolean","example":true,"description":"Auto-advance to next question on single-answer selection (WIZARD mode)"},"showKeyboardHints":{"type":"boolean","example":true,"description":"Show keyboard shortcut hints on questions"},"enableConfetti":{"type":"boolean","example":true,"description":"Fire confetti animation on survey completion"},"autoAdvanceDelay":{"type":"number","example":600,"description":"Delay in ms before auto-advancing to next question (default 600)"},"isAnonymous":{"type":"boolean","example":false,"description":"Hide respondent tracking (anonymous survey)"},"showPoweredBy":{"type":"boolean","example":true,"description":"Show \"Powered by Satify Survey\" branding"},"backgroundImageUrl":{"type":"string","example":"https://example.com/bg.jpg","description":"Custom background image URL"},"backgroundImageOpacity":{"type":"number","example":0.6,"description":"Overlay opacity for background image (0.0 = transparent, 1.0 = opaque)"},"embedEnabled":{"type":"boolean","example":false,"description":"Enable embeddable widget mode"},"widgetButtonText":{"type":"string","example":"Feedback","description":"Text for the floating widget button"},"widgetButtonIcon":{"type":"string","example":"💬","description":"Emoji icon for the widget button"},"paletteColors":{"type":"object","description":"Complete color palette with auto-generated colors"},"allowedDomains":{"example":["ejemplo.com","*.ejemplo.com"],"description":"Allowed domains for embedding (CORS whitelist)","type":"array","items":{"type":"string"}}}},"CreateWebhookDto":{"type":"object","properties":{"name":{"type":"string","description":"Display name for the webhook","example":"Notify CRM on response"},"url":{"type":"string","description":"HTTPS endpoint to deliver payloads to (must be an external, publicly reachable URL)","example":"https://api.example.com/webhooks"},"events":{"type":"array","description":"List of events this webhook subscribes to","example":["RESPONSE_COMPLETED"],"items":{"type":"string","enum":["RESPONSE_STARTED","RESPONSE_COMPLETED","RESPONSE_ABANDONED","SURVEY_ACTIVATED","SURVEY_PAUSED","SURVEY_CLOSED","CAMPAIGN_STARTED","CAMPAIGN_COMPLETED"]}},"surveyIds":{"description":"Limit webhook to specific surveys. Empty array = all surveys.","example":["survey-id-1","survey-id-2"],"type":"array","items":{"type":"array"}},"secret":{"type":"string","description":"HMAC-SHA256 signing secret — auto-generated if omitted","example":"my-super-secret"},"headers":{"type":"object","description":"Additional HTTP headers to include in each delivery","example":{"X-Custom-Token":"abc123"}}},"required":["name","url","events"]},"UpdateWebhookDto":{"type":"object","properties":{"name":{"type":"string","description":"Display name for the webhook","example":"Notify CRM on response"},"url":{"type":"string","description":"HTTPS endpoint to deliver payloads to (must be an external, publicly reachable URL)","example":"https://api.example.com/webhooks"},"events":{"type":"array","description":"List of events this webhook subscribes to","example":["RESPONSE_COMPLETED"],"items":{"type":"string","enum":["RESPONSE_STARTED","RESPONSE_COMPLETED","RESPONSE_ABANDONED","SURVEY_ACTIVATED","SURVEY_PAUSED","SURVEY_CLOSED","CAMPAIGN_STARTED","CAMPAIGN_COMPLETED"]}},"surveyIds":{"description":"Limit webhook to specific surveys. Empty array = all surveys.","example":["survey-id-1","survey-id-2"],"type":"array","items":{"type":"array"}},"secret":{"type":"string","description":"HMAC-SHA256 signing secret — auto-generated if omitted","example":"my-super-secret"},"headers":{"type":"object","description":"Additional HTTP headers to include in each delivery","example":{"X-Custom-Token":"abc123"}},"isActive":{"type":"boolean","description":"Enable or disable the webhook. Setting to true also clears disabledAt and resets failureCount.","example":true}}},"QuestionOptionDto":{"type":"object","properties":{"text":{"type":"string","example":"Option A"},"order":{"type":"number","example":0}},"required":["text"]},"CreateQuestionDto":{"type":"object","properties":{"title":{"type":"string","example":"How satisfied are you with our service?"},"description":{"type":"string","example":"Please rate from 1-5"},"imageUrl":{"type":"string","description":"Image URL displayed above the question","example":"https://example.com/photo.jpg"},"type":{"type":"string","enum":["CSAT","NPS","CES","SINGLE_CHOICE","MULTIPLE_CHOICE","SHORT_TEXT","LONG_TEXT","RATING","DATE","EMAIL","PHONE","YES_NO","THUMBS"]},"displayType":{"type":"string","enum":["DEFAULT","EMOJI","STARS","SCALE","SLIDER","BUTTONS"],"default":"DEFAULT"},"isRequired":{"type":"boolean","default":false},"allowComment":{"type":"boolean","default":false},"scaleMin":{"type":"number","example":1},"scaleMax":{"type":"number","example":5},"minLabel":{"type":"string","example":"Very Unsatisfied"},"maxLabel":{"type":"string","example":"Very Satisfied"},"options":{"type":"array","items":{"$ref":"#/components/schemas/QuestionOptionDto"}}},"required":["title","type"]},"UpdateQuestionDto":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"imageUrl":{"type":"object","description":"Image URL displayed above the question. Send null to clear.","example":"https://example.com/photo.jpg","nullable":true},"displayType":{"type":"string","enum":["DEFAULT","EMOJI","STARS","SCALE","SLIDER","BUTTONS"]},"isRequired":{"type":"boolean"},"allowComment":{"type":"boolean"},"scaleMin":{"type":"number"},"scaleMax":{"type":"number"},"minLabel":{"type":"string"},"maxLabel":{"type":"string"}}},"CreateLogicRuleDto":{"type":"object","properties":{"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","GREATER_THAN_OR_EQUAL","LESS_THAN_OR_EQUAL","CONTAINS","NOT_CONTAINS","IS_EMPTY","IS_NOT_EMPTY","IS_ONE_OF","IS_NOT_ONE_OF"],"description":"Comparison operator applied to the question answer"},"value":{"type":"string","description":"Value to compare against (stringified number, option ID, or comma-separated IDs for IS_ONE_OF)"},"action":{"type":"string","enum":["SHOW","HIDE","SKIP_TO","END_SURVEY"],"description":"Action to execute when the condition is satisfied"},"targetQuestionId":{"type":"string","description":"ID of the question affected by this rule. Must be null when action is END_SURVEY."},"order":{"type":"number","description":"Evaluation order within this question (0-indexed)","default":0}},"required":["operator","value","action"]},"UpdateLogicRuleDto":{"type":"object","properties":{"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","GREATER_THAN_OR_EQUAL","LESS_THAN_OR_EQUAL","CONTAINS","NOT_CONTAINS","IS_EMPTY","IS_NOT_EMPTY","IS_ONE_OF","IS_NOT_ONE_OF"]},"value":{"type":"string"},"action":{"type":"string","enum":["SHOW","HIDE","SKIP_TO","END_SURVEY"]},"targetQuestionId":{"type":"string"},"order":{"type":"number"}}},"QuestionResponseDto":{"type":"object","properties":{"questionId":{"type":"string","description":"Question ID"},"numericValue":{"type":"number","description":"Numeric value (0-100). Range depends on question type: CSAT 1-5, NPS 0-10, CES 1-7, RATING custom scale","minimum":0,"maximum":100},"textValue":{"type":"string","description":"Text value for SHORT_TEXT/LONG_TEXT (max 5000 chars)","maxLength":5000},"choiceIds":{"description":"Selected option IDs for choice questions (at least 1)","type":"array","items":{"type":"string"}},"comment":{"type":"string","description":"Additional comment (max 2000 chars)","maxLength":2000}},"required":["questionId"]},"SubmitResponseDto":{"type":"object","properties":{"respondentId":{"type":"string","description":"Respondent ID for tracking"},"channel":{"type":"string","description":"Response channel","default":"WEB","enum":["WEB","QR","EMAIL","EMBED","API","SDK"]},"startedAt":{"type":"string","description":"Timestamp when user started viewing the survey (ISO 8601)"},"activeTimeSeconds":{"type":"number","description":"Active time in seconds (excludes idle time)","minimum":0},"responses":{"type":"array","items":{"$ref":"#/components/schemas/QuestionResponseDto"}},"captchaToken":{"type":"string","description":"Cloudflare Turnstile token from the widget. Required when captcha is enabled in the environment; ignored otherwise."}},"required":["responses"]},"BulkSessionIdsDto":{"type":"object","properties":{"sessionIds":{"description":"Session IDs (1-500)","type":"array","items":{"type":"string"}}},"required":["sessionIds"]},"PurchasePackDto":{"type":"object","properties":{"packId":{"type":"string","description":"Pack ID from the catalog (pack-100, pack-500, pack-2000, pack-5000)","example":"pack-500"},"redirectUrl":{"type":"string","description":"URL to redirect after payment"},"provider":{"type":"string","enum":["PAYPAL","FLOW","WEBPAY","MERCADOPAGO","MANUAL"],"description":"Payment provider to use. If omitted, auto-resolved by currency (CLP→Webpay)."},"idempotencyKey":{"type":"string","description":"UUID v4 generated client-side per checkout session for deduplication."}},"required":["packId"]},"UpdateBillingSettingsDto":{"type":"object","properties":{"billingName":{"type":"string","description":"Legal business name"},"billingTaxId":{"type":"string","description":"Chilean RUT or Tax ID (e.g. 12.345.678-9)"},"billingAddress":{"type":"string","description":"Billing address"},"billingCity":{"type":"string","description":"City"},"billingEmail":{"type":"string","description":"Email for invoices"},"autoPurchaseEnabled":{"type":"boolean","description":"Enable auto-purchase packs when limit reached"},"autoPurchasePackId":{"type":"string","description":"Pack catalog ID to auto-purchase (e.g. pack-500)"},"billingCountry":{"type":"string","description":"ISO 3166-1 alpha-2 country code (e.g. CL, US)"}}},"InitiatePaymentDto":{"type":"object","properties":{"planId":{"type":"string","description":"Target plan ID to upgrade to"},"billingCycle":{"type":"string","enum":["MONTHLY","ANNUAL"],"description":"Billing cycle"},"redirectUrl":{"type":"string","description":"URL to redirect after checkout"},"provider":{"type":"string","enum":["PAYPAL","FLOW","WEBPAY","MERCADOPAGO","MANUAL"],"description":"Payment provider to use. If omitted, auto-resolved by currency (CLP→Webpay, USD→PayPal)"},"idempotencyKey":{"type":"string","description":"UUID v4 generated client-side per checkout session. Repeated requests with the same key return the existing PENDING Payment instead of creating a new one."},"tosVersion":{"type":"string","description":"Version identifier of the Terms of Service the user accepted right before submitting the checkout (e.g. \"2026-05-01\"). Persisted alongside the Payment for legal traceability."}},"required":["planId","billingCycle"]},"WebhookWebpayDto":{"type":"object","properties":{"token_ws":{"type":"string","description":"Token returned by Webpay when the user completes the payment"},"TBK_TOKEN":{"type":"string","description":"Token returned by Webpay when the user aborts on the payment page"},"TBK_ID_SESION":{"type":"string","description":"Webpay session id (echoed back when the user aborts)"},"TBK_ORDEN_COMPRA":{"type":"string","description":"Webpay buy order (echoed back when the user aborts)"}}},"WebhookMercadoPagoDto":{"type":"object","properties":{"type":{"type":"string","description":"Event type emitted by Mercado Pago (payment, merchant_order, ...)"},"data":{"type":"object","description":"Event payload with the resource id"},"action":{"type":"string","description":"Sub-action of the event (eg. payment.updated)"}},"required":["type"]},"WebhookPayPalDto":{"type":"object","properties":{"id":{"type":"string","description":"PayPal event ID"},"event_type":{"type":"string","description":"Event type (e.g., CHECKOUT.ORDER.APPROVED)"},"resource":{"type":"object","description":"Event resource (order/capture data)"}},"required":["id","event_type"]},"WebhookFlowDto":{"type":"object","properties":{"token":{"type":"string","description":"Flow payment token"}},"required":["token"]},"ExportMultiPdfDto":{"type":"object","properties":{"surveyIds":{"description":"Survey IDs to include in the consolidated PDF","type":"array","items":{"type":"string"}},"includeComments":{"type":"boolean","description":"Include comments in the report"},"channel":{"type":"string","description":"Filter by response channel","enum":["WEB","QR","EMAIL","EMBED","API","SDK"]},"deviceType":{"type":"string","description":"Filter by device type","enum":["DESKTOP","TABLET","MOBILE"]},"startDate":{"type":"string","description":"Start date (ISO 8601)"},"endDate":{"type":"string","description":"End date (ISO 8601)"},"completedOnly":{"type":"boolean","description":"Only include completed sessions (true) or only abandoned (false). Omit for both."}},"required":["surveyIds"]},"CreatePlanDto":{"type":"object","properties":{"name":{"type":"string","description":"Plan display name"},"displayName":{"type":"object","description":"Localized display name: { es, en }"},"slug":{"type":"string","description":"URL-friendly slug"},"type":{"type":"string","enum":["FREE","STARTER","PROFESSIONAL","BUSINESS","ENTERPRISE"]},"monthlyPriceCLP":{"type":"number","description":"Monthly price in CLP cents"},"monthlyPriceUSD":{"type":"number","description":"Monthly price in USD cents"},"annualPriceCLP":{"type":"number","description":"Annual price in CLP cents"},"annualPriceUSD":{"type":"number","description":"Annual price in USD cents"},"discountPercent":{"type":"number","description":"Annual discount percentage"},"maxSurveys":{"type":"number"},"maxResponsesPerMonth":{"type":"number"},"maxUsers":{"type":"number"},"maxApiKeys":{"type":"number"},"maxQuestionsPerSurvey":{"type":"number"},"maxInstances":{"type":"object","description":"Max instances (null = unlimited)"},"hasCustomBranding":{"type":"boolean"},"hasExportPdf":{"type":"boolean"},"hasExportExcel":{"type":"boolean"},"hasAiGeneration":{"type":"boolean"},"hasApiAccess":{"type":"boolean"},"hasWebhooks":{"type":"boolean"},"hasCampaigns":{"type":"boolean"},"hasWhiteLabel":{"type":"boolean"},"hasPrioritySupport":{"type":"boolean"},"hasAdvancedAnalytics":{"type":"boolean"},"hasSso":{"type":"boolean"},"hasWidget":{"type":"boolean"},"hasWidgetAdvanced":{"type":"boolean"},"hasCampaignsRecurring":{"type":"boolean"},"hasAiAdvanced":{"type":"boolean"},"hasTemplates":{"type":"boolean"},"description":{"type":"object","description":"Localized description: { es, en }"},"highlightLabel":{"type":"object","description":"Localized highlight label: { es, en }"},"sortOrder":{"type":"number"},"isPublic":{"type":"boolean"}},"required":["name","slug","type","monthlyPriceCLP"]},"UpdatePlanDto":{"type":"object","properties":{"name":{"type":"string","description":"Plan display name"},"displayName":{"type":"object","description":"Localized display name: { es, en }"},"slug":{"type":"string","description":"URL-friendly slug"},"type":{"type":"string","enum":["FREE","STARTER","PROFESSIONAL","BUSINESS","ENTERPRISE"]},"monthlyPriceCLP":{"type":"number","description":"Monthly price in CLP cents"},"monthlyPriceUSD":{"type":"number","description":"Monthly price in USD cents"},"annualPriceCLP":{"type":"number","description":"Annual price in CLP cents"},"annualPriceUSD":{"type":"number","description":"Annual price in USD cents"},"discountPercent":{"type":"number","description":"Annual discount percentage"},"maxSurveys":{"type":"number"},"maxResponsesPerMonth":{"type":"number"},"maxUsers":{"type":"number"},"maxApiKeys":{"type":"number"},"maxQuestionsPerSurvey":{"type":"number"},"maxInstances":{"type":"object","description":"Max instances (null = unlimited)"},"hasCustomBranding":{"type":"boolean"},"hasExportPdf":{"type":"boolean"},"hasExportExcel":{"type":"boolean"},"hasAiGeneration":{"type":"boolean"},"hasApiAccess":{"type":"boolean"},"hasWebhooks":{"type":"boolean"},"hasCampaigns":{"type":"boolean"},"hasWhiteLabel":{"type":"boolean"},"hasPrioritySupport":{"type":"boolean"},"hasAdvancedAnalytics":{"type":"boolean"},"hasSso":{"type":"boolean"},"hasWidget":{"type":"boolean"},"hasWidgetAdvanced":{"type":"boolean"},"hasCampaignsRecurring":{"type":"boolean"},"hasAiAdvanced":{"type":"boolean"},"hasTemplates":{"type":"boolean"},"description":{"type":"object","description":"Localized description: { es, en }"},"highlightLabel":{"type":"object","description":"Localized highlight label: { es, en }"},"sortOrder":{"type":"number"},"isPublic":{"type":"boolean"}}},"GenerateSurveyDto":{"type":"object","properties":{"prompt":{"type":"string","description":"Descripción de la encuesta a generar","example":"Encuesta de satisfacción para restaurante de comida rápida","minLength":10},"provider":{"type":"string","description":"Proveedor de IA a utilizar","enum":["GROK","CLAUDE"],"default":"CLAUDE"},"context":{"type":"string","description":"Contexto adicional sobre la industria o tipo de negocio","example":"Restaurante de comida rápida en zona universitaria"},"questionCount":{"type":"number","description":"Número aproximado de preguntas a generar","example":7,"default":5}},"required":["prompt"]},"TrackEventDto":{"type":"object","properties":{"event":{"type":"string","enum":["IMPRESSION","BUTTON_CLICK","OPEN","CLOSE","SUBMIT","DISMISS","STARTED","ERROR"],"example":"IMPRESSION","description":"Type of event to track"},"metadata":{"type":"object","example":{"triggerType":"AUTO","delay":5000},"description":"Additional metadata about the event"},"sessionId":{"type":"string","example":"abc123","description":"Session ID if available"}},"required":["event"]},"AnswerDto":{"type":"object","properties":{"questionId":{"type":"string","example":"q1","description":"Question ID"},"answer":{"type":"object","example":"5","description":"Answer value (string, number, or string[] for choice IDs)"},"comment":{"type":"string","example":"Great service!","description":"Optional comment"}},"required":["questionId","answer"]},"WidgetMetadataDto":{"type":"object","properties":{"respondentId":{"type":"string","example":"user-abc123","description":"Unique respondent identifier for duplicate detection"},"source":{"type":"string","example":"widget","description":"Source of the response"},"displayMode":{"type":"string","example":"FLOATING","description":"Display mode used"},"triggerType":{"type":"string","example":"AUTO","description":"Trigger type that showed the widget"},"timeToComplete":{"type":"number","example":45000,"description":"Time to complete in milliseconds"},"device":{"type":"string","example":"desktop","description":"Device type"},"browser":{"type":"string","example":"Chrome","description":"Browser name"},"format":{"type":"string","example":"popup","description":"Widget format used (SDK v2)"},"url":{"type":"string","example":"https://example.com/page","description":"Page URL where the widget was shown"},"user":{"type":"object","description":"User identity data from SDK (max 8KB JSON)"}},"required":["source"]},"WidgetResponseDto":{"type":"object","properties":{"sessionId":{"type":"string","example":"session-abc123","description":"Session ID"},"answers":{"description":"Array of answers","type":"array","items":{"$ref":"#/components/schemas/AnswerDto"}},"metadata":{"description":"Widget-specific metadata","allOf":[{"$ref":"#/components/schemas/WidgetMetadataDto"}]}},"required":["sessionId","answers","metadata"]},"UrlRuleDto":{"type":"object","properties":{}},"WidgetTriggerDto":{"type":"object","properties":{"type":{"type":"string","example":"auto","enum":["manual","auto","scroll","exit-intent","event","url-match"]},"delay":{"type":"number","example":5000},"scrollPercentage":{"type":"number","example":50},"eventName":{"type":"string","example":"checkout-completed"},"urlRules":{"type":"array","items":{"$ref":"#/components/schemas/UrlRuleDto"}},"frequency":{"type":"string","example":"once","enum":["once","daily","weekly","always"]}}},"WidgetAppearanceDto":{"type":"object","properties":{"format":{"type":"string","example":"modal","enum":["modal","drawer","popover","embed","popup","slider","inline","tab"]},"activator":{"type":"string","example":"button","enum":["button","tab"]},"buttonText":{"type":"string","example":"Feedback"},"buttonIcon":{"type":"string","example":"💬"},"position":{"type":"string","example":"bottom-right","enum":["bottom-right","bottom-left","top-right","top-left"]},"modalSize":{"type":"string","example":"medium","enum":["small","medium","large"]},"sliderSide":{"type":"string","example":"right","enum":["left","right"]},"sliderWidth":{"type":"number","example":400},"sliderOverlay":{"type":"boolean","example":true},"drawerSide":{"type":"string","example":"right","enum":["left","right"]},"drawerWidth":{"type":"number","example":400},"drawerOverlay":{"type":"boolean","example":true},"popoverWidth":{"type":"number","example":380},"popoverHeight":{"type":"number","example":520},"tabSide":{"type":"string","example":"right","enum":["left","right"]},"tabText":{"type":"string","example":"Feedback"},"tabIcon":{"type":"string","example":"💬"},"inheritTheme":{"type":"boolean","example":true},"showActivator":{"type":"boolean","example":true},"inheritBehavior":{"type":"boolean","example":true},"primaryColor":{"type":"string","example":"#6366f1"},"theme":{"type":"string","example":"light","enum":["light","dark"]},"fontFamily":{"type":"string","example":"inter"},"backgroundGradient":{"type":"string","example":"sunset-warm"},"borderRadius":{"type":"number","example":12},"overlayOpacity":{"type":"number","description":"Overlay opacity for modal/drawer (10-90)","example":40},"zIndex":{"type":"number","example":999999}}},"UpdateWidgetConfigDto":{"type":"object","properties":{"enabled":{"type":"boolean","example":true},"format":{"type":"string","example":"modal","enum":["modal","drawer","popover","embed","popup","slider","inline","tab"]},"activator":{"type":"string","example":"button","enum":["button","tab"]},"trigger":{"description":"Trigger configuration (SDK v2 format)","example":{"type":"auto","delay":5000,"frequency":"once"},"allOf":[{"$ref":"#/components/schemas/WidgetTriggerDto"}]},"appearance":{"description":"Appearance configuration (SDK v2 format)","example":{"format":"popup","buttonText":"Feedback","buttonIcon":"💬","position":"bottom-right","modalSize":"medium"},"allOf":[{"$ref":"#/components/schemas/WidgetAppearanceDto"}]},"autoCloseDelay":{"type":"number","example":0},"showProgress":{"type":"boolean","example":true},"progressBarStyle":{"type":"string","example":"steps","enum":["steps","minimal","percentage","bar"]},"autoAdvance":{"type":"boolean","example":false},"autoAdvanceDelay":{"type":"number","example":600},"enableConfetti":{"type":"boolean","example":false},"welcomeText":{"type":"string","example":"Welcome!"},"testMode":{"type":"boolean","example":false},"allowedDomains":{"example":["example.com","*.mysite.com"],"type":"array","items":{"type":"string"}}}},"CreateTaskDto":{"type":"object","properties":{"status":{"type":"string","enum":["BACKLOG","TODO","IN_PROGRESS","IN_REVIEW","DONE"]},"priority":{"type":"string","enum":["LOW","MEDIUM","HIGH","URGENT"]},"taskType":{"type":"string","enum":["FEATURE","FIX","IMPROVEMENT","INFRASTRUCTURE","SECURITY"]},"publicArea":{"type":"string","enum":["BACKEND","FRONTEND","FULL_STACK","INFRA","UX"]}}},"UpdateTaskDto":{"type":"object","properties":{"status":{"type":"string","enum":["BACKLOG","TODO","IN_PROGRESS","IN_REVIEW","DONE"]},"priority":{"type":"string","enum":["LOW","MEDIUM","HIGH","URGENT"]},"taskType":{"type":"string","enum":["FEATURE","FIX","IMPROVEMENT","INFRASTRUCTURE","SECURITY"]},"publicArea":{"type":"string","enum":["BACKEND","FRONTEND","FULL_STACK","INFRA","UX"]}}},"ReorderTasksDto":{"type":"object","properties":{}},"CreateCommentDto":{"type":"object","properties":{}},"CreateLabelDto":{"type":"object","properties":{}},"CreateTemplateDto":{"type":"object","properties":{}},"SaveAsTemplateDto":{"type":"object","properties":{}},"UseTemplateDto":{"type":"object","properties":{}},"CreateApiKeyDto":{"type":"object","properties":{"name":{"type":"string","description":"Human-readable name for this API key","maxLength":100},"description":{"type":"string","description":"Optional description of intended usage","maxLength":500},"permissions":{"type":"array","description":"List of permissions granted to this API key","items":{"type":"string","enum":["SURVEYS_READ","QUESTIONS_READ","RESPONSES_READ","REPORTS_READ","SURVEYS_WRITE","QUESTIONS_WRITE","TRIGGER_SURVEY","SUBMIT_RESPONSE","WEBHOOKS_MANAGE","API_KEYS_MANAGE"]}},"allowedIps":{"description":"Allowed IP addresses. Empty array means all IPs are allowed","type":"array","items":{"type":"string"}},"rateLimit":{"type":"number","description":"Maximum requests per hour. Defaults to 1000","default":1000,"minimum":1,"maximum":100000},"expiresAt":{"type":"string","description":"Expiration date in ISO 8601 format. Null means never expires","example":"2027-01-01T00:00:00.000Z"}},"required":["name","permissions"]},"UpdateApiKeyDto":{"type":"object","properties":{"name":{"type":"string","description":"New name for the API key","maxLength":100},"description":{"type":"string","description":"New description for the API key","maxLength":500}}}}},"externalDocs":{"description":"Documentación de Satify Survey","url":"https://satify-survey.app/docs"}}