{"openapi":"3.0.0","paths":{"/auth/signup":{"post":{"operationId":"AuthController_signup","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"summary":"Crear cuenta de usuario","tags":["Autenticación"]}},"/auth/login":{"post":{"operationId":"AuthController_login","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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/RefreshDto"}}}},"responses":{"204":{"description":""}},"summary":"Cerrar sesión (revoca el refresh token)","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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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"]}},"/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 (revoca sesiones existentes)","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/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/{orgId}/memberships":{"get":{"operationId":"MembershipsController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"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/{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}/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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"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/{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"]}},"/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"]}},"/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":[],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Desactiva el 2FA del usuario.","tags":["Doble factor (2FA)"]}},"/organizations/{orgId}/audit":{"get":{"operationId":"AuditController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"action","required":false,"in":"query","schema":{"type":"string"}},{"name":"resource","required":false,"in":"query","schema":{"type":"string"}},{"name":"actorUserId","required":false,"in":"query","schema":{"type":"string"}},{"name":"dateFrom","required":false,"in":"query","schema":{"type":"string"}},{"name":"dateTo","required":false,"in":"query","schema":{"type":"string"}},{"name":"cursor","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cliente final: lista de logs de SU organización con filtros.","tags":["Auditoría"]}},"/organizations/{orgId}/audit/export":{"get":{"operationId":"AuditController_exportCsv","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"action","required":false,"in":"query","schema":{"type":"string"}},{"name":"resource","required":false,"in":"query","schema":{"type":"string"}},{"name":"actorUserId","required":false,"in":"query","schema":{"type":"string"}},{"name":"dateFrom","required":false,"in":"query","schema":{"type":"string"}},{"name":"dateTo","required":false,"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":false,"in":"query","schema":{"type":"string"}},{"name":"action","required":false,"in":"query","schema":{"type":"string"}},{"name":"resource","required":false,"in":"query","schema":{"type":"string"}},{"name":"actorUserId","required":false,"in":"query","schema":{"type":"string"}},{"name":"dateFrom","required":false,"in":"query","schema":{"type":"string"}},{"name":"dateTo","required":false,"in":"query","schema":{"type":"string"}},{"name":"cursor","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Admin staff: cross-org audit con todos los filtros.","tags":["Auditoría"]}},"/admin/audit/export":{"get":{"operationId":"AuditController_adminExportCsv","parameters":[{"name":"orgId","required":false,"in":"query","schema":{"type":"string"}},{"name":"action","required":false,"in":"query","schema":{"type":"string"}},{"name":"resource","required":false,"in":"query","schema":{"type":"string"}},{"name":"dateFrom","required":false,"in":"query","schema":{"type":"string"}},{"name":"dateTo","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Admin staff: export CSV cross-org (sin feature gate, siempre permitido).","tags":["Auditoría"]}},"/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"]}},"/organizations/{orgId}/waba":{"get":{"operationId":"WabaController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"includeArchived","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"summary":"Restaura una WABA archivada y vuelve a suscribir webhooks.","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"}}],"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":false,"in":"query","schema":{"type":"string"}},{"name":"includeArchived","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"security":[{"bearer":[]}],"summary":"Lista los números de teléfono de la organización.","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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"summary":"Obtiene el detalle de un número de teléfono.","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/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}/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}/purge":{"delete":{"operationId":"PhoneNumbersController_purge","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":"HARD delete del número. Bloquea si hay cargos pendientes.","tags":["Números de teléfono"]}},"/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/RequestCodeDto"}}}},"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/VerifyCodeDto"}}}},"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":false,"in":"query","schema":{"type":"string"}},{"name":"includeArchived","required":false,"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":{"operationId":"WhatsAppLinksController_stats","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 las estadísticas de clicks de un enlace.","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":false,"in":"query","schema":{"type":"string"}},{"name":"size","required":false,"in":"query","schema":{}}],"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 wa.me 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 wa.me con el mensaje pre-llenado.","tags":["Enlaces de WhatsApp"]}},"/organizations/{orgId}/link-pages":{"get":{"operationId":"LinkPagesController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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}/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"]}},"/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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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}/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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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}/templates":{"get":{"operationId":"TemplatesController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"wabaId","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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/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/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"]}},"/organizations/{orgId}/contacts":{"get":{"operationId":"ContactsController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"q","required":false,"in":"query","schema":{"type":"string"}},{"name":"channel","required":false,"in":"query","schema":{"type":"string"}},{"name":"identifiedOnly","required":false,"in":"query","schema":{"type":"string"}},{"name":"tagId","required":false,"in":"query","schema":{"type":"string"}},{"name":"optInStatus","required":false,"in":"query","schema":{"type":"string"}},{"name":"country","required":false,"in":"query","schema":{"type":"string"}},{"name":"language","required":false,"in":"query","schema":{"type":"string"}},{"name":"createdSince","required":false,"in":"query","schema":{"type":"string"}},{"name":"hasConversations","required":false,"in":"query","schema":{"type":"string"}},{"name":"lastActivityDaysGt","required":false,"in":"query","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"type":"string"}},{"name":"pageSize","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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/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"}}],"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":false,"in":"query","schema":{"type":"string"}},{"name":"defaultOptIn","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":""}},"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}/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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string"}},{"name":"contactId","required":false,"in":"query","schema":{"type":"string"}},{"name":"conversationId","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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}":{"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}/conversations":{"get":{"operationId":"ConversationsController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string"}},{"name":"phoneNumberId","required":false,"in":"query","schema":{"type":"string"}},{"name":"assigneeUserId","required":false,"in":"query","schema":{"type":"string"}},{"name":"tagId","required":false,"in":"query","schema":{"type":"string"}},{"name":"unreadOnly","required":false,"in":"query","schema":{"type":"string"}},{"name":"handoffPending","required":false,"in":"query","schema":{"type":"string"}},{"name":"take","required":false,"in":"query","schema":{"type":"string"}},{"name":"cursor","required":false,"in":"query","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"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).","tags":["Conversaciones"]}},"/organizations/{orgId}/conversations/unread-counts":{"get":{"operationId":"ConversationsController_unreadCounts","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneNumberId","required":false,"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":false,"in":"query","schema":{"type":"string"}},{"name":"from","required":false,"in":"query","schema":{"type":"string"}},{"name":"to","required":false,"in":"query","schema":{"type":"string"}},{"name":"direction","required":false,"in":"query","schema":{"type":"string"}},{"name":"hasAttachment","required":false,"in":"query","schema":{"type":"string"}},{"name":"sentByMe","required":false,"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"summary":"Actualiza parcialmente la configuración del panel de workload (thresholds).","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":false,"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":false,"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":false,"in":"query","schema":{"type":"string"}},{"name":"metric","required":false,"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":false,"in":"query","schema":{"type":"string"}},{"name":"before","required":false,"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":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"string"}},{"name":"before","required":false,"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":false,"in":"query","schema":{"type":"string"}},{"name":"before","required":false,"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"}}],"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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"}}],"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/bulk-assign":{"post":{"operationId":"ConversationsController_bulkAssign","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"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"}}],"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"}}],"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"}}],"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"]}},"/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/{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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"summary":"Elimina un mensaje (lo oculta del inbox como tombstone).","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}/stickers":{"get":{"operationId":"StickersController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista la librería de stickers de la org.","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":[]}],"summary":"Sube un sticker propio (cualquier imagen → webp 512×512).","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":[]}],"summary":"\"Roba\" un sticker entrante de un mensaje del cliente a la librería.","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":[]}],"summary":"Envía un sticker de la librería a una conversación.","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":[]}],"summary":"Borra un sticker de la librería.","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":"","content":{"application/json":{"schema":{"type":"string"}}}}},"summary":"Verificación de webhook (Meta envía hub.challenge en GET una sola vez).","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/auto-replies":{"get":{"operationId":"AutoRepliesController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneNumberId","required":false,"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}/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"}},{"name":"limit","required":false,"in":"query","schema":{}}],"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}/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":[]}],"summary":"Añade o reemplaza la reacción del agente en un mensaje. WhatsApp Cloud API solo\npermite una reacción por usuario por mensaje, así que sustituye la previa si\nexiste (semántica de upsert).","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":[]}],"summary":"Remueve la reacción del agente actual del mensaje.","tags":["Reacciones"]}},"/organizations/{orgId}/web-chat/channels":{"get":{"operationId":"WebChatController_listChannels","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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}/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/SendMessageDto"}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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}/history":{"get":{"operationId":"WebChatPublicController_getHistory","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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}/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}/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)"]}},"/organizations/{orgId}/plan-limits":{"get":{"operationId":"PlanLimitsController_get","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"summary":"Plan actual + uso vs cuotas. Frontend lo usa para barras de progreso.","tags":["Plan & límites"]}},"/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":false,"in":"query","schema":{"type":"string"}},{"name":"since","required":false,"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":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"summary":"Valida y redime un cupón a nombre de la organización.","tags":["Facturación"]}},"/organizations/{orgId}/invoices":{"get":{"operationId":"InvoicesController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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/CreateCreditNoteDto"}}}},"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":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":false,"in":"query","schema":{"type":"string"}},{"name":"cursor","required":false,"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"summary":"Crea preference de recarga de saldo. Devuelve URL de checkout.","tags":["Pagos (Mercado Pago)"]}},"/webhooks/mercado-pago":{"post":{"operationId":"MercadoPagoController_webhook","parameters":[{"name":"id","required":false,"in":"query","schema":{}},{"name":"type","required":false,"in":"query","schema":{}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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/alert-settings":{"get":{"operationId":"WalletAlertsController_get","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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/messaging":{"get":{"operationId":"ReportsController_messaging","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"since","required":false,"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":false,"in":"query","schema":{"type":"string"}},{"name":"until","required":false,"in":"query","schema":{"type":"string"}},{"name":"category","required":false,"in":"query","schema":{"type":"string"}},{"name":"resolutionOutcome","required":false,"in":"query","schema":{"type":"string"}},{"name":"q","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"string"}},{"name":"cursor","required":false,"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":false,"in":"query","schema":{"type":"string"}},{"name":"compare","required":false,"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/by-agent":{"get":{"operationId":"ReportsController_teamByAgent","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"since","required":false,"in":"query","schema":{"type":"string"}},{"name":"until","required":false,"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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/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":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"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)"]}},"/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"}}],"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/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":false,"in":"query","schema":{"type":"string"}},{"name":"orgId","required":false,"in":"query","schema":{"type":"string"}},{"name":"from","required":false,"in":"query","schema":{"type":"string"}},{"name":"to","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"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":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"security":[{"bearer":[]}],"summary":"Listado global de pagos.","tags":["Administración (staff Mosend)"]}},"/admin/billing/wallets":{"get":{"operationId":"AdminController_listWallets","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"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":false,"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":false,"in":"query","schema":{"type":"string"}},{"name":"source","required":false,"in":"query","schema":{"type":"string"}},{"name":"orgId","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"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/organizations/{id}/billing/close":{"post":{"operationId":"AdminController_forceClosePeriod","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"summary":"Fuerza el cierre del periodo abierto y emite factura.","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":false,"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"summary":"Registra un pago manual contra una factura (transferencia, etc).","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/plans":{"get":{"operationId":"AdminController_listPlans","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"security":[{"bearer":[]}],"summary":"Lista todos los planes (incluye internos/no-públicos).","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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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/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"}}],"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"}}],"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":false,"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/billing/mp/reconcile":{"post":{"operationId":"AdminController_reconcileMp","parameters":[{"name":"hours","required":false,"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":false,"in":"query","schema":{"type":"string"}},{"name":"since","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"string"}},{"name":"orgId","required":false,"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":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"summary":"Borra un cupón (soft-delete si tiene redenciones).","tags":["Administración (staff Mosend)"]}},"/organizations/{orgId}/bot/flows":{"get":{"operationId":"FlowsController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneNumberId","required":false,"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/CreateFlowDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea un flujo del bot.","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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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/events":{"get":{"operationId":"BotEventsController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phoneNumberId","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"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":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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/{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}/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}/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"}}],"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"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"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"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Agrega contactos a una lista por sus ids.","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"}}],"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}/broadcasts":{"get":{"operationId":"BroadcastsController_list","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"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 pasás 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":false,"in":"query","schema":{"type":"string"}},{"name":"cursor","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Destinatarios de la difusión, filtrables por estado (para el detalle).","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}/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"}}],"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"}}],"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":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"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"]}},"/plans":{"get":{"operationId":"PlansController_list","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":false,"in":"query","schema":{"type":"string"}},{"name":"interval","required":false,"in":"query","schema":{"type":"string"}},{"name":"coupon","required":false,"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"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"summary":"Genera las opciones WebAuthn para registrar una nueva passkey.","tags":["Passkeys"]}},"/passkeys/registration/verify":{"post":{"operationId":"PasskeysController_registrationVerify","parameters":[],"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"}}],"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"]}},"/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":false,"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":false,"in":"query","schema":{"type":"string"}},{"name":"q","required":false,"in":"query","schema":{"type":"string"}},{"name":"type","required":false,"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":false,"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"}}],"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":"","content":{"application/json":{"schema":{"type":"object"}}}}},"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"]}}},"info":{"title":"Mosend WB API","description":"Tech Provider de Meta para WhatsApp Business Cloud API","version":"0.9.0","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":{"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"]},"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"}},"required":["refreshToken"]},"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"]},"UpdateUserDto":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":80},"locale":{"type":"string","maxLength":8}}},"ChangePasswordDto":{"type":"object","properties":{"currentPassword":{"type":"string","minLength":8,"maxLength":128},"newPassword":{"type":"string","minLength":8,"maxLength":128}},"required":["currentPassword","newPassword"]},"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}},"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},"currency":{"type":"string","maxLength":3},"timezone":{"type":"string","maxLength":64},"businessHoursSchedule":{"type":"object","nullable":true}}},"SetRoleDto":{"type":"object","properties":{}},"SetWabaScopeDto":{"type":"object","properties":{}},"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"}}},"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"}}}},"CreateInvitationDto":{"type":"object","properties":{"email":{"type":"string","format":"email"},"roleId":{"type":"string","format":"uuid"}},"required":["email","roleId"]},"AcceptInvitationDto":{"type":"object","properties":{"token":{"type":"string"}},"required":["token"]},"VerifyDto":{"type":"object","properties":{}},"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"]},"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"},"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":{}},"RequestCodeDto":{"type":"object","properties":{}},"VerifyCodeDto":{"type":"object","properties":{}},"RegisterDto":{"type":"object","properties":{}},"CreateLinkDto":{"type":"object","properties":{"phoneNumberId":{"type":"string","format":"uuid"},"name":{"type":"string","maxLength":120},"campaignTag":{"type":"string","maxLength":80},"prefilledMessage":{"type":"string","maxLength":1024},"metadata":{"type":"object"}},"required":["phoneNumberId","name"]},"UpdateLinkDto":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"campaignTag":{"type":"string","maxLength":80},"prefilledMessage":{"type":"string","maxLength":1024},"metadata":{"type":"object"}}},"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"}}},"SubscribeDto":{"type":"object","properties":{}},"UnsubscribeDto":{"type":"object","properties":{}},"RotateDto":{"type":"object","properties":{}},"UpsertProfileDto":{"type":"object","properties":{}},"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"]},"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"]},"UpdateContactDto":{"type":"object","properties":{"name":{"type":"string","maxLength":80},"language":{"type":"string","maxLength":8},"attributes":{"type":"object"},"optInStatus":{"type":"object"}}},"CreateNoteDto":{"type":"object","properties":{}},"UpdateNoteDto":{"type":"object","properties":{}},"CreateTaskDto":{"type":"object","properties":{}},"UpdateTaskDto":{"type":"object","properties":{}},"CompleteTaskDto":{"type":"object","properties":{}},"CreateTagDto":{"type":"object","properties":{}},"RecordOptInDto":{"type":"object","properties":{}},"SendMessageDto":{"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)."}}},"EditMessageDto":{"type":"object","properties":{}},"SendStickerDto":{"type":"object","properties":{}},"CreateAutoReplyDto":{"type":"object","properties":{}},"UpdateAutoReplyDto":{"type":"object","properties":{}},"UpdatePolicyDto":{"type":"object","properties":{}},"AdjustBalanceDto":{"type":"object","properties":{}},"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"},"botEnabled":{"type":"boolean"},"enabled":{"type":"boolean"}},"required":["name"]},"UpdateChannelDto":{"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"},"botEnabled":{"type":"boolean"},"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},"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"}}},"CreateSessionDto":{"type":"object","properties":{"visitorId":{"type":"string"},"mode":{"type":"string","enum":["anonymous","identified","verify-otp","host-identified"]},"name":{"type":"string","maxLength":200},"email":{"type":"string","format":"email"},"phone":{"type":"string"},"otp":{"type":"string"},"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"}},"required":["email"]},"LinkEmailDto":{"type":"object","properties":{"email":{"type":"string","format":"email"},"name":{"type":"string","maxLength":200}},"required":["email"]},"CreateOutboundDto":{"type":"object","properties":{}},"UpdateOutboundDto":{"type":"object","properties":{}},"RedeemCouponDto":{"type":"object","properties":{}},"CreateCreditNoteDto":{"type":"object","properties":{}},"CreateRechargeDto":{"type":"object","properties":{}},"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"]},"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":{}},"CreateLeadDto":{"type":"object","properties":{}},"AdminSetAddonDto":{"type":"object","properties":{}},"CreatePricingRuleDto":{"type":"object","properties":{}},"AdjustWalletDto":{"type":"object","properties":{"delta":{"type":"number"},"reason":{"type":"string","maxLength":500}},"required":["delta","reason"]},"MarkInvoicePaidDto":{"type":"object","properties":{"amount":{"type":"number","minimum":0.01},"description":{"type":"string","maxLength":500}},"required":["amount"]},"UpdateBillingConfigDto":{"type":"object","properties":{"billingCycleDay":{"type":"number","enum":[1,15]},"markupOverride":{"type":"number","nullable":true}}},"UpdatePlanDto":{"type":"object","properties":{}},"UpsertPlanPriceDto":{"type":"object","properties":{}},"UpdatePricingRuleDto":{"type":"object","properties":{}},"ReprocessPaymentDto":{"type":"object","properties":{}},"CreateCouponDto":{"type":"object","properties":{}},"UpdateCouponDto":{"type":"object","properties":{}},"CreateFlowDto":{"type":"object","properties":{}},"UpdateFlowDto":{"type":"object","properties":{}},"TestRunDto":{"type":"object","properties":{}},"UpsertBotConfigDto":{"type":"object","properties":{}},"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}}},"UploadOptsDto":{"type":"object","properties":{}},"UpdateTitleDto":{"type":"object","properties":{}},"UpdateTagsDto":{"type":"object","properties":{}},"InstallSolutionDto":{"type":"object","properties":{}},"AddonChangeDto":{"type":"object","properties":{}},"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"]}}}}