API de Monkeia Flow
Conectá tu bot de ManyChat (u otro sistema) con Monkeia Flow: respuestas con IA usando tu prompt, eventos de bots de botones para medir embudos y llenar Ventas, tareas de IA y control de las conversaciones.
URL base: https://apikey.monkeia.com
Todas las llamadas son POST con cuerpo JSON (Content-Type: application/json), salvo los enlaces de WhatsApp.
Autenticación
Cada cuenta tiene su clave del API. La ves en el panel, en Integración → Avanzado → Clave del API (dueño o administrador). Mandala en uno de estos encabezados:
Authorization: Bearer TU_CLAVE
# o
X-API-Key: TU_CLAVE
La clave da acceso a tu cuenta: no la publiques en una página web ni en una app. Si se filtró, cambiala en el mismo lugar del panel («Cambiar clave») y actualizá ManyChat.
Respuestas y errores
Las respuestas son JSON con un campo status. Si algo falla, viene error (un código fijo) y a veces detail (texto para entender qué pasó).
| HTTP | Cuándo |
|---|---|
| 200 | Todo bien (mirá status: puede ser completed, paused, skipped…). |
| 202 | Recibido: la respuesta se entrega después por ManyChat (delivery: "manychat"). |
| 400 | invalid_request: falta un campo o el JSON está mal. |
| 401 | unauthorized: falta la clave o no es válida. |
| 404 | No existe lo pedido (por ejemplo prompt_not_found, task_not_found). |
| 409 | request_id_conflict: ese request_id todavía se está procesando. |
| 413 | payload_too_large: el cuerpo pasa el límite. |
| 5xx | Error temporal (de OpenAI o nuestro). Se puede reintentar con el mismo request_id. |
Responder con IA
Manda el mensaje de un contacto y recibe la respuesta de la IA con el prompt publicado de tu cuenta. Monkeia guarda la memoria de cada conversación, aplica tus reglas (pausa al responder una persona, fuera de horario, palabras clave) y usa tu cuenta de OpenAI.
Cuerpo
| Campo | Descripción |
|---|---|
user_idobligatorio | Id del contacto (en ManyChat: {{Contact Id}}). |
messageobligatorio | Lo que escribió el contacto (hasta 8000 caracteres). Si trae enlaces de imagen, PDF o audio, la IA los lee. |
channel | whatsapp (por defecto), instagram, messenger, telegram, tiktok. |
automation_id | Una automatización guardada en el panel: define canal, entrega, flujo, campos a llenar y espera para agrupar mensajes. |
delivery | "manychat": responde 202 al instante y Monkeia le manda la respuesta al contacto por ManyChat. Sin esto, la respuesta vuelve en el HTTP. |
flow_ns | Con delivery: "manychat": llena los campos y dispara ese flujo en vez de mandar el texto. |
request_id | Id único del mensaje. Si ManyChat reintenta, devolvemos la misma respuesta sin volver a llamar a la IA. |
source | De dónde viene: dm, story_reply, story_mention, comment, reel_comment, ad. |
source_context | Texto del origen (por ejemplo, el nombre del anuncio o el texto de la historia). |
Ejemplo
curl -X POST https://apikey.monkeia.com/v1/generate \
-H "Authorization: Bearer TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{ "user_id": "123456", "message": "Hola, ¿tienen cupo mañana?", "channel": "whatsapp" }'
Respuesta (200)
{
"status": "completed",
"output_text": "{\"mensaje\":\"¡Hola! Sí, mañana tenemos…\",\"status\":\"Conversando\"}",
"message": "¡Hola! Sí, mañana tenemos…",
"json": { "mensaje": "¡Hola! Sí, mañana tenemos…", "status": "Conversando" },
"conversation_id": "…",
"request_id": null,
"usage": { "input_tokens": 812, "output_tokens": 64 }
}
| status | Qué significa |
|---|---|
completed | Hay respuesta. message es el texto para el contacto; si tu prompt responde JSON, viene completo en json. |
paused | La IA está pausada para este contacto (lo atiende una persona): no se manda nada. |
superseded | Llegó otro mensaje del mismo contacto mientras se esperaba para agrupar: responde el último. |
skipped | No había nada que responder (por ejemplo, un mensaje sin texto). |
failed | No se pudo: mirá error (openai_not_connected, prompt_not_found, provider_rejected…). |
Eventos (bots de botones)
Para bots de ManyChat con botones, sin IA (o los pasos con botones antes de la IA). Mandá un evento en cada paso importante del flujo: Monkeia guarda el contacto con sus datos, lo cuenta en el Embudo, deja una línea en su conversación y, si configuraste una etapa para ese paso, lo mueve en Ventas.
Cuerpo
| Campo | Descripción |
|---|---|
subscriber_idobligatorio | Id del contacto ({{Contact Id}}). También se acepta user_id. |
eventobligatorio | Nombre del paso, por ejemplo "Eligió curso". El primero que llega con un nombre nuevo crea el paso solo. |
name, phone, email | Datos del contacto ({{Full Name}}, {{Phone}}, {{Email}}). |
fields | Tus datos propios, como objeto: { "curso": "{{curso}}", "sede": "{{sede}}" }. Se suman a la ficha del contacto y aparecen como columnas en Contactos. Valores vacíos o {{variables}} sin llenar se ignoran. |
channel | whatsapp (por defecto), instagram, messenger. |
Ejemplo
{
"subscriber_id": "{{Contact Id}}",
"event": "Eligió curso",
"name": "{{Full Name}}",
"phone": "{{Phone}}",
"fields": { "curso": "{{curso}}", "sede": "{{sede}}" }
}
Respuesta (200)
{ "status": "ok", "contact_id": "…", "conversation_id": "…", "event": "eligio_curso", "moved_to_stage": null }
Hasta 60 pasos distintos por cuenta y 40 campos por evento. Un contacto que repite un paso cuenta una sola vez en el embudo.
Distancia y tiempo (Google Maps)
Kilómetros y minutos en carro entre dos puntos. Acepta los enlaces de Google Maps o Waze que manda el cliente (también los cortos maps.app.goo.gl), coordenadas o direcciones escritas. Activalo en Integración → Google Maps. Con Maps activado, la IA también tiene la herramienta calcular_ruta para usarla sola durante la conversación.
| Campo | Descripción |
|---|---|
originobligatorio | Enlace de Maps/Waze, "9.93,-84.08" o dirección. |
destinationobligatorio | Igual que origin. |
// 200
{ "status": "ok", "distance_km": 23.5, "minutes": 31 }
Sin clave propia se usa la de Monkeia con un tope de rutas por mes (429 maps_limit al llegar). Otros errores: 403 maps_disabled, 400 bad_origin / bad_destination, 404 no_route.
Tareas de IA
Una llamada a la IA sin memoria para resumir, clasificar o sacar datos. Las tareas (instrucciones y slug) se crean en el panel, en Tareas de IA.
| Campo | Descripción |
|---|---|
input | El texto a procesar (hasta 20 000 caracteres). |
variables | Objeto: reemplaza {{nombre}} en las instrucciones de la tarea. |
user_id, channel | El contacto: para leer su conversación o entregarle el resultado por ManyChat. |
include_conversation | true: suma los últimos mensajes de la conversación del contacto. |
delivery | "http" (por defecto) o "manychat": responde 202 y llena monkeia_task_result (y un campo por cada clave si la IA responde JSON). |
flow_ns | Con delivery: "manychat": después de llenar los campos, dispara ese flujo. |
// 200
{ "status": "completed", "output_text": "…", "json": { … }, "message": "…", "missing_variables": [], "usage": { … } }
Conversaciones
Para controlar la conversación de un contacto desde ManyChat. Cuerpo: { "user_id": "{{Contact Id}}", "channel": "whatsapp" }.
| Endpoint | Qué hace |
|---|---|
| POST /v1/conversations/reset | Empieza una memoria nueva (la anterior queda guardada en el panel). |
| POST /v1/conversations/context | Le da información a la IA sin responder. Agregá "content": "…". |
| POST /v1/conversations/pause | La IA deja de responder a este contacto (lo atiende una persona). |
| POST /v1/conversations/resume | La IA vuelve a responder. |
Enlaces de WhatsApp
Los enlaces que creás en Lanzamientos → Enlaces abren WhatsApp con el mensaje prellenado y una marca (ref: código). Así la conversación queda unida al enlace y a sus UTM, y ves en el panel qué chats vienen de cada campaña o sitio web. Se guarda el clic con las UTM, sin la IP.
Configurar en ManyChat
- En el flujo, agregá Acción → Solicitud externa (External Request), tipo POST.
- URL:
https://apikey.monkeia.com/v1/generate(IA) ohttps://apikey.monkeia.com/v1/events(bot de botones). - Encabezados:
Authorization=Bearer TU_CLAVE. - Cuerpo: el JSON del endpoint, con las variables de ManyChat (botón { }).
- Tocá Probar la solicitud: con IA tenés que ver
"status": "completed"(oqueuedcondelivery: "manychat"); con eventos,"status": "ok".
En el panel, Integración y Embudo tienen el texto listo para copiar con tu URL y tu clave.
Límites y buenas prácticas
- Cuerpo: hasta 100 KB en
/v1/generatey/v1/tasks; 32 KB en/v1/events. - ManyChat espera unos 10 segundos por respuesta: si tu prompt usa herramientas o tarda, usá
delivery: "manychat". - Mandá un
request_idúnico por mensaje para que los reintentos no dupliquen respuestas. - Guardá la clave solo en ManyChat o en tu servidor.
- ¿Dudas o algo no anda? Escribinos desde Soporte en el panel.