Seguridad en Wixzel Voice
Wixzel Voice cifra en reposo las contraseñas de los operadores, guarda las claves de API solo como hashes con pepper, firma cada webhook y mantiene la API y sus datos en Bombay, India. Esta página indica lo que el código aplica hoy, lo que todavía no está implementado y cómo informar de una vulnerabilidad.
Última actualización:
Publicado el
Wixzel Voice es una API de IA de voz para crear agentes de IA que hacen y contestan llamadas telefónicas reales a través de tu propia troncal SIP, o que hablan con personas en tus apps web y móviles. Una clave de API y un saldo prepagado cubren todos los motores de voz, con cobro por segundo de uso real. Eso significa que guarda tres cosas que vale la pena proteger: las credenciales de tu operador, las claves que gastan tu saldo, y el audio, las transcripciones y los contactos de las llamadas que hacen tus agentes.
¿Qué cifra, hashea y firma Wixzel Voice?
| Dato | Valor | Fuente |
|---|---|---|
| Contraseñas del operador (troncal SIP) | Los valores nuevos y actualizados se cifran en reposo con AES-256-GCM con una clave propia de cada despliegue; los valores anteriores se vuelven a cifrar la próxima vez que se guardan; la API nunca los vuelve a devolver | API: cifrado de credenciales |
| Claves de API | Se muestran una vez; se guardan solo como HMAC-SHA256 con un pepper del lado del servidor; con scopes, sin scope de administrador | API: claves |
| Inicio de sesión del conector MCP | Flujo de código de autorización de OAuth 2.1, PKCE solo con S256; el token es una clave de API con scopes y revocable | docs: servidor MCP |
| Webhooks | Firmados: X-Wixzel-Signature es un HMAC-SHA256 del cuerpo sin procesar; se rechazan las URL hacia redes privadas | docs: Webhooks |
| Rutas con dinero | Idempotency-Key obligatorio en POST /v1/calls, POST /v1/agents/{id}/test-call y POST /v1/billing/topups; se conserva 24 horas | API: idempotencia |
| Límites de tasa | 10 solicitudes por segundo por clave, ráfagas de 20; el inicio de sesión y la creación de cuentas se limitan por IP y por correo | docs: Límites de tasa |
| Transporte | TLS en las conexiones HTTPS y WebSocket a la API, la consola y el servidor MCP, con HSTS durante un año, subdominios incluidos. El SIP hacia tu operador usa el transporte de la troncal (UDP de forma predeterminada, TLS si se configura), y el audio de las llamadas (RTP) no está cifrado | API: refuerzo de HTTP, configuración SIP |
| Contraseñas de las cuentas | bcrypt, costo 12 | API: cuentas |
| Dónde están los datos | Hostinger, Bombay, India; la consola y el sitio web en Vercel | Política de Privacidad |
| Números de tarjeta | Nunca llegan a Wixzel Voice; Dodo Payments es el comerciante registrado | Datos |
| Informar de una vulnerabilidad | aqeel@wixzel.com, como figura en /.well-known/security.txt | security.txt |
¿Cómo protege Wixzel Voice las contraseñas de los operadores?
Wixzel Voice necesita la contraseña de tu troncal SIP para hacer llamadas a través de tu operador, así que no puede hashearla; la cifra. Las contraseñas de troncal nuevas y actualizadas, y todas las demás credenciales de terceros que la plataforma guarda en nombre de un cliente, se cifran en reposo con AES-256-GCM. La clave maestra se deriva con scrypt a partir de un secreto que solo existe en el entorno del despliegue, cada valor recibe su propia clave de mensaje mediante HKDF, y cada texto cifrado lleva el id de la clave que lo escribió, para que una futura rotación de claves pueda volver a cifrar los valores en lugar de perderlos. Los valores escritos con el esquema anterior se siguen leyendo, y se vuelven a cifrar de esta forma la próxima vez que se guardan.
GCM es autenticado: un texto cifrado alterado en la base de datos no se puede descifrar, en lugar de convertirse en otra contraseña. Una credencial que no se puede descifrar se rechaza de forma visible en lugar de tratarse como vacía, así que una troncal nunca puede quedar sin autenticación sin que nadie lo note. La API nunca vuelve a devolver la contraseña de una troncal, tampoco a ti.
La configuración de telefonía generada a partir de los ajustes de tu troncal está protegida contra inyecciones, y el generador se somete a pruebas de fuzzing contra esa propiedad.
¿Cómo guarda Wixzel Voice las claves de API y cómo limita su alcance?
Una clave wv_live_ se muestra una vez. Wixzel Voice guarda un HMAC-SHA256 de ella con un pepper del lado del servidor, así que una copia de la base de datos por sí sola no sirve para recuperar una clave ni para obtenerla por fuerza bruta. El prefijo y los cuatro últimos caracteres se guardan solo para que puedas reconocer una clave en una lista.
- Scopes. Cada clave lleva solo los scopes que concedes, como
calls:readosip_trunks:write. No hay scope de administrador, así que ninguna clave puede hacerlo todo. - Límites de gasto. Una clave puede llevar
spend_limit_micros; cuando una clave ha gastado su límite, las llamadas hechas con ella se rechazan antes de marcar. - Caducidad y rotación. Una clave puede llevar
expires_at.POST /v1/api-keys/{id}/rotateemite una clave de reemplazo y mantiene la anterior funcionando durante 24 horas, para que un despliegue nunca pase un momento sin una clave válida. - Revocación. Al revocar una clave, se elimina al instante de la caché de autenticación, así que deja de funcionar en la siguiente solicitud.
- Aislamiento. Cada recurso pertenece a una sola cuenta, y cada consulta se limita a la cuenta que la hizo.
¿Cómo inicia sesión el conector MCP de Wixzel Voice?
Los clientes de IA como claude.ai, Claude Desktop y Claude Code se conectan al servidor MCP de Wixzel Voice mediante un servidor de autorización OAuth 2.1 integrado en la API. Los clientes se registran por sí mismos (RFC 7591), te envían a la consola para que des tu consentimiento e intercambian el código por un token. PKCE es obligatorio, solo S256; el método plain se rechaza.
El token que recibe el cliente es una clave de API normal con solo los scopes que aprobaste, y revocar la autorización revoca la clave. Los endpoints de OAuth nunca aceptan una clave de API como credencial: un cliente se identifica con PKCE, y con un secreto de cliente si registró uno.
¿Cómo firma Wixzel Voice los webhooks?
Cada POST de webhook lleva X-Wixzel-Signature, un HMAC-SHA256 del cuerpo sin procesar con tu secreto de webhook como clave. Verifícalo sobre los bytes sin procesar, antes de analizarlos, y compara en tiempo constante. El secreto se devuelve una vez, cuando lo rotas, y nunca mediante GET /v1/webhook, así que una clave filtrada con scope de lectura no sirve para falsificar eventos.
Una URL de webhook que resuelve a loopback, a direcciones link-local o a un espacio de direcciones privado se rechaza con 400 unsafe_webhook_url al configurarla y otra vez en el momento de la entrega, y no se siguen las redirecciones. La plataforma puede llegar a direcciones a las que tú no puedes, así que no se le permite apuntar a ellas.
¿Qué impide que un reintento cobre dos veces en Wixzel Voice?
POST /v1/calls, POST /v1/agents/{id}/test-call y POST /v1/billing/topups exigen un Idempotency-Key. Repetir la solicitud con la misma clave y el mismo cuerpo devuelve la respuesta original en lugar de marcar o cobrar otra vez; la misma clave con otro cuerpo se rechaza con 422. Las claves se conservan 24 horas. Los dos SDK oficiales envían una automáticamente en esas rutas.
El crédito se reserva antes de hacer una llamada, una llamada que no puede cubrir sus primeros 15 segundos se rechaza con 402 antes de reservar nada, y los precios de cada llamada se fijan al admitirla. Los números de tarjeta nunca llegan a Wixzel Voice: los pagos pasan por Dodo Payments como comerciante registrado.
¿Qué protege a Wixzel Voice del abuso?
- Límites de tasa de la API: 10 solicitudes por segundo por clave, ráfagas de 20. Un
429llevaRetry-Aftery nunca se cobra. - El inicio de sesión y la creación de cuentas se limitan por dirección IP y por dirección de correo; las contraseñas se hashean con bcrypt con costo 12, y la creación de una cuenta con correo se confirma con un código enviado a esa dirección.
- Las sesiones de la consola viven en una cookie httpOnly, nunca en una URL; el algoritmo de firma del token de sesión está fijado; y puedes cerrar todas las sesiones a la vez.
- Los escáneres SIP que buscan números se bloquean temporalmente, y cada intento de llamada entrante se limita por dirección de origen antes de reservar crédito, así que el tráfico rechazado nunca se le cobra a nadie.
- Las llamadas simultáneas tienen un límite por cuenta, 5 de forma predeterminada, para que una cuenta no pueda ocupar todas las líneas de la plataforma.
- Refuerzo de HTTP: redirección a TLS, HSTS durante un año con subdominios incluidos, encabezados de seguridad y límites declarados para el cuerpo de las solicitudes.
- El SIP hacia tu operador usa el transporte configurado en la troncal: UDP de forma predeterminada, o TCP o TLS si configuras
transport. El audio de las llamadas (RTP) no está cifrado.
¿Dónde guarda los datos Wixzel Voice y quién los procesa?
La API de Wixzel Voice, sus bases de datos y los medios de las llamadas funcionan en Hostinger, en Bombay, India. La consola y este sitio web los sirve Vercel. Durante una llamada, los proveedores de voz y lenguaje del motor del agente (Deepgram, ElevenLabs, OpenRouter, Google o Sarvam) procesan el audio y el texto; están en Estados Unidos, excepto Sarvam, que procesa la voz en la India.
Las transcripciones, y las grabaciones si una llamada se graba, se conservan con el registro de la llamada hasta que las eliminas; DELETE /v1/calls/{id} elimina el registro, la transcripción y la grabación a la vez, y cerrar una cuenta desde la consola elimina todo su contenido de una vez. Los registros de solicitudes se descartan a los tres meses. La lista completa de subencargados, con la función y la ubicación de cada uno, está en la Política de Privacidad, y el Anexo de Tratamiento de Datos se aplica a todos los clientes, con aviso de brechas en un plazo de 72 horas.
¿Cómo se hacen las copias de seguridad de los datos de Wixzel Voice?
Las dos bases de datos de producción se vuelcan cada hora. Un simulacro semanal restaura el volcado más reciente en una base de datos temporal y comprueba que el saldo de cada cuenta sea igual a la suma de sus asientos contables, así se sabe que una copia de seguridad se puede usar, no solo que existe.
Un límite, con honestidad: las copias de seguridad se guardan en el mismo servidor, sin ninguna copia en otro lugar. Cubren un despliegue fallido, una base de datos dañada y datos eliminados por error; no cubren la pérdida del propio servidor.
¿Qué no está implementado todavía en Wixzel Voice?
- Wixzel Voice lo opera una sola persona; el acceso a producción está limitado a esa persona.
- No hay informe SOC 2 ni certificación ISO 27001.
- Los medios de las llamadas hacia los operadores no están cifrados: el audio de las llamadas (RTP) viaja sin SRTP, y la señalización SIP usa el transporte de la troncal, que es UDP a menos que configures TLS.
- No hay copia de seguridad externa: las copias se guardan en el mismo servidor que los datos.
- Todavía no se puede restringir una clave de API a determinadas direcciones IP de origen, ni mediante la API ni desde la consola.
¿Cómo informo de una vulnerabilidad en Wixzel Voice?
Escribe a aqeel@wixzel.com. La dirección también está publicada en /.well-known/security.txt. Incluye lo que encontraste, los pasos para reproducirlo y el request_id de cualquier respuesta implicada. Los mensajes los lee el operador, y la mayoría se responden en un día hábil.
Prueba solo con tu propia cuenta y tus propios datos, no degrades el servicio para otros clientes y da un plazo razonable para corregir un problema antes de publicarlo.
Preguntas frecuentes
¿Cómo guarda Wixzel Voice la contraseña de mi troncal SIP?
¿Puede Wixzel Voice ver mi clave de API?
wv_live_ y los cuatro últimos caracteres se guardan para que puedas reconocer una clave en una lista; nada de lo guardado permite reproducirla. Una clave perdida solo se puede reemplazar.¿Cómo verifico que un webhook viene de Wixzel Voice?
X-Wixzel-Signature. El secreto se muestra una vez, cuando lo rotas con POST /v1/webhook/rotate-secret, y GET /v1/webhook nunca lo devuelve.¿Dónde se guardan los datos de Wixzel Voice?
¿Wixzel Voice tiene alguna certificación de seguridad?
¿Cómo informo de un problema de seguridad en Wixzel Voice?
request_id de cualquier respuesta implicada. La misma dirección está publicada en /.well-known/security.txt.Relacionado
Qué se recopila, por qué, quién lo procesa y cuánto tiempo se conserva.
Las condiciones de tratamiento que se aplican a todos los clientes, con los subencargados.
Operador, precios, límites, reembolsos y ubicación de los datos, en una sola página.
Crea tu primer agente de voz

