Ir al contenido
Seguridad

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?

Medidas de seguridad de Wixzel Voice
DatoValorFuente
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 devolverAPI: cifrado de credenciales
Claves de APISe muestran una vez; se guardan solo como HMAC-SHA256 con un pepper del lado del servidor; con scopes, sin scope de administradorAPI: claves
Inicio de sesión del conector MCPFlujo de código de autorización de OAuth 2.1, PKCE solo con S256; el token es una clave de API con scopes y revocabledocs: servidor MCP
WebhooksFirmados: X-Wixzel-Signature es un HMAC-SHA256 del cuerpo sin procesar; se rechazan las URL hacia redes privadasdocs: Webhooks
Rutas con dineroIdempotency-Key obligatorio en POST /v1/calls, POST /v1/agents/{id}/test-call y POST /v1/billing/topups; se conserva 24 horasAPI: idempotencia
Límites de tasa10 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 correodocs: Límites de tasa
TransporteTLS 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á cifradoAPI: refuerzo de HTTP, configuración SIP
Contraseñas de las cuentasbcrypt, costo 12API: cuentas
Dónde están los datosHostinger, Bombay, India; la consola y el sitio web en VercelPolítica de Privacidad
Números de tarjetaNunca llegan a Wixzel Voice; Dodo Payments es el comerciante registradoDatos
Informar de una vulnerabilidadaqeel@wixzel.com, como figura en /.well-known/security.txtsecurity.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:read o sip_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}/rotate emite 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 429 lleva Retry-After y 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?

Cifrada en reposo con AES-256-GCM. Una contraseña nueva o actualizada recibe su propia clave de mensaje, derivada con HKDF de una clave maestra que a su vez se deriva con scrypt a partir de un secreto que solo tiene el despliegue, y cada texto cifrado lleva el id de la clave con la que se escribió. Los valores guardados con el esquema anterior se siguen leyendo, y se vuelven a cifrar de esta forma la próxima vez que se guardan. GCM hace que una manipulación provoque un error al descifrar en lugar de una contraseña distinta sin que nadie lo note. La API nunca vuelve a devolver la contraseña, tampoco a ti.

¿Puede Wixzel Voice ver mi clave de API?

No. Una clave se muestra una vez, cuando se crea, y solo se guarda un HMAC-SHA256 de ella, con un pepper del lado del servidor. El prefijo 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?

Calcula un HMAC-SHA256 del cuerpo sin procesar de la solicitud con tu secreto de webhook y compáralo, en tiempo constante, con el encabezado 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?

La API, las bases de datos y los medios de las llamadas funcionan en Hostinger, en Bombay, India. Los proveedores de voz y lenguaje en Estados Unidos y la India procesan el audio y el texto mientras dura la llamada, y el motor sarvam procesa la voz en la India. La lista completa de subencargados está en la Política de Privacidad.

¿Wixzel Voice tiene alguna certificación de seguridad?

Hoy no. Wixzel Voice lo opera una sola persona; no hay informe SOC 2 ni ISO 27001. Esta página indica las medidas que aplica el código, y el Anexo de Tratamiento de Datos establece los compromisos, incluido el aviso de brechas en un plazo de 72 horas.

¿Cómo informo de un problema de seguridad en Wixzel Voice?

Escribe a aqeel@wixzel.com con lo que encontraste, cómo reproducirlo y el request_id de cualquier respuesta implicada. La misma dirección está publicada en /.well-known/security.txt.

Relacionado