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 hacerCómoDónde se activa en iOCall
Mandar contactos a una lista para campañasPOST /segments/…/contactsSegmentos → abre el segmento → API
Llamar o ejecutar pasos cuando pasa algo en tu sistemaPOST /workflows/…/hookAutomatizaciones → disparador Webhook de entrada
Que tus visitantes te llamen desde tu webEtiqueta <script>Conexiones → Botón de llamada web

URL base de la API:

https://cheery-badger-89.convex.site

Autenticació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.

POST/segments/{segmentId}/contacts
CampoTipoDescripción
contactslistaHasta 250 contactos por solicitud. También puedes mandar un solo contacto como objeto.
phonetextoObligatorio (o e164). Formato internacional, por ejemplo +50255551234.
nametextoNombre del contacto. Opcional.
fieldsobjetoCampos 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.

POST/workflows/{workflowId}/hook
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>
AtributoDescripción
data-iocall-widgetLlave pública del botón (empieza con wc_). Obligatoria.
data-colorColor del botón en hexadecimal, por ejemplo #004c43.
data-labelTexto del botón (máximo 40 caracteres).
data-positionUsa 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ódigoSignificadoQué hacer
200Listo—
400El cuerpo no es válido (JSON mal formado, falta el teléfono, demasiados campos)Corrige la solicitud; reintentar igual no sirve.
401Falta la llave o no coincideRevisa el encabezado x-iobot-secret o si la llave se regeneró.
404El segmento o la automatización no existeRevisa el id en la URL.
409La automatización está apagadaEnciéndela en iOCall.
5xxError temporalReintenta con espera creciente.
LímiteValor
Contactos por solicitud250
Campos propios por contacto50
Largo de cada valor4,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 5xx o 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.