Developers
Conecta tu sistema con iOCall
Envía contactos desde tu CRM, dispara llamadas con un webhook y pon un botón de llamada en tu sitio. Todo por HTTPS y JSON.
Introducción
La API de iOCall está pensada para integraciones de servidor a servidor. Cada recurso (un segmento, una automatización) tiene su propia URL y su propia llave, así que puedes dar acceso a un solo flujo sin exponer el resto de tu cuenta.
| Qué quieres hacer | Cómo | Dónde se activa en iOCall |
|---|---|---|
| Mandar contactos a una lista para campañas | POST /segments/…/contacts | Segmentos → abre el segmento → API |
| Llamar o ejecutar pasos cuando pasa algo en tu sistema | POST /workflows/…/hook | Automatizaciones → disparador Webhook de entrada |
| Que tus visitantes te llamen desde tu web | Etiqueta <script> | Conexiones → Botón de llamada web |
URL base de la API:
https://cheery-badger-89.convex.siteAutenticación
Envía la llave del recurso en el encabezado x-iobot-secret. La encuentras junto a la URL del segmento o de la automatización dentro de iOCall. Si la regeneras, la anterior deja de funcionar al instante.
Content-Type: application/json
x-iobot-secret: <TU_LLAVE>Guarda la llave en una variable de entorno de tu servidor. Nunca la pongas en código que corre en el navegador o en una app móvil.
Enviar contactos a un segmento
Agrega o actualiza contactos y los deja dentro del segmento, listos para usar en campañas. Si el teléfono ya existe en tu cuenta, el contacto se actualiza en lugar de duplicarse.
| Campo | Tipo | Descripción |
|---|---|---|
contacts | lista | Hasta 250 contactos por solicitud. También puedes mandar un solo contacto como objeto. |
phone | texto | Obligatorio (o e164). Formato internacional, por ejemplo +50255551234. |
name | texto | Nombre del contacto. Opcional. |
fields | objeto | Campos propios. Las demás claves sueltas del contacto también se guardan como campos. |
Cada campo propio queda disponible como variable en el agente y en las campañas, por ejemplo {{ciudad}}. Los nombres se normalizan (sin espacios ni acentos) y la respuesta te dice si alguno cambió.
curl -X POST 'https://cheery-badger-89.convex.site/segments/<SEGMENT_ID>/contacts' \
-H 'Content-Type: application/json' \
-H 'x-iobot-secret: <TU_LLAVE>' \
-d '{
"contacts": [
{
"name": "María López",
"phone": "+50255551234",
"ciudad": "Guatemala",
"saldo_pendiente": 1250
}
]
}'Respuesta
{
"success": true,
"inserted": 1,
"merged": 0,
"addedToSegment": 1,
"fields": ["ciudad", "saldo_pendiente"],
"variables": ["{{ciudad}}", "{{saldo_pendiente}}"],
"message": "1 contacto(s) agregados al segmento."
}Disparar una automatización
Ejecuta una automatización que empieza con el disparador Webhook de entrada. Puedes enviar cualquier JSON: cada clave queda disponible para los pasos de la automatización. La plantilla de llamada usa phone y name, y acepta callAt (fecha y hora ISO) para programar la llamada.
curl -X POST 'https://cheery-badger-89.convex.site/workflows/<WORKFLOW_ID>/hook' \
-H 'Content-Type: application/json' \
-H 'x-iobot-secret: <TU_LLAVE>' \
-d '{
"phone": "+50255551234",
"name": "María López",
"pedido": "A-1042",
"callAt": "2026-11-10T15:30:00-06:00"
}'Respuesta
{
"success": true,
"message": "Automatización ejecutada.",
"output": { }
}Si la automatización está apagada responde 409 y no hace nada. Enciéndela en iOCall antes de conectar tu sistema.
Botón de llamada web
Un botón flotante en tu sitio: el visitante llama gratis desde el navegador, sin marcar un número, y la llamada entra a una de tus colas. Crea el botón en Conexiones → Botón de llamada web y pega la etiqueta antes de </body>.
<script
src="https://iocall.app/iocall-widget.js"
data-iocall-widget="wc_<TU_LLAVE_PUBLICA>"
data-color="#004c43"
data-label="Llámanos"
async
></script>| Atributo | Descripción |
|---|---|
data-iocall-widget | Llave pública del botón (empieza con wc_). Obligatoria. |
data-color | Color del botón en hexadecimal, por ejemplo #004c43. |
data-label | Texto del botón (máximo 40 caracteres). |
data-position | Usa left para ponerlo a la izquierda. Por defecto va a la derecha. |
También puedes abrirlo desde tu propio botón con window.IOCallWidget.open() y cerrarlo con window.IOCallWidget.close().
Errores y límites
Los errores de validación (400, 409) traen success: false y un message en español que puedes mostrar o registrar. 401 y 404 responden solo con texto.
| Código | Significado | Qué hacer |
|---|---|---|
200 | Listo | — |
400 | El cuerpo no es válido (JSON mal formado, falta el teléfono, demasiados campos) | Corrige la solicitud; reintentar igual no sirve. |
401 | Falta la llave o no coincide | Revisa el encabezado x-iobot-secret o si la llave se regeneró. |
404 | El segmento o la automatización no existe | Revisa el id en la URL. |
409 | La automatización está apagada | Enciéndela en iOCall. |
5xx | Error temporal | Reintenta con espera creciente. |
| Límite | Valor |
|---|---|
| Contactos por solicitud | 250 |
| Campos propios por contacto | 50 |
| Largo de cada valor | 4,000 caracteres |
Buenas prácticas
- Manda los teléfonos con código de país (
+502,+504,+52…). Sin él, la llamada puede fallar al marcar. - Si tienes miles de contactos, envíalos en lotes de hasta 250 y uno detrás de otro, no todos a la vez.
- Reintenta solo los errores
5xxo de red, con espera creciente (1 s, 2 s, 4 s…). Reenviar contactos es seguro: se actualizan, no se duplican. - Usa una llave por integración. Si una se filtra, regenérala sin afectar a las demás.
¿Necesitas otro endpoint?
Cuéntanos qué quieres integrar y te ayudamos a armarlo.