# Make Agent Fast documentation (es)
---
# Registro de cambios
Source: /es/docs/account/changelog.md
{/* docs-visuals */}
## 2026-08-27 [#2026-08-27]
* Se documentó el lanzamiento desde una URL: la espera durante la generación, **Review & publish**, **Approve & publish** y la activación con el primer chat de un visitante o el primer lead.
* Se documentó la diferencia entre **Usar sitio web** y Claro/Oscuro en Aspecto, y que al guardar el aspecto se actualiza el embed en vivo (y las páginas alojadas que hayan quedado) sin necesidad de volver a publicar.
* Se alinearon los fragmentos de embed con los atributos actuales de `embed.js` y con el parámetro `?v=` del panel, que se usa para evitar la caché.
* Se documentó la conversación por voz en vivo en el probador de la plataforma frente al sitio publicado y al embed.
* Se eliminaron como producto el dominio personalizado, la compra de dominios y los ajustes de subdominio. Inserta el agente en el sitio web que ya tiene tu cliente. Los eventos del complemento de dominio de Polar que hayan quedado se seguirán ignorando o cancelando.
## 2026-07-28 [#2026-07-28]
* Se simplificó el historial de uso para mostrar los créditos finales consumidos en lugar de filas separadas de reserva y reembolso en el registro; el uso mínimo ahora se muestra como `<0.001`.
* Se hizo que las esquinas de selección del menú de acciones de la documentación se adapten a contenido de varias líneas, manteniendo la geometría del activador y del menú.
* Se ampliaron las guías en inglés, coreano y uzbeko sobre la facturación de llamadas en vivo, la entrada de contenido multimedia en el constructor visual, los cambios de subdominio alojado, los controles de privacidad y seguridad de la cuenta, y el feed de eventos de Notificaciones.
## 2026-07-15 [#2026-07-15]
* Se presentó la plataforma de documentación bilingüe de Make Agent Fast.
* Se añadieron, por página, Markdown, descargas, búsqueda y acciones para ChatGPT y Claude.
* Se añadieron `/docs/llms.txt`, `/docs/llms-full.txt` y las rutas canónicas `.md`.
* Se documentaron la API pública, el contrato del SDK, los webhooks, los embeds, los conectores, las operaciones, los precios, la seguridad y la privacidad.
* Se añadieron guías de implementación para los principales frameworks y creadores de sitios web.
## Política de versiones [#política-de-versiones]
Las correcciones de la documentación y los campos adicionales de la API pueden publicarse de forma continua. Los cambios incompatibles en la API pública requieren una nueva ruta principal o un período de migración documentado.
---
# Planes y precios
Source: /es/docs/account/pricing.md
{/* docs-visuals */}
## Comparación de planes [#comparación-de-planes]
| Plan | Facturación mensual | Total anual | Créditos mensuales | Agents | Voz en vivo | Distintivo de marca |
| ------- | ------------------: | ----------: | -----------------: | ------------------------: | ----------: | ------------------- |
| Launch | $15/mes | $144/año | 1000 | 1 | No incluida | Obligatorio |
| Operate | $35/mes | $336/año | 3000 | 3 | 30 min/mes | Se puede quitar |
| Scale | $79/mes | $758/año | 8000 | Ilimitados, uso razonable | 90 min/mes | Se puede quitar |
La facturación anual es un 20 % más barata que pagar el precio mensual doce veces. Launch y Operate comienzan con una prueba gratuita de siete días sin tarjeta de crédito; añade una tarjeta después del día 7 para mantener el agente activo. Scale comienza a facturarse de inmediato y no tiene prueba. Cuando se necesita una tarjeta, el proceso de pago muestra el precio exacto, el periodo de renovación, los impuestos y las condiciones antes de la compra.
Launch es un agente integrable y funcional esta misma semana. Operate es el siguiente paso cuando los clientes ya están conversando: voz en vivo, un widget más completo y canales de mensajería. Scale es el estudio completo: todos los controles de Look, roles de equipo y tus propias claves de proveedor.
## Escalera de funciones [#escalera-de-funciones]
| Capacidad | Launch | Operate | Scale |
| ----------------------- | -------------------------------------------- | -------------------------------------------------------- | ----------------------------------------------------------- |
| Agents | 1 | 3 | Ilimitados, uso razonable |
| Estudio de widget | Color de acento, posición, claro/oscuro | + etiqueta del lanzador, preajustes, colores adicionales | Todos los controles (radio, sombra, borde, fuente, cristal) |
| Idiomas de voz | 1 | 2 | Todos los compatibles |
| Ingesta de conocimiento | Pegar, URL, archivos | + YouTube, podcast, RSS | Igual que Operate |
| Canales de mensajería | Las conexiones existentes siguen funcionando | Nuevas conexiones | Nuevas conexiones |
| Claves propias (BYOK) | Las claves existentes siguen funcionando | Las claves existentes siguen funcionando | Guardar claves nuevas |
| Invitaciones de equipo | Los miembros existentes se mantienen | Los miembros existentes se mantienen | Nuevas invitaciones con roles |
No vendemos ni asociamos dominios de clientes. Integra el agente en el sitio web que ya tienes.
## Incluido en todos los planes [#incluido-en-todos-los-planes]
Todos los planes actuales incluyen:
* Una integración en el sitio web que ya tienes (`embed.js` + `data-agent`).
* Chat de texto, mensajes de voz, voces predefinidas, recuperación de conocimiento, FAQs y productos estructurados, y captura de leads.
* Integración en sitios web con controles de origen exactos.
* Acceso a la API pública con claves con alcance limitado, OAuth para aplicaciones revisadas, OpenAPI y límites de frecuencia que escalan según el plan.
* Analíticas, conversaciones, seguimiento de uso y la posibilidad de comprar paquetes de créditos.
La asignación de la API pública es de 120 solicitudes por clave de API por minuto en Launch, 600 en Operate y 1800 en Scale. Estos límites de solicitudes no sustituyen los derechos sobre recursos, las comprobaciones de créditos, la idempotencia ni los límites específicos de cada proveedor. Consulta [Límites de frecuencia](/es/docs/api/rate-limits).
## Cómo funcionan los créditos [#cómo-funcionan-los-créditos]
Los créditos pagan el trabajo de IA medido, como la generación, los turnos del agente, los embeddings de conocimiento, la transcripción y la síntesis de voz. No equivalen a un número fijo de mensajes: el proveedor, el modelo, la longitud de entrada y salida, la duración del contenido multimedia y el tipo de operación modifican el coste.
Los créditos mensuales del plan se renuevan en cada periodo de facturación. La asignación mensual no utilizada se acumula durante un ciclo adicional y después caduca. Los créditos de recarga comprados no caducan mientras la suscripción esté activa. Un saldo de créditos positivo no desbloquea una función exclusiva de un plan, como las llamadas en vivo, los sitios adicionales o la eliminación del distintivo.
Las claves de proveedor propias generan cargos aparte de OpenRouter (texto) o Speko (voz), los dos proveedores para los que se puede añadir una clave nueva; las claves directas de proveedores anteriores que ya estén guardadas siguen funcionando hasta que se revoquen. Guardar una clave es exclusivo de Scale. Con tu propia clave, cada acción cuesta una tarifa fija de plataforma (1 crédito por respuesta de chat) en lugar del cargo basado en tokens. BYOK no convierte las facturas del proveedor en créditos de Make Agent Fast ni elimina las comprobaciones de derechos de la plataforma. Consulta [Claves de proveedores de IA](/es/docs/account/provider-keys).
## Derechos de voz [#derechos-de-voz]
Los mensajes de voz están incluidos en todos los planes, pero su transcripción, modelo y síntesis de voz pueden consumir créditos. La voz en tiempo real en vivo usa una asignación mensual de minutos independiente: ninguno en Launch, 30 minutos en Operate y 90 minutos en Scale.
## Agents y marca [#agents-y-marca]
Launch admite un agente de cara al cliente y Operate admite hasta tres. La descripción de agentes ilimitados de Scale está sujeta a uso razonable y no es una invitación a crear un volumen abusivo o automatizado de tenants. Un agente incluye su conocimiento, la configuración de integración, los conectores, las analíticas y los datos de conversación. Cada agente recibe un Agent link, una página de chat pública en su propio subdominio. Las páginas de demostración alojadas que se conservan siguen mostrándose en subdominios; los agentes nuevos no obtienen una página de marketing alojada.
El distintivo de referencia «Made with Make Agent Fast» permanece en Launch. Los owners de Operate y Scale pueden quitarlo de los sitios publicados que tengan ese derecho.
## Paquetes de créditos [#paquetes-de-créditos]
| Compra | Precio | Qué cambia |
| --------------- | ----------: | ------------------------------------------------------------ |
| Paquete pequeño | $8 una vez | Añade 1000 créditos que no caducan mientras estés suscrito |
| Paquete mediano | $35 una vez | Añade 5000 créditos que no caducan mientras estés suscrito |
| Paquete grande | $90 una vez | Añade 15 000 créditos que no caducan mientras estés suscrito |
Las recargas solo añaden capacidad de uso. No aumentan el número de sitios, los límites de solicitudes de la API, los minutos en vivo ni los permisos de marca.
## Pruebas, renovación y cancelación [#pruebas-renovación-y-cancelación]
La prueba gratuita de Launch y Operate no se convierte automáticamente en una suscripción de pago: el día 7 el agente se pausa hasta que añadas una tarjeta. Una vez registrada una tarjeta, cancelar o un fallo en la renovación puede eliminar el acceso activo tras el periodo o la transición de estado aplicable del proveedor. Las integraciones, los conectores, los clientes de la API y las llamadas de voz pueden dejar de funcionar aunque los datos almacenados del espacio de trabajo se conserven.
## Elige un plan [#elige-un-plan]
* Elige **Launch** para un agente integrado con texto, mensajes de voz y un widget básico.
* Elige **Operate** cuando los clientes empiecen a conversar: llamadas en vivo, canales de mensajería, un widget personalizado, voz en dos idiomas o eliminación del distintivo.
* Elige **Scale** cuando varios agentes estén en producción: todos los controles del widget, voz en todos los idiomas compatibles, roles de equipo y tus propias claves de API.
Haz tus estimaciones a partir de pruebas de aceptación reales, no solo del número de mensajes. Publica un agente representativo, mide el uso de texto, voz y conocimiento, proyecta el tráfico y añade margen para reintentos, conectores, automatizaciones y picos de lanzamiento.
## Fuente de verdad de la facturación [#fuente-de-verdad-de-la-facturación]
El proceso de pago en vivo y el panel de facturación son la fuente de verdad para una compra concreta. Los impuestos, la presentación de la moneda, los métodos de pago, la elegibilidad para la prueba y la redacción del proveedor pueden variar según la ubicación y el estado de la cuenta. Si el proceso de pago difiere de esta página, detente y usa las condiciones del pago o contacta con soporte antes de pagar.
---
# Privacidad y datos
Source: /es/docs/account/privacy.md
{/* docs-visuals */}
El propietario del sitio decide qué conocimiento, qué datos introducidos por los visitantes y qué integraciones se utilizan en su experiencia. Make Agent Fast procesa los datos de la plataforma para prestar el servicio, conforme a los términos aplicables y al aviso de privacidad.
## Aviso al visitante [#aviso-al-visitante]
Explica el uso de IA, la grabación, la captura de leads, las analíticas y el seguimiento con un lenguaje adecuado a la experiencia y a los requisitos locales. No pidas al agente que recopile datos que no necesites.
## Ciclo de vida de los datos [#ciclo-de-vida-de-los-datos]
Eliminar una fuente afecta a las recuperaciones futuras. Eliminar una credencial detiene el acceso autorizado. Las conversaciones históricas, las exportaciones, los datos de canales externos y los registros de proveedores pueden tener comportamientos de retención independientes.
## Controles del propietario [#controles-del-propietario]
La página **Analíticas** del sitio puede exportar los leads capturados como JSON y eliminar un lead individual. Los informes de analíticas también se pueden exportar como Markdown, Excel o una vista de impresión/PDF. Una exportación crea una copia nueva bajo tu control; eliminar el registro de la plataforma no borra una descarga anterior, una conversación relacionada, un registro de un proveedor externo ni los datos conservados por un requisito legal.
Usa **Configuración de la cuenta** para cerrar sesión en todos los dispositivos o eliminar la cuenta de forma permanente. La eliminación de la cuenta intenta primero detener la suscripción a la plataforma, las suscripciones sobrantes de complementos de dominio de Polar y los recursos de los conectores; después elimina los sitios, agentes, conocimiento, conversaciones, leads, credenciales de API/OAuth, sesiones e historial de facturación almacenado localmente de la cuenta. Si no se puede confirmar que la facturación externa se ha detenido, la eliminación falla de forma segura y deja la cuenta intacta para que puedas reintentarlo sin riesgo o para una revisión del equipo de soporte.
## Solicitudes [#solicitudes]
Usa los controles de autoservicio cuando se ajusten a tu solicitud. Para una solicitud más amplia de acceso, rectificación, exportación o eliminación, recurre al soporte de la cuenta y al proceso descrito en la Política de privacidad vigente. Verifica la identidad de quien realiza la solicitud antes de revelar datos de la cuenta, e incluye las exportaciones posteriores y los proveedores externos en el plan de respuesta.
---
# Claves de proveedores de IA
Source: /es/docs/account/provider-keys.md
{/* docs-visuals */}
Con tu propia clave (BYOK) puedes hacer que las solicitudes de IA compatibles usen tu cuenta con el proveedor de IA. No necesitas una clave: la plataforma proporciona los modelos de forma predeterminada. Guardar una clave requiere el plan Scale. Las claves que ya estén guardadas siguen funcionando en Launch y Operate. Sigues pagando el plan de Make Agent Fast más una tarifa fija de plataforma por acción; el proveedor te factura directamente el uso de sus modelos.
## Proveedores compatibles [#proveedores-compatibles]
Solo se pueden añadir claves nuevas de dos proveedores: uno para texto y otro para voz:
| Proveedor | Se usa para | Crear o revisar una clave |
| ---------- | -------------------------------------------------------------------------- | --------------------------------------------------------- |
| OpenRouter | Generación de texto del agente con los modelos a los que OpenRouter enruta | [Claves de API de OpenRouter](https://openrouter.ai/keys) |
| Speko | Conversión de voz a texto y de texto a voz | [Plataforma de Speko](https://platform.speko.ai) |
### Claves heredadas [#claves-heredadas]
Las claves directas de proveedores guardadas antes del cambio a OpenRouter y Speko aparecen en **Claves heredadas**. Siguen funcionando hasta que las revoques y todavía puedes revocarlas, pero no puedes añadir ni reemplazar ninguna:
| Proveedor heredado | Se usa para | Referencia del proveedor |
| ----------------------------------------------- | ---------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Anthropic, OpenAI, Google Gemini, xAI, DeepSeek | Generación de texto del agente | [Documentación de la API de Anthropic](https://platform.claude.com/docs/en/api/overview), [Guía de inicio rápido de la API de OpenAI](https://developers.openai.com/api/docs/quickstart), [Claves de la API de Gemini](https://ai.google.dev/gemini-api/docs/api-key) |
| Deepgram | Conversión de voz a texto cuando Deepgram es el proveedor de STT configurado | [Claves de API de Deepgram](https://developers.deepgram.com/docs/create-additional-api-keys) |
| ElevenLabs | Conversión de texto a voz cuando ElevenLabs está configurado | [Autenticación de ElevenLabs](https://elevenlabs.io/docs/api-reference/authentication) |
La disponibilidad de proveedores también depende de los proveedores de texto, voz y tiempo real configurados en la plataforma. Guardar una clave válida no obliga a que todas las funciones usen ese proveedor.
Una clave de proveedor autoriza cargos y llamadas a modelos en el proveedor de IA externo. Una clave `maf_live_...` autoriza a tu software a llamar a la API pública de Make Agent Fast. Nunca pegues una en el campo de la otra.
## Añadir una clave de proveedor [#añadir-una-clave-de-proveedor]
1. Crea una clave en la consola de OpenRouter o de Speko y activa la facturación del proveedor o un límite de gasto si es necesario.
2. Abre **Panel → Ajustes → Claves de proveedores de IA**. Solo el propietario de facturación de un espacio de trabajo Scale puede guardar una clave.
3. Pega la clave en la tarjeta de **OpenRouter** o de **Speko**.
4. Selecciona **Probar y guardar**.
5. Espera el resultado de la validación y luego prueba la función que usa el proveedor.
Make Agent Fast realiza una solicitud de validación en vivo antes de guardar una clave; no se consumen tokens de modelo ni créditos de la plataforma. La clave no debe contener espacios ni saltos de línea y debe tener entre 16 y 512 caracteres. Las claves de OpenRouter deben empezar por `sk-or-`; las de Speko deben empezar por `sk_speko_` o `sk_live_`. La validación en vivo es la que decide.
Guardar otra clave válida del mismo proveedor reemplaza el valor almacenado anteriormente. Una clave que no supera la validación no se guarda, así que la clave que ya estaba guardada sigue funcionando. El panel solo conserva datos de identificación seguros, como los últimos cuatro caracteres, la fecha de validación y el estado.
## Cómo se selecciona el proveedor de texto [#cómo-se-selecciona-el-proveedor-de-texto]
Para la generación de texto, tiene prioridad una clave activa de OpenRouter. Si no hay ninguna, Make Agent Fast busca una clave heredada activa que coincida con el proveedor de texto configurado en la plataforma y después las demás claves heredadas de texto (Anthropic, OpenAI, Gemini, xAI, DeepSeek) en ese orden. Si no existe ninguna clave BYOK adecuada, usa el proveedor de la plataforma cuando el plan y la implementación lo permitan.
Las claves de voz son específicas de cada proveedor. Una clave de Speko se usa cuando la voz se procesa a través de Speko. Una clave heredada de Deepgram solo se usa cuando el proveedor activo de voz a texto es Deepgram; una clave heredada de ElevenLabs solo se usa cuando la conversión de texto a voz está configurada con ElevenLabs.
Las claves BYOK actualmente no reemplazan las credenciales de embeddings de conocimiento de la plataforma. La ingesta y la recuperación de conocimiento siguen usando el proveedor de embeddings configurado en la implementación.
## Facturación y créditos [#facturación-y-créditos]
* El proveedor externo cobra el uso de tokens de IA a la cuenta que emitió la clave.
* Make Agent Fast sigue cobrando la suscripción más una tarifa fija de plataforma por cada acción que se ejecuta con tu clave: 1 crédito por respuesta de chat en lugar del cargo basado en tokens. La tarifa cubre la recuperación, la orquestación y el alojamiento que rodean la llamada, y no es un porcentaje de tu factura de tokens.
* La tarifa se aplica por cada llamada al proveedor. Los pasos de voz que financia la plataforma (por ejemplo, la transcripción cuando solo tienes una clave de texto) se cobran a la tarifa normal, y las llamadas en vivo siempre usan la tarifa de la plataforma.
* Si se agota la cuota del proveedor, una solicitud puede fallar aunque aún te queden créditos de Make Agent Fast.
Revisa tanto **Uso y créditos** en Make Agent Fast como el panel de uso del propio proveedor.
## Estados de la clave y gestión de errores [#estados-de-la-clave-y-gestión-de-errores]
| Estado | Significado | Qué hacer |
| --------- | ------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `active` | La validación en vivo fue correcta | Prueba la función de destino y supervisa el uso en el proveedor |
| `invalid` | El proveedor rechazó posteriormente la clave almacenada | Revisa la facturación, las restricciones, la cuota y el estado de revocación en el proveedor; después guarda una clave de reemplazo (OpenRouter o Speko) |
| `revoked` | La clave está desactivada en Make Agent Fast | Guarda una nueva clave de OpenRouter o Speko si quieres que la función siga usando BYOK |
Si una solicitud falla porque un proveedor rechaza la credencial o la cuota, Make Agent Fast puede marcar la clave almacenada como no válida. Corregir la clave en el proveedor no revela ni reescribe el secreto almacenado; en el caso de una clave de OpenRouter o Speko, usa **Probar conexión** para volver a comprobarla o guarda de nuevo la clave que funciona. Una clave heredada que pasa a ser no válida no se puede reemplazar por otra clave heredada: en su lugar, migra ese proveedor a OpenRouter o Speko.
## Rotar una clave de proveedor [#rotar-una-clave-de-proveedor]
1. Crea una nueva clave de proveedor sin eliminar la anterior.
2. Guarda la nueva clave en Make Agent Fast y confirma que pasa a estar activa.
3. Prueba el chat de texto o los mensajes de voz, según cuál use ese proveedor.
4. Revoca la clave anterior en la consola del proveedor.
5. Revisa los registros del proveedor por si hubiera un uso inesperado de la clave anterior.
Si una clave queda expuesta en el control de versiones o en código del navegador, revócala de inmediato en el proveedor. Eliminarla únicamente de Make Agent Fast no impide que otra persona que la tenga siga usándola directamente con el proveedor.
---
# Seguridad
Source: /es/docs/account/security.md
{/* docs-visuals */}
## Acceso a la cuenta [#acceso-a-la-cuenta]
Usa una contraseña única, protege la cuenta de correo electrónico que utilizas para la recuperación, cierra las sesiones que no reconozcas y limita quién puede acceder a los sitios en producción.
Verifica el correo electrónico de tu cuenta desde el enlace que se envía después del registro. Las cuentas con contraseña pueden usar **¿Olvidaste tu contraseña?** en la página de inicio de sesión; un restablecimiento correcto revoca las sesiones existentes. En **Configuración de la cuenta** puedes cambiar una contraseña local, vincular Google de forma explícita cuando esté habilitado y cerrar sesión en todos los dispositivos. Las cuentas que solo usan OAuth no tienen una contraseña local que cambiar, y un inicio de sesión normal nunca vincula en silencio una identidad nueva.
## Secretos [#secretos]
Las claves de API, los tokens de los conectores, los secretos de las aplicaciones, los secretos de los webhooks y las claves de los proveedores de voz son credenciales. Guárdalos en un gestor de secretos aprobado, nunca en el código del cliente, y rótalos si quedan expuestos.
## Mínimo privilegio [#mínimo-privilegio]
Elige ámbitos de API acotados, aplicaciones dedicadas en las plataformas externas, orígenes de incrustación precisos y claves distintas para cada sistema. Elimina las credenciales e integraciones que no uses.
## Contenido y privacidad [#contenido-y-privacidad]
Sube solo los datos que el agente tenga permitido usar. Prueba las negativas y las rutas de escalado, y aplica reglas de retención a las exportaciones de conversaciones y de leads.
## Reportes [#reportes]
Si reportas una posible vulnerabilidad, incluye la URL o el componente afectado, el impacto y los pasos para reproducirla, sin acceder a los datos de otros usuarios.
---
# Solución de problemas
Source: /es/docs/account/troubleshooting.md
{/* docs-visuals */}
## Empieza con un caso reproducible [#empieza-con-un-caso-reproducible]
Antes de cambiar la configuración, anota:
* El espacio de trabajo/sitio, la ruta pública o el endpoint de la API, y la hora exacta con zona horaria.
* El resultado esperado y el resultado real.
* El navegador/dispositivo o el canal del proveedor externo.
* Si el fallo afecta a la vista previa del propietario, a una página de demostración alojada antigua, al widget incrustado, al conector y/o a la API.
* El texto de estado/error seguro, el `x-request-id` de la respuesta, el último error del conector o el ID del evento de entrega del proveedor.
* La última hora en la que funcionaba y el cambio reciente más pequeño.
No incluyas credenciales en texto plano de la API, del proveedor o del conector, secretos de webhook, datos privados de clientes, cabeceras de autorización completas ni contenido de conversaciones que no sea necesario.
## Los cambios del sitio no aparecen [#los-cambios-del-sitio-no-aparecen]
1. Confirma que la URL del dashboard corresponde al sitio y al espacio de trabajo correctos.
2. Confirma que la acción de guardado indicó que se completó correctamente.
3. Las instrucciones y el conocimiento indexado se aplican a las nuevas conversaciones sin necesidad de volver a publicar. Si el propio widget está oculto, actívalo de nuevo en el menú **Ponlo en marcha** de la página del Agent → **Widget para sitio web** (o en la tarjeta **En tu sitio web** de la pestaña **Resumen**).
4. En los ajustes de **Visualización** (y en la insignia de marca), los cambios se guardan automáticamente y ya actualizan el widget en vivo: no hace falta volver a publicar; abre una ventana privada.
5. Abre un widget incrustado real (o un slug alojado antiguo, si aún tienes alguno) en una ventana privada.
6. Si solo la vista previa social está desactualizada, usa la caché o el depurador de esa plataforma.
Despublicar y editar son cosas distintas. Un conector de mensajería conectado puede seguir respondiendo aunque el widget esté desactivado.
## La respuesta del agente es débil o incorrecta [#la-respuesta-del-agente-es-débil-o-incorrecta]
Haz exactamente la misma pregunta en el probador del propietario y en una conversación pública nueva. Confirma que la fuente de conocimiento relevante está indexada, contiene una respuesta explícita, está actualizada y no entra en conflicto con otra fuente. Revisa las reglas de idioma/personalidad por si hay algún límite que impida la respuesta.
Cuando la fuente no tiene respuesta, mejora el comportamiento de respaldo/escalado en lugar de indicarle al agente que adivine. Usa [Fuentes de conocimiento](/es/docs/build/knowledge) para crear un conjunto de aceptación con preguntas directas, parafraseadas y de límites.
## El lanzador del widget no aparece o está bloqueado [#el-lanzador-del-widget-no-aparece-o-está-bloqueado]
Confirma que el sitio está publicado, que la incrustación está habilitada, que el script tiene el slug exacto del sitio y que el origen padre final del navegador (incluidos esquema, nombre de host y puerto) está en la lista de permitidos. En DevTools, inspecciona la solicitud de `embed.js`, los errores de CSP, el estado del gestor de consentimiento, la solicitud del iframe y la presencia de una única raíz `data-maf-embed`.
Si el texto funciona pero el micrófono no, comprueba HTTPS, el permiso del navegador, el permiso `allow` del iframe y la Permissions Policy del sitio anfitrión. Sigue la guía completa de [Resumen de la incrustación](/es/docs/embed/overview) y [Seguridad y CSP](/es/docs/embed/security).
## La voz no funciona [#la-voz-no-funciona]
Separa el modo que falla: mensaje de voz, llamada en vivo o voz del conector. Que la vía de texto funcione solo demuestra que la clave del modelo de lenguaje es correcta.
Comprueba por separado las claves del proveedor de transcripción, de TTS y de tiempo real; después revisa el derecho del plan, el saldo de créditos, la asignación de minutos en vivo, el permiso del navegador y los idiomas configurados. Prueba con una grabación corta y limpia antes de investigar un archivo largo o con ruido.
## El conector no recibe mensajes [#el-conector-no-recibe-mensajes]
Usa la guía del canal y compara ambos lados. Confirma que el conector está habilitado, que las credenciales siguen validándose, que la URL de webhook/interacción/skill del proveedor es la actual, que el evento/Página/número/bloque necesario está suscrito, que el modo de la aplicación incluye al usuario de prueba y que la entrega por HTTPS público funciona.
Que la verificación del webhook tenga éxito no demuestra que la suscripción a eventos en tiempo de ejecución ni los permisos de salida sean correctos. Compara los registros de entrega del proveedor con **Último mensaje** y con el error guardado del conector. Prueba primero el texto y después la voz.
## No se ofrecen dominios personalizados [#no-se-ofrecen-dominios-personalizados]
No vendemos ni asociamos dominios de customers. Coloca el agente en el sitio que ya tienes mediante la [incrustación](/es/docs/embed/overview). Los eventos antiguos del complemento de dominio de Polar se ignoran o se cancelan y nunca generan credits.
## Falla una solicitud a la API [#falla-una-solicitud-a-la-api]
Registra el método, la ruta con versión, el estado, el código de error estable, el `x-request-id` de la respuesta y las cabeceras de límite de frecuencia relevantes. Después clasifica:
| Estado | Acción más probable |
| ------ | ---------------------------------------------------------------------------------------------------- |
| `400` | Corrige la forma del JSON/formulario o los detalles de validación; no reintentes sin cambios |
| `401` | Usa una credencial MAF válida, no caducada ni revocada; nunca uses una clave de proveedor |
| `403` | Añade el scope necesario o restablece el acceso al plan/recurso |
| `404` | Confirma que el ID pertenece al espacio de trabajo autenticado y que la ruta es correcta |
| `409` | Resuelve el conflicto de estado o reenvía la misma clave de idempotencia/carga útil |
| `415` | Envía el tipo de contenido documentado |
| `429` | Respeta las cabeceras `retry-after`/de restablecimiento con jitter; no hagas bucles de espera activa |
| `500` | Reintenta una solicitud segura/idempotente y conserva el ID de la solicitud y la hora |
Usa [Credenciales y tokens](/es/docs/api/credentials), [Scopes y errores](/es/docs/api/scopes-errors) y [Límites de frecuencia](/es/docs/api/rate-limits). Nunca resuelvas un error de la API moviendo una credencial de servidor al código del navegador.
## La facturación o el uso parecen incorrectos [#la-facturación-o-el-uso-parecen-incorrectos]
Distingue entre acceso a la plataforma, créditos mensuales, créditos comprados, número de sitios, minutos en vivo, frecuencia de la API, canales de mensajería (Operate+) y BYOK/team members (Scale). Una recarga solo cambia los credits. Los cargos del proveedor con BYOK son independientes de la facturación de Make Agent Fast.
Ante un uso inesperado, contén la fuente probable antes de investigar: desactiva un conector, revoca una clave, elimina un origen de incrustación no deseado o detén un bucle de reintentos de la API. Conserva el intervalo de tiempo y los ID de solicitud/proveedor sin exponer secretos.
## Reúne detalles seguros para el soporte [#reúne-detalles-seguros-para-el-soporte]
Si sigues bloqueado, usa el control de comentarios de la guía más relevante o contacta con soporte desde el dashboard con:
* El identificador del sitio/espacio de trabajo y la función afectada.
* La marca de tiempo exacta con zona horaria y los pasos reproducibles.
* El resultado esperado frente al real.
* La URL pública sin secretos, cuando sea relevante.
* El estado HTTP, el código de error estable, el `x-request-id` o el ID del evento del proveedor.
* Una captura de pantalla censurada o una carga útil mínima sin secretos ni datos personales.
Indica lo que ya has comprobado. Así evitas que te repitan consejos de configuración y se delimita claramente dónde está el fallo.
---
# Autenticación
Source: /es/docs/api/authentication.md
{/* docs-visuals */}
Usa una clave de API para tu propio backend o para automatizaciones. Usa OAuth cuando tu aplicación pida a otros usuarios de Make Agent Fast que le concedan acceso. Ambos tipos de credenciales llaman a los mismos recursos de `/api/v1` y respetan los mismos permisos, derechos del plan, aislamiento entre tenants y límites de frecuencia.
## Claves de API [#claves-de-api]
Se requiere un plan de pago activo para crear y usar una clave de API pública.
1. Abre **Panel → Ajustes → Desarrollador**.
2. Introduce un nombre que identifique el servicio y el entorno, como `Production lead export`.
3. Selecciona los permisos mínimos que necesita el servicio.
4. Elige una caducidad: 30 días, 90 días, un año o sin caducidad.
5. Crea la clave y copia de inmediato el valor `maf_live_...`.
Make Agent Fast almacena un hash SHA-256 en lugar de texto plano recuperable. Más adelante, el panel muestra un prefijo seguro, los permisos, la caducidad, la fecha de último uso y el estado de revocación.
```http
Authorization: Bearer maf_live_...
```
Envía el encabezado desde código de servidor:
```bash
curl --fail-with-body https://makeagent.fast/api/v1/me \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Accept: application/json"
```
Si faltan las credenciales, se devuelve `401 authentication_required`. Las claves no válidas, caducadas o revocadas devuelven `401 invalid_api_key`. Una clave cuya cuenta ya no tiene un plan de pago activo devuelve `403 subscription_required`.
### Rotar o revocar una clave [#rotar-o-revocar-una-clave]
Crea una clave de reemplazo antes de revocar la anterior. Despliega la nueva clave, haz una solicitud real, verifica su `x-request-id` y después haz clic en **Revocar** en la clave anterior. La revocación es inmediata y no se puede deshacer.
En los ajustes de **Desarrollador**, **Editar** te permite cambiar el nombre y los permisos de una clave activa; el cambio se aplica de inmediato a esa misma clave. No se pueden cambiar su caducidad ni su token: crea una clave de reemplazo para obtener una nueva caducidad o un token rotado.
## Aplicaciones OAuth [#aplicaciones-oauth]
OAuth está pensado para software que se conecta a cuentas que pertenecen a otros usuarios de Make Agent Fast. Utiliza Authorization Code con PKCE (`S256`) y no emite ni requiere un client secret. El client ID es público; los códigos de autorización, los tokens de acceso, los tokens de actualización y el verificador PKCE son información sensible.
### 1. Registra la aplicación [#1-registra-la-aplicación]
Abre **Panel → Ajustes → Desarrollador → Aplicaciones OAuth**. Añade:
* Un nombre de aplicación de entre 2 y 100 caracteres.
* Entre 1 y 10 URL de redirección exactas.
* Los permisos máximos que tu aplicación puede solicitar.
Las URL de redirección en producción deben usar HTTPS y no pueden contener credenciales ni fragmentos. El URI completo debe coincidir con un valor registrado durante la autorización y el intercambio del token. Las aplicaciones recién enviadas tienen el estado `pending`; la autorización solo funciona después de que la aplicación se revise y se marque como `approved`.
El propietario de la plataforma revisa los client ID pendientes con el flujo auditado `oauth:review`. Conserva el client ID que se muestra tras el envío; su estado es visible en la página de Desarrollador, y las aplicaciones rechazadas incluyen la decisión de revisión antes de poder volver a enviarse.
### 2. Genera los valores PKCE [#2-genera-los-valores-pkce]
Genera un verificador nuevo para cada intento de autorización y guárdalo en la misma sesión protegida y de corta duración que `state`.
```ts
import { createHash, randomBytes } from "node:crypto";
const verifier = randomBytes(48).toString("base64url");
const challenge = createHash("sha256").update(verifier).digest("base64url");
const state = randomBytes(24).toString("base64url");
```
El verificador debe contener entre 43 y 128 caracteres PKCE seguros para URL. Solo se acepta `code_challenge_method=S256`.
### 3. Redirige al usuario para que dé su consentimiento [#3-redirige-al-usuario-para-que-dé-su-consentimiento]
```text
https://makeagent.fast/oauth/authorize
?client_id=maf_app_...
&redirect_uri=https%3A%2F%2Fapp.example.com%2Foauth%2Fcallback
&response_type=code
&scope=sites%3Aread%20leads%3Aread
&state=RANDOM_STATE
&code_challenge=PKCE_CHALLENGE
&code_challenge_method=S256
```
El usuario inicia sesión, revisa los permisos solicitados y permite o deniega el acceso. Si lo permite, Make Agent Fast redirige al URI registrado exacto con `code` y el `state` original. Si lo deniega, envía `error=access_denied` y el `state` original cuando se haya proporcionado uno.
Rechaza el callback si `state` no coincide exactamente con el valor almacenado para esa sesión del navegador.
### 4. Intercambia el código de autorización [#4-intercambia-el-código-de-autorización]
El código de autorización caduca a los 10 minutos y solo puede usarse una vez.
```bash
curl --fail-with-body https://makeagent.fast/api/oauth/token \
-X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "grant_type=authorization_code" \
--data-urlencode "client_id=maf_app_..." \
--data-urlencode "code=$AUTHORIZATION_CODE" \
--data-urlencode "redirect_uri=https://app.example.com/oauth/callback" \
--data-urlencode "code_verifier=$PKCE_VERIFIER"
```
```json
{
"access_token": "maf_live_...",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "maf_refresh_...",
"scope": "sites:read leads:read"
}
```
El token de acceso dura una hora. El token de actualización dura hasta 90 días, salvo que se rote o se revoque antes.
### 5. Rota el token de actualización [#5-rota-el-token-de-actualización]
Cada actualización correcta revoca tanto el token de actualización enviado como su token de acceso anterior, y devuelve un nuevo par. Guarda el nuevo par de forma atómica antes de descartar el estado de la respuesta anterior.
```bash
curl --fail-with-body https://makeagent.fast/api/oauth/token \
-X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "grant_type=refresh_token" \
--data-urlencode "client_id=maf_app_..." \
--data-urlencode "refresh_token=$REFRESH_TOKEN"
```
Reutilizar un código de autorización o un token de actualización ya rotado devuelve `invalid_grant`. El endpoint de tokens de OAuth devuelve respuestas de estilo OAuth `{ "error", "error_description" }` en lugar del envoltorio de errores de la API pública, y permite 30 solicitudes de token por dirección IP del solicitante por minuto.
## Nunca autentiques solicitudes de gestión en código de navegador [#nunca-autentiques-solicitudes-de-gestión-en-código-de-navegador]
No incluyas una clave de API secreta, un token de acceso ni un token de actualización en componentes cliente de React, JavaScript estático, web móvil, Webflow, Framer, Wix ni Shopify Liquid. Usa tu backend autenticado. La inserción pública del sitio web utiliza un slug de sitio no secreto y una lista de orígenes permitidos, no credenciales de la API de gestión.
Consulta [Credenciales y tokens](/es/docs/api/credentials), [Permisos y errores](/es/docs/api/scopes-errors) y [Guía de inicio rápido de la API](/es/docs/api/quickstart).
---
# Credenciales y tokens
Source: /es/docs/api/credentials.md
{/* docs-visuals */}
Make Agent Fast utiliza varios tipos de credenciales. No son intercambiables. Antes de copiar un valor, identifica qué sistema lo emitió, qué sistema lo recibe y si es seguro exponerlo en un navegador.
## Mapa de credenciales [#mapa-de-credenciales]
| Credencial | Se crea en | La utiliza | ¿Es secreta? | Formato o valor habitual |
| ------------------------------------------------- | -------------------------------------------------- | ---------------------------------------------- | ------------ | --------------------------------------- |
| Slug del sitio publicado | Panel del sitio | Cargador del código incrustado en el sitio web | No | `my-agent` |
| Clave de API de Make Agent Fast | **Ajustes → Desarrollador** | Tu backend o automatización | Sí | `maf_live_...` |
| ID de cliente de OAuth | **Ajustes → Desarrollador** | Aplicación multicuenta | No | `maf_app_...` |
| Token de acceso de OAuth | Endpoint de tokens de OAuth | El backend de tu aplicación | Sí | Token Bearer, con una hora de validez |
| Token de actualización de OAuth | Endpoint de tokens de OAuth | Tu almacén seguro de tokens | Sí | `maf_refresh_...`, se rota con cada uso |
| Clave de API de proveedor de IA (opcional, Scale) | OpenRouter (texto) o Speko (voz) | Backend de Make Agent Fast | Sí | `sk-or-...` o `sk_speko_...` |
| Token de conector o secreto de aplicación | Telegram, Meta, Discord o Kakao | Servicio de conectores de Make Agent Fast | Sí | Depende del proveedor |
| Secreto de firma de webhook | Creación del endpoint de webhook de la API pública | Tu receptor de webhooks | Sí | `whsec_...` |
El cargador del código incrustado necesita un slug de sitio público y un origen de sitio web permitido. No añadas nunca una clave de API de Make Agent Fast, una clave de proveedor, un token de conector ni un secreto de webhook a la etiqueta script.
## Elige el método de autorización adecuado [#elige-el-método-de-autorización-adecuado]
Usa una **clave de API de Make Agent Fast** para un servidor que controles y una única cuenta de Make Agent Fast. Elige solo los permisos (scopes) que ese servidor necesite.
Usa **OAuth Authorization Code con PKCE** cuando tu producto conecte cuentas que pertenecen a otros usuarios de Make Agent Fast. Las aplicaciones OAuth requieren revisión antes de que la autorización en producción se complete correctamente.
Usa una **clave de proveedor de IA** solo cuando quieras que Make Agent Fast llame a ese proveedor de IA con cargo a tu cuenta de proveedor. Una clave de proveedor no autoriza la API pública de Make Agent Fast.
Usa las **credenciales de conector** únicamente en el formulario de conector correspondiente o en la solicitud a la API del conector. Un token de bot de Telegram no puede autorizar solicitudes a Discord, Meta ni a la API de Make Agent Fast.
## Almacena los secretos de forma segura [#almacena-los-secretos-de-forma-segura]
Para el desarrollo local, coloca los secretos en un archivo de entorno ignorado por Git o en el entorno de tu shell:
```bash
export MAF_API_KEY="maf_live_..."
```
Para el despliegue, usa el gestor de secretos cifrado de tu proveedor de alojamiento. No pongas secretos en:
* Commits de Git, descripciones de incidencias, capturas de pantalla, propiedades de analítica ni mensajes de soporte.
* `NEXT_PUBLIC_*`, `VITE_*` u otras variables incluidas en el JavaScript del navegador.
* Webflow, Framer, Wix, Shopify Liquid, HTML de WordPress ni un bundle web móvil.
* Cadenas de consulta (query strings). Las URL suelen conservarse en el historial del navegador, en proxies y en registros.
Realiza las llamadas a la API a través de tu backend autenticado. El navegador debe llamar a tu backend, y tu backend debe adjuntar el secreto.
```ts
const response = await fetch("https://makeagent.fast/api/v1/sites", {
headers: { Authorization: `Bearer ${process.env.MAF_API_KEY}` },
});
```
## Reglas de los secretos de un solo uso [#reglas-de-los-secretos-de-un-solo-uso]
Las claves de API, los secretos de firma de webhook y los tokens de actualización de OAuth recién emitidos deben copiarse en el momento en que se muestran. El valor completo en texto plano no se puede recuperar más tarde. Si lo pierdes, crea uno de reemplazo en lugar de pedir al soporte que te lo revele.
Las credenciales de proveedores de IA y de conectores se cifran antes de almacenarse y no se devuelven a través de las API de listado. El panel puede mostrar una etiqueta, un prefijo, los últimos cuatro caracteres, el estado de validación o la hora del último uso para que puedas identificar una credencial sin exponerla.
## Lista de comprobación para la rotación [#lista-de-comprobación-para-la-rotación]
1. Crea la credencial de reemplazo con los mismos permisos mínimos (scopes) o permisos de proveedor.
2. Actualiza un despliegue o receptor a la vez.
3. Verifica que una solicitud real se realiza correctamente y registra su `x-request-id`.
4. Revoca la credencial anterior.
5. Confirma que las solicitudes antiguas fallan con `401 invalid_api_key` o con el error equivalente del proveedor.
En el caso de OAuth, guarda el nuevo token de actualización que devuelve cada respuesta de actualización antes de descartar el token anterior. Para la rotación del secreto de webhook, ejecuta los endpoints antiguo y nuevo en paralelo hasta que todos los emisores y receptores usen el de reemplazo.
## Si un secreto queda expuesto [#si-un-secreto-queda-expuesto]
Revócalo o rótalo de inmediato. Eliminarlo del último commit de Git no es suficiente, porque puede permanecer en el historial, en cachés, en registros o en forks. Revisa la actividad tanto en Make Agent Fast como en el proveedor que emitió la credencial, y reemplaza cualquier credencial que compartiera la misma ubicación de almacenamiento o el mismo entorno de despliegue.
Continúa con [Autenticación](/es/docs/api/authentication), [Permisos y errores](/es/docs/api/scopes-errors) o [Claves de proveedor de IA](/es/docs/account/provider-keys).
---
# Descripción general de la API
Source: /es/docs/api/overview.md
{/* docs-visuals */}
La API pública utiliza JSON orientado a recursos sobre HTTPS bajo `/api/v1`. Está disponible en los planes de pago y utiliza los mismos derechos de acceso a sitios, créditos y funcionalidades que el panel de control.
## Qué puedes automatizar [#qué-puedes-automatizar]
* Sitios y estado de publicación
* Configuración del agente, preguntas frecuentes, productos y conocimiento
* Conversaciones (incluidas las respuestas del propietario, la pausa y la reanudación), leads, analíticas, notificaciones y difusiones
* Creación de leads y consentimiento, pipelines de oportunidades, resultados de CRM y recuperación de sincronización
* Connectors, monetización, tickets, equipo, uso e información de la cuenta
* Suscripciones a webhooks firmados para los eventos compatibles
Las acciones sensibles utilizan endpoints de acción explícitos en lugar de una modificación sin restricciones de la base de datos. Los secretos de los connectors se aceptan al escribir, pero nunca se devuelven.
Esta es una **API de gestión y sincronización**. Puede crear y actualizar leads,
aceptarlos en un pipeline de oportunidades, importar resultados de CRM ganados o perdidos
con atribución de origen, reintentar las importaciones de resultados fallidas y responder a un visitante
como el negocio, pausando y reanudando el agente en esa conversación. Enviar mensajes como el visitante
sigue siendo una operación del widget; las analíticas y el uso siguen siendo de solo lectura. Los dominios
personalizados se han eliminado y las rutas `/domains` devuelven `409`.
## Empieza de forma segura [#empieza-de-forma-segura]
Crea una clave con alcance limitado en el panel de control, llama al endpoint de la cuenta actual y después desarrolla sobre un sitio de prueba antes de tocar el contenido de producción.
```bash
curl https://makeagent.fast/api/v1/me \
-H "Authorization: Bearer maf_live_YOUR_KEY"
```
Consulta [Autenticación](/es/docs/api/authentication), el [inicio rápido de la API](/es/docs/api/quickstart) y la [referencia de la API](/es/docs/api/reference).
---
# Guía de inicio rápido de la API
Source: /es/docs/api/quickstart.md
{/* docs-visuals */}
Esta guía de inicio rápido verifica que un backend pueda autenticarse y leer tu cuenta. Necesitas un plan de pago activo, una terminal con `curl` y acceso a **Panel → Ajustes → Desarrollador**.
La API v1 actual gestiona y sincroniza recursos. No es un medio de transporte
para chats personalizados: no puedes enviar mensajes como si fueras un visitante. Los leads se pueden crear, actualizar
y aceptar (`leads:write`), y un propietario puede responder a una conversación, pausarla o reanudarla
(`conversations:write`).
## 1. Crea una clave con privilegios mínimos [#1-crea-una-clave-con-privilegios-mínimos]
Crea una clave llamada `Local API quickstart`, selecciona `account:read` y `sites:read`, y elige una caducidad corta. Copia la clave en texto plano de inmediato; no se volverá a mostrar.
No uses una clave de proveedor de IA, como una clave de OpenRouter o de Speko. La API pública requiere una clave de Make Agent Fast que comience por `maf_live_`.
## 2. Guárdala para esta terminal [#2-guárdala-para-esta-terminal]
```bash
export MAF_API_KEY="maf_live_..."
```
Confirma que la variable existe sin imprimir el secreto:
```bash
test -n "$MAF_API_KEY" && echo "MAF_API_KEY is set"
```
No incluyas la clave en `.env`, en ejemplos del historial de la shell, en datos de prueba ni en un bundle del navegador. Para el código desplegado, usa el gestor de secretos de tu proveedor de alojamiento.
## 3. Inspecciona la cuenta [#3-inspecciona-la-cuenta]
```bash
curl --fail-with-body --include https://makeagent.fast/api/v1/me \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Accept: application/json"
```
Estado esperado: `200 OK`. El cuerpo contiene `data.id`, información del plan y de los derechos de uso, y un resumen del monedero. La respuesta también incluye `x-request-id`; conserva ese valor al reportar una solicitud fallida.
```json
{
"data": {
"id": "ACCOUNT_ID",
"email": "owner@example.com",
"plan": { "id": "pro", "status": "active" },
"entitlements": { "site_limit": 3, "live_voice": true },
"wallet": { "balance": 151 }
}
}
```
Se pueden añadir campos sin cambiar la ruta `/v1`. Ignora los campos desconocidos en lugar de rechazar la respuesta.
## 4. Lista los sitios [#4-lista-los-sitios]
```bash
curl --fail-with-body "https://makeagent.fast/api/v1/sites?limit=20" \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Accept: application/json"
```
Las respuestas de colecciones usan esta estructura:
```json
{
"data": [],
"has_more": false,
"next_cursor": null
}
```
Si `has_more` es true, envía el valor exacto de `next_cursor` como parámetro de consulta `cursor` en la siguiente solicitud. No decodifiques ni construyas cursores.
## 5. Gestiona un error estructurado [#5-gestiona-un-error-estructurado]
Quita temporalmente el encabezado Authorization y repite la solicitud a `/me`. La respuesta debería ser `401` con un código estable:
```json
{
"error": {
"code": "authentication_required",
"message": "Provide an API key in the Authorization bearer header.",
"request_id": "6c0b2f2e-..."
}
}
```
El código de producción debe ramificarse según `error.code`, no comparar `message`. Registra la operación, el estado HTTP y el ID de solicitud sin registrar la clave.
## 6. Realiza la primera escritura de forma segura [#6-realiza-la-primera-escritura-de-forma-segura]
Crea una clave aparte que además tenga `sites:write`, `agents:write` y `knowledge:write`; no amplíes la clave de lectura de esta guía. Sigue las [recetas de la API](/es/docs/api/recipes) para crear un sitio, añadir conocimiento fundamentado y publicarlo usando claves de idempotencia explícitas.
## Errores habituales en la primera solicitud [#errores-habituales-en-la-primera-solicitud]
| Resultado | Causa | Solución |
| ----------------------------- | --------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
| `401 authentication_required` | Falta el encabezado o no tiene el formato `Bearer TOKEN` | Añade el encabezado Authorization exacto desde el código del servidor |
| `401 invalid_api_key` | Error tipográfico, clave caducada, clave revocada o tipo de credencial incorrecto | Crea y copia una nueva clave de API de Make Agent Fast |
| `403 subscription_required` | No hay un plan de pago activo | Restablece la suscripción de la cuenta |
| `403 insufficient_scope` | La clave no incluye el scope de la operación | Crea una clave de reemplazo con el scope mínimo que falta |
| `403 account_paused` | El acceso a la API se pausó para esta cuenta | Reanuda el acceso a la API o contacta con el propietario de la cuenta |
| `429 rate_limit_exceeded` | Se agotó el límite de un minuto de la clave | Espera el tiempo indicado en `Retry-After` y reduce la concurrencia |
Continúa con [Scopes y errores](/es/docs/api/scopes-errors), la [referencia de la API](/es/docs/api/reference) y los [límites de frecuencia](/es/docs/api/rate-limits).
---
# Límites de frecuencia
Source: /es/docs/api/rate-limits.md
{/* docs-visuals */}
La API pública aplica un contenedor de solicitudes con ventana deslizante de un minuto a cada clave de API o token de acceso de OAuth. Crear más claves para eludir un límite no está permitido y puede dar lugar a restricciones en las credenciales o en la cuenta.
## Límites por plan [#límites-por-plan]
| Plan activo | Solicitudes por clave por minuto |
| ----------- | -------------------------------: |
| Launch | 120 |
| Operate | 600 |
| Scale | 1,800 |
Una credencial cuya cuenta no tenga un plan de pago activo recibe `403 subscription_required` antes de que se le asigne capacidad de límite de frecuencia. Make Agent Fast puede introducir límites más bajos específicos para ciertos endpoints en operaciones especialmente costosas; cuando eso ocurra, la referencia del endpoint los indicará de forma explícita.
## Una respuesta con límite de frecuencia [#una-respuesta-con-límite-de-frecuencia]
Cuando el contenedor se agota, la API devuelve `429 rate_limit_exceeded` con:
```http
HTTP/1.1 429 Too Many Requests
Retry-After: 17
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 0
X-Request-Id: 6c0b2f2e-...
Content-Type: application/json
```
`Retry-After` es el número mínimo de segundos que debes esperar. Cada respuesta autenticada incluye además `X-RateLimit-Limit`, `X-RateLimit-Remaining` y `X-RateLimit-Reset` (una marca de tiempo Unix), de modo que las aplicaciones pueden limitar su ritmo antes de recibir un `429`.
## Implementación de reintentos [#implementación-de-reintentos]
Usa un retroceso exponencial con jitter aleatorio, respeta un `Retry-After` mayor y limita el número total de intentos.
```ts
async function requestWithRetry(url: string, init: RequestInit, attempts = 4) {
for (let attempt = 0; attempt < attempts; attempt += 1) {
const response = await fetch(url, init);
if (response.status !== 429 && response.status < 500) return response;
if (attempt === attempts - 1) return response;
const retryAfter = Number(response.headers.get("retry-after") ?? 0) * 1_000;
const exponential = 500 * 2 ** attempt;
const jitter = Math.random() * 250;
await new Promise((resolve) =>
setTimeout(resolve, Math.max(retryAfter, exponential + jitter)),
);
}
throw new Error("unreachable");
}
```
En `POST`, `PATCH` y `DELETE`, conserva la misma `Idempotency-Key` válida en todos los reintentos por errores de red o de servidor. Una nueva clave de idempotencia puede repetir un efecto secundario que ya se completó.
## Reduce el volumen de solicitudes [#reduce-el-volumen-de-solicitudes]
* Almacena en caché las lecturas de cuenta, sitio y configuración que no necesiten estar actualizadas en tiempo real.
* Solicita hasta `100` registros por página en lugar de pedir repetidamente páginas muy pequeñas.
* Procesa los eventos de webhook en lugar de consultar periódicamente conversaciones, leads o difusiones.
* Limita la concurrencia de los workers por clave de API; una ráfaga de muchas invocaciones serverless comparte el mismo contenedor.
* Usa claves distintas para servicios distintos con fines de aislamiento y auditoría, no para multiplicar la capacidad de una misma carga de trabajo.
## Tabla de reintentar y no reintentar [#tabla-de-reintentar-y-no-reintentar]
| Respuesta | ¿Reintentar? | Condición |
| ------------------------------------ | --------------- | ----------------------------------------------------------------------------------------------------------------- |
| `429` | Sí | Espera el tiempo de `Retry-After`, añade jitter y limita los intentos |
| `500` | A veces | Lecturas seguras o mutaciones protegidas por la misma clave de idempotencia |
| `409` por conflicto de procesamiento | Sí | Espera según su encabezado `Retry-After: 2` y conserva la misma clave de idempotencia |
| Otros `409` | No de inmediato | Lee el estado actual del recurso y resuelve el conflicto |
| `503` `outcome_unknown` | No | Es posible que la mutación se haya completado; comprueba el recurso antes de usar una nueva clave de idempotencia |
| `400`, `401`, `403`, `404`, `415` | No | Corrige primero los datos de entrada, las credenciales, los permisos, la ruta o el tipo de contenido |
Si una carga de trabajo sostenida supera legítimamente el contenedor de tu plan, reduce las consultas periódicas, agrupa el trabajo en lotes o contacta con soporte aportando ID de solicitud representativos y el tráfico esperado, en lugar de añadir un bucle de reintentos sin límite.
---
# Recetas de API
Source: /es/docs/api/recipes.md
{/* docs-visuals */}
Estas recetas usan REST sin procesar, por lo que funcionan incluso antes de instalar un SDK público. Define `MAF_API_KEY` en el entorno del servidor y sustituye los IDs devueltos por los pasos anteriores.
## Receta: crear y publicar un agente fundamentado [#receta-crear-y-publicar-un-agente-fundamentado]
Crea una clave de API con `sites:write`, `agents:write` y `knowledge:write`. Añade `sites:read` si la automatización también lista o verifica sitios.
### 1. Crear el sitio [#1-crear-el-sitio]
```bash
curl --fail-with-body https://makeagent.fast/api/v1/sites \
-X POST \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: launch-acme-site-2026-01" \
-d '{
"title": "Acme support",
"slug": "acme-support",
"type": "business",
"template": "minimal",
"content": {
"headline": "Ask Acme support"
},
"persona_mode": "assistant",
"languages": ["en"]
}'
```
Una respuesta correcta es `201 Created`, incluye el sitio en `data` y devuelve su ruta de recurso canónica en el encabezado `Location`. Guarda `data.id` como `SITE_ID`.
### 2. Configurar el agente y la política de incrustación [#2-configurar-el-agente-y-la-política-de-incrustación]
```bash
curl --fail-with-body "https://makeagent.fast/api/v1/sites/$SITE_ID/agent" \
-X PATCH \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: launch-acme-agent-2026-01" \
-d '{
"display_name": "Acme guide",
"persona_mode": "assistant",
"instructions": "Answer only from confirmed Acme sources. If the answer is missing, say that a teammate will follow up.",
"languages": ["en"],
"embed_enabled": true,
"allowed_origins": ["https://www.acme.example", "https://staging.acme.example"]
}'
```
Los orígenes permitidos son orígenes exactos: esquema, nombre de host y puerto opcional. No incluyas una ruta ni un comodín al final.
### 3. Añadir una fuente de conocimiento de texto [#3-añadir-una-fuente-de-conocimiento-de-texto]
```bash
curl --fail-with-body "https://makeagent.fast/api/v1/sites/$SITE_ID/knowledge" \
-X POST \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: launch-acme-returns-2026-01" \
-d '{
"name": "Returns policy 2026-01",
"text": "Customers may request a return within 30 days of delivery. Contact support before sending an item back."
}'
```
El texto pegado debe tener entre 5 y 200 000 caracteres. El mismo endpoint también puede rastrear un sitio web con `{ "url", "max_pages", "refresh_hours" }` (`max_pages` hasta 40) o importar `{ "kind": "youtube" | "podcast" | "feed", "url" }`; esas fuentes multimedia requieren Operate o Scale y devuelven `409` en Launch. La subida de archivos solo está disponible en el panel.
### 4. Añadir unas preguntas frecuentes estructuradas [#4-añadir-unas-preguntas-frecuentes-estructuradas]
```bash
curl --fail-with-body "https://makeagent.fast/api/v1/sites/$SITE_ID/faqs" \
-X POST \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: launch-acme-faq-returns-2026-01" \
-d '{
"question": "How long do I have to return an order?",
"answer": "You may request a return within 30 days of delivery.",
"approved": true
}'
```
### 5. Publicar [#5-publicar]
```bash
curl --fail-with-body "https://makeagent.fast/api/v1/sites/$SITE_ID/publish" \
-X POST \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: launch-acme-publish-2026-01" \
-d '{"published": true}'
```
La respuesta debería contener `{"data":{"id":"...","status":"published"}}`. Abre una incrustación real y haz una pregunta cuya respuesta aparezca en la fuente. Publicar demuestra que el estado del agente cambió; no demuestra que la calidad de la fuente o el origen de la incrustación sean correctos.
## Receta: paginar leads de forma segura [#receta-paginar-leads-de-forma-segura]
Usa una clave con `leads:read`. Trata `next_cursor` como un valor opaco y codifícalo como URL.
```ts
const base = `https://makeagent.fast/api/v1/sites/${siteId}/leads`;
let cursor: string | null = null;
do {
const url = new URL(base);
url.searchParams.set("limit", "100");
if (cursor) url.searchParams.set("cursor", cursor);
const response = await fetch(url, {
headers: { Authorization: `Bearer ${process.env.MAF_API_KEY}` },
});
if (!response.ok) throw await response.json();
const page = await response.json();
for (const lead of page.data) await exportLead(lead);
cursor = page.next_cursor;
} while (cursor);
```
No decodifiques, edites, ordenes ni reutilices un cursor en una colección distinta.
## Receta: desactivar una incrustación durante un incidente [#receta-desactivar-una-incrustación-durante-un-incidente]
Usa `agents:write` y conserva la misma clave de idempotencia en todos los reintentos por fallos de red:
```bash
curl --fail-with-body "https://makeagent.fast/api/v1/sites/$SITE_ID/agent" \
-X PATCH \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: incident-2026-07-embed-off" \
-d '{"embed_enabled": false}'
```
Cuando la respuesta sea correcta, verifica que el lanzador ya no se inicializa en un host permitido. Vuelve a activarlo con una nueva clave de resolución del incidente después de corregir el problema de origen, contenido o credenciales.
## Lista de verificación para producción [#lista-de-verificación-para-producción]
* Usa una clave distinta por servicio y por entorno.
* Guarda los IDs de recursos y las claves de idempotencia antes de enviar una mutación.
* Configura tiempos de espera de conexión y de respuesta.
* Respeta `Retry-After` y limita el número de reintentos.
* Registra el nombre de la operación, el estado HTTP y el ID de la solicitud, sin registrar secretos ni datos personales.
* Prueba en un sitio que no sea de producción antes de conceder permisos de escritura en producción.
---
# Referencia de la API
Source: /es/docs/api/reference.md
{/* docs-visuals */}
El contrato canónico legible por máquina es el [OpenAPI JSON](/api/openapi.json). Esta página es el índice de operaciones legible para personas y explica las reglas comunes a todos los endpoints.
## URL base y versión [#url-base-y-versión]
```text
https://makeagent.fast/api/v1
```
La versión mayor forma parte de la ruta. Pueden aparecer campos adicionales sin cambiar la versión mayor, así que ignora los campos de respuesta que no conozcas. Todas las solicitudes de gestión usan HTTPS y una clave de API bearer o un token de acceso OAuth.
## Encabezados comunes [#encabezados-comunes]
```http
Authorization: Bearer maf_live_...
Accept: application/json
Content-Type: application/json
Idempotency-Key: your-stable-operation-key
```
`Content-Type` es obligatorio en los cuerpos JSON de `POST` y `PATCH`, incluso cuando el cuerpo es `{}`. `Idempotency-Key` es opcional, pero se recomienda encarecidamente en todos los `POST`, `PATCH` y `DELETE`.
## Cuenta y sitios [#cuenta-y-sitios]
| Método | Ruta | Scope | Finalidad |
| -------- | ---------------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `GET` | `/me` | `account:read` | Leer el resumen de cuenta, plan, derechos de uso y monedero |
| `GET` | `/sites` | `sites:read` | Listar los sitios propios |
| `POST` | `/sites` | `sites:write` | Crear un sitio y su agente predeterminado |
| `GET` | `/sites/{site_id}` | `sites:read` | Obtener un sitio propio |
| `PATCH` | `/sites/{site_id}` | `sites:write` | Actualizar campos seguros del sitio |
| `DELETE` | `/sites/{site_id}` | `sites:write` | Eliminar el sitio y los recursos dependientes |
| `POST` | `/sites/{site_id}/publish` | `sites:write` | Publicar o despublicar con `{ "published": boolean }` |
| `GET` | `/sites/{site_id}/agent` | `agents:read` | Leer la configuración del agente |
| `PATCH` | `/sites/{site_id}/agent` | `agents:write` | Actualizar el modo de persona, la finalidad, el nombre visible, las instrucciones, la voz, los idiomas, el modelo, la apariencia, el chrome del embed, la insignia, el estado del embed o los orígenes |
| `GET` | `/sites/{site_id}/billing` | `account:read` | Leer el plan, el período, el monedero, los complementos y los enlaces de facturación del panel |
| `PATCH` | `/sites/{site_id}/workspace` | `team:write` | Cambiar el nombre de la empresa propietaria del agente |
| `PATCH` | `/sites/{site_id}/retention` | `team:write` | Definir cuánto tiempo se conservan las conversaciones |
Para crear un sitio se requieren `title` y `content.headline`. Los campos opcionales son `slug`, `type`, `template`, contenido adicional, `persona_mode` y de uno a cuatro idiomas entre `en`, `ko`, `uz` y `ru`.
`PATCH /agent` aplica a `model`, `appearance`, `embed_chrome` y `badge_hidden` las mismas comprobaciones de plan que el panel; `badge_hidden: true` requiere un plan elegible o el complemento de la insignia.
## Instalación y widget del sitio web [#instalación-y-widget-del-sitio-web]
| Método | Ruta | Scope | Finalidad |
| ------- | -------------------------------- | -------------- | ---------------------------------------------------------------------------------------------------------- |
| `GET` | `/sites/{site_id}/install` | `agents:read` | Leer el destino de instalación, el estado del embed, los orígenes permitidos y la evidencia de instalación |
| `PATCH` | `/sites/{site_id}/install` | `agents:write` | Definir la página en la que debe instalarse el widget |
| `POST` | `/sites/{site_id}/install/check` | `agents:write` | Comprobar si el fragmento de embed está activo en la página de destino |
## Conocimiento y preguntas frecuentes [#conocimiento-y-preguntas-frecuentes]
| Método | Ruta | Scope | Finalidad |
| ------------------ | -------------------------------------------------------------- | ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `GET` | `/sites/{site_id}/knowledge` | `knowledge:read` | Listar las sources de conocimiento |
| `POST` | `/sites/{site_id}/knowledge` | `knowledge:write` | Ingerir texto pegado, rastrear un sitio web o importar una source de YouTube, pódcast o feed |
| `PATCH` | `/sites/{site_id}/knowledge/{source_id}` | `knowledge:write` | Definir `refresh_hours` o el `approval_status` del buyer pack |
| `POST` | `/sites/{site_id}/knowledge/{source_id}/recrawl` | `knowledge:write` | Poner en cola una nueva lectura de una source obtenida; devuelve `202` |
| `DELETE` | `/sites/{site_id}/knowledge/{source_id}` | `knowledge:write` | Eliminar una source de las consultas futuras |
| `GET` | `/sites/{site_id}/faqs` | `knowledge:read` | Listar las preguntas frecuentes estructuradas |
| `POST` | `/sites/{site_id}/faqs` | `knowledge:write` | Crear `{ "question", "answer", "approved" }` |
| `POST` | `/sites/{site_id}/faqs/generate` | `knowledge:write` | Redactar borradores de preguntas frecuentes a partir del conocimiento del agente |
| `POST` | `/sites/{site_id}/faqs/approve-all` | `knowledge:write` | Aprobar y publicar todas las preguntas frecuentes en borrador |
| `PATCH` | `/sites/{site_id}/faqs/{faq_id}` | `knowledge:write` | Actualizar la pregunta, la respuesta o el estado de aprobación |
| `DELETE` | `/sites/{site_id}/faqs/{faq_id}` | `knowledge:write` | Eliminar una pregunta frecuente |
| `GET` / `PATCH` | `/sites/{site_id}/fact-sheet` | `knowledge:read` / `knowledge:write` | Leer la ficha de datos del negocio extraída, o corregir los datos que la extracción haya interpretado mal |
| `POST` | `/sites/{site_id}/fact-sheet/reextract` | `knowledge:write` | Volver a leer el sitio web y reconstruir la ficha de datos |
| `POST` | `/sites/{site_id}/qa` | `knowledge:write` | Publicar pares de preguntas y respuestas seleccionados |
| `POST` | `/sites/{site_id}/answers/revise` | `knowledge:write` | Enseñar al agente la respuesta que debería haber dado |
| `GET` | `/sites/{site_id}/knowledge-connections` | `knowledge:read` | Listar las conexiones de conocimiento de Notion, Drive y MCP |
| `GET` | `/sites/{site_id}/knowledge-connections/connect-links` | `knowledge:read` | Obtener las URL del panel que inician una conexión de Notion o Drive |
| `PATCH` / `DELETE` | `/sites/{site_id}/knowledge-connections/{connection_id}` | `knowledge:write` | Definir la frecuencia de sincronización, los elementos seleccionados o la herramienta de importación; o desconectar y purgar la conexión |
| `GET` | `/sites/{site_id}/knowledge-connections/{connection_id}/items` | `knowledge:read` | Listar las páginas, bases de datos o archivos que una conexión puede importar |
| `POST` | `/sites/{site_id}/knowledge-connections/{connection_id}/sync` | `knowledge:write` | Poner en cola una sincronización de una conexión de conocimiento |
`POST /knowledge` acepta tres cuerpos: `{ "name", "text" }` con entre 5 y 200 000 caracteres; `{ "url", "max_pages", "refresh_hours" }` para rastrear un sitio web (`max_pages` de 1 a 40, `refresh_hours` de 1 a 8760 o `null`); y `{ "kind": "youtube" | "podcast" | "feed", "url", "refresh_hours" }`. Las sources de YouTube, pódcast y feed requieren Operate o Scale; en Launch devuelven `409 conflict`. La subida de archivos sigue siendo un flujo exclusivo del panel.
## Conversaciones, leads, analítica y uso [#conversaciones-leads-analítica-y-uso]
| Método | Ruta | Scope | Finalidad |
| ------- | --------------------------------------------------------- | --------------------- | ------------------------------------------------------------------------------- |
| `GET` | `/sites/{site_id}/conversations` | `conversations:read` | Listar los hilos de conversación |
| `GET` | `/sites/{site_id}/conversations/{conversation_id}` | `conversations:read` | Obtener un hilo y sus mensajes paginados |
| `POST` | `/sites/{site_id}/conversations/{conversation_id}/reply` | `conversations:write` | Responder a un visitante en nombre del negocio |
| `POST` | `/sites/{site_id}/conversations/{conversation_id}/pause` | `conversations:write` | Pausar el agente en esta conversación y asumir el control |
| `POST` | `/sites/{site_id}/conversations/{conversation_id}/resume` | `conversations:write` | Devolver la conversación al agente |
| `GET` | `/sites/{site_id}/leads` | `leads:read` | Listar los leads capturados |
| `POST` | `/sites/{site_id}/leads` | `leads:write` | Crear un lead canónico con consentimiento y preferencias de contacto explícitos |
| `GET` | `/sites/{site_id}/leads/{lead_id}` | `leads:read` | Obtener un lead |
| `PATCH` | `/sites/{site_id}/leads/{lead_id}` | `leads:write` | Actualizar, calificar o cambiar la política de contacto de un lead |
| `POST` | `/sites/{site_id}/leads/{lead_id}/accept` | `leads:write` | Aceptar un lead en el pipeline de oportunidades |
| `POST` | `/sites/{site_id}/leads/{lead_id}/followup` | `leads:write` | Enviar el mensaje de seguimiento a un lead |
| `POST` | `/sites/{site_id}/leads/{lead_id}/followup/draft` | `leads:write` | Redactar de nuevo el mensaje de seguimiento sin enviarlo |
| `GET` | `/sites/{site_id}/analytics` | `analytics:read` | Listar los eventos de analítica |
| `GET` | `/sites/{site_id}/report` | `analytics:read` | Leer el informe de analítica agregado |
| `POST` | `/sites/{site_id}/report/unanswered-faq` | `knowledge:write` | Responder una pregunta sin respuesta como una nueva pregunta frecuente |
| `GET` | `/sites/{site_id}/usage` | `usage:read` | Listar los eventos de uso medido |
Estas colecciones de eventos y actividad aceptan `limit` y `cursor`. Los registros devueltos pueden contener datos personales; almacénalos y expórtalos conforme a tus obligaciones de privacidad.
Se admiten las respuestas del owner: `reply`, `pause` y `resume` toman el control de un hilo web o de un chat de Telegram, WhatsApp, Messenger o Instagram igual que lo hace el panel. Enviar mensajes como si fueras el visitante no es una operación pública de la API.
Se admite la modificación de leads; no establezcas `consent_status: granted` a menos que tu sistema
tenga un registro de consentimiento defendible. Los leads con consentimiento desconocido se excluyen de los envíos masivos.
## Pipeline de oportunidades y resultados de CRM [#pipeline-de-oportunidades-y-resultados-de-crm]
| Método | Ruta | Scope | Finalidad |
| --------------- | ------------------------------------------------------------------------------------------------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| `GET` / `POST` | `/sites/{site_id}/pipeline/stages` | `pipeline:read` / `pipeline:write` | Listar o configurar las etapas |
| `GET` / `POST` | `/sites/{site_id}/pipeline/accounts` | `pipeline:read` / `pipeline:write` | Listar o crear cuentas de empresa |
| `GET` | `/sites/{site_id}/pipeline/accounts/{account_id}` | `pipeline:read` | Obtener una cuenta de empresa |
| `GET` / `POST` | `/sites/{site_id}/pipeline/opportunities` | `pipeline:read` / `pipeline:write` | Listar o crear oportunidades |
| `GET` / `PATCH` | `/sites/{site_id}/pipeline/opportunities/{opportunity_id}` | `pipeline:read` / `pipeline:write` | Leer la actividad o actualizar la asignación, el valor, la etapa, la siguiente acción y la respuesta humana |
| `POST` | `/sites/{site_id}/pipeline/outcomes` | `pipeline:write` | Importar de forma idempotente un resultado de ganado o perdido procedente del CRM |
| `GET` | `/sites/{site_id}/pipeline/sync-records` | `pipeline:read` | Listar el estado de sincronización, los intentos y los errores |
| `POST` | `/sites/{site_id}/pipeline/sync-records/{sync_record_id}/retry` | `pipeline:write` | Reintentar un resultado fallido a partir de su payload almacenado |
| `GET` / `PATCH` | `/sites/{site_id}/pipeline-workflow` | `pipeline:read` / `pipeline:write` | Leer o actualizar la política de respuesta de ventas |
| `GET` / `POST` | `/sites/{site_id}/pilots` | `pipeline:read` / `pipeline:write` | Listar o iniciar pilotos guiados |
| `GET` | `/sites/{site_id}/pilots/{pilot_id}` | `pipeline:read` | Leer un piloto, su etapa, sus recuentos y su lista de trabajo |
| `POST` | `/sites/{site_id}/pilots/{pilot_id}/setup`, `/start`, `/stop`, `/review`, `/decision`, `/complete`, `/delete` | `pipeline:write` | Llevar un piloto por la configuración, la medición, la revisión, la decisión y el cierre, o eliminarlo junto con su evidencia (siete operaciones) |
| `POST` | `/sites/{site_id}/pilots/{pilot_id}/outcomes`, `/bookings` | `pipeline:write` | Registrar el resultado de un lead o el resultado de una reserva (dos operaciones) |
| `POST` | `/sites/{site_id}/pilots/{pilot_id}/report/approve`, `/report/revoke` | `pipeline:write` | Aprobar o revocar el informe del piloto que se puede compartir (dos operaciones) |
| `GET` / `POST` | `/sites/{site_id}/buyer-packs` | `pipeline:read` / `pipeline:write` | Listar los buyer packs o crear uno a partir de sources aprobadas |
| `PATCH` | `/sites/{site_id}/buyer-packs/{pack_id}` | `pipeline:write` | Reemplazar el título, la audiencia, el resumen, las sources y las secciones de un pack |
| `POST` | `/sites/{site_id}/buyer-packs/{pack_id}/approve`, `/revoke` | `pipeline:write` | Activar o desactivar el enlace para compartir del pack (dos operaciones) |
El `provider` del CRM, el ID externo y la clave de idempotencia que proporciones permanecen en el
registro de auditoría. Un reintento solo toma un registro fallido y nunca convierte una escritura
externa en curso en un éxito falso.
## Connectors [#connectors]
| Método | Ruta | Scope | Finalidad |
| -------- | --------------------------------------------- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------- |
| `GET` | `/sites/{site_id}/connectors` | `connectors:read` | Listar el estado de los connectors sin secretos |
| `POST` | `/sites/{site_id}/connectors` | `connectors:write` | Conectar un channel: validar las credenciales en vivo, aprovisionar su webhook y devolver la lista de comprobación de configuración |
| `PATCH` | `/sites/{site_id}/connectors/{connector_id}` | `connectors:write` | Definir `status` o `reply_with_voice` |
| `DELETE` | `/sites/{site_id}/connectors/{connector_id}` | `connectors:write` | Desaprovisionar y eliminar un connector |
| `POST` | `/sites/{site_id}/concierge` | `connectors:write` | Pedir a la plataforma que conecte un canal de mensajería por ti |
| `GET` | `/sites/{site_id}/domains` | `domains:read` | Eliminado: devuelve `409`. No se ofrecen dominios personalizados |
| `POST` | `/sites/{site_id}/domains` | `domains:write` | Eliminado: devuelve `409` |
| `PATCH` | `/sites/{site_id}/domains/{domain_id}` | `domains:write` | Eliminado: devuelve `409` |
| `POST` | `/sites/{site_id}/domains/{domain_id}/verify` | `domains:write` | Eliminado: devuelve `409` |
| `DELETE` | `/sites/{site_id}/domains/{domain_id}` | `domains:write` | Eliminado: devuelve `409` |
La creación de un connector usa un cuerpo discriminado por channel. Los campos de credenciales difieren para `telegram`, `whatsapp`, `messenger`, `instagram`, `discord` y `kakao`; usa la guía del connector correspondiente antes de enviar secretos.
## Envíos masivos, notificaciones y monetización [#envíos-masivos-notificaciones-y-monetización]
| Método | Ruta | Scope | Finalidad |
| -------- | ----------------------------------------------------- | --------------------- | -------------------------------------------------------------------------- |
| `GET` | `/sites/{site_id}/broadcasts` | `broadcasts:read` | Listar los envíos masivos |
| `POST` | `/sites/{site_id}/broadcasts` | `broadcasts:write` | Crear un borrador de envío masivo de Kakao |
| `POST` | `/sites/{site_id}/broadcasts/{broadcast_id}/send` | `broadcasts:write` | Poner en cola un borrador existente; devuelve `202` |
| `GET` | `/sites/{site_id}/notifications` | `notifications:read` | Listar las notificaciones del propietario |
| `POST` | `/sites/{site_id}/notifications/read-all` | `notifications:write` | Marcar como leídas todas las notificaciones del propietario de este agente |
| `PATCH` | `/sites/{site_id}/notifications/{notification_id}` | `notifications:write` | Marcar como leída o no leída con `{ "read": boolean }` |
| `GET` | `/sites/{site_id}/alerts` | `notifications:read` | Leer el estado del canal de alertas del propietario y su enlace del panel |
| `GET` | `/sites/{site_id}/monetization/products` | `monetization:read` | Listar los productos del sitio |
| `POST` | `/sites/{site_id}/monetization/products` | `monetization:write` | Crear un producto de tipo `access`, `consult`, `tip` o `digital` |
| `PATCH` | `/sites/{site_id}/monetization/products/{product_id}` | `monetization:write` | Actualizar los campos del producto y su estado activo |
| `DELETE` | `/sites/{site_id}/monetization/products/{product_id}` | `monetization:write` | Eliminar un producto |
Actualmente, la creación de envíos masivos solo acepta el canal `kakao`. La puesta en cola falla con `409 conflict` cuando no hay destinatarios alcanzables o cuando el envío masivo ya no es un borrador.
## Acciones, tickets y equipo [#acciones-tickets-y-equipo]
| Método | Ruta | Scope | Finalidad |
| ------------------ | --------------------------------------------------- | ------------------------------ | -------------------------------------------------------------------------------------------------------- |
| `GET` / `PATCH` | `/sites/{site_id}/actions` | `agents:read` / `agents:write` | Leer o configurar los procedimientos, el webhook público, el enlace de reservas y los tickets de soporte |
| `GET` | `/sites/{site_id}/tickets` | `tickets:read` | Listar los tickets de soporte |
| `GET` | `/sites/{site_id}/tickets/{ticket_id}` | `tickets:read` | Leer un ticket y sus mensajes |
| `PATCH` | `/sites/{site_id}/tickets/{ticket_id}` | `tickets:write` | Definir el estado, la prioridad y, opcionalmente, el responsable asignado |
| `POST` | `/sites/{site_id}/tickets/{ticket_id}/messages` | `tickets:write` | Añadir una nota interna, o establecer `internal: false` para responder al cliente por correo electrónico |
| `GET` | `/sites/{site_id}/team` | `team:read` | Leer los miembros, las invitaciones y los eventos de auditoría permitidos |
| `POST` | `/sites/{site_id}/team/invitations` | `team:write` | Crear un enlace de invitación sin enviar correo electrónico |
| `DELETE` | `/sites/{site_id}/team/invitations/{invitation_id}` | `team:write` | Revocar una invitación pendiente |
| `PATCH` / `DELETE` | `/sites/{site_id}/team/members/{membership_id}` | `team:write` | Cambiar el rol de un miembro que no sea propietario, o eliminar al miembro |
## Webhooks para desarrolladores y herramientas de configuración [#webhooks-para-desarrolladores-y-herramientas-de-configuración]
| Método | Ruta | Scope | Finalidad |
| -------- | ---------------------------------- | ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `GET` | `/webhook-endpoints` | `webhooks:read` | Listar el estado de los endpoints sin secretos de firma |
| `POST` | `/webhook-endpoints` | `webhooks:write` | Registrar una URL HTTPS pública y mostrar su secreto de firma una sola vez |
| `DELETE` | `/webhook-endpoints/{endpoint_id}` | `webhooks:write` | Eliminar un endpoint y detener las entregas futuras |
| `GET` | `/setup/tools` | Cualquier credencial válida | Descubrir las herramientas de configuración para integraciones de API, MCP y GitHub |
| `POST` | `/setup/tools/{tool_name}` | Específico de cada herramienta | Ejecutar una herramienta de configuración; las solicitudes de plataforma necesitan los scopes de sus endpoints, la inspección de GitHub usa `integrations:read` y la preparación de PR usa `integrations:write` |
Las URL de webhook deben usar HTTPS, no pueden incluir credenciales ni un puerto personalizado, y deben resolverse únicamente a direcciones IP públicas.
## Paginación [#paginación]
Las colecciones paginadas aceptan `limit` de `1` a `100`; el valor predeterminado es `50`. Usa el `next_cursor` opaco devuelto únicamente con la misma colección y los mismos filtros.
```json
{
"data": [],
"has_more": false,
"next_cursor": null
}
```
Algunas colecciones de configuración pequeñas devuelven el mismo envelope con `has_more: false` y no necesitan cursor.
## Idempotencia [#idempotencia]
Una clave de idempotencia debe tener entre 8 y 200 caracteres, formados por letras, números, `.`, `_`, `:` y `-`. Los resultados se conservan durante 24 horas y se asocian al propietario de la credencial.
* Misma clave y mismo método, ruta, query y cuerpo: devuelve la respuesta almacenada con `x-idempotent-replayed: true`.
* Misma clave con una entrada distinta: devuelve `409 conflict`.
* Misma clave mientras la primera solicitud aún se está procesando: devuelve `409 conflict` y `Retry-After: 2`.
Guarda la clave antes de enviar la mutación y reutilízala solo para reintentos de esa misma operación lógica.
## Respuestas y errores [#respuestas-y-errores]
Las respuestas correctas envuelven su recurso en `data`. Las operaciones de creación normalmente devuelven `201`; los envíos masivos puestos en cola devuelven `202`; las demás operaciones correctas devuelven `200`. Todas las respuestas incluyen `x-request-id` y usan `Cache-Control: no-store` para los datos de la API.
Consulta [Scopes y errores](/es/docs/api/scopes-errors) para ver la tabla completa de códigos de error y [Recetas de la API](/es/docs/api/recipes) para flujos de trabajo que puedes copiar.
## Clientes MCP [#clientes-mcp]
Conecta un cliente MCP de Streamable HTTP a `https://makeagent.fast/api/mcp`. Los clientes compatibles con el descubrimiento de OAuth abren el navegador para el inicio de sesión y el consentimiento. Verifica la identidad del cliente, la empresa y los scopes solicitados antes de aprobar. La primera aprobación solicita los scopes que usan las herramientas (`sites:read`, `sites:write`, `agents:write`, `analytics:read`, `conversations:read`, `conversations:write`, `leads:read`, `leads:write`, `knowledge:write`); a una credencial a la que le falte alguno de ellos se le pide que vuelva a autorizar. Se requiere un plan activo.
Para los clientes que usan credenciales configuradas manualmente, crea una clave de API con scopes limitados en [Ajustes de desarrollador](/dashboard/settings/developer) y envíala como encabezado `Authorization: Bearer ...`. Mantén las credenciales fuera del control de versiones y del código del navegador. Revoca las claves de API o las autorizaciones de OAuth desde los ajustes de desarrollador.
Herramientas de lectura: `list_agents`, `get_agent`, `get_report`, `list_unanswered_questions`, `list_conversations`, `get_conversation`, `list_leads`. Herramientas de escritura: `create_agent_from_website`, `create_agent_from_notes`, `test_agent`, `add_knowledge`, `save_answer`, `reply_to_customer`, `update_lead`, `set_website_widget`. Cada herramienta de agente recibe un `agent_id` obtenido de `list_agents`. `test_agent` consume créditos como una respuesta normal; `reply_to_customer` envía un mensaje al cliente y pausa el agente en esa conversación; `set_website_widget` activa o desactiva el widget de chat del sitio web; los canales de mensajería se gestionan en el panel. Los clientes con MCP Apps habilitado (de forma predeterminada, la conexión autenticada de Claude) también obtienen `list_pending_approvals`, `list_action_runs` y `decide_approval`, que aprueba o rechaza un cambio confirmado por el cliente; los demás clientes solo ven las 15 herramientas anteriores. Para las herramientas de configuración y de integración con GitHub, usa el asistente de configuración de la aplicación o `/api/v1/setup/tools`.
Las revisiones del protocolo compatibles son `2026-07-28`, `2025-11-25` y `2025-06-18`. El transporte devuelve JSON; no ofrece SSE heredado ni sesiones de servidor. Los tokens OAuth de MCP solo autorizan `/api/mcp`, no solicitudes REST directas. Los tokens de acceso OAuth duran una hora; las credenciales de actualización rotan y caducan a los 90 días. Las claves de API creadas manualmente usan la caducidad con la que se configuraron.
---
# Permisos y errores
Source: /es/docs/api/scopes-errors.md
{/* docs-visuals */}
Cada operación de la API pública requiere un permiso (scope) explícito. Una credencial válida que no tenga ese permiso recibe `403 insufficient_scope`; nunca se amplía de forma silenciosa a un acceso más amplio.
## Referencia de permisos [#referencia-de-permisos]
| Permiso (scope) | Permite |
| --------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| `account:read` | Leer la cuenta autenticada, el plan, los derechos de uso y el resumen del monedero |
| `tickets:read` | Leer los tickets de soporte y sus mensajes |
| `tickets:write` | Actualizar tickets, asignar compañeros de equipo y añadir notas internas o respuestas a clientes |
| `team:read` | Leer los miembros del equipo, las invitaciones pendientes y los eventos de auditoría permitidos |
| `team:write` | Crear o revocar invitaciones y gestionar los roles de los miembros del equipo que no son propietarios |
| `integrations:read` | Consultar las instalaciones y los repositorios autorizados de GitHub App |
| `integrations:write` | Preparar cambios de integración y crear pull requests en borrador |
| `sites:read` | Listar y obtener sitios |
| `sites:write` | Crear, actualizar, publicar, despublicar y eliminar sitios |
| `agents:read` | Leer la configuración del agente |
| `agents:write` | Actualizar el comportamiento, el idioma, la voz y la configuración de incrustación del agente |
| `knowledge:read` | Listar las fuentes de conocimiento y las preguntas frecuentes |
| `knowledge:write` | Crear, actualizar y eliminar fuentes de conocimiento y preguntas frecuentes |
| `conversations:read` | Listar conversaciones y obtener sus mensajes |
| `conversations:write` | Tomar el control de una conversación: responder a un visitante en nombre del negocio, pausar el agente en ella y devolvérsela |
| `leads:read` | Listar los leads capturados |
| `leads:write` | Crear, actualizar, calificar y aceptar leads en el embudo de oportunidades |
| `pipeline:read` | Leer etapas, cuentas, oportunidades, actividades, atribución y el estado de sincronización del CRM |
| `pipeline:write` | Configurar etapas; crear o actualizar oportunidades y cuentas; importar o reintentar resultados del CRM |
| `analytics:read` | Leer los eventos de analíticas del sitio |
| `connectors:read` | Listar el estado de los conectores sin devolver secretos |
| `connectors:write` | Crear, actualizar, activar, desactivar y eliminar conectores |
| `domains:read` | Eliminado. Se mantiene solo por compatibilidad; todas las rutas `/domains` devuelven `409` porque no se ofrecen dominios personalizados |
| `domains:write` | Eliminado. Se mantiene solo por compatibilidad; todas las rutas `/domains` devuelven `409` |
| `broadcasts:read` | Listar difusiones y el estado de entrega |
| `broadcasts:write` | Crear borradores y poner en cola el envío de una difusión |
| `notifications:read` | Listar las notificaciones del propietario |
| `notifications:write` | Marcar notificaciones como leídas o no leídas |
| `monetization:read` | Listar los productos de monetización |
| `monetization:write` | Crear, actualizar, activar, desactivar y eliminar productos |
| `usage:read` | Leer los eventos de uso medido |
| `webhooks:read` | Listar los endpoints de webhook y el estado de entrega |
| `webhooks:write` | Crear y eliminar endpoints de webhook |
Usa permisos de lectura para los trabajos de generación de informes. Añade un permiso de escritura solo cuando la integración realice esa modificación. Por ejemplo, una exportación de leads normalmente necesita `sites:read` y `leads:read`, no `sites:write` ni `agents:write`.
## Fallos de permisos [#fallos-de-permisos]
```json
{
"error": {
"code": "insufficient_scope",
"message": "The API key does not grant the required scope.",
"details": { "required": ["sites:write"] },
"request_id": "6c0b2f2e-..."
}
}
```
Añade el permiso que falta a la clave en **Ajustes → Desarrollador → Editar**, o crea una clave de reemplazo y actualiza el secreto del servidor. Al editar se cambian en el mismo lugar el nombre y los permisos de la clave; su caducidad y su token no cambian. Las claves emitidas mediante OAuth no se pueden editar; vuelve a conectar la aplicación para cambiar lo que se le concedió.
## Estructura del error [#estructura-del-error]
Todos los errores de la API usan la misma estructura de nivel superior:
```ts
type ApiError = {
error: {
code: string;
message: string;
details?: unknown;
request_id: string;
};
};
```
Basa tu lógica en `error.code`, no en el `message` en inglés. Los mensajes pueden mejorar sin que cambie la versión. Registra `error.request_id` y el encabezado de respuesta `x-request-id` junto con el nombre de la operación, el estado y el número de reintento, pero nunca registres el encabezado de autorización ni los secretos de la solicitud.
## Referencia de estados y códigos [#referencia-de-estados-y-códigos]
| HTTP | Código estable | Significado | Respuesta habitual |
| ----- | ------------------------- | -------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| `400` | `invalid_request` | La validación falló o un campo no es compatible | Corrige los campos indicados en `details`; no reintentes con los mismos datos |
| `400` | `invalid_json` | El cuerpo no es un objeto JSON o contiene JSON no válido | Serializa un único objeto JSON válido |
| `401` | `authentication_required` | Falta el encabezado Bearer | Adjunta una credencial desde el servidor |
| `401` | `invalid_api_key` | La clave no es válida, ha caducado, se ha revocado o su propietario ya no existe | Sustituye o rota la clave |
| `403` | `subscription_required` | El propietario no tiene un plan de pago activo | Restablece la suscripción antes de reintentar |
| `403` | `insufficient_scope` | La credencial no tiene el permiso de la operación | Crea una credencial de reemplazo con el mínimo privilegio |
| `403` | `account_paused` | El acceso a la API está en pausa para la cuenta | Reanuda el acceso a la API o contacta con el propietario de la cuenta |
| `404` | `not_found` | No se encontró el endpoint o el recurso propio | Verifica la ruta y el ID perteneciente al tenant |
| `409` | `conflict` | El estado actual del recurso impide la acción | Consulta el estado actual antes de reintentar |
| `413` | `payload_too_large` | El cuerpo JSON supera el límite de 256 KB por solicitud | Envía un cuerpo más pequeño; divide los contenidos grandes en varias solicitudes |
| `415` | `invalid_request` | El cuerpo de la modificación no es `application/json` | Envía `Content-Type: application/json` |
| `429` | `rate_limit_exceeded` | Se agotó el límite del plan de la clave para el período de un minuto | Espera el tiempo indicado en `Retry-After` y aplica jitter |
| `500` | `internal_error` | No se pudo completar la solicitud | Reintenta una operación segura o idempotente e informa del ID de solicitud |
| `503` | `outcome_unknown` | Es posible que una modificación se haya completado, pero no se pudo registrar su resultado; `details.retryable` es `false` | No reintentes. Consulta el recurso para ver si el cambio se realizó; la misma clave de idempotencia seguirá devolviendo este resultado |
Los recursos que no pertenecen a la cuenta del propietario de la credencial pueden devolver `404` en lugar de revelar si existe el ID de otro tenant.
## Detalles de validación [#detalles-de-validación]
La validación de campos devuelve rutas que puedes mostrar junto a tus propios controles de formulario:
```json
{
"error": {
"code": "invalid_request",
"message": "Request validation failed.",
"details": [
{ "path": "content.headline", "message": "String must contain at least 1 character(s)" }
],
"request_id": "6c0b2f2e-..."
}
}
```
Los cuerpos de las modificaciones deben ser objetos JSON. Se rechazan las matrices, los cuerpos vacíos, los datos de formulario y el JSON enviado con un tipo de contenido de texto.
## Decisiones de reintento [#decisiones-de-reintento]
* Reintenta `429` después del número de segundos indicado en `Retry-After`.
* Reintenta `500` solo en lecturas seguras o en escrituras protegidas por la misma `Idempotency-Key`.
* Reintenta el `409` de idempotencia en curso después de su encabezado `Retry-After: 2`.
* Nunca reintentes `503 outcome_unknown` a ciegas. Comprueba primero el recurso; usa una nueva clave de idempotencia solo después de confirmar que el cambio no se realizó.
* No reintentes `400`, `401`, `403`, `404`, `413` ni un conflicto de estado hasta que cambie la causa.
Consulta [Límites de frecuencia](/es/docs/api/rate-limits) para conocer el comportamiento del backoff y la [Referencia de la API](/es/docs/api/reference) para ver el permiso requerido en cada operación.
---
# Estado del SDK
Source: /es/docs/api/sdks.md
{/* docs-visuals */}
La API REST versionada es hoy la única superficie de integración pública compatible de forma oficial. El código fuente de los clientes de JavaScript, Python y de frameworks existe en el repositorio del producto, pero los paquetes no están publicados actualmente en npm ni en PyPI.
## Disponibilidad [#disponibilidad]
| Cliente | Estado | Cómo usarlo |
| ---------------------------------- | -------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| REST sobre HTTPS | **Disponible** | Llama a `https://makeagent.fast/api/v1` desde cualquier cliente HTTP del lado del servidor |
| Documento OpenAPI | **Disponible** | Descarga [/api/openapi.json](/api/openapi.json) e inspecciónalo antes de generar un cliente |
| `@make-agent-fast/sdk` | **Versión preliminar en código fuente: no está en npm** | No añadas esta importación a un proyecto de producción hasta que aquí se enlace una versión publicada en un registro |
| Paquete de Python `makeagentfast` | **Versión preliminar en código fuente: no está en PyPI** | Usa `requests`, `httpx` o la biblioteca estándar de Python hasta que aquí se enlace una versión publicada en PyPI |
| Adaptadores de React, Vue y Svelte | **Versión preliminar en código fuente: no están en npm** | Es preferible usar el patrón documentado de carga mediante script para tu framework |
| Componente web | **Versión preliminar en código fuente: no está en npm** | Es preferible usar el cargador estándar `embed.js` |
No ejecutes `npm install @make-agent-fast/sdk` ni `pip install makeagentfast` basándote únicamente en un ejemplo de importación. Esta página incluirá la URL del registro, la versión, las indicaciones de integridad y el comando de instalación cuando se publique un paquete público.
## JavaScript sin SDK [#javascript-sin-sdk]
```ts
const response = await fetch("https://makeagent.fast/api/v1/sites?limit=100", {
headers: {
Authorization: `Bearer ${process.env.MAF_API_KEY}`,
Accept: "application/json",
},
});
const body = await response.json();
if (!response.ok) {
console.error(body.error.code, body.error.request_id);
throw new Error(`Make Agent Fast request failed (${response.status})`);
}
for (const site of body.data) console.log(site.id, site.title);
```
Mantén la clave de API en el servidor. Un bundle de navegador de React, Vue o Svelte debe llamar a tu propio backend o instalar el cargador público de inserción (embed); no debe llamar a la API de administración con un secreto.
## Python sin SDK [#python-sin-sdk]
```python
import json
import os
import urllib.request
request = urllib.request.Request(
"https://makeagent.fast/api/v1/sites?limit=100",
headers={
"Authorization": f"Bearer {os.environ['MAF_API_KEY']}",
"Accept": "application/json",
},
)
with urllib.request.urlopen(request, timeout=20) as response:
payload = json.load(response)
for site in payload["data"]:
print(site["id"], site["title"])
```
En producción, captura `urllib.error.HTTPError` y analiza su cuerpo JSON usando el [formato de error estable](/es/docs/api/scopes-errors).
## Clientes generados [#clientes-generados]
La generación a partir de OpenAPI solo resulta útil cuando el documento contiene las operaciones y los esquemas de los que depende tu aplicación. Fija la especificación descargada, genera el cliente en un directorio revisable e inspecciona cada diferencia antes de actualizar.
```bash
curl --fail-with-body https://makeagent.fast/api/openapi.json \
--output make-agent-fast.openapi.json
```
No regeneres ni despliegues automáticamente un cliente a partir de la URL en vivo. Un nuevo campo añadido no debería romper un cliente, pero el comportamiento del generador y los nombres de los métodos generados aún pueden cambiar.
## Qué debe incluir una versión pública del SDK [#qué-debe-incluir-una-versión-pública-del-sdk]
Antes de marcar como disponible cualquier cliente en versión preliminar, debe contar con lo siguiente:
* Una página pública en un registro y una versión semántica inmutable.
* Instrucciones de instalación, actualización y entornos de ejecución compatibles.
* Modelos tipados de solicitud y respuesta generados a partir del contrato completo de la API.
* Errores estructurados que conserven el estado HTTP y el ID de la solicitud.
* Utilidades de paginación que traten los cursores como opacos.
* Compatibilidad explícita con claves de idempotencia en las operaciones que modifican datos.
* Pruebas de CI contra el contrato actual de `/api/v1` y un registro de cambios publicado.
Hasta que se cumplan estas condiciones, usa los ejemplos de REST de la [guía de inicio rápido de la API](/es/docs/api/quickstart) y las [recetas de la API](/es/docs/api/recipes).
---
# Webhooks
Source: /es/docs/api/webhooks.md
{/* docs-visuals */}
Los webhooks para desarrolladores envían a tu servidor los eventos de tu cuenta, de modo que no necesitas hacer polling. La entrega es de al menos una vez: los eventos pueden duplicarse, retrasarse o llegar desordenados.
## Registrar un endpoint [#registrar-un-endpoint]
Crea una clave con `webhooks:write` y luego registra un receptor HTTPS público junto con el conjunto mínimo de eventos que necesites.
```bash
curl --fail-with-body https://makeagent.fast/api/v1/webhook-endpoints \
-X POST \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: webhook-production-v1" \
-d '{
"url": "https://api.example.com/webhooks/make-agent-fast",
"events": ["lead.created", "conversation.started"]
}'
```
La URL debe usar HTTPS, no puede incluir usuario, contraseña, fragmento ni puerto personalizado, y debe resolver únicamente a direcciones IP públicas. Durante la entrega no se siguen las redirecciones.
La respuesta `201` revela una sola vez un secreto de firma `whsec_...`. Guárdalo en el gestor de secretos del receptor antes de cerrar la respuesta. Si más adelante listas los endpoints, obtendrás la URL, los eventos, el estado, la última entrega y el último error, pero no el secreto.
## Tipos de eventos [#tipos-de-eventos]
| Evento | Se emite cuando |
| ------------------------------ | ------------------------------------------------------------------------------------- |
| `site.published` | Un sitio pasa a estar publicado |
| `site.unpublished` | Un sitio vuelve al estado de borrador |
| `lead.created` | El agente captura un nuevo lead |
| `lead.qualified` | El agente califica un lead, o un lead se acepta en el pipeline de ventas |
| `booking.requested` | Un visitante solicita o reserva un horario |
| `handoff.requested` | El agente transfiere una conversación a una persona (handoff) |
| `opportunity.created` | Un lead se convierte en una oportunidad del pipeline |
| `opportunity.updated` | Cambia la asignación, el valor, la siguiente acción u otros campos de una oportunidad |
| `opportunity.stage_changed` | Una oportunidad pasa a otra etapa |
| `opportunity.won` | Una oportunidad se cierra como ganada |
| `opportunity.lost` | Una oportunidad se cierra como perdida |
| `conversation.started` | Comienza un nuevo hilo de conversación |
| `conversation.message.created` | Se añade un mensaje a una conversación |
| `knowledge.ready` | Una fuente de conocimiento termina de procesarse |
| `broadcast.sent` | Un broadcast termina su flujo de envío |
| `domain.activated` | Retirado: no se ofrecen dominios personalizados; este evento nunca se emite |
## Formato de la solicitud [#formato-de-la-solicitud]
Make Agent Fast envía un `POST` con `Content-Type: application/json`, `User-Agent: MakeAgentFast-Webhooks/1.0` y estas cabeceras:
```http
maf-event-id: evt_...
maf-event-type: lead.created
maf-signature: t=1784210566,v1=HEX_HMAC_SHA256
```
El cuerpo JSON tiene un envelope estable. Los campos dentro de `data` dependen del evento y pueden recibir campos adicionales.
```json
{
"id": "evt_2c34...",
"type": "lead.created",
"created_at": "2026-07-16T10:02:46.000Z",
"data": {
"site_id": "SITE_ID",
"lead_id": "LEAD_ID"
}
}
```
Usa el `id` del cuerpo o `maf-event-id` como clave de deduplicación. No uses la hora de entrega ni un ID de base de datos generado.
## Verificar la firma en Node.js [#verificar-la-firma-en-nodejs]
Lee los bytes exactos sin procesar antes de parsear el JSON. El valor firmado es `TIMESTAMP + "." + RAW_BODY`.
```ts
import { createHmac, timingSafeEqual } from "node:crypto";
export function verifyWebhook(rawBody: Buffer, header: string, secret: string) {
const values = Object.fromEntries(header.split(",").map((part) => part.split("=", 2)));
const timestamp = values.t;
const supplied = values.v1;
if (!timestamp || !supplied || !/^[a-f0-9]{64}$/.test(supplied)) return false;
const age = Math.abs(Date.now() / 1_000 - Number(timestamp));
if (!Number.isFinite(age) || age > 300) return false;
const expected = createHmac("sha256", secret)
.update(`${timestamp}.`)
.update(rawBody)
.digest("hex");
return timingSafeEqual(Buffer.from(expected, "hex"), Buffer.from(supplied, "hex"));
}
```
Rechaza las firmas mal formadas y las marcas de tiempo anteriores a tu ventana de repetición aceptada; cinco minutos es un valor predeterminado razonable. Compara bytes de longitud fija en tiempo constante.
## Verificar la firma en Python [#verificar-la-firma-en-python]
```python
import hashlib
import hmac
import time
def verify_webhook(raw_body: bytes, header: str, secret: str) -> bool:
values = dict(part.split("=", 1) for part in header.split(",") if "=" in part)
timestamp = values.get("t", "")
supplied = values.get("v1", "")
try:
if abs(time.time() - int(timestamp)) > 300:
return False
except ValueError:
return False
signed = timestamp.encode() + b"." + raw_body
expected = hmac.new(secret.encode(), signed, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, supplied)
```
Parsea y procesa el JSON solo después de que la verificación de la firma haya sido correcta.
## Confirmar y procesar [#confirmar-y-procesar]
1. Verifica la firma y la marca de tiempo.
2. Inserta el ID del evento en una tabla con una restricción de unicidad.
3. Si ya existe, devuelve `204` sin repetir el efecto secundario.
4. Confirma el evento (commit) o encola tu tarea interna.
5. Devuelve rápidamente una respuesta `2xx`.
El emisor de Make Agent Fast agota el tiempo de espera a los 10 segundos. Solo considera correcta una respuesta `2xx` y no sigue redirecciones.
## Comportamiento de los reintentos [#comportamiento-de-los-reintentos]
Las entregas fallidas se encolan hasta un máximo de ocho intentos. El backoff comienza en unos dos segundos, se duplica con jitter y tiene un tope de una hora; la hora real de entrega puede ser posterior cuando los workers están ocupados. Como los reintentos pueden sobrevivir a la solicitud que los originó y llegar desordenados, nunca dependas de que un evento llegue inmediatamente antes que otro.
Devuelve una respuesta que no sea 2xx solo cuando quieras que Make Agent Fast reintente. Si un evento tiene una versión que ya no se admite de forma permanente o el destino fue eliminado, acepta y registra el evento, o elimina el endpoint, en lugar de generar fallos transitorios interminables.
## Rotar un secreto de firma [#rotar-un-secreto-de-firma]
Los secretos de firma no se pueden revelar ni editar. Para rotarlos de forma segura:
1. Crea un segundo endpoint que apunte a una ruta de receptor temporal o con versión.
2. Guarda el secreto recién revelado.
3. Acepta y deduplica los eventos de ambos endpoints.
4. Comprueba que el nuevo endpoint recibe entregas válidas.
5. Elimina el endpoint antiguo con `DELETE /webhook-endpoints/{endpoint_id}`.
Si la URL del receptor se mantiene igual, haz que la aplicación receptora acepte ambos secretos durante el periodo de solapamiento y utiliza los IDs de evento para evitar efectos secundarios duplicados.
## Solución de problemas [#solución-de-problemas]
| Síntoma | Qué revisar |
| -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| No hay entregas | Estado del endpoint, eventos seleccionados, DNS público, certificado HTTPS y si el evento realmente ocurrió |
| La firma no coincide | Acceso al cuerpo sin procesar, concatenación exacta de `timestamp.body`, secreto correcto del endpoint y transformaciones del cuerpo por parte de proxies |
| Entregas repetidas | Código de respuesta, tiempo de espera de 10 segundos, excepciones internas y unicidad del ID de evento |
| Error de dirección privada | Los registros DNS deben resolver solo a direcciones públicas; localhost y los rangos internos se rechazan |
| Fallo por redirección | Registra directamente la URL HTTPS final; las redirecciones no se siguen |
Nunca incluyas el secreto de firma, la clave bearer ni el payload completo de un visitante en un mensaje a soporte. Incluye el ID del endpoint, el ID del evento, la hora del fallo y los logs del receptor sanitizados.
---
# Pantalla
Source: /es/docs/build/appearance.md
{/* docs-visuals */}
La apariencia del widget da estilo al **chat** y a la **llamada en vivo** del visitante a la vez: colores, tema, esquinas, sombra, efecto cristal y fuentes. No crea una página de marketing alojada. Los agentes nuevos se publican como un embed en tu sitio web actual.
Abre la página **Agente** del agente y elige la pestaña **Pantalla**. Cada control se aplica a ambas superficies, y el lienzo en vivo junto a la pestaña muestra el widget real.
## Los cambios se publican automáticamente [#los-cambios-se-publican-automáticamente]
No hay botón de guardar. Los textos y los controles deslizantes se guardan tras una breve pausa; los interruptores, los ajustes preestablecidos y las opciones se guardan al instante, y junto al control aparece un aviso **Guardado**. Cada guardado actualiza el registro del agente y refresca el embed (y cualquier página alojada heredada), de modo que los visitantes ven el cambio sin esperar a una nueva publicación. Compruébalo en una ventana privada sobre un embed real.
Ocultar o mostrar la insignia en los planes Operate y Scale usa la misma actualización en vivo.
## Usar el sitio web vs. Claro u Oscuro [#usar-el-sitio-web-vs-claro-u-oscuro]
**Tema del agente** tiene tres opciones:
| Opción | Efecto |
| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Usar el sitio web** | Sigue el modo claro u oscuro de cada visitante (primero el de la página anfitriona y luego el del sistema operativo). Es la opción predeterminada. |
| **Claro** | Fija el chat y la llamada en vivo a la paleta clara. |
| **Oscuro** | Fija el chat y la llamada en vivo a la paleta oscura. |
**Usar el sitio web** equivale a `auto`. Si fijas Claro u Oscuro, tanto el chat como la llamada en vivo quedan fijos para todos los visitantes. Edita las paletas clara y oscura por separado; el interruptor de la vista previa solo cambia la paleta que estás editando.
En un embed, el cargador todavía puede pasar `data-theme="light"` o `data-theme="dark"` como ajuste forzado desde la página anfitriona. Consulta la [descripción general del embed](/es/docs/embed/overview).
## Colores, ajustes preestablecidos y tipografía [#colores-ajustes-preestablecidos-y-tipografía]
* **Ajustes preestablecidos** (Sharp, Soft, Glass, Minimal): definen a la vez las esquinas, la sombra, el borde y el efecto cristal.
* **Color principal**: burbujas del visitante, acentos de la llamada y acciones principales. **Auto (acento del sitio)** hereda el acento de marca detectado al rastrear tu sitio, que se usa para el widget.
* Ajusta con precisión el color secundario, el fondo, la superficie del panel, las esquinas, la sombra, el borde, el efecto cristal y la fuente.
* **Igualar al sitio** en la fuente se aplica cuando el agente está insertado en un sitio externo; **Predeterminada del widget** mantiene la tipografía del widget.
Usa un contraste suficiente y asegúrate de que los estados interactivos se distingan bien. Haz la vista previa en anchos de escritorio y reducidos, incluidas las etiquetas en coreano y en inglés.
## Conversación en vivo en la vista previa de Pantalla [#conversación-en-vivo-en-la-vista-previa-de-pantalla]
El lienzo junto a la pestaña **Pantalla** muestra el widget real, así que el chat y la llamada en vivo aparecen con la paleta clara u oscura seleccionada y con el mismo aspecto de interfaz del visitante que en el embed. Hablar con el agente ahí sigue siendo una prueba del propietario; consulta [Voz y llamadas en vivo](/es/docs/build/voice).
## Insignia de marca [#insignia-de-marca]
Quitar la insignia está disponible en los planes Operate y Scale. Los sitios del plan Launch conservan la insignia de recomendación de Make Agent Fast. Al cambiar el ajuste de la insignia (**Mostrar la insignia “Made with”**), también se actualiza el embed en vivo sin necesidad de volver a publicar.
---
# Reservas con Cal.com
Source: /es/docs/build/cal-com.md
{/* docs-visuals */}
## Conecta tu calendario [#conecta-tu-calendario]
Abre **Agente → Acciones → Cal.com**. Introduce una clave de API de Cal.com que empiece por `cal_`, el ID numérico positivo del tipo de evento y una zona horaria IANA, como `Asia/Seoul`. Elige **Guardar conexión**. Cada agente tiene su propia conexión. La clave se cifra en el servidor; el panel solo muestra sus últimos cuatro caracteres. Si actualizas una conexión existente, deja la clave en blanco para conservarla.
Elige **Probar conexión** para leer hasta tres horarios próximos de los siguientes siete días con los ajustes introducidos. Esta prueba no guarda la conexión ni crea ninguna reserva. Que no aparezcan horarios puede significar simplemente que el tipo de evento no tiene disponibilidad en ese periodo. Si la prueba falla, revisa en Cal.com la clave, el tipo de evento y el horario. Si eliminas la conexión, el agente deja de crear nuevas reservas en Cal.com, pero no cancela las reservas existentes.
Los pagos quedan fuera del alcance. [Google Calendar](/es/docs/build/google-calendar) es una opción independiente que todavía no está disponible de forma general.
## De los horarios a la reserva [#de-los-horarios-a-la-reserva]
1. El agente llama a `find_slots` para obtener disponibilidad futura real. Muestra hasta ocho horarios en la zona horaria configurada. El rango predeterminado va desde hoy hasta siete días después; el intervalo máximo de fechas es de 14 días. Si solo hay un horario disponible, se muestra solo.
2. El cliente elige un horario y proporciona su nombre, su correo electrónico y, opcionalmente, una nota. El agente vuelve a comprobar que el horario sigue libre y que se ofreció en esta conversación. Las ofertas de horarios caducan a los 15 minutos.
3. Una tarjeta de confirmación muestra la fecha, la hora, la zona horaria y los datos del asistente. El cliente debe pulsar **Confirmar**. Un mensaje en el chat o la selección de un horario, por sí solos, no reservan nada. La propuesta caduca a los 15 minutos y no bloquea el horario.
4. Solo después de la confirmación, el adaptador solicita la reserva a Cal.com. Un resultado `accepted` de Cal.com pasa a `done`, con el UID de la reserva como referencia. `pending` o `awaiting_host` permanece como pendiente; un rechazo o una cancelación pasa a fallido.
En los canales de mensajería, las propuestas de reserva solo funcionan en chats privados. El ensayo no llama a Cal.com ni crea ninguna reserva. Sin una conexión con Cal.com, sigue disponible el flujo actual de solicitud de reserva, que no demuestra que se haya reservado un hueco en el calendario. Si cambias la clave, el tipo de evento o la zona horaria, el destino de ejecución de la propuesta deja de ser válido, así que empieza de nuevo después de cambiar la conexión.
## Si un horario ya está ocupado o el resultado es incierto [#si-un-horario-ya-está-ocupado-o-el-resultado-es-incierto]
Otro cliente puede ocupar un horario antes de que termine la confirmación. Si el horario ya no está libre, el agente informa de que no está disponible; si Cal.com lo rechaza durante la creación, el recibo muestra un fallo. Pide horarios nuevos y confirma una propuesta nueva. El recibo de fallo no adjunta automáticamente nuevas opciones.
Un tiempo de espera agotado en la red no demuestra ni un fallo ni un éxito. El recibo muestra un resultado desconocido mientras el servicio vuelve a comprobarlo. El endpoint de creación de Cal.com no tiene un contrato documentado de clave de idempotencia, por lo que el adaptador guarda el ID de ejecución en `metadata.maf_run` y busca esa reserva en todos los estados y páginas antes de reintentar la creación. Una búsqueda incompleta nunca permite enviar otra solicitud de creación. Esto reduce el riesgo de duplicados, pero no es una garantía de ejecución exactamente una vez respaldada por el proveedor. Antes de hacer otra reserva tras agotar los reintentos, comprueba Cal.com.
La aprobación del anfitrión en Cal.com es independiente de la aprobación del propietario en las acciones de cambio personalizadas. Esta integración no actualiza automáticamente una reserva pendiente de Cal.com; comprueba su estado final en Cal.com. El widget web puede consultar periódicamente el recibo de ejecución almacenado, y los canales privados compatibles reciben los recibos diferidos según sus ventanas de servicio. Consulta la [entrega de recibos](/es/docs/build/change-actions#customer-confirmation-and-receipts).
## Versiones de la API y comprobaciones previas al lanzamiento [#versiones-de-la-api-y-comprobaciones-previas-al-lanzamiento]
El adaptador envía autenticación Bearer y estos valores de `cal-api-version` específicos de cada endpoint, verificados con la documentación oficial el **2026-10-13**:
| Operación | Versión | Referencia |
| ----------------- | ------------ | ------------------------------------------------------------------------------------------------------- |
| Leer horarios | `2024-09-04` | [GET /v2/slots](https://cal.com/docs/api-reference/v2/slots/get-available-time-slots-for-an-event-type) |
| Crear reserva | `2026-02-25` | [POST /v2/bookings](https://cal.com/docs/api-reference/v2/bookings/create-a-booking) |
| Conciliar reserva | `2026-05-01` | [GET /v2/bookings](https://cal.com/docs/api-reference/v2/bookings/get-all-bookings) |
Antes de usarlo con clientes, prueba una reserva controlada, verifica el UID en Cal.com, intenta reservar un horario ocupado y comprueba los recibos en cada canal previsto. Una prueba de conexión correcta solo demuestra una lectura de horarios, no una reserva real ni que todo esté listo para producción.
---
# Acciones de cambio
Source: /es/docs/build/change-actions.md
{/* docs-visuals */}
## Define un cambio [#define-un-cambio]
Usa una acción de cambio para actualizar un registro en tu propio sistema, por ejemplo para cancelar un pedido. Abre **Agente → Acciones**, configura el secreto de tu agente en **Clientes con sesión iniciada** y después añade una **Acción de cambio**: un nombre único, una descripción de cuándo usarla, un endpoint HTTPS público y entradas de texto declaradas. Un nombre como `cancel_order` se convierte en la herramienta del modelo `change_cancel_order`. Las ediciones existentes se guardan automáticamente; espera a que aparezca el indicador de guardado.
Mantén activada la opción **Requiere cliente con sesión iniciada** para los registros privados. Tu endpoint debe seguir autorizando el registro solicitado con respecto al ID de cliente verificado. Un nombre, un correo electrónico o un ID de pedido escrito en el chat no es una prueba de identidad. Si desactivas esta opción, `customer` puede ser null: permite únicamente los cambios apropiados para visitantes anónimos. Los pagos quedan fuera del alcance de esta función.
## Elige la aprobación del propietario [#elige-la-aprobación-del-propietario]
La confirmación del cliente es obligatoria en todos los modos:
| Modo | Después de que el cliente confirme |
| -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Sin aprobación (`none`) | Se ejecuta sin una decisión adicional del propietario. |
| Aprobar siempre (`always`) | Espera al propietario. |
| Por encima de un límite (`over_limit`) | Espera cuando una entrada numérica declarada es estrictamente mayor que el límite; la igualdad no requiere aprobación. Una entrada numérica no válida se rechaza. |
Revisa las solicitudes en espera en **Agente → Acciones → Aprobaciones**. El propietario del sitio puede aprobar o rechazar. Si tienes vinculadas las alertas privadas de Telegram para el propietario, la alerta también incluye los botones **Aprobar / Rechazar**. Solo el chat privado del propietario vinculado puede usarlos; los toques caducados o repetidos no pueden ejecutar la acción de nuevo. La aprobación caduca 24 horas después de la confirmación del cliente. El cliente recibe el resultado, incluido un rechazo o una caducidad. Las ejecuciones recientes muestran el estado, las marcas de tiempo, la referencia y el ID del cliente.
## Qué recibe tu endpoint [#qué-recibe-tu-endpoint]
No se envía ninguna solicitud cuando el modelo propone el cambio. Tras la confirmación del cliente y la aprobación del propietario, si se requiere, Make Agent Fast envía:
```http
POST /agent/cancel-order HTTP/1.1
Content-Type: application/json
x-maf-timestamp:
x-maf-signature: v1=<64-lowercase-hex-characters>
x-maf-idempotency-key: c5c1d94b-e88f-4bf6-8023-2dcd1e7ac67b
```
```json
{
"version": 1,
"action": "cancel_order",
"runId": "c5c1d94b-e88f-4bf6-8023-2dcd1e7ac67b",
"requestId": "c5c1d94b-e88f-4bf6-8023-2dcd1e7ac67b",
"siteId": "YOUR_SITE_ID",
"input": { "order_id": "A128" },
"customer": { "id": "customer_123", "email": "customer@example.com" }
}
```
`action` no incluye el prefijo `change_`. Ambos ID y la cabecera de idempotencia se mantienen iguales en los reintentos. `input` contiene únicamente cadenas declaradas y sin espacios sobrantes; `customer` es null o el objeto verificado con `id` y, opcionalmente, `email`/`name`.
Usa el [verificador de firma de las consultas](/es/docs/build/lookups#verify-the-signature): HMAC-SHA256 con el secreto de tu agente sobre `"maf-webhook-v1:" + timestamp + "." + rawBody`, en hexadecimal en minúsculas con el prefijo `v1=`. Verifica los bytes originales, la vigencia de la marca de tiempo, el sitio y la acción esperados, y la pertenencia del registro al cliente antes de escribir. **Deduplica de forma atómica `x-maf-idempotency-key` junto con tu cambio y conserva el resultado.** Una solicitud repetida debe devolver el resultado guardado sin modificar el registro de nuevo. El bloqueo de la plataforma no puede sustituir la deduplicación en tu sistema.
## Devuelve un resultado [#devuelve-un-resultado]
Devuelve un JSON con código 2xx que incluya el campo obligatorio `status` (`done`, `pending` o `failed`) y, opcionalmente, `message`, `reference` y `card`:
```json
{
"status": "done",
"message": "Order cancelled.",
"reference": "A128",
"card": {
"kind": "status",
"title": "Order A128",
"fields": [{ "label": "Order", "value": "A128" }]
}
}
```
La tarjeta de estado opcional requiere `title` y `fields`; `kind: "status"` es opcional. Admite `status: { label, tone }`, `reference`, `asOf` y `link: { label, url }`, como en las [consultas](/es/docs/build/lookups#return-a-response). Los tonos son `neutral`, `success`, `warning` o `danger`; los enlaces deben ser URL HTTPS seguras. Los campos que no estén en el esquema se rechazan. Mantén el texto breve y sencillo. El `status` externo determina el resultado; el texto de la tarjeta no puede convertir un resultado pendiente en un éxito.
Usa `done` solo cuando el cambio esté completado, `pending` cuando aún se esté procesando y `failed` para un fallo conocido. Los tiempos de espera agotados, los errores de red, los 5xx y las respuestas no válidas se tratan como inciertos (`unknown`). La reconciliación reintenta tras un minuto y luego tras cinco minutos, con un máximo de tres intentos de ejecución y la misma clave; la programación de la cola puede retrasar estos tiempos. Un HTTP 4xx falla sin reintento. Si se agota la incertidumbre, la ejecución falla y se notifica al propietario, pero eso no demuestra que tu sistema no haya realizado ningún cambio. Investígalo antes de iniciar otra ejecución. `pending` no desencadena otra ejecución.
## Envía un callback final firmado [#envía-un-callback-final-firmado]
Cuando una ejecución `pending` o `unknown` se resuelva, envía mediante POST una respuesta final a `https://makeagent.fast/api/agent/actions/RUN_ID/callback`. Envía el mismo contrato de respuesta con `status: "done"` o `"failed"`; aquí no se acepta `pending`.
Contrato de callback actualizado el 2026-10-14: firma `maf-callback-v1:` + runId + `:` + timestamp + `.` + rawBody. Si el cuerpo incluye `runId`, debe coincidir con el ID de ejecución de la ruta; si no coincide, se devuelve 400. Las firmas de otra ejecución o del formato anterior sin vinculación devuelven 403.
```js
import { createHmac } from "node:crypto";
const body = JSON.stringify({ status: "done", reference: "A128" });
const timestamp = String(Math.floor(Date.now() / 1000));
const signature = createHmac("sha256", agentSecret)
.update(`maf-callback-v1:${runId}:${timestamp}.${body}`)
.digest("hex");
const response = await fetch(
`https://makeagent.fast/api/agent/actions/${encodeURIComponent(runId)}/callback`,
{
method: "POST",
headers: {
"content-type": "application/json",
"x-maf-timestamp": timestamp,
"x-maf-signature": `v1=${signature}`,
},
body,
},
);
```
Usa el secreto del agente almacenado en tu servidor y el ID de ejecución recibido en la solicitud original. El callback usa **`maf-callback-v1:`**, no el espacio de nombres de la solicitud saliente. El desfase de la marca de tiempo debe ser de cinco minutos como máximo. Las firmas no válidas devuelven 403; los cuerpos no válidos devuelven 400; una ejecución ya terminada o incompatible devuelve 409. Un callback repetido no sobrescribe el resultado final. Rota este secreto junto con la configuración de identidad y de firma de tu endpoint.
## Confirmación del cliente y recibos [#confirmación-del-cliente-y-recibos]
El cliente revisa las entradas exactas y pulsa **Confirmar** o **Cancelar** en la propuesta. Una propuesta caduca a los 15 minutos; una nueva propuesta para la misma acción y conversación reemplaza a la anterior. La confirmación usa un token vinculado a esa ejecución, sitio y visitante. Escribir «sí» o hacer clic en una tarjeta de confirmación genérica no autoriza el cambio. Los botones del ensayo están inactivos y no llaman a tu endpoint.
En la web, el widget abierto consulta periódicamente los recibos no finalizados, al principio cada cinco segundos y después cada 30 segundos, durante un máximo de 24 horas. Un recibo puede mostrar los estados solicitado, esperando al propietario, en ejecución, pendiente, comprobando un resultado desconocido, completado, fallido, rechazado, cancelado o caducado. Solo `done` confirma la finalización.
Las propuestas en los canales funcionan **solo en chats privados**, nunca en grupos ni en canales. Los recibos diferidos usan el buzón de salida duradero: se admiten los mensajes directos normales de bots de Telegram; WhatsApp, Messenger, Instagram y Telegram Business requieren un mensaje entrante registrado en las últimas 24 horas, que se vuelve a comprobar en el momento del envío. El envío diferido no está disponible para las consultas de invitados de Telegram, Discord ni KakaoTalk. Las ventanas cerradas y las conexiones desactivadas pueden impedir la entrega; el historial de ejecuciones sigue registrando el resultado.
## Límites y pruebas [#límites-y-pruebas]
| Elemento | Límite |
| -------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| Acciones de cambio | 5 por agente; los nombres deben ser únicos entre cambios y consultas |
| Nombres | Acción: `^[a-z][a-z0-9_]{2,39}$`; entrada: `^[a-z][a-z0-9_]{1,31}$`; los nombres de acción reservados no están disponibles |
| Descripciones | 300 caracteres |
| Entradas | 3 cadenas declaradas, de 200 caracteres como máximo cada una |
| Endpoint | HTTPS público, hasta 500 caracteres, sin credenciales en la URL, direcciones privadas ni redirecciones |
| Tiempo de espera de ejecución / respuesta / cuerpo del callback | 8 segundos / 32 KiB / 32 KiB |
| Título de la tarjeta de estado / etiqueta del campo / valor / campos | 80 / 40 / 200 caracteres / 8 campos |
| Caducidad de la propuesta / de la aprobación | 15 minutos / 24 horas después de la confirmación |
Usa un endpoint controlado para verificar la confirmación, la cancelación, la aprobación, el tiempo de espera agotado, la gestión de claves duplicadas y los callbacks finales. Comprueba sus registros, no solo el texto del recibo. El ensayo demuestra que no se realiza ninguna escritura externa; no es una prueba de ejecución del endpoint. Prueba cada canal privado previsto antes de confiar en los recibos.
---
# Crear un agente
Source: /es/docs/build/create-agent.md
{/* docs-visuals */}
El primer agente parte de la **URL de un sitio web**. Rastreamos las páginas públicas a las que podemos acceder, redactamos un borrador del agente (incluido el estilo del widget a partir de esos datos) y lo mantenemos fuera de tu sitio web hasta el último paso de la incorporación. El chat para construir está desactivado. No existe ninguna función para generar un sitio ni un constructor de secciones.
## Pega una URL [#pega-una-url]
En la página de inicio, pega la URL y continúa. El registro y el inicio de sesión conservan `next=/onboarding/launch?url=…`, así que no se te pedirá pegarla de nuevo. `/try` permite a los visitantes pegar una URL y hablar con un borrador con marca de agua (solo texto y con límite) antes de reclamarlo al registrarse.
Si ya tienes sitios, una URL pegada sigue creando un **nuevo** borrador sin publicar. Si la misma URL ya está en curso, se reanuda en lugar de duplicarse. Un sitio de primera configuración ya terminado no se reutiliza.
No pegues contraseñas, datos privados de clientes ni tokens de conectores en el campo de la URL.
## Espera en la pantalla de generación [#espera-en-la-pantalla-de-generación]
Mientras se crea el borrador, la pantalla de generación muestra el progreso real de ingesta, composición y examen, no un indicador de carga falso:
| Paso | Qué hace |
| ----------------------- | ------------------------------------------------------------------------- |
| **Leyendo el sitio** | Obtiene las páginas públicas de la URL |
| **Creando el agente** | Compone el agente y el estilo del widget a partir de los datos rastreados |
| **Probando respuestas** | Ejecuta una autoevaluación con ese conocimiento |
La espera habitual es de unos segundos; un sitio más grande puede tardar hasta aproximadamente un minuto. Si el rastreo aporta poco, el borrador usa igualmente lo que se haya encontrado. Puedes añadir fuentes después de la revisión.
El borrador nunca se publica automáticamente. Los agentes nuevos no tienen una página de marketing alojada.
## Conoce al agente y publícalo [#conoce-al-agente-y-publícalo]
Una vez creado el borrador, la incorporación muestra dos pantallas más:
* **Conoce a tu agente**: el chat real junto a tres comprobaciones rápidas. Pregunta, lee la respuesta y acéptala o corrígela. El ensayo por texto consume créditos; las solicitudes de contacto y las acciones se simulan.
* **Ponlo donde están tus clientes**: el último paso. Activa el widget del sitio web para el sitio que pegaste y activa el **Enlace del agente** (una página de chat pública en la dirección propia de tu agente) para que puedas probarlo en tu teléfono en **Pruébalo en tu teléfono**. Añade el código de instalación a tu sitio y pulsa **Comprobar mi sitio**.
Después, el agente se abre en su página **Agente**, el primer elemento de la barra lateral del agente: las pestañas **Resumen**, **Pantalla**, **Voz** y **Acciones** junto a un lienzo en vivo que muestra el widget real en la esquina que elegiste. Pregúntale lo que preguntaría un cliente justo ahí. En **Resumen**, **Comprobación de respuestas** → **Ejecutar una comprobación** evalúa las respuestas según tu conocimiento.
Hablar con el agente en el panel es una prueba del propietario. No se publica y no cuenta para la activación.
Para poner el widget en tu sitio web más adelante, abre **Publicar** → **Widget del sitio web** en la página Agente. Si el widget aún no está activado, elige **Activar incrustación**. Una vez activado, la misma hoja muestra el código de instalación, el interruptor **Mostrar en mi sitio web** y **Direcciones web permitidas**. Puedes ocultar el widget en cualquier momento con ese interruptor o con la tarjeta **En tu sitio web** de la pestaña **Resumen**.
## Activación [#activación]
Cuando ya estés en línea, añade la incrustación o conecta un canal. El sitio queda **activado** con la primera conversación de un visitante o el primer lead captado. Las pruebas del panel nunca cuentan.
## Edita después del primer borrador [#edita-después-del-primer-borrador]
No hay chat para construir. Después de la revisión, actualiza:
* Las instrucciones en la pestaña **Resumen** de la página Agente, y **Voz** y **Pantalla** en sus pestañas contiguas.
* **Conocimiento** en su propia página en la barra lateral del agente.
* Los cambios de **Pantalla** se guardan automáticamente y actualizan la incrustación en vivo sin necesidad de volver a publicar.
## Empieza sin la URL de un sitio web [#empieza-sin-la-url-de-un-sitio-web]
Si envías el formulario de la página de inicio vacío, **Probar** se abre igualmente. Los visitantes anónimos pueden pegar allí una URL y hablar con un borrador; reclámalo al registrarte para continuar con la incorporación. Una URL pegada siempre sigue el camino de la pantalla de generación descrito arriba.
---
# Preguntas frecuentes y productos
Source: /es/docs/build/faqs-products.md
{/* docs-visuals */}
## Usa preguntas frecuentes para las respuestas de referencia [#usa-preguntas-frecuentes-para-las-respuestas-de-referencia]
Crea una pregunta frecuente por cada intención del visitante. Redacta la pregunta con el lenguaje que usan tus clientes y asegúrate de que la respuesta sea completa por sí sola, sin depender de otra pregunta frecuente.
## Usa productos para los datos del catálogo [#usa-productos-para-los-datos-del-catálogo]
Los productos son ideales para una oferta con nombre y campos como descripción, precio, disponibilidad o enlace. Mantén actualizados los datos transaccionales y evita prometer inventario o plazos de entrega, a menos que tu fuente se actualice de forma fiable.
## Evita la duplicación [#evita-la-duplicación]
No mantengas el mismo precio en una nota, una pregunta frecuente, una sección de página y un registro de producto. Elige una única fuente de referencia y enlázala o menciónala en el resto de lugares.
## Verifica el comportamiento de cara al cliente [#verifica-el-comportamiento-de-cara-al-cliente]
Después de cada cambio, hazle al agente la pregunta frecuente con varias formulaciones distintas y confirma que el enlace y el precio del producto son correctos.
---
# Seguimientos y recordatorios
Source: /es/docs/build/follow-ups.md
{/* docs-visuals */}
## Ofrece ayuda en el momento adecuado [#ofrece-ayuda-en-el-momento-adecuado]
Abre **Agente → Acciones → Seguimientos**. Añade hasta cinco reglas para una visita a una página, un visitante inactivo, una intención de salida, un error de formulario o un evento personalizado. Elige un patrón de ruta, un retraso opcional, un mensaje de hasta 200 caracteres y hasta tres respuestas rápidas. Los ajustes se guardan automáticamente. La vista previa muestra el mensaje sin contactar con ningún cliente ni añadir datos al experimento.
Usa `/pricing` para una sola ruta, `/products/*` para un segmento o `/products/**` para rutas anidadas. Las consultas (query) y los fragmentos quedan excluidos. El retraso por inactividad predeterminado es de 30 segundos y el tiempo de espera entre apariciones (cooldown) predeterminado es de siete días. Un disparador no interrumpirá una intervención humana (handoff) ni una conversación activa abierta, no se repetirá en la misma sesión y no volverá a aparecer tras descartarlo en esa sesión.
El código de inserción (embed) informa de las visitas a páginas, la inactividad y la intención de salida. Tu desarrollador puede informar de eventos personalizados con `MakeAgentFast.track`; consulta [Acciones de página](/es/docs/build/page-actions). El informe automático de errores de formulario está desactivado a menos que el embed use `data-auto-form-error="true"` o `MakeAgentFastSettings.autoFormError = true`. Informa del ID del formulario, nunca de los valores de los campos.
## Interpreta los resultados del grupo de control [#interpreta-los-resultados-del-grupo-de-control]
De forma predeterminada, el 10 % de los visitantes elegibles se asigna a un grupo de control estable y no ve ningún mensaje. La asignación pertenece al visitante y a la regla; las visitas repetidas no inflan la muestra. El panel compara las tasas de conversión de los visitantes elegibles del grupo con mensaje y del grupo de control, y muestra el aumento absoluto en puntos porcentuales.
Una conversión es un lead, una reserva, una acción completada o una consulta exitosa registrados dentro de las 24 horas siguientes a una exposición elegible. Las aperturas y las respuestas se muestran por separado. Los eventos informados desde el navegador no pueden declarar conversiones. Con menos de 50 visitantes por grupo, el panel indica que no hay datos suficientes; a partir de ese umbral muestra un intervalo del 95 % sencillo. Las diferencias pequeñas no demuestran que el mensaje haya generado más ventas.
## Avisa a un cliente cuando algo cambie [#avisa-a-un-cliente-cuando-algo-cambie]
Los clientes pueden pedir «Avísame cuando haya un horario disponible» o «Avísame cuando cambie el estado de mi pedido». Una vigilancia (watch) monitoriza la disponibilidad de un calendario conectado o un campo/estado en una [consulta](/es/docs/build/lookups) configurada. Las vigilancias de consultas requieren un cliente con sesión iniciada y verificado. No monitorizan páginas arbitrarias ni programan recordatorios recurrentes.
El agente propone una vigilancia con su destino y su fecha de finalización. El cliente debe pulsar el botón de confirmación en un plazo de 15 minutos. Los visitantes del sitio web y de llamadas en directo, además, introducen un correo electrónico y marcan en pantalla la casilla de consentimiento para el correo; un «sí» escrito o hablado no es suficiente. El correo contiene un aviso genérico y un enlace de corta duración para volver. Ese enlace no inicia sesión al destinatario ni concede acceso a los registros del cliente.
Cada visitante puede tener tres vigilancias activas o pendientes, con un máximo de 50 por agente y una duración máxima de 14 días. Las comprobaciones empiezan a los 15 minutos y después se espacian a una hora y a seis horas. Cada vigilancia envía un único intento de notificación y después se detiene. Cancélala desde los controles de la propia vigilancia o desde la lista de Seguimientos del owner. Cambiar la configuración de la consulta o del calendario subyacente puede detener una vigilancia. Una entrega incierta no se reenvía automáticamente.
## Haz seguimiento en los chats y consúltate cuando el agente se atasque [#haz-seguimiento-en-los-chats-y-consúltate-cuando-el-agente-se-atasque]
Abre **Agente → Acciones → Seguimientos → Seguimientos de chat**. Estos dos interruptores se aplican a los chats de Telegram, WhatsApp, Messenger e Instagram.
**Hacer seguimiento cuando un cliente deja de responder** está activado de forma predeterminada para los agentes de ventas y desactivado para los demás tipos de agente. Cuando un cliente deja de responder tras una respuesta, el agente vuelve a leer el chat y, o bien envía un mensaje breve, o bien espera un poco más, o bien lo deja en paz. Un agente de ventas avanza hacia la compra, un agente de atención comprueba que el problema se haya resuelto y un agente de reservas ofrece un horario. Solo usa tus fuentes de conocimiento aprobadas y la conversación, y se detiene cuando el cliente responde, rechaza o pide que no le escriban. Los canales de Meta solo aceptan mensajes automatizados durante las 24 horas posteriores al último mensaje del cliente, por lo que ahí el seguimiento llega dentro de ese día; un chat con un bot de Telegram puede recibir hasta dos seguimientos a lo largo de varios días. Cada seguimiento se factura como una respuesta.
**Consultarme cuando el agente no pueda responder** está activado de forma predeterminada. En lugar de pedir un correo electrónico, el agente le dice al cliente que lo está consultando con el equipo y te avisa con un enlace a la conversación. Responde ahí o guarda la respuesta en las fuentes de conocimiento, y el agente se la enviará al cliente en su idioma. Instagram y Messenger aceptan tu respuesta durante las 24 horas posteriores al último mensaje del cliente, o hasta 7 días una vez que tu app de Meta tenga el permiso Human Agent.
## Entrega y disponibilidad [#entrega-y-disponibilidad]
| Destino | Límite actual |
| ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| Sitio web / llamada en directo | Correo electrónico con consentimiento explícito; sin notificaciones push en segundo plano desde el widget |
| Telegram | Chat privado existente con el bot; un chat privado de Business también requiere una ventana de 24 horas abierta |
| WhatsApp | Mensaje libre dentro de las 24 horas posteriores a un mensaje entrante del cliente; fuera de ese plazo se requiere una plantilla de utilidad aprobada |
| Messenger / Instagram | Solo dentro de las 24 horas posteriores a un mensaje entrante del cliente |
| Discord / KakaoTalk | Transporte de vigilancias no disponible; la política de Kakao además exige una plantilla de AlimTalk y excluye de 20:50 a 08:00 KST |
Las restricciones de cada canal se comprueban de nuevo en el momento de la entrega. Una vigilancia con consentimiento no las anula ni garantiza que el mensaje se entregue.
---
# Google Calendar
Source: /es/docs/build/google-calendar.md
{/* docs-visuals */}
## Disponibilidad de la función [#disponibilidad-de-la-función]
**Google Calendar aún no está disponible de forma general.** Hasta que se habilite, **Agente → Acciones → Google Calendar** muestra «próximamente» y la conexión no está disponible; un ajuste del agente no puede activarla. [Cal.com](/es/docs/build/cal-com) sigue siendo una opción independiente.
## Conectar un calendario [#conectar-un-calendario]
Cuando esté habilitado, abre el panel de Google Calendar y elige **Conectar**. Inicia sesión en Google y revisa los permisos solicitados para los eventos del calendario y la disponibilidad libre/ocupado. Esta conexión es independiente del inicio de sesión en Make Agent Fast. El servidor almacena el refresh token cifrado; ni el panel ni el agente lo reciben.
Los scopes solicitados son `calendar.events`, `calendar.freebusy` y los no sensibles `openid` y `email`. El callback requiere un correo electrónico verificado y lo almacena cifrado para resolver `primary` al mismo ID de calendario que su escritura explícita con el correo. No se solicita ningún scope de perfil. Las conexiones antiguas sin correo verificado deben desconectarse y volver a conectarse antes de poder reservar.
Un agente usa un solo proveedor de calendario a la vez. Desconecta el proveedor existente antes de cambiar. Elige el ID del calendario (`primary` para el calendario principal de la cuenta conectada) y su zona horaria IANA, por ejemplo `Asia/Seoul`. Un calendario compartido debe ser accesible con los permisos de la cuenta conectada. Al desconectar, se revoca la autorización de Google y se elimina la conexión; no se cancelan los eventos existentes.
## Definir el horario laboral [#definir-el-horario-laboral]
Las conexiones nuevas no tienen horario laboral, por lo que no se ofrecerán franjas hasta que lo añadas. Añade ventanas de apertura y cierre para cada día laborable. Un día vacío se considera cerrado; varias ventanas que no se solapen permiten una pausa para comer. Los horarios se interpretan en la zona horaria seleccionada. Los ajustes se guardan automáticamente.
| Ajuste | Rango admitido |
| ------------------------------------ | ---------------------------------------------------------- |
| Duración de la franja | 5–240 minutos |
| Margen alrededor de eventos ocupados | 0–120 minutos |
| Antelación mínima | 0–43 200 minutos |
| Horizonte de reserva | 1–90 días |
| Ventanas de trabajo | Hasta 28 ventanas sin solapamiento a lo largo de la semana |
La disponibilidad es el horario laboral menos los bloques ocupados del calendario seleccionado, el margen, la antelación mínima y el horizonte. Define los horarios en la zona horaria prevista del calendario y revisa los cambios de horario de verano cuando corresponda. Que no haya franjas puede significar horario cerrado u horas ocupadas, y no necesariamente un error de conexión.
## De la disponibilidad a una reserva [#de-la-disponibilidad-a-una-reserva]
El agente usa el mismo flujo `find_slots` y `book_slot` que Cal.com: ofrece hasta ocho horarios disponibles, recopila nombre y correo electrónico y una nota opcional, vuelve a comprobar la franja elegida y luego muestra una tarjeta de confirmación. Las ofertas y propuestas caducan a los 15 minutos; ninguna reserva la franja. Solo el toque del cliente en el botón autoriza la reserva. Un «sí» dicho durante una llamada en directo no puede reservarla.
Tras la confirmación, Google recibe un evento con un ID determinista vinculado a la ejecución de la acción y envía invitaciones a los asistentes. Un evento confirmado y validado genera un comprobante completado; los eventos provisionales permanecen pendientes. Si una franja ya está ocupada, solicita nuevos horarios y confirma de nuevo. Un resultado de red incierto se comprueba usando el mismo ID de evento; no consideres un tiempo de espera agotado como un éxito ni crees otra reserva a ciegas. Los cambios de configuración invalidan las ofertas y propuestas anteriores.
Para recibir un aviso cuando se libere un horario, usa un [seguimiento](/es/docs/build/follow-ups) con consentimiento. Antes de abrirlo a los clientes, verifica una reserva y su invitación reales en Google, prueba una franja ocupada y comprueba la desconexión y reconexión, así como el canal de mensajería previsto.
---
# Fuentes de conocimiento
Source: /es/docs/build/knowledge.md
{/* docs-visuals */}
El conocimiento le da al agente material de origen que puede recuperar. Al añadir una fuente, se extrae el texto sin formato, se divide en pasajes, se crean embeddings y se asocian esos pasajes con el sitio actual. En el momento de responder, el agente recupera los pasajes relevantes en lugar de recibir todas las fuentes en cada prompt.
## Elige el tipo de fuente adecuado [#elige-el-tipo-de-fuente-adecuado]
| Fuente | Ideal para | Comportamiento importante |
| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Pegar texto** | Políticas, datos de contacto, notas internas breves | De 5 a 200 000 caracteres; sin actualización automática |
| **Desde URL** | Páginas públicas que se mantienen en otro lugar | Una página por defecto; opcionalmente, rastrea 5, 10, 20 o 40 páginas del mismo sitio |
| **Subir archivo** | PDF, Word (`.docx`, `.doc`), Excel (`.xlsx`, `.xls`), PowerPoint (`.pptx`), Hancom `.hwp` y `.hwpx`, OpenDocument (`.odt`, `.ods`, `.odp`), `.rtf`, `.txt`, `.md`, `.csv`, `.tsv`, `.json`, `.html` | Máximo 20 MB; se rechazan los archivos protegidos con contraseña y los que tienen macros habilitadas; los PDF escaneados que solo contienen imágenes no tienen texto seleccionable |
| **YouTube** | Vídeos públicos con contenido hablado útil | Operate o Scale. Intenta primero los subtítulos y después la transcripción disponible; mejor esfuerzo |
| **Podcast** | La URL del audio de un episodio público o un feed compatible | Operate o Scale. Requiere audio accesible y un proveedor de transcripción disponible |
| **Blog / RSS** | Actualizaciones públicas de un blog o podcast en RSS/Atom | Operate o Scale. Extrae como texto los elementos del feed disponibles; mejor esfuerzo |
Usa **FAQ y productos** para campos previsibles de pregunta/respuesta o de catálogo, en lugar de enterrarlos en un documento largo. Consulta [FAQs y productos](/es/docs/build/faqs-products).
## Añadir una fuente [#añadir-una-fuente]
1. Abre la página **Conocimiento** del agente desde su barra lateral y selecciona **Añadir fuente**.
2. Selecciona **Pegar texto**, **Desde URL** o **Subir archivo**. **YouTube**, **Podcast** y **Blog / RSS** se encuentran en **Más tipos de fuente** y requieren Operate o Scale; en Launch aparecen con un candado.
3. Introduce el contenido o elige un archivo.
4. En **Desde URL**, elige **Páginas a rastrear** (1, 5, 10, 20 o 40). En las fuentes obtenidas de la web, puedes configurar opcionalmente **Actualización automática** como **Diaria**, **Semanal** o **Nunca**.
5. Selecciona **Añadir al conocimiento** y espera el resultado, que muestra el número de fragmentos indexados.
6. Haz una pregunta cuya respuesta solo aparezca en la nueva fuente.
La ingesta de conocimiento consume créditos porque se generan embeddings de los pasajes de la fuente. Se rechaza cuando el espacio de trabajo no tiene acceso activo o un saldo de créditos utilizable.
## Rastrea páginas públicas de forma segura [#rastrea-páginas-públicas-de-forma-segura]
El rastreador acepta contenido HTTP/HTTPS público y bloquea los destinos de redes privadas que no son seguros. Empieza con una sola página canónica. Aumenta el número de páginas solo cuando las páginas enlazadas formen parte del mismo conjunto de información útil; un rastreo más grande puede incorporar navegación, textos legales genéricos, texto duplicado o archivos obsoletos que empeoran la recuperación.
El número seleccionado es un máximo, no una garantía. El comportamiento de robots, la autenticación, el renderizado solo en el cliente, las redirecciones, el tipo de contenido, el tamaño de la respuesta y la estructura de enlaces pueden reducir el número de páginas obtenidas. La respuesta de una página está limitada a 5 MB y debe contener suficiente texto extraíble.
Para datos importantes que están tras un inicio de sesión, pega un resumen aprobado o sube una exportación depurada en lugar de intentar rastrear una página autenticada.
## Usa archivos y contenido multimedia [#usa-archivos-y-contenido-multimedia]
Los archivos subidos deben contener texto extraíble. No se aplica OCR a un PDF escaneado que solo contiene imágenes; conviértelo a texto con capacidad de búsqueda antes de subirlo. Las hojas de cálculo se leen hoja por hoja y las filas de las tablas mantienen sus celdas juntas (`Coffee | 3000`); el resto del diseño se aplana en orden de lectura, así que procura que las tablas sean sencillas. Quita la contraseña de un documento antes de subirlo y guarda los archivos de Office con macros habilitadas (`.docm`, `.xlsm`, `.pptm`) como archivos normales `.docx`, `.xlsx` o `.pptx` antes de subirlos. Se rechaza un archivo cuyo contenido no coincide con su extensión.
La ingesta de YouTube prefiere una pista de subtítulos disponible. Si no hay subtítulos, la transcripción depende del proveedor y de la red. El audio de un podcast debe ser accesible públicamente. Los resultados de un feed dependen de cuánto texto de artículo o episodio exponga el feed. Después de cualquier importación de contenido multimedia, revisa el título de la fuente y el número de fragmentos, y prueba con un dato concreto en lugar de dar por hecho que se capturó la grabación completa.
## Planifica la actualización y el reemplazo [#planifica-la-actualización-y-el-reemplazo]
Las programaciones diaria y semanal están disponibles para fuentes de URL, YouTube, podcast y feed. El sistema vuelve a obtener el origen guardado de la fuente y reemplaza sus pasajes recuperables cuando un rastreo programado se completa correctamente. La lista de fuentes muestra la frecuencia de actualización y la hora de la última actualización.
Las fuentes pegadas y subidas son instantáneas. Para corregir o reemplazar una, elimínala y añade el contenido actualizado. Al eliminar una fuente, sus pasajes dejan de recuperarse en el futuro; esto no modifica los mensajes anteriores que ya citaron o resumieron la versión antigua.
Usa una única fuente de referencia clara para precios, políticas y horarios. Si dos fuentes activas se contradicen, la recuperación puede mostrar cualquiera de las dos afirmaciones. Elimina las versiones obsoletas en lugar de añadir copias «nuevas» junto a ellas.
## Redacta contenido que el agente pueda recuperar [#redacta-contenido-que-el-agente-pueda-recuperar]
* Indica el tema en cada sección: «Política de cancelación del plan Pro» se recupera mejor que «Más detalles».
* Pon la respuesta en lenguaje sencillo cerca del encabezado correspondiente.
* Incluye unidades, moneda, zona horaria, fecha de entrada en vigor y excepciones cuando sean relevantes.
* Usa URLs canónicas estables y nombres de archivo descriptivos.
* Separa la información pública de las instrucciones internas o los registros privados.
* Mantén el comportamiento de la personalidad en [Personalidad e instrucciones](/es/docs/build/persona), no dentro del material de origen factual.
## Prueba las respuestas basadas en fuentes [#prueba-las-respuestas-basadas-en-fuentes]
Crea un pequeño conjunto de pruebas de aceptación antes de publicar:
1. Una pregunta directa cuya respuesta sea explícita en la fuente.
2. Una paráfrasis que use palabras distintas.
3. Una pregunta límite que la fuente no responda.
4. Un dato que haya cambiado recientemente.
5. Una variante de idioma para cada idioma configurado del agente.
El resultado correcto no siempre es una respuesta segura. Cuando la fuente no contiene el dato, el agente debe seguir sus instrucciones de respaldo o de escalado en lugar de inventarlo. Revisa **Conversaciones** después del lanzamiento para detectar preguntas sin respuesta repetidas y convierte las respuestas validadas en una fuente o en una FAQ estructurada.
## Solución de problemas [#solución-de-problemas]
| Síntoma | Qué comprobar |
| ----------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| La URL indica que no hay texto utilizable | Acceso público, tipo de contenido compatible, texto renderizado en el servidor, destino de la redirección y tamaño de la página |
| El PDF indica que no hay texto seleccionable | Si es un escaneo; aplícale OCR o expórtalo a un PDF con capacidad de búsqueda o a un archivo de texto |
| Archivo rechazado por estar protegido con contraseña o por no coincidir con su tipo | Quita la contraseña y vuelve a guardar el archivo en su formato real en lugar de cambiarle el nombre; guarda los archivos de Office con macros sin macros |
| Falla la importación de YouTube/podcast | URL pública, disponibilidad de subtítulos/audio, clave del proveedor de transcripción y restricciones de obtención |
| Se ignora un dato correcto | Resultado del procesamiento, redacción, fuentes en conflicto, antigüedad de la fuente y la pregunta de prueba exacta |
| El agente revela demasiado | Elimina de inmediato la fuente privada y refuerza los límites de la personalidad y el acceso a la cuenta |
| Persiste una respuesta antigua | Elimina o reemplaza la fuente obsoleta, espera a que se reindexe e inicia una nueva conversación de prueba |
Nunca subas credenciales, claves privadas, exportaciones de clientes sin restricciones, historiales médicos ni ningún contenido que el agente público nunca deba revelar.
---
# Consultas
Source: /es/docs/build/lookups.md
{/* docs-visuals */}
## Cuándo usar una consulta [#cuándo-usar-una-consulta]
Usa una consulta para obtener el estado actual de un pedido, una reserva existente o el registro de la cuenta de un cliente. Mantén las políticas estables y la información de productos en [Conocimiento](/es/docs/build/knowledge). Una consulta lee tu sistema; no debe cobrar, cancelar, reservar ni modificar de ningún otro modo un registro. Las tarjetas genéricas de elección y confirmación solo envían un mensaje del visitante. Para escrituras confirmadas, usa [Acciones de cambio](/es/docs/build/change-actions); para reservas de calendario, usa [Reservas con Cal.com](/es/docs/build/cal-com). Solo las tarjetas de confirmación respaldadas por una ejecución autorizan esas operaciones.
## Configura la acción [#configura-la-acción]
Abre **Agente → Acciones**. Crea el secreto en **Clientes con sesión iniciada**, guárdalo en tu servidor e implementa la [identificación de clientes](/es/docs/embed/security#identify-signed-in-customers). En **Consultas**, añade un nombre como `order_status`, explica cuándo debe usarla el agente e introduce tu endpoint HTTPS público. Declara solo las entradas que necesites, por ejemplo una cadena `order_id`. El agente ve la herramienta como `lookup_order_status`.
Mantén activada la opción **Requiere cliente con sesión iniciada** para registros privados (es el valor predeterminado). Si la desactivas, las solicitudes pueden contener `customer: null`; devuelve solo información apropiada para un visitante anónimo. Un ID mencionado en el chat o extraído de una foto es una entrada, no una identidad autenticada.
Los campos existentes se guardan automáticamente; espera al indicador de guardado antes de probar. Puedes activar o desactivar, editar o eliminar una consulta. El panel requiere un secreto configurado. Estas acciones se configuran en el panel; la primera fase no expone la gestión de consultas a través de la API pública.
## La solicitud que recibes [#la-solicitud-que-recibes]
Make Agent Fast envía un POST JSON a la URL que configuraste. Los ejemplos siguientes usan valores de firma de marcador de posición:
```http
POST /agent/order-status HTTP/1.1
Content-Type: application/json
x-maf-timestamp:
x-maf-signature: v1=<64-lowercase-hex-characters>
```
```json
{
"version": 1,
"action": "order_status",
"requestId": "c5c1d94b-e88f-4bf6-8023-2dcd1e7ac67b",
"siteId": "YOUR_SITE_ID",
"input": { "order_id": "A128" },
"customer": { "id": "customer_123", "email": "customer@example.com" }
}
```
`action` es el nombre configurado sin el prefijo `lookup_`. `requestId` identifica ese intento; `siteId` identifica tu sitio. `input` contiene únicamente los parámetros de tipo cadena declarados. `customer` es null o el objeto `{ id, email?, name? }` verificado por el servidor; las entradas del visitante o del modelo no pueden sustituirlo. La **Prueba** del panel usa deliberadamente el cliente de ejemplo introducido por un propietario autorizado.
## Verifica la firma [#verifica-la-firma]
La firma es un HMAC-SHA256 en hexadecimal en minúsculas que usa tu **secreto del agente**, con el prefijo `v1=`. Firma exactamente `"maf-webhook-v1:" + timestamp + "." + rawBody`. Conserva los bytes recibidos; analizar y volver a serializar el JSON antes de comprobar la firma puede alterarlos. Esta función auxiliar acepta un `Request` estándar del lado del servidor, aplica una ventana de validez de cinco minutos y fija el sitio:
```js
import { createHmac, timingSafeEqual } from "node:crypto";
export async function verifyLookupRequest(request, expectedSiteId) {
const secret = process.env.MAF_SECRET_KEY;
if (!secret) throw new Error("MAF_SECRET_KEY is required");
const timestamp = request.headers.get("x-maf-timestamp");
const signature = request.headers.get("x-maf-signature");
const now = Math.floor(Date.now() / 1000);
if (!timestamp || !/^\d+$/.test(timestamp) ||
!Number.isSafeInteger(Number(timestamp)) ||
Math.abs(now - Number(timestamp)) > 300) {
throw new Error("Invalid timestamp");
}
if (!signature || !/^v1=[a-f0-9]{64}$/.test(signature)) {
throw new Error("Invalid signature");
}
const rawBody = Buffer.from(await request.arrayBuffer());
const expected = createHmac("sha256", secret)
.update(`maf-webhook-v1:${timestamp}.`)
.update(rawBody)
.digest();
const actual = Buffer.from(signature.slice(3), "hex");
if (actual.length !== expected.length || !timingSafeEqual(actual, expected)) {
throw new Error("Invalid signature");
}
const body = JSON.parse(rawBody.toString("utf8"));
if (body?.version !== 1 || body.siteId !== expectedSiteId) {
throw new Error("Invalid lookup scope");
}
return body;
}
```
Llámala antes de que tu analizador de cuerpo consuma la solicitud. Tu controlador debe rechazar los errores de verificación, validar la acción esperada y la forma de las entradas, y comprobar la propiedad del registro con `body.customer.id` antes de devolver cualquier dato privado. Por ejemplo, selecciona el pedido A128 **dentro de los pedidos de ese cliente**, no solo por el ID del pedido. Nunca uses `input.customer_id`, un correo electrónico proporcionado en el chat ni una foto como autorización. Exige un cliente no nulo en los endpoints privados. Limita el tamaño del cuerpo entrante en tu servidor y registra `requestId` dentro de la ventana de validez si necesitas rechazar repeticiones; la comprobación de la marca de tiempo por sí sola no rechaza una repetición dentro de esa ventana.
Usa HTTPS y mantén este endpoint en modo de solo lectura aunque el transporte sea POST. Tras rotar el secreto del agente, actualiza tanto el servidor que firma la identidad como el verificador de consultas.
## Devuelve una respuesta [#devuelve-una-respuesta]
Responde con un estado 2xx correcto y un JSON que cumpla este contrato. El primer ejemplo es un registro encontrado; el segundo es un resultado normal sin coincidencias:
```json
{
"found": true,
"card": {
"title": "Order #A128",
"status": { "label": "Shipped", "tone": "success" },
"fields": [{ "label": "Carrier", "value": "DHL" }],
"reference": "A128",
"asOf": "2026-10-12T09:00:00Z",
"link": { "label": "Track", "url": "https://shop.example.com/orders/A128" }
},
"facts": { "order_id": "A128", "status": "shipped", "carrier": "DHL" }
}
```
```json
{ "found": false }
```
`found` es obligatorio. Con `found: true`, incluye `card`, `facts` o ambos. Una tarjeta requiere `title` y `fields` (se permite un array vacío). Los campos opcionales son `status`, `reference`, `asOf` y `link`. No añadas `kind` a la tarjeta de la respuesta. Los tonos de estado son `neutral`, `success`, `warning` y `danger`. Usa una marca de tiempo ISO para `asOf` y un enlace HTTPS sin credenciales incrustadas. Los enlaces opcionales no válidos se omiten.
`facts` es un objeto plano cuyos valores son cadenas, números finitos, booleanos o null; los objetos anidados y los arrays se rechazan. Los campos desconocidos en el esquema de la respuesta o de la tarjeta se rechazan. Devuelve solo la información necesaria para responder: el modelo recibe datos escapados y acotados, marcados como no confiables, no instrucciones. El contenido de la tarjeta es texto sin formato, no HTML.
## Límites y comportamiento ante fallos [#límites-y-comportamiento-ante-fallos]
| Elemento | Límite |
| --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| Consultas por agente | 5; nombres e IDs únicos |
| Nombre | `^[a-z][a-z0-9_]{2,39}$`; los nombres de acciones reservados no están disponibles |
| Descripción | 300 caracteres |
| Entradas declaradas | 3; nombres únicos que cumplan `^[a-z][a-z0-9_]{1,31}$` |
| Descripciones / valores de entradas | 300 / 200 caracteres; los valores se recortan |
| Endpoint | HTTPS público, hasta 500 caracteres, sin credenciales; direcciones privadas/internas bloqueadas; no se siguen redirecciones |
| Tiempo de espera / cuerpo de la respuesta | 8 segundos / 32 KiB (32 768 bytes) |
| Datos para el modelo | 2000 caracteres, independientes de la tarjeta del visitante |
| Título / etiquetas / valores de campo de la tarjeta | 80 / 40 / 200 caracteres |
| Campos de la tarjeta | 8; como máximo 3 tarjetas por turno del agente |
Si falta la identidad del cliente, se muestra un aviso para iniciar sesión sin llamar a tu endpoint. Si faltan entradas obligatorias, se las solicita al visitante. `found: false` muestra una tarjeta neutral de sin coincidencias. Los tiempos de espera agotados, los estados distintos de 2xx, el JSON o esquema no válido y las respuestas demasiado grandes muestran un estado de fallo e indican al modelo que no adivine. Devuelve `found: false` con un 2xx para un registro inexistente habitual, en lugar de un HTTP 404. Mantén concisos los datos importantes: las cadenas de la tarjeta y los datos del modelo que excedan el límite se recortan.
## Prueba desde el panel [#prueba-desde-el-panel]
1. Guarda la consulta y abre **Prueba**. Introduce un ID de cliente de ejemplo, un correo electrónico opcional y todas las entradas obligatorias. Usa una cuenta que controles.
2. Ejecuta la **Prueba**. Esto envía una solicitud firmada real, incluso si la consulta está desactivada para los visitantes; el chat de ensayo normal nunca llama al endpoint. El panel limita los intentos de prueba por owner.
3. Revisa la tarjeta o el resumen validados, o el error, el ID de solicitud, la duración y el estado HTTP cuando estén disponibles. Revisa los registros de tu endpoint sin guardar secretos ni tokens de clientes.
4. Prueba los casos de encontrado, no encontrado, cuenta incorrecta, entrada faltante y tiempo de espera agotado. Después, prueba el embed real con dos clientes autenticados; un ejemplo del panel no demuestra el aislamiento de identidad en el navegador ni la selección real de herramientas por parte del modelo.
El widget muestra tarjetas de estado; los toques en tarjetas genéricas de elección o confirmación envían sus etiquetas como mensajes. Las confirmaciones de cambios y reservas respaldadas por una ejecución usan en su lugar el flujo de ejecución protegido. Los conectores adaptan las tarjetas a texto o tarjetas nativos y a botones, respuestas rápidas o listas, con texto alternativo según los límites de cada canal. Prueba cada canal previsto antes de confiar en la entrega.
---
# Tus propias herramientas (MCP)
Source: /es/docs/build/mcp-tools.md
{/* docs-visuals */}
## Conectar y descubrir [#conectar-y-descubrir]
Abre **Agente → Acciones → Tus herramientas (MCP)**. Conecta tu servidor remoto mediante su flujo de OAuth o una credencial de tipo bearer, o usa una conexión MCP existente. Selecciona **Descubrir** para leer el catálogo de herramientas. Revisa la descripción, los parámetros y las anotaciones de cada herramienta antes de activarla. El descubrimiento no ejecuta ninguna herramienta; las herramientas recién descubiertas quedan desactivadas.
Puedes configurar tres servidores de herramientas y activar un total de 20 herramientas. Las credenciales permanecen en el servidor. Eliminar la asignación de una herramienta detiene esa asignación, pero no revoca la conexión de conocimiento compartida ni su autorización OAuth; gestiona esa conexión por separado. El servidor MCP de gestión para owners de Make Agent Fast no se puede exponer como servidor de herramientas para clientes. Para gestionar tus agentes desde Claude, consulta [Usar Claude y ChatGPT](/es/docs/operate/ai-assistants).
## Elegir lectura o escritura [#elegir-lectura-o-escritura]
| Efecto | Comportamiento |
| --------- | ---------------------------------------------------------------------------------------------------------------------------- |
| Lectura | Llama directamente a la herramienta y trata el texto o los datos estructurados devueltos como datos de negocio no confiables |
| Escritura | Crea una propuesta; el cliente debe confirmar los datos exactos con los botones de la tarjeta antes de la ejecución |
La lectura solo está disponible si el servidor declara `readOnlyHint: true`, no declara `destructiveHint: true` y mantienes la herramienta clasificada como lectura. De lo contrario, trátala como escritura. Revisa lo que el servidor hace realmente; las anotaciones no son un sistema de autorización.
Por defecto, las escrituras requieren la aprobación del propietario cada vez. Puedes elegir no exigir aprobación adicional del propietario o exigirla solo por encima de un límite en un parámetro numérico. La confirmación del cliente sigue siendo obligatoria en todos los modos. La aprobación del propietario usa la lista de Aprobaciones y los comprobantes existentes. Los ajustes se guardan automáticamente. El ensayo del propietario nunca llama al servidor remoto.
## Vincular al cliente que ha iniciado sesión [#vincular-al-cliente-que-ha-iniciado-sesión]
Por defecto, las herramientas requieren un cliente verificado. Usa la [identidad firmada del cliente](/es/docs/embed/security) en tu sitio web; un ID escrito en el chat no es una verificación. Para registros específicos de un cliente, elige el parámetro de tipo cadena de la herramienta que identifica al cliente. El servidor lo rellena con el ID del cliente verificado y lo elimina de los datos de entrada del modelo. Los parámetros enum no se pueden usar para esta vinculación.
Por ejemplo, vincula `customer_id` en una herramienta que consulta un pedido. El modelo puede proporcionar la referencia de pedido declarada, pero no puede sustituirla por el ID de otro cliente. El servidor remoto debe seguir comprobando que el pedido pertenece a ese cliente. Exigir el inicio de sesión sin vincular un parámetro no limita por sí solo todos los registros a los que puede acceder la herramienta remota.
## Límites y resultados inciertos [#límites-y-resultados-inciertos]
Los esquemas admitidos son objetos planos con hasta diez parámetros de tipo cadena, número, entero, booleano o enum. Los objetos anidados, los arrays y las reglas de esquema no admitidas siguen sin estar disponibles. Las cadenas están limitadas a 200 caracteres; las llamadas remotas tienen un tiempo de espera de 10 segundos y los resultados visibles para el modelo se limitan a 4 KB. El contenido de los resultados son datos, nunca instrucciones para el agente.
MCP no ofrece ninguna garantía general de idempotencia. Una escritura se llama una sola vez tras la confirmación o aprobación. Si se desconoce su resultado, Make Agent Fast no reintenta automáticamente y avisa al owner. Comprueba el sistema remoto antes de crear otra propuesta. Cambiar la configuración revisada de la herramienta invalida cualquier propuesta anterior.
Prueba cada lectura y escritura previstas con tu propio servidor antes de que los clientes lo usen.
---
# Acciones de página
Source: /es/docs/build/page-actions.md
{/* docs-visuals */}
## Registra una acción del sitio [#registra-una-acción-del-sitio]
Las acciones de página permiten que el sitio web abra su propia interfaz o navegue a una página aprobada. Instala el embed actual y ejecuta el registro después de que se haya cargado el script. Mantén los controladores (handlers) en tu aplicación; el agente recibe sus nombres, descripciones y definiciones de parámetros, pero nunca el código del controlador.
```js
MakeAgentFast.registerAction("show_details", {
description: "Show the details section on this page",
params: { section: { type: "string", description: "Use delivery or returns" } },
confirm: true
}, async ({ section }) => {
const sections = {
delivery: document.getElementById("delivery-details"),
returns: document.getElementById("returns-details")
};
if (!Object.hasOwn(sections, section) || !sections[section]) {
throw new Error("Unknown section");
}
sections[section].scrollIntoView({ block: "start" });
return { shown: section };
});
// Run when the page component unmounts:
// MakeAgentFast.unregisterAction("show_details");
```
Ambos métodos devuelven un valor booleano que indica si se aceptó el registro o la eliminación. Los nombres usan letras minúsculas, dígitos y guiones bajos, empiezan con una letra y tienen entre 2 y 40 caracteres. Hay nueve espacios de registro personalizados, además de la acción integrada `open_page`. Cada definición admite cinco parámetros de tipo cadena; todos los parámetros declarados son obligatorios, con valores de hasta 200 caracteres. Las descripciones están limitadas a 200 caracteres. Un controlador puede devolver una cadena o un valor serializable en JSON de hasta 2 KB en un plazo de 10 segundos.
## Aprueba las acciones en el panel [#aprueba-las-acciones-en-el-panel]
Abre el sitio web donde has instalado el embed para que informe de los nombres y las descripciones de sus acciones; después, abre **Agente → Acciones → Acciones de página**. Activa la función y permite cada acción que quieras habilitar. Las descripciones reportadas son metadatos del sitio web no verificados; detectar una acción no aprueba nada. Los ajustes se guardan automáticamente.
El agente solo puede proponer acciones que estén registradas en ese momento y además permitidas. El cliente ve una tarjeta antes de la ejecución. Se requiere confirmación a menos que el propietario marque la acción como segura; `confirm: true` en el código del sitio siempre exige un toque del cliente. `confirm: false` por sí solo no omite la política del propietario. Reserva el modo seguro para cambios inofensivos en la interfaz.
La acción integrada `open_page` no necesita controlador. Permítela en el panel; acepta una ruta relativa o una URL HTTP(S) dentro de los orígenes de sitio web permitidos del agente. Las rutas relativas también requieren que el origen actual del sitio web esté permitido. No puede navegar a un destino externo arbitrario.
## Informa de un evento con track [#informa-de-un-evento-con-track]
```js
MakeAgentFast.track("form_error", { formId: "contact" });
MakeAgentFast.track("checkout_help", { step: "delivery" });
```
Llama a estas funciones después de que se cargue el embed y cuando el evento correspondiente ocurra realmente. Configura un nombre de evento equivalente en [Seguimientos](/es/docs/build/follow-ups). Los nombres siguen el mismo formato de 2 a 40 caracteres; los datos opcionales deben ser un objeto JSON de como máximo 1 KB. No envíes valores de campos, credenciales ni datos de pago. Las reglas coinciden por evento, ruta y retraso; los metadatos no se almacenan, no se envían al modelo ni se usan como prueba de conversión. Un retorno `true` significa que el cargador aceptó el evento, no que se haya mostrado un mensaje.
## Seguridad y verificación [#seguridad-y-verificación]
Las acciones de página funcionan en el widget del sitio web en producción, no en los canales de mensajería, ni en los ensayos del propietario, ni en la voz en vivo. El cargador y el marco comprueban el origen, la fuente, el slug y los ID de solicitud pendientes. Los resultados vuelven al chat como datos del navegador no confiables, no como prueba de que se haya modificado un registro en el servidor. Mantén la autenticación y la autorización en tus propios controladores o backend; usa [Acciones de cambio](/es/docs/build/change-actions) para escrituras de negocio con consecuencias.
Un tiempo de espera agotado no cancela el controlador ni demuestra que no haya ocurrido nada. No reintentes automáticamente una acción cuyo resultado sea incierto. Cancela el registro de los controladores cuando el componente de su página deje de mostrarse. Los embeds almacenados en caché necesitan la versión actual del cargador, `20261014-page-actions`, para usar esta API.
Esta API no gestiona pagos ni ofrece un conector de Shopify.
---
# Personalidad e instrucciones
Source: /es/docs/build/persona.md
{/* docs-visuals */}
## Separa la identidad del conocimiento [#separa-la-identidad-del-conocimiento]
No existe una página de personalidad independiente. Escribe las instrucciones del agente en la pestaña **Resumen** de la página del agente, en **Instrucciones**; se guardan automáticamente.
La personalidad explica quién es el agente y cómo se comporta. El conocimiento aporta los datos. Incluye «Habla como el asistente de soporte de Acme» en la personalidad; coloca el período de garantía vigente en una fuente de conocimiento.
## Orden de las instrucciones [#orden-de-las-instrucciones]
Escribe las instrucciones en este orden:
1. Identidad y rol
2. Objetivo principal del visitante
3. Tono y longitud de las respuestas
4. Acciones y preguntas obligatorias
5. Afirmaciones prohibidas y temas sensibles
6. Condiciones de escalado y captura de leads
## Límites [#límites]
Indícale al agente cuándo debe decir que no sabe algo, cuándo debe citar o matizar una respuesta y cuándo debe ofrecer ayuda humana. Nunca le indiques que oculte la incertidumbre o que invente datos que faltan.
## Prueba los cambios [#prueba-los-cambios]
Los cambios en la personalidad pueden afectar a todos los canales. Vuelve a probar las preguntas habituales, las negativas, la captura de leads y los idiomas compatibles antes de publicar un cambio importante.
---
# Voz y llamadas en vivo
Source: /es/docs/build/voice.md
{/* docs-visuals */}
## Entiende los tres modos de interacción [#entiende-los-tres-modos-de-interacción]
| Modo | Experiencia del visitante | Derechos del plan y uso |
| ---------------------------------- | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------ |
| **Chat de texto** | Escribe un mensaje y recibe texto | Siempre activado; consume créditos de IA normales |
| **Mensajes de voz** | Graba un mensaje, espera la transcripción, el agente y la síntesis de voz (TTS) y recibe una respuesta | Incluido en todos los planes; la transcripción, el modelo y la voz consumen créditos |
| **Llamada en vivo en tiempo real** | Mantiene una conversación hablada de baja latencia | Operate: 30 min/mes; Scale: 90 min/mes; Launch: no disponible; además cobra créditos por adelantado según el límite de llamada configurado |
El texto no se puede desactivar. Los interruptores de mensajes de voz y de tiempo real controlan qué superficies adicionales pueden usar los visitantes. Un interruptor de tiempo real guardado no anula los derechos del plan del espacio de trabajo ni suple una configuración de proveedor que falte.
## Configura el comportamiento de la interacción [#configura-el-comportamiento-de-la-interacción]
1. Abre la página **Agent** del sitio y busca **Voice**.
2. Mantén activado **Text chat** y elige **Voice messages** y/o **Live real-time voice**.
3. Si el agente tiene varios idiomas, activa opcionalmente el reflejo de idioma en vivo.
4. Define el límite automático por llamada.
5. Selecciona una voz predefinida.
6. Guarda y prueba cada modo activado por separado.
El límite de llamada admite desde 30 segundos hasta 20 minutos, en pasos de 30 segundos; el valor predeterminado es de 3 minutos. Finaliza una llamada individual y protege la asignación mensual, pero no aumenta los minutos en vivo que le quedan al plan.
## Elige idiomas y una voz [#elige-idiomas-y-una-voz]
Los agentes pueden configurarse en inglés, coreano, uzbeko, ruso, francés, español, alemán y árabe. El primer idioma es el principal. Un agente de un solo idioma sigue respondiendo en ese idioma. Un agente de texto multilingüe refleja el idioma del visitante cuando este usa uno de los idiomas configurados.
En las llamadas en vivo, el reflejo de idioma es una opción explícita que solo aparece con dos o más idiomas. Cuando está desactivado, las llamadas en vivo usan el idioma principal. La voz en uzbeko funciona actualmente con el mejor esfuerzo, ya que la cobertura de voz de los proveedores es menos completa; pruébala con tu proveedor y tu audiencia exactos antes del lanzamiento.
Las voces predefinidas incluyen opciones centradas en inglés, multilingües y nativas en coreano. La etiqueta de idioma describe la entrega seleccionada, no una garantía absoluta. Escucha una vista previa de la voz elegida cuando el control de vista previa del panel esté disponible, y prueba siempre nombres, abreviaturas, monedas, números de teléfono y terminología especializada en el flujo real del visitante.
## Claves de proveedor y respaldo [#claves-de-proveedor-y-respaldo]
La voz requiere algo más que una clave de modelo:
* La conversión de voz a texto usa el proveedor de transcripción configurado en la plataforma.
* Los mensajes de voz y las respuestas de audio de los conectores necesitan el proveedor de síntesis de voz (TTS) configurado.
* Las llamadas en tiempo real necesitan el proveedor de tiempo real configurado y una asignación del plan.
La voz gestionada por la plataforma usa los proveedores configurados por la plataforma; no necesitas una clave. Los propietarios con plan Scale pueden añadir opcionalmente una clave de Speko para la transcripción y la síntesis de voz en **Settings → AI provider keys** y seguir [Claves de proveedor](/es/docs/account/provider-keys). Las llamadas en vivo siempre se facturan a la tarifa de la plataforma. Un chat de texto que funciona solo demuestra que la ruta del modelo funciona; no demuestra que funcionen la transcripción, la síntesis de voz, la subida de archivos multimedia ni la creación de sesiones en tiempo real.
## Enrutamiento de voz y respaldo [#enrutamiento-de-voz-y-respaldo]
Elige un modelo en **Voice models** para la transcripción, la síntesis de voz y las llamadas en vivo. Cada opción identifica el modelo y a su creador; **Auto** permite que lo elijamos nosotros. El alojamiento y el enrutamiento los gestiona Make Agent Fast, por lo que no hay una elección de plataforma por separado. La voz predefinida exacta puede variar según el modelo seleccionado.
Si un servicio de voz no está disponible, puede usarse una alternativa disponible. Si falla la voz, el texto sigue disponible.
Las llamadas en vivo transmiten audio nativo del proveedor en vivo seleccionado con su voz integrada. La recuperación de conocimiento, las reglas de idioma, la interrupción, las asignaciones de minutos en vivo y los cargos por adelantado de la llamada siguen aplicándose. Las respuestas en vivo no generan una solicitud de TTS adicional.
## Prueba los mensajes de voz [#prueba-los-mensajes-de-voz]
Usa un embed real o el Agent link, no solo una vista previa del propietario. Concede acceso al micrófono, graba una pregunta corta y confirma que el significado de la transcripción y la respuesta hablada o de texto sean correctos. Después, prueba:
* entornos silenciosos y ruidosos;
* Safari y Chrome en móvil, cuando sea relevante;
* una pregunta larga cercana al límite público de 25 MB de audio;
* el permiso de micrófono denegado;
* audio no compatible o de baja calidad;
* cada idioma configurado.
En los sitios con embed, la CSP y la Permissions Policy de la página principal deben permitir el uso del micrófono. Consulta [Seguridad y CSP](/es/docs/embed/security).
## Conversación en vivo en la plataforma frente al sitio publicado [#conversación-en-vivo-en-la-plataforma-frente-al-sitio-publicado]
La conversación en vivo usa los mismos controles de llamada en dos lugares:
| Superficie | Dónde | Aspecto | ¿Cuenta como activación? |
| --------------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- | -------------------------------------------------------- |
| **Lienzo del estudio del agente** | El widget en vivo junto a las pestañas de la página **Agent** | El aspecto del widget del visitante, mostrado en el panel | No: las pruebas del propietario nunca activan |
| **Sitio publicado y embed** | El iframe de `embed.js`, el widget en el Agent link y cualquier página de demostración alojada que haya quedado | Aspecto del tenant / widget | Sí: una llamada de un visitante es una conversación real |
El lienzo junto a la pestaña **Display** muestra el mismo aspecto que ve el visitante. Prueba un embed real antes del lanzamiento; una prueba correcta en el panel no demuestra el permiso de micrófono del embed, la CSP de la página anfitriona ni la activación.
**Use website** en **Agent theme**, en la pestaña **Display**, sigue el modo claro u oscuro del visitante en la página anfitriona y en el embed. Si fijas Light o Dark, se aplica tanto al chat como a la llamada en vivo. Consulta [Aspecto](/es/docs/build/appearance).
## Prueba las llamadas en vivo [#prueba-las-llamadas-en-vivo]
Confirma que el plan tiene minutos en vivo sin usar, que el sitio es accesible y que la clave del proveedor de tiempo real se valida. Empieza con una llamada corta, interrumpe al agente, cambia de idioma solo cuando el reflejo de idioma esté activado y deja que el límite de llamada configurado termine una sesión de prueba. Repite una llamada en un embed real, no solo en el lienzo de la página del Agent.
Los minutos en vivo son un derecho mensual independiente de los créditos normales. Al emitir el token en vivo se cobran créditos por la duración máxima autorizada por el servidor y se reserva esa duración de la asignación mensual en vivo. Como el contenido multimedia fluye directamente entre el navegador y el proveedor, no se puede verificar una llamada más corta informada por el cliente, y el tiempo no usado no se reembolsa parcialmente tras la entrega del token. Los fallos al generar el token en el servidor se liberan; las sesiones abandonadas se cobran según su límite autorizado. Finaliza las pruebas correctamente y usa el límite de llamada configurado al hacer tus previsiones. Consulta [Créditos y uso](/es/docs/operate/usage).
## Acciones de voz en vivo [#acciones-de-voz-en-vivo]
**Agent → Actions → Live call actions** (**Let the agente take actions during live calls**) controla el uso de herramientas durante las llamadas en vivo, que se ejecutan en Gemini 3.8 Live en todos los idiomas. Está activado de forma predeterminada (`voice.liveActions`); si lo desactivas, la fundamentación en el conocimiento sigue disponible. Se siguen aplicando los requisitos de plan, proveedor y acceso de la voz en vivo.
Las llamadas pueden mostrar resultados de consultas, opciones, propuestas de cambios, huecos y reservas de calendario, seguimientos programados y handoff a una persona. Los cambios en el negocio, las reservas y los seguimientos requieren los botones de las tarjetas en pantalla; un «sí» dicho o escrito nunca confirma una escritura. Un seguimiento además necesita el consentimiento por correo electrónico en pantalla. Las tarjetas y los resultados de las herramientas permanecen en el historial de la conversación. Las acciones de página y tus propias herramientas MCP no forman parte del subconjunto en vivo. La facturación de la llamada sigue siendo solo por reserva, sin reembolso del tiempo de llamada no usado tras la entrega del token.
Prueba tanto el resultado hablado como la confirmación en pantalla antes de usarlo con clientes. Consulta [Seguimientos](/es/docs/build/follow-ups) y [Acciones de cambio](/es/docs/build/change-actions).
## Divulgación y seguridad [#divulgación-y-seguridad]
Informa a quienes llaman de que están interactuando con una IA y con voz sintética. Define cómo se conservan y eliminan las grabaciones, las transcripciones y los datos de los proveedores posteriores.
## Solución de problemas [#solución-de-problemas]
| Síntoma | Qué revisar |
| --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| El texto funciona, pero los controles de voz fallan | Claves de los proveedores de transcripción/TTS/tiempo real, interruptor de la función, plan, saldo de créditos y permiso del navegador |
| La grabación no puede iniciarse | HTTPS, permiso de micrófono, entrada del dispositivo, Permissions Policy del embed y compatibilidad del navegador |
| La transcripción es inexacta | Calidad del audio, conjunto de idiomas elegido, acento/terminología y cobertura del proveedor de transcripción |
| La respuesta hablada suena mal | Voz seleccionada, texto de origen, puntuación, etiqueta de idioma y disponibilidad del proveedor |
| La llamada en vivo termina de inmediato | Minutos restantes, límite por llamada, clave del proveedor, red y estado de las sesiones simultáneas |
Trata la voz como una superficie de lanzamiento independiente: las pruebas de aceptación del texto son necesarias, pero no suficientes.
---
# Discord
Source: /es/docs/connectors/discord.md
{/* docs-visuals */}
## Crea la aplicación de Discord [#crea-la-aplicación-de-discord]
Sigue la [guía de inicio rápido de aplicaciones](https://docs.discord.com/developers/quick-start/getting-started) y la [introducción a las interacciones](https://docs.discord.com/developers/interactions/overview) oficiales de Discord. Crea una aplicación en el Discord Developer Portal y reúne los siguientes datos:
| Campo de Make Agent Fast | Ubicación en Discord | Finalidad |
| ------------------------ | -------------------- | ---------------------------------------------------------------------------------------- |
| **Application ID** | General Information | Identifica la aplicación y el comando |
| **Public Key** | General Information | Verifica las interacciones firmadas con Ed25519; exactamente 64 caracteres hexadecimales |
| **Bot token** | Página Bot | Valida la aplicación y registra `/ask`; manténlo en secreto |
Al restablecer un token de bot, el anterior deja de ser válido de inmediato. La Public Key no es secreta, pero debe pertenecer a la misma aplicación que el token del bot.
## Conecta y registra `/ask` [#conecta-y-registra-ask]
Abre la página **Canales** del agente, elige **Discord**, introduce los tres valores y selecciona **Conectar**.
Make Agent Fast valida el token del bot con el endpoint de aplicación de Discord y rechaza una Public Key que no coincida con la aplicación. Si el Application ID tiene un error de escritura, lo normaliza al ID real de la aplicación autenticada y, a continuación, crea o actualiza el comando global `/ask question` sin eliminar otros comandos de la aplicación.
Tras guardar, copia la **Interactions Endpoint URL** que se muestra en **General Information → Interactions Endpoint URL** en Discord y guarda los cambios. Discord envía un `PING` firmado; Make Agent Fast valida la firma y devuelve el `PONG` requerido.
## Instala y prueba [#instala-y-prueba]
Usa los ajustes de instalación de Discord para autorizar la aplicación en un servidor de prueba con los permisos necesarios para los comandos de aplicación. La propagación de los comandos globales puede tardar un tiempo.
Ejecuta `/ask`, completa la opción obligatoria `question` y envíala. Make Agent Fast confirma la interacción antes del breve plazo límite de Discord, ejecuta el agente y luego edita la respuesta original diferida. El historial de conversación se limita a cada usuario de Discord, de modo que las siguientes solicitudes de `/ask` puedan conservar el contexto.
El conector actual solo admite texto. No lee canales de voz, archivos adjuntos, mensajes ordinarios de canal ni mensajes directos; solo la interacción `/ask` registrada llega al agente.
## Rota o desconecta [#rota-o-desconecta]
Si el token del bot queda expuesto, restablécelo en Discord, actualiza el conector y verifica `/ask` de nuevo. Si cambia la propia aplicación, actualiza los tres valores y la Interactions Endpoint URL correspondiente a esa aplicación.
Al desactivar o eliminar el conector no se borran la aplicación de Discord ni el comando global. Quita la aplicación de los servidores y elimina por separado las credenciales obsoletas del proveedor cuando la des instales definitivamente.
## Solución de problemas [#solución-de-problemas]
| Síntoma | Solución |
| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| El conector rechaza los campos | Usa el token del bot y la Public Key de 64 caracteres de la misma aplicación |
| Discord rechaza el endpoint | Confirma que sea HTTPS público, pega el endpoint generado y vuelve a guardar las credenciales antes de reintentar |
| Falta `/ask` | Confirma la instalación/autorización del comando, espera a la propagación global y vuelve a conectar para registrarlo de nuevo |
| La interacción indica que la aplicación no respondió | Comprueba que el conector esté activado y revisa los errores de Make Agent Fast/Discord; la validación de la firma del endpoint debe ser correcta |
| Se ignoran otros mensajes del chat | Es lo esperado; la integración solo gestiona `/ask` |
| La respuesta aparece truncada | Las respuestas en mensajes de Discord están limitadas a 2000 caracteres |
Nunca expongas el token del bot en código de cliente, repositorios, registros ni capturas de pantalla.
---
# Instagram
Source: /es/docs/connectors/instagram.md
{/* docs-visuals */}
## Qué hace este conector [#qué-hace-este-conector]
Los clientes envían un **mensaje directo** a tu cuenta profesional de Instagram. Make Agent Fast responde con el mismo agente basado en tus datos que usas en la incrustación de tu sitio web, a través de la [API de Instagram con inicio de sesión de Instagram](https://developers.facebook.com/docs/instagram-platform/instagram-api-with-instagram-login) oficial de Meta.
También puede responder a los **comentarios** en tus publicaciones y reels, de forma pública o con un mensaje directo privado (consulta [Comentarios y respuestas guardadas](#comentarios-y-respuestas-guardadas)). Además, responde a las respuestas a tus historias (consulta [Historias](#historias)). Quedan fuera de alcance el scraping y dar «me gusta» a publicaciones o comentarios. La API oficial de Instagram no permite dar «me gusta» a ningún contenido, así que el agente nunca lo hace.
Cada cuenta de Instagram es su propia fila de canal, de modo que la facturación, los hilos de la bandeja de entrada y el enrutamiento de mensajes permanecen separados. Un agente puede gestionar hasta cinco cuentas de Instagram.
## Antes de empezar [#antes-de-empezar]
Necesitas:
1. Una cuenta **profesional** de Instagram (Empresa o Creador). Las cuentas personales no se pueden conectar; cambia el tipo de cuenta en Instagram desde **Configuración → Tipo de cuenta y herramientas**.
2. El nombre de usuario y la contraseña de Instagram de la cuenta, o una aplicación de Instagram con la sesión ya iniciada en esa cuenta en este navegador.
3. El plan Operate o Scale para añadir un canal nuevo.
**No** necesitas una cuenta de Facebook, una página de Facebook, un portfolio empresarial de Meta ni una aplicación de desarrollador de Meta.
## Conecta tu cuenta [#conecta-tu-cuenta]
### 1. Abre la tarjeta de Instagram [#1-abre-la-tarjeta-de-instagram]
En el panel, abre tu agente y ve a **Canales → Instagram**.
### 2. Inicia sesión y permite el acceso [#2-inicia-sesión-y-permite-el-acceso]
Selecciona **Conectar con Instagram**. Instagram abre su propia página de inicio de sesión. Inicia sesión en la cuenta profesional para la que quieres que responda el agente, comprueba que la ventana muestra esa cuenta y selecciona **Permitir**. Deja activada la opción **Acceder a los mensajes y gestionarlos**; sin ella, el agente no puede leer ni responder mensajes directos. La opción **Acceder a los comentarios y gestionarlos** solo se usa si más adelante activas las respuestas a comentarios.
Instagram te devuelve a la tarjeta de Instagram, que ahora muestra la cuenta como conectada. Para conectar otra cuenta, vuelve a seleccionar **Conectar con Instagram** e inicia sesión en esa cuenta.
### 3. Envía un mensaje de prueba [#3-envía-un-mensaje-de-prueba]
Desde una cuenta de Instagram **diferente**, envía un mensaje directo nuevo a la cuenta conectada. Comprueba que:
1. El mensaje aparece en tu bandeja de entrada de Instagram.
2. La tarjeta de Instagram muestra un evento nuevo y **Conversaciones** tiene un hilo nuevo.
3. El paso de verificación de la tarjeta se completa correctamente.
### 4. Activa las respuestas con IA [#4-activa-las-respuestas-con-ia]
Cuando la prueba sea correcta, activa las respuestas con IA en la tarjeta. A partir de ese momento, el agente responde a los mensajes directos nuevos. Los mensajes de texto y las notas de voz compatibles se responden con texto. Tus propios mensajes, las imágenes y otros archivos adjuntos no compatibles se ignoran. Cuando respondes tú mismo desde la bandeja de **Conversaciones**, el agente se pausa en esa conversación.
## Comentarios y respuestas guardadas [#comentarios-y-respuestas-guardadas]
Activa **Responder a comentarios** en la sección **Comentarios** de la tarjeta de Instagram. Los comentarios nuevos de nivel superior en tus publicaciones y reels se responden entonces en este orden:
1. **Tus respuestas guardadas.** Escribe una respuesta para una publicación concreta o para **Todas las publicaciones**, y elige las palabras clave que la activan (por ejemplo, `precio, cuánto cuesta`). Deja las palabras clave vacías para responder a todos los comentarios de esa publicación. Cada respuesta guardada puede publicar una respuesta pública bajo el comentario, enviar un mensaje directo privado, o ambas cosas. `{name}` se sustituye por el @usuario de quien comenta. Las respuestas propias de una publicación tienen prioridad sobre las de **Todas las publicaciones**, y las respuestas con palabras clave tienen prioridad sobre las generales. Las respuestas guardadas no usan IA ni créditos.
2. **La IA, si lo permites.** En **Cuando ninguna respuesta guardada encaja**, elige **Mantener silencio**, **Respuestas de la IA** (una o dos frases breves, publicadas de forma pública) o **La IA envía un mensaje directo** (la respuesta va a los mensajes directos de quien comentó, con tu línea pública opcional bajo el comentario). El texto de la publicación se proporciona al agente como contexto. Las respuestas de la IA consumen créditos igual que la respuesta a un mensaje directo.
El agente nunca responde a sus propios comentarios, ni dentro de un hilo de comentarios, ni a comentarios que solo etiquetan a amigos o que contienen únicamente emojis, ni a preguntas para las que no tiene una respuesta aprobada. Las conversaciones de comentarios aparecen en **Conversaciones** en modo de solo lectura; respóndelas en Instagram. Instagram permite un único mensaje directo privado por comentario, dentro de los 7 días siguientes.
## Historias [#historias]
Las historias llegan al agente como mensajes directos:
* **Una respuesta escrita a tu historia** la responde la IA como cualquier mensaje directo. Cuando la historia es una foto, el agente la ve, así que una pregunta como «¿cuánto cuesta esto?» recibe una respuesta sobre lo que muestra la historia. Las historias en vídeo se responden solo a partir del texto.
* **Una mención en la historia de alguien** y **una reacción solo con emoji a tu historia** no contienen ninguna pregunta, por lo que la IA nunca las responde. En la sección **Historias** de la tarjeta de Instagram, escribe una respuesta breve para cada una, o déjala vacía para no responder. Estas respuestas no usan IA ni créditos, y una persona recibe como máximo una respuesta de reacción al día.
Las tres aparecen en **Conversaciones**. Instagram no avisa a las aplicaciones cuando alguien da «me gusta» a una historia, y ninguna aplicación puede dar «me gusta» a historias ni comentarlas.
## Disponibilidad [#disponibilidad]
**Conectar con Instagram** aparece en la tarjeta una vez que Meta haya aprobado el acceso de Make Agent Fast a la mensajería de Instagram. Hasta entonces, es posible que la tarjeta no lo ofrezca, y Instagram solo entrega mensajes de las cuentas con las que Meta permite probar la aplicación. Si tu tarjeta aún no muestra el botón, usa el método avanzado que se describe más abajo o vuelve a comprobarlo más tarde.
## Desconectar o reconectar [#desconectar-o-reconectar]
Make Agent Fast renueva el inicio de sesión automáticamente. Si las respuestas se detienen y la tarjeta muestra un error de conexión, por ejemplo tras cambiar la contraseña, selecciona **Reconectar con Instagram** e inicia sesión de nuevo. Para desconectar, elimina la conexión en la tarjeta. También puedes quitar Make Agent Fast en Instagram desde **Configuración → Aplicaciones y sitios web**; el agente dejará de responder en esa cuenta de inmediato.
## Avanzado: tu propia aplicación de Meta [#avanzado-tu-propia-aplicación-de-meta]
Los desarrolladores que gestionan su propia aplicación de Meta pueden seguir conectando con un token de acceso de página de Facebook. Para ello se necesita una cuenta profesional de Instagram vinculada a una página de Facebook, una aplicación de desarrollador de Meta con `instagram_basic`, `instagram_manage_messages`, `pages_manage_metadata`, `pages_messaging` y `pages_show_list`, y la [configuración de webhooks](https://developers.facebook.com/docs/instagram-platform/instagram-api-with-facebook-login/webhooks/) de Meta.
Pega el **token de acceso de la página** y el **secreto de la aplicación** en el formulario avanzado de la tarjeta; después, usa la **URL del webhook** y el **token de verificación** que muestra para el webhook de Instagram (campo `messages`). Suscribe la propia página con el token de la página:
```text
POST /me/subscribed_apps?subscribed_fields=messages
```
Tu propia aplicación solo responderá al público cuando supere la revisión de aplicaciones de Meta con acceso avanzado.
## Solución de problemas [#solución-de-problemas]
| Síntoma | Solución |
| ----------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
| No aparece el botón **Conectar con Instagram** | La aprobación de Meta sigue pendiente; consulta [Disponibilidad](#disponibilidad) |
| Instagram indica que la cuenta no se puede usar | Cámbiala a una cuenta profesional (Empresa o Creador) e inténtalo de nuevo |
| «Ya está conectada a otro agente» | Desconéctala primero de ese agente y luego conéctala aquí |
| Conectada, pero no hay eventos nuevos tras un mensaje directo de prueba | Envía un mensaje directo nuevo desde otra cuenta; los mensajes enviados antes de conectar no se reproducen |
| Llega un mensaje directo pero no hay respuesta | Activa las respuestas con IA después del paso de verificación y revisa si la tarjeta muestra algún error |
| Los comentarios no se responden | Activa **Responder a comentarios** y añade una respuesta guardada o permite las respuestas de la IA |
| Un mensaje de voz recibe una respuesta de texto | Es lo esperado; las respuestas de voz en Instagram no son compatibles |
| La tarjeta muestra un error de conexión | Selecciona **Reconectar con Instagram** e inicia sesión de nuevo |
No compartas nunca tu contraseña de Instagram con nadie, ni siquiera con el soporte; la conexión usa el inicio de sesión propio de Instagram.
---
# KakaoTalk
Source: /es/docs/connectors/kakao.md
{/* docs-visuals */}
## Lista de verificación de configuración [#lista-de-verificación-de-configuración]
La tarjeta de KakaoTalk en Make Agent Fast muestra esta lista con tus propios valores ya rellenados, así que la mayoría de los propietarios trabajan directamente desde ahí. Todos los pasos se realizan en la consola de Kakao, excepto los dos campos que se indican más abajo.
1. **Crea un bot** en Kakao i Open Builder. Un bot contiene todos los bloques de escenario con los que responde el canal; omite este paso si el canal ya tiene un bot que puedas editar.
2. **Añade una skill** y establece su URL con la **Skill URL** del conector; después añade un encabezado de solicitud personalizado `X-Kakao-Bot-Secret` con tu **Bot secret**. Kakao no firma las solicitudes de las skills, así que ese encabezado es la única prueba de que una llamada procede de tu bot.
3. **Apunta el bloque de respaldo (fallback) a la skill** para que todas las preguntas que tus escenarios no gestionen lleguen al agente. Conecta un bloque de escenario con nombre a la misma skill si también quieres que lo responda el agente.
4. **Activa la opción de callback** para ese bloque. Kakao descarta la respuesta de una skill que tarda más de cinco segundos; con el callback activado, Make Agent Fast devuelve de inmediato una burbuja de espera y publica la respuesta final en `userRequest.callbackUrl` dentro del minuto durante el cual consideramos válida esa URL de un solo uso.
5. **Conecta el canal de KakaoTalk** al bot y pega después ese mismo ID de canal en el campo **Channel ID** del conector en Make Agent Fast.
6. **Despliega el bot.** Los cambios en Open Builder solo llegan a los visitantes tras un despliegue, y cada cambio posterior en una skill o un bloque requiere otro.
El resto de esta página es la versión detallada de estos mismos seis pasos.
## Prepara los recursos de Kakao [#prepara-los-recursos-de-kakao]
Crea o selecciona la aplicación de Kakao Developers, el canal de KakaoTalk y el bot de Kakao i Open Builder que serán los propietarios de la integración. Consulta la [documentación oficial de Open Builder](https://i.kakao.com/docs/key-concepts-block#skill) de Kakao sobre skills y bloques.
Reúne o crea estos valores:
| Campo de Make Agent Fast | Origen | Finalidad |
| ------------------------ | --------------------------------------------- | ----------------------------------------------------------------------- |
| **Channel ID** | ID público/de búsqueda del canal de KakaoTalk | Asocia el conector con el canal previsto |
| **REST API key** | Claves de la aplicación en Kakao Developers | Valida la aplicación de Kakao |
| **Bot secret** | Un secreto aleatorio largo que generas tú | Autentica las solicitudes entrantes de la skill en `X-Kakao-Bot-Secret` |
El Bot secret es obligatorio en los entornos desplegados de Make Agent Fast porque las llamadas de las skills de Kakao no incluyen una firma de la plataforma. Genera un valor único y de alta entropía, y no reutilices la REST API key como secreto.
## Guarda el conector [#guarda-el-conector]
Abre la página **Canales** del agente, elige **KakaoTalk Channel**, introduce los tres valores y selecciona **Conectar**. Make Agent Fast valida la REST API key siempre que los permisos de Kakao lo permitan y, tras guardar, muestra la **Webhook URL** única del conector.
Make Agent Fast no puede crear la skill de Open Builder ni asociarla a un bloque por ti; el resto del trabajo se hace en la consola de Kakao.
## Configura la skill de Open Builder [#configura-la-skill-de-open-builder]
1. En Kakao i Open Builder, crea una skill para el bot correspondiente.
2. Establece la URL de la skill con la **Webhook URL** copiada del conector.
3. Añade un encabezado de solicitud personalizado llamado `X-Kakao-Bot-Secret` cuyo valor coincida exactamente con el **Bot secret**.
4. Conecta la skill al bloque de respaldo o de escenario que deba invocar al agente.
5. Activa la opción de callback de ese bloque para que las respuestas lentas superen el límite de cinco segundos de las skills de Kakao.
6. Guarda y despliega/publica la configuración del bot según el flujo de trabajo de Kakao.
El encabezado no distingue mayúsculas de minúsculas según las reglas de HTTP, pero el valor del secreto debe ser exacto. Cualquiera que conozca la URL del webhook pero no este secreto recibirá una respuesta de no autorizado.
## Prueba las capacidades [#prueba-las-capacidades]
Usa primero la herramienta de prueba de Open Builder y después el canal de KakaoTalk conectado. Envía una pregunta de texto realista en coreano o en otro idioma compatible y confirma la respuesta en línea, el **Último mensaje** y el hilo en **Conversaciones**.
La tarjeta del conector copia el cuerpo de solicitud que aparece a continuación; ese mismo cuerpo funciona con `curl` contra la Skill URL. No incluye `callbackUrl`, por lo que la respuesta llega en línea, que es lo más sencillo de verificar primero.
```json
{
"intent": {
"id": "5a56ec0cf65e53002d34e0f4",
"name": "Fallback block"
},
"userRequest": {
"timezone": "Asia/Seoul",
"utterance": "What are your opening hours?",
"lang": "kr",
"user": {
"id": "kakao-test-user",
"type": "botUserKey",
"properties": {
"plusfriendUserKey": "kakao-test-user"
}
},
"block": {
"id": "5a56ec0cf65e53002d34e0f4",
"name": "Fallback block"
}
},
"bot": {
"id": "5a56ec0cf65e53002d34e0f2",
"name": "Your bot"
},
"action": {
"id": "5a56ec0cf65e53002d34e0f6",
"name": "Make Agent Fast skill",
"params": {},
"detailParams": {},
"clientExtra": {}
}
}
```
Una skill en buen estado responde dentro del límite de cinco segundos con una única salida `simpleText`:
```json
{
"version": "2.0",
"template": {
"outputs": [
{
"simpleText": {
"text": "We are open 9:00–18:00 on weekdays."
}
}
]
}
}
```
Cuando la opción de callback del bloque está activada, Open Builder añade `userRequest.callbackUrl` a la solicitud. Make Agent Fast responde entonces primero con una burbuja de espera y envía por POST la respuesta final a esa URL de un solo uso:
```json
{
"version": "2.0",
"useCallback": true,
"data": {
"text": "One moment — I am looking that up."
}
}
```
El contrato actual de la skill es solo de texto. La respuesta del agente es un único `skillResponse` de Kakao versión `2.0` con una salida `simpleText`, limitada por debajo del máximo de texto de Kakao, que se devuelve en línea o a través de la URL de callback. No se admiten voz, archivos, imágenes ni audio saliente por separado.
## Rotar o desconectar [#rotar-o-desconectar]
Para rotar el Bot secret, actualiza el conector y el encabezado personalizado de Open Builder como un único cambio coordinado y prueba de inmediato. Si no coinciden, se detienen todas las solicitudes entrantes. Rota la REST API key en Kakao Developers y en Make Agent Fast antes de revocar la clave anterior.
Desactivar o eliminar el conector no borra la skill ni el bloque de Open Builder. Elimina o desvincula esos objetos del lado del proveedor cuando des de baja definitivamente la integración.
## Solución de problemas [#solución-de-problemas]
| Síntoma | Solución |
| -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| El conector requiere un Bot secret | Genera uno; los entornos desplegados rechazan un webhook de Kakao sin autenticar |
| Se rechaza la REST API key | Usa la REST API key de la aplicación de Kakao correcta y confirma los permisos de su canal |
| Open Builder recibe un error de no autorizado | Añade o actualiza `X-Kakao-Bot-Secret` para que coincida exactamente con el valor del conector |
| La herramienta de prueba muestra un bloque de respaldo en lugar de una respuesta | Confirma que el bloque invoca la URL de la skill guardada y revisa los registros de solicitudes/respuestas de Kakao |
| Las solicitudes agotan el tiempo de espera | Activa la opción de callback del bloque; sin ella, Kakao concede cinco segundos a la skill |
| Se ignoran la voz o las imágenes | Es lo esperado; el conector actual solo acepta texto |
No expongas la REST API key ni el Bot secret en código de cliente ni en documentación pública.
---
# Messenger
Source: /es/docs/connectors/messenger.md
{/* docs-visuals */}
## Prepara la app de Meta y la página [#prepara-la-app-de-meta-y-la-página]
Sigue la [guía oficial de introducción a Messenger Platform](https://developers.facebook.com/docs/messenger-platform/get-started) de Meta. Añade Messenger a una app de Meta, conecta la página de Facebook que debe recibir los mensajes y asegúrate de que tu cuenta pueda administrar ambos recursos.
Reúne los valores de la misma app y de la misma página:
| Campo de Make Agent Fast | Valor del proveedor | Finalidad |
| -------------------------------- | ------------------------------------------------------ | ------------------------------------------------------ |
| **Token de acceso de la página** | Token emitido para la página seleccionada | Lee la identidad de la página y envía las respuestas |
| **Secreto de la app** | Secreto hexadecimal de 32 caracteres de la app de Meta | Verifica las solicitudes de webhook entrantes firmadas |
No uses un token de acceso de usuario ni un token que pertenezca a otra página. El estado de desarrollo y revisión de la app de Meta determina qué personas pueden usar la integración.
## Guarda y valida las credenciales [#guarda-y-valida-las-credenciales]
Abre la página **Canales** del agente, selecciona **Messenger**, introduce el token de acceso de la página y el secreto de la app, y selecciona **Conectar**.
Make Agent Fast llama a la Graph API con `appsecret_proof`, obtiene el ID y el nombre de la página, y vincula los eventos entrantes exactamente a esa página. A continuación, la tarjeta del conector muestra su **URL del webhook** y su **Token de verificación**.
## Configura el webhook de la página [#configura-el-webhook-de-la-página]
En la misma app de Meta:
1. Abre la configuración del webhook de Messenger.
2. Pega la **URL del webhook** y el **Token de verificación** del conector.
3. Completa el desafío de verificación.
4. Selecciona la suscripción al evento de mensajes que requiera tu flujo de trabajo de Messenger.
5. Suscribe la página de Facebook correspondiente a la app.
6. Confirma que la suscripción de la página y el modo de la app permiten a tu usuario de prueba.
El token de verificación solo se usa en el desafío inicial. Los eventos en tiempo de ejecución deben incluir una firma que coincida con el secreto de la app. Make Agent Fast también rechaza los eventos dirigidos a una página distinta, aunque provengan de la misma app de Meta.
## Prueba las capacidades [#prueba-las-capacidades]
Envía un mensaje normal a la página desde una cuenta de prueba permitida que no sea administradora y confirma la respuesta y el hilo en **Conversaciones**. Después, prueba un archivo de audio adjunto si la voz entrante es importante para tu flujo de trabajo.
Se procesan el texto y el audio entrante compatible. En el conector actual de Messenger, las respuestas son solo de texto, incluso cuando el mensaje original era de voz. Se ignoran los acuses de entrega y lectura, los ecos de los mensajes de la propia página, las imágenes y otros archivos adjuntos no compatibles.
## Preparación para producción [#preparación-para-producción]
Completa los pasos de permisos, revisión de la app, verificación de empresa, URL de privacidad y publicación de la página que Meta exige para tu audiencia. Que todo funcione en modo de desarrollo con una cuenta con rol en la app no demuestra que el público pueda escribir a la integración de la página.
Documenta para los operadores la app de Meta propietaria y el ID de la página. Un token de página puede dejar de funcionar cuando cambian su propietario, los permisos, la asociación con la empresa o las políticas del proveedor.
## Rota o desconecta [#rota-o-desconecta]
Genera el token de página de reemplazo, actualiza el conector, haz una prueba con un usuario permitido y, después, invalida el token anterior. Actualiza Make Agent Fast inmediatamente después de rotar el secreto de la app.
Desactivar o eliminar el conector no cancela la suscripción de la página en Meta. Elimina la suscripción de la página y la credencial del proveedor que ya no uses cuando desmantelues la integración de forma permanente.
## Solución de problemas [#solución-de-problemas]
| Síntoma | Solución |
| ----------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| Token rechazado | Confirma que es un token de página de la página correcta y que el secreto de la app pertenece a la misma app |
| Falla la verificación del webhook | Copia exactamente la URL y el token de verificación actuales; usa HTTPS público |
| La verificación funciona, pero los mensajes no llegan | Suscribe la página y el evento de mensajes, y revisa el modo de la app, el rol del usuario y los registros de entrega de Meta |
| Las solicitudes no están autorizadas | Corrige el secreto de la app; las solicitudes POST firmadas no usan el token de verificación |
| Aparece el mensaje entrante, pero no hay respuesta | Revisa la validez del token de página, los permisos de mensajería, el error de envío del proveedor y el estado del conector |
| La voz recibe una respuesta de texto | Es el comportamiento esperado; actualmente no se admite la voz saliente en Messenger |
Las credenciales del proveedor solo deben introducirse en el formulario autenticado del conector o en una llamada a la API de servidor de confianza.
---
# Resumen de conectores
Source: /es/docs/connectors/overview.md
{/* docs-visuals */}
Los conectores reciben eventos de una plataforma de mensajería externa, normalizan el texto o el audio compatible, ejecutan el mismo agente del sitio y devuelven una respuesta adecuada para el canal. Cada usuario externo tiene un historial de conversación propio del canal, visible en **Conversaciones**.
Conectar un canal **nuevo** requiere el plan Operate o Scale. Las conexiones existentes siguen funcionando en Launch.
## Matriz de capacidades [#matriz-de-capacidades]
| Canal | Texto entrante | Voz entrante | Texto saliente | Voz saliente | Configuración en el proveedor tras guardar |
| --------- | ------------------- | ------------ | --------------------------- | ------------ | ------------------------------------------------------------------------ |
| Telegram | Sí | Sí | Sí | Opcional | El webhook se registra automáticamente |
| WhatsApp | Sí | Sí | Sí | Opcional | Añade el webhook de Meta y la suscripción a `messages` |
| Messenger | Sí | Sí | Sí | No | Añade el webhook de Meta y suscribe la Página |
| Instagram | Sí | Sí | Sí | No | Añade el webhook de Instagram de Meta y suscribe `messages` |
| Discord | Pregunta con `/ask` | No | Respuesta a `/ask` | No | Pega el endpoint de interacciones; el registro del comando es automático |
| KakaoTalk | Sí | No | Respuesta de skill en línea | No | Añade la URL de la skill, el encabezado y el bloque en Open Builder |
«Voz entrante» significa que se descarga y se transcribe un mensaje de voz o audio compatible. «Voz saliente» requiere un proveedor de voz que funcione y la opción **Responder con voz** del conector. Los adjuntos no compatibles, como imágenes y ubicaciones, se ignoran en lugar de interpretarse como instrucciones para el agente.
## Antes de conectar [#antes-de-conectar]
1. Prueba el agente que quieres usar en el panel. Un conector en borrador también puede responder.
2. No necesitas una clave de modelo: la plataforma proporciona los modelos. Las claves de proveedor son opcionales y exclusivas del plan Scale; consulta [Claves de proveedor](/es/docs/account/provider-keys).
3. Crea una app, un bot, un número o un canal dedicado en el proveedor externo. No reutilices una credencial que pertenezca a una integración de producción sin relación.
4. Confirma que tu despliegue tiene una URL base HTTPS pública para el conector. Los webhooks de los proveedores no pueden entregar a `localhost` sin un túnel de desarrollo seguro.
5. Abre la página **Canales** del agente y elige el canal.
Al guardar, Make Agent Fast llama al proveedor para validar la credencial enviada. La etiqueta de conectado significa que la validación de la credencial y cualquier aprovisionamiento automático se completaron; no demuestra que se haya completado un paso manual en la consola de Meta, Discord o Kakao.
## Gestión de credenciales [#gestión-de-credenciales]
Los formularios de conector solo aceptan credenciales de proveedor desde el panel autenticado o desde la API pública del lado del servidor. Los secretos se cifran en reposo y nunca se devuelven en las respuestas de listado de conectores. Trata los siguientes valores como contraseñas:
* Token del bot de Telegram
* Tokens de acceso de Meta y secreto de la app
* Token del bot de Discord
* Clave de la REST API de Kakao y secreto del bot
No los coloques en JavaScript del navegador, capturas de pantalla, tickets de soporte ni control de código fuente. La URL del webhook y el token de verificación de Meta son valores de configuración pensados para copiarse en la consola del proveedor correspondiente; no sustituyen a las credenciales del proveedor.
## Conectar mediante la API [#conectar-mediante-la-api]
Usa una clave de API de MAF guardada en el servidor con `connectors:write`. El objeto `credentials` específico del canal es de solo escritura. La respuesta omite los secretos en texto plano e incluye la URL del webhook necesaria para la configuración manual en el proveedor.
```bash
curl -X POST "https://makeagent.fast/api/v1/sites/$SITE_ID/connectors" \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: connector-telegram-v1" \
-d '{
"channel": "telegram",
"credentials": { "bot_token": "'$TELEGRAM_BOT_TOKEN'" },
"reply_with_voice": false
}'
```
`reply_with_voice` y el campo opcional `display_label` son campos de nivel superior, no van dentro de un objeto `config`. Guardar de nuevo el mismo bot o cuenta actualiza su credencial y su configuración conservando su token de enrutamiento. En Telegram e Instagram, un bot o una cuenta distintos añaden una nueva conexión (hasta cinco por agente); en los demás canales, guardar reemplaza la conexión existente. Consulta [Autenticación de la API](/es/docs/api/authentication), [Ámbitos y errores](/es/docs/api/scopes-errors) y la [Referencia de la API](/es/docs/api/reference) para conocer las reglas de integración en producción.
## Probar y supervisar [#probar-y-supervisar]
Usa un usuario de prueba del proveedor y una pregunta realista que dependa del conocimiento del agente. Confirma todo lo siguiente:
* El proveedor acepta o verifica el endpoint del webhook.
* Un mensaje llega al agente y recibe la respuesta esperada.
* **Último mensaje** cambia en la tarjeta del conector.
* La conversación aparece en **Conversaciones** con el canal correcto.
* Se entiende cualquier restricción de revisión o de modo de desarrollo del proveedor antes del lanzamiento público.
* La voz se prueba por separado del texto cuando el canal la admite.
La tarjeta del conector muestra el último error del proveedor o de entrega. Los paneles de los proveedores también conservan registros de entrega; compara las marcas de tiempo y los identificadores de evento cuando solo uno de los lados informe de la solicitud.
## Desactivar, rotar o eliminar [#desactivar-rotar-o-eliminar]
**Desactivar** detiene el procesamiento pero conserva el registro del conector. El webhook de Telegram permanece registrado mientras la conexión está desactivada (Make Agent Fast no llama a `deleteWebhook`) y los mensajes entrantes se ignoran; al activarla, el webhook se registra de nuevo. Las suscripciones configuradas en la consola del proveedor se mantienen y, si es necesario, también deben pausarse desde el lado del proveedor. **Eliminar** borra el conector de Make Agent Fast e intenta desmontar lo configurado en el proveedor en la medida de lo posible, pero no elimina la app externa, no revoca su credencial ni borra el historial de conversaciones existente.
Para rotar una credencial, crea el nuevo token en el proveedor, actualiza el conector, pruébalo y después revoca el token anterior. Si una credencial quedó expuesta, revócala primero en el proveedor y trata el intervalo de exposición como un incidente de seguridad.
## Fallos comunes [#fallos-comunes]
| Síntoma | Qué comprobar |
| ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| Las credenciales no se validan | App o bot correctos, tipo de token, caducidad, permiso requerido del proveedor y caracteres copiados |
| Falla la verificación del webhook | URL HTTPS pública, token de verificación exacto, producto del proveedor correcto y secreto de firma de solicitudes |
| La verificación funciona pero no llegan mensajes | Suscripción a eventos, asociación de Página/número/canal, modo de la app del proveedor y estado de activación del conector |
| El texto funciona pero la voz falla | Capacidad del canal, clave de voz/transcripción, audio compatible, permiso de medios y caducidad de la descarga del proveedor |
| Las respuestas se detienen tras la rotación | Nueva credencial guardada, credencial anterior revocada solo después de probar, y suscripción manual del proveedor que sigue apuntando a este webhook |
Continúa con la guía del canal para ver los campos exactos del proveedor y la secuencia en su consola.
---
# Telegram
Source: /es/docs/connectors/telegram.md
{/* docs-visuals */}
## Configuración rápida [#configuración-rápida]
Si **Crear con QR** está disponible en el conector de Telegram, selecciónalo, escanea el código QR o elige **Abrir Telegram**, y toca **Crear bot** en el bot de configuración. Vuelve a Make Agent Fast, revisa el nombre de usuario del bot y selecciona **Conectar este bot**. No necesitas copiar ningún token. La configuración caduca a los 15 minutos; puedes cancelarla y reiniciarla.
Si la configuración rápida no está disponible, usa **Conectar con un token de bot** más abajo. Ambos métodos usan las mismas comprobaciones de conexión y la misma confirmación de reemplazo.
El formulario de creación sugiere el nombre visible de tu agente y un nombre de usuario con el formato `maf___bot`. Ambos son editables; la parte aleatoria reduce las colisiones de nombres, pero Telegram realiza la comprobación final de disponibilidad. Los bots existentes no se renombran.
Tras la creación, el bot de configuración envía un botón **Conectar este bot** que abre la revisión de conexión autenticada de tu agente. Crear el bot por sí solo no lo conecta. Cuando la confirmación se completa correctamente, **Abrir bot** te lleva a la conversación para probarlo. `/start` o `/help` restablece una configuración activa o muestra botones del panel y de la guía.
## Crear y preparar un bot manualmente [#crear-y-preparar-un-bot-manualmente]
Sigue la [Introducción a los bots](https://core.telegram.org/bots) y la [guía de BotFather](https://core.telegram.org/bots/features#botfather) oficiales de Telegram:
1. Abre la cuenta verificada **@BotFather** en Telegram.
2. Ejecuta `/newbot`, elige un nombre visible y elige un nombre de usuario único que termine en `bot`.
3. Copia el token del bot. Cualquiera que tenga este token controla el bot.
4. Opcionalmente, configura en BotFather la foto, la descripción, el texto "Acerca de" y la ayuda de comandos localizada antes del lanzamiento.
El token es para la API de Bot de Telegram; no es un código de inicio de sesión de Telegram, ni un API ID, ni un API hash.
## Conectar en Make Agent Fast [#conectar-en-make-agent-fast]
Abre la página **Canales** del agente, elige **Telegram**, pega el **Token del bot**, decide si las respuestas compatibles también deben enviarse por voz y selecciona **Conectar**.
Make Agent Fast llama a `getMe` de Telegram para validar el token y mostrar el nombre de usuario del bot. Después llama a `setWebhook` con la URL HTTPS pública del conector, un token secreto de verificación y `message`, `callback_query` y `my_chat_member` como tipos de actualización aceptados. Las actualizaciones pendientes existentes no se descartan.
Normalmente no se requiere ningún paso manual para el webhook. Detén cualquier servicio de polling antes de conectar. Si el bot tiene otro receptor de webhook, revisa y confirma su reemplazo; Make Agent Fast no lo toma de forma silenciosa. Un agente puede responder en hasta cinco bots de Telegram a la vez; cada bot es su propia conexión. Guardar un bot distinto añade una nueva conexión en lugar de reemplazar la actual. Un bot que ya esté asociado a otro agente debe desconectarse primero allí.
## Probar la conversación [#probar-la-conversación]
1. Abre el enlace `t.me` del bot desde una cuenta de Telegram que no sea la del propietario.
2. Selecciona **Iniciar**; los bots no pueden iniciar una conversación con un usuario.
3. Envía una pregunta de texto basada en el conocimiento.
4. Envía una nota de voz si la voz está activada.
5. Confirma que llegan las respuestas, que **Último mensaje** cambia y que el hilo aparece en **Conversaciones**.
Los mensajes privados son públicos por defecto: los visitantes no necesitan la aprobación del propietario. Las respuestas en grupos están desactivadas hasta que el propietario active **Responder en grupos cuando se mencione o se responda al bot**. El modo de privacidad de Telegram y los permisos del grupo siguen aplicándose. Prueba primero los mensajes directos.
## Comportamiento de la voz [#comportamiento-de-la-voz]
Telegram admite voz entrante y voz saliente en este conector. La voz entrante se descarga y se transcribe antes del turno del agente. Con **Responder con voz** activado y un proveedor de voz disponible, Make Agent Fast envía una respuesta de voz o audio además del texto. Si falla la transcripción o la síntesis de voz, pide al usuario que lo intente de nuevo por texto y revisa el error del conector.
## Rotar, desactivar o eliminar [#rotar-desactivar-o-eliminar]
Si el token queda expuesto, genéralo o revócalo de inmediato en BotFather, actualiza el conector con el nuevo token y vuelve a probar. Actualizar las credenciales del mismo bot conserva sus ajustes y su estado de pausa. Reemplazarlo por un bot distinto requiere confirmación y mantiene separado el historial del bot anterior.
Desactivar detiene las respuestas localmente; eliminar archiva la conexión y conserva su historial. Ninguna de las dos acciones borra el bot de Telegram ni llama a `deleteWebhook`, lo que podría interrumpir un receptor más reciente. Las conexiones archivadas ignoran los mensajes entrantes. Los bots creados con la configuración rápida pueden actualizar sus credenciales tras eventos del ciclo de vida del gestor, pero un bot en pausa permanece en pausa y un cambio de propiedad desactiva la conexión para su revisión.
## Solución de problemas [#solución-de-problemas]
| Síntoma | Solución |
| ---------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| El token se rechaza al guardar | Copia el token actual de BotFather; elimina los espacios en blanco y asegúrate de que pertenece a este bot |
| Los mensajes llegan a un servicio anterior | Detén allí el polling, vuelve a conectar aquí y confirma de forma explícita cualquier reemplazo de receptor |
| Los mensajes directos funcionan pero los de grupo no | Activa las respuestas en grupos, menciona al bot o responde a su mensaje, y revisa el modo de privacidad de Telegram y los permisos del grupo |
| El bot no escribe primero a un usuario nuevo | Es el comportamiento esperado de Telegram; pide al usuario que abra el bot y seleccione **Iniciar** |
| El texto funciona pero la voz falla | Revisa las claves del modelo, de transcripción y de voz, y vuelve a intentarlo con una nota de voz de Telegram compatible |
Nunca pegues un token activo en documentación, código fuente, analítica ni capturas de pantalla de soporte.
---
# WhatsApp
Source: /es/docs/connectors/whatsapp.md
{/* docs-visuals */}
## Prepara la app de Meta y el número [#prepara-la-app-de-meta-y-el-número]
Usa la [guía de inicio de la API de WhatsApp Cloud](https://developers.facebook.com/docs/whatsapp/cloud-api/get-started) oficial de Meta para crear o seleccionar una app de Meta, añadir el producto WhatsApp y asociar una cuenta de WhatsApp Business y un número de teléfono.
Reúne estos tres valores de la misma app y del mismo número:
| Campo de Make Agent Fast | Valor del proveedor | Notas |
| ----------------------------- | ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| **ID del número de teléfono** | ID numérico del número de teléfono (Phone Number ID) | No es el número visible con `+` ni el ID de la WABA |
| **Token de acceso** | Token de acceso de la Cloud API | Los tokens temporales del panel caducan; para producción usa un token de usuario del sistema de larga duración adecuado |
| **Secreto de la app** | Secreto de la app de Meta | Un secreto hexadecimal de 32 caracteres que se usa para verificar la firma del webhook |
Concede únicamente los permisos necesarios para el número y el flujo de mensajería. Mantén los recursos de desarrollo y pruebas separados del número de producción.
## Guarda y valida las credenciales [#guarda-y-valida-las-credenciales]
Abre la página **Canales** del agente, selecciona **WhatsApp**, introduce los tres valores, elige **Responder con voz** si lo necesitas y selecciona **Conectar**.
Make Agent Fast valida el número a través de la Graph API usando el token de acceso junto con `appsecret_proof`; así se detecta un número, un token o un secreto de la app incorrectos antes de que empiece el tráfico del webhook. Después, la tarjeta del conector muestra una **URL del webhook** y un **Token de verificación** únicos.
## Configura el webhook de Meta [#configura-el-webhook-de-meta]
En la misma app de Meta:
1. Abre la configuración del webhook de WhatsApp.
2. Pega la **URL del webhook** del conector como URL de devolución de llamada.
3. Pega el **Token de verificación** del conector exactamente como aparece; distingue entre mayúsculas y minúsculas.
4. Completa la verificación.
5. Suscribe la cuenta de WhatsApp Business o el número al campo de webhook `messages`.
6. Confirma que la app y los recursos de negocio están disponibles para los usuarios de prueba o de producción previstos.
El token de verificación demuestra la propiedad durante el desafío de verificación GET. Las solicitudes POST en tiempo de ejecución se autentican por separado con la firma del secreto de la app de Meta; no sustituyas una por otra.
## Prueba texto y voz [#prueba-texto-y-voz]
Envía primero un mensaje desde un número de prueba permitido. En el modo de desarrollo de Meta, es posible que los usuarios no registrados no puedan comunicarse con la app. Confirma el hilo y el canal en **Conversaciones** y observa **Último mensaje** en la tarjeta del conector.
Se admiten texto y voz entrantes. Con **Responder con voz** activado y la voz configurada, Make Agent Fast sube el audio generado a través de la Cloud API y lo envía junto con la respuesta de texto. Las imágenes, ubicaciones, contactos y otros tipos de mensaje no compatibles se ignoran.
## Preparación para producción [#preparación-para-producción]
Antes de dar a conocer el número, completa la verificación de empresa de Meta, la revisión de la app, el nombre para mostrar, las plantillas y los pasos de la política de mensajería que exija tu caso de uso. Estos requisitos los controla Meta y pueden cambiar con independencia de Make Agent Fast.
Usa una credencial de producción con un responsable definido y un procedimiento de caducidad y rotación. Anota qué app de Meta, usuario del sistema, WABA y Phone Number ID pertenecen a este conector para que un operador pueda rotarlo sin adivinar.
## Rota o desconecta [#rota-o-desconecta]
Crea un token de reemplazo con el mismo acceso a los recursos, actualiza el conector, envía un mensaje de prueba y solo entonces revoca el token anterior. Si cambia el secreto de la app, actualízalo de inmediato en Make Agent Fast o todos los webhooks entrantes firmados fallarán.
Desactivar o eliminar el conector no cancela la suscripción ni borra la configuración del webhook en Meta. Elimina también la suscripción del proveedor cuando des de baja el número de forma definitiva.
## Solución de problemas [#solución-de-problemas]
| Síntoma | Solución |
| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Credenciales rechazadas | Confirma que el token puede leer el Phone Number ID exacto y que el secreto de la app pertenece a la misma app |
| Meta no puede verificar la devolución de llamada | Usa la URL HTTPS copiada y el token de verificación exacto; comprueba que el conector sigue existiendo |
| La verificación se completa, pero no llegan mensajes | Suscribe `messages` y revisa la asociación de la WABA y el número, el modo de la app, el acceso de los usuarios de prueba y los registros de entrega del proveedor |
| Los webhooks devuelven «unauthorized» | Vuelve a introducir el secreto de la app correcto; las firmas POST de Meta no usan el token de verificación |
| Fallan las respuestas salientes | Revisa la caducidad del token, los permisos del número, la política o ventana del destinatario y los errores de la Graph API |
| El texto funciona, pero el audio falla | Revisa las claves del proveedor de transcripción o de voz y el acceso del token a la subida y descarga de contenido multimedia |
No expongas nunca el token de acceso ni el secreto de la app en código del navegador. Usa la API pública solo desde un servidor de confianza cuando automatices la creación de conectores.
---
# Astro
Source: /es/docs/embed/astro.md
{/* docs-visuals */}
## Prepara el origen de despliegue [#prepara-el-origen-de-despliegue]
Activa **Mostrarlo en mi sitio web** para el agente de Make Agent Fast (página del agente → **Ponlo en marcha** → **Widget para sitio web**) y añade los orígenes exactos de desarrollo, vista previa y producción de Astro en **Direcciones de sitio web permitidas**. Lo que importa es el esquema, el nombre de host y el puerto finales que se ven en el navegador, no el host de compilación ni la URL del repositorio.
## Añádelo a un layout compartido [#añádelo-a-un-layout-compartido]
Coloca el cargador externo estándar justo antes de `