{"openapi":"3.0.0","paths":{"/auth/captcha-status":{"get":{"operationId":"AuthController_captchaStatus","parameters":[],"responses":{"200":{"description":""}},"summary":"Indica si el captcha está desactivado globalmente.","tags":["Autenticación"]}},"/auth/factor-status":{"get":{"operationId":"AuthController_factorStatus","parameters":[],"responses":{"200":{"description":""}},"summary":"Estado de factores fuertes del usuario (2FA/passkeys) + si la sesión ya cumple MFA.","tags":["Autenticación"]}},"/auth/step-up/2fa":{"post":{"operationId":"AuthController_stepUp2fa","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StepUp2faDto"}}}},"responses":{"200":{"description":""}},"summary":"Eleva la sesión a MFA verificando un código 2FA (TOTP/recuperación).","tags":["Autenticación"]}},"/auth/signup":{"post":{"operationId":"AuthController_signup","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupDto"}}}},"responses":{"201":{"description":""}},"summary":"Crear cuenta de usuario","tags":["Autenticación"]}},"/auth/signup/config":{"get":{"operationId":"AuthController_signupConfig","parameters":[],"responses":{"200":{"description":""}},"summary":"Flags públicos del signup (verificación de teléfono / email).","tags":["Autenticación"]}},"/auth/signup/request-code":{"post":{"operationId":"AuthController_signupRequestCode","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupRequestCodeDto"}}}},"responses":{"200":{"description":""}},"summary":"Solicita un código OTP para verificar el teléfono en el registro.","tags":["Autenticación"]}},"/auth/signup/verify-code":{"post":{"operationId":"AuthController_signupVerifyCode","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupVerifyCodeDto"}}}},"responses":{"201":{"description":""}},"summary":"Verifica el código OTP, crea la cuenta y emite tokens.","tags":["Autenticación"]}},"/auth/signup/resend-code":{"post":{"operationId":"AuthController_signupResendCode","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupResendCodeDto"}}}},"responses":{"200":{"description":""}},"summary":"Reenvía el código OTP del registro pendiente.","tags":["Autenticación"]}},"/auth/login":{"post":{"operationId":"AuthController_login","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginDto"}}}},"responses":{"200":{"description":""}},"summary":"Iniciar sesión","tags":["Autenticación"]}},"/auth/refresh":{"post":{"operationId":"AuthController_refresh","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshDto"}}}},"responses":{"200":{"description":""}},"summary":"Renovar tokens (rotación)","tags":["Autenticación"]}},"/auth/logout":{"post":{"operationId":"AuthController_logout","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogoutDto"}}}},"responses":{"204":{"description":""}},"summary":"Cerrar sesión (revoca el refresh token)","tags":["Autenticación"]}},"/auth/me/sessions":{"get":{"operationId":"AuthController_mySessions","parameters":[],"responses":{"200":{"description":""}},"summary":"Lista las sesiones activas del usuario logueado (sus dispositivos), una por sesión, marcando la actual.","tags":["Autenticación"]},"delete":{"operationId":"AuthController_closeMyOtherSessions","parameters":[],"responses":{"200":{"description":""}},"summary":"Cierra todas las demás sesiones del usuario (logout en los otros dispositivos), conservando la actual.","tags":["Autenticación"]}},"/auth/me/sessions/{id}":{"delete":{"operationId":"AuthController_closeMySession","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"summary":"Cierra una sesión propia (revoca toda la cadena del RefreshToken). Solo puede cerrar sesiones del propio usuario.","tags":["Autenticación"]}},"/auth/forgot-password":{"post":{"operationId":"AuthController_forgotPassword","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordDto"}}}},"responses":{"200":{"description":""}},"summary":"Solicita un email de recuperación de contraseña. Por seguridad SIEMPRE responde 200 — no revela si el email existe o no en el sistema.","tags":["Autenticación"]}},"/auth/verify-email":{"post":{"operationId":"AuthController_verifyEmail","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailDto"}}}},"responses":{"200":{"description":""}},"summary":"Canjea el token de verificación de email enviado tras signup. Marca al usuario como verificado y desbloquea acciones sensibles (envío de mensajes, conectar WhatsApp, billing).","tags":["Autenticación"]}},"/auth/resend-verification":{"post":{"operationId":"AuthController_resendVerification","parameters":[],"responses":{"200":{"description":""}},"summary":"Reenvía el email de verificación al usuario logueado. Si ya está verificado, responde 200 sin enviar (idempotente).","tags":["Autenticación"]}},"/auth/reset-password":{"post":{"operationId":"AuthController_resetPassword","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordDto"}}}},"responses":{"200":{"description":""}},"summary":"Canjea el token recibido por email + nueva contraseña. Si el token es inválido/expirado lanza 401. Tras éxito se revocan todas las sesiones activas del usuario (logout en todos los dispositivos).","tags":["Autenticación"]}},"/auth/impersonate-redeem":{"post":{"operationId":"AuthController_impersonateRedeem","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImpersonateRedeemDto"}}}},"responses":{"200":{"description":""}},"summary":"Canjea un ImpersonationToken (creado por staff via /admin/impersonate) por una sesión válida del target user. El JWT resultante lleva el flag `impersonatedBy` para que el frontend muestre banner persistente.","tags":["Autenticación"]}},"/admin/captcha":{"get":{"operationId":"CaptchaAdminController_status","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Estado global del captcha (activado/desactivado).","tags":["Administración (staff Mosend)"]},"patch":{"operationId":"CaptchaAdminController_set","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCaptchaDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Activa/desactiva el captcha globalmente (runtime).","tags":["Administración (staff Mosend)"]}},"/admin/signup-verification":{"get":{"operationId":"SignupVerificationController_get","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Devuelve la config de verificación por OTP.","tags":["Admin · Verificación de registro"]},"put":{"operationId":"SignupVerificationController_update","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSignupVerificationDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza la config de verificación por OTP.","tags":["Admin · Verificación de registro"]}},"/admin/signup-verification/options":{"get":{"operationId":"SignupVerificationController_options","parameters":[{"name":"orgId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista números y plantillas APPROVED de una org.","tags":["Admin · Verificación de registro"]}},"/admin/signup-verification/test":{"post":{"operationId":"SignupVerificationController_test","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestSendDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Envía un OTP de prueba al teléfono indicado.","tags":["Admin · Verificación de registro"]}},"/users/me":{"get":{"operationId":"UsersController_me","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Obtener mi perfil","tags":["Usuarios"]},"patch":{"operationId":"UsersController_update","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualizar mi perfil","tags":["Usuarios"]}},"/users/me/change-password":{"post":{"operationId":"UsersController_changePassword","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordDto"}}}},"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Cambiar contraseña (cierra las demás sesiones, conserva la actual)","tags":["Usuarios"]}},"/users/me/phone/request-code":{"post":{"operationId":"UsersController_requestPhoneCode","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Enviar un código OTP por WhatsApp para verificar mi teléfono","tags":["Usuarios"]}},"/users/me/phone/verify-code":{"post":{"operationId":"UsersController_verifyPhoneCode","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyPhoneCodeDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Confirmar el código OTP y marcar mi teléfono como verificado","tags":["Usuarios"]}},"/health/live":{"get":{"operationId":"HealthController_live","parameters":[],"responses":{"200":{"description":""}},"summary":"Liveness check: el proceso está vivo (uptime). Público, para load balancers.","tags":["Estado del servicio"]}},"/health/ready":{"get":{"operationId":"HealthController_ready","parameters":[],"responses":{"200":{"description":""}},"summary":"Readiness check: valida conexión a Postgres y Redis. 503 si alguno falla.","tags":["Estado del servicio"]}},"/health":{"get":{"operationId":"HealthController_root","parameters":[],"responses":{"200":{"description":""}},"summary":"Ping raíz del servicio (status + nombre + timestamp). Público.","tags":["Estado del servicio"]}},"/organizations":{"get":{"operationId":"OrganizationsController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Listar organizaciones del usuario actual","tags":["Organizaciones"]},"post":{"operationId":"OrganizationsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrganizationDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crear organización (queda como owner)","tags":["Organizaciones"]}},"/organizations/quota":{"get":{"operationId":"OrganizationsController_quota","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Estado de cupo del usuario para crear organizaciones","tags":["Organizaciones"]}},"/organizations/slug-suggest":{"get":{"operationId":"OrganizationsController_slugSuggest","parameters":[{"name":"name","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Sugiere un slug disponible para un nombre dado","tags":["Organizaciones"]}},"/organizations/slug-available":{"get":{"operationId":"OrganizationsController_slugAvailable","parameters":[{"name":"slug","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Verifica si un slug está disponible","tags":["Organizaciones"]}},"/organizations/{id}":{"get":{"operationId":"OrganizationsController_getOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Obtener organización por id","tags":["Organizaciones"]},"patch":{"operationId":"OrganizationsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOrganizationDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualizar organización (requiere organizations:write)","tags":["Organizaciones"]}},"/organizations/{id}/suspension":{"get":{"operationId":"OrganizationsController_suspension","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Motivo de la suspensión y facturas pendientes de pago","tags":["Organizaciones"]}},"/organizations/{orgId}/billing-group":{"get":{"operationId":"OrganizationsController_billingGroup","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Estado del grupo de facturación de la organización","tags":["Organizaciones"]}},"/organizations/{orgId}/billing-group/link":{"post":{"operationId":"OrganizationsController_billingGroupLink","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkBillingGroupDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Compartir facturación: enlazar la org como hija de una matriz (solo owner)","tags":["Organizaciones"]}},"/organizations/{orgId}/billing-group/unlink":{"post":{"operationId":"OrganizationsController_billingGroupUnlink","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Independizar: desenlazar la org de su matriz, pasa a plan free (solo owner)","tags":["Organizaciones"]}},"/organizations/{orgId}/billing-group/{targetOrgId}/ai-limits":{"patch":{"operationId":"OrganizationsController_setAiLimits","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"targetOrgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetAiLimitsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Tope de gasto de IA de una organización del grupo (solo la matriz, solo el dueño)","tags":["Organizaciones"]}},"/organizations/{orgId}/memberships":{"get":{"operationId":"MembershipsController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los miembros de la organización con su rol y alcance.","tags":["Membresías"]}},"/organizations/{orgId}/memberships/me":{"get":{"operationId":"MembershipsController_me","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Devuelve la membresía del usuario actual en la organización.","tags":["Membresías"]}},"/organizations/{orgId}/memberships/me/preferences":{"patch":{"operationId":"MembershipsController_updateMyPreferences","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMyPreferencesDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza las preferencias de UI del usuario actual en la organización (merge superficial).","tags":["Membresías"]}},"/organizations/{orgId}/memberships/{id}":{"patch":{"operationId":"MembershipsController_setRole","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetRoleDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cambia el rol asignado a un miembro.","tags":["Membresías"]},"delete":{"operationId":"MembershipsController_remove","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina a un miembro de la organización.","tags":["Membresías"]}},"/organizations/{orgId}/memberships/{id}/waba-scope":{"put":{"operationId":"MembershipsController_setWabaScope","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetWabaScopeDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Define a qué WABAs tiene acceso un miembro.","tags":["Membresías"]}},"/organizations/{orgId}/memberships/{id}/suspension":{"patch":{"operationId":"MembershipsController_setSuspension","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetSuspendedDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Suspende o reactiva el acceso de un miembro (sin eliminarlo).","tags":["Membresías"]}},"/oauth/authorize":{"get":{"operationId":"OAuthPublicController_authorize","parameters":[],"responses":{"200":{"description":""}},"summary":"Inicio del flujo de autorización (RFC 6749 §4.1). Redirige a la pantalla «Autorizar acceso».","tags":["OAuth (Mosend como proveedor)"]}},"/oauth/token":{"post":{"operationId":"OAuthPublicController_token","parameters":[],"responses":{"201":{"description":""}},"summary":"Intercambio de código (con PKCE) o renovación. Acepta x-www-form-urlencoded o JSON.","tags":["OAuth (Mosend como proveedor)"]}},"/oauth/revoke":{"post":{"operationId":"OAuthPublicController_revoke","parameters":[],"responses":{"201":{"description":""}},"summary":"Revoca un token (RFC 7009). Siempre 200.","tags":["OAuth (Mosend como proveedor)"]}},"/oauth/introspect":{"post":{"operationId":"OAuthPublicController_introspect","parameters":[],"responses":{"201":{"description":""}},"summary":"Estado de un token (RFC 7662). Solo la app dueña.","tags":["OAuth (Mosend como proveedor)"]}},"/.well-known/oauth-authorization-server":{"get":{"operationId":"OAuthMetadataController_metadata","parameters":[],"responses":{"200":{"description":""}},"summary":"Metadatos del servidor de autorización (RFC 8414).","tags":["OAuth (Mosend como proveedor)"]}},"/oauth/requests/{id}":{"get":{"operationId":"OAuthConsentController_request","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle de una solicitud de autorización pendiente: aplicación, alcances y organizaciones elegibles.","tags":["OAuth (Mosend como proveedor)"]}},"/oauth/requests/{id}/decision":{"post":{"operationId":"OAuthConsentController_decide","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthDecisionDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Permitir o rechazar la solicitud. Devuelve la URI a la que volver (con code o error).","tags":["OAuth (Mosend como proveedor)"]}},"/oauth/userinfo":{"get":{"operationId":"OAuthConsentController_userinfo","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Identidad mínima del usuario y la organización de la concesión (solo con token OAuth, alcance organizations:read).","tags":["OAuth (Mosend como proveedor)"]}},"/organizations/{orgId}/oauth/grants":{"get":{"operationId":"OAuthGrantsController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Aplicaciones con acceso a la organización.","tags":["OAuth (Mosend como proveedor)"]}},"/organizations/{orgId}/oauth/grants/{id}":{"delete":{"operationId":"OAuthGrantsController_revoke","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Quitar el acceso a una aplicación: revoca la concesión y todos sus tokens.","tags":["OAuth (Mosend como proveedor)"]}},"/admin/oauth/clients":{"get":{"operationId":"OAuthClientsAdminController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Aplicaciones OAuth registradas.","tags":["Administración (staff Mosend)"]},"post":{"operationId":"OAuthClientsAdminController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOAuthClientDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Registrar una aplicación. Devuelve `clientSecret` UNA sola vez.","tags":["Administración (staff Mosend)"]}},"/admin/oauth/clients/scopes":{"get":{"operationId":"OAuthClientsAdminController_scopes","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Catálogo de alcances con su frase de consentimiento.","tags":["Administración (staff Mosend)"]}},"/admin/oauth/clients/{id}":{"get":{"operationId":"OAuthClientsAdminController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle de una aplicación (sin el secreto).","tags":["Administración (staff Mosend)"]},"patch":{"operationId":"OAuthClientsAdminController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOAuthClientDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Editar redirecciones, alcances o suspender/reactivar.","tags":["Administración (staff Mosend)"]}},"/admin/oauth/clients/{id}/secret":{"post":{"operationId":"OAuthClientsAdminController_rotateSecret","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Rotar el secreto. El anterior deja de servir; el nuevo se muestra una vez.","tags":["Administración (staff Mosend)"]}},"/organizations/{orgId}/audit":{"get":{"operationId":"AuditController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"action","required":true,"in":"query","schema":{"type":"string"}},{"name":"resource","required":true,"in":"query","schema":{"type":"string"}},{"name":"actorUserId","required":true,"in":"query","schema":{"type":"string"}},{"name":"dateFrom","required":true,"in":"query","schema":{"type":"string"}},{"name":"dateTo","required":true,"in":"query","schema":{"type":"string"}},{"name":"cursor","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Auditoría"]}},"/organizations/{orgId}/audit/export":{"get":{"operationId":"AuditController_exportCsv","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"action","required":true,"in":"query","schema":{"type":"string"}},{"name":"resource","required":true,"in":"query","schema":{"type":"string"}},{"name":"actorUserId","required":true,"in":"query","schema":{"type":"string"}},{"name":"dateFrom","required":true,"in":"query","schema":{"type":"string"}},{"name":"dateTo","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Exporta el audit log en CSV (requiere audit_advanced).","tags":["Auditoría"]}},"/admin/audit":{"get":{"operationId":"AuditController_listAdmin","parameters":[{"name":"orgId","required":true,"in":"query","schema":{"type":"string"}},{"name":"action","required":true,"in":"query","schema":{"type":"string"}},{"name":"resource","required":true,"in":"query","schema":{"type":"string"}},{"name":"actorUserId","required":true,"in":"query","schema":{"type":"string"}},{"name":"dateFrom","required":true,"in":"query","schema":{"type":"string"}},{"name":"dateTo","required":true,"in":"query","schema":{"type":"string"}},{"name":"cursor","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Auditoría"]}},"/admin/audit/export":{"get":{"operationId":"AuditController_adminExportCsv","parameters":[{"name":"orgId","required":true,"in":"query","schema":{"type":"string"}},{"name":"action","required":true,"in":"query","schema":{"type":"string"}},{"name":"resource","required":true,"in":"query","schema":{"type":"string"}},{"name":"dateFrom","required":true,"in":"query","schema":{"type":"string"}},{"name":"dateTo","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Auditoría"]}},"/organizations/{orgId}/roles":{"get":{"operationId":"RolesController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los roles de la organización.","tags":["Roles"]},"post":{"operationId":"RolesController_create","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea un rol personalizado en la organización.","tags":["Roles"]}},"/organizations/{orgId}/roles/{id}":{"patch":{"operationId":"RolesController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza el nombre o los datos de un rol.","tags":["Roles"]},"delete":{"operationId":"RolesController_delete","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina un rol de la organización.","tags":["Roles"]}},"/organizations/{orgId}/roles/{id}/permissions":{"put":{"operationId":"RolesController_setPermissions","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetRolePermissionsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Reemplaza el conjunto de permisos de un rol.","tags":["Roles"]}},"/permissions":{"get":{"operationId":"PermissionsController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista el catálogo de permisos disponibles en el sistema.","tags":["Permisos"]}},"/organizations/{orgId}/api-keys":{"get":{"operationId":"ApiKeysController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista las API keys de la organización (sin el secret).","tags":["Claves de API"]},"post":{"operationId":"ApiKeysController_create","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crear API key. Devuelve `secret` UNA sola vez.","tags":["Claves de API"]}},"/organizations/{orgId}/api-keys/{id}":{"patch":{"operationId":"ApiKeysController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateApiKeyDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Editar API key: scopes y/o nombre. El secret NO se puede tocar — para rotar, revocar y crear otra.","tags":["Claves de API"]},"delete":{"operationId":"ApiKeysController_revoke","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Revoca una API key de forma permanente.","tags":["Claves de API"]}},"/organizations/{orgId}/invitations":{"get":{"operationId":"InvitationsController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista las invitaciones de la organización.","tags":["Invitaciones"]},"post":{"operationId":"InvitationsController_create","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInvitationDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crear invitación. Devuelve `token` UNA sola vez (enviar por email).","tags":["Invitaciones"]}},"/organizations/{orgId}/invitations/bulk":{"post":{"operationId":"InvitationsController_bulk","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkInvitationDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Invita a varios correos a la vez con un mismo rol (y alcance de WABA opcional). Deduplica y omite los que ya son miembros o ya tienen invitación pendiente.","tags":["Invitaciones"]}},"/organizations/{orgId}/invitations/preregister":{"post":{"operationId":"InvitationsController_preregister","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreregisterDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Preregistra agentes: crea sus cuentas (estado pendiente) y membresías al invitar, ocupando asiento. El agente solo define su contraseña para activarse.","tags":["Invitaciones"]}},"/organizations/{orgId}/invitations/activation/{membershipId}":{"post":{"operationId":"InvitationsController_reactivate","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"membershipId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReactivateDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Regenera el enlace de activación de un miembro pendiente. Con `notify` además reenvía el correo. Devuelve el token nuevo para copiar.","tags":["Invitaciones"]}},"/organizations/{orgId}/invitations/{id}":{"delete":{"operationId":"InvitationsController_cancel","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cancela una invitación pendiente. Falla si ya fue aceptada.","tags":["Invitaciones"]}},"/organizations/{orgId}/invitations/{id}/resend":{"post":{"operationId":"InvitationsController_resend","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Reenvía una invitación: rota el token, refresca la expiración y vuelve a mandar el email. Falla si ya fue aceptada.","tags":["Invitaciones"]}},"/organizations/{orgId}/invitations/{id}/link":{"post":{"operationId":"InvitationsController_link","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Genera un enlace de aceptación fresco (rota el token) SIN enviar email, para copiar y compartir por otro canal. Falla si ya fue aceptada.","tags":["Invitaciones"]}},"/invitations/lookup":{"get":{"operationId":"InvitationsController_lookup","parameters":[{"name":"token","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Datos públicos de una invitación por token (org, rol, email, si ya tiene cuenta). Sin auth — lo usa la página de aceptación.","tags":["Invitaciones"]}},"/invitations/accept":{"post":{"operationId":"InvitationsController_accept","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptInvitationDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Aceptar invitación con el token recibido","tags":["Invitaciones"]}},"/invitations/accept-signup":{"post":{"operationId":"InvitationsController_acceptSignup","parameters":[{"name":"user-agent","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptSignupDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Acepta la invitación creando la cuenta en el mismo paso (email tomado del token). Devuelve una sesión lista para usar.","tags":["Invitaciones"]}},"/invitations/activate-lookup":{"get":{"operationId":"InvitationsController_activateLookup","parameters":[{"name":"token","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Datos públicos de una activación por token (org, rol, email, nombre). Sin auth — lo usa la página de activar cuenta.","tags":["Invitaciones"]}},"/invitations/activate":{"post":{"operationId":"InvitationsController_activate","parameters":[{"name":"user-agent","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivateDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Activa una cuenta preregistrada definiendo su contraseña. Devuelve una sesión lista para usar.","tags":["Invitaciones"]}},"/two-factor/enroll":{"post":{"operationId":"TwoFactorController_enroll","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Inicia el alta de 2FA y devuelve el secreto/QR TOTP.","tags":["Doble factor (2FA)"]}},"/two-factor/verify":{"post":{"operationId":"TwoFactorController_verify","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Verifica el código TOTP y activa el 2FA.","tags":["Doble factor (2FA)"]}},"/two-factor/disable":{"post":{"operationId":"TwoFactorController_disable","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisableDto"}}}},"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Desactiva el 2FA del usuario (requiere código TOTP actual).","tags":["Doble factor (2FA)"]}},"/notifications":{"get":{"operationId":"NotificationsController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista las notificaciones del usuario autenticado.","tags":["Notificaciones"]}},"/notifications/{id}/read":{"patch":{"operationId":"NotificationsController_read","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Marca una notificación como leída.","tags":["Notificaciones"]}},"/system-notices/active":{"get":{"operationId":"SystemNoticesController_active","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Avisos del sistema vigentes para el banner del dashboard.","tags":["Avisos del sistema"]}},"/admin/system-notices":{"get":{"operationId":"SystemNoticesAdminController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista todos los avisos del sistema (vigentes o no).","tags":["Administración (staff Mosend)"]},"post":{"operationId":"SystemNoticesAdminController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSystemNoticeDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea (y publica si active) un aviso del sistema.","tags":["Administración (staff Mosend)"]}},"/admin/system-notices/{id}":{"patch":{"operationId":"SystemNoticesAdminController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSystemNoticeDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Edita un aviso del sistema (incluye activar/desactivar).","tags":["Administración (staff Mosend)"]},"delete":{"operationId":"SystemNoticesAdminController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina un aviso del sistema.","tags":["Administración (staff Mosend)"]}},"/admin/staff-emails":{"get":{"operationId":"StaffEmailsAdminController_listar","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Últimos envíos con su resultado.","tags":["Administración (staff Mosend)"]},"post":{"operationId":"StaffEmailsAdminController_crear","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrearEnvioDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea el envío y lo encola. `esperados` debe coincidir con lo que dijo la previsualización o se rechaza.","tags":["Administración (staff Mosend)"]}},"/admin/staff-emails/cabeceras":{"get":{"operationId":"StaffEmailsAdminController_cabeceras","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cabeceras predefinidas. Son HTML, no imágenes: se ven igual en todos los clientes y no llegan bloqueadas.","tags":["Administración (staff Mosend)"]}},"/admin/staff-emails/borradores":{"get":{"operationId":"StaffEmailsAdminController_listarBorradores","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Borradores del equipo, con quién los empezó.","tags":["Administración (staff Mosend)"]},"post":{"operationId":"StaffEmailsAdminController_guardarBorrador","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardarBorradorDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Guarda un borrador nuevo, o actualiza el de `borradorId`.","tags":["Administración (staff Mosend)"]}},"/admin/staff-emails/borradores/{id}":{"delete":{"operationId":"StaffEmailsAdminController_borrarBorrador","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Descarta un borrador.","tags":["Administración (staff Mosend)"]}},"/admin/staff-emails/novedades":{"get":{"operationId":"StaffEmailsAdminController_novedades","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Versiones publicadas en el centro de ayuda, para precargar el anuncio. Vacío si no responde.","tags":["Administración (staff Mosend)"]}},"/admin/staff-emails/{id}":{"get":{"operationId":"StaffEmailsAdminController_detalle","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle de un envío, con el estado de cada destinatario.","tags":["Administración (staff Mosend)"]}},"/admin/staff-emails/preview":{"post":{"operationId":"StaffEmailsAdminController_previsualizar","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrevisualizarEnvioDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"A cuánta gente le llegaría y cómo se vería, sin enviar nada. Devuelve el HTML ya armado.","tags":["Administración (staff Mosend)"]}},"/admin/staff-emails/test":{"post":{"operationId":"StaffEmailsAdminController_prueba","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvioDePruebaDto"}}}},"responses":{"202":{"description":""}},"security":[{"bearer":[]}],"summary":"Manda una copia a una dirección suelta. No registra campaña.","tags":["Administración (staff Mosend)"]}},"/avisos-por-correo/baja":{"post":{"operationId":"StaffEmailsPublicController_baja","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DarseDeBajaDto"}}}},"responses":{"200":{"description":""}},"summary":"Deja de recibir los anuncios del producto (o vuelve a recibirlos con baja=false). No afecta a los correos de la cuenta.","tags":["Avisos por correo"]}},"/organizations/{orgId}/waba":{"get":{"operationId":"WabaController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"includeArchived","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista las WABAs de la organización.","tags":["WABA"]}},"/organizations/{orgId}/waba/{id}":{"get":{"operationId":"WabaController_getOne","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Obtiene el detalle de una WABA.","tags":["WABA"]},"delete":{"operationId":"WabaController_archive","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Archiva (soft-delete) la WABA. Conversaciones, mensajes y cargos se conservan.","tags":["WABA"]}},"/organizations/{orgId}/waba/connect-test-number":{"post":{"operationId":"WabaController_connectTestNumber","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectTestNumberDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Conecta manualmente un número de prueba con un permanent access token de Meta (sin Embedded Signup).","tags":["WABA"]}},"/organizations/{orgId}/waba/{id}/restore":{"post":{"operationId":"WabaController_restore","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Restaura una WABA archivada y vuelve a suscribir webhooks.","tags":["WABA"]}},"/organizations/{orgId}/waba/{id}/webhooks/resubscribe":{"post":{"operationId":"WabaController_resubscribeWebhooks","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Reintenta suscribir la app a los webhooks de la WABA (sin ella no entran mensajes).","tags":["WABA"]}},"/organizations/{orgId}/waba/{id}/purge":{"delete":{"operationId":"WabaController_purge","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurgeWabaDto"}}}},"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"HARD delete: borra permanentemente la WABA y todo lo asociado. Bloquea si hay cargos pendientes de facturar.","tags":["WABA"]}},"/embedded-signup/initiate":{"post":{"operationId":"EmbeddedSignupController_initiate","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitiateSignupDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Inicia una sesión de Embedded Signup; el frontend redirige a Facebook con el sessionId.","tags":["Registro embebido"]}},"/embedded-signup/callback":{"post":{"operationId":"EmbeddedSignupController_callback","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallbackDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Intercambia el `code` de Facebook por un access token y lo persiste cifrado. No importa nada todavía.","tags":["Registro embebido"]}},"/embedded-signup/{id}/discover":{"get":{"operationId":"EmbeddedSignupController_discover","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los Businesses → WABAs → números visibles para el usuario, sin persistir.","tags":["Registro embebido"]}},"/embedded-signup/{id}/complete":{"post":{"operationId":"EmbeddedSignupController_complete","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteImportDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Persiste solo las WABAs/números seleccionados por el usuario y suscribe webhooks.","tags":["Registro embebido"]}},"/embedded-signup/{id}":{"get":{"operationId":"EmbeddedSignupController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Registro embebido"]}},"/organizations/{orgId}/phone-numbers":{"post":{"operationId":"PhoneNumbersController_addNew","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddPhoneNumberDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Agrega un nuevo número de teléfono a la WABA via Meta Cloud API.","tags":["Números de teléfono"]},"get":{"operationId":"PhoneNumbersController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"wabaId","required":true,"in":"query","schema":{"type":"string"}},{"name":"includeArchived","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los números de teléfono de la organización.","tags":["Números de teléfono"]}},"/organizations/{orgId}/phone-numbers/service-usage":{"get":{"operationId":"PhoneNumbersController_serviceUsage","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Mensajes de servicio del mes por número, contra los 1.000 gratis de Meta (se cobran los que pasen, desde el 1-oct-2026).","tags":["Números de teléfono"]}},"/organizations/{orgId}/phone-numbers/{id}":{"get":{"operationId":"PhoneNumbersController_getOne","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Obtiene el detalle de un número de teléfono.","tags":["Números de teléfono"]},"patch":{"operationId":"PhoneNumbersController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePhoneNumberDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza ajustes del canal en el panel (hoy: el color con el que se distingue en el inbox).","tags":["Números de teléfono"]},"delete":{"operationId":"PhoneNumbersController_archive","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Archiva (soft-delete) el número.","tags":["Números de teléfono"]}},"/organizations/{orgId}/phone-numbers/{id}/historial-de-conexion":{"get":{"operationId":"PhoneNumbersController_historialDeConexion","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Desconexiones y reconexiones del número, con su motivo.","tags":["Números de teléfono"]}},"/organizations/{orgId}/phone-numbers/{id}/impacto-al-archivar":{"get":{"description":"Plantillas aprobadas que quedan sin número (si es el último de su cuenta de WhatsApp), flujos publicados que lo usan y difusiones programadas desde él.","operationId":"PhoneNumbersController_impactoAlArchivar","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Qué deja de funcionar si se archiva el número.","tags":["Números de teléfono"]}},"/organizations/{orgId}/phone-numbers/sync":{"post":{"operationId":"PhoneNumbersController_sync","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Sincroniza con Meta: archiva números que ya no existen ahí y restaura los que volvieron.","tags":["Números de teléfono"]}},"/organizations/{orgId}/phone-numbers/{id}/username":{"post":{"operationId":"PhoneNumbersController_setUsername","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetUsernameDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Reserva o cambia el username de negocio del número (WhatsApp usernames). force_transfer lo mueve desde otro número del portfolio.","tags":["Números de teléfono"]}},"/organizations/{orgId}/phone-numbers/{id}/restore":{"post":{"operationId":"PhoneNumbersController_restore","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Restaura un número archivado.","tags":["Números de teléfono"]}},"/organizations/{orgId}/phone-numbers/{id}/coexistence/sync":{"post":{"operationId":"PhoneNumbersController_syncCoexistence","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Coexistencia: pide a Meta los contactos y el historial de la app WhatsApp Business (ventana de 24 h desde el registro, una sola vez).","tags":["Números de teléfono"]}},"/organizations/{orgId}/phone-numbers/{id}/reconnect":{"post":{"operationId":"PhoneNumbersController_reconnect","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Re-verifica el número contra Meta y sana la marca de desconexión si volvió a responder; si no, indica rehacer la conexión.","tags":["Números de teléfono"]}},"/organizations/{orgId}/phone-numbers/{id}/purge":{"delete":{"operationId":"PhoneNumbersController_purge","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurgePhoneNumberDto"}}}},"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"HARD delete del número. Bloquea si hay cargos pendientes.","tags":["Números de teléfono"]}},"/organizations/{orgId}/phone-numbers/{id}/prueba-de-conexion":{"post":{"operationId":"PruebaDeConexionController_iniciar","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Abre una prueba de ida y vuelta: devuelve el texto y el enlace para escribirle al número; al llegar, se responde solo.","tags":["Números de teléfono"]}},"/organizations/{orgId}/phone-numbers/{id}/prueba-de-conexion/{codigo}":{"get":{"operationId":"PruebaDeConexionController_estado","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"codigo","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Estado de la prueba: esperando, recibido, respondido, fallo o vencida.","tags":["Números de teléfono"]}},"/organizations/{orgId}/messages":{"post":{"operationId":"MessagesController_send","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendMessageDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Envía un mensaje de WhatsApp (texto, media o plantilla) a un contacto.","tags":["Mensajes"]}},"/organizations/{orgId}/messages/product":{"post":{"operationId":"MessagesController_sendProduct","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendProductDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Envía un mensaje de producto de WhatsApp Commerce (single / multi / catálogo).","tags":["Mensajes"]}},"/organizations/{orgId}/messages/interactive":{"post":{"operationId":"MessagesController_sendInteractive","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendInteractiveDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Envía un mensaje de servicio interactivo (lista / botón CTA URL / pedir ubicación).","tags":["Mensajes"]}},"/organizations/{orgId}/messages/flow":{"post":{"operationId":"MessagesController_sendFlow","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendFlowDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Envía un mensaje de WhatsApp Flow (formulario nativo).","tags":["Mensajes"]}},"/organizations/{orgId}/messages/carousel":{"post":{"operationId":"MessagesController_sendCarousel","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendCarouselDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Envía un carrusel multimedia interactivo (hasta 10 tarjetas).","tags":["Mensajes"]}},"/organizations/{orgId}/messages/{messageId}/edit":{"patch":{"operationId":"MessagesController_edit","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"messageId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditMessageDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Edita el texto de un mensaje ya enviado.","tags":["Mensajes"]}},"/organizations/{orgId}/messages/{messageId}":{"delete":{"operationId":"MessagesController_deleteMessage","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"messageId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina un mensaje (lo oculta del inbox como tombstone).","tags":["Mensajes"]}},"/organizations/{orgId}/messages/{messageId}/revelar":{"post":{"description":"Solo para mensajes entrantes eliminados. Queda registrado en la bitácora quién lo consultó y cuándo.","operationId":"MessagesController_revelar","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"messageId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Muestra el contenido de un mensaje que el cliente eliminó.","tags":["Mensajes"]}},"/organizations/{orgId}/messages/{messageId}/restore":{"post":{"operationId":"MessagesController_restore","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"messageId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Revierte el tombstone de un mensaje y lo vuelve a mostrar en el inbox.","tags":["Mensajes"]}},"/organizations/{orgId}/messages/upload":{"post":{"operationId":"MessagesController_uploadMedia","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneNumberId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Sube un archivo a Meta como media adjunto y devuelve el mediaId para usar al enviar.","tags":["Mensajes"]}},"/organizations/{orgId}/messages/{messageId}/media":{"get":{"operationId":"MessagesController_getMedia","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"messageId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Descarga y proxyea el media de un mensaje (sirve desde caché S3 o desde Meta).","tags":["Mensajes"]}},"/organizations/{orgId}/media/{id}":{"get":{"operationId":"MediaController_getOne","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Obtiene los metadatos de un archivo de medios por su ID.","tags":["Multimedia"]}},"/organizations/{orgId}/media/{id}/url":{"get":{"operationId":"MediaController_signedUrl","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Devuelve una URL firmada de descarga del archivo de medios.","tags":["Multimedia"]}},"/organizations/{orgId}/phone-numbers/{phoneId}/registration/request-code":{"post":{"operationId":"PhoneNumberRegistrationController_requestCode","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestRegistrationCodeDto"}}}},"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"tags":["Registro de número"]}},"/organizations/{orgId}/phone-numbers/{phoneId}/registration/verify-code":{"post":{"operationId":"PhoneNumberRegistrationController_verifyCode","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRegistrationCodeDto"}}}},"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"tags":["Registro de número"]}},"/organizations/{orgId}/phone-numbers/{phoneId}/registration/register":{"post":{"operationId":"PhoneNumberRegistrationController_register","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterDto"}}}},"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"tags":["Registro de número"]}},"/organizations/{orgId}/phone-numbers/{phoneId}/registration/deregister":{"post":{"operationId":"PhoneNumberRegistrationController_deregister","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"tags":["Registro de número"]}},"/organizations/{orgId}/whatsapp-links":{"get":{"operationId":"WhatsAppLinksController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneNumberId","required":true,"in":"query","schema":{"type":"string"}},{"name":"includeArchived","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los enlaces Click-to-WhatsApp de la organización.","tags":["Enlaces de WhatsApp"]},"post":{"operationId":"WhatsAppLinksController_create","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea un enlace Click-to-WhatsApp con su URL pública.","tags":["Enlaces de WhatsApp"]}},"/organizations/{orgId}/whatsapp-links/{id}":{"get":{"operationId":"WhatsAppLinksController_getOne","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Obtiene el detalle de un enlace Click-to-WhatsApp por su id.","tags":["Enlaces de WhatsApp"]},"patch":{"operationId":"WhatsAppLinksController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza un enlace Click-to-WhatsApp.","tags":["Enlaces de WhatsApp"]},"delete":{"operationId":"WhatsAppLinksController_archive","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Toggle archivado del enlace (soft-delete reversible).","tags":["Enlaces de WhatsApp"]}},"/organizations/{orgId}/whatsapp-links/{id}/stats":{"get":{"description":"`dias` acota el período (30 por defecto, máximo 365). Los clics se analizan en segundo plano: `pendientes` son los que aún no. La ubicación es aproximada, por IP (DB-IP Lite).","operationId":"WhatsAppLinksController_stats","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"dias","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Estadísticas de un enlace: personas y clics (sin robots ni vistas previas), por día y hora, dispositivo, sistema, app o navegador, origen, campaña (utm), país, ciudad e idioma, conversaciones iniciadas y ventas en ellas.","tags":["Enlaces de WhatsApp"]}},"/organizations/{orgId}/whatsapp-links/{id}/qr":{"get":{"operationId":"WhatsAppLinksController_qr","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"format","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Genera el código QR del enlace en formato PNG o SVG (?format, ?size).","tags":["Enlaces de WhatsApp"]}},"/m/{slug}":{"get":{"operationId":"WhatsAppLinksController_redirect[0]","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Redirect público de Click-to-WhatsApp. Resuelve el slug, registra el click y responde 302 hacia api.whatsapp.com con el mensaje pre-llenado.","tags":["Enlaces de WhatsApp"]}},"/p/{slug}":{"get":{"operationId":"WhatsAppLinksController_redirect[1]","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Redirect público de Click-to-WhatsApp. Resuelve el slug, registra el click y responde 302 hacia api.whatsapp.com con el mensaje pre-llenado.","tags":["Enlaces de WhatsApp"]}},"/organizations/{orgId}/plan-limits":{"get":{"operationId":"PlanLimitsController_get","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Plan actual + uso vs cuotas. Frontend lo usa para barras de progreso.","tags":["Plan & límites"]}},"/organizations/{orgId}/whatsapp-groups":{"get":{"operationId":"WhatsappGroupsController_listar","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneNumberId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los grupos de WhatsApp de la organización.","tags":["Grupos de WhatsApp"]},"post":{"description":"La creación es asíncrona: Meta devuelve un identificador de solicitud y el grupo queda «creándose» hasta que llega su webhook. Requiere cuenta de empresa oficial (OBA). Máximo 8 participantes por grupo.","operationId":"WhatsappGroupsController_crear","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrearGrupoDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea un grupo. El id y el enlace llegan por webhook.","tags":["Grupos de WhatsApp"]}},"/organizations/{orgId}/whatsapp-groups/{id}":{"get":{"operationId":"WhatsappGroupsController_obtener","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Un grupo con sus participantes.","tags":["Grupos de WhatsApp"]},"delete":{"operationId":"WhatsappGroupsController_borrar","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina el grupo y saca a todos sus participantes.","tags":["Grupos de WhatsApp"]}},"/organizations/{orgId}/whatsapp-groups/{id}/invite-link":{"get":{"operationId":"WhatsappGroupsController_enlace","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Enlace de invitación vigente del grupo.","tags":["Grupos de WhatsApp"]},"post":{"description":"Quien tuviera el enlace viejo ya no podrá entrar con él. Los que ya están dentro siguen dentro.","operationId":"WhatsappGroupsController_regenerarEnlace","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Revoca el enlace anterior y genera uno nuevo.","tags":["Grupos de WhatsApp"]}},"/organizations/{orgId}/whatsapp-groups/{id}/participants":{"delete":{"description":"A quien se saca de un grupo NO puede volver a entrar con el enlace de invitación.","operationId":"WhatsappGroupsController_sacar","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SacarParticipantesDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Saca participantes del grupo.","tags":["Grupos de WhatsApp"]}},"/organizations/{orgId}/whatsapp-groups/{id}/join-requests":{"get":{"description":"Solo aplica a grupos creados con aprobación previa.","operationId":"WhatsappGroupsController_solicitudes","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Solicitudes de ingreso pendientes.","tags":["Grupos de WhatsApp"]},"post":{"operationId":"WhatsappGroupsController_resolver","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolverSolicitudesDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Aprueba o rechaza solicitudes de ingreso.","tags":["Grupos de WhatsApp"]}},"/organizations/{orgId}/contacts":{"get":{"operationId":"ContactsController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"q","required":true,"in":"query","schema":{"type":"string"}},{"name":"channel","required":true,"in":"query","schema":{"type":"string"}},{"name":"identifiedOnly","required":true,"in":"query","schema":{"type":"string"}},{"name":"tagId","required":true,"in":"query","schema":{"type":"string"}},{"name":"optInStatus","required":true,"in":"query","schema":{"type":"string"}},{"name":"country","required":true,"in":"query","schema":{"type":"string"}},{"name":"language","required":true,"in":"query","schema":{"type":"string"}},{"name":"createdSince","required":true,"in":"query","schema":{"type":"string"}},{"name":"hasConversations","required":true,"in":"query","schema":{"type":"string"}},{"name":"lastActivityDaysGt","required":true,"in":"query","schema":{"type":"string"}},{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"pageSize","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ContactEntity"}}}}}},"security":[{"bearer":[]}],"summary":"Lista y filtra contactos (búsqueda, canal, etiqueta, opt-in, país, actividad). Paginado.","tags":["Contactos"]},"post":{"operationId":"ContactsController_upsert","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertContactDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea o actualiza un contacto (upsert por waId).","tags":["Contactos"]}},"/organizations/{orgId}/contacts/export":{"get":{"operationId":"ContactsController_exportar","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"q","required":true,"in":"query","schema":{"type":"string"}},{"name":"channel","required":true,"in":"query","schema":{"type":"string"}},{"name":"identifiedOnly","required":true,"in":"query","schema":{"type":"string"}},{"name":"tagId","required":true,"in":"query","schema":{"type":"string"}},{"name":"optInStatus","required":true,"in":"query","schema":{"type":"string"}},{"name":"country","required":true,"in":"query","schema":{"type":"string"}},{"name":"language","required":true,"in":"query","schema":{"type":"string"}},{"name":"createdSince","required":true,"in":"query","schema":{"type":"string"}},{"name":"hasConversations","required":true,"in":"query","schema":{"type":"string"}},{"name":"lastActivityDaysGt","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Todos los contactos que coinciden con los filtros (los mismos del listado), sin paginar, para descargarlos.","tags":["Contactos"]}},"/organizations/{orgId}/contacts/bulk-tag":{"post":{"operationId":"ContactsController_bulkTag","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Agrega o quita una etiqueta a varios contactos de una vez.","tags":["Contactos"]}},"/organizations/{orgId}/contacts/bulk-delete":{"post":{"operationId":"ContactsController_bulkDelete","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkDeleteContactsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina varios contactos de una vez.","tags":["Contactos"]}},"/organizations/{orgId}/contacts/bulk-opt-in-status":{"post":{"operationId":"ContactsController_bulkOptInStatus","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cambia el estado de opt-in (UNKNOWN/OPTED_IN/OPTED_OUT) de varios contactos.","tags":["Contactos"]}},"/organizations/{orgId}/contacts/import":{"post":{"operationId":"ContactsController_importCsv","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"defaultCountry","required":true,"in":"query","schema":{"type":"string"}},{"name":"defaultOptIn","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Importa contactos desde un archivo CSV (multipart/form-data, campo file).","tags":["Contactos"]}},"/organizations/{orgId}/contacts/{id}":{"get":{"operationId":"ContactsController_getOne","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactEntity"}}}}},"security":[{"bearer":[]}],"summary":"Detalle de un contacto por id.","tags":["Contactos"]},"patch":{"operationId":"ContactsController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateContactDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza campos de un contacto (nombre, atributos, idioma, etc.).","tags":["Contactos"]},"delete":{"operationId":"ContactsController_remove","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina un contacto por id.","tags":["Contactos"]}},"/organizations/{orgId}/conversations":{"get":{"operationId":"ConversationsController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"status","required":true,"in":"query","schema":{"type":"string"}},{"name":"phoneNumberId","required":true,"in":"query","schema":{"type":"string"}},{"name":"assigneeUserId","required":true,"in":"query","schema":{"type":"string"}},{"name":"tagId","required":true,"in":"query","schema":{"type":"string"}},{"name":"unreadOnly","required":true,"in":"query","schema":{"type":"string"}},{"name":"handoffPending","required":true,"in":"query","schema":{"type":"string"}},{"name":"take","required":true,"in":"query","schema":{"type":"string"}},{"name":"cursor","required":true,"in":"query","schema":{"type":"string"}},{"name":"search","required":true,"in":"query","schema":{"type":"string"}},{"name":"resolutionOutcome","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista conversaciones del inbox con filtros por estado, número, asignado, etiqueta y no leídas.","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/messaging-settings":{"get":{"operationId":"ConversationsController_getMessagingSettings","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Obtiene los ajustes de mensajería de la org (read receipts, indicador de escritura).","tags":["Conversaciones"]},"patch":{"operationId":"ConversationsController_updateMessagingSettings","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza los ajustes de mensajería de la org (read receipts, indicador de escritura, pestañas del inbox).","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/unread-counts":{"get":{"operationId":"ConversationsController_unreadCounts","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneNumberId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Devuelve los conteos de no leídas por estado para los badges del inbox.","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/search":{"get":{"operationId":"ConversationsController_search","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"q","required":true,"in":"query","schema":{"type":"string"}},{"name":"from","required":true,"in":"query","schema":{"type":"string"}},{"name":"to","required":true,"in":"query","schema":{"type":"string"}},{"name":"direction","required":true,"in":"query","schema":{"type":"string"}},{"name":"hasAttachment","required":true,"in":"query","schema":{"type":"string"}},{"name":"sentByMe","required":true,"in":"query","schema":{"type":"string"}},{"name":"conversationId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Busca dentro del contenido de los mensajes de la org con filtros por fecha, dirección y adjunto.","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/workload":{"get":{"operationId":"ConversationsController_workload","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista métricas de carga y performance reciente por agente (requiere reports:read).","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/workload/settings":{"get":{"operationId":"ConversationsController_getWorkloadSettings","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Obtiene la configuración del panel de workload (thresholds de SLA y staleness).","tags":["Conversaciones"]},"patch":{"operationId":"ConversationsController_patchWorkloadSettings","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza parcialmente la configuración del panel de workload (thresholds).","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/notification-settings":{"get":{"operationId":"ConversationsController_getNotificationSettings","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Obtiene la configuración de notificaciones por correo (retraso de conversación).","tags":["Conversaciones"]},"patch":{"operationId":"ConversationsController_patchNotificationSettings","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza parcialmente la configuración de notificaciones por correo (retraso de conversación).","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/workload/agent/{userId}":{"get":{"operationId":"ConversationsController_agentWorkloadDetail","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"userId","required":true,"in":"path","schema":{"type":"string"}},{"name":"days","required":true,"in":"query","schema":{"type":"string"}},{"name":"from","required":true,"in":"query","schema":{"type":"string"}},{"name":"to","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle de workload de un agente: agregados y tenencias de los últimos N días.","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/activity-trends":{"get":{"operationId":"ConversationsController_activityTrends","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"days","required":true,"in":"query","schema":{"type":"string"}},{"name":"desde","required":true,"in":"query","schema":{"type":"string"}},{"name":"hasta","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Serie temporal de conversaciones entrantes y cerradas por día (?days=N).","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/activity-heatmap":{"get":{"operationId":"ConversationsController_activityHeatmap","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"days","required":true,"in":"query","schema":{"type":"string"}},{"name":"metric","required":true,"in":"query","schema":{"type":"string"}},{"name":"desde","required":true,"in":"query","schema":{"type":"string"}},{"name":"hasta","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Heatmap día-de-semana × hora de actividad (?metric=volume|late|avgResponse).","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/{id}":{"get":{"operationId":"ConversationsController_getOne","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Obtiene el detalle de una conversación por su id.","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/{id}/messages":{"get":{"operationId":"ConversationsController_messages","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"before","required":true,"in":"query","schema":{"type":"string"}},{"name":"around","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los mensajes de una conversación con paginación por cursor.","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/{id}/media":{"get":{"operationId":"ConversationsController_listMedia","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"category","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"before","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista mensajes de media de una conversación filtrados por categoría (image|video|audio|doc).","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/{id}/media/counts":{"get":{"operationId":"ConversationsController_mediaCounts","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Conteos de media por categoría (image/video/audio/doc/links) para los tabs de Galería.","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/{id}/links":{"get":{"operationId":"ConversationsController_listLinks","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"before","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista URLs encontradas en mensajes de texto de la conversación (sub-tab Links de Galería).","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/{id}/status":{"patch":{"operationId":"ConversationsController_updateStatus","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cambia el estado de la conversación (open/closed/snoozed); al cerrar acepta category y resolución.","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/{id}/request-handoff":{"post":{"operationId":"ConversationsController_requestHandoff","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestHandoffDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Solicita handoff a un asesor humano: marca pendiente, calla la automatización y notifica.","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/{id}/categorize":{"patch":{"operationId":"ConversationsController_categorize","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Asigna o corrige category y resolución de la conversación sin cambiar su estado.","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/{id}/read":{"post":{"operationId":"ConversationsController_markAsRead","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Marca la conversación como leída.","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/{id}/unread":{"post":{"operationId":"ConversationsController_markAsUnread","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Marca la conversación como no leída.","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/{id}/typing":{"post":{"operationId":"ConversationsController_typing","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Envía el indicador de \"escribiendo\" al contacto de la conversación.","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/{id}/assign":{"patch":{"operationId":"ConversationsController_assign","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignConversationDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Asigna la conversación a un usuario o la libera (userId null).","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/{id}/claim":{"post":{"operationId":"ConversationsController_claim","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"El usuario actual toma posesión de la conversación (autoasignación).","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/{id}/agent":{"patch":{"operationId":"ConversationsController_cambiarAgente","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetConversationAgentDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Fija qué agente del bot atiende la conversación (agentId null = que decida el enrutador).","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/{id}/devolver-al-bot":{"post":{"operationId":"ConversationsController_devolverAlBot","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Devuelve la conversación al bot (reactiva el bot conservando el contexto).","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/bulk-assign":{"post":{"operationId":"ConversationsController_bulkAssign","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkAssignConversationsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Reasigna en lote varias conversaciones a un usuario o las libera.","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/{id}/snooze":{"patch":{"operationId":"ConversationsController_snooze","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnoozeConversationDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Pospone la conversación hasta una fecha, o cancela el snooze (until null).","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/{id}/pin":{"patch":{"operationId":"ConversationsController_setPinned","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetPinnedDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Fija o desfija la conversación en el inbox.","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/{id}/tags":{"post":{"operationId":"ConversationsController_addTag","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddConversationTagDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Agrega una etiqueta a la conversación.","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/{id}/tags/{tagId}":{"delete":{"operationId":"ConversationsController_removeTag","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"tagId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Quita una etiqueta de la conversación.","tags":["Conversaciones"]}},"/push/device":{"post":{"operationId":"PushController_registerDevice","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterDeviceDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Registra el token de push nativo del dispositivo (FCM en Android / APNs en iOS; Expo solo legacy).","tags":["Notificaciones push"]},"delete":{"operationId":"PushController_unregisterDevice","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnregisterDeviceDto"}}}},"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Da de baja un token de push nativo (logout en el device).","tags":["Notificaciones push"]}},"/push/config":{"get":{"operationId":"PushController_config","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"VAPID public key y disponibilidad del servicio.","tags":["Notificaciones push"]}},"/push/subscribe":{"post":{"operationId":"PushController_subscribe","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Guarda la suscripción Push del browser del usuario.","tags":["Notificaciones push"]},"delete":{"operationId":"PushController_unsubscribe","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnsubscribeDto"}}}},"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina una suscripción Push (logout en device, toggle off).","tags":["Notificaciones push"]}},"/push/rotate":{"post":{"operationId":"PushController_rotate","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RotateDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Re-registra una suscripción tras pushsubscriptionchange.","tags":["Notificaciones push"]}},"/push/subscriptions":{"get":{"operationId":"PushController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los devices del usuario con push habilitado.","tags":["Notificaciones push"]}},"/push/diagnose":{"get":{"operationId":"PushController_diagnose","parameters":[{"name":"endpoint","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Estado de un endpoint en el backend (registrado / no).","tags":["Notificaciones push"]}},"/push/test":{"post":{"operationId":"PushController_test","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Envía una notificación de prueba al usuario actual.","tags":["Notificaciones push"]}},"/organizations/{orgId}/ad-campaigns":{"get":{"description":"No se crean a mano: aparecen solos cuando llega el primer mensaje de ese anuncio, con el titular, el texto y la media que manda Meta.","operationId":"AdCampaignsController_listar","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Anuncios que han traído conversaciones, con lo que han vendido.","tags":["Anuncios (Click-to-WhatsApp)"]}},"/organizations/{orgId}/ad-campaigns/{id}/por-seguir":{"get":{"description":"La ventana gratis es la de Meta: si se le responde en las primeras 24 h, ningún mensaje se cobra durante 72 h desde esa respuesta, o hasta 7 días en las cuentas a las que Meta ya les activó la ventana nueva (se detecta por cuenta en sus propios mensajes). Las ventas de cada anuncio están en el reporte de Ventas (`reports/ventas?anuncioId=`).","operationId":"AdCampaignsController_porSeguir","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Quiénes llegaron por un anuncio y siguen sin comprar, con su ventana gratis de Meta.","tags":["Anuncios (Click-to-WhatsApp)"]}},"/organizations/{orgId}/ad-campaigns/{id}":{"patch":{"operationId":"AdCampaignsController_actualizar","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActualizarAnuncioDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Dice qué significa un anuncio: qué vende, quién atiende, qué etiqueta.","tags":["Anuncios (Click-to-WhatsApp)"]}},"/organizations/{orgId}/surveys/config":{"get":{"operationId":"SurveysController_config","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"La configuración de la encuesta de satisfacción. Si nunca se guardó, devuelve los valores por defecto (apagada).","tags":["Encuesta de satisfacción"]},"patch":{"operationId":"SurveysController_guardar","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardarEncuestaDto"}}}},"responses":{"200":{"description":""}},"summary":"Cambia la configuración de la encuesta.","tags":["Encuesta de satisfacción"]}},"/organizations/{orgId}/surveys/results":{"get":{"operationId":"SurveysController_resultados","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"dias","required":false,"in":"query","schema":{"minimum":1,"maximum":366,"type":"number"}},{"name":"desde","required":false,"in":"query","schema":{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"}},{"name":"hasta","required":false,"in":"query","schema":{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"}}],"responses":{"200":{"description":""}},"summary":"Resultados: nota media, tasa de respuesta, desglose por opción y por asesor, comentarios y por qué no se mandaron algunas.","tags":["Encuesta de satisfacción"]}},"/organizations/{orgId}/agenda/settings":{"get":{"operationId":"AgendaController_getSettings","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Configuración de la agenda de la organización.","tags":["Agenda"]},"patch":{"operationId":"AgendaController_updateSettings","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAgendaSettingsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza la configuración de la agenda (habilitar requiere la feature de plan `agenda`).","tags":["Agenda"]}},"/organizations/{orgId}/agenda/ics":{"get":{"operationId":"AgendaController_getIcs","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Estado del feed ICS público (URL de suscripción o deshabilitado).","tags":["Agenda"]},"delete":{"operationId":"AgendaController_revokeIcs","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Desactiva el feed ICS (borra el token).","tags":["Agenda"]}},"/organizations/{orgId}/agenda/ics/rotate":{"post":{"operationId":"AgendaController_rotateIcs","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Genera o rota el token del feed ICS (rotar revoca las suscripciones previas).","tags":["Agenda"]}},"/organizations/{orgId}/agenda/types":{"get":{"operationId":"AgendaController_listTypes","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los tipos de cita (servicios reservables).","tags":["Agenda"]},"post":{"operationId":"AgendaController_createType","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAppointmentTypeDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea un tipo de cita (duración + colchón).","tags":["Agenda"]}},"/organizations/{orgId}/agenda/types/{id}":{"patch":{"operationId":"AgendaController_updateType","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAppointmentTypeDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza (o desactiva) un tipo de cita.","tags":["Agenda"]}},"/organizations/{orgId}/agenda/staff":{"get":{"operationId":"AgendaController_listStaff","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Profesionales de la org (para agenda por profesional) + si ya tienen disponibilidad.","tags":["Agenda"]}},"/organizations/{orgId}/agenda/availability":{"get":{"operationId":"AgendaController_getAvailability","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"staffUserId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Reglas semanales de disponibilidad (weekday + minutos locales de la org). `staffUserId` para agenda por profesional.","tags":["Agenda"]},"put":{"operationId":"AgendaController_setAvailability","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"staffUserId","required":true,"in":"query","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetAvailabilityDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Reemplaza el set completo de reglas semanales.","tags":["Agenda"]}},"/organizations/{orgId}/agenda/exceptions":{"get":{"operationId":"AgendaController_listExceptions","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"staffUserId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Días bloqueados (festivos, vacaciones).","tags":["Agenda"]},"post":{"operationId":"AgendaController_addException","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"staffUserId","required":true,"in":"query","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddExceptionDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Bloquea un día completo (YYYY-MM-DD local).","tags":["Agenda"]}},"/organizations/{orgId}/agenda/exceptions/{id}":{"delete":{"operationId":"AgendaController_removeException","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Desbloquea un día.","tags":["Agenda"]}},"/organizations/{orgId}/agenda/slots":{"get":{"operationId":"AgendaController_getSlots","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"typeId","required":true,"in":"query","schema":{"format":"uuid","type":"string"}},{"name":"from","required":false,"in":"query","description":"Fecha/hora ISO desde la que buscar (default: ahora).","schema":{"type":"string"}},{"name":"days","required":false,"in":"query","description":"Cuántos días explorar (default 7, tope maxAdvanceDays del settings).","schema":{"minimum":1,"maximum":60,"type":"number"}},{"name":"staffUserId","required":false,"in":"query","description":"Profesional cuya disponibilidad consultar. Vacío = agenda general.","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Slots disponibles para un tipo de cita (TZ de la org; respeta antelación, excepciones y citas existentes).","tags":["Agenda"]}},"/organizations/{orgId}/agenda/appointments":{"get":{"operationId":"AgendaController_listAppointments","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"from","required":false,"in":"query","schema":{"type":"string"}},{"name":"to","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"$ref":"#/components/schemas/Object"}},{"name":"contactId","required":false,"in":"query","schema":{"format":"uuid","type":"string"}},{"name":"staffUserId","required":false,"in":"query","description":"Filtra por profesional. `general` = agenda general (staffUserId null).","schema":{"maxLength":64,"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista citas con filtros (rango, estado, contacto).","tags":["Agenda"]},"post":{"operationId":"AgendaController_book","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookAppointmentDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Reserva un slot exacto (de GET slots) para un contacto. 409 si el horario ya no está disponible.","tags":["Agenda"]}},"/organizations/{orgId}/agenda/appointments/{id}/cancel":{"patch":{"operationId":"AgendaController_cancel","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelAppointmentDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cancela una cita confirmada.","tags":["Agenda"]}},"/organizations/{orgId}/agenda/appointments/{id}/reschedule":{"patch":{"operationId":"AgendaController_reschedule","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RescheduleAppointmentDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Reprograma una cita confirmada a un nuevo horario disponible.","tags":["Agenda"]}},"/organizations/{orgId}/agenda/appointments/{id}":{"patch":{"operationId":"AgendaController_updateDetails","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAppointmentDetailsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Completa una cita: enlace de la reunión, correo de la invitación o notas. Si cambia el enlace o el correo, se le reenvía la invitación al cliente.","tags":["Agenda"]}},"/organizations/{orgId}/agenda/appointments/{id}/pedir-correo":{"post":{"operationId":"AgendaController_pedirCorreo","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Le pide al cliente por WhatsApp el correo para mandarle la invitación. El correo que escriba se guarda solo en la cita.","tags":["Agenda"]}},"/organizations/{orgId}/agenda/counts":{"get":{"operationId":"AgendaController_counts","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Contador de la agenda: citas agendadas que no han terminado, cuántas son hoy y la próxima.","tags":["Agenda"]}},"/organizations/{orgId}/agenda/appointments/{id}/status":{"patch":{"operationId":"AgendaController_setStatus","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetAppointmentStatusDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Marca una cita como COMPLETED o NO_SHOW.","tags":["Agenda"]}},"/public/agenda/{token}/calendar.ics":{"get":{"operationId":"AgendaPublicController_ics","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Feed ICS de la agenda (suscripción por token).","tags":["Agenda"]}},"/organizations/{orgId}/agenda/booking-flow/send":{"post":{"operationId":"AgendaBookingFlowController_send","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendBookingFlowDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Envía al contacto el Flow de reserva con date-picker nativo.","tags":["Agenda"]}},"/agenda/flow/data":{"post":{"operationId":"AgendaFlowDataController_data","parameters":[],"responses":{"201":{"description":""}},"summary":"Endpoint de datos del Flow de reserva (Meta).","tags":["Agenda"]}},"/organizations/{orgId}/agenda/google/status":{"get":{"operationId":"GoogleCalendarController_status","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Estado de la conexión con Google Calendar.","tags":["Agenda"]}},"/organizations/{orgId}/agenda/google/connect":{"get":{"operationId":"GoogleCalendarController_connect","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Devuelve la URL de consentimiento OAuth para conectar Google.","tags":["Agenda"]}},"/organizations/{orgId}/agenda/google":{"patch":{"operationId":"GoogleCalendarController_updateToggles","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoogleSyncDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Activa/desactiva push de citas y bloqueo por ocupado.","tags":["Agenda"]},"delete":{"operationId":"GoogleCalendarController_disconnect","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Desconecta Google Calendar.","tags":["Agenda"]}},"/agenda/google/callback":{"get":{"operationId":"GoogleCalendarCallbackController_callback","parameters":[{"name":"code","required":true,"in":"query","schema":{"type":"string"}},{"name":"state","required":true,"in":"query","schema":{"type":"string"}},{"name":"error","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Callback OAuth de Google Calendar.","tags":["Agenda"]}},"/organizations/{orgId}/messaging-limit":{"get":{"operationId":"LimiteDeMensajesController_vista","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneNumberId","required":false,"in":"query","description":"Número de la difusión: devuelve además el portafolio que lo contiene.","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Límite diario de mensajes de Meta por portafolio: nivel, clientes contactados con plantilla en 24 h, disponibles y avisos de Meta de los últimos 30 días. Con phoneNumberId, además el portafolio de ese número.","tags":["Phone Numbers"]}},"/organizations/{orgId}/license-delivery/settings":{"get":{"operationId":"LicenseDeliveryController_getSettings","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Configuración del módulo de entrega de licencias.","tags":["License Delivery"]},"put":{"operationId":"LicenseDeliveryController_updateSettings","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLicenseDeliverySettingsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza el módulo (habilitar requiere que el plan lo incluya o el add-on).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/settings/addon":{"put":{"operationId":"LicenseDeliveryController_setPaidAddon","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetPaidAddonDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Activa/desactiva el módulo como add-on de tarifa fija mensual (billing:write).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/selling-readiness":{"get":{"operationId":"LicenseDeliveryController_sellingReadiness","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneNumberId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Estado de venta autónoma del módulo (activo, Wompi, productos).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/analytics":{"get":{"operationId":"LicenseDeliveryController_analytics","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"days","required":true,"in":"query","schema":{"type":"string"}},{"name":"desde","required":true,"in":"query","schema":{"type":"string"}},{"name":"hasta","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Métricas de ventas de licencias: ingresos, conversión, top productos y stock.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/coupons":{"get":{"operationId":"LicenseDeliveryController_listCoupons","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los cupones de descuento.","tags":["License Delivery"]},"post":{"operationId":"LicenseDeliveryController_createCoupon","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLicenseCouponDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea un cupón de descuento.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/coupons/{couponId}":{"patch":{"operationId":"LicenseDeliveryController_updateCoupon","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"couponId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLicenseCouponDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza un cupón.","tags":["License Delivery"]},"delete":{"operationId":"LicenseDeliveryController_deleteCoupon","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"couponId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina un cupón.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/price-lists":{"get":{"operationId":"LicenseDeliveryController_listPriceLists","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Listas de precios por etiqueta (proveedores, mayoristas) con sus precios.","tags":["License Delivery"]},"post":{"operationId":"LicenseDeliveryController_createPriceList","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePriceListDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea una lista de precios.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/price-lists/{priceListId}":{"patch":{"operationId":"LicenseDeliveryController_updatePriceList","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"priceListId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePriceListDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Edita una lista de precios.","tags":["License Delivery"]},"delete":{"operationId":"LicenseDeliveryController_deletePriceList","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"priceListId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina una lista de precios.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/price-lists/{priceListId}/items":{"put":{"operationId":"LicenseDeliveryController_setPriceListItem","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"priceListId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetPriceListItemDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Fija (o quita, con priceCents null) el precio de un producto/variante en la lista.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/products":{"get":{"operationId":"LicenseDeliveryController_listProducts","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"conversationId","required":true,"in":"query","schema":{"type":"string"}},{"name":"contactId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los productos digitales con stock de llaves.","tags":["License Delivery"]},"post":{"operationId":"LicenseDeliveryController_createProduct","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDigitalProductDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea un producto digital.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/products/import":{"post":{"operationId":"LicenseDeliveryController_importProducts","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkImportProductsDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Import masivo de productos (Excel/CSV): crea los nuevos, salta los que ya existen por nombre o SKU.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/products/bulk":{"post":{"operationId":"LicenseDeliveryController_bulkUpdateProducts","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateProductsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Fija los mismos campos a varios productos (activo, modo de entrega, categoría, vigencia, aviso, dato adicional).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/products/bulk-price":{"post":{"operationId":"LicenseDeliveryController_bulkPriceProducts","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkPriceProductsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Ajusta el precio base de varios productos (porcentaje, monto o fijo, con redondeo). Con soloVistaPrevia devuelve el antes/después sin guardar.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/products/bulk-delete":{"post":{"operationId":"LicenseDeliveryController_bulkDeleteProducts","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkProductIdsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina varios productos; los que tienen ventas se informan aparte sin borrarse.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/price-lists/{priceListId}/items/bulk":{"put":{"operationId":"LicenseDeliveryController_bulkPriceListItems","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"priceListId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkPriceListItemsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Precio propio de varios productos en una lista: porcentaje del base, copiar el base, fijo o quitar.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/products/{productId}":{"get":{"operationId":"LicenseDeliveryController_getProduct","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle de un producto digital con su stock.","tags":["License Delivery"]},"patch":{"operationId":"LicenseDeliveryController_updateProduct","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDigitalProductDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza un producto digital.","tags":["License Delivery"]},"delete":{"operationId":"LicenseDeliveryController_deleteProduct","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina un producto y su pool de llaves.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/conversations/{conversationId}/cart-preview":{"post":{"operationId":"LicenseDeliveryController_previewCarrito","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"conversationId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewCarritoDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"A cuánto sale cada línea del carrito en la moneda con la que se va a cobrar, antes de cobrar. Usa la misma resolución que la venta.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/products/{productId}/prices":{"put":{"operationId":"LicenseDeliveryController_setProductPrices","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetProductPricesDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Fija los precios del producto en otras monedas. Reemplaza el conjunto: lo que no venga se borra. Sin precio para una moneda, se convierte con la tasa del día.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/transfer-qr":{"post":{"operationId":"LicenseDeliveryController_subirQrDeLlave","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Sube el QR de la llave de transferencia (PNG/JPG/WebP).","tags":["License Delivery"]},"delete":{"operationId":"LicenseDeliveryController_quitarQrDeLlave","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Quita el QR de la llave de transferencia.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/orders/{orderId}/captura-de-pago":{"post":{"operationId":"LicenseDeliveryController_subirCapturaDePago","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Sube la captura del pago de un pedido (PNG/JPG/WebP/PDF) y devuelve su mediaAssetId para confirmarlo.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/products/{productId}/image":{"post":{"operationId":"LicenseDeliveryController_uploadProductImage","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Sube la imagen del producto (PNG/JPG/WebP, máx 8 MB) y la sirve pública.","tags":["License Delivery"]},"delete":{"operationId":"LicenseDeliveryController_removeProductImage","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Quita la imagen subida del producto.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/products/{productId}/keys":{"post":{"operationId":"LicenseDeliveryController_addKeys","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddLicenseKeysDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Carga llaves al pool del producto (normaliza y omite duplicadas).","tags":["License Delivery"]},"get":{"operationId":"LicenseDeliveryController_listKeys","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"$ref":"#/components/schemas/Object"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista las llaves del pool (filtrable por estado).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/products/{productId}/keys/{keyId}":{"delete":{"operationId":"LicenseDeliveryController_deleteKey","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}},{"name":"keyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Borra una llave libre del pool (no las entregadas).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/products/{productId}/checkout":{"post":{"operationId":"LicenseDeliveryController_checkout","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCheckoutDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea una orden y dispara el cobro Nequi push (Wompi).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/renewal-template":{"get":{"operationId":"LicenseDeliveryController_renewalTemplate","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Estado del aviso de renovación: si hay plantilla elegida, si Meta la aprobó, y el borrador sugerido.","tags":["License Delivery"]},"post":{"operationId":"LicenseDeliveryController_createRenewalTemplate","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRenewalTemplateDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea la plantilla del aviso contra Meta (queda en revisión) y la deja elegida.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/expirations":{"get":{"operationId":"LicenseDeliveryController_listExpirations","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"days","required":true,"in":"query","schema":{"type":"string"}},{"name":"includeExpired","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Licencias vendidas que vencen pronto (o ya vencieron), para poder avisar al cliente a tiempo.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/orders/{orderId}/expiration":{"patch":{"operationId":"LicenseDeliveryController_setOrderExpiration","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetOrderExpirationDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Fija o quita a mano la fecha de vencimiento de una venta (para las anteriores a la vigencia).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/orders":{"get":{"operationId":"LicenseDeliveryController_listOrders","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"$ref":"#/components/schemas/Object"}},{"name":"limit","required":false,"in":"query","description":"Máximo de filas (el service lo capa a 500).","schema":{"minimum":1,"maximum":500,"type":"number"}},{"name":"contactId","required":false,"in":"query","description":"Filtra las ventas de un contacto (para el panel del inbox: \"ventas de este número\").","schema":{"format":"uuid","type":"string"}},{"name":"conversationId","required":false,"in":"query","description":"Filtra las ventas originadas en una conversación.","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Historial de ventas (órdenes) con el producto.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/orders/{orderId}":{"get":{"operationId":"LicenseDeliveryController_getOrder","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Estado de una orden de compra.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/orders/{orderId}/resend":{"post":{"operationId":"LicenseDeliveryController_resendOrder","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Reenvía la licencia de una orden ya entregada (WhatsApp + correo).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/orders/{orderId}/keys/{keyId}/replace":{"post":{"operationId":"LicenseDeliveryController_replaceKey","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}},{"name":"keyId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplaceLicenseKeyDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Reemplaza una llave entregada que no le funcionó al cliente: revoca la vieja (la conserva enlazada), entrega una nueva y opcionalmente notifica. Emite el webhook license.key_replaced.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/orders/{orderId}/cancel":{"post":{"operationId":"LicenseDeliveryController_cancelOrder","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Cancela una orden pendiente de pago (libera las llaves).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/inbox/test":{"post":{"operationId":"LicenseDeliveryController_probarBandeja","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Prueba la conexión a la bandeja y muestra lo que lee.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/buzones":{"get":{"operationId":"LicenseDeliveryController_listarBuzones","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Correos donde llegan los avisos de pago, con las llaves que avisan a cada uno y su estado de lectura.","tags":["License Delivery"]},"post":{"operationId":"LicenseDeliveryController_crearBuzon","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuzonDeAvisosDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Agrega un correo de avisos de pago.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/buzones/{buzonId}":{"patch":{"operationId":"LicenseDeliveryController_actualizarBuzon","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"buzonId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuzonDeAvisosDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Edita un correo de avisos o sus llaves.","tags":["License Delivery"]},"delete":{"operationId":"LicenseDeliveryController_eliminarBuzon","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"buzonId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Borra un correo de avisos. Sus llaves dejan de confirmarse solas.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/buzones/{buzonId}/probar":{"post":{"operationId":"LicenseDeliveryController_probarBuzon","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"buzonId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Prueba la conexión a un correo de avisos y muestra lo último que lee, sin guardar nada.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/inbox/payments":{"get":{"operationId":"LicenseDeliveryController_listarPagos","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Pagos leídos del correo, con los pedidos que les encajan.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/inbox/payments/{pagoId}/match":{"post":{"operationId":"LicenseDeliveryController_conciliarPago","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"pagoId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConciliarPagoDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Liga un pago con un pedido y entrega la licencia.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/inbox/payments/{pagoId}/match-cobro":{"post":{"operationId":"LicenseDeliveryController_conciliarPagoConCobro","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"pagoId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConciliarCobroDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Liga un pago con un cobro agrupado y salda todos sus pedidos.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/cobros-agrupados/pendientes":{"get":{"operationId":"LicenseDeliveryController_pedidosPorCobrar","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"contactId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Pedidos que un cliente debe (fiados y esperando pago) y su cobro agrupado abierto, si tiene.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/cobros-agrupados":{"get":{"operationId":"LicenseDeliveryController_listarCobros","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"contactId","required":true,"in":"query","schema":{"type":"string"}},{"name":"status","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cobros agrupados de la organización o de un cliente.","tags":["License Delivery"]},"post":{"operationId":"LicenseDeliveryController_crearCobro","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrearCobroAgrupadoDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Arma un cobro agrupado (varios pedidos, un solo pago) y se lo envía al cliente por WhatsApp.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/cobros-libres":{"post":{"operationId":"LicenseDeliveryController_crearCobroLibre","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrearCobroLibreDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Cobro libre: un concepto y un monto, sin producto, a la llave de la marca del número. Se confirma solo con el aviso del banco.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/cobros-libres/facturas-mosend":{"get":{"operationId":"LicenseDeliveryController_facturasMosend","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"contactId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Facturas de Mosend que el cliente del chat puede pagar por llave (solo la organización que opera Mosend, con la identidad del cliente verificada).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/perfiles-de-cobro":{"get":{"operationId":"LicenseDeliveryController_listarPerfiles","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Marcas que cobran en la organización, con sus números, su llave y sus medios.","tags":["License Delivery"]},"post":{"operationId":"LicenseDeliveryController_crearPerfil","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PerfilDeCobroDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea una marca. La primera crea también la principal, que se queda con la configuración de antes.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/perfiles-de-cobro/{perfilId}":{"patch":{"operationId":"LicenseDeliveryController_actualizarPerfil","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"perfilId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PerfilDeCobroDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Edita una marca: nombre, llave, números, medios.","tags":["License Delivery"]},"delete":{"operationId":"LicenseDeliveryController_eliminarPerfil","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"perfilId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina una marca. Sus números y cuentas pasan a la principal.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/perfiles-de-cobro/resumen":{"get":{"operationId":"LicenseDeliveryController_resumenPorMarca","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"dias","required":false,"in":"query","schema":{"minimum":1,"maximum":366,"type":"number"}},{"name":"desde","required":false,"in":"query","schema":{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"}},{"name":"hasta","required":false,"in":"query","schema":{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Ingresos por marca en un periodo: cobrado, pedidos, cobros libres y pagos sin pedido.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/cobros-agrupados/{cobroId}/reenviar":{"post":{"operationId":"LicenseDeliveryController_reenviarCobro","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"cobroId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Vuelve a enviar el cobro al cliente.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/cobros-agrupados/{cobroId}/anular":{"post":{"operationId":"LicenseDeliveryController_anularCobro","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"cobroId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnularCobroAgrupadoDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Anula el cobro: sus pedidos quedan otra vez por cobrar.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/cobros-agrupados/{cobroId}/marcar-pagado":{"post":{"operationId":"LicenseDeliveryController_marcarCobroPagado","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"cobroId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Da el cobro por pagado (llegó por otra vía) y salda sus pedidos.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/inbox/payments/{pagoId}/reassign-options":{"get":{"operationId":"LicenseDeliveryController_opcionesDeReasignacion","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"pagoId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Pedidos a los que se puede mover un pago ya conciliado (mismo valor, en su ventana, sin pago propio).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/inbox/payments/{pagoId}/reassign":{"post":{"operationId":"LicenseDeliveryController_reasignarPago","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"pagoId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReasignarPagoDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Mueve un pago ya conciliado a otro pedido. El pedido que lo pierde queda con el cobro pendiente.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/inbox/payments/{pagoId}/ignore":{"post":{"operationId":"LicenseDeliveryController_ignorarPago","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"pagoId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IgnorarPagoDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Descarta un pago (no era de una venta).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/orders/{orderId}/cambiar-medio":{"post":{"operationId":"LicenseDeliveryController_cambiarMedio","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CambiarMedioDelPedidoDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Cambia la cuenta o llave de un pedido que espera transferencia, o lo pasa a pago con tarjeta (mismo pedido y valor); opcionalmente le manda al cliente los datos nuevos o el enlace de pago.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/orders/{orderId}/confirm-transfer":{"post":{"operationId":"LicenseDeliveryController_confirmTransfer","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmarPagoManualDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Confirma la transferencia recibida y entrega la licencia.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/orders/{orderId}/completar-entrega":{"post":{"operationId":"LicenseDeliveryController_completarEntrega","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompletarEntregaDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Marca ENTREGADA una orden pagada (entrega asistida): el asesor ya la completó en la conversación. Con `llaves` registra las que entregó a mano (una por línea de la venta) y las envía con la plantilla e instrucciones del producto; sin ellas basta el `mensaje` libre. `notificar: false` la registra sin escribirle al cliente.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/orders/{orderId}/refund":{"post":{"operationId":"LicenseDeliveryController_refundOrder","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefundOrderDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Registra el reembolso de una orden pagada y revoca sus llaves (el dinero se devuelve en el panel Wompi).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/products/{productId}/keys/{keyId}/revoke":{"post":{"operationId":"LicenseDeliveryController_revokeKey","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}},{"name":"keyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Revoca una llave ya entregada (fraude/contracargo).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/conversations/{conversationId}/sell":{"post":{"operationId":"LicenseDeliveryController_sellToConversation","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"conversationId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SellToConversationDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Vende/entrega una licencia al contacto de la conversación (asesor).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/conversations/{conversationId}/sell-cart":{"post":{"operationId":"LicenseDeliveryController_sellCartToConversation","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"conversationId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SellCartToConversationDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Vende un CARRITO (varios productos, una sola orden) al contacto (asesor). Solo Nequi o Bre-B.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/conversations/{conversationId}/dispatch":{"post":{"operationId":"LicenseDeliveryController_dispatchManually","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"conversationId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DispatchDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Entrega una licencia SIN cobro al contacto de la conversación (asesor).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/conversations/{conversationId}/venta-manual":{"post":{"operationId":"LicenseDeliveryController_registrarVentaManual","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"conversationId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistrarVentaManualDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Registra una venta MANUAL con pago y entrega desacoplados (fiado / por cobrar).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/conversations/{conversationId}/venta-manual-carrito":{"post":{"operationId":"LicenseDeliveryController_registrarVentaManualCarrito","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"conversationId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VentaManualCarritoDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Registra una venta MANUAL de un CARRITO (varios productos) con pago y entrega desacoplados (fiado / por cobrar).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/orders/{orderId}/marcar-pagada":{"post":{"operationId":"LicenseDeliveryController_marcarPagada","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmarPagoManualDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Marca una venta manual como PAGADA (cierra el fiado).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/orders/{orderId}/marcar-entregada":{"post":{"operationId":"LicenseDeliveryController_marcarEntregada","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Marca una venta manual como ENTREGADA (asigna/envía la licencia ahora).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/products/{productId}/variants":{"post":{"operationId":"LicenseDeliveryController_createVariant","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVariantDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea una variante del producto (precio propio).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/products/{productId}/variants/{variantId}":{"patch":{"operationId":"LicenseDeliveryController_updateVariant","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}},{"name":"variantId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateVariantDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza una variante.","tags":["License Delivery"]},"delete":{"operationId":"LicenseDeliveryController_deleteVariant","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}},{"name":"variantId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina una variante sin ventas (sus llaves libres vuelven al pool general).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/orders/{orderId}/otp":{"post":{"operationId":"LicenseDeliveryController_submitOtp","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitOtpDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Valida el OTP de una orden Daviplata.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/orders/{orderId}/otp/resend":{"post":{"operationId":"LicenseDeliveryController_resendOtp","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Reenvía el OTP de una orden Daviplata.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/payments-inbox":{"get":{"operationId":"LicenseDeliveryController_bandejaDePagos","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"origen","required":true,"in":"query","schema":{"type":"string"}},{"name":"estado","required":true,"in":"query","schema":{"type":"string"}},{"name":"desde","required":true,"in":"query","schema":{"type":"string"}},{"name":"hasta","required":true,"in":"query","schema":{"type":"string"}},{"name":"q","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"offset","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Todo lo que dice que entró plata: avisos del banco y comprobantes del chat, en una lista.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/payments-inbox/discard":{"post":{"operationId":"LicenseDeliveryController_descartarPagos","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DescartarEnMasaDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Descarta varios de una vez (ignora avisos, rechaza comprobantes). Aprobar sigue siendo de a uno.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/transfer-accounts":{"get":{"operationId":"LicenseDeliveryController_listTransferAccounts","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cuentas a las que el cliente puede transferir (bancos, llaves).","tags":["License Delivery"]},"post":{"operationId":"LicenseDeliveryController_createTransferAccount","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuentaDeTransferenciaDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Agrega una cuenta de transferencia.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/transfer-accounts/{accountId}":{"patch":{"operationId":"LicenseDeliveryController_updateTransferAccount","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"accountId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditarCuentaDeTransferenciaDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Edita una cuenta de transferencia.","tags":["License Delivery"]},"delete":{"operationId":"LicenseDeliveryController_deleteTransferAccount","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"accountId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina una cuenta de transferencia.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/transfer-accounts/reorder":{"post":{"operationId":"LicenseDeliveryController_reorderTransferAccounts","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReordenarCuentasDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Reordena las cuentas: es el orden en que las ve el cliente.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/transfer-keys":{"get":{"operationId":"LicenseDeliveryController_listTransferKeys","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Llaves de cobro (Bre-B / Nequi / Bancolombia). Una sola activa: la de las ventas nuevas.","tags":["License Delivery"]},"post":{"operationId":"LicenseDeliveryController_createTransferKey","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlaveDeCobroDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Agrega una llave de cobro. La primera nace activa.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/transfer-keys/{keyId}":{"patch":{"operationId":"LicenseDeliveryController_updateTransferKey","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"keyId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditarLlaveDeCobroDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Edita una llave de cobro.","tags":["License Delivery"]},"delete":{"operationId":"LicenseDeliveryController_deleteTransferKey","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"keyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina una llave. No la activa ni una con pedidos esperando pago.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/transfer-keys/{keyId}/activate":{"post":{"operationId":"LicenseDeliveryController_activateTransferKey","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"keyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Deja activa esta llave y apaga la anterior. Los pedidos pendientes de la anterior se siguen conciliando.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/transfer-keys/{keyId}/qr":{"post":{"operationId":"LicenseDeliveryController_subirQrDeLlaveDeCobro","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"keyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Sube el QR de una llave (PNG/JPG/WebP).","tags":["License Delivery"]},"delete":{"operationId":"LicenseDeliveryController_quitarQrDeLlaveDeCobro","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"keyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Quita el QR de una llave.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/receipts":{"get":{"operationId":"LicenseDeliveryController_listPendingReceipts","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Comprobantes de pago pendientes de revisar.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/orders/{orderId}/receipts":{"get":{"operationId":"LicenseDeliveryController_listOrderReceipts","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Comprobantes enviados para un pedido.","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/receipts/{receiptId}/approve":{"post":{"operationId":"LicenseDeliveryController_approveReceipt","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"receiptId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisarComprobanteDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Aprueba el comprobante y confirma el pago (entrega la licencia).","tags":["License Delivery"]}},"/organizations/{orgId}/license-delivery/receipts/{receiptId}/reject":{"post":{"operationId":"LicenseDeliveryController_rejectReceipt","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"receiptId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RechazarComprobanteDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Rechaza el comprobante con un motivo.","tags":["License Delivery"]}},"/license-delivery/img/{productId}":{"get":{"operationId":"LicenseDeliveryPublicController_productImage","parameters":[{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Sirve la imagen del producto (stream público).","tags":["License Delivery"]}},"/webhooks/wompi":{"post":{"operationId":"WompiController_webhook","parameters":[],"responses":{"200":{"description":""}},"summary":"Webhook de Wompi: valida firma y reconcilia el pago.","tags":["License Delivery"]}},"/webhooks/wompi/{orgId}":{"post":{"operationId":"WompiController_webhookForOrg","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Webhook de Wompi por organización (URL propia de cada tenant).","tags":["License Delivery"]}},"/ai-credits/public-policy":{"get":{"operationId":"AiCreditsController_publicPolicy","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Política pública del crédito de IA (crédito de bienvenida y packs) para el sitio de marketing.","tags":["Créditos de IA"]}},"/organizations/{orgId}/ai-credits/summary":{"get":{"operationId":"AiCreditsController_summary","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Saldo del AI Power Pack + breakdown de uso 30d + packs de recarga.","tags":["Créditos de IA"]}},"/organizations/{orgId}/ai-credits/transactions":{"get":{"operationId":"AiCreditsController_transactions","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Historial de transacciones del wallet (depósitos y débitos).","tags":["Créditos de IA"]}},"/admin/ai-credit-policy":{"get":{"operationId":"AiCreditsController_getPolicy","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lee la policy global del AI Power Pack (staff).","tags":["Créditos de IA"]},"patch":{"operationId":"AiCreditsController_updatePolicy","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePolicyDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza la policy global (signup credit, daily limit, packs, etc.). Solo staff.","tags":["Créditos de IA"]}},"/admin/organizations/{orgId}/ai-credits/adjust":{"post":{"operationId":"AiCreditsController_adjust","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdjustBalanceDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Ajuste manual del balance de una org (bonus, refund, corrección). Solo staff.","tags":["Créditos de IA"]}},"/organizations/{orgId}/templates":{"get":{"operationId":"TemplatesController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"wabaId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista las plantillas de la organización, opcionalmente filtradas por WABA.","tags":["Plantillas"]},"post":{"operationId":"TemplatesController_create","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTemplateDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea una plantilla y la envía a Meta para aprobación.","tags":["Plantillas"]}},"/organizations/{orgId}/templates/{id}":{"get":{"operationId":"TemplatesController_getOne","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Obtiene el detalle de una plantilla por su id.","tags":["Plantillas"]},"patch":{"description":"Meta solo permite editar plantillas aprobadas o rechazadas; name/language/category no son editables. Cuotas de Meta: 1 edición/24h, máximo 10/mes por plantilla.","operationId":"TemplatesController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTemplateDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Edita una plantilla en Meta. Solo se permiten APPROVED o REJECTED, y solo los `components`.","tags":["Plantillas"]},"delete":{"operationId":"TemplatesController_remove","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Borra una plantilla — primero en Meta y luego en la BD local.","tags":["Plantillas"]}},"/organizations/{orgId}/templates/{id}/copiar":{"post":{"description":"En Meta cada plantilla es de una cuenta y solo sus números la pueden enviar. La copia se manda a aprobación (queda PENDING). No se copian las de autenticación, carrusel ni oferta por tiempo limitado.","operationId":"TemplatesController_copiar","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CopiarPlantillaDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea la misma plantilla en otra cuenta de WhatsApp (WABA).","tags":["Plantillas"]}},"/organizations/{orgId}/templates/sync":{"post":{"operationId":"TemplatesController_sync","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Sincroniza plantillas desde Meta para todos los WABA de la organización","tags":["Plantillas"]}},"/organizations/{orgId}/templates/{id}/header-media":{"post":{"operationId":"TemplatesController_setHeaderMedia","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cambia la cabecera predeterminada (imagen, video o PDF) de la plantilla: la que se usa cuando un envío no trae su archivo.","tags":["Plantillas"]},"delete":{"operationId":"TemplatesController_clearHeaderMedia","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Quita la cabecera predeterminada: cada envío tendrá que traer su archivo.","tags":["Plantillas"]}},"/organizations/{orgId}/templates/upload-header-media":{"post":{"operationId":"TemplatesController_uploadHeaderMedia","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Sube imagen/video/PDF para usar como Header de plantilla. Devuelve header_handle.","tags":["Plantillas"]}},"/public/precios/{slug}/meta":{"get":{"operationId":"PublicPriceListController_meta","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Datos del cascarón de la página (título).","tags":["Lista de precios pública"]}},"/public/precios/{slug}/request-code":{"post":{"operationId":"PublicPriceListController_requestCode","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestCodeDto"}}}},"responses":{"201":{"description":""}},"summary":"El cliente pide un código a su WhatsApp. Solo se envía a contactos o números habilitados; el resto recibe needsAccess.","tags":["Lista de precios pública"]}},"/public/precios/{slug}/verify":{"post":{"operationId":"PublicPriceListController_verify","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyCodeDto"}}}},"responses":{"201":{"description":""}},"summary":"Verifica el código y devuelve el token de sesión.","tags":["Lista de precios pública"]}},"/public/precios/{slug}/list":{"get":{"operationId":"PublicPriceListController_list","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Lista de precios personalizada por el segmento del cliente.","tags":["Lista de precios pública"]}},"/organizations/{orgId}/public-price-list":{"get":{"operationId":"PublicPriceListAdminController_getConfig","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Config de la lista de precios pública de la org.","tags":["Lista de precios pública (admin)"]},"put":{"operationId":"PublicPriceListAdminController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePublicPriceListDto"}}}},"responses":{"200":{"description":""}},"summary":"Crea/actualiza la config (slug, título, activo, emisor, plantilla…).","tags":["Lista de precios pública (admin)"]}},"/organizations/{orgId}/public-price-list/access-requests":{"get":{"operationId":"PublicPriceListAdminController_accessRequests","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Bitácora de accesos: quién intentó entrar, con fecha/hora.","tags":["Lista de precios pública (admin)"]}},"/organizations/{orgId}/public-price-list/allowed-numbers":{"get":{"operationId":"PublicPriceListAdminController_allowed","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Números habilitados a mano (no contactos).","tags":["Lista de precios pública (admin)"]},"post":{"operationId":"PublicPriceListAdminController_enable","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnableNumberDto"}}}},"responses":{"201":{"description":""}},"summary":"Habilita un número para ver la lista de precios.","tags":["Lista de precios pública (admin)"]}},"/organizations/{orgId}/public-price-list/allowed-numbers/{waId}":{"delete":{"operationId":"PublicPriceListAdminController_disable","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"waId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Quita un número habilitado.","tags":["Lista de precios pública (admin)"]}},"/organizations/{orgId}/conectores/aprobaciones":{"get":{"operationId":"ConectoresController_listarAprobaciones","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Solicitudes de acciones sensibles esperando aprobación de una persona.","tags":["Conectores"]}},"/organizations/{orgId}/conectores/aprobaciones/{accionId}/aprobar":{"post":{"operationId":"ConectoresController_aprobar","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"accionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Aprueba y EJECUTA una acción sensible; el cliente recibe aviso en su chat.","tags":["Conectores"]}},"/organizations/{orgId}/conectores/aprobaciones/{accionId}/rechazar":{"post":{"operationId":"ConectoresController_rechazar","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"accionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Rechaza una acción sensible; el cliente recibe aviso y espera a un asesor.","tags":["Conectores"]}},"/organizations/{orgId}/conectores/catalogo":{"get":{"operationId":"ConectoresController_catalogo","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Catálogo cerrado de acciones por tipo de conector, con su nivel de riesgo.","tags":["Conectores"]}},"/organizations/{orgId}/conectores":{"get":{"operationId":"ConectoresController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los conectores de la organización.","tags":["Conectores"]},"post":{"operationId":"ConectoresController_create","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConectorDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea un conector (credenciales cifradas).","tags":["Conectores"]}},"/organizations/{orgId}/conectores/{conectorId}":{"patch":{"operationId":"ConectoresController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"conectorId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateConectorDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza un conector.","tags":["Conectores"]},"delete":{"operationId":"ConectoresController_remove","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"conectorId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina un conector y sus credenciales.","tags":["Conectores"]}},"/organizations/{orgId}/conectores/{conectorId}/probar":{"post":{"operationId":"ConectoresController_probar","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"conectorId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Prueba la conexión con una llamada de lectura inocua.","tags":["Conectores"]}},"/organizations/{orgId}/conectores/{conectorId}/ejecutar":{"post":{"operationId":"ConectoresController_ejecutar","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"conectorId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EjecutarAccionDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Ejecuta una acción de LECTURA del catálogo (fase 1: solo lectura).","tags":["Conectores"]}},"/organizations/{orgId}/sales/entitlement":{"get":{"operationId":"SalesController_getEntitlement","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Entitlement del módulo de Ventas y de la Facturación electrónica (plan vs add-on).","tags":["Sales"]}},"/organizations/{orgId}/sales/addons":{"put":{"operationId":"SalesController_setAddons","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetSalesAddonsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Activa/desactiva Ventas y/o Facturación electrónica como add-on de tarifa fija (billing:write).","tags":["Sales"]}},"/organizations/{orgId}/sales/products":{"get":{"operationId":"SalesController_listProducts","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"q","required":false,"in":"query","description":"Filtra por texto (nombre o SKU).","schema":{"maxLength":160,"type":"string"}},{"name":"active","required":false,"in":"query","description":"'true' = solo activos, 'false' = solo inactivos, ausente = todos.","schema":{"pattern":"^(true|false)$","type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Catálogo de productos de Ventas.","tags":["Sales"]},"post":{"operationId":"SalesController_createProduct","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSalesProductDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea un producto (sales:write).","tags":["Sales"]}},"/organizations/{orgId}/sales/products/{productId}":{"get":{"operationId":"SalesController_getProduct","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Un producto del catálogo.","tags":["Sales"]},"patch":{"operationId":"SalesController_updateProduct","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSalesProductDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Edita un producto (sales:write).","tags":["Sales"]},"delete":{"operationId":"SalesController_deleteProduct","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina un producto (sales:write).","tags":["Sales"]}},"/organizations/{orgId}/sales/orders":{"post":{"operationId":"SalesController_createOrder","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSalesOrderDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea un pedido/venta (sales:write).","tags":["Sales"]},"get":{"operationId":"SalesController_listOrders","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"$ref":"#/components/schemas/Object"}},{"name":"contactId","required":false,"in":"query","schema":{"format":"uuid","type":"string"}},{"name":"conversationId","required":false,"in":"query","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista pedidos (filtro por estado/contacto/conversación).","tags":["Sales"]}},"/organizations/{orgId}/sales/orders/{orderId}":{"get":{"operationId":"SalesController_getOrder","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Un pedido con sus líneas.","tags":["Sales"]},"delete":{"operationId":"SalesController_deleteOrder","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina un pedido en borrador/cancelado (sales:write).","tags":["Sales"]}},"/organizations/{orgId}/sales/orders/{orderId}/status":{"patch":{"operationId":"SalesController_updateOrderStatus","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSalesOrderStatusDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cambia el estado de un pedido (sales:write).","tags":["Sales"]}},"/organizations/{orgId}/sales/billing-profiles":{"get":{"operationId":"SalesController_listBillingProfiles","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"contactId","required":false,"in":"query","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Perfiles de facturación (opcional: por contacto).","tags":["Sales"]},"post":{"operationId":"SalesController_createBillingProfile","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBillingProfileDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea un perfil de facturación (sales:write).","tags":["Sales"]}},"/organizations/{orgId}/sales/billing-profiles/{profileId}":{"get":{"operationId":"SalesController_getBillingProfile","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"profileId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Un perfil de facturación.","tags":["Sales"]},"patch":{"operationId":"SalesController_updateBillingProfile","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"profileId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBillingProfileDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Edita un perfil de facturación (sales:write).","tags":["Sales"]},"delete":{"operationId":"SalesController_deleteBillingProfile","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"profileId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina un perfil de facturación (sales:write).","tags":["Sales"]}},"/organizations/{orgId}/sales/einvoicing/config":{"get":{"operationId":"SalesController_getEinvoicingConfig","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"configId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Config del conector de facturación (sin el token).","tags":["Sales"]},"put":{"operationId":"SalesController_updateEinvoicingConfig","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEInvoicingConfigDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Configura el conector de facturación (sales:config).","tags":["Sales"]}},"/organizations/{orgId}/sales/einvoicing/companies":{"get":{"operationId":"SalesController_listEinvoicingCompanies","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Empresas emisoras de la org (la predeterminada primero).","tags":["Sales"]}},"/organizations/{orgId}/sales/einvoicing/companies/{configId}":{"delete":{"operationId":"SalesController_deleteEinvoicingCompany","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"configId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina una empresa emisora sin documentos (sales:config).","tags":["Sales"]}},"/organizations/{orgId}/sales/einvoicing/validate":{"post":{"operationId":"SalesController_validateEinvoicing","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateEInvoicingDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Valida el token y trae la numeración vigente (sales:config).","tags":["Sales"]}},"/organizations/{orgId}/sales/einvoicing/customers/import":{"post":{"operationId":"SalesController_importDiaxpiCustomers","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"configId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Importa los clientes de Diaxpi como perfiles de facturación (sales:write).","tags":["Sales"]}},"/organizations/{orgId}/sales/einvoicing/customer-lookup":{"get":{"operationId":"SalesController_lookupCustomer","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"doc","required":true,"in":"query","schema":{"type":"string"}},{"name":"docType","required":true,"in":"query","schema":{"type":"string"}},{"name":"configId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Busca un cliente por documento (registrados en Diaxpi) para autocompletar (sales:read).","tags":["Sales"]}},"/organizations/{orgId}/sales/einvoicing/invoices":{"get":{"operationId":"SalesController_listInvoices","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":false,"in":"query","schema":{"format":"uuid","type":"string"}},{"name":"contactId","required":false,"in":"query","description":"Documentos de los pedidos de UN contacto (panel del inbox). Sin esto el\n panel tenía que traerse los 200 últimos de toda la org y los pedidos\n antiguos del contacto se quedaban sin su estado fiscal.","schema":{"format":"uuid","type":"string"}},{"name":"status","required":false,"in":"query","schema":{"$ref":"#/components/schemas/Object"}},{"name":"docType","required":false,"in":"query","schema":{"$ref":"#/components/schemas/Object"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Facturas/notas crédito (filtro por pedido, estado, tipo).","tags":["Sales"]},"post":{"operationId":"SalesController_generateInvoice","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateInvoiceDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Genera la factura electrónica de un pedido (opcional, sales:write).","tags":["Sales"]}},"/organizations/{orgId}/sales/einvoicing/credit-notes":{"post":{"operationId":"SalesController_createCreditNote","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCreditNoteDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Emite una NOTA CRÉDITO total que anula una factura emitida (sales:write).","tags":["Sales"]}},"/organizations/{orgId}/sales/einvoicing/license-orders/invoice":{"post":{"operationId":"SalesController_invoiceLicenseOrder","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceLicenseOrderDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Factura una venta de licencias que el cliente pidió con factura (sales:write).","tags":["Sales"]}},"/organizations/{orgId}/sales/einvoicing/license-orders/draft":{"post":{"operationId":"SalesController_createLicenseInvoiceDraft","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLicenseInvoiceDraftDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea (o reutiliza) el pedido espejo BORRADOR de una venta de licencia, sin emitir. Para revisar y facturar luego desde Ventas → Pedidos (sales:write).","tags":["Sales"]}},"/organizations/{orgId}/sales/einvoicing/invoices/{invoiceId}/send":{"post":{"operationId":"SalesController_sendInvoice","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"invoiceId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Envía la factura/nota al cliente por WhatsApp, en su misma conversación (messages:send).","tags":["Sales"]}},"/organizations/{orgId}/sales/einvoicing/invoices/{invoiceId}/pdf":{"get":{"operationId":"SalesController_getInvoicePdf","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"invoiceId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Descarga el PDF de una factura/nota emitida (base64, sales:read).","tags":["Sales"]}},"/sales/invoice-pdf/{token}":{"get":{"operationId":"SalesPublicController_invoicePdf","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Sirve el PDF de una factura por token (público).","tags":["Sales"]}},"/organizations/{orgId}/signup-links":{"get":{"operationId":"WhatsAppSignupsController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"wabaId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los enlaces de suscripción (opt-in) de la organización, con sus deep links wa.me por número.","tags":["Enlaces de suscripción (In-App Signup)"]},"post":{"operationId":"WhatsAppSignupsController_create","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSignupLinkDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea un enlace de suscripción con opt-in verificado por Meta (In-App Signup).","tags":["Enlaces de suscripción (In-App Signup)"]}},"/organizations/{orgId}/signup-links/{id}":{"get":{"operationId":"WhatsAppSignupsController_getOne","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle de un enlace de suscripción; reconcilia el estado en vivo con Meta.","tags":["Enlaces de suscripción (In-App Signup)"]},"patch":{"operationId":"WhatsAppSignupsController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSignupLinkDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza mensajes/promo o activa/desactiva (status ACTIVE|DISABLED). privacyPolicyUrl es inmutable.","tags":["Enlaces de suscripción (In-App Signup)"]}},"/organizations/{orgId}/link-pages":{"get":{"operationId":"LinkPagesController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista las páginas de enlaces (bio) de la organización.","tags":["Páginas de enlaces"]},"post":{"operationId":"LinkPagesController_create","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkPageDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea una página de enlaces.","tags":["Páginas de enlaces"]}},"/organizations/{orgId}/link-pages/archived":{"get":{"operationId":"LinkPagesController_listArchived","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista las páginas archivadas (para restaurar).","tags":["Páginas de enlaces"]}},"/organizations/{orgId}/link-pages/{id}":{"get":{"operationId":"LinkPagesController_getOne","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle de una página de enlaces con sus items.","tags":["Páginas de enlaces"]},"patch":{"operationId":"LinkPagesController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkPageDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza perfil/tema/publicación de una página.","tags":["Páginas de enlaces"]},"delete":{"operationId":"LinkPagesController_archive","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Toggle archivado de la página (soft-delete reversible).","tags":["Páginas de enlaces"]}},"/organizations/{orgId}/link-pages/{id}/restore":{"post":{"operationId":"LinkPagesController_restore","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Restaura una página archivada (la republica).","tags":["Páginas de enlaces"]}},"/organizations/{orgId}/link-pages/{id}/cover":{"post":{"operationId":"LinkPagesController_cover","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Sube la portada de la página (PNG/JPG/WebP, máx 8 MB).","tags":["Páginas de enlaces"]}},"/organizations/{orgId}/link-pages/{id}/avatar":{"post":{"operationId":"LinkPagesController_avatar","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Sube la foto de perfil de la página (PNG/JPG/WebP, máx 8 MB).","tags":["Páginas de enlaces"]}},"/organizations/{orgId}/link-pages/{id}/items":{"post":{"operationId":"LinkPagesController_addItem","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateItemDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Agrega un enlace a la página.","tags":["Páginas de enlaces"]}},"/organizations/{orgId}/link-pages/{id}/items/reorder":{"patch":{"operationId":"LinkPagesController_reorder","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderItemsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Reordena los enlaces de la página.","tags":["Páginas de enlaces"]}},"/organizations/{orgId}/link-pages/{id}/items/{itemId}":{"patch":{"operationId":"LinkPagesController_updateItem","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"itemId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateItemDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza un enlace de la página.","tags":["Páginas de enlaces"]},"delete":{"operationId":"LinkPagesController_deleteItem","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"itemId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina un enlace de la página.","tags":["Páginas de enlaces"]}},"/link-pages/p/{handle}":{"get":{"operationId":"LinkPagesController_publicProfile","parameters":[{"name":"handle","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Perfil público de una página publicada (JSON para SSR).","tags":["Páginas de enlaces"]}},"/link-pages/p/{handle}/cover":{"get":{"operationId":"LinkPagesController_publicCover","parameters":[{"name":"handle","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Sirve la portada de la página (stream público).","tags":["Páginas de enlaces"]}},"/link-pages/p/{handle}/avatar":{"get":{"operationId":"LinkPagesController_publicAvatar","parameters":[{"name":"handle","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Sirve el avatar de la página (stream público).","tags":["Páginas de enlaces"]}},"/link-pages/p/{handle}/go/{itemId}":{"get":{"operationId":"LinkPagesController_go","parameters":[{"name":"handle","required":true,"in":"path","schema":{"type":"string"}},{"name":"itemId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Registra el click del enlace y redirige (302) al destino.","tags":["Páginas de enlaces"]}},"/organizations/{orgId}/phone-numbers/{phoneId}/profile":{"get":{"operationId":"ProfilesController_get","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Obtiene el perfil de negocio del número.","tags":["Perfiles de empresa"]},"put":{"operationId":"ProfilesController_upsert","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertProfileDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea o actualiza el perfil de negocio del número.","tags":["Perfiles de empresa"]}},"/organizations/{orgId}/phone-numbers/{phoneId}/profile/picture":{"post":{"operationId":"ProfilesController_uploadPicture","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Sube una foto de perfil (JPG/PNG, máx. 5 MB) y la aplica al número en Meta.","tags":["Perfiles de empresa"]}},"/organizations/{orgId}/contacts/{contactId}/notes":{"get":{"operationId":"NotesController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista las notas internas del contacto (pinned primero).","tags":["Notas de contacto"]},"post":{"operationId":"NotesController_create","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateNoteDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea una nota interna en el contacto.","tags":["Notas de contacto"]}},"/organizations/{orgId}/contacts/{contactId}/notes/{noteId}":{"patch":{"operationId":"NotesController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}},{"name":"noteId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateNoteDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Edita el cuerpo o el pin de una nota.","tags":["Notas de contacto"]},"delete":{"operationId":"NotesController_remove","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}},{"name":"noteId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina la nota.","tags":["Notas de contacto"]}},"/organizations/{orgId}/tasks":{"get":{"operationId":"TasksController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"scope","required":true,"in":"query","schema":{"type":"string"}},{"name":"status","required":true,"in":"query","schema":{"type":"string"}},{"name":"contactId","required":true,"in":"query","schema":{"type":"string"}},{"name":"conversationId","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista de tareas de la org con filtros.","tags":["Tareas"]},"post":{"operationId":"TasksController_create","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTaskDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea una nueva tarea/follow-up.","tags":["Tareas"]}},"/organizations/{orgId}/tasks/counts":{"get":{"operationId":"TasksController_counts","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Conteos rápidos de tareas asignadas al usuario actual.","tags":["Tareas"]}},"/organizations/{orgId}/contacts/{contactId}/tasks":{"get":{"operationId":"TasksController_listForContact","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Tareas de un contacto específico.","tags":["Tareas"]}},"/organizations/{orgId}/tasks/{taskId}":{"patch":{"operationId":"TasksController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"taskId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTaskDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Edita campos de la tarea (título, descripción, fecha, asignado).","tags":["Tareas"]},"delete":{"operationId":"TasksController_remove","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"taskId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina la tarea.","tags":["Tareas"]}},"/organizations/{orgId}/tasks/{taskId}/complete":{"patch":{"operationId":"TasksController_complete","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"taskId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteTaskDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Marca una tarea como completa o la reabre.","tags":["Tareas"]}},"/organizations/{orgId}/tasks/{taskId}/claim":{"patch":{"operationId":"TasksController_claim","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"taskId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Toma una tarea de la cola del equipo (assignedToUserId=null) y la asigna al usuario actual.","tags":["Tareas"]}},"/organizations/{orgId}/tags":{"get":{"operationId":"TagsController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista las etiquetas de la organización.","tags":["Etiquetas"]},"post":{"operationId":"TagsController_create","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTagDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea una etiqueta (nombre y color opcional).","tags":["Etiquetas"]}},"/organizations/{orgId}/tags/{id}":{"patch":{"operationId":"TagsController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTagDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Edita el nombre y/o color de una etiqueta.","tags":["Etiquetas"]},"delete":{"operationId":"TagsController_remove","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina una etiqueta.","tags":["Etiquetas"]}},"/organizations/{orgId}/contacts/{contactId}/opt-ins":{"get":{"operationId":"OptInsController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista el historial de opt-ins/opt-outs de un contacto.","tags":["Consentimientos (opt-in)"]},"post":{"operationId":"OptInsController_record","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordOptInDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Registra un opt-in o opt-out de un contacto.","tags":["Consentimientos (opt-in)"]}},"/organizations/{orgId}/stickers":{"get":{"operationId":"StickersController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Stickers"]}},"/organizations/{orgId}/stickers/upload":{"post":{"operationId":"StickersController_upload","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["Stickers"]}},"/organizations/{orgId}/stickers/from-message/{messageId}":{"post":{"operationId":"StickersController_stealFromMessage","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"messageId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["Stickers"]}},"/organizations/{orgId}/stickers/{id}/send":{"post":{"operationId":"StickersController_send","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendStickerDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["Stickers"]}},"/organizations/{orgId}/stickers/{id}":{"delete":{"operationId":"StickersController_remove","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Stickers"]}},"/webhooks/meta":{"get":{"operationId":"WebhooksInboundController_verify","parameters":[{"name":"hub.mode","required":true,"in":"query","schema":{"type":"string"}},{"name":"hub.verify_token","required":true,"in":"query","schema":{"type":"string"}},{"name":"hub.challenge","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Webhooks (Meta)"]},"post":{"operationId":"WebhooksInboundController_receive","parameters":[],"responses":{"200":{"description":""}},"summary":"Webhook entrante de Meta. Validación HMAC X-Hub-Signature-256.","tags":["Webhooks (Meta)"]}},"/organizations/{orgId}/bot/images":{"get":{"operationId":"BotImagesController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Imágenes que el bot puede enviar.","tags":["Bot"]},"post":{"operationId":"BotImagesController_upload","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/UploadBotImageDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Sube una imagen a la librería del bot.","tags":["Bot"]}},"/organizations/{orgId}/bot/images/{id}":{"patch":{"operationId":"BotImagesController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBotImageDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Renombra la imagen o cambia su pie de foto.","tags":["Bot"]},"delete":{"operationId":"BotImagesController_remove","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"forzar","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Quita la imagen de la librería. El archivo queda en el almacenamiento porque los mensajes ya enviados lo referencian.","tags":["Bot"]}},"/organizations/{orgId}/bot/auto-replies":{"get":{"operationId":"AutoRepliesController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneNumberId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista las respuestas automáticas del bot (filtrable por número).","tags":["Bot · Respuestas automáticas"]},"post":{"operationId":"AutoRepliesController_create","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAutoReplyDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea una respuesta automática del bot.","tags":["Bot · Respuestas automáticas"]}},"/organizations/{orgId}/bot/auto-replies/{id}":{"patch":{"operationId":"AutoRepliesController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAutoReplyDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza una respuesta automática del bot.","tags":["Bot · Respuestas automáticas"]},"delete":{"operationId":"AutoRepliesController_remove","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina una respuesta automática del bot.","tags":["Bot · Respuestas automáticas"]}},"/organizations/{orgId}/bot/servicios":{"get":{"operationId":"ServiciosDelBotController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Catálogo de servicios que el bot puede citar.","tags":["Bot"]},"post":{"operationId":"ServiciosDelBotController_create","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServicioDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Agrega un servicio al catálogo del bot.","tags":["Bot"]}},"/organizations/{orgId}/bot/servicios/{id}":{"patch":{"operationId":"ServiciosDelBotController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServicioDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Edita un servicio del catálogo.","tags":["Bot"]},"delete":{"operationId":"ServiciosDelBotController_remove","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Quita un servicio del catálogo.","tags":["Bot"]}},"/organizations/{orgId}/store-connections":{"get":{"operationId":"EcommerceController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Lista las conexiones de tienda de la organización.","tags":["Integraciones · Tiendas"]},"post":{"operationId":"EcommerceController_create","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStoreConnectionDto"}}}},"responses":{"201":{"description":""}},"summary":"Crea una conexión de tienda (devuelve el ingestSecret una sola vez).","tags":["Integraciones · Tiendas"]}},"/organizations/{orgId}/store-connections/{id}":{"patch":{"operationId":"EcommerceController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStoreConnectionDto"}}}},"responses":{"200":{"description":""}},"summary":"Actualiza una conexión de tienda.","tags":["Integraciones · Tiendas"]},"delete":{"operationId":"EcommerceController_remove","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Elimina una conexión de tienda.","tags":["Integraciones · Tiendas"]}},"/organizations/{orgId}/store-connections/{id}/rotate-secret":{"post":{"operationId":"EcommerceController_rotate","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Rota el ingestSecret de la conexión.","tags":["Integraciones · Tiendas"]}},"/organizations/{orgId}/store-connections/{id}/mappings":{"get":{"operationId":"EcommerceController_mappings","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Lista los mapeos evento→plantilla de la conexión.","tags":["Integraciones · Tiendas"]},"post":{"operationId":"EcommerceController_upsertMapping","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertMappingDto"}}}},"responses":{"201":{"description":""}},"summary":"Crea o actualiza el mapeo de un evento.","tags":["Integraciones · Tiendas"]}},"/organizations/{orgId}/store-connections/{id}/events":{"get":{"operationId":"EcommerceController_events","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Log de eventos recibidos de la tienda (estado y motivo).","tags":["Integraciones · Tiendas"]}},"/integrations/ecommerce/{connectionId}/events":{"post":{"operationId":"EcommerceIngestController_ingest","parameters":[{"name":"connectionId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestEventDto"}}}},"responses":{"201":{"description":""}},"summary":"Ingesta de un evento de tienda (firmado con HMAC del ingestSecret).","tags":["Integraciones · Tiendas (ingesta)"]}},"/integrations/ecommerce/{connectionId}/catalogo":{"post":{"operationId":"EcommerceIngestController_sincronizarCatalogo","parameters":[{"name":"connectionId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SincronizarCatalogoDto"}}}},"responses":{"201":{"description":""}},"summary":"Vuelca el catálogo de productos de la tienda al catálogo del bot (firmado con HMAC).","tags":["Integraciones · Tiendas (ingesta)"]}},"/organizations/{orgId}/store-templates/catalog":{"get":{"operationId":"StoreTemplatesController_catalog","parameters":[],"responses":{"200":{"description":""}},"summary":"Catálogo de plantillas de e-commerce listas para instalar.","tags":["Integraciones · Plantillas de tienda"]}},"/organizations/{orgId}/store-templates/variables":{"get":{"operationId":"StoreTemplatesController_variables","parameters":[],"responses":{"200":{"description":""}},"summary":"Variables disponibles para el editor de plantillas (qué dato de la tienda saca cada una).","tags":["Integraciones · Plantillas de tienda"]}},"/organizations/{orgId}/store-templates/status":{"get":{"operationId":"StoreTemplatesController_status","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"wabaId","required":true,"in":"query","schema":{"type":"string"}},{"name":"connectionId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Estado de instalación/aprobación de cada plantilla del catálogo para una WABA.","tags":["Integraciones · Plantillas de tienda"]}},"/organizations/{orgId}/store-templates/install":{"post":{"operationId":"StoreTemplatesController_install","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallStoreTemplateDto"}}}},"responses":{"201":{"description":""}},"summary":"Crea una plantilla del catálogo en Meta (y opcionalmente el mapeo).","tags":["Integraciones · Plantillas de tienda"]}},"/organizations/{orgId}/messages/{messageId}/reactions":{"put":{"operationId":"ReactionsController_set","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"messageId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetReactionDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Reacciones"]},"delete":{"operationId":"ReactionsController_remove","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"messageId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Reacciones"]}},"/organizations/{orgId}/web-chat/channels":{"get":{"operationId":"WebChatController_listChannels","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Lista los canales de web chat de la org.","tags":["WebChat"]},"post":{"operationId":"WebChatController_createChannel","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateChannelDto"}}}},"responses":{"201":{"description":""}},"summary":"Crea un canal de web chat.","tags":["WebChat"]}},"/organizations/{orgId}/web-chat/channels/{id}":{"patch":{"operationId":"WebChatController_updateChannel","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateChannelDto"}}}},"responses":{"200":{"description":""}},"summary":"Actualiza un canal de web chat.","tags":["WebChat"]},"delete":{"operationId":"WebChatController_deleteChannel","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Elimina un canal de web chat.","tags":["WebChat"]}},"/organizations/{orgId}/web-chat/channels/{id}/avatar":{"post":{"operationId":"WebChatController_uploadAvatar","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Sube la foto de perfil del canal (PNG/JPG/WebP, máx 8 MB).","tags":["WebChat"]},"delete":{"operationId":"WebChatController_deleteAvatar","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Quita la foto de perfil del canal.","tags":["WebChat"]}},"/organizations/{orgId}/web-chat/channels/{id}/snippet":{"get":{"operationId":"WebChatController_getSnippet","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Devuelve el snippet de instalación del widget para el canal.","tags":["WebChat"]}},"/organizations/{orgId}/web-chat/channels/{id}/identity-secret":{"post":{"operationId":"WebChatController_rotateIdentitySecret","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Genera o rota el secreto HMAC de identidad (se muestra una sola vez).","tags":["WebChat"]},"delete":{"operationId":"WebChatController_clearIdentitySecret","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Revoca el secreto HMAC de identidad del canal.","tags":["WebChat"]}},"/organizations/{orgId}/conversations/{convId}/web-chat/send":{"post":{"operationId":"WebChatController_sendMessage","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"convId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebChatSendMessageDto"}}}},"responses":{"201":{"description":""}},"summary":"Envía un mensaje del agente a una conversación de web chat.","tags":["WebChat"]}},"/organizations/{orgId}/conversations/{convId}/web-chat/media":{"post":{"operationId":"WebChatController_uploadWebChatMedia","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"convId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Sube un archivo a S3 para web chat y devuelve su mediaAssetId.","tags":["WebChat"]}},"/web-chat/{token}/sessions":{"post":{"operationId":"WebChatPublicController_createSession","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSessionDto"}}}},"responses":{"201":{"description":""}},"summary":"Público (widget): crea sesión del visitante (anónima, identificada o verify-OTP).","tags":["WebChatPublic"]}},"/web-chat/{token}/sessions/resend-otp":{"post":{"operationId":"WebChatPublicController_resendOtp","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendOtpDto"}}}},"responses":{"201":{"description":""}},"summary":"Público (widget): reenvía el código OTP de verificación por email.","tags":["WebChatPublic"]}},"/web-chat/{token}/presence":{"post":{"operationId":"WebChatPublicController_presence","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Público (widget): presencia del visitante (sendBeacon).","tags":["WebChatPublic"]}},"/web-chat/{token}/push/vapid":{"get":{"operationId":"WebChatPublicController_getVapidKey","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Público: clave VAPID pública para Web Push.","tags":["WebChatPublic"]}},"/web-chat/{token}/push/subscribe":{"post":{"operationId":"WebChatPublicController_pushSubscribe","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Público (widget): registra la suscripción Web Push del visitante.","tags":["WebChatPublic"]}},"/web-chat/{token}/push/unsubscribe":{"post":{"operationId":"WebChatPublicController_pushUnsubscribe","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Público (widget): elimina la suscripción Web Push.","tags":["WebChatPublic"]}},"/web-chat/{token}/history":{"get":{"operationId":"WebChatPublicController_getHistory","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}},{"name":"before","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Público (widget): historial reciente del visitante (requiere visitor JWT).","tags":["WebChatPublic"]}},"/web-chat/{token}/sessions/link-email":{"post":{"operationId":"WebChatPublicController_linkEmail","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkEmailDto"}}}},"responses":{"201":{"description":""}},"summary":"Público (widget): vincula un email al visitante (requiere visitor JWT).","tags":["WebChatPublic"]}},"/web-chat/{token}/client-error":{"post":{"operationId":"WebChatPublicController_clientError","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Público (widget): reporta un error de runtime del widget.","tags":["WebChatPublic"]}},"/web-chat/{token}/upload":{"post":{"operationId":"WebChatPublicController_upload","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Público (widget): sube un adjunto y devuelve su mediaAssetId (requiere visitor JWT).","tags":["WebChatPublic"]}},"/web-chat/{token}/messages":{"post":{"operationId":"WebChatPublicController_sendMessage","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Público (widget): envía un mensaje con adjunto del visitante (requiere visitor JWT).","tags":["WebChatPublic"]}},"/organizations/{orgId}/webhooks-outbound":{"get":{"operationId":"WebhooksOutboundController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los webhooks salientes de la organización (sin el secret).","tags":["Webhooks (salientes)"]},"post":{"operationId":"WebhooksOutboundController_create","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOutboundDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea un webhook saliente suscrito a eventos.","tags":["Webhooks (salientes)"]}},"/organizations/{orgId}/webhooks-outbound/{id}":{"patch":{"operationId":"WebhooksOutboundController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOutboundDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza un webhook saliente (URL, eventos, formato, estado).","tags":["Webhooks (salientes)"]},"delete":{"operationId":"WebhooksOutboundController_remove","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina un webhook saliente.","tags":["Webhooks (salientes)"]}},"/organizations/{orgId}/webhooks-outbound/{id}/test":{"post":{"operationId":"WebhooksOutboundController_sendTest","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Envía un evento de prueba (webhook.test) al webhook para verificar que su endpoint lo recibe.","tags":["Webhooks (salientes)"]}},"/organizations/{orgId}/webhooks-outbound/{id}/deliveries":{"get":{"operationId":"WebhooksOutboundController_deliveries","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista el historial de entregas de un webhook saliente.","tags":["Webhooks (salientes)"]}},"/organizations/{orgId}/webhooks-outbound/{id}/secret":{"get":{"operationId":"WebhooksOutboundController_getSecret","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Revela el secret de firma del webhook (no aparece en el listado).","tags":["Webhooks (salientes)"]}},"/pricing":{"get":{"operationId":"PricingController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista las tarifas de mensajería vigentes.","tags":["Precios"]}},"/organizations/{orgId}/usage/daily":{"get":{"operationId":"UsageController_daily","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"metric","required":true,"in":"query","schema":{"type":"string"}},{"name":"since","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Devuelve el consumo diario por métrica desde una fecha.","tags":["Uso"]}},"/organizations/{orgId}/billing/periods":{"get":{"operationId":"BillingController_periods","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los periodos de facturación de la organización.","tags":["Facturación"]}},"/organizations/{orgId}/billing/usage":{"get":{"operationId":"BillingController_usage","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Devuelve el consumo del periodo de facturación en curso.","tags":["Facturación"]}},"/organizations/{orgId}/billing/estimated-next-charge":{"get":{"operationId":"BillingController_estimatedNextCharge","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Estima cuánto pagaría la organización si se cerrara hoy el periodo abierto. NO persiste.","tags":["Facturación"]}},"/organizations/{orgId}/billing/coupons/validate":{"post":{"operationId":"BillingController_validateCoupon","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemCouponDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Valida un cupón sin consumirlo (previsualización del descuento).","tags":["Facturación"]}},"/organizations/{orgId}/billing/coupons/redeem":{"post":{"operationId":"BillingController_redeemCoupon","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemCouponDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Valida y redime un cupón a nombre de la organización.","tags":["Facturación"]}},"/organizations/{orgId}/billing/interval":{"patch":{"operationId":"BillingController_setInterval","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetIntervalDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cambia el intervalo de facturación (mensual/anual). Aplica al próximo cierre; anual cobra el año desde esta fecha.","tags":["Facturación"]}},"/organizations/{orgId}/invoices":{"get":{"operationId":"InvoicesController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista las facturas de la organización.","tags":["Facturas"]}},"/organizations/{orgId}/invoices/{id}":{"get":{"operationId":"InvoicesController_getOne","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Obtiene el detalle de una factura por su ID.","tags":["Facturas"]}},"/organizations/{orgId}/invoices/{id}/pdf":{"get":{"operationId":"InvoicesController_getPdfUrl","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Genera (si falta) el PDF de la factura y devuelve URL de descarga firmada.","tags":["Facturas"]}},"/admin/credit-notes":{"post":{"operationId":"CreditNotesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCreditNoteRequestDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Emite una nota crédito a favor de una organización. Solo se debería emitir cuando hubo un error nuestro.","tags":["Notas crédito (admin)"]},"get":{"operationId":"CreditNotesController_list","parameters":[{"name":"orgId","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista notas crédito (filtro opcional por organización).","tags":["Notas crédito (admin)"]}},"/admin/credit-notes/{id}":{"get":{"operationId":"CreditNotesController_getOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle de una nota crédito.","tags":["Notas crédito (admin)"]}},"/admin/credit-notes/{id}/void":{"post":{"operationId":"CreditNotesController_voidNote","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Anula una nota crédito (revierte el crédito al wallet si fue aplicada).","tags":["Notas crédito (admin)"]}},"/admin/credit-notes/{id}/pdf":{"get":{"operationId":"CreditNotesController_getPdf","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Genera (si falta) el PDF de la nota crédito y devuelve URL firmada para descarga.","tags":["Notas crédito (admin)"]}},"/admin/credit-notes/{id}/regenerate-pdf":{"post":{"operationId":"CreditNotesController_regeneratePdf","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Regenera el PDF de una nota crédito (tras tweaks de layout).","tags":["Notas crédito (admin)"]}},"/organizations/{orgId}/wallet":{"get":{"operationId":"WalletController_balance","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Devuelve el saldo actual de la billetera de la organización.","tags":["Billetera"]}},"/organizations/{orgId}/wallet/transactions":{"get":{"operationId":"WalletController_transactions","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"cursor","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los movimientos de la billetera (paginado por cursor).","tags":["Billetera"]}},"/organizations/{orgId}/wallet/recharge":{"post":{"operationId":"MercadoPagoController_createRecharge","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRechargeDto"}}}},"responses":{"201":{"description":""}},"summary":"Crea preference de recarga de saldo. Devuelve URL de checkout.","tags":["Pagos (Mercado Pago)"]}},"/webhooks/mercado-pago":{"post":{"operationId":"MercadoPagoController_webhook","parameters":[],"responses":{"200":{"description":""}},"summary":"Webhook IPN de Mercado Pago. Valida firma y procesa pagos.","tags":["Pagos (Mercado Pago)"]}},"/organizations/{orgId}/billing/invoices/{invoiceId}/pay":{"post":{"operationId":"MercadoPagoController_createInvoicePayment","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"invoiceId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Crea preference MP para pagar una factura. Devuelve URL de checkout.","tags":["Pagos (Mercado Pago)"]}},"/organizations/{orgId}/billing/payment-methods":{"get":{"operationId":"PaymentMethodsController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista las tarjetas guardadas de la organización (sin exponer tokens MP).","tags":["Pagos (Tarjetas guardadas)"]},"post":{"operationId":"PaymentMethodsController_add","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddCardDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Guarda una tarjeta nueva tokenizando el `token` que viene del frontend.","tags":["Pagos (Tarjetas guardadas)"]}},"/organizations/{orgId}/billing/payment-methods/{id}":{"delete":{"operationId":"PaymentMethodsController_remove","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Borra una tarjeta de MP y de la BD.","tags":["Pagos (Tarjetas guardadas)"]}},"/organizations/{orgId}/billing/payment-methods/{id}/default":{"post":{"operationId":"PaymentMethodsController_setDefault","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Marca una tarjeta como default; las otras quedan en isDefault=false.","tags":["Pagos (Tarjetas guardadas)"]}},"/organizations/{orgId}/billing/preferences":{"get":{"operationId":"PaymentMethodsController_preferences","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Estado actual de cobro automático (autoPayEnabled + autoPayMethodId).","tags":["Pagos (Tarjetas guardadas)"]}},"/organizations/{orgId}/billing/auto-pay":{"patch":{"operationId":"PaymentMethodsController_setAutoPay","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetAutoPayDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Activa o desactiva el cobro automático mensual.","tags":["Pagos (Tarjetas guardadas)"]}},"/organizations/{orgId}/billing/payment-reports/breb-info":{"get":{"operationId":"PaymentReportsController_brebInfo","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Llave Bre-B / QR de cobro de Mosend (para el modal de pago).","tags":["Billing — Pagos Bre-B/QR"]}},"/organizations/{orgId}/billing/payment-reports":{"post":{"operationId":"PaymentReportsController_create","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CreatePaymentReportDto"}}}},"responses":{"201":{"description":""}},"summary":"Reporta un pago Bre-B/QR: comprobante (campo `receipt`) + monto, contra una factura o como recarga de saldo.","tags":["Billing — Pagos Bre-B/QR"]},"get":{"operationId":"PaymentReportsController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Comprobantes reportados por la organización.","tags":["Billing — Pagos Bre-B/QR"]}},"/organizations/{orgId}/billing/payment-reports/{id}/receipt":{"get":{"operationId":"PaymentReportsController_receipt","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Signed URL del comprobante propio.","tags":["Billing — Pagos Bre-B/QR"]}},"/organizations/{orgId}/billing/nequi/enabled":{"get":{"operationId":"NequiPaymentsController_enabled","parameters":[],"responses":{"200":{"description":""}},"summary":"¿Está habilitado el pago con Nequi?","tags":["Billing — Nequi"]}},"/organizations/{orgId}/billing/nequi/push":{"post":{"operationId":"NequiPaymentsController_createPush","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateNequiPushDto"}}}},"responses":{"201":{"description":""}},"summary":"Inicia un pago push: Nequi envía la solicitud a la app del celular indicado.","tags":["Billing — Nequi"]}},"/organizations/{orgId}/billing/nequi/qr":{"post":{"operationId":"NequiPaymentsController_createQr","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateNequiQrDto"}}}},"responses":{"201":{"description":""}},"summary":"Genera un QR dinámico de Nequi para el monto.","tags":["Billing — Nequi"]}},"/organizations/{orgId}/billing/nequi/{paymentId}/status":{"get":{"operationId":"NequiPaymentsController_status","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"paymentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Estado del pago (hace un check en vivo contra Nequi si sigue pendiente).","tags":["Billing — Nequi"]}},"/organizations/{orgId}/billing/nequi/{paymentId}/cancel":{"post":{"operationId":"NequiPaymentsController_cancel","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"paymentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Cancela un pago pendiente (cierre del modal).","tags":["Billing — Nequi"]}},"/organizations/{orgId}/billing/alert-settings":{"get":{"operationId":"WalletAlertsController_get","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Devuelve configuración actual de alertas de saldo bajo y auto-recarga.","tags":["Facturación (Alertas de saldo)"]},"patch":{"operationId":"WalletAlertsController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAlertSettingsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza configuración de alertas de saldo bajo y auto-recarga.","tags":["Facturación (Alertas de saldo)"]}},"/organizations/{orgId}/integrations":{"get":{"operationId":"IntegrationsController_overview","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Vista resumida: API keys + webhooks outbound configurados","tags":["Integraciones"]}},"/organizations/{orgId}/integrations/catalog":{"get":{"operationId":"IntegrationsController_catalog","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Catálogo de integraciones disponibles + flag de instalación per-org. Frontend lo usa para renderizar la lista en Settings → Integraciones.","tags":["Integraciones"]}},"/organizations/{orgId}/integrations/catalog/{integrationId}":{"get":{"operationId":"IntegrationsController_getInstallation","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"integrationId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle de una instalación específica (sin config descifrada).","tags":["Integraciones"]},"patch":{"operationId":"IntegrationsController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"integrationId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateInstallationDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza config o toggle enabled de una instalación.","tags":["Integraciones"]},"delete":{"operationId":"IntegrationsController_uninstall","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"integrationId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Desinstala la integración (borra fila + config cifrada).","tags":["Integraciones"]}},"/organizations/{orgId}/integrations/install":{"post":{"operationId":"IntegrationsController_install","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallIntegrationDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Instala una integración del catálogo en la organización.","tags":["Integraciones"]}},"/organizations/{orgId}/reports/summary":{"get":{"operationId":"ReportsController_summary","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Resumen general del dashboard de la organización.","tags":["Reportes"]}},"/organizations/{orgId}/reports/portada":{"get":{"operationId":"ReportsController_portadaDelPanel","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"dias","required":false,"in":"query","schema":{"minimum":1,"maximum":366,"type":"number"}},{"name":"desde","required":false,"in":"query","schema":{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"}},{"name":"hasta","required":false,"in":"query","schema":{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Portada del panel: qué espera ahora y cómo va la atención por día, con totales del período y del anterior.","tags":["Reportes"]}},"/organizations/{orgId}/reports/ventas":{"get":{"operationId":"ReportsController_reporteDeVentas","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"desde","required":false,"in":"query","description":"Primer día (YYYY-MM-DD, en la zona horaria de la organización).","schema":{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"}},{"name":"hasta","required":false,"in":"query","description":"Último día, incluido.","schema":{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"}},{"name":"agrupar","required":false,"in":"query","schema":{"$ref":"#/components/schemas/Object"}},{"name":"moneda","required":false,"in":"query","schema":{"pattern":"^[A-Z]{3}$","type":"string"}},{"name":"perfilId","required":false,"in":"query","schema":{"format":"uuid","type":"string"}},{"name":"phoneNumberId","required":false,"in":"query","schema":{"format":"uuid","type":"string"}},{"name":"agentId","required":false,"in":"query","schema":{"format":"uuid","type":"string"}},{"name":"userId","required":false,"in":"query","schema":{"format":"uuid","type":"string"}},{"name":"productId","required":false,"in":"query","schema":{"format":"uuid","type":"string"}},{"name":"anuncioId","required":false,"in":"query","description":"Solo las ventas que llegaron por este anuncio (id de Anuncios).","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Reporte de ventas de licencias: ingresos por día/semana/mes contra el período anterior, por medio de pago, por agente del bot y por asesor (vendió y cerró), productos, marcas, canales, anuncios de Click-to-WhatsApp (cada venta al último anuncio por el que llegó el cliente, dentro de 30 días), tiempos, horas pico, clientes nuevos y lo pendiente. Solo propietarios y administradores.","tags":["Reportes"]}},"/organizations/{orgId}/reports/channels-summary":{"get":{"operationId":"ReportsController_channelsSummary","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Señal unificada de canales conectados (WhatsApp, Instagram, Web Chat) para onboarding y empty-states.","tags":["Reportes"]}},"/organizations/{orgId}/reports/messaging":{"get":{"operationId":"ReportsController_messaging","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"since","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Métricas de mensajería agregadas desde una fecha.","tags":["Reportes"]}},"/organizations/{orgId}/reports/billing":{"get":{"operationId":"ReportsController_billing","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Resumen de facturación y consumo de la organización.","tags":["Reportes"]}},"/organizations/{orgId}/reports/customers":{"get":{"operationId":"ReportsController_customers","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"since","required":true,"in":"query","schema":{"type":"string"}},{"name":"until","required":true,"in":"query","schema":{"type":"string"}},{"name":"category","required":true,"in":"query","schema":{"type":"string"}},{"name":"resolutionOutcome","required":true,"in":"query","schema":{"type":"string"}},{"name":"q","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"cursor","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista contactos con métricas agregadas de conversaciones (paginado).","tags":["Reportes"]}},"/organizations/{orgId}/reports/customers/{contactId}":{"get":{"operationId":"ReportsController_customer","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle de un contacto con métricas históricas y timeline.","tags":["Reportes"]}},"/organizations/{orgId}/reports/team/weekly":{"get":{"operationId":"ReportsController_teamWeekly","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"weeks","required":true,"in":"query","schema":{"type":"string"}},{"name":"compare","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Métricas semanales del equipo (default últimas 12 semanas).","tags":["Reportes"]}},"/organizations/{orgId}/reports/team/series":{"get":{"operationId":"ReportsController_teamSeries","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"from","required":true,"in":"query","schema":{"type":"string"}},{"name":"to","required":true,"in":"query","schema":{"type":"string"}},{"name":"granularity","required":true,"in":"query","schema":{"type":"string"}},{"name":"compare","required":true,"in":"query","schema":{"type":"string"}},{"name":"channel","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Serie del equipo por día/semana/mes en un rango, con comparación, canal/etiqueta y SLA.","tags":["Reportes"]}},"/organizations/{orgId}/reports/team/by-agent":{"get":{"operationId":"ReportsController_teamByAgent","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"since","required":true,"in":"query","schema":{"type":"string"}},{"name":"until","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Métricas por agente para un período (default últimas 4 semanas).","tags":["Reportes"]}},"/organizations/{orgId}/reports/team/goals":{"get":{"operationId":"ReportsController_getTeamGoals","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Metas semanales del equipo (volúmenes y tasas).","tags":["Reportes"]},"patch":{"operationId":"ReportsController_updateTeamGoals","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTeamGoalsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza metas semanales del equipo (parcial).","tags":["Reportes"]}},"/public/leads":{"post":{"operationId":"LeadsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLeadDto"}}}},"responses":{"201":{"description":""}},"summary":"Sink público para el formulario de contacto de la landing.","tags":["Prospectos"]}},"/admin/stats":{"get":{"operationId":"AdminController_stats","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Métricas globales del sistema.","tags":["Administración (staff Mosend)"]}},"/admin/metrics/timeseries":{"get":{"operationId":"AdminController_metricsTimeseries","parameters":[{"name":"metric","required":true,"in":"query","schema":{"type":"string"}},{"name":"days","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Serie diaria global de un métrica de uso (para gráficas).","tags":["Administración (staff Mosend)"]}},"/admin/metrics/usage":{"get":{"operationId":"AdminController_metricsUsage","parameters":[{"name":"days","required":true,"in":"query","schema":{"type":"string"}},{"name":"desde","required":true,"in":"query","schema":{"type":"string"}},{"name":"hasta","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Todas las métricas de uso fusionadas por día (para gráficas).","tags":["Administración (staff Mosend)"]}},"/admin/metrics/messages":{"get":{"operationId":"AdminController_metricsMessages","parameters":[{"name":"days","required":true,"in":"query","schema":{"type":"string"}},{"name":"desde","required":true,"in":"query","schema":{"type":"string"}},{"name":"hasta","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Mensajes por día y estado (enviados/entregados/leídos/fallidos).","tags":["Administración (staff Mosend)"]}},"/admin/metrics/database":{"get":{"operationId":"AdminController_metricsDatabase","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Internos de Postgres: tamaño de tablas/índices, tamaño de la DB, conexiones vs max, cache-hit y query activa más larga.","tags":["Administración (staff Mosend)"]}},"/admin/alerts/config":{"get":{"operationId":"AdminController_alertsConfig","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Configuración de alertas de plataforma (Teams).","tags":["Administración (staff Mosend)"]},"patch":{"operationId":"AdminController_alertsUpdate","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza la configuración de alertas.","tags":["Administración (staff Mosend)"]}},"/admin/alerts/test":{"post":{"operationId":"AdminController_alertsTest","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Envía una alerta de prueba al Teams configurado.","tags":["Administración (staff Mosend)"]}},"/admin/alerts/log":{"get":{"operationId":"AdminController_alertsLog","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Historial de alertas disparadas.","tags":["Administración (staff Mosend)"]},"delete":{"operationId":"AdminController_alertsClear","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Limpia el historial de alertas (no toca config ni cooldowns).","tags":["Administración (staff Mosend)"]}},"/admin/errors/messages":{"get":{"operationId":"AdminController_errorsMessages","parameters":[{"name":"days","required":true,"in":"query","schema":{"type":"string"}},{"name":"code","required":true,"in":"query","schema":{"type":"string"}},{"name":"cursor","required":true,"in":"query","schema":{"type":"string"}},{"name":"desde","required":true,"in":"query","schema":{"type":"string"}},{"name":"hasta","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Mensajes fallidos con código de error de Meta, org, número y motivo.","tags":["Administración (staff Mosend)"]}},"/admin/errors/webhooks":{"get":{"operationId":"AdminController_errorsWebhooks","parameters":[{"name":"days","required":true,"in":"query","schema":{"type":"string"}},{"name":"desde","required":true,"in":"query","schema":{"type":"string"}},{"name":"hasta","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Fallos de webhooks entrantes y salientes.","tags":["Administración (staff Mosend)"]}},"/admin/platform-config":{"get":{"operationId":"AdminController_getPlatformConfig","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Flags de presentación del sitio (landing).","tags":["Administración (staff Mosend)"]},"patch":{"operationId":"AdminController_updatePlatformConfig","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza flags de presentación del sitio.","tags":["Administración (staff Mosend)"]}},"/admin/metrics/system":{"get":{"operationId":"AdminController_metricsSystem","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Recursos en vivo: proceso API y worker, DB, Redis, colas.","tags":["Administración (staff Mosend)"]}},"/admin/queues/{name}/failed":{"get":{"operationId":"AdminController_queueFailed","parameters":[{"name":"name","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Jobs fallidos de una cola (drill-down de Salud).","tags":["Administración (staff Mosend)"]}},"/admin/queues/{name}/retry":{"post":{"operationId":"AdminController_queueRetry","parameters":[{"name":"name","required":true,"in":"path","schema":{"type":"string"}},{"name":"jobId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Reintenta jobs fallidos de una cola (uno con ?jobId o todos).","tags":["Administración (staff Mosend)"]}},"/admin/queues/{name}/clear":{"post":{"operationId":"AdminController_queueClear","parameters":[{"name":"name","required":true,"in":"path","schema":{"type":"string"}},{"name":"jobId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Descarta jobs fallidos de una cola (uno con ?jobId o todos).","tags":["Administración (staff Mosend)"]}},"/admin/metrics/system/history":{"get":{"operationId":"AdminController_metricsSystemHistory","parameters":[{"name":"hours","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Histórico de recursos (snapshots) para graficar en el tiempo.","tags":["Administración (staff Mosend)"]}},"/admin/health":{"get":{"operationId":"AdminController_health","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Estado operacional vivo: queues, sockets, errores, recursos.","tags":["Administración (staff Mosend)"]}},"/admin/organizations":{"get":{"operationId":"AdminController_listOrgs","parameters":[{"name":"q","required":true,"in":"query","schema":{"type":"string"}},{"name":"status","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Listar todas las organizaciones del sistema. Soporta búsqueda y filtros.","tags":["Administración (staff Mosend)"]},"post":{"operationId":"AdminController_createOrganization","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminCreateOrganizationDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea una organización + la cuenta del cliente dueño (staff).","tags":["Administración (staff Mosend)"]}},"/admin/organizations/{id}":{"get":{"operationId":"AdminController_getOrgDetail","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle completo de una organización (miembros, WABAs, números, uso, auditoría).","tags":["Administración (staff Mosend)"]}},"/admin/organizations/{id}/suspend":{"patch":{"operationId":"AdminController_suspend","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSuspendOrgDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Administración (staff Mosend)"]}},"/admin/organizations/{id}/reactivate":{"patch":{"operationId":"AdminController_reactivate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Administración (staff Mosend)"]}},"/admin/organizations/{id}/plan/preview":{"post":{"operationId":"AdminController_previewPlanChange","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Calcula prorrateo y violations de un cambio de plan sin persistir.","tags":["Administración (staff Mosend)"]}},"/admin/organizations/{id}/plan":{"patch":{"operationId":"AdminController_assignPlan","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Asigna o cambia el plan de una organización.","tags":["Administración (staff Mosend)"]}},"/admin/organizations/{id}/addons":{"get":{"operationId":"AdminController_getOrgAddons","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Add-ons contratados por una organización.","tags":["Administración (staff Mosend)"]},"patch":{"operationId":"AdminController_setOrgAddon","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSetAddonDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Override de staff de los add-ons de una organización (cortesía/soporte, sin cargo al wallet).","tags":["Administración (staff Mosend)"]}},"/admin/organizations/{id}/name":{"patch":{"operationId":"AdminController_renameOrganization","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminRenameOrganizationDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Renombra una organización desde la consola de staff (no toca el slug).","tags":["Administración (staff Mosend)"]}},"/admin/users/{id}/email":{"patch":{"operationId":"AdminController_setUserEmail","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSetUserEmailDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cambia el correo de acceso de un usuario (staff). Verifica que no esté en uso.","tags":["Administración (staff Mosend)"]}},"/admin/billing/saldos-fuera-de-usd":{"get":{"operationId":"AdminController_listarSaldosFueraDeUsd","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Saldos que quedaron en otra moneda y su equivalente en dólares. Solo consulta.","tags":["Administración (staff Mosend)"]}},"/admin/billing/saldos-fuera-de-usd/convertir":{"post":{"operationId":"AdminController_convertirSaldosAUsd","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Convierte a dólares los saldos que quedaron en otra moneda, con la tasa vigente.","tags":["Administración (staff Mosend)"]}},"/admin/organizations/{id}/currency":{"patch":{"operationId":"AdminController_setOrgCurrency","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSetOrgCurrencyDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cambia la moneda en la que se factura a una organización (no toca el saldo, que va en USD).","tags":["Administración (staff Mosend)"]}},"/admin/organizations/{id}/transfer-ownership":{"post":{"operationId":"AdminController_transferOrgOwnership","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTransferOwnershipDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Traspasa la propiedad de una organización a otro miembro (solo superadmin).","tags":["Administración (staff Mosend)"]}},"/admin/organizations/{id}/extra-organizations":{"patch":{"operationId":"AdminController_setOrgExtraOrganizations","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSetExtraOrganizationsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Override de staff del cupo de organizaciones extra de una org (cortesía/soporte, sin cargo al wallet).","tags":["Administración (staff Mosend)"]}},"/admin/pricing-rules":{"get":{"operationId":"AdminController_listRules","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Administración (staff Mosend)"]},"post":{"operationId":"AdminController_createRule","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePricingRuleDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["Administración (staff Mosend)"]}},"/admin/pricing-rules/{id}":{"delete":{"operationId":"AdminController_deleteRule","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Administración (staff Mosend)"]},"patch":{"operationId":"AdminController_updateRule","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePricingRuleDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Administración (staff Mosend)"]}},"/admin/billing/overview":{"get":{"operationId":"AdminController_billingOverview","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"KPIs globales del sistema de facturación: MRR, ARR, dunning, etc.","tags":["Administración (staff Mosend)"]}},"/admin/billing/invoices":{"get":{"operationId":"AdminController_listInvoices","parameters":[{"name":"status","required":true,"in":"query","schema":{"type":"string"}},{"name":"orgId","required":true,"in":"query","schema":{"type":"string"}},{"name":"from","required":true,"in":"query","schema":{"type":"string"}},{"name":"to","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Listado global de facturas con filtros.","tags":["Administración (staff Mosend)"]}},"/admin/billing/payments":{"get":{"operationId":"AdminController_listPayments","parameters":[{"name":"method","required":true,"in":"query","schema":{"type":"string"}},{"name":"status","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Listado global de pagos.","tags":["Administración (staff Mosend)"]}},"/admin/billing/payments/{id}/nequi-recheck":{"post":{"operationId":"AdminController_recheckNequi","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Re-consulta el estado de un pago Nequi pendiente y aplica la transición si ya se pagó.","tags":["Administración (staff Mosend)"]}},"/admin/billing/payments/{id}/refund":{"post":{"operationId":"AdminController_refundPayment","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Devuelve/cancela un pago. destination: \"method\" (devuelve al método — Nequi reversa), \"wallet\" (deja a favor como saldo) o \"none\" (solo anula el registro). PENDING siempre cancela.","tags":["Administración (staff Mosend)"]}},"/admin/billing/wallets":{"get":{"operationId":"AdminController_listWallets","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Saldos por organización ordenados por balance.","tags":["Administración (staff Mosend)"]}},"/admin/billing/wallets/{id}/transactions":{"get":{"operationId":"AdminController_listWalletTransactions","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Movimientos del saldo de una organización (DEPOSIT/DEBIT/REFUND/ADJUSTMENT).","tags":["Administración (staff Mosend)"]}},"/admin/billing/wallet-transactions":{"get":{"operationId":"AdminController_listAllWalletTransactions","parameters":[{"name":"type","required":true,"in":"query","schema":{"type":"string"}},{"name":"source","required":true,"in":"query","schema":{"type":"string"}},{"name":"orgId","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Movimientos de saldo de TODAS las organizaciones (filtros opcionales).","tags":["Administración (staff Mosend)"]}},"/admin/billing/wallets/{id}/adjust":{"post":{"operationId":"AdminController_adjustWallet","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdjustWalletDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Ajusta saldo manualmente (positivo o negativo). Queda en audit.","tags":["Administración (staff Mosend)"]}},"/admin/system/org-resources":{"get":{"operationId":"AdminController_orgResources","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Uso de recursos por organización (mensajes, storage, IA, cuota).","tags":["Administración (staff Mosend)"]}},"/admin/billing/health":{"get":{"operationId":"AdminController_billingHealth","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Salud del motor de facturación: periodos atascados (CLOSING), periodos vencidos sin cerrar y cargos que no pudieron registrarse.","tags":["Administración (staff Mosend)"]}},"/admin/billing/margin":{"get":{"operationId":"AdminController_billingMargin","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Margen real de los últimos 30 días: ingreso facturado vs costo Meta (snapshot metaUnitCost), desglosado por unidad y categoría. Cargos previos a F1 (sin metaUnitCost) se listan aparte como \"sin costo base\".","tags":["Administración (staff Mosend)"]}},"/admin/billing/periods/{id}/release":{"post":{"operationId":"AdminController_releaseStuckPeriod","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Libera un periodo atascado en CLOSING (cierre que murió a mitad de camino) devolviéndolo a OPEN para que el cron lo reintente.","tags":["Administración (staff Mosend)"]}},"/admin/billing/charge-failures/{id}/resolve":{"post":{"operationId":"AdminController_resolveChargeFailure","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Marca un cargo fallido como resuelto (regla creada, cargo backfilleado o descartado con criterio).","tags":["Administración (staff Mosend)"]}},"/admin/billing/charge-failures/reprocess":{"post":{"operationId":"AdminController_reprocessChargeFailures","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Registra como cargo cada mensaje que quedó sin tarifa (NO_PRICING_RULE) si la tarifa ya existe, con la del día en que se envió, y lo marca resuelto. Los que siguen sin tarifa no cambian.","tags":["Administración (staff Mosend)"]}},"/admin/billing/charge-failures/resolve-all":{"post":{"operationId":"AdminController_resolveAllChargeFailures","parameters":[{"name":"reason","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Marca como resueltos TODOS los cargos fallidos sin resolver (opcional: filtrar por motivo, ej. NO_PRICING_RULE).","tags":["Administración (staff Mosend)"]}},"/admin/billing/revenue-series":{"get":{"operationId":"AdminController_billingRevenueSeries","parameters":[{"name":"months","required":true,"in":"query","schema":{"type":"string"}},{"name":"currency","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Series mensuales (UTC, stats globales): facturado, recaudado (pagos aprobados) y recargas de saldo. Para las gráficas del overview.","tags":["Administración (staff Mosend)"]}},"/admin/billing/export.csv":{"get":{"operationId":"AdminController_billingExportCsv","parameters":[{"name":"from","required":true,"in":"query","schema":{"type":"string"}},{"name":"to","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Export contable CSV de facturas del rango [from, to] (fecha de emisión), con montos, estado, dunning y organización.","tags":["Administración (staff Mosend)"]}},"/admin/organizations/{id}/billing/invoices":{"post":{"operationId":"AdminController_createManualInvoice","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateManualInvoiceDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Emite una factura MANUAL (líneas libres, sin periodo): cobros negociados por fuera del ciclo. ISSUED entra a dunning; PAID registra el pago externo.","tags":["Administración (staff Mosend)"]}},"/admin/organizations/{id}/billing/close":{"post":{"operationId":"AdminController_forceClosePeriod","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Fuerza el cierre del periodo abierto y emite factura.","tags":["Administración (staff Mosend)"]}},"/admin/organizations/{id}/billing/start":{"post":{"operationId":"AdminController_setBillingStart","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Fija la fecha de inicio de facturación: descarta el consumo previo (cierra sin factura) y abre el ciclo limpio desde esa fecha.","tags":["Administración (staff Mosend)"]}},"/admin/billing/start-bulk":{"post":{"operationId":"AdminController_setBillingStartBulk","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Fija la MISMA fecha de inicio de facturación a varias orgs (arranca su ciclo limpio). Ideal para clientes que nunca se cortaron.","tags":["Administración (staff Mosend)"]}},"/admin/billing/close-due":{"post":{"operationId":"AdminController_closeDueNow","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Cierra AHORA todas las orgs cuyo periodo ya venció (el mismo trabajo del cron, bajo demanda). Emite factura por cada una.","tags":["Administración (staff Mosend)"]}},"/admin/organizations/{id}/recent-media-messages":{"get":{"operationId":"AdminController_recentMediaMessages","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los últimos mensajes con media de una organización (image/video/audio/etc) con su estado de caché.","tags":["Administración (staff Mosend)"]}},"/admin/messages/{id}/diagnose-media":{"get":{"operationId":"AdminController_diagnoseMessageMedia","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Diagnostica un mensaje con media: payload, wabaId, token mascarado, intento directo a Meta.","tags":["Administración (staff Mosend)"]}},"/admin/users/{id}/impersonate":{"post":{"operationId":"AdminController_impersonateUser","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Genera un ImpersonationToken (single-use, 5 min) para que el staff pueda abrir una sesión como `userId`. Devuelve `{ token, redeemUrl }`. El frontend admin abre redeemUrl en una nueva tab — el dashboard detecta el flag impersonatedBy en el JWT y muestra banner persistente.","tags":["Administración (staff Mosend)"]}},"/admin/roles/reseed-system":{"post":{"operationId":"AdminController_reseedSystemRoles","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Re-aplica el catálogo de permisos del sistema a los roles isSystem=true (owner/admin/agent/billing/viewer). Idempotente: solo borra y recrea RolePermission para esos 5 roles, no toca roles custom de organizaciones.","tags":["Administración (staff Mosend)"]}},"/admin/messages/{id}/refresh-media":{"post":{"operationId":"AdminController_refreshMessageMedia","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Dispara el cache del media en S3 para un mensaje (útil tras restaurar permisos o token).","tags":["Administración (staff Mosend)"]}},"/admin/wabas/rebind-token":{"post":{"operationId":"AdminController_rebindWabaToken","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Reemplaza el access token de una WABA con uno nuevo (system user del BM cliente). Caso de uso: WABA con BSP externo (ej. Twilio) donde queremos enviar desde Mosend usando un system user del BM dueño, sin desplazar al BSP existente. Validamos contra Meta que el token tenga acceso a la WABA antes de persistir.","tags":["Administración (staff Mosend)"]}},"/admin/billing/invoices/{id}/regenerate-pdf":{"post":{"operationId":"AdminController_regenerateInvoicePdf","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Regenera el PDF de una factura ya emitida (útil tras ajustes de layout).","tags":["Administración (staff Mosend)"]}},"/admin/billing/invoices/{id}/mark-paid":{"post":{"operationId":"AdminController_markInvoicePaid","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkInvoicePaidDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Registra un pago manual contra una factura (transferencia, etc).","tags":["Administración (staff Mosend)"]}},"/admin/billing/payment-reports":{"get":{"operationId":"AdminController_listPaymentReports","parameters":[{"name":"status","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Comprobantes de pago Bre-B/QR reportados por los clientes (filtro por status).","tags":["Administración (staff Mosend)"]}},"/admin/billing/payment-reports/{id}/receipt":{"get":{"operationId":"AdminController_paymentReportReceipt","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Signed URL del comprobante para revisión.","tags":["Administración (staff Mosend)"]}},"/admin/billing/payment-reports/{id}/approve":{"post":{"operationId":"AdminController_approvePaymentReport","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Aprueba el comprobante y APLICA el pago (factura → pago manual; recarga → saldo).","tags":["Administración (staff Mosend)"]}},"/admin/billing/payment-reports/{id}/reject":{"post":{"operationId":"AdminController_rejectPaymentReport","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Rechaza el comprobante con motivo (visible al cliente).","tags":["Administración (staff Mosend)"]}},"/admin/billing/breb-config":{"get":{"operationId":"AdminController_getBrebConfig","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Config del cobro por Bre-B/QR (llave, titular, QR).","tags":["Administración (staff Mosend)"]},"patch":{"operationId":"AdminController_updateBrebConfig","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza la config del cobro por Bre-B/QR.","tags":["Administración (staff Mosend)"]}},"/admin/billing/breb-config/qr":{"post":{"operationId":"AdminController_uploadBrebQr","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Sube la imagen del QR de cobro (campo `file`).","tags":["Administración (staff Mosend)"]}},"/admin/billing/invoices/{id}/void":{"post":{"operationId":"AdminController_voidInvoice","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Anula una factura. Si estaba pagada, devuelve el monto al saldo.","tags":["Administración (staff Mosend)"]}},"/admin/organizations/{id}/billing/config":{"patch":{"operationId":"AdminController_updateBillingConfig","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBillingConfigDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Configura ciclo de facturación y markup override de una org.","tags":["Administración (staff Mosend)"]}},"/admin/billing/collection-config":{"get":{"operationId":"AdminController_getCollectionConfig","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Config global de cobranza: plazo de pago, días de recordatorios (5/15/30 default) y días de gracia antes del corte.","tags":["Administración (staff Mosend)"]},"patch":{"operationId":"AdminController_updateCollectionConfig","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCollectionConfigDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Edita la config global de cobranza. Las orgs pueden tener overrides individuales de dueDays/suspendAfterDays.","tags":["Administración (staff Mosend)"]}},"/admin/billing/plan-invoices/run":{"post":{"operationId":"AdminController_runPlanInvoices","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Corre AHORA la facturación de planes (modo planBillingDay). Con coverageStart emite YA a las orgs sin renovación marcada usando esa fecha de inicio de cobertura; sin él, solo a quienes les toca hoy o tienen renovación vencida. Idempotente (nextPlanRenewalAt).","tags":["Administración (staff Mosend)"]}},"/admin/plans":{"get":{"operationId":"AdminController_listPlans","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista todos los planes (incluye internos/no-públicos).","tags":["Administración (staff Mosend)"]},"post":{"operationId":"AdminController_createPlan","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePlanDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea un plan nuevo (el admin lo llamaba sin endpoint).","tags":["Administración (staff Mosend)"]}},"/admin/plans/{id}":{"get":{"operationId":"AdminController_getPlan","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Administración (staff Mosend)"]},"patch":{"operationId":"AdminController_updatePlan","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePlanDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Edita atributos del plan (limits, features, flags).","tags":["Administración (staff Mosend)"]}},"/admin/plans/{id}/prices":{"post":{"operationId":"AdminController_upsertPlanPrice","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertPlanPriceDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea o actualiza un precio (upsert por currency+interval).","tags":["Administración (staff Mosend)"]}},"/admin/organizations/{id}/precio-pactado":{"put":{"operationId":"AdminController_fijarPrecioPactado","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FijarPrecioPactadoDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Fija a mano el precio del plan actual de la organización (en su moneda) para ese intervalo.","tags":["Administración (staff Mosend)"]}},"/admin/organizations/{id}/precios-pactados/{pactadoId}":{"delete":{"operationId":"AdminController_quitarPrecioPactado","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"pactadoId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Pasa la organización al precio de lista de su plan (deja de respetarle el anterior).","tags":["Administración (staff Mosend)"]}},"/admin/plans/{id}/prices/impacto":{"get":{"operationId":"AdminController_impactoDePrecio","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"currency","required":true,"in":"query","schema":{"$ref":"#/components/schemas/Object"}},{"name":"interval","required":true,"in":"query","schema":{"$ref":"#/components/schemas/Object"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cuántas organizaciones pagan ese plan en esa moneda (para avisar antes de cambiar el precio).","tags":["Administración (staff Mosend)"]}},"/admin/plans/{id}/prices/{priceId}":{"delete":{"operationId":"AdminController_deletePlanPrice","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"priceId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Administración (staff Mosend)"]}},"/admin/roadmap":{"get":{"operationId":"AdminController_listRoadmap","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Administración (staff Mosend)"]}},"/admin/roadmap/{id}":{"patch":{"operationId":"AdminController_updateRoadmapItem","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRoadmapItemDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Administración (staff Mosend)"]}},"/admin/ai-providers":{"get":{"operationId":"AdminController_listAiProviders","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Listar proveedores IA configurados (sin exponer la API key).","tags":["Administración (staff Mosend)"]}},"/admin/ai-providers/{provider}":{"patch":{"operationId":"AdminController_updateAiProvider","parameters":[{"name":"provider","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAiProviderDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualizar config de un proveedor IA (apiKey, models, markup).","tags":["Administración (staff Mosend)"]}},"/admin/ai-usage":{"get":{"operationId":"AdminController_aiUsage","parameters":[{"name":"days","required":true,"in":"query","schema":{"type":"string"}},{"name":"desde","required":true,"in":"query","schema":{"type":"string"}},{"name":"hasta","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Reporte de uso IA: totales (costo/cobrado/ganancia), por provider, por modelo y top orgs.","tags":["Administración (staff Mosend)"]}},"/admin/me/role":{"get":{"operationId":"AdminController_meRole","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Administración (staff Mosend)"]}},"/admin/organizaciones/normalizar-moneda":{"post":{"operationId":"AdminController_normalizarMoneda","parameters":[{"name":"simular","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Ajusta la moneda de facturación de cada organización a la de su país.","tags":["Administración (staff Mosend)"]}},"/admin/media/recuperar":{"post":{"operationId":"AdminController_recuperarMedia","parameters":[{"name":"horas","required":true,"in":"query","schema":{"type":"string"}},{"name":"contar","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Reintenta guardar los archivos entrantes que quedaron sin almacenar (tras una caída del almacenamiento).","tags":["Administración (staff Mosend)"]}},"/admin/billing/mp/reconcile":{"post":{"operationId":"AdminController_reconcileMp","parameters":[{"name":"hours","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Ejecuta reconciliación manual con MP (busca pagos huérfanos).","tags":["Administración (staff Mosend)"]}},"/admin/billing/mp/reprocess-payment":{"post":{"operationId":"AdminController_reprocessMpPayment","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReprocessPaymentDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Reprocesa un Payment de MP por id (idempotente).","tags":["Administración (staff Mosend)"]}},"/admin/billing/wallet-alerts/run":{"post":{"operationId":"AdminController_runWalletAlerts","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Ejecuta manualmente checkAndAlert + tryAutoRecharge (solo staff).","tags":["Administración (staff Mosend)"]}},"/admin/webhooks/inbound":{"get":{"operationId":"AdminController_listInboundWebhooks","parameters":[{"name":"type","required":true,"in":"query","schema":{"type":"string"}},{"name":"since","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"orgId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista WebhookEvents recientes (headers/payload redactados).","tags":["Administración (staff Mosend)"]}},"/admin/webhooks/inbound/{id}":{"get":{"operationId":"AdminController_getInboundWebhook","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle de un WebhookEvent.","tags":["Administración (staff Mosend)"]}},"/admin/coupons":{"get":{"operationId":"AdminController_listCoupons","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista cupones con conteo de redenciones.","tags":["Administración (staff Mosend)"]},"post":{"operationId":"AdminController_createCoupon","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCouponDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea un cupón de descuento.","tags":["Administración (staff Mosend)"]}},"/admin/coupons/{id}":{"patch":{"operationId":"AdminController_updateCoupon","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCouponDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza un cupón.","tags":["Administración (staff Mosend)"]},"delete":{"operationId":"AdminController_deleteCoupon","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Borra un cupón (soft-delete si tiene redenciones).","tags":["Administración (staff Mosend)"]}},"/admin/sessions":{"get":{"operationId":"AdminController_listSessions","parameters":[{"name":"search","required":true,"in":"query","schema":{"type":"string"}},{"name":"userId","required":true,"in":"query","schema":{"type":"string"}},{"name":"organizationId","required":true,"in":"query","schema":{"type":"string"}},{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"pageSize","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Sesiones activas de la plataforma (IP, ubicación, dispositivo).","tags":["Administración (staff Mosend)"]}},"/admin/sessions/{id}":{"delete":{"operationId":"AdminController_closeSession","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cierra una sesión activa (revoca el RefreshToken).","tags":["Administración (staff Mosend)"]}},"/admin/users/{id}/sessions":{"delete":{"operationId":"AdminController_closeUserSessions","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cierra todas las sesiones activas de un usuario.","tags":["Administración (staff Mosend)"]}},"/admin/users/{id}/reset-factors":{"post":{"operationId":"AdminController_resetFactors","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Resetea passkeys + 2FA de un usuario y cierra sus sesiones.","tags":["Administración (staff Mosend)"]}},"/admin/auth-policy":{"get":{"operationId":"AdminController_getAuthPolicy","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Política global de auth (máx. sesiones por usuario).","tags":["Administración (staff Mosend)"]},"patch":{"operationId":"AdminController_updateAuthPolicy","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAuthPolicyDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Edita el máximo global de sesiones por usuario.","tags":["Administración (staff Mosend)"]}},"/admin/wabas/uso":{"get":{"operationId":"UsoPorWabaController_usoPorWaba","parameters":[{"name":"days","required":true,"in":"query","schema":{"type":"string"}},{"name":"desde","required":true,"in":"query","schema":{"type":"string"}},{"name":"hasta","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Comparativa de cada WABA: mensajes entrantes y salientes, plantillas, fallidos, mensajes cobrables por categoría, costo de Meta y lo cobrado (aproximado), IA, contra el período anterior.","tags":["Administración (staff Mosend)"]}},"/admin/wabas/{wabaId}/detalle":{"get":{"operationId":"UsoPorWabaController_detalleDeWaba","parameters":[{"name":"wabaId","required":true,"in":"path","schema":{"type":"string"}},{"name":"days","required":true,"in":"query","schema":{"type":"string"}},{"name":"desde","required":true,"in":"query","schema":{"type":"string"}},{"name":"hasta","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle de una WABA: mensajes y costo de Meta por día, plantillas que más cuestan y códigos de error más frecuentes.","tags":["Administración (staff Mosend)"]}},"/platform-config":{"get":{"operationId":"PlatformConfigController_get","parameters":[],"responses":{"200":{"description":""}},"summary":"Público: flags de presentación del sitio (landing).","tags":["platform-config"]}},"/organizations/{orgId}/bot/flows":{"get":{"operationId":"FlowsController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneNumberId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los flujos del bot de la org (filtrable por número).","tags":["Bot · Flujos"]},"post":{"operationId":"FlowsController_create","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBotFlowDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea un flujo del bot.","tags":["Bot · Flujos"]}},"/organizations/{orgId}/bot/flows/plantillas":{"get":{"operationId":"FlowsController_plantillas","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Flujos de ejemplo para empezar sin partir de una página en blanco.","tags":["Bot · Flujos"]}},"/organizations/{orgId}/bot/flows/{id}":{"get":{"operationId":"FlowsController_get","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Obtiene el detalle de un flujo del bot.","tags":["Bot · Flujos"]},"patch":{"operationId":"FlowsController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFlowDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza un flujo del bot (config y/o su JSON).","tags":["Bot · Flujos"]},"delete":{"operationId":"FlowsController_remove","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina un flujo del bot.","tags":["Bot · Flujos"]}},"/organizations/{orgId}/bot/flows/{id}/publish":{"post":{"operationId":"FlowsController_publish","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Publica el flujo para que quede activo.","tags":["Bot · Flujos"]}},"/organizations/{orgId}/bot/flows/{id}/unpublish":{"post":{"operationId":"FlowsController_unpublish","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Despublica el flujo (lo desactiva).","tags":["Bot · Flujos"]}},"/organizations/{orgId}/bot/flows/{id}/duplicate":{"post":{"operationId":"FlowsController_duplicate","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Duplica un flujo existente.","tags":["Bot · Flujos"]}},"/organizations/{orgId}/bot/flows/{id}/test-run":{"post":{"operationId":"FlowsController_testRun","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestRunDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Ejecuta el flujo en sandbox y devuelve el trace de pasos.","tags":["Bot · Flujos"]}},"/organizations/{orgId}/bot/config":{"get":{"operationId":"BotConfigController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista la configuración del bot por número activo de la org.","tags":["Bot · Configuración"]}},"/organizations/{orgId}/bot/config/{phoneId}":{"get":{"operationId":"BotConfigController_getByPhone","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Obtiene la configuración del bot de un número.","tags":["Bot · Configuración"]},"put":{"operationId":"BotConfigController_upsert","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertBotConfigDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea o actualiza la configuración del bot de un número.","tags":["Bot · Configuración"]}},"/organizations/{orgId}/bot/config/{phoneId}/toggle":{"patch":{"operationId":"BotConfigController_toggle","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Activa o desactiva el bot de un número (crea config con defaults si no existe).","tags":["Bot · Configuración"]}},"/organizations/{orgId}/bot/agents/capabilities":{"get":{"operationId":"BotAgentsController_capabilities","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Catálogo de capacidades activables por agente (para la UI).","tags":["Bot · Agentes"]}},"/organizations/{orgId}/bot/agents/modelos":{"get":{"operationId":"BotAgentsController_modelos","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Proveedores de IA con sus modelos elegibles y si tienen clave configurada.","tags":["Bot · Agentes"]}},"/organizations/{orgId}/bot/agents":{"get":{"operationId":"BotAgentsController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneNumberId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los agentes de bot de la organización.","tags":["Bot · Agentes"]},"post":{"operationId":"BotAgentsController_create","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBotAgentDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea un agente de bot.","tags":["Bot · Agentes"]}},"/organizations/{orgId}/bot/agents/stats":{"get":{"operationId":"BotAgentsController_stats","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"dias","required":false,"in":"query","schema":{"minimum":1,"maximum":366,"type":"number"}},{"name":"desde","required":false,"in":"query","schema":{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"}},{"name":"hasta","required":false,"in":"query","schema":{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Rendimiento por agente (conversaciones, respuestas, traspasos, escalamientos, ventas, citas, fallos, costo) en los últimos N días.","tags":["Bot · Agentes"]}},"/organizations/{orgId}/bot/agents/{id}":{"get":{"operationId":"BotAgentsController_get","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle de un agente.","tags":["Bot · Agentes"]},"patch":{"operationId":"BotAgentsController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBotAgentDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza un agente.","tags":["Bot · Agentes"]},"delete":{"operationId":"BotAgentsController_remove","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina un agente.","tags":["Bot · Agentes"]}},"/organizations/{orgId}/bot/events":{"get":{"operationId":"BotEventsController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneNumberId","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los eventos recientes del bot (filtrable por número y límite).","tags":["Bot · Eventos"]}},"/organizations/{orgId}/bot/ai-providers":{"get":{"operationId":"OrgAiProvidersController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Lista los 4 proveedores soportados (Anthropic, OpenAI, OpenRouter, Groq) con su estado para esta org. La API key nunca se devuelve.","tags":["Bot · Proveedores de IA (BYOK)"]}},"/organizations/{orgId}/bot/ai-providers/effective":{"get":{"operationId":"OrgAiProvidersController_effective","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Origen efectivo de IA por proveedor (byok | mosend | none) para esta org, sin exponer keys. Para que el cliente sepa qué está usando.","tags":["Bot · Proveedores de IA (BYOK)"]}},"/organizations/{orgId}/bot/ai-providers/{provider}":{"put":{"operationId":"OrgAiProvidersController_upsert","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"provider","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertOrgAiProviderDto"}}}},"responses":{"200":{"description":""}},"summary":"Crea o actualiza la config del proveedor para esta org. Recibe apiKey en plaintext, se persiste cifrada con AES-GCM.","tags":["Bot · Proveedores de IA (BYOK)"]},"delete":{"operationId":"OrgAiProvidersController_remove","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"provider","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"summary":"Elimina la config del proveedor. La org vuelve a usar fallback (si existe) o queda sin key.","tags":["Bot · Proveedores de IA (BYOK)"]}},"/organizations/{orgId}/bot/ai-providers/{provider}/test":{"post":{"operationId":"OrgAiProvidersController_test","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"provider","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Verifica que la API key funciona haciendo un ping mínimo al proveedor. Persiste el resultado en lastTestedAt/lastTestError.","tags":["Bot · Proveedores de IA (BYOK)"]}},"/organizations/{orgId}/bot/knowledge":{"get":{"operationId":"KnowledgeController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los documentos del knowledge base del bot.","tags":["Bot · Conocimiento (RAG)"]},"post":{"operationId":"KnowledgeController_upload","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadOptsDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Sube un documento. Multipart: file + opcional title, tags (coma).","tags":["Bot · Conocimiento (RAG)"]}},"/organizations/{orgId}/bot/knowledge/search":{"post":{"operationId":"KnowledgeController_search","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchKnowledgeDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Búsqueda semántica (RAG) sobre el knowledge base: embedding del query + similitud coseno sobre los chunks. Mismo retrieval que usa el bot IA.","tags":["Bot · Conocimiento (RAG)"]}},"/organizations/{orgId}/bot/knowledge/insights":{"get":{"operationId":"KnowledgeController_insights","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"dias","required":false,"in":"query","schema":{"minimum":1,"maximum":366,"type":"number"}},{"name":"desde","required":false,"in":"query","schema":{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"}},{"name":"hasta","required":false,"in":"query","schema":{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Qué buscó el bot en la memoria en los últimos N días: consultas, tasa de respuesta, preguntas sin respuesta agrupadas, uso por agente y por documento.","tags":["Bot · Conocimiento (RAG)"]}},"/organizations/{orgId}/bot/knowledge/notes":{"post":{"operationId":"KnowledgeController_createNote","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea una nota (texto escrito en el panel) que el bot usa como conocimiento; se procesa como un documento.","tags":["Bot · Conocimiento (RAG)"]}},"/organizations/{orgId}/bot/knowledge/url":{"post":{"operationId":"KnowledgeController_createFromUrl","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UrlSourceDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Importa una página web pública como fuente de conocimiento; con syncEveryHours se vuelve a leer periódicamente.","tags":["Bot · Conocimiento (RAG)"]}},"/organizations/{orgId}/bot/knowledge/notes/{id}":{"patch":{"operationId":"KnowledgeController_updateNote","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Edita una nota; si cambia el texto se vuelve a procesar.","tags":["Bot · Conocimiento (RAG)"]}},"/organizations/{orgId}/bot/knowledge/{id}":{"get":{"operationId":"KnowledgeController_getOne","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Obtiene el detalle de un documento del knowledge base.","tags":["Bot · Conocimiento (RAG)"]},"delete":{"operationId":"KnowledgeController_delete","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina un documento del knowledge base (chunks y objeto S3).","tags":["Bot · Conocimiento (RAG)"]}},"/organizations/{orgId}/bot/knowledge/{id}/title":{"patch":{"operationId":"KnowledgeController_updateTitle","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTitleDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Renombra un documento del knowledge base.","tags":["Bot · Conocimiento (RAG)"]}},"/organizations/{orgId}/bot/knowledge/{id}/tags":{"patch":{"operationId":"KnowledgeController_updateTags","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTagsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Re-etiqueta un documento (afecta qué bots lo usan).","tags":["Bot · Conocimiento (RAG)"]}},"/organizations/{orgId}/bot/knowledge/{id}/agentes":{"patch":{"operationId":"KnowledgeController_updateAsignacion","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsignacionDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Qué agentes leen el documento, o si lo leen todos (compartido). Cada agente lee solo sus documentos y los compartidos.","tags":["Bot · Conocimiento (RAG)"]}},"/organizations/{orgId}/bot/knowledge/{id}/reprocess":{"post":{"operationId":"KnowledgeController_reprocess","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Re-extrae texto + regenera embeddings.","tags":["Bot · Conocimiento (RAG)"]}},"/organizations/{orgId}/bot/salud":{"get":{"operationId":"SaludDelBotController_analizar","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"dias","required":false,"in":"query","schema":{"minimum":1,"maximum":90,"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Revisión de salud del bot: qué se está rompiendo y qué hacer al respecto.","tags":["Bot"]}},"/organizations/{orgId}/bot/resumen":{"get":{"operationId":"ResumenDelBotController_resumen","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"dias","required":false,"in":"query","schema":{"minimum":1,"maximum":366,"type":"number"}},{"name":"desde","required":false,"in":"query","schema":{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"}},{"name":"hasta","required":false,"in":"query","schema":{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Resumen del bot: serie diaria de quién atendió, totales del período y del anterior, acciones y cierres.","tags":["Bot"]}},"/organizations/{orgId}/bot/resumen/dia":{"get":{"operationId":"ResumenDelBotController_gastoDelDia","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"fecha","required":true,"in":"query","description":"Día a desglosar, `YYYY-MM-DD`, en la zona horaria de la organización.","schema":{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"En qué se fue la IA un día concreto: por agente, por modelo y por para-qué se llamó. El día se corta en la zona horaria de la organización.","tags":["Bot"]}},"/organizations/{orgId}/bot/agents/{agentId}/configurador":{"post":{"operationId":"ConfiguradorController_conversar","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"agentId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfiguradorDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Conversa con el configurador para ajustar las instrucciones de un agente. Solo PROPONE: no guarda nada.","tags":["Bot"]}},"/organizations/{orgId}/bot/agents/{agentId}/probador":{"post":{"operationId":"ProbadorController_probar","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"agentId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProbarDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Prueba el agente sin enviar nada al cliente. Devuelve lo que respondería y qué herramientas usaría.","tags":["Bot"]}},"/organizations/{orgId}/contact-lists":{"get":{"operationId":"ContactListsController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista las listas de contactos de la organización.","tags":["Listas de contactos"]},"post":{"operationId":"ContactListsController_create","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateContactListDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea una nueva lista de contactos.","tags":["Listas de contactos"]}},"/organizations/{orgId}/contact-lists/{id}":{"get":{"operationId":"ContactListsController_get","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Obtiene el detalle de una lista de contactos por su id.","tags":["Listas de contactos"]},"patch":{"operationId":"ContactListsController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza nombre, descripción o color de una lista de contactos.","tags":["Listas de contactos"]},"delete":{"operationId":"ContactListsController_archive","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Archiva una lista de contactos.","tags":["Listas de contactos"]}},"/organizations/{orgId}/contact-lists/{id}/members":{"get":{"operationId":"ContactListsController_listMembers","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","schema":{"minimum":1,"maximum":200,"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los contactos miembros de una lista.","tags":["Listas de contactos"]},"post":{"operationId":"ContactListsController_addMembers","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddMembersDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Agrega contactos a una lista por sus ids.","tags":["Listas de contactos"]},"delete":{"operationId":"ContactListsController_removeMembers","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveMembersDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Quita de la lista los contactos indicados (en bloque).","tags":["Listas de contactos"]}},"/organizations/{orgId}/contact-lists/{id}/remove-by-filter":{"post":{"operationId":"ContactListsController_removeByFilter","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveByFilterDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Quita de la lista todos los contactos que casan con un filtro.","tags":["Listas de contactos"]}},"/organizations/{orgId}/contact-lists/{id}/clear":{"post":{"operationId":"ContactListsController_clear","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Vacía la lista: quita todos sus miembros. La lista se conserva.","tags":["Listas de contactos"]}},"/organizations/{orgId}/contact-lists/{id}/members/{contactId}":{"delete":{"operationId":"ContactListsController_removeMember","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Quita un contacto de una lista.","tags":["Listas de contactos"]}},"/organizations/{orgId}/contact-lists/{id}/add-by-tag":{"post":{"operationId":"ContactListsController_addByTag","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddByTagDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Agrega a la lista todos los contactos que tengan alguna de las etiquetas indicadas.","tags":["Listas de contactos"]}},"/organizations/{orgId}/contact-lists/{id}/add-by-filter":{"post":{"operationId":"ContactListsController_addByFilter","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddByFilterDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Agrega a la lista todos los contactos que casan con un filtro (el mismo del listado de contactos).","tags":["Listas de contactos"]}},"/organizations/{orgId}/contact-lists/{id}/import":{"post":{"operationId":"ContactListsController_importCsv","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"defaultCountry","required":true,"in":"query","schema":{"type":"string"}},{"name":"defaultOptIn","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Importa un CSV de contactos y los deja dentro de esta lista (multipart/form-data, campo file).","tags":["Listas de contactos"]}},"/organizations/{orgId}/broadcasts":{"get":{"operationId":"BroadcastsController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista las difusiones (broadcasts) de la organización.","tags":["Difusiones"]},"post":{"operationId":"BroadcastsController_create","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea una difusión (DRAFT, o SCHEDULED si envías scheduledAt). No envía nada todavía.","tags":["Difusiones"]}},"/organizations/{orgId}/broadcasts/{id}":{"get":{"operationId":"BroadcastsController_get","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle de una difusión, incluyendo conteos agregados (counts: total/sent/delivered/read/failed/replied).","tags":["Difusiones"]}},"/organizations/{orgId}/broadcasts/{id}/recipients":{"get":{"operationId":"BroadcastsController_recipients","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"filter","required":true,"in":"query","schema":{"type":"string"}},{"name":"cursor","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Difusiones"]}},"/organizations/{orgId}/broadcasts/{id}/send":{"post":{"operationId":"BroadcastsController_send","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Dispara el envío: resuelve audiencia (dedup + opt-outs), valida cuota y manda. Bloquea hasta terminar.","tags":["Difusiones"]}},"/organizations/{orgId}/broadcasts/{id}/cancel":{"post":{"operationId":"BroadcastsController_cancel","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Cancela una difusión DRAFT/SCHEDULED. Lo ya enviado no se desmanda.","tags":["Difusiones"]}},"/organizations/{orgId}/broadcasts/{id}/retry-failed":{"post":{"operationId":"BroadcastsController_retryFailed","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Reintenta EN SITIO los destinatarios fallidos de una difusión finalizada (LIST + FILE). Bloquea hasta terminar.","tags":["Difusiones"]}},"/organizations/{orgId}/quick-replies":{"get":{"operationId":"QuickRepliesController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista las respuestas rápidas de la organización.","tags":["Respuestas rápidas"]},"post":{"operationId":"QuickRepliesController_create","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateQuickReplyDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea una respuesta rápida (atajo, título y cuerpo).","tags":["Respuestas rápidas"]}},"/organizations/{orgId}/quick-replies/{id}":{"patch":{"operationId":"QuickRepliesController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateQuickReplyDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza una respuesta rápida.","tags":["Respuestas rápidas"]},"delete":{"operationId":"QuickRepliesController_archive","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Archiva una respuesta rápida.","tags":["Respuestas rápidas"]}},"/organizations/{orgId}/quick-replies/{id}/use":{"post":{"operationId":"QuickRepliesController_incrementUse","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Incrementa el contador de uso de una respuesta rápida.","tags":["Respuestas rápidas"]}},"/solutions":{"get":{"operationId":"SolutionsController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Catálogo de soluciones verticales disponibles (públicas para usuarios logueados).","tags":["Soluciones"]}},"/solutions/{slug}":{"get":{"operationId":"SolutionsController_get","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle completo de un pack (incluye contenido del flow + plantillas).","tags":["Soluciones"]}},"/organizations/{orgId}/solutions":{"get":{"operationId":"SolutionsController_listInstalls","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Soluciones instaladas en la organización.","tags":["Soluciones"]}},"/organizations/{orgId}/solutions/{slug}/install":{"post":{"operationId":"SolutionsController_install","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallSolutionDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Instala el pack en la organización (tags, autoreplies, quick replies, plantillas y flow).","tags":["Soluciones"]}},"/organizations/{orgId}/solutions/{slug}":{"delete":{"operationId":"SolutionsController_uninstall","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Desinstala el pack en la organización. Borra piezas no usadas; conserva las que tienen referencias activas.","tags":["Soluciones"]}},"/admin/staff":{"get":{"operationId":"StaffController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista el equipo staff de Mosend (solo superadmin).","tags":["admin"]},"post":{"operationId":"StaffController_invite","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteStaffDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Invita a un miembro al staff. Si el usuario no existe, se crea y recibe un email para definir contraseña.","tags":["admin"]}},"/admin/staff/{id}":{"patch":{"operationId":"StaffController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStaffDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cambia rol o estado de un miembro del staff.","tags":["admin"]},"delete":{"operationId":"StaffController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Quita a un miembro del staff (su cuenta de usuario se conserva).","tags":["admin"]}},"/organizations/{orgId}/attendance/me":{"get":{"operationId":"AttendanceController_me","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Estado de jornada del agente autenticado (null = sin jornada en curso).","tags":["Asistencia / jornada"]}},"/organizations/{orgId}/attendance/start":{"post":{"operationId":"AttendanceController_start","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Inicia la jornada. Idempotente: si ya hay una en curso, la devuelve.","tags":["Asistencia / jornada"]}},"/organizations/{orgId}/attendance/status":{"post":{"operationId":"AttendanceController_changeStatus","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeStatusDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Cambia el estado de la jornada (Activo, Almuerzo, Pausa, Reunión, Capacitación).","tags":["Asistencia / jornada"]}},"/organizations/{orgId}/attendance/end":{"post":{"operationId":"AttendanceController_end","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndJornadaDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Finaliza la jornada y congela el informe del día (con resumen opcional).","tags":["Asistencia / jornada"]}},"/organizations/{orgId}/attendance/today":{"get":{"operationId":"AttendanceController_today","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Jornada de hoy del agente: totales en vivo, timeline, métricas y horario esperado.","tags":["Asistencia / jornada"]}},"/organizations/{orgId}/attendance/settings":{"get":{"operationId":"AttendanceController_getSettings","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Configuración de auto-cierre de jornadas de la org (admin).","tags":["Asistencia / jornada"]},"patch":{"operationId":"AttendanceController_updateSettings","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAttendanceSettingsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza la configuración de auto-cierre de jornadas (admin).","tags":["Asistencia / jornada"]}},"/organizations/{orgId}/attendance/overtime":{"get":{"operationId":"AttendanceController_overtimeToday","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Agentes con turno extra concedido para hoy (admin).","tags":["Asistencia / jornada"]}},"/organizations/{orgId}/attendance/overtime/{agentId}":{"post":{"operationId":"AttendanceController_setOvertime","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"agentId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetOvertimeDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Concede o revoca el turno extra de un agente para hoy (admin).","tags":["Asistencia / jornada"]}},"/organizations/{orgId}/attendance/team-status":{"get":{"operationId":"AttendanceController_teamStatus","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Estado en vivo de todos los miembros de la org (admin): qué hace cada agente ahora.","tags":["Asistencia / jornada"]}},"/organizations/{orgId}/attendance/day":{"get":{"operationId":"AttendanceController_attendanceDay","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"date","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Tablero de asistencia de un día (admin): presente / tarde / ausente / extra por agente.","tags":["Asistencia / jornada"]}},"/organizations/{orgId}/attendance/work-modes":{"get":{"operationId":"AttendanceController_listWorkModes","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Forma de trabajo de cada miembro: turno fijo o por horas (admin).","tags":["Asistencia / jornada"]}},"/organizations/{orgId}/attendance/work-modes/{agentId}":{"patch":{"operationId":"AttendanceController_setWorkMode","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"agentId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetWorkModeDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cambia la forma de trabajo de una persona. Recalcula también su histórico.","tags":["Asistencia / jornada"]}},"/organizations/{orgId}/attendance/period-presets":{"get":{"operationId":"AttendanceController_periodPresets","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Atajos de período (quincena, últimos 15/30, mes) en la TZ y forma de nómina de la org.","tags":["Asistencia / jornada"]}},"/organizations/{orgId}/attendance/report":{"get":{"operationId":"AttendanceController_attendanceReport","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"from","required":true,"in":"query","schema":{"type":"string"}},{"name":"to","required":true,"in":"query","schema":{"type":"string"}},{"name":"compare","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Reporte de horas por agente sobre un rango (admin → nómina). Default: 30 días.","tags":["Asistencia / jornada"]}},"/organizations/{orgId}/attendance/sessions":{"get":{"operationId":"AttendanceController_mySessions","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"from","required":true,"in":"query","schema":{"type":"string"}},{"name":"to","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Historial de jornadas del agente autenticado (default: últimos 30 días).","tags":["Asistencia / jornada"]}},"/organizations/{orgId}/attendance/sessions/agent/{agentId}":{"get":{"operationId":"AttendanceController_agentSessions","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"agentId","required":true,"in":"path","schema":{"type":"string"}},{"name":"from","required":true,"in":"query","schema":{"type":"string"}},{"name":"to","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Historial de jornadas de un agente con su informe (admin).","tags":["Asistencia / jornada"]}},"/organizations/{orgId}/attendance/sessions/{sessionId}":{"patch":{"operationId":"AttendanceController_correctSession","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"sessionId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrectSessionDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Corrige el cierre de una jornada finalizada (admin): mueve endedAt y recalcula.","tags":["Asistencia / jornada"]},"delete":{"operationId":"AttendanceController_deleteSession","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"sessionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina una jornada y sus eventos (admin): registros erróneos.","tags":["Asistencia / jornada"]}},"/organizations/{orgId}/attendance/current-week":{"get":{"operationId":"ScheduleController_currentWeek","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Semana ISO actual según la TZ de la organización.","tags":["Asistencia / jornada"]}},"/organizations/{orgId}/attendance/schedules":{"get":{"operationId":"ScheduleController_listWeek","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"isoYear","required":true,"in":"query","schema":{"type":"string"}},{"name":"isoWeek","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Horarios del equipo para una semana (admin). Sin semana → la actual.","tags":["Asistencia / jornada"]}},"/organizations/{orgId}/attendance/schedules/{agentId}":{"get":{"operationId":"ScheduleController_getForAgent","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"agentId","required":true,"in":"path","schema":{"type":"string"}},{"name":"isoYear","required":true,"in":"query","schema":{"type":"string"}},{"name":"isoWeek","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Horario de un agente para una semana (admin).","tags":["Asistencia / jornada"]},"put":{"operationId":"ScheduleController_upsert","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"agentId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertScheduleDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Asigna/actualiza el horario de un agente (admin), con copia opcional a próximas semanas.","tags":["Asistencia / jornada"]}},"/organizations/{orgId}/attendance/my-schedule":{"get":{"operationId":"ScheduleController_mySchedule","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"isoYear","required":true,"in":"query","schema":{"type":"string"}},{"name":"isoWeek","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Horario del agente autenticado (semana actual si no se pasa).","tags":["Asistencia / jornada"]}},"/organizations/{orgId}/attendance/my-schedule/proximos":{"get":{"operationId":"ScheduleController_myUpcoming","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"dias","required":true,"in":"query","schema":{"type":"string"}},{"name":"semana","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Horario del agente autenticado día por día: turno, pausas, horas esperadas, festivos y novedades. Con `semana` (0 = actual, 1 = próxima, -1 = anterior) devuelve esa semana de lunes a domingo; sin ella, `dias` días desde hoy (14 por defecto, máximo 42).","tags":["Asistencia / jornada"]}},"/organizations/{orgId}/attendance/holidays":{"get":{"operationId":"DayOffController_listHolidays","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"year","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Festivos de la organización (opcionalmente de un año).","tags":["Asistencia / festivos y novedades"]},"post":{"operationId":"DayOffController_upsertHolidays","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertHolidaysDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea o actualiza festivos. Admite varios de una vez (calendario anual).","tags":["Asistencia / festivos y novedades"]}},"/organizations/{orgId}/attendance/holidays/seed":{"post":{"operationId":"DayOffController_seedHolidays","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"year","required":true,"in":"query","schema":{"type":"string"}},{"name":"country","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Siembra el calendario oficial de festivos de un país para un año (por defecto CO).","tags":["Asistencia / festivos y novedades"]}},"/organizations/{orgId}/attendance/holidays/{id}":{"delete":{"operationId":"DayOffController_deleteHoliday","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina un festivo.","tags":["Asistencia / festivos y novedades"]}},"/organizations/{orgId}/attendance/leaves":{"get":{"operationId":"DayOffController_listLeaves","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"from","required":true,"in":"query","schema":{"type":"string"}},{"name":"to","required":true,"in":"query","schema":{"type":"string"}},{"name":"agentId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Novedades (vacaciones, incapacidades, permisos) que tocan el rango dado.","tags":["Asistencia / festivos y novedades"]},"post":{"operationId":"DayOffController_createLeave","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLeaveDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Registra una novedad de un asesor.","tags":["Asistencia / festivos y novedades"]}},"/organizations/{orgId}/attendance/leaves/{id}":{"delete":{"operationId":"DayOffController_deleteLeave","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina una novedad.","tags":["Asistencia / festivos y novedades"]}},"/organizations/{orgId}/shift-reminders":{"get":{"operationId":"ShiftRemindersController_get","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lee los recordatorios de jornada de los agentes.","tags":["Recordatorios de jornada"]},"put":{"operationId":"ShiftRemindersController_update","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateShiftRemindersDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza los recordatorios de jornada (parcial).","tags":["Recordatorios de jornada"]}},"/organizations/{orgId}/shift-reminders/test":{"post":{"operationId":"ShiftRemindersController_test","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Envía un recordatorio de jornada de PRUEBA al usuario actual por los canales habilitados.","tags":["Recordatorios de jornada"]}},"/organizations/{orgId}/catalog/waba/{wabaId}/connect":{"post":{"operationId":"CatalogsController_connect","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"wabaId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Detecta el catálogo conectado a la WABA (Commerce Manager), lo guarda y sincroniza productos.","tags":["Catálogos (Commerce)"]}},"/organizations/{orgId}/catalog/waba/{wabaId}/sync":{"post":{"operationId":"CatalogsController_sync","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"wabaId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Re-sincroniza los productos del catálogo conectado.","tags":["Catálogos (Commerce)"]}},"/organizations/{orgId}/catalog/products":{"get":{"operationId":"CatalogsController_products","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"catalogId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los productos cacheados del catálogo.","tags":["Catálogos (Commerce)"]}},"/organizations/{orgId}/catalog/commerce-settings":{"get":{"operationId":"CatalogsController_getSettings","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneNumberId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lee la configuración comercial de un número.","tags":["Catálogos (Commerce)"]},"patch":{"operationId":"CatalogsController_updateSettings","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneNumberId","required":true,"in":"query","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommerceSettingsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza la configuración comercial de un número.","tags":["Catálogos (Commerce)"]}},"/organizations/{orgId}/orders/by-message/{messageId}":{"get":{"operationId":"OrdersController_getByMessage","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"messageId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Pedido asociado a un mensaje del inbox.","tags":["Pedidos (Commerce)"]}},"/organizations/{orgId}/orders/{orderId}":{"patch":{"operationId":"OrdersController_updateStatus","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOrderStatusDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cambia el estado de un pedido (en proceso / completado / cancelado).","tags":["Pedidos (Commerce)"]}},"/organizations/{orgId}/whatsapp-flows":{"get":{"operationId":"WhatsAppFlowsController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"wabaId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los Flows de la organización.","tags":["WhatsApp Flows"]},"post":{"operationId":"WhatsAppFlowsController_create","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFlowDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea un Flow (opcionalmente con su flow.json).","tags":["WhatsApp Flows"]}},"/organizations/{orgId}/whatsapp-flows/sync/{wabaId}":{"post":{"operationId":"WhatsAppFlowsController_sync","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"wabaId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Reconcilia los Flows locales con los de Meta.","tags":["WhatsApp Flows"]}},"/organizations/{orgId}/whatsapp-flows/{id}":{"get":{"operationId":"WhatsAppFlowsController_get","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle del Flow + estado/preview/validación de Meta.","tags":["WhatsApp Flows"]},"patch":{"operationId":"WhatsAppFlowsController_updateMeta","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFlowMetaDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza nombre / categorías del Flow.","tags":["WhatsApp Flows"]},"delete":{"operationId":"WhatsAppFlowsController_remove","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Borra un Flow en borrador.","tags":["WhatsApp Flows"]}},"/organizations/{orgId}/whatsapp-flows/{id}/json":{"patch":{"operationId":"WhatsAppFlowsController_updateJson","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFlowJsonDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza el contenido (flow.json) del Flow.","tags":["WhatsApp Flows"]}},"/organizations/{orgId}/whatsapp-flows/{id}/publish":{"post":{"operationId":"WhatsAppFlowsController_publish","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Publica el Flow.","tags":["WhatsApp Flows"]}},"/organizations/{orgId}/whatsapp-flows/{id}/deprecate":{"post":{"operationId":"WhatsAppFlowsController_deprecate","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Marca el Flow como obsoleto.","tags":["WhatsApp Flows"]}},"/plans":{"get":{"operationId":"PlansController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista pública de planes activos con sus precios.","tags":["Planes"]}},"/plans/{slug}":{"get":{"operationId":"PlansController_getOne","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle público de un plan por su slug.","tags":["Planes"]}},"/plans/quote/{slug}":{"get":{"operationId":"PlansController_quote","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}},{"name":"currency","required":true,"in":"query","schema":{"type":"string"}},{"name":"interval","required":true,"in":"query","schema":{"type":"string"}},{"name":"coupon","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Precio final con cupón aplicado (informativo, no cobra).","tags":["Planes"]}},"/plans/organizations/{orgId}/preview-change":{"post":{"operationId":"PlansController_previewChange","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewPlanChangeDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Previsualiza el efecto de un cambio de plan: prorrateo + cupón + saldo final.","tags":["Planes"]}},"/plans/organizations/{orgId}/cancel-subscription":{"post":{"operationId":"PlansController_cancelSubscription","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Cancela la suscripción de pago. Baja el plan a free, mantiene los datos. No emite reembolsos por servicios ya prestados.","tags":["Planes"]}},"/plans/organizations/{orgId}/plan":{"patch":{"operationId":"PlansController_changePlan","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cambia el plan de una organización (self-service: upgrade/downgrade).","tags":["Planes"]}},"/organizations/{orgId}/billing/addons":{"get":{"operationId":"AddonsController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Catálogo de add-ons del plan + cantidades contratadas.","tags":["Complementos"]},"patch":{"operationId":"AddonsController_apply","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddonChangeDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Contrata o reduce un add-on. Los aumentos exigen saldo suficiente en el wallet.","tags":["Complementos"]}},"/organizations/{orgId}/billing/addons/preview":{"post":{"operationId":"AddonsController_preview","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddonChangeDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Previsualiza el prorrateo y el impacto en el wallet.","tags":["Complementos"]}},"/passkeys/registration/options":{"post":{"operationId":"PasskeysController_registrationOptions","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Genera las opciones WebAuthn para registrar una nueva passkey.","tags":["Passkeys"]}},"/passkeys/registration/verify":{"post":{"operationId":"PasskeysController_registrationVerify","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasskeyRegistrationVerifyDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Verifica y guarda la passkey recién registrada.","tags":["Passkeys"]}},"/passkeys":{"get":{"operationId":"PasskeysController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista las passkeys registradas del usuario.","tags":["Passkeys"]}},"/passkeys/{id}":{"patch":{"operationId":"PasskeysController_rename","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenamePasskeyDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Renombra una passkey del usuario.","tags":["Passkeys"]},"delete":{"operationId":"PasskeysController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina una passkey del usuario.","tags":["Passkeys"]}},"/auth/passkey/login/options":{"post":{"operationId":"PasskeysController_loginOptions","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Genera las opciones WebAuthn para iniciar sesión con passkey.","tags":["Passkeys"]}},"/auth/passkey/login/verify":{"post":{"operationId":"PasskeysController_loginVerify","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Verifica la passkey y emite los tokens de sesión.","tags":["Passkeys"]}},"/auth/step-up/passkey/options":{"post":{"operationId":"PasskeysController_stepUpOptions","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]},{"bearer":[]}],"summary":"Opciones WebAuthn para elevar la sesión a MFA con passkey.","tags":["Passkeys"]}},"/auth/step-up/passkey/verify":{"post":{"operationId":"PasskeysController_stepUpVerify","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]},{"bearer":[]}],"summary":"Verifica la passkey y eleva la sesión actual a MFA.","tags":["Passkeys"]}},"/organizations/{orgId}/instagram":{"get":{"operationId":"InstagramController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista las cuentas de Instagram conectadas a la organización.","tags":["Instagram"]}},"/organizations/{orgId}/instagram/connect/initiate":{"post":{"operationId":"InstagramController_initiate","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Devuelve la URL de autorización de Instagram (Instagram Login) para conectar una cuenta.","tags":["Instagram"]}},"/organizations/{orgId}/instagram/connect":{"post":{"operationId":"InstagramController_connect","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectInstagramDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Completa la conexión de una cuenta de Instagram con el code del OAuth y suscribe el webhook.","tags":["Instagram"]}},"/organizations/{orgId}/instagram/conversations/{convId}/media":{"post":{"operationId":"InstagramController_uploadMedia","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"convId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Sube un adjunto (imagen/audio/video) a S3 para enviarlo por Instagram. Devuelve el mediaAssetId.","tags":["Instagram"]}},"/organizations/{orgId}/instagram/{id}/conversation-tools":{"get":{"operationId":"InstagramController_getConversationTools","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lee los ice breakers y el menú persistente configurados para la cuenta.","tags":["Instagram"]},"put":{"operationId":"InstagramController_updateConversationTools","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationToolsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Configura los ice breakers y el menú persistente de la cuenta.","tags":["Instagram"]}},"/organizations/{orgId}/instagram/{id}":{"delete":{"operationId":"InstagramController_disconnect","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Desconecta (archiva) una cuenta de Instagram.","tags":["Instagram"]}},"/organizations/{orgId}/documents/editor/status":{"get":{"operationId":"DocumentsController_editorStatus","parameters":[],"responses":{"200":{"description":""}},"summary":"Indica si la edición en vivo está disponible.","tags":["Documentos"]}},"/organizations/{orgId}/documents/{docId}/editor-config":{"get":{"operationId":"DocumentsController_editorConfig","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"docId","required":true,"in":"path","schema":{"type":"string"}},{"name":"mode","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Config firmado para abrir el documento en el editor en vivo de OnlyOffice.","tags":["Documentos"]}},"/organizations/{orgId}/documents/folders":{"get":{"operationId":"DocumentsController_listFolders","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Lista las carpetas de la organización.","tags":["Documentos"]},"post":{"operationId":"DocumentsController_createFolder","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFolderDto"}}}},"responses":{"201":{"description":""}},"summary":"Crea una carpeta.","tags":["Documentos"]}},"/organizations/{orgId}/documents/folders/{folderId}/visibility":{"patch":{"operationId":"DocumentsController_setFolderVisibility","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"folderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisibilityDto"}}}},"responses":{"200":{"description":""}},"summary":"Cambia la visibilidad de una carpeta (ORG/PRIVATE).","tags":["Documentos"]}},"/organizations/{orgId}/documents/folders/{folderId}":{"patch":{"operationId":"DocumentsController_renameFolder","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"folderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenameDto"}}}},"responses":{"200":{"description":""}},"summary":"Renombra una carpeta.","tags":["Documentos"]},"delete":{"operationId":"DocumentsController_deleteFolder","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"folderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Borra una carpeta (sus documentos quedan en la raíz).","tags":["Documentos"]}},"/organizations/{orgId}/documents":{"get":{"operationId":"DocumentsController_listDocuments","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"folderId","required":true,"in":"query","schema":{"type":"string"}},{"name":"q","required":true,"in":"query","schema":{"type":"string"}},{"name":"type","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Lista documentos (carpeta, o búsqueda en toda la org).","tags":["Documentos"]},"post":{"operationId":"DocumentsController_upload","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"folderId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Sube un documento (campo `file` multipart).","tags":["Documentos"]}},"/organizations/{orgId}/documents/trash":{"get":{"operationId":"DocumentsController_listTrash","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Documentos en la papelera.","tags":["Documentos"]}},"/organizations/{orgId}/documents/storage":{"get":{"operationId":"DocumentsController_storage","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Uso de almacenamiento del plan.","tags":["Documentos"]}},"/organizations/{orgId}/documents/from-message":{"post":{"operationId":"DocumentsController_saveFromMessage","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Guarda en Documentos el adjunto de un mensaje entrante.","tags":["Documentos"]}},"/organizations/{orgId}/documents/{docId}/visibility":{"patch":{"operationId":"DocumentsController_setDocumentVisibility","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"docId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisibilityDto"}}}},"responses":{"200":{"description":""}},"summary":"Cambia la visibilidad de un documento (ORG/PRIVATE).","tags":["Documentos"]}},"/organizations/{orgId}/documents/{docId}/view":{"get":{"operationId":"DocumentsController_viewUrl","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"docId","required":true,"in":"path","schema":{"type":"string"}},{"name":"download","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"URL firmada para abrir/descargar el documento.","tags":["Documentos"]}},"/organizations/{orgId}/documents/{docId}":{"patch":{"operationId":"DocumentsController_renameDocument","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"docId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenameDto"}}}},"responses":{"200":{"description":""}},"summary":"Renombra un documento.","tags":["Documentos"]},"delete":{"operationId":"DocumentsController_deleteDocument","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"docId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Manda un documento a la papelera (borrado suave).","tags":["Documentos"]}},"/organizations/{orgId}/documents/{docId}/move":{"patch":{"operationId":"DocumentsController_moveDocument","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"docId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveDocumentDto"}}}},"responses":{"200":{"description":""}},"summary":"Mueve un documento a otra carpeta (o a la raíz).","tags":["Documentos"]}},"/organizations/{orgId}/documents/{docId}/send":{"post":{"operationId":"DocumentsController_send","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"docId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendDocumentDto"}}}},"responses":{"201":{"description":""}},"summary":"Envía el documento a una conversación (WhatsApp o web-chat).","tags":["Documentos"]}},"/organizations/{orgId}/documents/{docId}/restore":{"post":{"operationId":"DocumentsController_restore","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"docId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Restaura un documento de la papelera.","tags":["Documentos"]}},"/organizations/{orgId}/documents/{docId}/purge":{"delete":{"operationId":"DocumentsController_purge","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"docId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Elimina definitivamente un documento.","tags":["Documentos"]}},"/documents/public-download":{"get":{"operationId":"DocumentsPublicController_publicDownload","parameters":[{"name":"token","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Descarga pública por token (uso interno: Meta).","tags":["DocumentsPublic"]}},"/onlyoffice/callback":{"post":{"operationId":"OnlyOfficeCallbackController_callback","parameters":[{"name":"docId","required":true,"in":"query","schema":{"type":"string"}},{"name":"orgId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Callback de guardado de OnlyOffice (interno).","tags":["OnlyOfficeCallback"]}},"/onlyoffice/download":{"get":{"operationId":"OnlyOfficeCallbackController_download","parameters":[{"name":"token","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Descarga del documento para OnlyOffice (interno).","tags":["OnlyOfficeCallback"]}},"/organizations/{orgId}/deletion-request":{"post":{"operationId":"AccountDeletionController_request","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestDeletionDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Solicitar la eliminación de la organización (solo owner; periodo de gracia 30 días).","tags":["Eliminación de cuenta"]},"delete":{"operationId":"AccountDeletionController_cancel","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Cancelar la eliminación durante el periodo de gracia (solo owner).","tags":["Eliminación de cuenta"]},"get":{"operationId":"AccountDeletionController_status","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Estado de la solicitud de eliminación para el banner (cualquier miembro).","tags":["Eliminación de cuenta"]}},"/admin/deletion-requests":{"get":{"operationId":"AccountDeletionAdminController_list","parameters":[{"name":"status","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cola de solicitudes de eliminación (filtro por status).","tags":["Admin · Eliminación de cuenta"]}},"/admin/deletion-requests/{id}/confirm":{"post":{"operationId":"AccountDeletionAdminController_confirm","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Confirmar y EJECUTAR la purga de la organización (destructivo, irreversible).","tags":["Admin · Eliminación de cuenta"]}},"/admin/deletion-requests/{id}/reject":{"post":{"operationId":"AccountDeletionAdminController_reject","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectDeletionDto"}}}},"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Rechazar la solicitud y reactivar la organización.","tags":["Admin · Eliminación de cuenta"]}},"/admin/deletion-requests/organizations/{orgId}/delete-now":{"post":{"operationId":"AccountDeletionAdminController_deleteNow","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminDeleteNowDto"}}}},"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Elimina una organización directamente (staff): purga inmediata → queda DELETED. Requiere confirmOrgName. Destructivo, irreversible.","tags":["Admin · Eliminación de cuenta"]}},"/webhooks/meta/data-deletion":{"post":{"operationId":"MetaDataDeletionController_handle","parameters":[],"responses":{"200":{"description":""}},"summary":"Callback de eliminación de datos de Meta (valida signed_request HMAC-SHA256).","tags":["Webhooks (Meta)"]}}},"info":{"title":"Mosend WB API","description":"Tech Provider de Meta para WhatsApp Business Cloud API","version":"2.108.1","contact":{"name":"Mosend","url":"https://developer.mosend.dev","email":"soporte@mosend.dev"}},"tags":[],"servers":[{"url":"https://api.mosend.dev","description":"Producción"}],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http"},"apiKey":{"type":"apiKey","in":"header","name":"X-Api-Key"}},"schemas":{"StepUp2faDto":{"type":"object","properties":{"code":{"type":"string","minLength":6,"maxLength":20}},"required":["code"]},"SignupDto":{"type":"object","properties":{"email":{"type":"string","maxLength":254,"format":"email"},"password":{"type":"string","minLength":8,"maxLength":128},"name":{"type":"string","minLength":2,"maxLength":80},"captchaToken":{"type":"string","maxLength":4096}},"required":["email","password","name"]},"SignupRequestCodeDto":{"type":"object","properties":{"email":{"type":"string","maxLength":254,"format":"email"},"password":{"type":"string","minLength":8,"maxLength":128},"name":{"type":"string","minLength":2,"maxLength":80},"phone":{"type":"string","minLength":7,"maxLength":20},"captchaToken":{"type":"string","maxLength":4096}},"required":["email","password","name","phone"]},"SignupVerifyCodeDto":{"type":"object","properties":{"email":{"type":"string","maxLength":254,"format":"email"},"phone":{"type":"string","minLength":7,"maxLength":20},"code":{"type":"string","pattern":"^\\d{4,10}$"}},"required":["email","phone","code"]},"SignupResendCodeDto":{"type":"object","properties":{"email":{"type":"string","maxLength":254,"format":"email"},"phone":{"type":"string","minLength":7,"maxLength":20}},"required":["email","phone"]},"LoginDto":{"type":"object","properties":{"email":{"type":"string","maxLength":254,"format":"email"},"password":{"type":"string","maxLength":128},"twoFactorCode":{"type":"string","maxLength":64},"captchaToken":{"type":"string","maxLength":4096}},"required":["email","password"]},"RefreshDto":{"type":"object","properties":{"refreshToken":{"type":"string","description":"Refresh token. OPCIONAL tras M10: las sesiones migradas lo envían por la\ncookie HttpOnly `mosend_rt`, no en el body. Se conserva opcional para las\nsesiones legacy que aún lo tienen en localStorage (transición)."}}},"LogoutDto":{"type":"object","properties":{"refreshToken":{"type":"string"}}},"ForgotPasswordDto":{"type":"object","properties":{"email":{"type":"string","format":"email"},"captchaToken":{"type":"string","maxLength":4096}},"required":["email"]},"VerifyEmailDto":{"type":"object","properties":{"token":{"type":"string","minLength":16,"maxLength":128}},"required":["token"]},"ResetPasswordDto":{"type":"object","properties":{"token":{"type":"string"},"password":{"type":"string","minLength":8,"maxLength":128}},"required":["token","password"]},"ImpersonateRedeemDto":{"type":"object","properties":{"token":{"type":"string"}},"required":["token"]},"SetCaptchaDto":{"type":"object","properties":{"disabled":{"type":"boolean","description":"true = desactivar el captcha globalmente; false = reactivarlo."}},"required":["disabled"]},"UpdateSignupVerificationDto":{"type":"object","properties":{"enabled":{"type":"boolean"},"verifyTiming":{"type":"string","enum":["before","after"]},"requireEmailVerification":{"type":"boolean"},"phoneUnique":{"type":"boolean"},"scope":{"type":"string","enum":["self_service","all"]},"senderOrgId":{"type":"string","nullable":true,"format":"uuid"},"senderPhoneNumberId":{"type":"string","nullable":true,"format":"uuid"},"templateId":{"type":"string","nullable":true,"format":"uuid"},"otpLength":{"type":"number","minimum":4,"maximum":10},"otpTtlSeconds":{"type":"number","minimum":60,"maximum":3600},"maxAttempts":{"type":"number","minimum":1,"maximum":20},"resendCooldownSeconds":{"type":"number","minimum":0,"maximum":600}}},"TestSendDto":{"type":"object","properties":{"toPhone":{"type":"string","description":"E.164 (con o sin '+'); se normaliza al enviar.","pattern":"^\\+?\\d{7,15}$"}},"required":["toPhone"]},"UpdateUserDto":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":80},"locale":{"type":"string","maxLength":8},"email":{"type":"string","maxLength":254,"format":"email"},"phone":{"type":"string","minLength":7,"maxLength":20}}},"ChangePasswordDto":{"type":"object","properties":{"currentPassword":{"type":"string","minLength":8,"maxLength":128},"newPassword":{"type":"string","minLength":8,"maxLength":128}},"required":["currentPassword","newPassword"]},"VerifyPhoneCodeDto":{"type":"object","properties":{"code":{"type":"string","pattern":"^\\d{4,10}$"}},"required":["code"]},"CreateOrganizationDto":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":80},"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,38}[a-z0-9]$"},"billingEmail":{"type":"string","maxLength":254,"format":"email"},"country":{"type":"string","maxLength":2},"currency":{"type":"string","maxLength":3},"timezone":{"type":"string","maxLength":64},"planSlug":{"type":"string","maxLength":60},"billingInterval":{"type":"string","enum":["MONTHLY","YEARLY"]},"billingParentId":{"type":"string","format":"uuid"}},"required":["name","slug","billingEmail"]},"UpdateOrganizationDto":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":80},"billingEmail":{"type":"string","maxLength":254,"format":"email"},"country":{"type":"string","maxLength":2},"timezone":{"type":"string","maxLength":64},"businessHoursSchedule":{"type":"object","nullable":true},"optOutEnabled":{"type":"boolean"},"optOutKeywords":{"maxItems":30,"type":"array","items":{"type":"string","maxLength":40}}}},"LinkBillingGroupDto":{"type":"object","properties":{"parentOrgId":{"type":"string","format":"uuid"}},"required":["parentOrgId"]},"SetAiLimitsDto":{"type":"object","properties":{"dailyUsd":{"type":"number","nullable":true,"minimum":0,"maximum":100000,"description":"Tope diario en USD. null = sin tope.","example":2},"monthlyUsd":{"type":"number","nullable":true,"minimum":0,"maximum":100000,"description":"Tope mensual en USD. null = sin tope.","example":40}}},"UpdateMyPreferencesDto":{"type":"object","properties":{"contactPanelDefaultTab":{"type":"string","enum":["info","notes","tasks","gallery"],"description":"Pestaña con la que abre el panel de información del contacto en el inbox."}}},"SetRoleDto":{"type":"object","properties":{"roleId":{"type":"string","format":"uuid"}},"required":["roleId"]},"SetWabaScopeDto":{"type":"object","properties":{"wabaIds":{"type":"array","items":{"type":"string","format":"uuid"}}},"required":["wabaIds"]},"SetSuspendedDto":{"type":"object","properties":{"suspended":{"type":"boolean"},"reason":{"type":"string","description":"Motivo opcional (solo al suspender).","maxLength":300}},"required":["suspended"]},"OAuthDecisionDto":{"type":"object","properties":{"approve":{"type":"boolean","description":"`true` permite; `false` devuelve `access_denied` a la aplicación."},"organizationId":{"type":"string","description":"Organización sobre la que se concede el acceso (obligatoria al aprobar).","format":"uuid"}},"required":["approve"]},"CreateOAuthClientDto":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":80},"description":{"type":"string","maxLength":500},"kind":{"type":"string","description":"`CONFIDENTIAL` (servidor con secreto) o `PUBLIC` (escritorio/CLI, solo PKCE).","enum":["CONFIDENTIAL","PUBLIC"]},"logoUrl":{"type":"string","format":"uri"},"homepageUrl":{"type":"string","format":"uri"},"redirectUris":{"description":"URIs de retorno exactas. Se permite http solo para localhost.","uniqueItems":true,"type":"array","items":{"type":"string","maxLength":2000}},"allowedScopes":{"description":"Alcances que la aplicación puede pedir (claves del catálogo de permisos).","uniqueItems":true,"type":"array","items":{"type":"string"}},"ownerOrganizationId":{"type":"string","description":"Organización dueña cuando la app es de un cliente (futuro).","format":"uuid"},"integrationSlug":{"type":"string","description":"Slug de la integración del marketplace que representa esta app (p. ej. `zapier`).","maxLength":80}},"required":["name","kind","redirectUris","allowedScopes"]},"UpdateOAuthClientDto":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":80},"description":{"type":"string","maxLength":500},"logoUrl":{"type":"string","format":"uri"},"homepageUrl":{"type":"string","format":"uri"},"redirectUris":{"uniqueItems":true,"type":"array","items":{"type":"string","maxLength":2000}},"allowedScopes":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"active":{"type":"boolean","description":"`false` suspende la app: sus tokens dejan de servir al instante."},"integrationSlug":{"type":"string","nullable":true,"description":"Slug de la integración del marketplace; `null` desvincula.","maxLength":80}}},"SetRolePermissionsDto":{"type":"object","properties":{"permissions":{"description":"Claves de permiso (ver GET /permissions). Reemplaza el conjunto completo.","type":"array","items":{"type":"string"}}}},"CreateApiKeyDto":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":80},"scopes":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"phoneNumberIds":{"description":"Restricción opcional a un subconjunto de phone-numbers de la org. Vacío\no ausente = la key opera sobre TODOS los phone-numbers (default). Si\ntrae UUIDs, la key SOLO puede enviar/leer de esos números.","uniqueItems":true,"type":"array","items":{"type":"string","format":"uuid"}},"expiresAt":{"type":"string","description":"Caducidad opcional (ISO 8601). Pasada esa fecha la key deja de resolver.\nSin valor = no caduca (comportamiento anterior)."}},"required":["name"]},"UpdateApiKeyDto":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":80},"scopes":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"phoneNumberIds":{"uniqueItems":true,"type":"array","items":{"type":"string","format":"uuid"}},"expiresAt":{"type":"string","nullable":true}}},"CreateInvitationDto":{"type":"object","properties":{"email":{"type":"string","format":"email"},"roleId":{"type":"string","format":"uuid"},"wabaIds":{"description":"WABAs a las que se scopeará al aceptar. Vacío/omitido = acceso a todas.","maxItems":100,"type":"array","items":{"type":"string","format":"uuid"}}},"required":["email","roleId"]},"BulkInvitationDto":{"type":"object","properties":{"emails":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","format":"email"}},"roleId":{"type":"string","format":"uuid"},"wabaIds":{"maxItems":100,"type":"array","items":{"type":"string","format":"uuid"}}},"required":["emails","roleId"]},"PreregisterMemberDto":{"type":"object","properties":{"email":{"type":"string","format":"email"},"name":{"type":"string","description":"Nombre del agente. Si se omite, se deriva del correo.","maxLength":120}},"required":["email"]},"PreregisterDto":{"type":"object","properties":{"members":{"minItems":1,"maxItems":50,"type":"array","items":{"$ref":"#/components/schemas/PreregisterMemberDto"}},"roleId":{"type":"string","format":"uuid"},"wabaIds":{"maxItems":100,"type":"array","items":{"type":"string","format":"uuid"}}},"required":["members","roleId"]},"ReactivateDto":{"type":"object","properties":{"notify":{"type":"boolean","description":"Si true, además de devolver el enlace, reenvía el correo de activación."}}},"AcceptInvitationDto":{"type":"object","properties":{"token":{"type":"string"}},"required":["token"]},"AcceptSignupDto":{"type":"object","properties":{"token":{"type":"string"},"name":{"type":"string","minLength":2},"password":{"type":"string","minLength":8}},"required":["token","name","password"]},"ActivateDto":{"type":"object","properties":{"token":{"type":"string"},"password":{"type":"string","minLength":8}},"required":["token","password"]},"VerifyDto":{"type":"object","properties":{"token":{"type":"string","minLength":6,"maxLength":8}},"required":["token"]},"DisableDto":{"type":"object","properties":{"token":{"type":"string","minLength":6,"maxLength":8}},"required":["token"]},"CreateSystemNoticeDto":{"type":"object","properties":{"severity":{"type":"string","enum":["INFO","WARNING","CRITICAL"]},"title":{"type":"string","minLength":2,"maxLength":160},"body":{"type":"string","maxLength":1000},"linkUrl":{"type":"string","maxLength":500},"linkLabel":{"type":"string","maxLength":60},"active":{"type":"boolean"},"dismissible":{"type":"boolean"},"adminsOnly":{"type":"boolean","description":"Solo dueños y administradores lo ven."},"startsAt":{"type":"string"},"endsAt":{"type":"string"}},"required":["severity","title"]},"UpdateSystemNoticeDto":{"type":"object","properties":{"severity":{"type":"string","enum":["INFO","WARNING","CRITICAL"]},"title":{"type":"string","minLength":2,"maxLength":160},"body":{"type":"string","maxLength":1000},"linkUrl":{"type":"string","maxLength":500},"linkLabel":{"type":"string","maxLength":60},"active":{"type":"boolean"},"dismissible":{"type":"boolean"},"adminsOnly":{"type":"boolean","description":"Solo dueños y administradores lo ven."},"startsAt":{"type":"string"},"endsAt":{"type":"string"}}},"FragmentoDto":{"type":"object","properties":{"texto":{"type":"string","maxLength":2000},"marcas":{"type":"array","maxItems":3,"items":{"type":"string","enum":["negrita","cursiva","subrayado"]}},"color":{"type":"string","pattern":"^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Hex de 3 o 6 dígitos."},"enlace":{"type":"string","maxLength":500,"pattern":"^https?:\\/\\/[^\\s\"'<>]+$","description":"Solo http(s)."}},"required":["texto"]},"LineaDeListaDto":{"type":"object","properties":{"fragmentos":{"maxItems":50,"type":"array","items":{"$ref":"#/components/schemas/FragmentoDto"}}},"required":["fragmentos"]},"BloqueDto":{"type":"object","properties":{"tipo":{"type":"string","enum":["parrafo","titulo","subtitulo","lista","separador"]},"alineacion":{"type":"string","enum":["izquierda","centro","derecha"]},"tamano":{"type":"string","enum":["pequeno","normal","grande"]},"fragmentos":{"maxItems":50,"type":"array","items":{"$ref":"#/components/schemas/FragmentoDto"}},"items":{"maxItems":50,"description":"Cada elemento de la lista es su propia línea de fragmentos.","type":"array","items":{"$ref":"#/components/schemas/LineaDeListaDto"}}},"required":["tipo"]},"ContenidoDto":{"type":"object","properties":{"subject":{"type":"string","minLength":3,"maxLength":160,"description":"Asunto del correo."},"title":{"type":"string","minLength":3,"maxLength":120,"description":"Titular dentro del correo."},"lead":{"type":"string","minLength":10,"maxLength":2000,"description":"Párrafo de entrada. Admite <strong> y <a>; el resto de etiquetas se escapa."},"bullets":{"maxItems":30,"description":"Lista de cambios, uno por elemento.","type":"array","items":{"type":"string","maxLength":300}},"ctaUrl":{"type":"string","maxLength":500,"description":"Enlace del botón."},"ctaText":{"type":"string","maxLength":60,"description":"Texto del botón."},"footnote":{"type":"string","maxLength":500,"description":"Nota al pie, en letra pequeña."},"fromVersion":{"type":"string","maxLength":20,"description":"Versión de novedades de la que se precargó. Solo trazabilidad."},"headerStyle":{"type":"string","maxLength":40,"description":"Clave de la cabecera del catálogo."},"headerTitle":{"type":"string","maxLength":120,"description":"Título dentro de la banda de la cabecera."},"headerSubtitle":{"type":"string","maxLength":160},"bodyBlocks":{"maxItems":100,"description":"Cuerpo con formato. Cuando viene, sustituye a `lead` y `bullets`.","type":"array","items":{"$ref":"#/components/schemas/BloqueDto"}}},"required":["subject","title","lead"]},"AudienciaDto":{"type":"object","properties":{"statuses":{"type":"array","maxItems":10,"description":"Estados de organización que reciben. Vacío = ninguno por estado.","items":{"type":"string","enum":["ACTIVE","SUSPENDED","PENDING_DELETION","DELETED","TRIAL_EXPIRED"]}},"planIds":{"maxItems":50,"description":"Planes que reciben. Vacío = cualquier plan.","type":"array","items":{"type":"string","format":"uuid"}},"orgIds":{"maxItems":500,"description":"Organizaciones elegidas a mano. Se SUMAN a las de los filtros.","type":"array","items":{"type":"string","format":"uuid"}}}},"GuardarBorradorDto":{"type":"object","properties":{"contenido":{"$ref":"#/components/schemas/ContenidoDto"},"audiencia":{"$ref":"#/components/schemas/AudienciaDto"},"borradorId":{"type":"string","description":"Id del borrador a actualizar. Sin él se crea uno nuevo.","format":"uuid"}},"required":["contenido","audiencia"]},"PrevisualizarEnvioDto":{"type":"object","properties":{"contenido":{"$ref":"#/components/schemas/ContenidoDto"},"audiencia":{"$ref":"#/components/schemas/AudienciaDto"}},"required":["contenido","audiencia"]},"EnvioDePruebaDto":{"type":"object","properties":{"contenido":{"$ref":"#/components/schemas/ContenidoDto"},"email":{"type":"string","format":"email","description":"A dónde mandar la prueba."}},"required":["contenido","email"]},"CrearEnvioDto":{"type":"object","properties":{"contenido":{"$ref":"#/components/schemas/ContenidoDto"},"audiencia":{"$ref":"#/components/schemas/AudienciaDto"},"esperados":{"type":"number","description":"Número de destinatarios que mostró la previsualización. Si ya no coincide, el envío se rechaza.","minimum":0}},"required":["contenido","audiencia","esperados"]},"DarseDeBajaDto":{"type":"object","properties":{"token":{"type":"string","maxLength":500,"description":"Token firmado que venía en el enlace del correo."},"baja":{"type":"boolean","description":"false para volver a suscribirse."}},"required":["token"]},"ConnectTestNumberDto":{"type":"object","properties":{"wabaId":{"type":"string","minLength":8,"maxLength":64},"phoneNumberId":{"type":"string","minLength":8,"maxLength":64},"accessToken":{"type":"string","minLength":20,"maxLength":2048},"wabaName":{"type":"string","maxLength":120}},"required":["wabaId","phoneNumberId","accessToken"]},"PurgeWabaDto":{"type":"object","properties":{"confirm":{"type":"boolean","description":"Debe venir en true para confirmar el borrado definitivo."}}},"InitiateSignupDto":{"type":"object","properties":{"organizationId":{"type":"string","format":"uuid"}},"required":["organizationId"]},"SdkSessionInfoDto":{"type":"object","properties":{"business_id":{"type":"string"},"waba_id":{"type":"string"},"phone_number_id":{"type":"string"}}},"CallbackDto":{"type":"object","properties":{"sessionId":{"type":"string","format":"uuid"},"code":{"type":"string"},"redirectUri":{"type":"string","description":"Solo en el flujo por REDIRECCIÓN (móvil). Meta exige que el `redirect_uri`\ndel intercambio sea idéntico al que se usó al pedir el código; si se manda\ncuando el flujo fue el del SDK de JavaScript, Meta rechaza el intercambio.\nPor eso viaja aquí en vez de deducirse.","maxLength":500},"sessionInfo":{"$ref":"#/components/schemas/SdkSessionInfoDto"},"coexistence":{"type":"boolean","description":"True si el frontend invocó FB.login con extras.setup.coexistence=true.\nMarca el PhoneNumber resultante como `coexistenceMode=true` para que el\nUI muestre badge \"Coexistencia con app móvil\" y para futuras decisiones\n(ej. no marcar como leído si Meta avisa que la app móvil ya respondió)."}},"required":["sessionId","code"]},"CompleteImportDto":{"type":"object","properties":{"wabaMetaIds":{"minItems":1,"type":"array","items":{"type":"string"}},"phoneMetaIds":{"type":"array","items":{"type":"string"}}},"required":["wabaMetaIds"]},"AddPhoneNumberDto":{"type":"object","properties":{"wabaId":{"type":"string"},"cc":{"type":"string","pattern":"^\\d{1,4}$"},"phoneNumber":{"type":"string","pattern":"^\\d{4,14}$"},"verifiedName":{"type":"string","minLength":1,"maxLength":100}},"required":["wabaId","cc","phoneNumber","verifiedName"]},"UpdatePhoneNumberDto":{"type":"object","properties":{"color":{"type":"string","nullable":true,"description":"Clave de la paleta, o null para volver al color automático.","enum":["emerald","sky","violet","amber","rose","indigo","teal","fuchsia","orange","lime","cyan","pink","slate"]}}},"SetUsernameDto":{"type":"object","properties":{"username":{"type":"string","description":"Formato de username de negocio de Meta: letras/números/punto/guion bajo.","pattern":"^[a-zA-Z0-9._]{3,30}$"},"transferAction":{"type":"object","description":"'force_transfer' lo mueve desde otro número del portfolio (error 147005 sin él).","pattern":"^(none|force_transfer)$"}},"required":["username"]},"PurgePhoneNumberDto":{"type":"object","properties":{"confirm":{"type":"boolean","description":"Debe venir en true para confirmar el borrado definitivo."}}},"SendMessageDto":{"type":"object","properties":{"phoneNumberId":{"type":"string","format":"uuid"},"to":{"type":"string","description":"Número del destinatario en E.164. Aceptamos con o sin `+` para ser\ntolerantes con integraciones que usen formato internacional clásico\n(`+573001234567`) — la normalización quita el `+` antes de validar\npara que toda la app maneje un único formato (`573001234567`).\n\nSin esto, un mismo número enviado a veces con `+` y a veces sin él\ncreaba contactos y conversaciones duplicados (cada uno con `waId`\ndistinto en la BD). El `@Matches` final exige que después de la\nnormalización solo queden dígitos.","pattern":"^(\\d{8,15}|[A-Z]{2}\\.(?:ENT\\.)?[A-Za-z0-9]{1,128}|ig:\\d{6,24})$"},"type":{"type":"string","enum":["text","template","image","video","audio","document","sticker","location","contacts","interactive","reaction"]},"payload":{"type":"object","description":"Payload Meta-passthrough. Modo \"experto\": el cliente arma manualmente la\nestructura completa según WhatsApp Cloud API (`{ name, language,\ncomponents: [...] }` para templates, `{ body }` para text, etc).\n\nPara `type === 'template'`, ahora es OPCIONAL. Si no se provee, hay que\nmandar `templateId` o `templateName` + `variables` y Mosend arma el\npayload internamente. Para los demás `type`, sigue siendo requerido."},"templateId":{"type":"string","description":"Modo simplificado para `type === 'template'`. UUID de la plantilla en\nMosend (no el `metaTemplateId`). Útil cuando el cliente ya tiene la\nplantilla creada desde el dashboard y solo quiere enviarla.","format":"uuid"},"templateName":{"type":"string","description":"Alternativa a `templateId`: nombre de la plantilla aprobada en Meta.\nCuando hay varias plantillas con el mismo nombre en distintos idiomas,\nMeta resuelve por `templateLanguage`. Para WABAs con múltiples WABAs,\nse resuelve a partir del `phoneNumberId`.","maxLength":512},"templateLanguage":{"type":"string","description":"Código de idioma para `templateName`. Default = idioma de la primera\nplantilla aprobada con ese nombre en la WABA del phoneNumberId.","maxLength":8},"variables":{"type":"object","description":"Variables que rellenan los `{{N}}` de la plantilla. Dos shapes posibles:\n\n  - Array: solo body posicional → `[\"Juan\", \"12345\"]` rellena\n    `{{1}}` con \"Juan\" y `{{2}}` con \"12345\".\n\n  - Objeto: para plantillas con header media o botones URL dinámicos:\n    `{ body: [\"Juan\"], header: { type: \"image\", link: \"...\" },\n       buttons: [{ index: 0, value: \"ord-456\" }] }`\n\nEl backend valida que el conteo de variables coincida con la plantilla."},"clientId":{"type":"string","maxLength":80},"replyToMessageId":{"type":"string","description":"Si se envía como respuesta a otro mensaje (cita visible en WhatsApp del\ndestinatario), pasar aquí el UUID del Message original. El backend\nresuelve su `metaMessageId` y lo manda a Meta como `context.message_id`.","format":"uuid"}},"required":["phoneNumberId","to","type"]},"ProductSectionDto":{"type":"object","properties":{"title":{"type":"string","maxLength":24},"productRetailerIds":{"type":"array","items":{"type":"string"}}},"required":["title","productRetailerIds"]},"SendProductDto":{"type":"object","properties":{"phoneNumberId":{"type":"string","format":"uuid"},"to":{"type":"string","pattern":"^(\\d{8,15}|[A-Z]{2}\\.(?:ENT\\.)?[A-Za-z0-9]{1,128}|ig:\\d{6,24})$"},"catalogId":{"type":"string","description":"ID del catálogo conectado a la WABA.","maxLength":64},"bodyText":{"type":"string","maxLength":1024},"footerText":{"type":"string","maxLength":60},"headerText":{"type":"string","maxLength":60},"productRetailerId":{"type":"string","description":"SPM: un solo producto."},"products":{"description":"MPM (simple): lista plana de SKUs → una sección.","type":"array","items":{"type":"string"}},"sections":{"description":"MPM (con secciones): título + SKUs por sección.","type":"array","items":{"$ref":"#/components/schemas/ProductSectionDto"}},"catalogMessage":{"type":"boolean","description":"Catalog message: muestra el catálogo completo."},"thumbnailProductRetailerId":{"type":"string"},"replyToMessageId":{"type":"string","description":"Cita a otro mensaje (context).","format":"uuid"}},"required":["phoneNumberId","to","catalogId"]},"ListRowDto":{"type":"object","properties":{"id":{"type":"string","maxLength":200},"title":{"type":"string","maxLength":24},"description":{"type":"string","maxLength":72}},"required":["id","title"]},"ListSectionDto":{"type":"object","properties":{"title":{"type":"string","maxLength":24},"rows":{"type":"array","items":{"$ref":"#/components/schemas/ListRowDto"}}},"required":["rows"]},"SendInteractiveDto":{"type":"object","properties":{"phoneNumberId":{"type":"string","format":"uuid"},"to":{"type":"string","pattern":"^(\\d{8,15}|[A-Z]{2}\\.(?:ENT\\.)?[A-Za-z0-9]{1,128}|ig:\\d{6,24})$"},"kind":{"type":"string","enum":["list","cta_url","location_request","request_contact_info"]},"bodyText":{"type":"string","maxLength":1024},"headerText":{"type":"string","maxLength":60},"footerText":{"type":"string","maxLength":60},"buttonText":{"type":"string","maxLength":20},"sections":{"type":"array","items":{"$ref":"#/components/schemas/ListSectionDto"}},"displayText":{"type":"string","maxLength":20},"url":{"type":"string"},"replyToMessageId":{"type":"string","format":"uuid"}},"required":["phoneNumberId","to","kind"]},"SendFlowDto":{"type":"object","properties":{"phoneNumberId":{"type":"string","format":"uuid"},"to":{"type":"string","pattern":"^(\\d{8,15}|[A-Z]{2}\\.(?:ENT\\.)?[A-Za-z0-9]{1,128}|ig:\\d{6,24})$"},"flowId":{"type":"string","description":"Id local del WhatsAppFlow (nuestra tabla).","format":"uuid"},"bodyText":{"type":"string","maxLength":1024},"ctaText":{"type":"string","maxLength":30},"headerText":{"type":"string","maxLength":60},"footerText":{"type":"string","maxLength":60},"screen":{"type":"string","maxLength":200},"data":{"type":"object"},"flowAction":{"type":"string","enum":["navigate","data_exchange"]},"replyToMessageId":{"type":"string","format":"uuid"}},"required":["phoneNumberId","to","flowId","bodyText","ctaText"]},"CtaUrlDto":{"type":"object","properties":{"displayText":{"type":"string","maxLength":20},"url":{"type":"string"}},"required":["displayText","url"]},"QuickReplyDto":{"type":"object","properties":{"id":{"type":"string","maxLength":200},"title":{"type":"string","maxLength":20}},"required":["id","title"]},"CarouselCardDto":{"type":"object","properties":{"headerType":{"type":"string","enum":["image","video"]},"headerLink":{"type":"string"},"bodyText":{"type":"string","maxLength":160},"ctaUrl":{"$ref":"#/components/schemas/CtaUrlDto"},"quickReplies":{"type":"array","items":{"$ref":"#/components/schemas/QuickReplyDto"}}},"required":["headerType","headerLink"]},"SendCarouselDto":{"type":"object","properties":{"phoneNumberId":{"type":"string","format":"uuid"},"to":{"type":"string","pattern":"^(\\d{8,15}|[A-Z]{2}\\.(?:ENT\\.)?[A-Za-z0-9]{1,128}|ig:\\d{6,24})$"},"bodyText":{"type":"string","maxLength":1024},"cards":{"type":"array","items":{"$ref":"#/components/schemas/CarouselCardDto"}},"replyToMessageId":{"type":"string","format":"uuid"}},"required":["phoneNumberId","to","bodyText","cards"]},"EditMessageDto":{"type":"object","properties":{"body":{"type":"string","minLength":1,"maxLength":4096}},"required":["body"]},"RequestRegistrationCodeDto":{"type":"object","properties":{"method":{"type":"string","enum":["SMS","VOICE"]},"language":{"type":"string","default":"es"}},"required":["method","language"]},"VerifyRegistrationCodeDto":{"type":"object","properties":{"code":{"type":"string","minLength":3,"maxLength":12}},"required":["code"]},"RegisterDto":{"type":"object","properties":{"pin":{"type":"string","pattern":"^\\d{6}$"}},"required":["pin"]},"CreateLinkDto":{"type":"object","properties":{"phoneNumberId":{"type":"string","description":"Número conectado (Cloud API). Excluyente con externalPhone.","format":"uuid"},"externalPhone":{"type":"string","description":"Número externo en formato internacional (cualquier WhatsApp, sin WABA).\n Se normaliza a solo dígitos. Excluyente con phoneNumberId.","maxLength":20},"name":{"type":"string","maxLength":120},"campaignTag":{"type":"string","maxLength":80},"prefilledMessage":{"type":"string","maxLength":1024},"metadata":{"type":"object"}},"required":["name"]},"UpdateLinkDto":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"campaignTag":{"type":"string","maxLength":80},"prefilledMessage":{"type":"string","maxLength":1024},"metadata":{"type":"object"}}},"CrearGrupoDto":{"type":"object","properties":{"phoneNumberId":{"type":"string","description":"Número de la empresa que crea el grupo y desde el que se le escribe.","format":"uuid"},"subject":{"type":"string","maxLength":128},"description":{"type":"string","maxLength":2048},"joinApprovalMode":{"type":"string","description":"`auto_approve` (entra quien tenga el enlace) o `approval_required` (cada\nsolicitud hay que aprobarla). Por defecto, el de Meta: auto_approve.","enum":["auto_approve","approval_required"]}},"required":["phoneNumberId","subject"]},"SacarParticipantesDto":{"type":"object","properties":{"waIds":{"description":"Teléfonos o identificadores de WhatsApp. Un grupo admite 8 participantes,\nasí que no tiene sentido aceptar listas mayores.","minItems":1,"maxItems":8,"type":"array","items":{"type":"string"}}},"required":["waIds"]},"ResolverSolicitudesDto":{"type":"object","properties":{"joinRequestIds":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string"}},"accion":{"type":"string","enum":["aprobar","rechazar"]}},"required":["joinRequestIds","accion"]},"ContactEntity":{"type":"object","properties":{"id":{"type":"string","description":"Identificador único del contacto (UUID).","format":"uuid","example":"a3f1c2d4-5b6e-7f80-91a2-b3c4d5e6f708"},"waId":{"type":"string","description":"Identificador del canal. Para WhatsApp es el número en E.164 sin \"+\" (p.ej. 573001112233). Para el chat web es \"webchat:{visitorId}\".","example":"573001112233"},"name":{"type":"object","description":"Nombre del contacto (editable por el agente). Null si no se ha definido.","nullable":true,"example":"María Gómez"},"email":{"type":"object","description":"Email del contacto. Llega principalmente vía identify del widget de chat web. No es único dentro de la org. Null si no se conoce.","nullable":true,"example":"maria@ejemplo.com"},"profileName":{"type":"object","description":"Nombre de perfil reportado por la plataforma (WhatsApp/Instagram). Null si no aplica.","nullable":true,"example":"María G."},"language":{"type":"object","description":"Código de idioma del contacto (ISO, p.ej. \"es\", \"en\", \"pt-BR\"). Null si no se conoce.","nullable":true,"example":"es"},"attributes":{"type":"object","description":"Atributos personalizados del contacto como objeto clave/valor. Objeto vacío {} cuando no hay atributos.","additionalProperties":true,"example":{"Teléfono":"+57 300 111 2233","Ubicación":"Bogotá, CO"}},"optInStatus":{"type":"string","description":"Estado de opt-in (consentimiento) del contacto.","enum":["UNKNOWN","OPTED_IN","OPTED_OUT"],"example":"OPTED_IN"},"lastSeenAt":{"type":"string","description":"Fecha/hora de la última actividad del contacto (último mensaje IN/OUT), en ISO 8601. Null si nunca ha tenido actividad.","format":"date-time","nullable":true,"example":"2026-06-23T14:35:00.000Z"},"createdAt":{"type":"string","description":"Fecha/hora de creación del contacto, en ISO 8601.","format":"date-time","example":"2026-01-10T09:00:00.000Z"},"avatarUrl":{"type":"string","description":"URL pública de la foto de perfil del contacto; Instagram (cacheada en S3/CDN) o avatar del chat web; null si no hay.","format":"uri","nullable":true,"example":"https://media.mosend.dev/org-abc123/avatars/9f86d081884c7d65..."}},"required":["id","waId","attributes","optInStatus","createdAt"]},"UpsertContactDto":{"type":"object","properties":{"waId":{"type":"string","pattern":"^\\d{8,15}$"},"name":{"type":"string","maxLength":80},"language":{"type":"string","maxLength":8},"attributes":{"type":"object"}},"required":["waId"]},"BulkDeleteContactsDto":{"type":"object","properties":{"contactIds":{"type":"array","items":{"type":"string","format":"uuid"}}},"required":["contactIds"]},"UpdateContactDto":{"type":"object","properties":{"name":{"type":"string","maxLength":80},"language":{"type":"string","maxLength":8},"currency":{"type":"string","description":"Moneda con la que se le cobra a este cliente. Cadena vacía = volver a la\nde la organización (JSON no distingue «no lo mandes» de «bórralo»).","enum":["COP","USD","MXN",""]},"attributes":{"type":"object"},"optInStatus":{"type":"object"},"botExcluded":{"type":"boolean","description":"Si true, el bot no le responde nada (exclusión total, solo conversacional)."}}},"RequestHandoffDto":{"type":"object","properties":{"reason":{"type":"string","description":"Se acepta por compatibilidad; el origen queda registrado como «api»."},"detail":{"type":"string","description":"Texto libre para el registro y el webhook («cliente pidió hablar con ventas»)."}}},"AssignConversationDto":{"type":"object","properties":{"userId":{"type":"string","nullable":true,"description":"Usuario al que se asigna; null la libera.","format":"uuid"}},"required":["userId"]},"SetConversationAgentDto":{"type":"object","properties":{"agentId":{"type":"string","nullable":true,"description":"Agente del bot que atiende; null deja decidir al enrutador.","format":"uuid"}},"required":["agentId"]},"BulkAssignConversationsDto":{"type":"object","properties":{"conversationIds":{"type":"array","items":{"type":"string","format":"uuid"}},"userId":{"type":"string","nullable":true,"description":"Usuario destino; null libera las conversaciones.","format":"uuid"}},"required":["conversationIds","userId"]},"SnoozeConversationDto":{"type":"object","properties":{"until":{"type":"string","nullable":true,"description":"Fecha ISO hasta la que se pospone. null = reactivar ahora.","example":"2026-07-22T09:00:00.000Z"},"note":{"type":"string","maxLength":500,"description":"Motivo del snooze (visible al reabrirse)."}}},"SetPinnedDto":{"type":"object","properties":{"pinned":{"type":"boolean"}},"required":["pinned"]},"AddConversationTagDto":{"type":"object","properties":{"tagId":{"type":"string","format":"uuid"}},"required":["tagId"]},"RegisterDeviceDto":{"type":"object","properties":{"token":{"type":"string"},"platform":{"type":"string","enum":["IOS","ANDROID"]},"appVersion":{"type":"string"}},"required":["token","platform"]},"UnregisterDeviceDto":{"type":"object","properties":{"token":{"type":"string"}},"required":["token"]},"SubscribeDto":{"type":"object","properties":{"endpoint":{"type":"string"},"p256dh":{"type":"string"},"auth":{"type":"string"}},"required":["endpoint","p256dh","auth"]},"UnsubscribeDto":{"type":"object","properties":{"endpoint":{"type":"string"}},"required":["endpoint"]},"RotateDto":{"type":"object","properties":{"oldEndpoint":{"type":"string"},"endpoint":{"type":"string"},"p256dh":{"type":"string"},"auth":{"type":"string"}},"required":["oldEndpoint","endpoint","p256dh","auth"]},"ActualizarAnuncioDto":{"type":"object","properties":{"queOfrece":{"type":"string","description":"En una línea: qué se vende en ese anuncio. Lo lee el bot.","maxLength":300},"productIds":{"description":"Productos del catálogo que corresponden a este anuncio.","maxItems":20,"type":"array","items":{"type":"string","format":"uuid"}},"botAgentId":{"type":"string","description":"Agente del bot que atiende a quien llega por aquí. Vacío = el de siempre."},"tagId":{"type":"string","description":"Etiqueta para el contacto: con ella entran el ruteo y la lista de precios."},"mensajeInicial":{"type":"string","description":"Primer mensaje exacto, si se prefiere abrir con uno propio.","maxLength":1024},"activo":{"type":"boolean","description":"false = el bot deja de recibir el contexto de este anuncio."}}},"GuardarEncuestaDto":{"type":"object","properties":{"active":{"type":"boolean","description":"Si se le pregunta o no. Nace apagada."},"delayMinutes":{"type":"number","minimum":1,"maximum":10080,"description":"Minutos a esperar desde el cierre. 120 por defecto."},"audience":{"enum":["ALL","HUMAN","BOT"],"type":"string","description":"A quién: ALL toda conversación cerrada, HUMAN solo las que contestó una persona, BOT solo las que atendió el bot."},"cooldownDays":{"type":"number","minimum":0,"maximum":365,"description":"Días sin volver a preguntarle al mismo contacto."},"questions":{"type":"array","description":"Las preguntas, hasta 3: [{ text, options[] }]. La PRIMERA admite 3 respuestas (es la única que podría salir como plantilla, y una plantilla no acepta listas); de la segunda en adelante, hasta 10. En cada una, la primera opción es la mejor nota. Máximo 20 caracteres por respuesta.","items":{"type":"object"}},"askComment":{"type":"boolean","description":"Si además se le pide un comentario."},"commentQuestion":{"type":"string","maxLength":1024,"description":"La segunda pregunta, abierta."},"thanksMessage":{"type":"string","maxLength":1024,"description":"Con qué se despide."},"answerTimeoutHours":{"type":"number","minimum":1,"maximum":168,"description":"Horas que se espera una respuesta antes de darla por perdida."},"phoneNumberIds":{"description":"Solo para estos números. Vacío = todos.","type":"array","items":{"type":"string","format":"uuid"}}}},"UpdateAgendaSettingsDto":{"type":"object","properties":{"enabled":{"type":"boolean"},"minNoticeMin":{"type":"number","minimum":0,"maximum":10080},"maxAdvanceDays":{"type":"number","minimum":1,"maximum":365},"reminderTemplateName":{"type":"string","nullable":true,"description":"Plantilla aprobada para el recordatorio. Convención de variables:\n{{1}} = nombre del contacto, {{2}} = fecha y hora local de la cita y, si\nla plantilla lo tiene, {{3}} = enlace de la reunión.","maxLength":512},"reminderTemplateLang":{"type":"string","nullable":true,"maxLength":8},"confirmTemplateName":{"type":"string","nullable":true,"description":"Plantillas para avisar fuera de la ventana de 24 h (confirmación, cambio\nde hora, cancelación). Mismas variables que el recordatorio. null = sin.","maxLength":512},"confirmTemplateLang":{"type":"string","nullable":true,"maxLength":8},"rescheduleTemplateName":{"type":"string","nullable":true,"maxLength":512},"rescheduleTemplateLang":{"type":"string","nullable":true,"maxLength":8},"cancelTemplateName":{"type":"string","nullable":true,"maxLength":512},"cancelTemplateLang":{"type":"string","nullable":true,"maxLength":8},"reminderHoursBefore":{"type":"number","description":"Horas antes de la cita (0 = sin recordatorio, máx 72).","minimum":0,"maximum":72},"reminderPhoneNumberId":{"type":"string","nullable":true,"format":"uuid"},"bookingFlowId":{"type":"string","nullable":true,"description":"WhatsAppFlow (local) publicado para reserva con date-picker nativo.","format":"uuid"}}},"CreateAppointmentTypeDto":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"description":{"type":"string","maxLength":500},"durationMin":{"type":"number","minimum":5,"maximum":720},"bufferMin":{"type":"number","minimum":0,"maximum":240},"staffUserId":{"type":"string","description":"Quién atiende. Vacío = agenda general de la organización.","format":"uuid"}},"required":["name","durationMin"]},"UpdateAppointmentTypeDto":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"description":{"type":"string","nullable":true,"maxLength":500},"durationMin":{"type":"number","minimum":5,"maximum":720},"bufferMin":{"type":"number","minimum":0,"maximum":240},"active":{"type":"boolean"},"staffUserId":{"type":"string","nullable":true,"description":"Quién atiende. `null` lo devuelve a la agenda general.","format":"uuid"}}},"AvailabilityRuleDto":{"type":"object","properties":{"weekday":{"type":"number","minimum":0,"maximum":6},"startMinute":{"type":"number","minimum":0,"maximum":1439},"endMinute":{"type":"number","minimum":1,"maximum":1440}},"required":["weekday","startMinute","endMinute"]},"SetAvailabilityDto":{"type":"object","properties":{"rules":{"description":"Reemplaza TODAS las reglas de la agenda general (staffUserId null).","maxItems":50,"type":"array","items":{"$ref":"#/components/schemas/AvailabilityRuleDto"}}},"required":["rules"]},"AddExceptionDto":{"type":"object","properties":{"date":{"type":"string","description":"Día local de la org, formato YYYY-MM-DD."},"reason":{"type":"string","maxLength":200}},"required":["date"]},"Object":{"type":"object","properties":{}},"BookAppointmentDto":{"type":"object","properties":{"typeId":{"type":"string","format":"uuid"},"contactId":{"type":"string","format":"uuid"},"startAt":{"type":"string","description":"Inicio exacto de un slot devuelto por GET slots (ISO)."},"conversationId":{"type":"string","format":"uuid"},"phoneNumberId":{"type":"string","format":"uuid"},"notes":{"type":"string","maxLength":1000},"staffUserId":{"type":"string","description":"Profesional con el que se reserva. Vacío = agenda general.","format":"uuid"},"meetingUrl":{"type":"string","description":"Enlace de la reunión (Meet, Zoom, Teams…), pegado a mano.","maxLength":500,"format":"uri"},"inviteEmail":{"type":"string","description":"Correo del cliente para mandarle la invitación.","maxLength":200,"format":"email"},"pedirCorreo":{"type":"boolean","description":"Sin correo: pedírselo al cliente por el chat para mandarle la invitación."}},"required":["typeId","contactId","startAt"]},"CancelAppointmentDto":{"type":"object","properties":{"reason":{"type":"string","maxLength":500}}},"RescheduleAppointmentDto":{"type":"object","properties":{"startAt":{"type":"string","description":"Nuevo inicio (ISO); debe ser un slot disponible del mismo tipo de cita."}},"required":["startAt"]},"UpdateAppointmentDetailsDto":{"type":"object","properties":{"meetingUrl":{"type":"string","description":"Enlace de la reunión. Cadena vacía = quitarlo.","maxLength":500,"format":"uri"},"inviteEmail":{"type":"string","description":"Correo de la invitación. Cadena vacía = quitarlo.","maxLength":200,"format":"email"},"notes":{"type":"string","maxLength":1000}}},"SetAppointmentStatusDto":{"type":"object","properties":{"status":{"type":"string","enum":["NO_SHOW","COMPLETED"]}},"required":["status"]},"SendBookingFlowDto":{"type":"object","properties":{"contactId":{"type":"string","format":"uuid"},"appointmentTypeId":{"type":"string","format":"uuid"},"conversationId":{"type":"string","format":"uuid"},"phoneNumberId":{"type":"string","format":"uuid"}},"required":["contactId","appointmentTypeId"]},"UpdateGoogleSyncDto":{"type":"object","properties":{"pushEnabled":{"type":"boolean","description":"Citas de Mosend → eventos de Google."},"blockBusyEnabled":{"type":"boolean","description":"\"Ocupado\" en Google bloquea horarios."}}},"UpdateLicenseDeliverySettingsDto":{"type":"object","properties":{"enabled":{"type":"boolean"},"wompiEnv":{"type":"string","enum":["test","prod"]},"wompiPublicKey":{"type":"string","nullable":true,"maxLength":200},"wompiPrivateKey":{"type":"string","nullable":true,"description":"Se recibe en claro y se guarda cifrada. Enviar '' para borrar.","maxLength":500},"wompiEventsSecret":{"type":"string","nullable":true,"maxLength":500},"wompiIntegritySecret":{"type":"string","nullable":true,"maxLength":500},"deliveryTemplateName":{"type":"string","nullable":true,"description":"Plantilla de entrega fuera de 24h. {{1}}=producto {{2}}=llave {{3}}=link.","maxLength":512},"deliveryTemplateLang":{"type":"string","nullable":true,"maxLength":8},"deliveryMessage":{"type":"string","nullable":true,"description":"Mensaje de entrega (sesión) configurable. Variables: {producto} {llave} {link}.","maxLength":1000},"replacementMessage":{"type":"string","nullable":true,"description":"Mensaje al reemplazar una llave. Variables: {producto} {llave} {link}.","maxLength":1000},"transferEnabled":{"type":"boolean","description":"Cobrar por transferencia a una llave (Bre-B / Nequi), sin pasarela."},"wompiEnabled":{"type":"boolean","description":"Cobro por pasarela (Nequi push y Daviplata). Apagarlo no borra las\n credenciales: se conservan para cuando se vuelva a encender."},"wompiTarjetaEnabled":{"type":"boolean","description":"Ofrece el pago con tarjeta por el enlace de Wompi (Web Checkout). Requiere\nel secreto de integridad."},"transferKey":{"type":"string","nullable":true,"description":"Llave Bre-B (@usuario, correo, celular) o número Nequi que recibe.","maxLength":120},"transferHolder":{"type":"string","nullable":true,"description":"Titular de la cuenta; se le muestra al cliente antes de que transfiera.","maxLength":120},"transferInstructions":{"type":"string","nullable":true,"description":"Texto libre que acompaña a la llave en el mensaje al cliente.","maxLength":500},"transferAmountCode":{"type":"boolean","description":"Código de control para identificar la orden cuando hay colisión: se\n cobra el neto si está libre, y si no, se baja de a un peso."},"resendLimitPerDay":{"type":"number","description":"Reenvíos de licencia que el bot puede hacer al mismo cliente por día. 0 = solo una persona.","minimum":0,"maximum":20},"receiptMode":{"type":"string","description":"MANUAL = lo aprueba una persona · AUTO = entrega si el monto cuadra.","enum":["MANUAL","AUTO"]},"transferExpiryHours":{"type":"number","description":"Horas que la orden espera la transferencia antes de expirar (1 a 168).","minimum":1,"maximum":168},"cobroTemplateName":{"type":"string","nullable":true,"description":"Plantilla aprobada para enviar un cobro agrupado con la ventana de 24 h\n cerrada. Variables: {{1}} nombre, {{2}} pedidos, {{3}} total, {{4}} llave.\n null la quita.","maxLength":512},"cobroTemplateLang":{"type":"string","nullable":true,"maxLength":16},"transferSellWithoutStock":{"type":"boolean","description":"Vender también lo que no tiene existencias (lo cierra un asesor)."},"sellingCurrency":{"type":"string","description":"Moneda con la que la organización le vende a SUS clientes.","enum":["COP","USD","MXN"]},"fxMarginPercent":{"type":"number","description":"Margen sobre la tasa oficial al convertir a otra moneda, en porcentaje.","minimum":0,"maximum":50},"inboxHost":{"type":"string","nullable":true,"description":"Bandeja donde caen las notificaciones del banco.","maxLength":255},"inboxPort":{"type":"number","minimum":1,"maximum":65535},"inboxUser":{"type":"string","nullable":true,"maxLength":255},"inboxPassword":{"type":"string","nullable":true,"description":"Se recibe en claro y se guarda cifrada. Enviar '' para borrar.","maxLength":500},"inboxTls":{"type":"boolean"},"inboxSenderDomain":{"type":"string","description":"Dominio que debe haber FIRMADO el correo para darlo por bueno.","maxLength":255},"inboxForwarderAddress":{"type":"string","nullable":true,"description":"Buzón desde el que se reenvía (p. ej. `alguien@outlook.com`). Vacío = solo\nvale la firma del banco. Baja el listón: ver el docblock en el esquema.","maxLength":255},"inboxProcessedFolder":{"type":"string","nullable":true,"description":"Carpeta a la que mover los correos ya registrados (p. ej. `Procesados`).\nVacío = se quedan en la bandeja de entrada.","maxLength":255},"inboxDeleteAfterRead":{"type":"boolean","description":"true = eliminar los correos ya registrados tras leerlos (no llenar la\n bandeja) en vez de moverlos a una carpeta."},"inboxMode":{"type":"string","description":"OFF = no se lee · SUGGEST = propone · AUTO = aprueba y entrega.","enum":["OFF","SUGGEST","AUTO"]},"matchWindowHours":{"type":"number","description":"Horas hacia atrás en las que se busca un pago para una orden (1 a 168).","minimum":1,"maximum":168},"binanceEnabled":{"type":"boolean"},"binancePayId":{"type":"string","nullable":true,"description":"Alias o correo de Binance Pay que se le muestra al cliente. No es secreto.","maxLength":120},"binanceApiKey":{"type":"string","nullable":true,"description":"Clave y secreto de API. Se envían solo al cambiarlos; vacío = conservar el\nguardado. Nunca se devuelven. DEBEN ser de SOLO LECTURA.","maxLength":200},"binanceApiSecret":{"type":"string","nullable":true,"maxLength":200},"binanceAsset":{"type":"string","description":"Moneda del cobro (la estable en dólares, por defecto).","maxLength":16},"binanceExpiryHours":{"type":"number","description":"Horas que el pedido espera el pago antes de liberar las llaves (1 a 168).","minimum":1,"maximum":168},"nombreBinance":{"type":"string","nullable":true,"description":"Nombre de los medios sin cuenta propia en reportes y webhooks. Vacío o\nnull = el de siempre («Binance», «Nequi», «Daviplata», «Tarjeta»).","maxLength":60},"nombreNequiPasarela":{"type":"string","nullable":true,"maxLength":60},"nombreDaviplataPasarela":{"type":"string","nullable":true,"maxLength":60},"nombreTarjetaPasarela":{"type":"string","nullable":true,"maxLength":60},"binanceMode":{"type":"string","description":"OFF = no se lee · SUGGEST = propone · AUTO = confirma y entrega.","enum":["OFF","SUGGEST","AUTO"]},"lowStockThreshold":{"type":"number","description":"Umbral de stock bajo (0 = sin alerta).","minimum":0},"maxPerCustomer":{"type":"number","description":"Máximo de licencias por cliente en la ventana (0 = sin límite).","minimum":0,"maximum":1000},"maxPerCustomerDays":{"type":"number","description":"Ventana (días) del límite por cliente.","minimum":1,"maximum":365},"renewalEnabled":{"type":"boolean","description":"Avisar al cliente antes de que se le venza la licencia."},"renewalDaysBefore":{"type":"number","description":"Días de antelación del primer aviso (1 a 90).","minimum":1,"maximum":90},"renewalSecondNotice":{"type":"boolean","description":"Segundo aviso el mismo día del vencimiento."},"renewalOnlyBusinessHours":{"type":"boolean","description":"Avisar solo dentro del horario de atención de la organización."},"renewalPhoneNumberId":{"type":"string","nullable":true,"description":"Número emisor del aviso para las ventas que no guardan el suyo.","format":"uuid"},"renewalOnYes":{"type":"string","description":"Qué hacer cuando el cliente dice que sí.","enum":["HANDOFF","BOT","TAG"]}}},"SetPaidAddonDto":{"type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"]},"CreateLicenseCouponDto":{"type":"object","properties":{"code":{"type":"string","maxLength":40},"discountType":{"type":"string","enum":["PERCENT","FIXED"]},"discountValue":{"type":"number","description":"PERCENT: 1-100 ; FIXED: centavos a descontar.","minimum":1},"productId":{"type":"string","description":"Acota a un producto; omitir = cualquiera.","format":"uuid"},"active":{"type":"boolean"},"maxRedemptions":{"type":"number","minimum":1},"expiresAt":{"type":"string","description":"ISO date; omitir = sin vencimiento."}},"required":["code","discountValue"]},"UpdateLicenseCouponDto":{"type":"object","properties":{"code":{"type":"string","maxLength":40},"discountType":{"type":"string","enum":["PERCENT","FIXED"]},"discountValue":{"type":"number","minimum":1},"productId":{"type":"string","nullable":true,"format":"uuid"},"active":{"type":"boolean"},"maxRedemptions":{"type":"number","nullable":true,"minimum":1},"expiresAt":{"type":"string","nullable":true}}},"CreatePriceListDto":{"type":"object","properties":{"name":{"type":"string","maxLength":80},"tagNames":{"description":"Etiquetas que activan la lista (por nombre, sin distinguir mayúsculas).","maxItems":20,"type":"array","items":{"type":"string","maxLength":60}},"discountPercent":{"type":"number","description":"Descuento general sobre el precio de lista (0-100).","minimum":0,"maximum":100},"priority":{"type":"number","description":"Si varias listas coinciden, gana la de menor prioridad.","minimum":0,"maximum":1000},"active":{"type":"boolean"}},"required":["name"]},"UpdatePriceListDto":{"type":"object","properties":{"name":{"type":"string","maxLength":80},"tagNames":{"maxItems":20,"type":"array","items":{"type":"string","maxLength":60}},"discountPercent":{"type":"number","minimum":0,"maximum":100},"priority":{"type":"number","minimum":0,"maximum":1000},"active":{"type":"boolean"}}},"SetPriceListItemDto":{"type":"object","properties":{"productId":{"type":"string","format":"uuid"},"variantId":{"type":"string","nullable":true,"format":"uuid"},"priceCents":{"type":"number","nullable":true,"minimum":0,"maximum":2000000000}},"required":["productId"]},"CreateDigitalProductDto":{"type":"object","properties":{"name":{"type":"string","maxLength":160},"description":{"type":"string","maxLength":2000},"sku":{"type":"string","maxLength":80},"category":{"type":"string","description":"Categoría libre para agrupar y filtrar en el panel.","maxLength":60},"imageUrl":{"type":"string","description":"URLs con @IsUrl http/https: instructionsUrl alimenta un shortlink PÚBLICO\n en el dominio de la plataforma — sin validar era un open redirect.","maxLength":2048,"format":"uri"},"priceCents":{"type":"number","description":"Precio en centavos de la moneda (evita floats).","minimum":0},"durationDays":{"type":"number","nullable":true,"description":"Días que dura lo vendido, contados desde la ENTREGA. Omitir o `null` =\n no vence (licencia perpetua), que es como se ha comportado siempre.","minimum":1,"maximum":3650},"renewalNoticeEnabled":{"type":"boolean","description":"Si entra en el aviso de renovación. Hay cosas que se venden una vez."},"currency":{"type":"string","description":"Moneda ISO-4217 (3 letras mayúsculas). Por defecto COP.","enum":["COP","USD","MXN"]},"instructionsUrl":{"type":"string","maxLength":2048,"format":"uri"},"entregaModo":{"type":"string","description":"Modo de entrega: AUTOMATICA (entrega una llave del inventario), ASISTIDA\n (venta automática, la entrega un asesor; no usa inventario) o CONSULTAR\n (si no hay stock no dice \"agotado\": deriva a un asesor para reconfirmar).","enum":["AUTOMATICA","ASISTIDA","CONSULTAR"]},"datoAdicionalLabel":{"type":"string","nullable":true,"description":"Dato adicional a pedir al cliente para este producto (ej. \"correo\").","maxLength":80},"datoAdicionalRequerido":{"type":"boolean","description":"Si ese dato es obligatorio antes de cerrar la venta."},"active":{"type":"boolean"}},"required":["name","priceCents"]},"BulkImportProductsDto":{"type":"object","properties":{"products":{"description":"Productos a crear en lote (import Excel/CSV desde la UI).","maxItems":500,"type":"array","items":{"$ref":"#/components/schemas/CreateDigitalProductDto"}},"actualizarExistentes":{"type":"boolean","description":"Si un producto ya existe (por SKU o nombre), actualizarlo con lo que\n trae la fila en vez de saltarlo. Cierra el ciclo exportar → editar en\n hoja de cálculo → importar."}},"required":["products"]},"BulkProductPatchDto":{"type":"object","properties":{"active":{"type":"boolean"},"entregaModo":{"type":"string","enum":["AUTOMATICA","ASISTIDA","CONSULTAR"]},"category":{"type":"string","nullable":true,"description":"null = quitar la categoría.","maxLength":60},"renewalNoticeEnabled":{"type":"boolean"},"durationDays":{"type":"number","nullable":true,"description":"null = no vence.","minimum":1,"maximum":3650},"datoAdicionalLabel":{"type":"string","nullable":true,"maxLength":80},"datoAdicionalRequerido":{"type":"boolean"}}},"BulkUpdateProductsDto":{"type":"object","properties":{"patch":{"$ref":"#/components/schemas/BulkProductPatchDto"},"productIds":{"minItems":1,"maxItems":200,"type":"array","items":{"type":"string","format":"uuid"}}},"required":["patch","productIds"]},"BulkPriceProductsDto":{"type":"object","properties":{"modo":{"type":"string","description":"PORCENTAJE: valor = +10 / -15. MONTO: centavos a sumar o restar. FIJO: precio en centavos.","enum":["PORCENTAJE","MONTO","FIJO"]},"valor":{"type":"number"},"redondeo":{"type":"string","enum":["PESO","CIEN","MIL"]},"incluirVariantes":{"type":"boolean","description":"Aplicar también a las variantes de esos productos."},"soloVistaPrevia":{"type":"boolean","description":"Solo calcular el antes/después, sin guardar."},"productIds":{"minItems":1,"maxItems":200,"type":"array","items":{"type":"string","format":"uuid"}}},"required":["modo","valor","productIds"]},"BulkProductIdsDto":{"type":"object","properties":{"productIds":{"minItems":1,"maxItems":200,"type":"array","items":{"type":"string","format":"uuid"}}},"required":["productIds"]},"BulkPriceListItemsDto":{"type":"object","properties":{"productIds":{"minItems":1,"maxItems":200,"type":"array","items":{"type":"string","format":"uuid"}},"modo":{"type":"string","description":"PORCENTAJE_DEL_BASE: valor = descuento (15 = 15 % menos). FIJO: centavos.","enum":["PORCENTAJE_DEL_BASE","COPIAR_BASE","FIJO","QUITAR"]},"valor":{"type":"number"},"redondeo":{"type":"string","enum":["PESO","CIEN","MIL"]},"incluirVariantes":{"type":"boolean"}},"required":["productIds","modo"]},"UpdateDigitalProductDto":{"type":"object","properties":{"name":{"type":"string","maxLength":160},"description":{"type":"string","nullable":true,"maxLength":2000},"sku":{"type":"string","nullable":true,"maxLength":80},"category":{"type":"string","nullable":true,"maxLength":60},"imageUrl":{"type":"string","nullable":true,"maxLength":2048,"format":"uri"},"priceCents":{"type":"number","minimum":0},"durationDays":{"type":"number","nullable":true,"description":"Días que dura lo vendido, contados desde la ENTREGA. Omitir o `null` =\n no vence (licencia perpetua), que es como se ha comportado siempre.","minimum":1,"maximum":3650},"renewalNoticeEnabled":{"type":"boolean","description":"Si entra en el aviso de renovación."},"currency":{"type":"string","enum":["COP","USD","MXN"]},"instructionsUrl":{"type":"string","nullable":true,"maxLength":2048,"format":"uri"},"entregaModo":{"type":"string","enum":["AUTOMATICA","ASISTIDA","CONSULTAR"]},"datoAdicionalLabel":{"type":"string","nullable":true,"maxLength":80},"datoAdicionalRequerido":{"type":"boolean"},"active":{"type":"boolean"}}},"CartItemDto":{"type":"object","properties":{"productId":{"type":"string","format":"uuid"},"variantId":{"type":"string","nullable":true,"description":"Requerida si el producto tiene variantes.","format":"uuid"},"quantity":{"type":"number","minimum":1,"maximum":50},"unitPriceCents":{"type":"number","description":"Precio unitario (centavos) fijado a mano; reemplaza el de lista.","minimum":0}},"required":["productId"]},"PreviewCarritoDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CartItemDto"}},"currency":{"type":"string","enum":["COP","USD","MXN"]}},"required":["items"]},"PrecioEnMonedaDto":{"type":"object","properties":{"currency":{"type":"string","enum":["COP","USD","MXN"]},"priceCents":{"type":"number","minimum":0,"maximum":2000000000},"variantId":{"type":"string","nullable":true,"description":"null / omitido = el precio del producto; con valor, el de esa variante.","format":"uuid"}},"required":["currency","priceCents"]},"SetProductPricesDto":{"type":"object","properties":{"precios":{"type":"array","items":{"$ref":"#/components/schemas/PrecioEnMonedaDto"}}},"required":["precios"]},"AddLicenseKeysDto":{"type":"object","properties":{"keys":{"description":"Llaves a cargar al pool del producto. Se normalizan (trim) y se ignoran\nduplicadas (dentro del lote y contra las ya existentes).","maxItems":10000,"type":"array","items":{"type":"string","maxLength":512}},"variantId":{"type":"string","description":"Variante destino de las llaves; omitir = pool general del producto.","format":"uuid"}},"required":["keys"]},"CreateCheckoutDto":{"type":"object","properties":{"variantId":{"type":"string","description":"Variante a vender (requerida si el producto tiene variantes).","format":"uuid"},"quantity":{"type":"number","description":"Cantidad de licencias a vender (1 a 50). Por defecto 1.","minimum":1,"maximum":50},"method":{"type":"string","description":"Método de cobro. Por defecto NEQUI.\nTRANSFERENCIA = el cliente transfiere el monto exacto a la llave y el pago\nse confirma aparte; no pasa por pasarela.","enum":["NEQUI","DAVIPLATA","TRANSFERENCIA","BINANCE","TARJETA"]},"nequiPhone":{"type":"string","description":"Teléfono Nequi del cliente (10 dígitos CO) — requerido para NEQUI.","maxLength":20},"transferAccountId":{"type":"string","description":"A qué cuenta de banco transfiere. Vacío = la llave, si la hay.","format":"uuid"},"userLegalId":{"type":"string","description":"Cédula del cliente — requerida para DAVIPLATA.","maxLength":20},"userLegalIdType":{"type":"string","enum":["CC","CE","NIT","PP","TI"]},"customerEmail":{"type":"string","format":"email"},"couponCode":{"type":"string","description":"Código de cupón de descuento (opcional).","maxLength":40},"contactId":{"type":"string","format":"uuid"},"phoneNumberId":{"type":"string","description":"Número emisor de WhatsApp para entregar la licencia.","format":"uuid"},"recipientWaId":{"type":"string","description":"WhatsApp destino (waId, sin '+'). Por defecto 57 + Nequi.","maxLength":20},"currency":{"type":"string","description":"Moneda con la que se le cobra a este cliente.","enum":["COP","USD","MXN"]}}},"CreateRenewalTemplateDto":{"type":"object","properties":{"wabaId":{"type":"string","description":"WABA donde crearla. Obligatorio solo si la organización tiene varias.","format":"uuid"},"name":{"type":"string","description":"Nombre de la plantilla en Meta (minúsculas y guiones bajos).","maxLength":120},"language":{"type":"string","maxLength":8},"bodyText":{"type":"string","description":"Texto del cuerpo, si se editó el sugerido. Debe conservar {{1}} {{2}} {{3}}.","maxLength":1024}}},"SetOrderExpirationDto":{"type":"object","properties":{"expiresAt":{"type":"string","nullable":true}}},"ReplaceLicenseKeyDto":{"type":"object","properties":{"source":{"type":"string","description":"'inventory' (por defecto): saca la nueva del pool disponible. 'manual':\n usa la llave pegada en `replacementValue`.","enum":["inventory","manual"]},"replacementValue":{"type":"string","description":"Llave nueva a mano (obligatoria si source='manual').","maxLength":500},"reason":{"type":"string","description":"Motivo del reemplazo (trazabilidad; ej. \"no activó\").","maxLength":500},"notify":{"type":"boolean","description":"Enviar al cliente el aviso de cambio de llave. Por defecto true."}}},"BuzonDeAvisosDto":{"type":"object","properties":{"host":{"type":"string","maxLength":255,"description":"Servidor IMAP (solo el dominio)."},"port":{"type":"number","minimum":1,"maximum":65535,"default":993},"user":{"type":"string","maxLength":255,"description":"Usuario: la dirección del correo."},"password":{"type":"string","nullable":true,"maxLength":500,"description":"Contraseña. Al editar, vacía = se conserva la guardada."},"tls":{"type":"boolean","default":true},"processedFolder":{"type":"string","nullable":true,"maxLength":255,"description":"Carpeta a la que mover los avisos ya registrados."},"deleteAfterRead":{"type":"boolean","description":"Borrar los avisos ya registrados."},"llaveIds":{"description":"Llaves que avisan a este correo (reemplaza la lista). Una llave avisa a un solo correo.","type":"array","items":{"type":"string","format":"uuid"}}}},"ConciliarPagoDto":{"type":"object","properties":{"orderId":{"type":"string","format":"uuid"}},"required":["orderId"]},"ConciliarCobroDto":{"type":"object","properties":{"cobroId":{"type":"string","format":"uuid"}},"required":["cobroId"]},"CrearCobroAgrupadoDto":{"type":"object","properties":{"contactId":{"type":"string","format":"uuid","description":"Contacto al que se le cobra."},"orderIds":{"description":"Pedidos a incluir. Vacío = todos los que el cliente debe (fiados y esperando pago).","type":"array","items":{"type":"string","format":"uuid"}},"conversationId":{"type":"string","format":"uuid","description":"Chat por el que se envía el cobro."}},"required":["contactId"]},"CrearCobroLibreDto":{"type":"object","properties":{"contactId":{"type":"string","format":"uuid","description":"Contacto al que se le cobra."},"conversationId":{"type":"string","format":"uuid","description":"Chat por el que se envía el cobro."},"concepto":{"type":"string","maxLength":120,"description":"Qué se cobra («Hosting 12 meses midominio.com»). Con factura de Mosend puede ir vacío."},"montoCents":{"type":"number","minimum":100000,"description":"Monto en centavos de peso colombiano. Con factura de Mosend, vacío = su saldo."},"invoiceId":{"type":"string","format":"uuid","description":"Factura de la plataforma Mosend que abona (solo la organización que opera Mosend)."},"perfilDeCobroId":{"type":"string","format":"uuid","description":"Marca que cobra, por encima de la del número (en un número que atiende varias marcas). Vacío = la del número."}},"required":["contactId"]},"PerfilDeCobroDto":{"type":"object","properties":{"nombre":{"type":"string","maxLength":60,"description":"Nombre de la marca («Moshipp»)."},"llaveId":{"type":"string","nullable":true,"format":"uuid","description":"Llave con la que cobra la marca. null = no cobra por llave. La marca principal cobra con la llave activa de la organización."},"alPagar":{"type":"string","enum":["TAREA","FACTURA_MOSEND"],"description":"Qué pasa cuando se paga un cobro libre: TAREA (tarea para el equipo) o FACTURA_MOSEND (abona a la factura de la plataforma; solo la organización que opera Mosend)."},"aceptaWompi":{"type":"boolean","description":"Si la marca ofrece la pasarela (Wompi)."},"aceptaBinance":{"type":"boolean","description":"Si la marca ofrece Binance."},"phoneNumberIds":{"description":"Números que atiende la marca (reemplaza la lista). Los que se quitan vuelven a la principal.","type":"array","items":{"type":"string","format":"uuid"}},"ordenDeMedios":{"description":"Orden en que el asistente ofrece los medios cuando el cliente no pide uno: `llave`, `cuenta:<id>`, `wompi`, `tarjeta`, `binance`. Lo que falte va al final.","type":"array","items":{"type":"string","maxLength":60}},"wompiEnv":{"type":"string","enum":["test","prod"]},"wompiPublicKey":{"type":"string","nullable":true,"maxLength":200,"description":"Wompi propio: llave pública."},"wompiPrivateKey":{"type":"string","nullable":true,"maxLength":200,"description":"Wompi propio: llave privada."},"wompiEventsSecret":{"type":"string","nullable":true,"maxLength":200,"description":"Wompi propio: secreto de eventos."},"wompiIntegritySecret":{"type":"string","nullable":true,"maxLength":200,"description":"Wompi propio: secreto de integridad."}}},"AnularCobroAgrupadoDto":{"type":"object","properties":{"motivo":{"type":"string","maxLength":300}}},"ReasignarPagoDto":{"type":"object","properties":{"orderId":{"type":"string","description":"Pedido que se queda con el pago.","format":"uuid"},"nota":{"type":"string","description":"Por qué se movió; queda en el pago y en la auditoría.","maxLength":500}},"required":["orderId"]},"IgnorarPagoDto":{"type":"object","properties":{"nota":{"type":"string","maxLength":500}}},"CambiarMedioDelPedidoDto":{"type":"object","properties":{"medio":{"type":"string","description":"`llave` (la de la marca), `cuenta:<id>` o `tarjeta` (enlace de pago de\nWompi; con `avisarCliente` se le manda el botón).","pattern":"^(llave|tarjeta|cuenta:[0-9a-f-]{36})$"},"avisarCliente":{"type":"boolean","description":"Mandarle al cliente los datos nuevos por el chat."}},"required":["medio"]},"ConfirmarPagoManualDto":{"type":"object","properties":{"medio":{"type":"string","pattern":"^(llave|cuenta):[0-9a-f-]{36}$","description":"Por dónde entró el dinero: `llave:<id>` o `cuenta:<id>`. El pedido pasa a ese medio; sin el dato se queda con el que tenía."},"comprobanteMediaId":{"type":"string","format":"uuid","description":"Captura del pago (id de un archivo subido a la organización). Queda como comprobante aprobado."}}},"CompletarEntregaDto":{"type":"object","properties":{"llaves":{"description":"Llaves que el asesor entrega a mano (una por elemento o por línea). Se\n registran en la venta como licencias ENTREGADAS y se envían con la\n plantilla de entrega e instrucciones. Sin `llaves`, se marca entregada\n con el `mensaje` libre (comportamiento histórico).","maxItems":50,"type":"array","items":{"type":"string","maxLength":500}},"mensaje":{"type":"string","description":"Nota adicional para el cliente, después de la entrega.","maxLength":4096},"notificar":{"type":"boolean","description":"false = registrar la llave sin escribirle al cliente. Default true."}}},"RefundOrderDto":{"type":"object","properties":{"reason":{"type":"string","description":"Motivo del reembolso (trazabilidad).","maxLength":500}}},"SellToConversationDto":{"type":"object","properties":{"productId":{"type":"string","format":"uuid"},"variantId":{"type":"string","description":"Variante a vender (requerida si el producto tiene variantes).","format":"uuid"},"quantity":{"type":"number","description":"Cantidad de licencias a vender (1 a 50). Por defecto 1.","minimum":1,"maximum":50},"method":{"type":"string","enum":["NEQUI","DAVIPLATA","TRANSFERENCIA","BINANCE","TARJETA"]},"nequiPhone":{"type":"string","maxLength":20},"transferAccountId":{"type":"string","description":"A qué cuenta de banco transfiere. Vacío = la llave, si la hay.","format":"uuid"},"userLegalId":{"type":"string","maxLength":20},"userLegalIdType":{"type":"string","enum":["CC","CE","NIT","PP","TI"]},"customerEmail":{"type":"string","format":"email"},"couponCode":{"type":"string","maxLength":40},"entregarYa":{"type":"boolean","description":"Solo Bre-B (TRANSFERENCIA): entrega la licencia YA (fiado) y deja el cobro\n pendiente; el conciliador lo marca pagado cuando entra la transferencia."},"notify":{"type":"boolean","description":"¿Enviar al cliente el mensaje \"gracias por tu compra\"? Por defecto sí."},"unitPriceCents":{"type":"number","description":"Precio unitario (centavos) fijado a mano por el asesor: reemplaza el de\n lista/etiqueta y es lo que se cobra. Omitir = precio de lista.","minimum":0},"currency":{"type":"string","description":"Moneda con la que se le cobra a este cliente. Omitir = la que toque por\n el contacto o por la organización.","enum":["COP","USD","MXN"]}},"required":["productId"]},"SellCartToConversationDto":{"type":"object","properties":{"items":{"minItems":1,"maxItems":20,"type":"array","items":{"$ref":"#/components/schemas/CartItemDto"}},"method":{"type":"string","enum":["NEQUI","TRANSFERENCIA"]},"nequiPhone":{"type":"string","maxLength":20},"transferAccountId":{"type":"string","description":"A qué cuenta de banco transfiere. Vacío = la llave, si la hay.","format":"uuid"},"customerEmail":{"type":"string","format":"email"},"entregarYa":{"type":"boolean","description":"Solo Bre-B: entrega ya (fiado) y concilia el cobro después."},"notify":{"type":"boolean","description":"¿Enviar el mensaje \"gracias por tu compra\"? Por defecto sí."},"currency":{"type":"string","description":"Moneda con la que se le cobra a este cliente.","enum":["COP","USD","MXN"]}},"required":["items"]},"DispatchDto":{"type":"object","properties":{"productId":{"type":"string","format":"uuid"},"variantId":{"type":"string","description":"Variante a entregar (si el producto tiene variantes).","format":"uuid"},"quantity":{"type":"number","description":"Cantidad de licencias a entregar (1 a 50). Por defecto 1.","minimum":1,"maximum":50}},"required":["productId"]},"RegistrarVentaManualDto":{"type":"object","properties":{"productId":{"type":"string","format":"uuid"},"variantId":{"type":"string","format":"uuid"},"quantity":{"type":"number","minimum":1,"maximum":50},"entregar":{"type":"boolean","description":"¿Entregar ya la licencia?"},"pagado":{"type":"boolean","description":"¿El cliente ya pagó? (false = fiado / por cobrar)."},"unitPriceCents":{"type":"number","description":"Precio unitario a facturar en centavos (override del asesor: descuento u\n otro acuerdo). Si se omite, se usa el de la lista.","minimum":0,"maximum":2000000000},"notify":{"type":"boolean","description":"¿Enviar al cliente el mensaje \"gracias por tu compra\"? Por defecto sí."},"currency":{"type":"string","description":"Moneda con la que se le cobra a este cliente.","enum":["COP","USD","MXN"]}},"required":["productId","entregar","pagado"]},"ManualCartItemDto":{"type":"object","properties":{"productId":{"type":"string","format":"uuid"},"variantId":{"type":"string","nullable":true,"format":"uuid"},"quantity":{"type":"number","minimum":1,"maximum":50},"unitPriceCents":{"type":"number","minimum":0,"maximum":2000000000}},"required":["productId"]},"VentaManualCarritoDto":{"type":"object","properties":{"items":{"minItems":1,"maxItems":20,"type":"array","items":{"$ref":"#/components/schemas/ManualCartItemDto"}},"entregar":{"type":"boolean","description":"¿Entregar ya las licencias?"},"pagado":{"type":"boolean","description":"¿El cliente ya pagó? (false = fiado / por cobrar)."},"notify":{"type":"boolean","description":"¿Enviar el mensaje \"gracias por tu compra\"? Por defecto sí."},"currency":{"type":"string","description":"Moneda con la que se le cobra a este cliente.","enum":["COP","USD","MXN"]}},"required":["items","entregar","pagado"]},"CreateVariantDto":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"priceCents":{"type":"number","minimum":0},"durationDays":{"type":"number","nullable":true,"description":"Días que dura lo vendido, contados desde la ENTREGA. Omitir o `null` =\n no vence (licencia perpetua), que es como se ha comportado siempre.","minimum":1,"maximum":3650},"sortOrder":{"type":"number","minimum":0,"maximum":9999}},"required":["name","priceCents"]},"UpdateVariantDto":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"priceCents":{"type":"number","minimum":0},"durationDays":{"type":"number","nullable":true,"description":"Días que dura lo vendido, contados desde la ENTREGA. Omitir o `null` =\n no vence (licencia perpetua), que es como se ha comportado siempre.","minimum":1,"maximum":3650},"active":{"type":"boolean"},"sortOrder":{"type":"number","minimum":0,"maximum":9999}}},"SubmitOtpDto":{"type":"object","properties":{"code":{"type":"string","description":"Código OTP que le llegó al cliente por SMS (Daviplata).","maxLength":10}},"required":["code"]},"DescartarEnMasaDto":{"type":"object","properties":{"items":{"type":"array","maxItems":100,"description":"Qué descartar. Hasta 100 por llamada.","items":{"type":"object"}},"reason":{"type":"string","minLength":3,"maxLength":500,"description":"Por qué. En los comprobantes lo lee el cliente."}},"required":["items","reason"]},"CuentaDeTransferenciaDto":{"type":"object","properties":{"label":{"type":"string","maxLength":60,"description":"Cómo la ve el cliente en la lista.","example":"Bancolombia ahorros"},"bankName":{"type":"string","nullable":true,"maxLength":80,"description":"Banco o entidad."},"accountKind":{"type":"string","enum":["AHORROS","CORRIENTE","NEQUI","LLAVE","OTRO"],"description":"Tipo de cuenta.","default":"AHORROS"},"accountNumber":{"type":"string","maxLength":60,"description":"Número de cuenta, llave Bre-B o celular de Nequi."},"holder":{"type":"string","nullable":true,"maxLength":120,"description":"Titular de la cuenta."},"holderDoc":{"type":"string","nullable":true,"maxLength":40,"description":"Documento del titular."},"instructions":{"type":"string","nullable":true,"maxLength":500,"description":"Texto que acompaña a esta cuenta."},"qrMediaId":{"type":"string","nullable":true,"format":"uuid","description":"MediaAsset del QR de esta cuenta."},"senderDomain":{"type":"string","nullable":true,"maxLength":120,"description":"Dominio que firma los correos de aviso de este banco, para conciliar (ej. bancolombia.com.co)."},"currency":{"type":"string","nullable":true,"maxLength":3,"description":"En qué moneda recibe esta cuenta (ISO 4217). Vacío = cualquiera. Solo se le ofrece a quien paga en esa moneda.","example":"MXN"},"enabled":{"type":"boolean","description":"Si se le ofrece al cliente."},"perfilIds":{"description":"Marcas (perfiles de cobro) que ofrecen esta cuenta. Vacío = todas: cuenta compartida. Sin enviar al crear = la marca principal.","type":"array","items":{"type":"string","format":"uuid"}},"llaveAvisoId":{"type":"string","nullable":true,"format":"uuid","description":"Llave cuyos avisos de pago confirman también los pagos a esta cuenta (la cuenta de banco que está detrás de la llave). null = se confirma con comprobante."}},"required":["label","accountNumber"]},"EditarCuentaDeTransferenciaDto":{"type":"object","properties":{"label":{"type":"string","maxLength":60,"description":"Cómo la ve el cliente en la lista.","example":"Bancolombia ahorros"},"bankName":{"type":"string","nullable":true,"maxLength":80,"description":"Banco o entidad."},"accountKind":{"type":"string","enum":["AHORROS","CORRIENTE","NEQUI","LLAVE","OTRO"],"description":"Tipo de cuenta.","default":"AHORROS"},"accountNumber":{"type":"string","maxLength":60,"description":"Número de cuenta, llave Bre-B o celular de Nequi."},"holder":{"type":"string","nullable":true,"maxLength":120,"description":"Titular de la cuenta."},"holderDoc":{"type":"string","nullable":true,"maxLength":40,"description":"Documento del titular."},"instructions":{"type":"string","nullable":true,"maxLength":500,"description":"Texto que acompaña a esta cuenta."},"qrMediaId":{"type":"string","nullable":true,"format":"uuid","description":"MediaAsset del QR de esta cuenta."},"senderDomain":{"type":"string","nullable":true,"maxLength":120,"description":"Dominio que firma los correos de aviso de este banco, para conciliar (ej. bancolombia.com.co)."},"currency":{"type":"string","nullable":true,"maxLength":3,"description":"En qué moneda recibe esta cuenta (ISO 4217). Vacío = cualquiera. Solo se le ofrece a quien paga en esa moneda.","example":"MXN"},"enabled":{"type":"boolean","description":"Si se le ofrece al cliente."},"perfilIds":{"description":"Marcas (perfiles de cobro) que ofrecen esta cuenta. Vacío = todas: cuenta compartida. Sin enviar al crear = la marca principal.","type":"array","items":{"type":"string","format":"uuid"}},"llaveAvisoId":{"type":"string","nullable":true,"format":"uuid","description":"Llave cuyos avisos de pago confirman también los pagos a esta cuenta (la cuenta de banco que está detrás de la llave). null = se confirma con comprobante."}}},"ReordenarCuentasDto":{"type":"object","properties":{"ids":{"maxItems":10,"description":"Todas las cuentas de la organización, en el orden deseado.","type":"array","items":{"type":"string","format":"uuid"}}},"required":["ids"]},"LlaveDeCobroDto":{"type":"object","properties":{"label":{"type":"string","maxLength":60,"description":"Cómo se ve en el panel.","example":"Bancolombia @licenciadigital"},"entity":{"type":"string","enum":["NEQUI","BANCOLOMBIA"],"description":"Entidad de la llave: decide cómo se lee su aviso de pago.","default":"NEQUI"},"key":{"type":"string","maxLength":120,"description":"La llave que se le da al cliente (@usuario, celular, correo).","example":"@licenciadigital"},"holder":{"type":"string","nullable":true,"maxLength":120,"description":"Titular que ve el cliente."},"instructions":{"type":"string","nullable":true,"maxLength":500,"description":"Texto que acompaña a la llave."},"senderDomain":{"type":"string","nullable":true,"maxLength":120,"description":"Dominio que firma los avisos de pago de esta llave. Vacío = el de la entidad."},"forwarderAddress":{"type":"string","nullable":true,"maxLength":320,"description":"Buzón de confianza que reenvía los avisos, si el intermediario rompe la firma del banco."},"autoApprove":{"type":"boolean","description":"Con la bandeja en «aprobar solo», si los pagos de esta llave se aprueban solos. Una llave nueva empieza en false (solo sugerir)."},"buzonId":{"type":"string","nullable":true,"format":"uuid","description":"Correo (buzón de avisos) al que llegan los avisos de pago de esta llave. null = ninguno: sus pagos no se confirman solos."}},"required":["label","key"]},"EditarLlaveDeCobroDto":{"type":"object","properties":{"label":{"type":"string","maxLength":60,"description":"Cómo se ve en el panel.","example":"Bancolombia @licenciadigital"},"entity":{"type":"string","enum":["NEQUI","BANCOLOMBIA"],"description":"Entidad de la llave: decide cómo se lee su aviso de pago.","default":"NEQUI"},"key":{"type":"string","maxLength":120,"description":"La llave que se le da al cliente (@usuario, celular, correo).","example":"@licenciadigital"},"holder":{"type":"string","nullable":true,"maxLength":120,"description":"Titular que ve el cliente."},"instructions":{"type":"string","nullable":true,"maxLength":500,"description":"Texto que acompaña a la llave."},"senderDomain":{"type":"string","nullable":true,"maxLength":120,"description":"Dominio que firma los avisos de pago de esta llave. Vacío = el de la entidad."},"forwarderAddress":{"type":"string","nullable":true,"maxLength":320,"description":"Buzón de confianza que reenvía los avisos, si el intermediario rompe la firma del banco."},"autoApprove":{"type":"boolean","description":"Con la bandeja en «aprobar solo», si los pagos de esta llave se aprueban solos. Una llave nueva empieza en false (solo sugerir)."},"buzonId":{"type":"string","nullable":true,"format":"uuid","description":"Correo (buzón de avisos) al que llegan los avisos de pago de esta llave. null = ninguno: sus pagos no se confirman solos."}}},"RevisarComprobanteDto":{"type":"object","properties":{"note":{"type":"string","nullable":true,"maxLength":500,"description":"Nota interna de quien revisa."}}},"RechazarComprobanteDto":{"type":"object","properties":{"reason":{"type":"string","minLength":3,"maxLength":500,"description":"Por qué se rechaza. El cliente lo va a leer.","example":"El comprobante es de otro monto."}},"required":["reason"]},"RechargePackDto":{"type":"object","properties":{"amountUsd":{"type":"number","minimum":0},"bonusUsd":{"type":"number","minimum":0}},"required":["amountUsd","bonusUsd"]},"UpdatePolicyDto":{"type":"object","properties":{"enabled":{"type":"boolean"},"signupCreditUsd":{"type":"number","minimum":0,"maximum":1000},"lowBalanceThresholdUsd":{"type":"number","minimum":0,"maximum":100},"softDailyLimitUsd":{"type":"number","minimum":0,"maximum":10000},"rechargePacks":{"type":"array","items":{"$ref":"#/components/schemas/RechargePackDto"}},"minCustomRechargeUsd":{"type":"number","minimum":0,"maximum":1000}}},"AdjustBalanceDto":{"type":"object","properties":{"amountUsd":{"type":"number"},"note":{"type":"string","maxLength":200}},"required":["amountUsd","note"]},"TemplateButtonDto":{"type":"object","properties":{"type":{"type":"string"},"text":{"type":"string"},"url":{"type":"string"},"phone_number":{"type":"string"},"example":{"type":"array","items":{"type":"string"}},"flow_id":{"type":"string"},"flow_action":{"type":"string"},"flow_name":{"type":"string"},"navigate_screen":{"type":"string"},"flow_json":{"type":"object"},"otp_type":{"type":"string","description":"Sub-tipo del botón OTP (plantillas AUTHENTICATION):\n COPY_CODE | ONE_TAP | ZERO_TAP — exigido por Meta cuando type='OTP'."},"autofill_text":{"type":"string"},"supported_apps":{"type":"string"},"package_name":{"type":"string"},"signature_hash":{"type":"string"},"copy_code_text":{"type":"string"},"catalog_action":{"type":"string"},"zero_tap_terms_accepted":{"type":"boolean"}},"required":["type"]},"TemplateCardDto":{"type":"object","properties":{"components":{"type":"array","items":{"$ref":"#/components/schemas/TemplateComponentDto"}}},"required":["components"]},"TemplateComponentDto":{"type":"object","properties":{"type":{"type":"string"},"format":{"type":"string"},"text":{"type":"string"},"example":{"type":"object"},"buttons":{"type":"array","items":{"$ref":"#/components/schemas/TemplateButtonDto"}},"cards":{"description":"Tarjetas del carrusel (cuando type=CAROUSEL).","type":"array","items":{"$ref":"#/components/schemas/TemplateCardDto"}},"limited_time_offer":{"type":"object","properties":{"text":{"type":"string"},"has_expiration":{"type":"boolean"}},"required":[]},"has_expiration":{"type":"boolean"},"add_security_recommendation":{"type":"string"},"code_expiration_minutes":{"type":"string"}},"required":["type"]},"CreateTemplateDto":{"type":"object","properties":{"wabaId":{"type":"string","format":"uuid"},"name":{"type":"string","minLength":1,"maxLength":512},"language":{"type":"string","maxLength":8},"category":{"type":"string","enum":["MARKETING","UTILITY","AUTHENTICATION"]},"components":{"type":"array","items":{"$ref":"#/components/schemas/TemplateComponentDto"}}},"required":["wabaId","name","language","category","components"]},"UpdateTemplateDto":{"type":"object","properties":{"components":{"type":"array","items":{"$ref":"#/components/schemas/TemplateComponentDto"}}},"required":["components"]},"CopiarPlantillaDto":{"type":"object","properties":{"wabaId":{"type":"string","format":"uuid"}},"required":["wabaId"]},"RequestCodeDto":{"type":"object","properties":{"waId":{"type":"string","maxLength":24}},"required":["waId"]},"VerifyCodeDto":{"type":"object","properties":{"waId":{"type":"string","maxLength":24},"code":{"type":"string","pattern":"^\\d{4,10}$"}},"required":["waId","code"]},"UpdatePublicPriceListDto":{"type":"object","properties":{"slug":{"type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]{1,38}[a-z0-9])$"},"title":{"type":"string","maxLength":120},"active":{"type":"boolean"},"senderPhoneNumberId":{"type":"string","nullable":true,"maxLength":64},"otpTemplateId":{"type":"string","nullable":true,"maxLength":64},"sessionDays":{"type":"number","minimum":1,"maximum":90},"showOutOfStock":{"type":"boolean"},"priceSource":{"type":"string","description":"Qué precio mostrar: 'contact' (por etiqueta del visitante), 'fixed' (una\n lista fija para todos), 'base' (solo precios normales).","enum":["contact","fixed","base"]},"fixedPriceListId":{"type":"string","nullable":true,"description":"Lista fija a mostrar cuando priceSource = 'fixed' (null para limpiar).","format":"uuid"},"showBaseComparison":{"type":"boolean","description":"Mostrar el precio base tachado junto al de la lista (el \"otro precio\")."},"ordersEnabled":{"type":"boolean","description":"Mostrar el botón «Pedir» (abre WhatsApp con el producto)."},"orderPhoneNumberId":{"type":"string","nullable":true,"description":"Número de la org que recibe los pedidos; null = el emisor del código.","format":"uuid"}}},"EnableNumberDto":{"type":"object","properties":{"waId":{"type":"string","maxLength":24},"note":{"type":"string","maxLength":200},"priceListId":{"type":"string","description":"Habilitarlo con una lista de precios (p. ej. «Revendedores»): se crea el\ncontacto y se le pone la etiqueta de esa lista. Sin esto ve precio de\ncliente final, porque un número habilitado no tiene etiquetas.","format":"uuid"}},"required":["waId"]},"CreateConectorDto":{"type":"object","properties":{"type":{"type":"string","enum":["WHMCS","PLESK","CPANEL","WORDPRESS","WOOCOMMERCE","MS365","HTTP"]},"name":{"type":"string","maxLength":80},"baseUrl":{"type":"string","maxLength":300},"authId":{"type":"string","description":"Identifier de la API Credential de WHMCS (permisos mínimos de lectura).","maxLength":200},"authSecret":{"type":"string","maxLength":200},"enabled":{"type":"boolean"},"enabledActions":{"type":"array","items":{"type":"string"}},"phoneNumberIds":{"description":"Canales donde el bot puede usarlo (ids de número). Vacío = todos.","maxItems":50,"type":"array","items":{"type":"string","format":"uuid"}},"paymentInstructions":{"type":"string","description":"Cómo pagar una factura de este sistema; el bot lo manda con la factura pendiente.","maxLength":600},"paymentGateway":{"type":"string","description":"WHMCS: método de pago (nombre de sistema, p. ej. banktransfer) con el que el bot registra transferencias.","maxLength":60},"customActions":{"description":"Solo type HTTP: acciones curadas por el dueño (el servicio las valida).","type":"array","items":{"type":"object"}}},"required":["type","name","baseUrl"]},"UpdateConectorDto":{"type":"object","properties":{"name":{"type":"string","maxLength":80},"baseUrl":{"type":"string","maxLength":300},"authId":{"type":"string","description":"Cadena vacía = borrar la credencial guardada.","maxLength":200},"authSecret":{"type":"string","maxLength":200},"enabled":{"type":"boolean"},"enabledActions":{"type":"array","items":{"type":"string"}},"phoneNumberIds":{"description":"Canales donde el bot puede usarlo (ids de número). Vacío = todos.","maxItems":50,"type":"array","items":{"type":"string","format":"uuid"}},"paymentInstructions":{"type":"string","description":"Cómo pagar una factura de este sistema; el bot lo manda con la factura pendiente.","maxLength":600},"paymentGateway":{"type":"string","description":"WHMCS: método de pago (nombre de sistema, p. ej. banktransfer) con el que el bot registra transferencias.","maxLength":60},"customActions":{"type":"array","items":{"type":"object"}}}},"EjecutarAccionDto":{"type":"object","properties":{"actionKey":{"type":"string","maxLength":80},"params":{"type":"object","description":"Parámetros de la acción; el servidor valida contra el catálogo."}},"required":["actionKey"]},"SetSalesAddonsDto":{"type":"object","properties":{"salesBilling":{"type":"boolean"},"einvoicing":{"type":"boolean"}}},"CreateSalesProductDto":{"type":"object","properties":{"name":{"type":"string","maxLength":160},"sku":{"type":"string","maxLength":64},"description":{"type":"string","maxLength":2000},"priceCents":{"type":"number","description":"Precio unitario en centavos (evita floats).","minimum":0,"maximum":2000000000},"currency":{"type":"string","description":"Moneda ISO-4217 (3 letras mayúsculas). Por defecto COP.","enum":["COP","USD","MXN"]},"taxRate":{"type":"number","description":"IVA en porcentaje entero (0–100; típicamente 19, 5 o 0).","minimum":0,"maximum":100},"unitCode":{"type":"string","description":"Código de unidad de medida DIAN (ej. \"94\"=unidad).","maxLength":16},"imageMediaId":{"type":"string","format":"uuid"},"active":{"type":"boolean"}},"required":["name","priceCents"]},"UpdateSalesProductDto":{"type":"object","properties":{"name":{"type":"string","maxLength":160},"sku":{"type":"string","nullable":true,"maxLength":64},"description":{"type":"string","nullable":true,"maxLength":2000},"priceCents":{"type":"number","minimum":0,"maximum":2000000000},"currency":{"type":"string","enum":["COP","USD","MXN"]},"taxRate":{"type":"number","minimum":0,"maximum":100},"unitCode":{"type":"string","nullable":true,"maxLength":16},"imageMediaId":{"type":"string","nullable":true,"format":"uuid"},"active":{"type":"boolean"}}},"CreateSalesOrderItemDto":{"type":"object","properties":{"productId":{"type":"string","description":"Producto del catálogo (opcional: se permiten ítems libres).","format":"uuid"},"description":{"type":"string","description":"Descripción (requerida si no hay productId).","maxLength":500},"quantity":{"type":"number","description":"Tope defensivo: junto al de precio evita desbordar Int4 en los totales.","minimum":1,"maximum":100000},"unitPriceCents":{"type":"number","description":"Precio unitario en centavos (requerido si no hay productId; si se envía con\n productId, pisa el precio del catálogo).","minimum":0,"maximum":2000000000},"taxRate":{"type":"number","description":"IVA % (si no se envía, se toma del producto, o 0 para ítem libre).","minimum":0,"maximum":100}},"required":["quantity"]},"CreateSalesOrderDto":{"type":"object","properties":{"contactId":{"type":"string","format":"uuid"},"conversationId":{"type":"string","format":"uuid"},"billingProfileId":{"type":"string","description":"Cliente de la venta (perfil de facturación). Se preselecciona al facturar.","format":"uuid"},"channel":{"type":"string","enum":["WHATSAPP","WEB","INSTAGRAM","STORE","MANUAL"]},"currency":{"type":"string","enum":["COP","USD","MXN"]},"notes":{"type":"string","maxLength":1000},"items":{"minItems":1,"maxItems":200,"type":"array","items":{"$ref":"#/components/schemas/CreateSalesOrderItemDto"}}},"required":["items"]},"UpdateSalesOrderStatusDto":{"type":"object","properties":{"status":{"type":"string","enum":["DRAFT","CONFIRMED","PAID","FULFILLED","CANCELLED"]}},"required":["status"]},"CreateBillingProfileDto":{"type":"object","properties":{"contactId":{"type":"string","description":"Contacto dueño (opcional: null = tercero/empresa suelta).","format":"uuid"},"legalName":{"type":"string","maxLength":300},"docNumber":{"type":"string","maxLength":40},"dv":{"type":"number","minimum":0,"maximum":9},"email":{"type":"string","maxLength":200},"phone":{"type":"string","maxLength":40},"address":{"type":"string","maxLength":300},"municipalityId":{"type":"number","minimum":1},"typeDocumentId":{"type":"number","minimum":1},"typeOrganizationId":{"type":"number","minimum":1},"typeRegimeId":{"type":"number","minimum":1},"typeLiabilityId":{"type":"number","minimum":1},"isDefault":{"type":"boolean"}},"required":["legalName","docNumber"]},"UpdateBillingProfileDto":{"type":"object","properties":{"legalName":{"type":"string","maxLength":300},"docNumber":{"type":"string","maxLength":40},"dv":{"type":"number","nullable":true,"minimum":0,"maximum":9},"email":{"type":"string","nullable":true,"maxLength":200},"phone":{"type":"string","nullable":true,"maxLength":40},"address":{"type":"string","nullable":true,"maxLength":300},"municipalityId":{"type":"number","nullable":true,"minimum":1},"typeDocumentId":{"type":"number","minimum":1},"typeOrganizationId":{"type":"number","minimum":1},"typeRegimeId":{"type":"number","minimum":1},"typeLiabilityId":{"type":"number","minimum":1},"isDefault":{"type":"boolean"}}},"UpdateEInvoicingConfigDto":{"type":"object","properties":{"configId":{"type":"string","description":"Empresa emisora a editar. Sin esto se edita la predeterminada, o se crea\n la primera — que es el flujo de una org con una sola empresa.","format":"uuid"},"name":{"type":"string","description":"Nombre visible de la emisora (\"Mosend SAS\").","maxLength":160},"isDefault":{"type":"boolean","description":"Convierte esta emisora en la predeterminada de la org."},"baseUrl":{"type":"string","description":"Solo https. El host además se valida contra la allowlist en el service\n (anti-SSRF: este valor termina en un fetch con el Bearer del emisor).","maxLength":300,"pattern":"^https:\\/\\/[^\\s]+$"},"apiKey":{"type":"string","description":"Token apidian en claro (se cifra); '' lo borra.","maxLength":500},"idSoftware":{"type":"string","maxLength":200},"resolutionNumber":{"type":"string","description":"Resolución DIAN elegida (ResolutionNumber). '' la limpia.","maxLength":60},"environment":{"type":"string","enum":["habilitacion","produccion"]},"establishmentName":{"type":"string","maxLength":200},"establishmentAddress":{"type":"string","maxLength":300},"establishmentPhone":{"type":"string","description":"El proveedor valida `numeric|digits_between:7,10` y un \"+57 320 555 1234\"\n tumba TODAS las emisiones con un 422. Se acepta cualquier formato y el\n servicio se queda con los dígitos: rechazarlo dejaba a las orgs con un\n teléfono legado sin poder guardar nada más.","maxLength":40},"emitterNit":{"type":"string","description":"NIT del emisor en el proveedor (solo dígitos, sin DV). Se usa para armar\n la ruta de descarga del PDF: /invoice/{nit}/{archivo}.","pattern":"^$|^\\d{5,15}$"},"establishmentEmail":{"type":"string","maxLength":200},"establishmentMunicipalityId":{"type":"number","nullable":true,"description":"null lo borra (la factura vuelve al establecimiento de Diaxpi). `@Min(1)`\n porque un 0 es falsy: se colaba como \"sin municipio\" y devolvía al\n proveedor a su default (Cali), justo lo que el respaldo evita.","minimum":1},"paymentFormId":{"type":"number","description":"Forma de pago DIAN por defecto (1=Contado, 2=Crédito). El proveedor NO lo\n valida cuando llega como objeto: un id inexistente revienta en 500.","enum":[1,2]},"paymentMethodId":{"type":"number","description":"Medio de pago DIAN por defecto (10=Efectivo, 42=Consignación, …).","minimum":1},"sendByEmail":{"type":"boolean"},"autoSendOnIssue":{"type":"boolean","description":"Mandar la factura por WhatsApp en cuanto la DIAN la acepta."},"autoSendCreditNotes":{"type":"boolean","description":"Mandar también la nota crédito al aceptarse. Interruptor aparte."},"sendTemplateName":{"type":"string","nullable":true,"description":"Plantilla aprobada con cabecera de DOCUMENTO, para fuera de la ventana de 24 h.","maxLength":512},"sendTemplateLang":{"type":"string","nullable":true,"maxLength":8},"enabled":{"type":"boolean"},"creditNotePrefix":{"type":"string","description":"Prefijo de la resolución de Nota Crédito en el proveedor (default \"NC\").\n '' vuelve al default.","maxLength":10}}},"ValidateEInvoicingDto":{"type":"object","properties":{"apiKey":{"type":"string","description":"Token en claro a probar; si se omite, usa el guardado.","maxLength":500},"idSoftware":{"type":"string","maxLength":200},"baseUrl":{"type":"string","maxLength":300,"pattern":"^https:\\/\\/[^\\s]+$"}}},"GenerateInvoiceDto":{"type":"object","properties":{"orderId":{"type":"string","format":"uuid"},"items":{"description":"Líneas de la factura directa. Excluyente con `orderId`.","minItems":1,"maxItems":200,"type":"array","items":{"$ref":"#/components/schemas/CreateSalesOrderItemDto"}},"contactId":{"type":"string","description":"Contacto/conversación de origen, para poder rastrear de dónde salió.","format":"uuid"},"conversationId":{"type":"string","format":"uuid"},"notes":{"type":"string","description":"Nota que va en el documento.","maxLength":1000},"idempotencyKey":{"type":"string","description":"Clave de idempotencia de la emisión directa. Sin pedido no hay nada a lo que\natar «una factura activa por X», y un consecutivo de la DIAN quemado dos\nveces solo se deshace con nota crédito. Dos envíos con la misma clave son\nla misma factura.","maxLength":120},"configId":{"type":"string","description":"Empresa emisora desde la que se factura. Sin esto, la predeterminada.","format":"uuid"},"billingProfileId":{"type":"string","description":"A quién facturar (opcional: si no, el perfil por defecto del contacto).","format":"uuid"},"paymentFormId":{"type":"number","description":"Override de forma/medio de pago para ESTA factura (si no, el de la config)."},"paymentMethodId":{"type":"number"}}},"CreateCreditNoteDto":{"type":"object","properties":{"invoiceId":{"type":"string","format":"uuid"},"discrepancyCode":{"type":"number","description":"Código de discrepancia DIAN, tal cual el catálogo oficial: 1=Devolución\nparcial, 2=Anulación de factura, 3=Rebaja o descuento, 4=Ajuste de precio,\n5=Otros. Default 2 (anulación).\n\nEl catálogo llega hasta el 5. El proveedor valida `between:1,6` pero luego\nbusca el 6 en su tabla con `findOrFail` fuera del try/catch: un 6 devuelve\n500 y deja la nota en ERROR, con la factura imposible de anular sin forzar.","minimum":1,"maximum":5},"reason":{"type":"string","description":"Motivo visible en la nota.","maxLength":500},"force":{"type":"boolean","description":"Confirma emitir aunque un intento anterior quedara sin confirmar (el\n usuario ya verificó en el proveedor que no salió). Evita la doble NC."}},"required":["invoiceId"]},"InvoiceLicenseOrderDto":{"type":"object","properties":{"customerOrderId":{"type":"string","description":"Venta de licencia ya PAGADA/ENTREGADA a facturar.","format":"uuid"},"billingProfileId":{"type":"string","description":"A quién facturar. Si no viene, se usan los datos fiscales de abajo.","format":"uuid"},"legalName":{"type":"string","description":"Datos fiscales que dio el cliente al pedir la factura.","maxLength":300},"docNumber":{"type":"string","maxLength":40},"dv":{"type":"number","minimum":0,"maximum":9},"email":{"type":"string","maxLength":200},"address":{"type":"string","maxLength":300},"typeDocumentId":{"type":"number","minimum":1},"typeOrganizationId":{"type":"number","minimum":1},"typeRegimeId":{"type":"number","minimum":1},"typeLiabilityId":{"type":"number","minimum":1},"paymentFormId":{"type":"number"},"paymentMethodId":{"type":"number"},"items":{"description":"Líneas EDITADAS desde el Facturador (revisión antes de emitir): si vienen,\n la factura se arma con estas (con su IVA por línea) en vez de derivarlas de\n la venta. Cada línea = descripción + cantidad + precio + IVA%.","minItems":1,"maxItems":50,"type":"array","items":{"$ref":"#/components/schemas/CreateSalesOrderItemDto"}},"notes":{"type":"string","description":"Notas/observaciones de la factura (opcional).","maxLength":1000}},"required":["customerOrderId"]},"CreateLicenseInvoiceDraftDto":{"type":"object","properties":{"customerOrderId":{"type":"string","format":"uuid"}},"required":["customerOrderId"]},"CreateSignupLinkDto":{"type":"object","properties":{"wabaId":{"type":"string","format":"uuid"},"signupMessage":{"type":"string","description":"Texto de la pantalla de consentimiento que Meta muestra al abrir el link.","minLength":1,"maxLength":300},"confirmationMessage":{"type":"string","description":"Mensaje que recibe el usuario al aceptar. Admite {{promo_code}}.","minLength":1,"maxLength":300},"privacyPolicyUrl":{"type":"string","maxLength":2048,"format":"uri"},"websiteUrl":{"type":"string","maxLength":2048,"format":"uri"},"promoCode":{"type":"string","pattern":"^[a-zA-Z0-9]{1,50}$"},"displayName":{"type":"string","description":"Apodo interno; no lo ven los usuarios de WhatsApp.","minLength":1,"maxLength":256}},"required":["wabaId","signupMessage","confirmationMessage","privacyPolicyUrl"]},"UpdateSignupLinkDto":{"type":"object","properties":{"status":{"type":"string","enum":["ACTIVE","DISABLED"]},"signupMessage":{"type":"string","minLength":1,"maxLength":300},"confirmationMessage":{"type":"string","minLength":1,"maxLength":300},"promoCode":{"type":"string","pattern":"^[a-zA-Z0-9]{1,50}$"},"displayName":{"type":"string","minLength":1,"maxLength":256},"websiteUrl":{"type":"string","maxLength":2048,"format":"uri"}}},"CreateLinkPageDto":{"type":"object","properties":{"handle":{"type":"string","description":"Handle público único global. [a-z0-9_] 3-30.","minLength":3,"maxLength":30,"pattern":"^[a-z0-9_]+$"},"displayName":{"type":"string","minLength":1,"maxLength":60},"bio":{"type":"string","maxLength":280},"theme":{"type":"object","description":"Tema visual libre: { preset, accentColor, buttonStyle, ... }."}},"required":["handle","displayName"]},"UpdateLinkPageDto":{"type":"object","properties":{"handle":{"type":"string","minLength":3,"maxLength":30,"pattern":"^[a-z0-9_]+$"},"displayName":{"type":"string","minLength":1,"maxLength":60},"bio":{"type":"string","maxLength":280},"theme":{"type":"object"},"isPublished":{"type":"boolean"},"coverMediaId":{"type":"string","nullable":true,"description":"id de MediaAsset (IMAGE) o null para quitar la portada.","format":"uuid"},"avatarMediaId":{"type":"string","nullable":true,"description":"id de MediaAsset (IMAGE) o null para quitar la foto de perfil.","format":"uuid"}}},"CreateItemDto":{"type":"object","properties":{"type":{"type":"string","enum":["WHATSAPP","EXTERNAL","CALL","EMAIL","LOCATION"]},"title":{"type":"string","minLength":1,"maxLength":80},"subtitle":{"type":"string","maxLength":120},"icon":{"type":"string","maxLength":40},"config":{"type":"object","description":"Config según type:\n WHATSAPP → { whatsAppLinkId } | { phoneNumberId, prefilledMessage? }\n EXTERNAL → { url }\n CALL     → { phone }\n EMAIL    → { email }\n LOCATION → { url }"}},"required":["type","title","config"]},"ReorderItemsDto":{"type":"object","properties":{"itemIds":{"description":"Ids de los items en el nuevo orden.","type":"array","items":{"type":"string","format":"uuid"}}},"required":["itemIds"]},"UpdateItemDto":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":80},"subtitle":{"type":"string","maxLength":120},"icon":{"type":"string","maxLength":40},"config":{"type":"object"},"isActive":{"type":"boolean"}}},"UpsertProfileDto":{"type":"object","properties":{"address":{"type":"string","maxLength":256},"description":{"type":"string","maxLength":512},"email":{"type":"string","format":"email"},"vertical":{"type":"string","enum":["AUTOMOTIVE","BEAUTY","APPAREL","EDU","ENTERTAIN","EVENT_PLAN","FINANCE","GROCERY","GOVT","HOTEL","HEALTH","NONPROFIT","PROF_SERVICES","RETAIL","TRAVEL","RESTAURANT","OTHER"]},"websites":{"uniqueItems":true,"maxItems":2,"type":"array","items":{"type":"string","format":"uri"}}}},"CreateNoteDto":{"type":"object","properties":{"body":{"type":"string","minLength":1,"maxLength":5000},"pinned":{"type":"boolean"}},"required":["body"]},"UpdateNoteDto":{"type":"object","properties":{"body":{"type":"string","minLength":1,"maxLength":5000},"pinned":{"type":"boolean"}}},"CreateTaskDto":{"type":"object","properties":{"contactId":{"type":"string","format":"uuid"},"conversationId":{"type":"string","format":"uuid"},"assignedToUserId":{"type":"string","nullable":true,"format":"uuid"},"title":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","maxLength":2000},"dueAt":{"type":"string"}},"required":["contactId","title","dueAt"]},"UpdateTaskDto":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","nullable":true,"maxLength":2000},"dueAt":{"type":"string"},"assignedToUserId":{"type":"string","nullable":true,"format":"uuid"}}},"CompleteTaskDto":{"type":"object","properties":{"completed":{"type":"boolean"}},"required":["completed"]},"CreateTagDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":40},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"}},"required":["name"]},"UpdateTagDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":40},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"}}},"RecordOptInDto":{"type":"object","properties":{"type":{"type":"string","enum":["IN","OUT"]},"source":{"type":"string"},"channel":{"type":"string"},"payload":{"type":"object"}},"required":["type"]},"SendStickerDto":{"type":"object","properties":{"phoneNumberId":{"type":"string","format":"uuid"},"to":{"type":"string"},"replyToMessageId":{"type":"string","format":"uuid"}},"required":["phoneNumberId","to"]},"UploadBotImageDto":{"type":"object","properties":{"label":{"type":"string","description":"Nombre corto con el que el agente identifica la imagen."},"caption":{"type":"string"}}},"UpdateBotImageDto":{"type":"object","properties":{"label":{"type":"string","maxLength":120},"caption":{"type":"string","maxLength":1024}}},"CreateAutoReplyDto":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"trigger":{"type":"string","enum":["KEYWORD","OUT_OF_HOURS","WELCOME","FALLBACK"]},"keywordMatchMode":{"type":"string","enum":["EXACT","CONTAINS","STARTS_WITH","REGEX"]},"keywords":{"maxItems":50,"type":"array","items":{"type":"string"}},"actionType":{"type":"string","enum":["SEND_TEXT","SEND_IMAGE","SEND_TEMPLATE","START_FLOW","TRANSFER_TO_HUMAN"]},"textBody":{"type":"string","maxLength":4096},"imageId":{"type":"string","description":"Imagen de la librería del bot, para actionType=SEND_IMAGE.","format":"uuid"},"templateId":{"type":"string","format":"uuid"},"flowId":{"type":"string","format":"uuid"},"phoneNumberId":{"type":"string","format":"uuid"},"priority":{"type":"number","minimum":0},"enabled":{"type":"boolean"},"cooldownSeconds":{"type":"number","minimum":0},"renewAfterHours":{"type":"number","description":"Ventana de renovación en horas (solo aplica a WELCOME / OUT_OF_HOURS).\n null = usar default del dispatcher; 0 = sin ventana (siempre dispara).","minimum":0,"maximum":168},"alsoHandoff":{"type":"boolean","description":"Si true, además de la acción marca la conv para asesor humano (handoff)."}},"required":["name","trigger","actionType"]},"UpdateAutoReplyDto":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"trigger":{"type":"string","enum":["KEYWORD","OUT_OF_HOURS","WELCOME","FALLBACK"]},"keywordMatchMode":{"type":"string","enum":["EXACT","CONTAINS","STARTS_WITH","REGEX"]},"keywords":{"maxItems":50,"type":"array","items":{"type":"string"}},"actionType":{"type":"string","enum":["SEND_TEXT","SEND_IMAGE","SEND_TEMPLATE","START_FLOW","TRANSFER_TO_HUMAN"]},"textBody":{"type":"string","maxLength":4096},"imageId":{"type":"string","description":"Imagen de la librería del bot, para actionType=SEND_IMAGE.","format":"uuid"},"templateId":{"type":"string","format":"uuid"},"flowId":{"type":"string","format":"uuid"},"phoneNumberId":{"type":"string","format":"uuid"},"priority":{"type":"number","minimum":0},"enabled":{"type":"boolean"},"cooldownSeconds":{"type":"number","minimum":0},"renewAfterHours":{"type":"number","description":"Ventana de renovación en horas (solo aplica a WELCOME / OUT_OF_HOURS).\n null = usar default del dispatcher; 0 = sin ventana (siempre dispara).","minimum":0,"maximum":168},"alsoHandoff":{"type":"boolean","description":"Si true, además de la acción marca la conv para asesor humano (handoff)."}}},"PrecioDto":{"type":"object","properties":{"periodo":{"type":"string","maxLength":40},"valorCents":{"type":"number","minimum":0}},"required":["periodo","valorCents"]},"ServicioDto":{"type":"object","properties":{"categoria":{"type":"string","maxLength":80},"nombre":{"type":"string","maxLength":120},"descripcion":{"type":"string","maxLength":400},"notas":{"type":"string","maxLength":300},"moneda":{"type":"string","maxLength":8},"urlContratacion":{"type":"string","maxLength":500,"format":"uri"},"activo":{"type":"boolean"},"mostrarPrecio":{"type":"boolean"},"mostrarSinStock":{"type":"boolean"},"orden":{"type":"number","minimum":0},"precios":{"maxItems":12,"type":"array","items":{"$ref":"#/components/schemas/PrecioDto"}}}},"CreateStoreConnectionDto":{"type":"object","properties":{"platform":{"type":"object"},"name":{"type":"string","maxLength":120},"phoneNumberId":{"type":"string","format":"uuid"},"storeDomain":{"type":"string","maxLength":253}},"required":["platform","name","phoneNumberId"]},"UpdateStoreConnectionDto":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"phoneNumberId":{"type":"string","format":"uuid"},"storeDomain":{"type":"string","maxLength":253},"status":{"type":"object"}}},"UpsertMappingDto":{"type":"object","properties":{"eventType":{"type":"object"},"enabled":{"type":"boolean"},"templateId":{"type":"string","format":"uuid"},"languageCode":{"type":"string","maxLength":8},"variableMap":{"type":"object"},"delayMinutes":{"type":"number","minimum":0,"maximum":10080}},"required":["eventType"]},"IngestEventDto":{"type":"object","properties":{"eventType":{"type":"object"},"externalEventId":{"type":"string","maxLength":200},"payload":{"type":"object"}},"required":["eventType","payload"]},"PrecioDeProductoDto":{"type":"object","properties":{"periodo":{"type":"string","maxLength":40},"valorCents":{"type":"number","minimum":0}},"required":["periodo","valorCents"]},"ProductoDeTiendaDto":{"type":"object","properties":{"externalId":{"type":"string","maxLength":64},"categoria":{"type":"string","maxLength":80},"nombre":{"type":"string","maxLength":120},"descripcion":{"type":"string","maxLength":400},"notas":{"type":"string","maxLength":300},"moneda":{"type":"string","maxLength":8},"urlContratacion":{"type":"string","maxLength":500,"format":"uri"},"stock":{"type":"number"},"activo":{"type":"boolean"},"precios":{"maxItems":12,"type":"array","items":{"$ref":"#/components/schemas/PrecioDeProductoDto"}}},"required":["externalId","categoria","nombre","precios"]},"SincronizarCatalogoDto":{"type":"object","properties":{"productos":{"minItems":1,"maxItems":1000,"type":"array","items":{"$ref":"#/components/schemas/ProductoDeTiendaDto"}}},"required":["productos"]},"InstallStoreTemplateDto":{"type":"object","properties":{"wabaId":{"type":"string","description":"Opcional: si se pasa connectionId, la WABA se deriva de su número.","format":"uuid"},"catalogKey":{"type":"string","maxLength":60},"language":{"type":"string","maxLength":8},"name":{"type":"string","maxLength":512},"connectionId":{"type":"string","description":"Si se pasa, además del template se crea el mapeo evento→plantilla.","format":"uuid"},"bodyText":{"type":"string","maxLength":1024},"bodyExample":{"type":"array","items":{"type":"string"}},"headerText":{"type":"string","maxLength":60},"headerExample":{"type":"string","maxLength":60},"footer":{"type":"string","maxLength":60},"variableMap":{"type":"object","description":"{ \"1\": \"customer.name\", \"header\": \"store.name\" }"}},"required":["catalogKey"]},"SetReactionDto":{"type":"object","properties":{"emoji":{"type":"string","minLength":1,"maxLength":16,"description":"Emoji unicode para reaccionar al mensaje. Si está vacío se interpreta como remover la reacción.","example":"👍"}},"required":["emoji"]},"CreateChannelDto":{"type":"object","properties":{"name":{"type":"string","maxLength":100},"color":{"type":"string"},"welcomeMessage":{"type":"string","maxLength":500},"allowedDomains":{"type":"array","items":{"type":"string"}},"precaptureEnabled":{"type":"boolean"},"requireEmailUpfront":{"type":"boolean"},"prechatFields":{"nullable":true,"type":"array","items":{"type":"object"}},"typingIndicatorEnabled":{"type":"boolean"},"readReceiptEnabled":{"type":"boolean"},"voiceNotesEnabled":{"type":"boolean"},"offlineReplyEmailEnabled":{"type":"boolean","description":"Email al visitante cuando el agente responde y él ya no está en la página."},"botEnabled":{"type":"boolean"},"enabled":{"type":"boolean"},"theme":{"type":"string","description":"Modo de color del widget: 'light' | 'dark' | 'auto'.","enum":["light","dark","auto"]}},"required":["name"]},"UpdateChannelDto":{"type":"object","properties":{"name":{"type":"string","maxLength":100},"color":{"type":"string","description":"Color de marca en hex (#rgb o #rrggbb). Se validaba solo como \"texto\", así\nque cualquier cadena se guardaba sin queja y la pantalla la mostraba rota.\nEl widget ya desinfecta antes de pintar, así que esto no era explotable —\npero sí una forma silenciosa de dejar el canal mal configurado.","pattern":"^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"welcomeMessage":{"type":"string","maxLength":500},"allowedDomains":{"type":"array","items":{"type":"string"}},"precaptureEnabled":{"type":"boolean"},"requireEmailUpfront":{"type":"boolean"},"typingIndicatorEnabled":{"type":"boolean"},"readReceiptEnabled":{"type":"boolean"},"voiceNotesEnabled":{"type":"boolean","description":"Notas de voz en el widget (botón de micrófono)."},"botEnabled":{"type":"boolean"},"offlineReplyEmailEnabled":{"type":"boolean","description":"Aviso por correo al visitante cuando el agente responde estando él offline."},"whatsappPhoneNumberId":{"type":"string","nullable":true,"description":"WhatsApp de la marca (id de un número real) que el bot ofrece para seguir\nla conversación. null = no ofrecer ninguno.","format":"uuid"},"enabled":{"type":"boolean"},"identityRequired":{"type":"boolean","description":"Si true, exige firma HMAC al recibir identidad pasada por el host site."},"operatingHours":{"type":"object","nullable":true},"offlineAction":{"type":"object"},"offlineMessage":{"type":"string","nullable":true,"maxLength":500},"offlineMessageLunch":{"type":"string","nullable":true,"description":"Mensaje para la PAUSA entre dos tramos del mismo día (el mediodía). Si se\ndeja vacío se usa `offlineMessage`. La columna existía en la base desde su\nmigración pero no la aceptaba ningún endpoint, así que no había forma de\nescribirla: a la hora del almuerzo el visitante leía el mismo mensaje que\na medianoche.","maxLength":500},"prechatFields":{"nullable":true,"type":"array","items":{"type":"object"}},"departments":{"nullable":true,"type":"array","items":{"type":"object"}},"proactiveTriggers":{"nullable":true,"type":"array","items":{"type":"object"}},"linkEmailBannerEnabled":{"type":"boolean"},"bubblePosition":{"type":"string","enum":["left","right"]},"bubbleOffsetBottom":{"type":"number","nullable":true,"description":"Distancia desde abajo en px (null = default del widget: 24/16).","minimum":0,"maximum":400},"bubbleOffsetX":{"type":"number","nullable":true,"description":"Distancia lateral en px desde el borde del lado elegido (null = default).","minimum":0,"maximum":400},"theme":{"type":"string","enum":["light","dark","auto"]}}},"WebChatSendMessageDto":{"type":"object","properties":{"type":{"type":"string","description":"Tipo de mensaje. Si no se especifica, default 'text'.","enum":["text","image","video","audio","document"]},"body":{"type":"string","description":"Texto del mensaje (requerido si type='text'; opcional como caption en otros).","maxLength":4096},"mediaAssetId":{"type":"string","description":"Id del MediaAsset previamente subido vía /web-chat/media. Requerido cuando type != 'text'.","format":"uuid"},"replyToMessageId":{"type":"string","description":"UUID del Message al que el agente responde (cita visible en widget)."}}},"CreateSessionDto":{"type":"object","properties":{"visitorId":{"type":"string"},"sitio":{"type":"string","description":"Sitio que contiene el iframe del chat (ver `origenAValidar`).","maxLength":300},"mode":{"type":"string","description":"`login`: «Inicia sesión» — solo el correo; manda un código y se sigue\n con `verify-otp`, que retoma la conversación anterior si la hay.","enum":["anonymous","identified","verify-otp","host-identified","login"]},"name":{"type":"string","maxLength":200},"email":{"type":"string","format":"email"},"phone":{"type":"string"},"avatarUrl":{"type":"string","description":"Foto del visitante que el sitio host puede pasar por identify\n (p.ej. data-user-avatar). Se cachea en S3 y se expone en el inbox.","maxLength":2048,"format":"uri"},"otp":{"type":"string"},"acceptOffline":{"type":"boolean","description":"El visitante confirmó \"dejar mensaje de todos modos\" fuera de horario.\n Solo surte efecto si el canal usa offlineAction = MESSAGE_ALLOW."},"userId":{"type":"string","maxLength":200},"hash":{"type":"string","description":"HMAC-SHA256 hex de `userId || email`, firmado con `WebChatChannel.identitySecret`.","maxLength":128},"attributes":{"type":"object","description":"Atributos custom del host (plan, role, etc.) — van a visitor.metadata.host."},"departmentId":{"type":"string","maxLength":40},"prechat":{"type":"object","description":"Respuestas del prechat dinámico: { fieldId: value }."},"url":{"type":"string","description":"Datos del navegador / contexto.","maxLength":500},"referer":{"type":"string","maxLength":500},"title":{"type":"string","maxLength":200},"lang":{"type":"string","maxLength":20},"utm":{"type":"object","properties":{"source":{"type":"string"},"medium":{"type":"string"},"campaign":{"type":"string"},"term":{"type":"string"},"content":{"type":"string"}},"required":[]}},"required":["visitorId","mode"]},"ResendOtpDto":{"type":"object","properties":{"email":{"type":"string","format":"email"},"sitio":{"type":"string","description":"Sitio que contiene el iframe del chat (ver `origenAValidar`).","maxLength":300}},"required":["email"]},"LinkEmailDto":{"type":"object","properties":{"email":{"type":"string","format":"email"},"name":{"type":"string","maxLength":200}},"required":["email"]},"CreateOutboundDto":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"events":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"format":{"type":"string","description":"Si no se pasa, el service auto-detecta a partir de la URL (Teams si es\n webhook.office.com etc., GENERIC en cualquier otro caso).","enum":["GENERIC","TEAMS"]},"unansweredThresholdMinutes":{"type":"number","description":"Solo relevante si `events` incluye 'conversation.unanswered'. Min 1\n para evitar spam (sub-minuto el cron no lo respeta) y Max 1440 (24h)\n como sanity check.","minimum":1,"maximum":1440},"phoneNumberIds":{"description":"Restricción opcional por phone-number. Vacío/ausente = el hook recibe\n eventos de TODOS los números (default). Si trae UUIDs, sólo recibe los\n de esos números.","uniqueItems":true,"type":"array","items":{"type":"string","format":"uuid"}},"agentStatuses":{"type":"array","description":"Solo relevante si `events` incluye 'agent.status_changed'. Qué estados de\n jornada notificar. Vacío/ausente = todas las transiciones.","uniqueItems":true,"items":{"type":"string","enum":["ONLINE","LUNCH","BREAK","MEETING","TRAINING","ENDED"]}}},"required":["url","events"]},"UpdateOutboundDto":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"events":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"format":{"type":"string","enum":["GENERIC","TEAMS"]},"active":{"type":"boolean"},"unansweredThresholdMinutes":{"type":"number","minimum":1,"maximum":1440},"phoneNumberIds":{"uniqueItems":true,"type":"array","items":{"type":"string","format":"uuid"}},"agentStatuses":{"type":"array","uniqueItems":true,"items":{"type":"string","enum":["ONLINE","LUNCH","BREAK","MEETING","TRAINING","ENDED"]}}}},"RedeemCouponDto":{"type":"object","properties":{"code":{"type":"string","minLength":2,"maxLength":64},"planSlug":{"type":"string","minLength":1,"maxLength":64}},"required":["code"]},"SetIntervalDto":{"type":"object","properties":{"interval":{"type":"string","enum":["MONTHLY","YEARLY"]}},"required":["interval"]},"CreateCreditNoteRequestDto":{"type":"object","properties":{"organizationId":{"type":"string","format":"uuid"},"invoiceId":{"type":"string","format":"uuid"},"amount":{"type":"number","minimum":0.01,"maximum":100000},"currency":{"type":"string","minLength":3,"maxLength":3},"reason":{"type":"string","minLength":3,"maxLength":500},"applyToWallet":{"type":"boolean"}},"required":["organizationId","amount","currency","reason","applyToWallet"]},"CreateRechargeDto":{"type":"object","properties":{"amount":{"type":"number","minimum":1,"maximum":100000},"currency":{"type":"string","minLength":3,"maxLength":3},"returnTo":{"type":"string","pattern":"^\\/dashboard\\/billing(\\/ai-credits)?$"}},"required":["amount","currency"]},"AddCardDto":{"type":"object","properties":{"token":{"type":"string","minLength":10,"maxLength":256},"email":{"type":"string","format":"email"},"firstName":{"type":"string","minLength":1,"maxLength":80},"lastName":{"type":"string","minLength":1,"maxLength":80}},"required":["token","email"]},"SetAutoPayDto":{"type":"object","properties":{"enabled":{"type":"boolean"},"methodId":{"type":"string","format":"uuid"}},"required":["enabled"]},"CreatePaymentReportDto":{"type":"object","properties":{"amount":{"type":"number","description":"Monto transferido (en la moneda de la factura o de la org).","minimum":0.01},"invoiceId":{"type":"string","description":"Factura a pagar. Omitir para recarga de saldo.","format":"uuid"},"note":{"type":"string","description":"Referencia del cliente (titular que pagó, número de transacción, etc).","maxLength":300}},"required":["amount"]},"CreateNequiPushDto":{"type":"object","properties":{"invoiceId":{"type":"string","description":"Factura a pagar. Omitir para recarga de saldo (requiere amount).","format":"uuid"},"amount":{"type":"number","description":"Monto de la recarga (moneda de la org). Ignorado si hay invoiceId.","minimum":0.01},"phoneNumber":{"type":"string","description":"Celular Nequi del cliente (10 dígitos).","pattern":"^\\d{10}$"}},"required":["phoneNumber"]},"CreateNequiQrDto":{"type":"object","properties":{"invoiceId":{"type":"string","format":"uuid"},"amount":{"type":"number","minimum":0.01}}},"UpdateAlertSettingsDto":{"type":"object","properties":{"lowBalanceThreshold":{"type":"number","nullable":true,"description":"Umbral de saldo bajo en la moneda del wallet. Si está set y el saldo\ncae al o por debajo, el cron envía una alerta. `null` desactiva la alerta.","minimum":0},"autoRechargeEnabled":{"type":"boolean","description":"Activa/desactiva auto-recarga. Para activar, requiere `autoRechargeAmount`\n> 0, `autoRechargeCurrency` (3 chars), y que la org tenga\n`autoPayMethodId` (tarjeta default registrada)."},"autoRechargeAmount":{"type":"number","nullable":true,"description":"Monto a cobrar a la tarjeta default cada vez que se dispara la auto-recarga.","minimum":0},"autoRechargeCurrency":{"type":"string","nullable":true,"description":"Moneda ISO-4217 de 3 chars (USD, COP, MXN, ...).","minLength":3,"maxLength":3}}},"InstallIntegrationDto":{"type":"object","properties":{"slug":{"type":"string","maxLength":80},"config":{"type":"object"}},"required":["slug"]},"UpdateInstallationDto":{"type":"object","properties":{"config":{"type":"object"},"enabled":{"type":"boolean"}}},"UpdateTeamGoalsDto":{"type":"object","properties":{"weeklyConversationsCreated":{"type":"number","nullable":true,"minimum":0,"maximum":1000000},"weeklyConversationsClosed":{"type":"number","nullable":true,"minimum":0,"maximum":1000000},"weeklyMessagesOut":{"type":"number","nullable":true,"minimum":0,"maximum":1000000},"closureRateTarget":{"type":"number","nullable":true,"minimum":0,"maximum":100},"resolutionRateTarget":{"type":"number","nullable":true,"minimum":0,"maximum":100}}},"CreateLeadDto":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"email":{"type":"string","format":"email"},"phone":{"type":"string","maxLength":40},"company":{"type":"string","maxLength":120},"message":{"type":"string","maxLength":2000},"source":{"type":"string","maxLength":64},"utm":{"type":"object"}},"required":["name","email","message"]},"AdminSuspendOrgDto":{"type":"object","properties":{"reason":{"type":"string","minLength":5,"maxLength":500}},"required":["reason"]},"AdminCreateOrganizationDto":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":80},"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,38}[a-z0-9]$"},"billingEmail":{"type":"string","maxLength":254,"format":"email"},"country":{"type":"string","maxLength":2},"currency":{"type":"string","maxLength":3},"timezone":{"type":"string","maxLength":64},"ownerEmail":{"type":"string","maxLength":254,"format":"email"},"ownerName":{"type":"string","minLength":1,"maxLength":120},"ownerPhone":{"type":"string","pattern":"^\\+[1-9]\\d{6,14}$"}},"required":["name","slug","billingEmail","ownerEmail","ownerName"]},"AdminSetAddonDto":{"type":"object","properties":{"addonType":{"type":"string","enum":["SEAT","WABA","STORAGE_BLOCK"]},"quantity":{"type":"number","description":"Cantidad objetivo absoluta.","minimum":0}},"required":["addonType","quantity"]},"AdminRenameOrganizationDto":{"type":"object","properties":{"name":{"type":"string","description":"Mismas reglas que cuando la crea su dueño (2–80).","minLength":2,"maxLength":80}},"required":["name"]},"AdminSetUserEmailDto":{"type":"object","properties":{"email":{"type":"string","maxLength":254,"format":"email"}},"required":["email"]},"AdminSetOrgCurrencyDto":{"type":"object","properties":{"currency":{"type":"string","enum":["USD","COP"]}},"required":["currency"]},"AdminTransferOwnershipDto":{"type":"object","properties":{"newOwnerUserId":{"type":"string","description":"Usuario que pasa a ser dueño. Tiene que ser YA miembro de la organización.","format":"uuid"},"reason":{"type":"string","minLength":5,"maxLength":500}},"required":["newOwnerUserId","reason"]},"AdminSetExtraOrganizationsDto":{"type":"object","properties":{"count":{"type":"number","description":"Cantidad objetivo absoluta de organizaciones extra.","minimum":0}},"required":["count"]},"CreatePricingRuleDto":{"type":"object","properties":{"country":{"type":"string","minLength":2,"maxLength":2},"category":{"type":"string","enum":["marketing","utility","authentication","service"]},"currency":{"type":"string","minLength":3,"maxLength":3},"unit":{"type":"string","description":"Unidad de cobro: CONVERSATION (CBP clásico, default) o MESSAGE (PMP).","enum":["CONVERSATION","MESSAGE"]},"metaCost":{"type":"number","minimum":0,"maximum":10},"markupPercent":{"type":"number","minimum":0,"maximum":10},"effectiveFrom":{"type":"string"}},"required":["country","category","currency","metaCost","markupPercent"]},"AdjustWalletDto":{"type":"object","properties":{"delta":{"type":"number"},"reason":{"type":"string","maxLength":500}},"required":["delta","reason"]},"ManualInvoiceLineDto":{"type":"object","properties":{"description":{"type":"string","maxLength":300},"quantity":{"type":"number","minimum":1},"unitCost":{"type":"number"},"total":{"type":"number","description":"Total de la línea (puede ser negativo para descuentos)."}},"required":["description","total"]},"ManualInvoicePlanCoverageDto":{"type":"object","properties":{"planId":{"type":"string"},"interval":{"type":"string","enum":["MONTHLY","YEARLY"]},"startAt":{"type":"string","description":"Inicio de la cobertura (ISO date). El fin se deriva: +1 mes / +1 año."},"amount":{"type":"number","description":"Monto negociado de la cobertura (reemplaza el precio de lista).","minimum":0},"applyToOrg":{"type":"boolean","description":"Alinear el ciclo de la org: asigna el plan (si es distinto), pone\nbillingInterval=YEARLY y corre nextPlanRenewalAt al FIN de la cobertura\n(el cierre no re-cobra el año ya pagado). Solo válido con interval\nYEARLY. Default true."}},"required":["planId","interval","startAt","amount"]},"CreateManualInvoiceDto":{"type":"object","properties":{"lines":{"description":"Líneas libres. Puede ir vacío si hay planCoverage (que genera la suya).","type":"array","items":{"$ref":"#/components/schemas/ManualInvoiceLineDto"}},"planCoverage":{"$ref":"#/components/schemas/ManualInvoicePlanCoverageDto"},"status":{"type":"string","description":"ISSUED = por cobrar (entra a dunning); PAID = ya pagada por fuera.","enum":["ISSUED","PAID"]},"applyOrgTax":{"type":"boolean","description":"Aplicar el IVA configurado en la org. Default true."},"currency":{"type":"string","maxLength":3},"sendEmail":{"type":"boolean","description":"Enviar el email de emitida/pagada al billingEmail. Default true."},"note":{"type":"string","description":"Nota interna (audit): referencia de transferencia, acuerdo, etc.","maxLength":500}},"required":["lines","status"]},"MarkInvoicePaidDto":{"type":"object","properties":{"amount":{"type":"number","minimum":0.01},"description":{"type":"string","maxLength":500}},"required":["amount"]},"UpdateBillingConfigDto":{"type":"object","properties":{"billingCycleDay":{"type":"number","nullable":true,"minimum":1,"maximum":28},"markupOverride":{"type":"number","nullable":true},"taxPercent":{"type":"number","nullable":true,"description":"Impuesto sobre el subtotal (0.19 = IVA 19%). null/0 = sin impuesto.","minimum":0,"maximum":1},"dueDays":{"type":"number","nullable":true,"description":"Plazo de pago en días (null = usar el default global).","minimum":1,"maximum":365},"suspendAfterDays":{"type":"number","nullable":true,"description":"Días de gracia tras vencer antes del corte (null = default global).","minimum":1,"maximum":365},"billingInterval":{"type":"string","description":"Ciclo de la suscripción del plan: MONTHLY (default) o YEARLY.","enum":["MONTHLY","YEARLY"]},"nextPlanRenewalAt":{"type":"string","nullable":true,"description":"Fecha de la próxima renovación anual (solo YEARLY). ISO date."},"billingExempt":{"type":"boolean","description":"Org de cortesía: no se le emiten facturas (ni plan ni consumo)."}}},"UpdateCollectionConfigDto":{"type":"object","properties":{"dueDays":{"type":"number","minimum":1,"maximum":365},"reminderDays":{"type":"number","minimum":1,"maximum":365},"warningDays":{"type":"number","minimum":1,"maximum":365},"finalDays":{"type":"number","minimum":1,"maximum":365},"suspendAfterDays":{"type":"number","minimum":1,"maximum":365},"preDueDays":{"type":"number","description":"Días ANTES del vencimiento en que se recuerda que la factura está por\nvencer. 0 = sin aviso previo. Los demás plazos cuentan desde que ya venció.","minimum":0,"maximum":30},"billingCycleDay":{"type":"number","description":"Día de corte GLOBAL del ciclo (1–28). Aplica a las orgs sin override.","minimum":1,"maximum":28},"billingInterval":{"type":"string","description":"Intervalo GLOBAL por defecto.","enum":["MONTHLY","YEARLY"]},"planBillingDay":{"type":"number","nullable":true,"description":"Día del mes (1–28) en que se factura el PLAN separado del consumo.\nnull = modo clásico (plan dentro del cierre del periodo).","minimum":1,"maximum":28},"planDueDays":{"type":"number","description":"Plazo de pago de la factura de plan (0 = vence el día de cobro).","minimum":0,"maximum":365},"planIssueLeadDays":{"type":"number","description":"Días de ANTICIPO sobre el día de cobro. 0 = se emite el mismo día. El\nvencimiento no se mueve, así que con día de cobro 21 y anticipo 6 la\nfactura sale el 15 y vence el 21 — el cliente gana plazo, no lo pierde.","minimum":0,"maximum":27},"fxUsdCopManual":{"type":"number","nullable":true,"description":"TRM fijada a mano (1 USD = X COP). Manda sobre la que captura el cron\ndesde la Superfinanciera. `null` vuelve a la oficial.\n\nEl tope no es decorativo: un cero o un número disparatado convertiría mal\nTODAS las facturas en pesos de ese cierre.","minimum":1,"maximum":100000}}},"CreatePlanDto":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"isPublic":{"type":"boolean"},"isActive":{"type":"boolean"},"trialDays":{"type":"number"},"sortOrder":{"type":"number"},"includedSeats":{"type":"number","nullable":true},"includedWabas":{"type":"number","nullable":true},"includedConversations":{"type":"number","nullable":true},"includedContacts":{"type":"number","nullable":true},"includedTemplates":{"type":"number","nullable":true},"includedLinks":{"type":"number","nullable":true},"includedStorageMiB":{"type":"number","nullable":true},"billingModel":{"type":"string","enum":["SUBSCRIPTION","USAGE"]},"usageConfig":{"type":"object","nullable":true}},"required":["slug","name"]},"UpdatePlanDto":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"includedSeats":{"type":"number","nullable":true},"includedWabas":{"type":"number","nullable":true},"includedConversations":{"type":"number","nullable":true},"includedContacts":{"type":"number","nullable":true},"includedTemplates":{"type":"number","nullable":true},"includedLinks":{"type":"number","nullable":true},"includedStorageMiB":{"type":"number","nullable":true},"includedOrganizations":{"type":"number","nullable":true},"perSeatExtraPrice":{"type":"number","minimum":0},"perWabaExtraPrice":{"type":"number","minimum":0},"perOrganizationExtraPrice":{"type":"number","minimum":0},"storageBlockGiB":{"type":"number","nullable":true,"minimum":1},"perStorageBlockPrice":{"type":"number","minimum":0},"licenseDeliveryFee":{"type":"number","description":"Tarifa fija mensual del módulo de entrega de licencias (add-on).","minimum":0},"features":{"type":"object"},"trialDays":{"type":"number","minimum":0},"isPublic":{"type":"boolean"},"isActive":{"type":"boolean"},"sortOrder":{"type":"number"},"outboundMessagesPerMinute":{"type":"number","nullable":true},"broadcastsPerDay":{"type":"number","nullable":true},"bullPriority":{"type":"number","minimum":1,"maximum":10},"apiRequestsPerMinute":{"type":"number","nullable":true},"mediaUploadsPerMinute":{"type":"number","nullable":true},"billingModel":{"type":"string","enum":["SUBSCRIPTION","USAGE"]},"usageConfig":{"type":"object","nullable":true}}},"UpsertPlanPriceDto":{"type":"object","properties":{"currency":{"type":"string","enum":["USD","COP"]},"interval":{"type":"string","enum":["MONTHLY","YEARLY"]},"amount":{"type":"number","minimum":0},"promoAmount":{"type":"number","nullable":true,"description":"Precio promocional. Si se envía (≥0), ES el precio que se cobra; `amount`\n queda como precio de lista. Enviar `null` para limpiar la promo.","minimum":0},"promoLabel":{"type":"string","nullable":true,"minLength":1,"maxLength":60},"aplicarAClientesActuales":{"type":"boolean","description":"Si el precio que se cobra cambia: `true` se lo cambia también a quienes\nya tienen el plan; `false` (por defecto) les respeta el que tenían y el\nnuevo solo vale para los que entren desde ahora."}},"required":["currency","interval","amount"]},"FijarPrecioPactadoDto":{"type":"object","properties":{"interval":{"type":"string","enum":["MONTHLY","YEARLY"]},"amount":{"type":"number","minimum":0}},"required":["interval","amount"]},"UpdatePricingRuleDto":{"type":"object","properties":{"metaCost":{"type":"number","minimum":0,"maximum":10},"markupPercent":{"type":"number","minimum":0,"maximum":10}}},"UpdateRoadmapItemDto":{"type":"object","properties":{"status":{"type":"string","enum":["IDEA","PLANNED","BUILDING","BETA","LIVE","DROPPED"]},"notes":{"type":"string","maxLength":2000},"priority":{"type":"number","minimum":0,"maximum":100},"targetQuarter":{"type":"string","nullable":true,"maxLength":20}}},"UpdateAiProviderDto":{"type":"object","properties":{"label":{"type":"string","maxLength":120},"enabled":{"type":"boolean"},"apiKey":{"type":"string","nullable":true,"maxLength":400},"defaultModel":{"type":"string","nullable":true,"maxLength":120},"intentModel":{"type":"string","nullable":true,"maxLength":120},"whisperModel":{"type":"string","nullable":true,"maxLength":120},"priorityOrder":{"type":"number","minimum":0,"maximum":1000},"markupPercent":{"type":"number","nullable":true,"minimum":0,"maximum":1000},"notes":{"type":"string","nullable":true,"maxLength":1000}}},"ReprocessPaymentDto":{"type":"object","properties":{"paymentId":{"type":"string","minLength":1,"maxLength":64}},"required":["paymentId"]},"CreateCouponDto":{"type":"object","properties":{"code":{"type":"string","minLength":2,"maxLength":64},"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","minLength":1,"maxLength":500},"type":{"type":"string","enum":["PERCENT","FIXED"]},"value":{"type":"number","description":"Para PERCENT: valor entre 0 y 1 (0.10 = 10%). Para FIXED: monto en `currency`.","minimum":0},"currency":{"type":"string","minLength":3,"maxLength":3},"maxRedemptions":{"type":"number","minimum":1},"maxPerOrg":{"type":"number","minimum":1},"validFrom":{"type":"string"},"validUntil":{"type":"string"},"applicablePlans":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"appliesToInterval":{"type":"string","enum":["MONTHLY","YEARLY"]}},"required":["code","type","value"]},"UpdateCouponDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","minLength":1,"maxLength":500},"type":{"type":"string","enum":["PERCENT","FIXED"]},"value":{"type":"number","minimum":0},"currency":{"type":"string","minLength":3,"maxLength":3},"maxRedemptions":{"type":"number","minimum":1},"maxPerOrg":{"type":"number","minimum":1},"validFrom":{"type":"string"},"validUntil":{"type":"string"},"isActive":{"type":"boolean"},"applicablePlans":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"appliesToInterval":{"type":"string","enum":["MONTHLY","YEARLY"]}}},"UpdateAuthPolicyDto":{"type":"object","properties":{"maxSessionsPerUser":{"type":"number","minimum":0}},"required":["maxSessionsPerUser"]},"CreateBotFlowDto":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"description":{"type":"string","maxLength":500},"wabaId":{"type":"string","format":"uuid"},"phoneNumberId":{"type":"string","format":"uuid"},"triggerType":{"type":"string","enum":["KEYWORD","INTENT","MANUAL","AUTO_REPLY","WELCOME"]},"triggerConfig":{"type":"object"}},"required":["name","wabaId"]},"UpdateFlowDto":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"description":{"type":"string","maxLength":500},"enabled":{"type":"boolean"},"triggerType":{"type":"string","enum":["KEYWORD","INTENT","MANUAL","AUTO_REPLY","WELCOME"]},"triggerConfig":{"type":"object"},"phoneNumberId":{"type":"string","nullable":true},"json":{"type":"object"}}},"TestRunDto":{"type":"object","properties":{"messages":{"type":"array","items":{"type":"string"}}}},"UpsertBotConfigDto":{"type":"object","properties":{"enabled":{"type":"boolean"},"mode":{"type":"string","enum":["OFF","RULES_ONLY","RULES_PLUS_AI_FALLBACK","AI_AGENT"]},"cooldownSeconds":{"type":"number","description":"OBSOLETO: ya no descarta mensajes entrantes. Se acepta para no romper\n clientes viejos, pero no tiene efecto. Ver los dos campos siguientes.","minimum":0,"maximum":3600},"debounceSeconds":{"type":"number","description":"Segundos de silencio antes de responder, para agrupar los mensajes\n seguidos de una persona en un solo turno. 0 = responder de inmediato.","minimum":0,"maximum":30},"ritmoDeRespuesta":{"type":"string","description":"Ritmo con el que contesta el bot. INSTANTANEO = como siempre (todo de un\n tirón y en cuanto está listo). NATURAL y PAUSADO parten la respuesta en\n mensajes cortos y esperan entre ellos lo que tardaría una persona\n escribiéndolos. Lo que ya tardó la IA se descuenta.","enum":["INSTANTANEO","NATURAL","PAUSADO"]},"velocidadTecleoCps":{"type":"number","description":"Caracteres por segundo, para afinar por encima del preajuste.","minimum":5,"maximum":80},"maxRepliesPerWindow":{"type":"number","description":"Tope de respuestas del bot a un mismo contacto dentro de la ventana; al\n superarlo pasa a humano. 0 = sin tope.","minimum":0,"maximum":100},"replyWindowMinutes":{"type":"number","minimum":1,"maximum":120},"postFlowGraceMin":{"type":"number","description":"Minutos tras terminar un flujo en los que el bot no vuelve a arrancarlo,\n para que el cliente no lo reinicie sin querer. 0 = sin gracia. Conviene\n bajarlo si los flujos terminan preguntando algo: durante esos minutos,\n quien conteste lo que se le preguntó no recibe respuesta.","minimum":0,"maximum":1440},"disclosureMessage":{"type":"string","maxLength":2000},"humanHandoffKeywords":{"maxItems":20,"type":"array","items":{"type":"string"}},"handoffMessage":{"type":"string","description":"Texto que el bot envía al cliente cuando dispara handoff (tool del\n agente, keyword, regla o flujo). String vacío = no enviar nada.","maxLength":2000},"aiProvider":{"type":"string","enum":["anthropic","openai","openrouter","groq","meta","gemini","xai"]},"aiModel":{"type":"string","maxLength":120},"aiSystemPrompt":{"type":"string","maxLength":32000},"aiTemperature":{"type":"number","minimum":0,"maximum":2},"aiMaxTokens":{"type":"number","minimum":64,"maximum":8192},"intentClassifierEnabled":{"type":"boolean"},"knowledgeTopK":{"type":"number","minimum":1,"maximum":20},"knowledgeMinSimilarity":{"type":"number","minimum":0,"maximum":1},"knowledgeTags":{"maxItems":50,"type":"array","items":{"type":"string"}},"welcomeEnabled":{"type":"boolean"},"outOfHoursEnabled":{"type":"boolean"},"fallbackEnabled":{"type":"boolean"},"outOfHoursSchedule":{"type":"object"},"outOfHoursTaskEnabled":{"type":"boolean"},"outOfHoursTaskMessage":{"type":"string","description":"Admite {apertura}. Vacío = no avisar al cliente.","maxLength":1000},"outOfHoursTaskGraceMin":{"type":"number","minimum":0,"maximum":1440},"followUpEnabled":{"type":"boolean"},"followUpAfterMin":{"type":"number","minimum":3,"maximum":1440},"followUpCloseAfterMin":{"type":"number","minimum":5,"maximum":4320},"followUpMode":{"type":"string","enum":["AI","TEXT"]},"followUpMessage":{"type":"string","maxLength":1000},"followUpCloseMessage":{"type":"string","description":"Vacío = cerrar sin despedida.","maxLength":1000},"protectedValues":{"description":"Cuentas y números que el bot conoce pero nunca envía.","maxItems":50,"type":"array","items":{"type":"string","maxLength":80}}}},"CreateBotAgentDto":{"type":"object","properties":{"phoneNumberIds":{"description":"Canales (ids de número, reales o virtuales de web chat / Instagram) en los que atiende el agente. Vacío = todos los canales de la organización.","type":"array","items":{"type":"string","format":"uuid"}},"knowledgeDocIds":{"description":"La memoria propia del agente: documentos que consulta (ids). Además lee los documentos marcados como compartidos. Vacío = solo los compartidos.","type":"array","items":{"type":"string","format":"uuid"}},"phoneNumberId":{"type":"string","format":"uuid","deprecated":true,"description":"Atajo legado de un solo canal; usa phoneNumberIds."},"perfilDeCobroId":{"type":"string","nullable":true,"format":"uuid","description":"Marca (perfil de cobro) con la que cobra el agente. Manda sobre la del número cuando un número atiende varias marcas. null = la del número."},"knowledgeTags":{"maxItems":50,"deprecated":true,"description":"Sin efecto: la memoria del agente son sus documentos (knowledgeDocIds) y los compartidos.","type":"array","items":{"type":"string"}},"name":{"type":"string","maxLength":120},"description":{"type":"string","maxLength":500},"isDefault":{"type":"boolean"},"ritmoDeRespuesta":{"type":"string","description":"Anula el ritmo de respuesta de la organización para este agente.\n Sin valor = hereda. Ventas y soporte no llevan el mismo pulso.","enum":["INSTANTANEO","NATURAL","PAUSADO"]},"enabled":{"type":"boolean"},"sortOrder":{"type":"number","minimum":0,"maximum":9999},"provider":{"type":"string","enum":["anthropic","openai","openrouter","groq","meta","gemini","xai"]},"model":{"type":"string","maxLength":120},"systemPrompt":{"type":"string","maxLength":32000},"temperature":{"type":"number","minimum":0,"maximum":2},"maxTokens":{"type":"number","minimum":64,"maximum":8192},"enabledTools":{"type":"array","maxItems":10,"items":{"type":"string","enum":["transfer_to_human","set_contact_attribute","end_conversation","enviar_botones","enviar_lista","enviar_boton_enlace"]}},"interactiveMessages":{"type":"boolean","description":"«Botones y listas». Apagado, el agente no manda botones, listas ni botón de\nenlace: las opciones y los enlaces van en el texto. Por defecto encendido."},"maxImagesPerDay":{"type":"number","description":"Imágenes de la librería por cliente y por día (zona horaria de la\norganización). Solo cuentan las que manda la IA. 0 = ninguna.","minimum":0,"maximum":20},"maxDocumentsPerDay":{"type":"number","description":"Documentos de la librería por cliente y por día. 0 = ninguno.","minimum":0,"maximum":20},"enabledCapabilities":{"type":"array","maxItems":20,"items":{"type":"string","enum":["mosend_planes","mosend_cuenta","sell_licenses","cobro_libre","book_appointment","crear_pedido","whmcs_support","buscar_dominios","catalogo_servicios","send_images"]}},"routeTags":{"maxItems":30,"type":"array","items":{"type":"string"}},"knowledgeTopK":{"type":"number","minimum":1,"maximum":20},"knowledgeMinSimilarity":{"type":"number","minimum":0,"maximum":1}},"required":["name"]},"UpdateBotAgentDto":{"type":"object","properties":{"phoneNumberIds":{"description":"Canales (ids de número, reales o virtuales de web chat / Instagram) en los que atiende el agente. Vacío = todos los canales de la organización.","type":"array","items":{"type":"string","format":"uuid"}},"knowledgeDocIds":{"description":"La memoria propia del agente: documentos que consulta (ids). Además lee los documentos marcados como compartidos. Vacío = solo los compartidos.","type":"array","items":{"type":"string","format":"uuid"}},"phoneNumberId":{"type":"string","format":"uuid","deprecated":true,"description":"Atajo legado de un solo canal; usa phoneNumberIds."},"perfilDeCobroId":{"type":"string","nullable":true,"format":"uuid","description":"Marca (perfil de cobro) con la que cobra el agente. Manda sobre la del número cuando un número atiende varias marcas. null = la del número."},"knowledgeTags":{"maxItems":50,"deprecated":true,"description":"Sin efecto: la memoria del agente son sus documentos (knowledgeDocIds) y los compartidos.","type":"array","items":{"type":"string"}},"name":{"type":"string","maxLength":120},"description":{"type":"string","maxLength":500},"isDefault":{"type":"boolean"},"ritmoDeRespuesta":{"type":"string","description":"Anula el ritmo de respuesta de la organización para este agente.\n Sin valor = hereda. Ventas y soporte no llevan el mismo pulso.","enum":["INSTANTANEO","NATURAL","PAUSADO"]},"enabled":{"type":"boolean"},"sortOrder":{"type":"number","minimum":0,"maximum":9999},"provider":{"type":"string","enum":["anthropic","openai","openrouter","groq","meta","gemini","xai"]},"model":{"type":"string","maxLength":120},"systemPrompt":{"type":"string","maxLength":32000},"temperature":{"type":"number","minimum":0,"maximum":2},"maxTokens":{"type":"number","minimum":64,"maximum":8192},"enabledTools":{"type":"array","maxItems":10,"items":{"type":"string","enum":["transfer_to_human","set_contact_attribute","end_conversation","enviar_botones","enviar_lista","enviar_boton_enlace"]}},"interactiveMessages":{"type":"boolean","description":"«Botones y listas». Apagado, el agente no manda botones, listas ni botón de\nenlace: las opciones y los enlaces van en el texto. Por defecto encendido."},"maxImagesPerDay":{"type":"number","description":"Imágenes de la librería por cliente y por día (zona horaria de la\norganización). Solo cuentan las que manda la IA. 0 = ninguna.","minimum":0,"maximum":20},"maxDocumentsPerDay":{"type":"number","description":"Documentos de la librería por cliente y por día. 0 = ninguno.","minimum":0,"maximum":20},"enabledCapabilities":{"type":"array","maxItems":20,"items":{"type":"string","enum":["mosend_planes","mosend_cuenta","sell_licenses","cobro_libre","book_appointment","crear_pedido","whmcs_support","buscar_dominios","catalogo_servicios","send_images"]}},"routeTags":{"maxItems":30,"type":"array","items":{"type":"string"}},"knowledgeTopK":{"type":"number","minimum":1,"maximum":20},"knowledgeMinSimilarity":{"type":"number","minimum":0,"maximum":1}}},"UpsertOrgAiProviderDto":{"type":"object","properties":{"apiKey":{"type":"string","nullable":true,"description":"Key en plaintext. Opcional al actualizar (mantiene la actual si no se pasa).","minLength":8,"maxLength":512},"enabled":{"type":"boolean"},"defaultModel":{"type":"string","nullable":true,"description":"Override del modelo default. Null o '' para borrar el override.","maxLength":120},"workspaceId":{"type":"string","nullable":true,"description":"ID del workspace de Anthropic (formato \"wrkspc_...\"). Requerido para keys\nidentity-linked de Claude; se envía como header `anthropic-workspace-id`.\nNull o '' para borrarlo. Sólo aplica al proveedor anthropic.","maxLength":128}}},"SearchKnowledgeDto":{"type":"object","properties":{"query":{"type":"string","maxLength":1000},"topK":{"type":"number","description":"Cuántos chunks devolver (1-20, default 5).","minimum":1,"maximum":20},"tags":{"description":"Filtrar a docs que tengan alguno de estos tags.","maxItems":20,"type":"array","items":{"type":"string"}},"minSimilarity":{"type":"number","description":"Umbral de similitud coseno 0-1 (default 0.3).","minimum":0,"maximum":1},"agentId":{"type":"string","description":"Buscar como este agente: solo su memoria (sus documentos + compartidos).","format":"uuid"}},"required":["query"]},"NoteDto":{"type":"object","properties":{"title":{"type":"string","maxLength":200},"content":{"type":"string","maxLength":20000},"tags":{"type":"array","items":{"type":"string"}},"resolvesQuestionKey":{"type":"string","description":"Clave de la pregunta sin respuesta que esta nota cubre (viene de insights).","maxLength":120},"agentIds":{"maxItems":50,"type":"array","items":{"type":"string","format":"uuid"}},"compartido":{"type":"boolean"}}},"UrlSourceDto":{"type":"object","properties":{"url":{"type":"string","maxLength":2000},"title":{"type":"string","maxLength":200},"tags":{"type":"array","items":{"type":"string"}},"syncEveryHours":{"type":"number","description":"Cada cuántas horas volver a leer la página; sin valor = solo a mano.","minimum":1,"maximum":720},"agentIds":{"maxItems":50,"type":"array","items":{"type":"string","format":"uuid"}},"compartido":{"type":"boolean"}},"required":["url"]},"UploadOptsDto":{"type":"object","properties":{"title":{"type":"string","maxLength":200},"tags":{"type":"string","description":"Lista de tags separados por coma (viene como string en multipart).","maxLength":500},"agentIds":{"type":"string","description":"Multipart: ids de agentes separados por coma.","maxLength":2000},"compartido":{"type":"string","description":"Multipart: 'true' para que lo lean todos los agentes.","maxLength":5}}},"UpdateTitleDto":{"type":"object","properties":{"title":{"type":"string","maxLength":200}},"required":["title"]},"UpdateTagsDto":{"type":"object","properties":{"tags":{"maxItems":20,"type":"array","items":{"type":"string"}}},"required":["tags"]},"AsignacionDto":{"type":"object","properties":{"agentIds":{"maxItems":50,"type":"array","items":{"type":"string","format":"uuid"}},"compartido":{"type":"boolean"}},"required":["agentIds","compartido"]},"TurnoDto":{"type":"object","properties":{"rol":{"type":"string","enum":["user","assistant"]},"texto":{"type":"string","maxLength":8000}},"required":["rol","texto"]},"ConfiguradorDto":{"type":"object","properties":{"mensajes":{"maxItems":40,"type":"array","items":{"$ref":"#/components/schemas/TurnoDto"}},"instrucciones":{"type":"string","description":"Instrucciones que la persona tiene EN PANTALLA, aunque no las haya\nguardado. Sin esto el configurador partía de la versión del servidor y\nproponía encima de un texto que ya no era el que se estaba editando.","maxLength":60000}},"required":["mensajes"]},"TurnoDePruebaDto":{"type":"object","properties":{"rol":{"type":"string","enum":["user","assistant"]},"texto":{"type":"string","maxLength":4000}},"required":["rol","texto"]},"ProbarDto":{"type":"object","properties":{"mensajes":{"maxItems":40,"type":"array","items":{"$ref":"#/components/schemas/TurnoDePruebaDto"}},"instrucciones":{"type":"string","description":"Instrucciones a probar sin haberlas guardado todavía.","maxLength":60000}},"required":["mensajes"]},"CreateContactListDto":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"color":{"type":"string","description":"Color en hexadecimal (#RRGGBB)."}},"required":["name"]},"AddMembersDto":{"type":"object","properties":{"contactIds":{"type":"array","items":{"type":"string","format":"uuid"}}},"required":["contactIds"]},"RemoveMembersDto":{"type":"object","properties":{"contactIds":{"type":"array","items":{"type":"string","format":"uuid"}}},"required":["contactIds"]},"RemoveByFilterDto":{"type":"object","properties":{"q":{"type":"string","maxLength":200},"channel":{"type":"string","enum":["whatsapp","web","all"]},"identifiedOnly":{"type":"boolean"},"tagId":{"type":"string","format":"uuid"},"optInStatus":{"type":"string","enum":["UNKNOWN","OPTED_IN","OPTED_OUT"]},"country":{"type":"string","description":"Prefijo numérico del país, p. ej. \"57\".","maxLength":6},"language":{"type":"string","maxLength":8},"hasConversations":{"type":"boolean"},"lastActivityDaysGt":{"type":"number","minimum":1,"maximum":3650}}},"AddByTagDto":{"type":"object","properties":{"tagIds":{"type":"array","items":{"type":"string","format":"uuid"}}},"required":["tagIds"]},"AddByFilterDto":{"type":"object","properties":{"q":{"type":"string","maxLength":200},"channel":{"type":"string","enum":["whatsapp","web","all"]},"identifiedOnly":{"type":"boolean"},"tagId":{"type":"string","format":"uuid"},"optInStatus":{"type":"string","enum":["UNKNOWN","OPTED_IN","OPTED_OUT"]},"country":{"type":"string","description":"Prefijo numérico del país, p. ej. \"57\".","maxLength":6},"language":{"type":"string","maxLength":8},"hasConversations":{"type":"boolean"},"lastActivityDaysGt":{"type":"number","minimum":1,"maximum":3650}}},"CreateQuickReplyDto":{"type":"object","properties":{"shortcut":{"type":"string","description":"Atajo con el que se invoca (p. ej. «/saludo»)."},"title":{"type":"string"},"body":{"type":"string","description":"Texto que se inserta en el mensaje."}},"required":["shortcut","title","body"]},"UpdateQuickReplyDto":{"type":"object","properties":{"shortcut":{"type":"string"},"title":{"type":"string"},"body":{"type":"string"}}},"InstallSolutionDto":{"type":"object","properties":{"wabaId":{"type":"string","format":"uuid"}}},"InviteStaffDto":{"type":"object","properties":{"email":{"type":"string","format":"email"},"name":{"type":"string","maxLength":120},"role":{"type":"string","enum":["SUPERADMIN","AGENT"]}},"required":["email","role"]},"UpdateStaffDto":{"type":"object","properties":{"role":{"type":"string","enum":["SUPERADMIN","AGENT"]},"active":{"type":"boolean"}}},"ChangeStatusDto":{"type":"object","properties":{"status":{"type":"string","enum":["ONLINE","LUNCH","BREAK","MEETING","TRAINING"]}},"required":["status"]},"EndJornadaDto":{"type":"object","properties":{"note":{"type":"string","maxLength":2000}}},"CelebrationEnabledDto":{"type":"object","properties":{"start":{"type":"boolean"},"end":{"type":"boolean"},"lunchOut":{"type":"boolean"},"lunchIn":{"type":"boolean"}}},"CelebrationPhrasesDto":{"type":"object","properties":{"start":{"maxItems":50,"type":"array","items":{"type":"string","maxLength":120}},"end":{"maxItems":50,"type":"array","items":{"type":"string","maxLength":120}},"lunchOut":{"maxItems":50,"type":"array","items":{"type":"string","maxLength":120}},"lunchIn":{"maxItems":50,"type":"array","items":{"type":"string","maxLength":120}}}},"CelebrationSettingsDto":{"type":"object","properties":{"enabled":{"$ref":"#/components/schemas/CelebrationEnabledDto"},"phrases":{"$ref":"#/components/schemas/CelebrationPhrasesDto"}}},"UpdateAttendanceSettingsDto":{"type":"object","properties":{"enabled":{"type":"boolean"},"autoCloseEnabled":{"type":"boolean"},"inactivityMinutes":{"type":"number","minimum":5,"maximum":1440},"closeAtShiftEnd":{"type":"boolean"},"requireJornadaForInbox":{"type":"boolean"},"allowOvertime":{"type":"boolean"},"requireActiveToAttend":{"type":"boolean"},"workedCounting":{"type":"string","enum":["wall-clock","within-shift"]},"dayAttribution":{"type":"string","description":"`start-day` (jornada entera al día que empezó) o `split-by-day`.","enum":["start-day","split-by-day"]},"lateGraceMin":{"type":"number","description":"Minutos de gracia antes de contar tardanza.","minimum":0,"maximum":1439},"earlyLeaveGraceMin":{"type":"number","description":"Minutos de gracia antes de contar salida temprana.","minimum":0,"maximum":1439},"absenceMinWorkedMin":{"type":"number","description":"Minutos mínimos trabajados para que un día con turno no cuente como falta.","minimum":0,"maximum":1439},"payrollPeriod":{"type":"string","description":"Forma del período de nómina para los atajos de corte.","enum":["semimonthly","rolling-15","monthly"]},"includeOpenSessions":{"type":"boolean","description":"Incluir la jornada en curso (parcial) en los informes."},"celebrations":{"description":"Celebración de los hitos de la jornada (frases + explosión).","allOf":[{"$ref":"#/components/schemas/CelebrationSettingsDto"}]}}},"SetOvertimeDto":{"type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"]},"SetWorkModeDto":{"type":"object","properties":{"workMode":{"type":"string","enum":["FIXED","HOURLY"]}},"required":["workMode"]},"CorrectSessionDto":{"type":"object","properties":{"endedAt":{"type":"number","minimum":1,"description":"Nuevo instante de cierre (epoch en milisegundos).","example":1718650800000}},"required":["endedAt"]},"UpsertScheduleDto":{"type":"object","properties":{"isoYear":{"type":"number","minimum":2020,"maximum":2100},"isoWeek":{"type":"number","minimum":1,"maximum":53},"days":{"type":"object","description":"Matriz por día en TZ de la org: { \"mon\": [\"09:00-13:00\",\"14:00-18:00\"], ... }."},"lunch":{"type":"object","description":"Almuerzo fijo por día (informativo): { \"mon\": \"13:00-14:00\", ... }."},"pausas":{"type":"object","description":"Pausas programadas por día; ninguna se paga y se restan del turno:\n{ \"mon\": [{ \"desde\": \"13:00\", \"hasta\": \"14:00\", \"tipo\": \"pausa\" }], ... }.\nSi llega, reemplaza a `lunch` (el primer almuerzo de cada día se copia ahí)."},"copyToWeeks":{"type":"number","description":"Copiar el mismo horario a las próximas N semanas (turnos estables).","minimum":0,"maximum":52}},"required":["isoYear","isoWeek","days"]},"HolidayItemDto":{"type":"object","properties":{"date":{"type":"string"},"name":{"type":"string","minLength":1,"maxLength":120},"paid":{"type":"boolean","description":"Festivo pagado: acredita las horas del turno. Por defecto sí."}},"required":["date","name"]},"UpsertHolidaysDto":{"type":"object","properties":{"items":{"minItems":1,"maxItems":400,"type":"array","items":{"$ref":"#/components/schemas/HolidayItemDto"}}},"required":["items"]},"CreateLeaveDto":{"type":"object","properties":{"agentUserId":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["VACATION","SICK","PERMISSION","UNPAID","OTHER"]},"startDate":{"type":"string"},"endDate":{"type":"string","description":"Inclusivo: una novedad de un solo día lleva la misma fecha en ambos."},"note":{"type":"string","maxLength":500}},"required":["agentUserId","type","startDate","endDate"]},"ChannelsDto":{"type":"object","properties":{"push":{"type":"boolean"},"inApp":{"type":"boolean"},"email":{"type":"boolean"}}},"EventsDto":{"type":"object","properties":{"shiftStart":{"type":"boolean"},"lunchStart":{"type":"boolean"},"lunchEnd":{"type":"boolean"},"shiftEnd":{"type":"boolean"}}},"UpdateShiftRemindersDto":{"type":"object","properties":{"enabled":{"type":"boolean"},"channels":{"$ref":"#/components/schemas/ChannelsDto"},"events":{"$ref":"#/components/schemas/EventsDto"},"shiftStartLeadMin":{"type":"number","minimum":0,"maximum":120},"shiftEndLeadMin":{"type":"number","minimum":0,"maximum":120}}},"CommerceSettingsDto":{"type":"object","properties":{"isCartEnabled":{"type":"boolean","description":"Habilitar el carrito de compras en las conversaciones."},"isCatalogVisible":{"type":"boolean","description":"Hacer visible el catálogo en el perfil del negocio."}}},"UpdateOrderStatusDto":{"type":"object","properties":{"status":{"type":"object"}},"required":["status"]},"CreateFlowDto":{"type":"object","properties":{"wabaId":{"type":"string","format":"uuid"},"name":{"type":"string","maxLength":200},"categories":{"type":"array","items":{"type":"string"}},"flowJson":{"type":"string","description":"flow.json serializado (opcional al crear; se puede subir después)."}},"required":["wabaId","name","categories"]},"UpdateFlowJsonDto":{"type":"object","properties":{"flowJson":{"type":"string"}},"required":["flowJson"]},"UpdateFlowMetaDto":{"type":"object","properties":{"name":{"type":"string","maxLength":200},"categories":{"type":"array","items":{"type":"string"}}}},"PreviewPlanChangeDto":{"type":"object","properties":{"toPlanSlug":{"type":"string","description":"Slug del plan al que se quiere cambiar."},"couponCode":{"type":"string"}},"required":["toPlanSlug"]},"AddonChangeDto":{"type":"object","properties":{"addonType":{"type":"string","enum":["SEAT","WABA","STORAGE_BLOCK","ORGANIZATION"]},"quantity":{"type":"number","description":"Cantidad OBJETIVO (absoluta), no el delta. 0 = quitar todos.","minimum":0}},"required":["addonType","quantity"]},"PasskeyRegistrationVerifyDto":{"type":"object","properties":{"name":{"type":"string","description":"Nombre con el que el usuario reconoce la passkey («Mi iPhone»)."},"response":{"type":"object","description":"Respuesta de WebAuthn tal como la devuelve el navegador o la app."}},"required":["name","response"]},"RenamePasskeyDto":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]},"ConnectInstagramDto":{"type":"object","properties":{"code":{"type":"string","description":"`code` devuelto por el OAuth de Instagram al volver del redirect."},"state":{"type":"string","description":"`state` que devolvimos en `initiate`. Obligatorio: se consume una sola vez\ny sin él la conexión se rechaza."}},"required":["code","state"]},"PersistentMenuItemDto":{"type":"object","properties":{"title":{"type":"string","maxLength":30},"type":{"type":"string","description":"`postback` (registra lo que tocó el usuario) o `web_url` (abre un enlace).","enum":["postback","web_url"]},"value":{"type":"string","description":"URL si type=web_url; payload/slug si type=postback.","maxLength":1000}},"required":["title","type","value"]},"ConversationToolsDto":{"type":"object","properties":{"iceBreakers":{"description":"Preguntas frecuentes (máx 4) que IG muestra a usuarios nuevos.","maxItems":4,"type":"array","items":{"type":"string","maxLength":80}},"persistentMenu":{"description":"Ítems del menú persistente (máx 5).","maxItems":5,"type":"array","items":{"$ref":"#/components/schemas/PersistentMenuItemDto"}}}},"CreateFolderDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"parentId":{"type":"string","nullable":true},"visibility":{"type":"string","enum":["ORG","PRIVATE"]}},"required":["name"]},"VisibilityDto":{"type":"object","properties":{"visibility":{"type":"string","enum":["ORG","PRIVATE"]}},"required":["visibility"]},"RenameDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120}},"required":["name"]},"MoveDocumentDto":{"type":"object","properties":{"folderId":{"type":"string","nullable":true}},"required":["folderId"]},"SendDocumentDto":{"type":"object","properties":{"conversationId":{"type":"string","minLength":1},"caption":{"type":"string","maxLength":1024}},"required":["conversationId"]},"RequestDeletionDto":{"type":"object","properties":{"confirmOrgName":{"type":"string","minLength":1,"maxLength":200,"description":"Nombre EXACTO de la organización, como confirmación. Debe coincidir.","example":"Mi Empresa SAS"},"reason":{"type":"string","maxLength":1000,"description":"Motivo opcional de la baja (para feedback interno)."}},"required":["confirmOrgName"]},"RejectDeletionDto":{"type":"object","properties":{"notes":{"type":"string","maxLength":1000,"description":"Notas internas del staff sobre por qué se rechaza."}}},"AdminDeleteNowDto":{"type":"object","properties":{"confirmOrgName":{"type":"string","maxLength":200},"reason":{"type":"string","maxLength":500}},"required":["confirmOrgName"]}}}}