API REST
Chatea con tus agentes de intoCHAT, lee sus conversaciones, leads y fuentes de conocimiento, y suscribe webhooks desde tu propio servidor o una herramienta de automatización: claves de API, ámbitos, límites de frecuencia, errores, paginación y todos los endpoints con ejemplos.
La API REST permite que tu propio servidor hable con tus agentes. Envía un mensaje y recibe la respuesta del agente, lee conversaciones y leads, añade o elimina fuentes de conocimiento y suscribe webhooks a los eventos de un agente, con JSON sobre HTTPS. Las apps de Zapier y Make están construidas sobre ella. Una respuesta a través de la API la escribe el mismo código que una respuesta en el widget del chat, con el mismo conocimiento y los mismos ajustes.
La API es para servidores. No envía cabeceras CORS, así que una página web de otro sitio no puede llamarla, y tu clave de API nunca debe aparecer en un navegador ni en tu código de inserción. Para mostrar un chat en tu web, usa la etiqueta script. Para recibir los eventos en cuanto ocurren, usa los webhooks.
Qué planes incluyen la API
La API está incluida en Starter, Pro y Enterprise. En Free no puedes crear claves.
Si una cuenta vuelve a Free, sus claves siguen en la lista, pero cada petición recibe un error 403 con el código plan_required. Vuelven a funcionar en cuanto la cuenta está en Starter o superior.
Cada respuesta que un agente escribe a través de la API cuenta como un mensaje de tu plan, exactamente igual que una respuesta en el widget, y cuenta para el tope mensual de mensajes del agente si has fijado uno. Leer datos, y añadir o eliminar fuentes, no gasta mensajes. Consulta Qué cuenta como mensaje.
Crear una clave de API
- En la barra lateral, en Settings, haz clic en API keys.
- En Create a key, ponle a la clave un Name que reconozcas más adelante, por ejemplo
CRM sync. - En Access, deja Every scope, including ones added later, o elige Only the scopes I choose y marca los que necesita esta clave. Consulta Ámbitos.
- Haz clic en Create key.
- Haz clic en Copy, guarda la clave donde tu servidor pueda leerla, por ejemplo en una variable de entorno, y haz clic en I've saved it.
Una clave tiene el aspecto ic_live_ seguido de 32 letras y dígitos. Solo se muestra una vez: intoCHAT guarda únicamente una huella de ella, así que nadie puede volver a mostrártela. Si la pierdes, revócala y crea una nueva.
Una clave pertenece a la cuenta, no a la persona que la creó. Funciona para todos los agentes de la cuenta, dentro de sus ámbitos, y sigue funcionando si esa persona deja el equipo. Una cuenta puede tener hasta 20 claves activas.
Solo el propietario de la cuenta y los admins pueden crear y revocar claves. Los editors y los viewers ven la lista de claves, solo con sus primeros caracteres. Consulta Miembros del equipo y roles.
La lista de claves
Cada clave muestra su nombre, sus primeros caracteres (por ejemplo ic_live_3f9A…), sus ámbitos, cuándo se creó y cuándo se usó por última vez. Last used se actualiza como mucho una vez por minuto.
Revocar una clave
Haz clic en Revoke junto a la clave y confirma. La clave deja de funcionar desde su siguiente petición, y no se puede deshacer. Revoca una clave en cuanto pienses que otra persona puede tenerla.
Revocar una clave también elimina los webhooks que suscribió, por ejemplo para Zapier o Make, con su historial de envíos: de otro modo, nada podría eliminarlos. Los webhooks que añadiste en la pestaña Leads no se ven afectados.
Autenticación
Envía la clave en la cabecera Authorization de cada petición:
curl https://www.intochat.ai/api/v1/agents \
-H "Authorization: Bearer ic_live_YOUR_KEY"
Todos los endpoints están bajo https://www.intochat.ai/api/v1. Las peticiones con cuerpo envían JSON con Content-Type: application/json, y todas las respuestas son JSON, salvo una respuesta de chat en streaming. La API no usa cookies ni sesión iniciada: solo la clave decide qué puede hacer una petición.
Una clave que falta, mal formada, desconocida o revocada recibe un error 401 con el código unauthorized.
Ámbitos
Un ámbito (scope) permite a una clave usar un grupo de endpoints. Una clave creada con Every scope, including ones added later puede usar todos los endpoints, también los que se añadan en el futuro.
| Ámbito | Permite |
|---|---|
agents:read | Listar agentes y obtener un agente |
chat | Enviar un mensaje a un agente. Cada respuesta cuenta como un mensaje de tu plan. |
conversations:read | Listar conversaciones y obtener una conversación con su transcripción |
leads:read | Listar leads, y los eventos de leads, formularios, reservas y devoluciones de Listar eventos y Obtener eventos de ejemplo |
sources:read | Listar fuentes |
sources:write | Añadir una fuente y eliminar una fuente, lo que también inicia el entrenamiento |
webhooks:write | Suscribir un webhook y cancelar la suscripción de un webhook |
conversations:read también cubre los eventos de traspaso, chat en vivo y conversación nueva de Listar eventos.
Una petición a un endpoint para el que la clave no tiene ámbito recibe un error 403 con el código insufficient_scope. Para cambiar los ámbitos de una clave, crea una clave nueva y revoca la anterior.
Límites de frecuencia
Cada clave puede hacer 60 peticiones por minuto, entre todos los endpoints. Cada respuesta que superó la comprobación de la clave lleva estas cabeceras:
| Cabecera | Valor |
|---|---|
X-RateLimit-Limit | 60 |
X-RateLimit-Remaining | Peticiones que quedan en el minuto actual |
X-RateLimit-Reset | Cuándo termina el minuto, en segundos Unix |
Por encima del límite, la petición recibe un error 429 con el código rate_limited y una cabecera Retry-After con los segundos que hay que esperar.
El chat tiene dos límites más que no dependen de la clave: los mensajes del plan, y que un agente responde como mucho 1.000 mensajes por hora, entre el widget y la API. Por encima de eso, una petición de chat recibe un error 429 con el código agent_busy.
Errores
Todos los errores tienen la misma forma:
{
"error": {
"code": "insufficient_scope",
"message": "This API key doesn't have the \"chat\" scope."
}
}
Usa code en tu código; message lo explica para una persona y puede cambiar.
| Estado | Código | Significado |
|---|---|---|
400 | invalid_request | A la petición le falta algo o tiene un valor incorrecto. El mensaje dice cuál. |
401 | unauthorized | No hay clave, o la clave está mal formada, es desconocida o está revocada. |
403 | insufficient_scope | La clave no tiene el ámbito que necesita este endpoint. |
403 | plan_required | La cuenta está en Free. La API está incluida a partir de Starter. |
403 | message_limit_reached | La cuenta ha usado todos los mensajes que incluye su plan en este periodo. |
403 | agent_cap_reached | El agente ha llegado al tope mensual de mensajes fijado en Share, Limits and access. |
403 | agent_private | El agente es privado, así que solo responde en el panel. Consulta Agentes privados. |
403 | character_limit_exceeded | Una fuente nueva haría que el agente superara los caracteres de entrenamiento de su plan. |
404 | not_found | No existe ese agente, esa conversación, esa fuente o ese webhook en esta cuenta. |
429 | rate_limited | La clave ha hecho más de 60 peticiones en este minuto. |
429 | agent_busy | El agente está respondiendo demasiados mensajes en este momento. |
500 | internal_error | Algo ha fallado por nuestra parte. Inténtalo de nuevo. |
504 | timeout | El agente ha tardado demasiado en responder. |
Un agente, una conversación o una fuente que pertenece a otra cuenta recibe 404, igual que uno que no existe.
Paginación
Listar conversaciones y listar leads devuelven una página cada vez, de la más reciente a la más antigua. Admiten estos parámetros de consulta:
| Parámetro | Contenido |
|---|---|
limit | Elementos por página, de 1 a 100. Por defecto, 20. |
cursor | El nextCursor de la página anterior, para obtener la siguiente. |
since | Una hora ISO 8601, por ejemplo 2026-10-01T00:00:00Z. Solo se devuelven los elementos con actividad en ese momento o después: una conversación con un mensaje desde entonces, o un lead que se guardó o se volvió a enviar desde entonces. |
Una página tiene este aspecto:
{
"data": [ ],
"hasMore": true,
"nextCursor": "MjAyNi0xMC0wNFQwOTowMDowMC4wMDBafGNsdjEyMw"
}
Pide la página siguiente con ?cursor= y ese valor, con los mismos limit y since, hasta que hasMore sea false y nextCursor sea null. El orden lo fija la fecha de creación, así que la actividad nueva mientras recorres las páginas no hace que un elemento aparezca dos veces ni que falte. Para sincronizar con regularidad, guarda la hora en que empezaste la última sincronización y pásala como since la próxima vez.
Listar agentes
GET /api/v1/agents · ámbito agents:read
Todos los agentes de la cuenta, del más reciente al más antiguo.
curl https://www.intochat.ai/api/v1/agents \
-H "Authorization: Bearer ic_live_YOUR_KEY"
{
"data": [
{
"id": "AGENT_ID",
"name": "Acme Assistant",
"private": false,
"status": "trained",
"trainedAt": "2026-10-02T09:00:00.000Z",
"characters": 48210,
"counts": { "conversations": 312, "messages": 2240, "leads": 41, "sources": 18 },
"createdAt": "2026-09-01T09:00:00.000Z",
"updatedAt": "2026-10-02T09:00:00.000Z"
}
]
}
status es untrained, training, trained o error (el último entrenamiento falló). characters es cuántos caracteres de entrenamiento usan las fuentes entrenadas del agente.
Obtener un agente
GET /api/v1/agents/{agentId} · ámbito agents:read
Un agente, en data, con los mismos campos que en Listar agentes.
Enviar un mensaje
POST /api/v1/agents/{agentId}/chat · ámbito chat
Envía un mensaje al agente y devuelve su respuesta. El agente responde como en el widget: a partir de su conocimiento y sus instrucciones, con tus acciones API, botones personalizados, formularios de chat, reservas, traspaso por correo y chat en vivo donde los hayas configurado.
| Campo | Contenido |
|---|---|
message | Obligatorio. El texto, hasta 10.000 caracteres. |
conversationId | Opcional. Continúa una conversación que empezaste a través de la API, con el conversationId de una respuesta anterior. |
sessionId | Opcional. Tu propio ID para la persona por la que chateas, por ejemplo tu ID de usuario, hasta 100 caracteres. El mismo valor continúa siempre la misma conversación. También puedes enviar el sessionId de una respuesta anterior. |
stream | Opcional. true envía el texto de la respuesta en streaming; consulta Streaming. Por defecto, false. |
timeZone | Opcional. La zona horaria IANA de la persona, por ejemplo Europe/Berlin, para las horas de las reservas. Sin ella, las horas están en UTC. |
Sin conversationId ni sessionId, cada mensaje empieza una conversación nueva.
curl https://www.intochat.ai/api/v1/agents/AGENT_ID/chat \
-H "Authorization: Bearer ic_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{ "message": "Do you ship to Switzerland?", "sessionId": "customer-4821" }'
{
"reply": "Yes, we ship to Switzerland. Delivery takes 3 to 5 working days.",
"conversationId": "CONVERSATION_ID",
"sessionId": "icapi5f0c2b9e4d7a41f8a3c6e1b2d9f07a64",
"sources": [
{ "title": "Shipping", "url": "https://www.example.com/shipping" }
],
"followUps": ["How much does shipping cost?", "Can I track my order?"],
"buttons": [],
"products": [],
"form": null,
"leadForm": null,
"booking": null,
"liveChat": null
}
| Campo | Contenido |
|---|---|
reply | La respuesta del agente como texto plano con Markdown, sin los bloques de control del widget. Vacía mientras alguien de tu equipo lleva el chat (consulta liveChat). |
conversationId | La conversación, como en Obtener una conversación. |
sessionId | La sesión de la conversación en intoCHAT. Siempre empieza por icapi. |
sources | Las páginas en las que se basó la respuesta, como title y url, cuando Show sources under replies está activado. Las páginas de la búsqueda web siempre aparecen, con "web": true. |
followUps | Preguntas siguientes sugeridas, cuando Suggest follow-up questions está activado. |
buttons | Los botones personalizados que eligió el agente, como label y url. |
products | Tarjetas de producto de tu tienda o de acciones API, con name, url y, cuando se conocen, image, price, compareAtPrice, currency y available. |
form | Un formulario de chat que ofreció el agente, con su formId, name, fields y submitLabel, o null. La API no puede enviarlo; muéstralo en tu propia interfaz o ignóralo. |
leadForm | El formulario de leads, con su message, los fields de contacto y form, cuando el agente pidió datos de contacto, o null. Los datos de contacto escritos en un mensaje se guardan como lead cuando Save contact details written in the chat está activado, igual que en el widget. |
booking | Horas libres para citas, con provider, eventTitle, eventLength en minutos, timeZone y days, cada uno con su date y sus slots como horas UTC, o null. La API no puede reservar una hora. |
liveChat | null, o el estado del chat en vivo: offered (el agente puede pedir a tu equipo que se una), requested (se lo pidió) o paused (un miembro del equipo lleva el chat, así que el agente no respondió). |
En qué se diferencian los chats por API del widget
- La conversación se guarda como un chat del widget y aparece en la pestaña Conversations del agente, con sus leads, valoraciones y estadísticas. No tiene país ni página.
- Los dominios permitidos, los países bloqueados y los mensajes por visitante no se aplican: no hay página ni dirección del visitante que comprobar. Sí se aplican los mensajes del plan, el tope mensual del agente y el límite de frecuencia de la clave.
- Un agente privado rechaza los chats por API con
agent_private. - Las acciones del lado del cliente se ejecutan en el navegador de un visitante, así que el agente no las tiene disponibles en los chats por API. Las acciones API, los botones, los formularios y las reservas funcionan.
- No se pueden adjuntar archivos y no hay chats temporales.
- Solo las conversaciones empezadas a través de la API se pueden continuar a través de la API. El agente ve como historial los últimos 40 mensajes de la conversación.
- Mientras alguien de tu equipo ha tomado el control del chat en la bandeja de Live chat, tu mensaje se guarda,
replyestá vacío yliveChatespaused. Las respuestas del miembro del equipo aparecen en la conversación: léelas con Obtener una conversación, donde tienen unauthorName. Un mensaje durante una toma de control no gasta ningún mensaje de tu plan. - Una respuesta que tarda más de 55 segundos termina con un error
504y el códigotimeout. Puede contar igualmente como mensaje.
Streaming
Con "stream": true, la respuesta es el texto de la respuesta a medida que se escribe, como text/plain, sin los campos JSON. Las cabeceras X-Conversation-Id y X-Session-Id llevan la conversación y la sesión, y X-Live-Chat el estado del chat en vivo cuando lo hay. Las fuentes, los botones y los demás bloques no se envían en streaming; léelos después con Obtener una conversación. Los errores son JSON, igual que sin streaming.
curl -N https://www.intochat.ai/api/v1/agents/AGENT_ID/chat \
-H "Authorization: Bearer ic_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{ "message": "What are your opening hours?", "stream": true }'
Listar conversaciones
GET /api/v1/agents/{agentId}/conversations · ámbito conversations:read
Las conversaciones del agente, del widget y de la API, de la más reciente a la más antigua, sin sus mensajes. Admite limit, cursor y since; consulta Paginación.
curl "https://www.intochat.ai/api/v1/agents/AGENT_ID/conversations?limit=50&since=2026-10-01T00:00:00Z" \
-H "Authorization: Bearer ic_live_YOUR_KEY"
{
"data": [
{
"id": "CONVERSATION_ID",
"sessionId": "8f14e45f-ceea-467a-9575-1a2b3c4d5e6f",
"channel": "widget",
"createdAt": "2026-10-04T09:00:00.000Z",
"lastActivityAt": "2026-10-04T09:12:00.000Z",
"country": "CH",
"page": "https://www.example.com/pricing",
"messageCount": 6,
"topics": ["Pricing"],
"sentiment": "positive",
"liveChat": null,
"csatScore": null
}
],
"hasMore": false,
"nextCursor": null
}
channel es api para una conversación empezada a través de la API y, si no, widget (la etiqueta script, el iframe en la página, el enlace directo y el Playground). topics y sentiment los asigna el análisis de temas cuando está activado. liveChat es null, requested, active o ended. csatScore es la valoración del visitante de 1 a 5 después de un chat en vivo, o null.
Obtener una conversación
GET /api/v1/conversations/{conversationId} · ámbito conversations:read
Una conversación de cualquier agente de la cuenta, con todos sus mensajes en orden.
{
"data": {
"id": "CONVERSATION_ID",
"agentId": "AGENT_ID",
"sessionId": "icapi5f0c2b9e4d7a41f8a3c6e1b2d9f07a64",
"channel": "api",
"createdAt": "2026-10-04T09:00:00.000Z",
"lastActivityAt": "2026-10-04T09:14:00.000Z",
"country": null,
"page": null,
"topics": [],
"sentiment": null,
"handoffRequestedAt": null,
"liveChat": { "status": "ended", "startedAt": "2026-10-04T09:05:00.000Z", "endedAt": "2026-10-04T09:13:00.000Z" },
"csat": { "score": 5, "comment": "Quick and friendly.", "ratedAt": "2026-10-04T09:14:00.000Z" },
"messages": [
{ "id": "MESSAGE_ID", "role": "assistant", "content": "Hello! How can I help you today?", "createdAt": "2026-10-04T09:00:00.000Z", "authorName": null, "sources": [] },
{ "id": "MESSAGE_ID", "role": "user", "content": "Can I change my delivery address?", "createdAt": "2026-10-04T09:01:00.000Z", "authorName": null, "sources": [] },
{ "id": "MESSAGE_ID", "role": "assistant", "content": "Yes, I'm on it. What's your order number?", "createdAt": "2026-10-04T09:06:00.000Z", "authorName": "Anna", "sources": [] }
]
}
}
role es user para el visitante o tus mensajes por API, y assistant para el agente y tu equipo. authorName es el nombre de pila del miembro del equipo que escribió una respuesta de chat en vivo, o null cuando la escribió el agente. content es el texto sin los bloques de control del widget; las sources de una respuesta del agente listan las páginas que mostró. handoffRequestedAt es cuándo el agente envió la conversación a tu equipo por correo, o null. liveChat y csat son null cuando no hubo chat en vivo o valoración.
Listar leads
GET /api/v1/agents/{agentId}/leads · ámbito leads:read
Los leads del agente, del más reciente al más antiguo. Admite limit, cursor y since; consulta Paginación.
{
"data": [
{
"id": "LEAD_ID",
"email": "jane@example.com",
"phone": null,
"name": "Jane",
"customFields": [{ "id": "FIELD_ID", "label": "Company", "value": "Acme" }],
"source": "form",
"conversationId": "CONVERSATION_ID",
"collectedAt": "2026-10-04T09:03:00.000Z",
"lastSeenAt": "2026-10-04T09:03:00.000Z",
"submissionCount": 1
}
],
"hasMore": false,
"nextCursor": null
}
source es form para el formulario de leads o chat para datos de contacto escritos en un mensaje. customFields usa las etiquetas que tiene tu formulario ahora. lastSeenAt y submissionCount cambian cuando la misma persona vuelve a enviarlo. conversationId es null cuando se borró la conversación.
Listar fuentes
GET /api/v1/agents/{agentId}/sources · ámbito sources:read
Las fuentes de conocimiento del agente en el orden de su pestaña Knowledge, con el progreso del entrenamiento. El texto de una fuente no se incluye, salvo la pregunta y la respuesta de un par de pregunta y respuesta.
{
"data": [
{
"id": "SOURCE_ID",
"type": "qa",
"title": "Do you ship to Switzerland?",
"url": null,
"filename": null,
"question": "Do you ship to Switzerland?",
"answer": "Yes, in 3 to 5 working days.",
"characters": 71,
"status": "trained",
"error": null,
"trainedAt": "2026-10-02T09:00:00.000Z",
"createdAt": "2026-10-02T08:59:00.000Z",
"updatedAt": "2026-10-02T09:00:00.000Z"
}
],
"training": { "total": 18, "trained": 18, "pending": 0, "processing": 0, "failed": 0, "done": true },
"characters": { "used": 48210, "limit": 500000 }
}
type es website, file, text, qa o notion. status es pending, processing, trained o failed, con el motivo en error. characters.limit son los caracteres de entrenamiento por agente de tu plan.
Añadir una fuente
POST /api/v1/agents/{agentId}/sources · ámbito sources:write
Añade un texto o un par de pregunta y respuesta e inicia el entrenamiento, como hace la pestaña Knowledge. El agente usa la fuente nueva en cuanto está entrenada; sigue su status con Listar fuentes.
Un texto:
curl https://www.intochat.ai/api/v1/agents/AGENT_ID/sources \
-H "Authorization: Bearer ic_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{ "type": "text", "title": "Opening hours", "content": "We are open Monday to Friday, 9:00 to 17:00." }'
Un par de pregunta y respuesta:
{ "type": "qa", "question": "Do you ship to Switzerland?", "answer": "Yes, in 3 to 5 working days." }
{
"data": { "id": "SOURCE_ID", "type": "text", "title": "Opening hours", "status": "pending", "characters": 44 },
"result": "created",
"training": { "total": 19, "trained": 18, "pending": 1, "processing": 0, "failed": 0, "done": false }
}
data tiene todos los campos de Listar fuentes; arriba se omiten algunos. result es created (estado 201), updated cuando ya existía un par con la misma pregunta, sin distinguir mayúsculas y minúsculas, y ahora tiene la respuesta nueva, o unchanged cuando ya tenía exactamente esta respuesta (ambos con estado 200). Un texto siempre se añade como fuente nueva. Un título y una pregunta pueden tener cada uno hasta 200 caracteres.
La fuente cuenta para los caracteres de entrenamiento del agente. Una fuente que superaría el límite de tu plan recibe un error 403 con el código character_limit_exceeded, y no se añade nada. Consulta Caracteres de entrenamiento por agente.
Eliminar una fuente
DELETE /api/v1/agents/{agentId}/sources/{sourceId} · ámbito sources:write
Elimina la fuente y lo que el agente aprendió de ella, al momento, como al eliminarla en la pestaña Knowledge. No hay que volver a entrenar nada más.
{ "id": "SOURCE_ID", "deleted": true, "training": { "total": 17, "trained": 17, "pending": 0, "processing": 0, "failed": 0, "done": true } }
Suscribir un webhook
POST /api/v1/agents/{agentId}/webhooks · ámbito webhooks:write
Suscribe un webhook a los eventos del agente: un REST hook, como los que usan los disparadores instantáneos de Zapier y Make. Después, intoCHAT envía cada evento a la dirección como se explica en Webhooks, firmado y con reintentos, igual que un webhook añadido en la pestaña Leads.
| Campo | Contenido |
|---|---|
url | Obligatorio. La dirección a la que se envían los eventos. Como en la pestaña Leads, tiene que empezar por https:// y apuntar a un servidor público; las direcciones de redes privadas e internas se rechazan. |
events | Obligatorio. Uno o varios de lead.created, handoff.requested, form.submitted, booking.created, live_chat.requested y return.requested. Consulta Eventos. |
source | Opcional. zapier, make o api (por defecto): lo que muestra la pestaña Leads junto al webhook, por ejemplo via Zapier. |
curl https://www.intochat.ai/api/v1/agents/AGENT_ID/webhooks \
-H "Authorization: Bearer ic_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{ "url": "https://hooks.example.com/intochat", "events": ["lead.created"], "source": "api" }'
{
"id": "WEBHOOK_ID",
"agentId": "AGENT_ID",
"url": "https://hooks.example.com/intochat",
"events": ["lead.created"],
"source": "api",
"secret": "whsec_…",
"createdAt": "2026-10-08T09:00:00.000Z"
}
La respuesta tiene el estado 201. Guarda id para cancelar la suscripción más adelante. secret es el secreto de firma del webhook, y solo se devuelve aquí; úsalo para comprobar la firma si tu receptor puede hacerlo. Las herramientas que no pueden comprobar firmas, como Zapier y Make, pueden ignorarlo.
Un webhook suscrito aparece en la pestaña Leads del agente con una etiqueta via Zapier, via Make o via API, donde el propietario puede pausarlo o eliminarlo. Recuerda la clave que lo suscribió: revocar esa clave lo elimina. Un agente puede tener hasta 25 webhooks suscritos, aparte de los 5 añadidos en la pestaña Leads; por encima de eso, la petición recibe un error 400.
Cancelar la suscripción de un webhook
DELETE /api/v1/webhooks/{webhookId} · ámbito webhooks:write
Elimina un webhook que se suscribió a través de la API, con su historial de envíos. Puede hacerlo cualquier clave de la misma cuenta. Un webhook añadido en la pestaña Leads, un webhook de otra cuenta o uno ya eliminado recibe 404.
{ "id": "WEBHOOK_ID", "deleted": true }
Listar eventos
GET /api/v1/agents/{agentId}/events/{event} · ámbito agents:read, más leads:read o conversations:read
Los últimos eventos de un tipo del agente, del más reciente al más antiguo, cada uno con exactamente la misma forma que el cuerpo de un envío de webhook. Las herramientas de automatización lo consultan periódicamente en lugar de esperar a un webhook, por ejemplo para mostrar datos de ejemplo reales. Admite limit, de 1 a 100 (por defecto, 20).
event | Necesita también | Se construye a partir de |
|---|---|---|
lead.created | leads:read | Los leads, primero los guardados más recientemente |
form.submitted | leads:read | Los formularios enviados |
booking.created | leads:read | Las reservas |
return.requested | leads:read | Las peticiones de devolución |
handoff.requested | conversations:read | Las conversaciones traspasadas por correo |
live_chat.requested | conversations:read | Las conversaciones en las que el agente pidió a tu equipo que se uniera |
conversation.created | conversations:read | Las conversaciones nuevas. Este evento no tiene webhook; solo se puede listar. |
curl "https://www.intochat.ai/api/v1/agents/AGENT_ID/events/lead.created?limit=5" \
-H "Authorization: Bearer ic_live_YOUR_KEY"
{
"data": [
{
"id": "LEAD_ID",
"event": "lead.created",
"created_at": "2026-10-07T09:30:00.000Z",
"agent": { "id": "AGENT_ID", "name": "Acme Assistant" },
"data": {
"leadId": "LEAD_ID",
"agentId": "AGENT_ID",
"agentName": "Acme Assistant",
"email": "jane@example.com",
"phone": null,
"name": "Jane",
"customFields": [],
"source": "form",
"conversationId": "CONVERSATION_ID",
"collectedAt": "2026-10-07T09:30:00.000Z"
}
}
]
}
Las diferencias con un envío:
ides el ID del registro, no un ID de envío, así que el mismo evento siempre tiene el mismoid: el ID del lead, del envío del formulario, de la reserva, de la petición de devolución o de la conversación. En los traspasos y las peticiones de chat en vivo es el ID de la conversación, dos puntos y la hora en milisegundos, porque una conversación puede volver a pedirlo más tarde.created_ates cuándo se guardó el registro.- Los datos se reconstruyen a partir de lo que guarda intoCHAT. El
summaryde un traspaso no se guarda, así que esnull, ytestesfalse. Un traspaso que abrió un ticket de helpdesk lleva suticket, igual que el webhook. ElproviderStatusde una reserva espendingmientras espera tu confirmación y, si no,accepted. Una petición de devolución tiene sustatusactual,requestedohandled. - Los datos de
conversation.createdtienenconversationId,channel(widgetoapi),page,countryycreatedAt.
Obtener eventos de ejemplo
GET /api/v1/agents/{agentId}/events/{event}/samples · ámbito agents:read
Hasta 3 de los últimos eventos del agente, como en Listar eventos, para que una herramienta siempre tenga datos a partir de los que asignar campos. Cuando el agente todavía no tiene ninguno, o la clave no tiene el ámbito que necesita ese evento (leads:read o conversations:read), devuelve en su lugar un ejemplo documentado con los mismos campos, y sample es true.
{
"data": [
{
"id": "sample_booking.created",
"event": "booking.created",
"created_at": "2026-10-07T09:30:00.000Z",
"agent": { "id": "AGENT_ID", "name": "Acme Assistant" },
"data": { "bookingId": "sample_booking", "eventTitle": "30 min intro call", "attendeeEmail": "jane@example.com" }
}
],
"sample": true
}
Los data del ejemplo tienen todos los campos del evento; arriba se omiten algunos.
Límites
- La API está incluida a partir de Starter. En Free no se pueden crear claves y las existentes reciben
plan_required. - 60 peticiones por minuto por clave, y como mucho 20 claves activas por cuenta.
- Cada respuesta del chat cuenta como un mensaje de tu plan. Un agente responde como mucho 1.000 mensajes por hora, entre el widget y la API.
- Una respuesta del chat tiene que terminar en 55 segundos.
- Fuentes: solo textos y pares de pregunta y respuesta. Las páginas web, los archivos y las páginas de Notion se añaden en el panel.
- Hasta 25 webhooks suscritos por agente, aparte de los 5 añadidos en la pestaña Leads.
- Todavía no hay endpoints para crear o cambiar agentes, enviar formularios, reservar citas ni tomar el control de chats en vivo.
Siguientes pasos
- Recibe en tu servidor los leads y los traspasos en cuanto ocurren: Webhooks.
- Usa intoCHAT en Zapier o Make: Zapier y Make.
- Deja que tu agente llame a tu propia API mientras responde: Acciones API.
- Escribe buenos textos y pares de pregunta y respuesta: Texto y preguntas.
- Comprueba qué incluye tu plan: Planes y límites.