Download OpenAPI specification:
API de CallMarket: lanza campañas salientes con un asistente de voz que invita, ofrece promociones, toma reservaciones y pasa la llamada a una persona; y configura el comportamiento del asistente.
GET /voces y POST /bots: define el asistente (voz, guion con variables, transferencia, reservas).cmk_test_, crea campañas de prueba: las llamadas son simuladas y no salen a clientes reales.POST /bots/{id}/revision: CallMarket revisa el guion y lo aprueba.cmk_live_, POST /campanas con tus contactos. Recibes el resultado de cada llamada por webhook.Cabecera X-Api-Key (cmk_test_… = pruebas, cmk_live_… = producción), con los alcances que tenga la clave: bots, campanas, no_contactar, consumo, leads, llamadas, reservas, whatsapp. Máximo 120 peticiones por minuto por clave. Errores: {"error": "codigo", "mensaje": "texto"}. Teléfonos de México a 10 dígitos (acepta +52).
Cada evento es un POST JSON con las cabeceras X-CallMarket-Firma: sha256=<HMAC-SHA256 hex del cuerpo crudo con tu secreto>, X-CallMarket-Evento y X-CallMarket-Id. El secreto se te entrega al registrar tu URL (https). Responde 2xx en menos de 10 s.
CallMarket fija tu suscripción a tu cuenta, así no recibes eventos de otros clientes.
No se ofrecen campañas por WhatsApp; WhatsApp solo se usa para confirmar una reservación hecha en la llamada.
[- {
- "id": "kore",
- "nombre": "Kore",
- "genero": "femenina",
- "idiomas": [
- "es-MX",
- "en-US"
],
}
]{- "datos": [
- {
- "nombre": "Promociones La Pizzería",
- "lugar": "La Pizzería",
- "idioma": "es-MX",
- "voz": "kore",
- "guion": "string",
- "apertura": "Hola {nombre}, te llamo de {lugar}.",
- "conocimiento": "string",
- "transferencia": {
- "telefono": "9981234567"
}, - "reservas": {
- "habilitado": true,
- "proveedor": "resbok",
- "lugar_id": "152"
}, - "id": "bot_8f3a1c",
- "version": 3,
- "estado": "borrador",
- "motivo_rechazo": "string",
- "actualizado": "2019-08-24T14:15:22Z"
}
], - "pagina": 0,
- "hay_mas": true
}| nombre required | string |
| lugar required | string Nombre del lugar tal como lo dirá el bot. |
| idioma required | string Default: "es-MX" Enum: "es-MX" "en-US" |
| voz required | string Identificador de GET /voces. |
| guion required | string <= 8000 characters Instrucciones del bot. Admite variables |
| apertura | string <= 400 characters Primera frase del bot. |
| conocimiento | string <= 20000 characters Promociones, horarios y políticas que el bot puede citar. |
object (Transferencia) Qué hace el bot cuando el cliente quiere hablar con una persona: ofrece comunicarlo y, con un sí claro, marca al teléfono del lugar. Si nadie contesta en 30 segundos, la llamada vuelve con el bot, que se disculpa y toma los datos para que el lugar le llame (resultado | |
object (ReservasConfig) Permite que el bot cree la reservación. Las reglas de seguridad (teléfono y correo obligatorios, máximo de personas, confirmación del cliente antes de crear) las aplica CallMarket y no se pueden desactivar. |
{- "nombre": "Promociones La Pizzería",
- "lugar": "La Pizzería",
- "idioma": "es-MX",
- "voz": "kore",
- "guion": "string",
- "apertura": "Hola {nombre}, te llamo de {lugar}.",
- "conocimiento": "string",
- "transferencia": {
- "telefono": "9981234567"
}, - "reservas": {
- "habilitado": true,
- "proveedor": "resbok",
- "lugar_id": "152",
- "credencial": "string"
}
}{- "nombre": "Promociones La Pizzería",
- "lugar": "La Pizzería",
- "idioma": "es-MX",
- "voz": "kore",
- "guion": "string",
- "apertura": "Hola {nombre}, te llamo de {lugar}.",
- "conocimiento": "string",
- "transferencia": {
- "telefono": "9981234567"
}, - "reservas": {
- "habilitado": true,
- "proveedor": "resbok",
- "lugar_id": "152"
}, - "id": "bot_8f3a1c",
- "version": 3,
- "estado": "borrador",
- "motivo_rechazo": "string",
- "actualizado": "2019-08-24T14:15:22Z"
}{- "nombre": "Promociones La Pizzería",
- "lugar": "La Pizzería",
- "idioma": "es-MX",
- "voz": "kore",
- "guion": "string",
- "apertura": "Hola {nombre}, te llamo de {lugar}.",
- "conocimiento": "string",
- "transferencia": {
- "telefono": "9981234567"
}, - "reservas": {
- "habilitado": true,
- "proveedor": "resbok",
- "lugar_id": "152"
}, - "id": "bot_8f3a1c",
- "version": 3,
- "estado": "borrador",
- "motivo_rechazo": "string",
- "actualizado": "2019-08-24T14:15:22Z"
}Sube version y regresa el bot a borrador.
| bot_id required | string |
| nombre | string |
| lugar | string |
| idioma | string Enum: "es-MX" "en-US" |
| voz | string |
| guion | string <= 8000 characters |
| apertura | string <= 400 characters |
| conocimiento | string <= 20000 characters |
object (Transferencia) Qué hace el bot cuando el cliente quiere hablar con una persona: ofrece comunicarlo y, con un sí claro, marca al teléfono del lugar. Si nadie contesta en 30 segundos, la llamada vuelve con el bot, que se disculpa y toma los datos para que el lugar le llame (resultado | |
object (ReservasConfig) Permite que el bot cree la reservación. Las reglas de seguridad (teléfono y correo obligatorios, máximo de personas, confirmación del cliente antes de crear) las aplica CallMarket y no se pueden desactivar. |
{- "nombre": "string",
- "lugar": "string",
- "idioma": "es-MX",
- "voz": "string",
- "guion": "string",
- "apertura": "string",
- "conocimiento": "string",
- "transferencia": {
- "telefono": "9981234567"
}, - "reservas": {
- "habilitado": true,
- "proveedor": "resbok",
- "lugar_id": "152",
- "credencial": "string"
}
}{- "nombre": "Promociones La Pizzería",
- "lugar": "La Pizzería",
- "idioma": "es-MX",
- "voz": "kore",
- "guion": "string",
- "apertura": "Hola {nombre}, te llamo de {lugar}.",
- "conocimiento": "string",
- "transferencia": {
- "telefono": "9981234567"
}, - "reservas": {
- "habilitado": true,
- "proveedor": "resbok",
- "lugar_id": "152"
}, - "id": "bot_8f3a1c",
- "version": 3,
- "estado": "borrador",
- "motivo_rechazo": "string",
- "actualizado": "2019-08-24T14:15:22Z"
}Pasa a en_revision. CallMarket aprueba o rechaza y avisa por correo.
| bot_id required | string |
{- "nombre": "Promociones La Pizzería",
- "lugar": "La Pizzería",
- "idioma": "es-MX",
- "voz": "kore",
- "guion": "string",
- "apertura": "Hola {nombre}, te llamo de {lugar}.",
- "conocimiento": "string",
- "transferencia": {
- "telefono": "9981234567"
}, - "reservas": {
- "habilitado": true,
- "proveedor": "resbok",
- "lugar_id": "152"
}, - "id": "bot_8f3a1c",
- "version": 3,
- "estado": "borrador",
- "motivo_rechazo": "string",
- "actualizado": "2019-08-24T14:15:22Z"
}{- "datos": [
- {
- "id": "cmp_91d2e0",
- "nombre": "string",
- "bot_id": "string",
- "ambiente": "prueba",
- "estado": "programada",
- "ventana": {
- "desde": "2026-10-10",
- "hasta": "2026-10-15",
- "zona_horaria": "America/Mexico_City",
- "horario": {
- "inicio": "10:00",
- "fin": "20:00",
- "dias": [
- "lun"
]
}
}, - "contactos_total": 0,
- "creada": "2019-08-24T14:15:22Z",
- "rechazados": [
- {
- "id_externo": "string",
- "motivo": "string"
}
]
}
], - "pagina": 0,
- "hay_mas": true
}Tú decides a qué contactos se llama. Con clave cmk_test_ la campaña es de prueba (llamadas simuladas). Con cmk_live_ exige un bot aprobado, respeta el horario máximo del plan, tu lista de no contactar y los límites de la cuenta. Si un cliente reserva, recibe la confirmación de su reservación (correo y WhatsApp).
| nombre required | string |
| bot_id required | string |
required | object (Ventana) Fechas y horario permitido para llamar, en la zona horaria indicada. |
object (Reintentos) | |
object Variables comunes de la campaña (por ejemplo | |
required | Array of objects (Contacto) <= 5000 items |
{- "nombre": "Cumpleaños octubre",
- "bot_id": "bot_8f3a1c",
- "ventana": {
- "desde": "2026-10-10",
- "hasta": "2026-10-15",
- "zona_horaria": "America/Mexico_City",
- "horario": {
- "inicio": "10:00",
- "fin": "20:00",
- "dias": [
- "lun"
]
}
}, - "reintentos": {
- "maximo": 3,
- "espera_minutos": 120
}, - "datos": {
- "promocion": "2x1 en pizzas"
}, - "contactos": [
- {
- "telefono": "9981234567",
- "nombre": "Ana",
- "id_externo": "cli-123",
- "datos": {
- "ocasion": "cumpleaños"
}
}
]
}{- "id": "cmp_91d2e0",
- "nombre": "string",
- "bot_id": "string",
- "ambiente": "prueba",
- "estado": "programada",
- "ventana": {
- "desde": "2026-10-10",
- "hasta": "2026-10-15",
- "zona_horaria": "America/Mexico_City",
- "horario": {
- "inicio": "10:00",
- "fin": "20:00",
- "dias": [
- "lun"
]
}
}, - "contactos_total": 0,
- "creada": "2019-08-24T14:15:22Z",
- "rechazados": [
- {
- "id_externo": "string",
- "motivo": "string"
}
]
}{- "id": "cmp_91d2e0",
- "nombre": "string",
- "bot_id": "string",
- "ambiente": "prueba",
- "estado": "programada",
- "ventana": {
- "desde": "2026-10-10",
- "hasta": "2026-10-15",
- "zona_horaria": "America/Mexico_City",
- "horario": {
- "inicio": "10:00",
- "fin": "20:00",
- "dias": [
- "lun"
]
}
}, - "contactos_total": 0,
- "creada": "2019-08-24T14:15:22Z",
- "rechazados": [
- {
- "id_externo": "string",
- "motivo": "string"
}
]
}Las llamadas en curso terminan; no se marcan más.
| campana_id required | string |
{- "id": "cmp_91d2e0",
- "nombre": "string",
- "bot_id": "string",
- "ambiente": "prueba",
- "estado": "programada",
- "ventana": {
- "desde": "2026-10-10",
- "hasta": "2026-10-15",
- "zona_horaria": "America/Mexico_City",
- "horario": {
- "inicio": "10:00",
- "fin": "20:00",
- "dias": [
- "lun"
]
}
}, - "contactos_total": 0,
- "creada": "2019-08-24T14:15:22Z",
- "rechazados": [
- {
- "id_externo": "string",
- "motivo": "string"
}
]
}{- "id": "cmp_91d2e0",
- "nombre": "string",
- "bot_id": "string",
- "ambiente": "prueba",
- "estado": "programada",
- "ventana": {
- "desde": "2026-10-10",
- "hasta": "2026-10-15",
- "zona_horaria": "America/Mexico_City",
- "horario": {
- "inicio": "10:00",
- "fin": "20:00",
- "dias": [
- "lun"
]
}
}, - "contactos_total": 0,
- "creada": "2019-08-24T14:15:22Z",
- "rechazados": [
- {
- "id_externo": "string",
- "motivo": "string"
}
]
}Definitivo. Los contactos sin llamar se descartan.
| campana_id required | string |
{- "id": "cmp_91d2e0",
- "nombre": "string",
- "bot_id": "string",
- "ambiente": "prueba",
- "estado": "programada",
- "ventana": {
- "desde": "2026-10-10",
- "hasta": "2026-10-15",
- "zona_horaria": "America/Mexico_City",
- "horario": {
- "inicio": "10:00",
- "fin": "20:00",
- "dias": [
- "lun"
]
}
}, - "contactos_total": 0,
- "creada": "2019-08-24T14:15:22Z",
- "rechazados": [
- {
- "id_externo": "string",
- "motivo": "string"
}
]
}| campana_id required | string |
required | Array of objects (Contacto) <= 5000 items |
{- "contactos": [
- {
- "telefono": "9981234567",
- "nombre": "Ana",
- "id_externo": "cli-123",
- "datos": {
- "ocasion": "cumpleaños"
}
}
]
}{- "agregados": 0,
- "rechazados": [
- {
- "id_externo": "string",
- "motivo": "telefono_invalido"
}
]
}| campana_id required | string |
| pagina | integer >= 1 Default: 1 |
{- "datos": [
- {
- "id": "llm_4c7aa1",
- "campana_id": "string",
- "id_externo": "string",
- "intento": 0,
- "resultado": "contesto",
- "inicio": "2019-08-24T14:15:22Z",
- "duracion_segundos": 0,
- "numero_salida": "string",
- "costo": {
- "monto": "12.40",
- "moneda": "MXN"
}, - "reserva_folio": "string",
- "confirmaciones_enviadas": {
- "correo": "enviado",
- "whatsapp": "enviado"
}, - "resumen": "string",
- "simulada": true
}
], - "pagina": 0,
- "hay_mas": true
}{- "campana_id": "string",
- "estado": "string",
- "contactos": 0,
- "intentos": 0,
- "contestaron": 0,
- "no_contestaron": 0,
- "buzon": 0,
- "interesados": 0,
- "reservaron": 0,
- "transferidos": 0,
- "no_contactar": 0,
- "minutos": 0,
- "costo": {
- "monto": "12.40",
- "moneda": "MXN"
}
}Se respeta en todas tus campañas antes de marcar.
required | Array of objects (NoContactar) <= 10000 items |
{- "numeros": [
- {
- "telefono": "string",
- "motivo": "lo pidió en llamada",
- "origen": "cliente_api"
}
]
}{- "agregados": 0
}| telefono | string Default: "" 10 dígitos (México). Obligatorio; se aceptan los alias phone, phone_number, celular, tel |
| nombre | string Default: "" |
| apellido | string Default: "" |
| correo | string Default: "" |
| ciudad | string Default: "" |
| estado | string Default: "" |
| direccion | string Default: "" |
| cp | string Default: "" |
| comentarios | string Default: "" Lo que el cliente escribió o pidió |
| origen | string Default: "" De dónde viene: sitio web, landing, CRM… |
| campana | string Default: "" Producto o campaña de interés |
| property name* additional property | any |
{- "telefono": "9994591777",
- "nombre": "Ana",
- "apellido": "",
- "correo": "ana@correo.com",
- "ciudad": "",
- "estado": "",
- "direccion": "",
- "cp": "",
- "comentarios": "",
- "origen": "sitio web",
- "campana": "flexpei"
}{- "ok": true,
- "lead_id": 0,
- "telefono": "string",
- "estado": "nuevo"
}{- "ok": true,
- "lead_id": 0,
- "telefono": "string",
- "nombre": "",
- "apellido_o_empresa": "",
- "estado": "string",
- "estado_vicidial": "",
- "ultima_llamada": "",
- "resumen_bot": ""
}desde y hasta en segundos epoch. Sin filtros: las últimas limite (máx. 500). Las llamadas de campañas se consultan en /campanas/{id}/llamadas.
| desde | integer |
| hasta | integer |
| telefono | string |
| limite | integer |
| marca | string |
{- "ok": true,
- "total": 0,
- "llamadas": [
- {
- "id": 0,
- "marca": "string",
- "telefono": "string",
- "fecha": "string",
- "direccion": "string",
- "duracion_s": 0,
- "resultado": "string",
- "interes": "",
- "transferida": false,
- "transferida_a": "",
- "nombre": "",
- "empresa": "",
- "correo": "",
- "telefono_contacto": "",
- "resumen": "",
- "folio_reserva": "",
- "reserva": "",
- "atendida_por": "bot",
- "motor": ""
}
]
}Un mensaje a una persona con una plantilla aprobada por Meta. No es para envíos masivos.
| telefono required | string |
| plantilla required | string Nombre de una plantilla APROBADA en Meta |
| idioma | string Default: "es_MX" |
| variables | Array of strings Valores de {{1}}, {{2}}… en orden |
| marca | string Default: "" Solo si la clave no tiene marca fija |
{- "telefono": "9994591777",
- "plantilla": "confirmacion_reserva",
- "idioma": "es_MX",
- "variables": [
- "Ana",
- "Kennedy Social Room",
- "viernes 18 de septiembre",
- "23:00",
- "4",
- "515541"
], - "marca": ""
}{- "ok": true,
- "wamid": "string",
- "a": "string",
- "marca": "string"
}{- "moneda": "MXN",
- "configurada": true,
- "llamada_por_minuto": {
- "monto": "12.40",
- "moneda": "MXN"
}, - "llamada_por_intento": {
- "monto": "12.40",
- "moneda": "MXN"
}, - "transferencia": {
- "monto": "12.40",
- "moneda": "MXN"
}, - "sms": {
- "monto": "12.40",
- "moneda": "MXN"
}, - "tramos_volumen": [
- {
- "desde_minutos_mes": 0,
- "llamada_por_minuto": {
- "monto": "12.40",
- "moneda": "MXN"
}
}
], - "incremento_segundos": 60,
- "vigente_desde": "2019-08-24T14:15:22Z"
}Se amplían conforme crece la capacidad; consúltalos antes de lanzar campañas grandes.
{- "simultaneas": 5,
- "llamadas_por_hora": 300,
- "contactos_por_campana": 5000,
- "horario_maximo": {
- "inicio": "string",
- "fin": "string"
}, - "sms_disponible": true
}| desde | string <date> |
| hasta | string <date> |
{- "desde": "2019-08-24",
- "hasta": "2019-08-24",
- "llamadas": 0,
- "minutos": 0,
- "transferencias": 0,
- "sms": 0,
- "total": {
- "monto": "12.40",
- "moneda": "MXN"
}, - "por_campana": [
- {
- "campana_id": "string",
- "total": {
- "monto": "12.40",
- "moneda": "MXN"
}
}
]
}| id required | string Identificador único del evento; úsalo para no procesarlo dos veces. |
| tipo required | string Value: "llamada.resultado" |
| fecha required | string <date-time> |
| marca | string Identifica tu cuenta. |
required | object (EventoLlamada) |
{- "id": "string",
- "tipo": "llamada.resultado",
- "fecha": "2019-08-24T14:15:22Z",
- "marca": "string",
- "datos": {
- "evento": "llamada.resultado",
- "campana_id": "string",
- "id_externo": "string",
- "resultado": "contesto",
- "correccion": true,
- "llamada": {
- "id": "llm_4c7aa1",
- "campana_id": "string",
- "id_externo": "string",
- "intento": 0,
- "resultado": "contesto",
- "inicio": "2019-08-24T14:15:22Z",
- "duracion_segundos": 0,
- "numero_salida": "string",
- "costo": {
- "monto": "12.40",
- "moneda": "MXN"
}, - "reserva_folio": "string",
- "confirmaciones_enviadas": {
- "correo": "enviado",
- "whatsapp": "enviado"
}, - "resumen": "string",
- "simulada": true
}
}
}| id required | string Identificador único del evento; úsalo para no procesarlo dos veces. |
| tipo required | string Value: "campana.estado" |
| fecha required | string <date-time> |
| marca | string Identifica tu cuenta. |
required | object (EventoCampana) |
{- "id": "string",
- "tipo": "campana.estado",
- "fecha": "2019-08-24T14:15:22Z",
- "marca": "string",
- "datos": {
- "evento": "campana.estado",
- "campana_id": "string",
- "estado": "corriendo",
- "resumen": {
- "campana_id": "string",
- "estado": "string",
- "contactos": 0,
- "intentos": 0,
- "contestaron": 0,
- "no_contestaron": 0,
- "buzon": 0,
- "interesados": 0,
- "reservaron": 0,
- "transferidos": 0,
- "no_contactar": 0,
- "minutos": 0,
- "costo": {
- "monto": "12.40",
- "moneda": "MXN"
}
}
}
}| id required | string Identificador único del evento; úsalo para no procesarlo dos veces. |
| tipo required | string Value: "contacto.baja" |
| fecha required | string <date-time> |
| marca | string Identifica tu cuenta. |
required | object (EventoBaja) |
{- "id": "string",
- "tipo": "contacto.baja",
- "fecha": "2019-08-24T14:15:22Z",
- "marca": "string",
- "datos": {
- "evento": "contacto.baja",
- "telefono": "string",
- "id_externo": "string",
- "origen": "llamada"
}
}