Your AI Connector Docs

API de Difusiones

Una difusión es un envío saliente: una audiencia, un mensaje de apertura, un canal y un horario. Opcionalmente, también nombra al Agente de IA que gestiona las respuestas que recibe. La API de Difusiones le permite crear, fijar precios, lanzar y supervisar esos envíos desde su propio código en lugar de desde el panel de control. Para obtener información sobre el producto en sí, consulte la guía de Difusiones.

Todos los ejemplos a continuación muestran la forma de consulta ?apiKey= en cURL y el encabezado X-API-Key en JavaScript y Python; cualquiera de los dos funciona en todos los endpoints.

En el explorador de API. Cada endpoint en esta página se encuentra en la especificación OpenAPI publicada, por lo que puede explorar sus campos exactos y ejecutar solicitudes en vivo en el explorador de API.


Cómo se compone un envío

Enviar una difusión requiere cuatro llamadas, no una:

  1. Crear la difusión con su audiencia, canal y horario; comienza como un Draft.
  2. Establecer el mensaje de apertura. En WhatsApp Business, eso significa enviar una plantilla para su aprobación (o elegir una que ya haya sido aprobada). En cualquier otro canal, es texto sin formato.
  3. Estimar el costo si desea verificar el precio antes de gastar nada (opcional).
  4. Lanzarla. El lanzamiento realiza una verificación completa (audiencia, mensaje, aprobación de plantilla, remitente conectado) e inicia el envío o le indica exactamente qué falta.

No se envía nada hasta que usted llama al lanzamiento.


El objeto de difusión

{
  "id": "bcd123abc456",
  "name": "June promo",
  "status": "Draft",
  "channel": "whatsapp",
  "agent_id": "agt_789",
  "list_id": "lst_456",
  "list_name": "Newsletter subscribers",
  "total_contacts": 240,
  "send_to_new_list_members": false,
  "whats_app_template": {
    "body": "Hi {{first_name}}, our June offer is live.",
    "status": "approved",
    "sid": "HX0123...",
    "language": "en",
    "category": "marketing",
    "variables": ["first_name"]
  },
  "execution_date": 1781000000000,
  "drip_mode": true,
  "time_critical": false,
  "total_contacts_sent": 0,
  "credits_used": 0,
  "created_at": 1780900000000,
  "last_modified_at": 1780900000000
}

Las marcas de tiempo se devuelven como milisegundos de época (execution_date, created_at, last_modified_at, …), y cualquier referencia de contacto se devuelve como una cadena de ruta como contacts/uid_whatsapp_15551234567.

Campos que usted establece

Campo Descripción
name Cómo se llama la difusión en el panel de control.
channel El único canal por el que se envía esta difusión: whatsapp, whatsapp_web, sms, instagram, messenger, facebook, telegram, instagram_private, line, viber, imessage, email, chat_widget, custom_channel. Una difusión tiene exactamente un canal; para enviar lo mismo a otro lugar, duplíquela en otro canal. tiktok y skool son solo para respuestas y nunca se pueden usar para difundir.
agent_id El agente de IA que responde a las respuestas. Déjelo en null y las respuestas llegarán a la bandeja de entrada de su equipo.
list_id La lista de contactos a la que enviar. Así es como se establece la audiencia desde la API; consulte Contactos para crear y completar listas.
list_name Nombre visible que se muestra junto a la difusión. Cosmético.
send_to_new_list_members true mantiene la difusión armada para que cualquier persona añadida a la lista más tarde también reciba el mensaje de apertura.
whats_app_template El mensaje de apertura. En WhatsApp Business es una plantilla real aprobada; en cualquier otro canal, su body se utiliza como texto de apertura sin formato. Configúrelo a través de los endpoints de plantillas, no manualmente.
opener_media Una imagen o vídeo enviado con el mensaje de apertura. Envíe siempre el objeto completo (o null para eliminarlo); escribir claves individuales dentro de él será rechazado. No compatible con SMS.
execution_date Cuándo enviar. Envíe una marca de tiempo ISO 8601 o milisegundos de época. Una fecha futura programa el envío; omítalo (o use una pasada) para enviar tan pronto como lo inicie.
drip_mode true regula el envío en lotes a lo largo del tiempo en lugar de todo a la vez.
time_critical true excluye la regulación automática que se activa por encima de los 50 contactos, para una audiencia activa que necesita el mensaje ahora. No elimina el límite de envío diario propio del canal.
batch_size Cuántos contactos por lote al realizar envíos graduales.
follow_up_config La cadena de seguimiento para los contactos que nunca responden.

Cualquier cosa que envíe como user_id, id, status o source_campaign_id se ignora al crear y se descarta al actualizar; el estado solo cambia a través de los endpoints de lanzamiento, pausa y reanudación a continuación.

Campos que mantiene la plataforma

status, total_contacts_sent, unique_contacts_replied, overall_reply_rate, credits_used, paused_reason, completion_summary, los contadores de lotes y contacts (los contactos individuales adjuntos desde el panel de control, leídos como cadenas de ruta). Léalos, no los escriba.

Estados

Estado Significado
Draft En construcción. No hay nada programado.
Pending Approval Lanzado, pero su plantilla de WhatsApp aún espera una decisión. Comienza a enviarse automáticamente una vez que se aprueba la plantilla; no es necesario volver a lanzarlo.
Scheduled Lanzado con un execution_date futuro.
Sending Enviando activamente (una difusión preparada para nuevos miembros de la lista permanece aquí mientras los espera).
Paused En pausa: por usted o automáticamente mediante una comprobación de seguridad.
Sent Finalizado.
Failed Finalizado con más de la mitad de los envíos fallidos.

Crear una difusión

POST /broadcasts — crea una Draft.

cURL

curl -X POST "https://api.youraiconnector.com/v1/broadcasts?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "June promo",
    "channel": "whatsapp",
    "list_id": "lst_456",
    "agent_id": "agt_789",
    "drip_mode": true,
    "execution_date": "2026-06-15T09:00:00.000Z"
  }'

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/broadcasts", {
  method: "POST",
  headers: { "X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json" },
  body: JSON.stringify({
    name: "June promo",
    channel: "whatsapp",
    list_id: "lst_456",
    agent_id: "agt_789",
    drip_mode: true,
    execution_date: "2026-06-15T09:00:00.000Z",
  }),
});
const { broadcast_id } = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/broadcasts",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "name": "June promo",
        "channel": "whatsapp",
        "list_id": "lst_456",
        "agent_id": "agt_789",
        "drip_mode": True,
        "execution_date": "2026-06-15T09:00:00.000Z",
    },
)
print(res.json()["broadcast_id"])

Respuesta (201)

{ "success": true, "broadcast_id": "bcd123abc456" }

Listar difusiones

GET /broadcasts — todas las difusiones de la cuenta, de la más reciente a la más antigua.

Parámetros de consulta

Parámetro Requerido Descripción
status No Devuelve solo las difusiones en un estado, p. ej., Sending. Haga coincidir exactamente la ortografía de la tabla de estados.
curl "https://api.youraiconnector.com/v1/broadcasts?apiKey=YOUR_API_KEY&status=Sending"
const res = await fetch("https://api.youraiconnector.com/v1/broadcasts?status=Sending", {
  headers: { "X-API-Key": "YOUR_API_KEY" },
});
const { broadcasts } = await res.json();
res = requests.get(
    "https://api.youraiconnector.com/v1/broadcasts",
    headers={"X-API-Key": "YOUR_API_KEY"},
    params={"status": "Sending"},
)
broadcasts = res.json()["broadcasts"]

Respuesta (200)

{ "success": true, "broadcasts": [{ "id": "bcd123abc456", "name": "June promo", "status": "Sending", "...": "..." }] }

Obtener una difusión

GET /broadcasts/{broadcastId} — devuelve { "success": true, "broadcast": { ... } }. Úselo para consultar un envío en curso: total_contacts_sent, unique_contacts_replied, overall_reply_rate y credits_used se actualizan a medida que avanza. |

curl "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456?apiKey=YOUR_API_KEY"

Una difusión que no existe en su cuenta devuelve 404.


Actualizar una difusión

PUT /broadcasts/{broadcastId} — envíe solo los campos que desea cambiar. También puede dirigirse a una sola clave dentro de un objeto anidado con una ruta de puntos, p. ej., "whats_app_template.body".

curl -X PUT "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "June promo (v2)", "execution_date": "2026-06-16T09:00:00.000Z" }'
await fetch("https://api.youraiconnector.com/v1/broadcasts/bcd123abc456", {
  method: "PUT",
  headers: { "X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json" },
  body: JSON.stringify({ name: "June promo (v2)", execution_date: "2026-06-16T09:00:00.000Z" }),
});

Un cuerpo vacío devuelve 400. Hay dos reglas que vale la pena conocer:

  • opener_media es todo o nada. Envíe el objeto completo o null para eliminar el archivo adjunto. Una ruta de puntos hacia él (opener_media.name) será rechazada con 400, porque un archivo adjunto parcialmente actualizado describiría un archivo que no existe.
  • El estado no es editable. Utilice lanzar, pausar y reanudar.

El mensaje de apertura

Cada difusión lleva su mensaje de apertura en whats_app_template. Lo que esto significa depende del canal:

  • WhatsApp Business — debe ser una plantilla aprobada por WhatsApp. Utilice uno de los dos endpoints a continuación.
  • Cualquier otro canal (WhatsApp Web, SMS, Instagram, Messenger, Telegram, …) — el body del mismo campo es simplemente el texto que se envía. Enviarlo a través del endpoint a continuación lo almacena y lo marca como listo sin involucrar a WhatsApp en absoluto.

Enviar una plantilla para su aprobación

POST /broadcasts/{broadcastId}/template

Campo Obligatorio Descripción
body El texto del mensaje, hasta 1024 caracteres. Utilice marcadores de posición {{variable}} para la personalización.
name No Nombre de la plantilla. Por defecto es el nombre de la difusión.
language No Código de idioma. Por defecto es en.
category No marketing (por defecto), utility, authentication o authentication-international. Este es el precio del envío, así que sea honesto.
variables No Los nombres de los marcadores de posición, en el orden en que aparecen. Déjelo fuera y se leerán desde el cuerpo, que es lo que suele querer, ya que el envío los completa desde cada contacto.
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/template?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "body": "Hi {{first_name}}, our June offer is live until Friday.",
    "language": "en",
    "category": "marketing"
  }'

Respuesta (200)

{ "success": true, "broadcast_id": "bcd123abc456", "template_status": "pending", "template_sid": "HX0123..." }

template_status es lo que dice WhatsApp: pending mientras está siendo revisado, approved cuando es utilizable, rejected si fue rechazado. En un canal que no es de WhatsApp, vuelve directamente como approved con template_sid: null; no hay nada que revisar.

Cosas que le detendrán:

  • Enviar mientras una plantilla anterior sigue bajo revisión devuelve 400. Espere primero a la decisión.
  • Editar una plantilla que ya está aprobada mantiene la aprobada activa hasta que la nueva regrese, por lo que una difusión en curso nunca pierde su apertura.
  • En un número de WhatsApp conectado directamente a través de Meta, no se puede enviar una difusión con una imagen o vídeo adjunto (400); los archivos adjuntos son compatibles en la línea gestionada de WhatsApp Business y en WhatsApp Web.

Usar una plantilla que ya tenía aprobada

POST /broadcasts/{broadcastId}/template/select — copia una plantilla ya aprobada de su biblioteca de plantillas a la difusión, por lo que no hay nada que esperar.

Campo Obligatorio Descripción
template_id El id de una plantilla aprobada en su cuenta.
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/template/select?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "template_id": "tpl_abc123" }'

Respuesta (200)

{
  "success": true,
  "broadcast_id": "bcd123abc456",
  "template_status": "approved",
  "template_sid": "HX0123...",
  "body": "Hi {{first_name}}, our June offer is live until Friday.",
  "name": "june_promo",
  "language": "en",
  "variables": ["first_name"],
  "category": "marketing"
}

La aprobación se verifica por nuestra parte desde el registro de la biblioteca; usted solo envía el id. Recibirá un 400 si la difusión no es un borrador de WhatsApp, si la plantilla no está aprobada, si es una plantilla de seguimiento en lugar de una de apertura, o si la difusión tiene un archivo adjunto (las plantillas de la biblioteca son solo de texto). Un id de plantilla que no esté en su cuenta devuelve 404.


Estimar el coste

POST /broadcasts/{broadcastId}/estimate-cost — calcula el precio del envío antes de comprometerse con él. Disponible en difusiones whatsapp y sms; cualquier otro canal devuelve 400. La difusión necesita un list_id, ya que la estimación cuenta la audiencia.

curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/estimate-cost?apiKey=YOUR_API_KEY"

Respuesta de WhatsApp (200) — créditos, desglosados por país de destino:

{
  "success": true,
  "channel": "whatsapp",
  "billing_mode": "credits",
  "data": {
    "countries": [
      { "countryCode": "31", "name": "Netherlands", "iso": "NL", "flag": "🇳🇱", "contactCount": 180, "costPerContact": 1.2, "subtotal": 216 },
      { "countryCode": "1", "name": "United States", "iso": "US", "flag": "🇺🇸", "contactCount": 60, "costPerContact": 0.9, "subtotal": 54 }
    ],
    "totalContacts": 240,
    "totalTemplateCost": 270,
    "templateCategory": "marketing",
    "billing_mode": "credits",
    "service_messages_billable_soon": false
  }
}

Respuesta por SMS (200) — Dólares estadounidenses, basados en los precios en tiempo real de Twilio para su propia cuenta de Twilio:

{
  "success": true,
  "channel": "sms",
  "billing_mode": "twilio_direct",
  "data": {
    "totalContacts": 240,
    "messageLength": 118,
    "segmentsPerMessage": 1,
    "totalSegments": 240,
    "estimatedCostUsd": 1.788,
    "priceUnit": "USD",
    "billedByTwilio": true,
    "billing_mode": "twilio_direct",
    "service_messages_billable_soon": false
  }
}

Lea billing_mode antes de mostrar un número. Le indica quién recibe la facturación:

billing_mode Quién paga Qué significan las cifras
credits Su cuenta de Your AI Connector totalTemplateCost y las cifras por país son créditos.
twilio_direct Su propia cuenta de Twilio estimatedCostUsd es lo que Twilio le cobrará.
meta_waba_direct Su propia cuenta de WhatsApp Business, facturada por Meta Cada cifra de crédito se devuelve como null — deliberadamente, para que nunca se confunda con “gratis”. Los recuentos de países y contactos siguen siendo precisos.

Los SMS sin credenciales de Twilio conectadas siguen devolviendo los recuentos de segmentos, con estimatedCostUsd: 0 — no hay precios que consultar.


Iniciar una difusión

POST /broadcasts/{broadcastId}/launch

El inicio comprueba todo primero y solo entonces hace avanzar la difusión. No existe el inicio parcial: o comienza, o nada cambia y recibe un error explicando el motivo.

cURL

curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/launch?apiKey=YOUR_API_KEY"

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/launch", {
  method: "POST",
  headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();
if (!data.success) console.error(data.error);

Python

res = requests.post(
    "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/launch",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
print(res.json())

Respuesta (200)

{ "success": true, "broadcast_id": "bcd123abc456", "status": "Scheduled" }

status es donde aterrizó la difusión:

  • Scheduledexecution_date está en el futuro.
  • Sending — comenzó ahora.
  • Pending Approval — la plantilla de WhatsApp todavía está bajo revisión. Se enviará automáticamente tan pronto como se apruebe la plantilla; no vuelva a llamar al inicio.

Solo se puede iniciar una difusión Draft (o una Pending Approval cuya plantilla haya sido aprobada desde entonces); cualquier otra cosa devuelve 400.

Por qué se rechaza un inicio

Cada uno de estos se devuelve como 400 con un mensaje error en lenguaje sencillo:

Problema Qué corregir
Sin audiencia Establezca list_id (o adjunte contactos) antes de iniciar.
Sin mensaje de apertura Establezca el mensaje de apertura — consulte El mensaje de apertura.
Archivo adjunto en SMS Los SMS no pueden llevar una imagen o vídeo. Elimine el archivo adjunto o mueva la difusión a WhatsApp.
El archivo adjunto no coincide con la plantilla aprobada En WhatsApp, el contenido multimedia reside dentro de la plantilla aprobada, por lo que cambiar el archivo adjunto después significa volver a enviar la plantilla.
Plantilla rechazada Reescriba el mensaje y envíelo de nuevo.
Plantilla nunca enviada Envíela (o seleccione una aprobada) primero.
Plantilla aprobada pero ausente de su cuenta de WhatsApp Generalmente una plantilla aprobada antes de que el número terminara de conectarse. Envíela de nuevo.
Sin remitente conectado para el canal Conecte el canal primero — consulte Canales.
Canal de solo respuesta TikTok y Skool no permiten que una empresa inicie una conversación, por lo que no se puede difundir en ellos.
Ya armado La difusión ya tiene un envío programado. Paúsela antes de iniciar de nuevo.
Aún esperando aprobación Se enviará automáticamente cuando se apruebe la plantilla.
Cuenta de WhatsApp Business bloqueada por Meta Meta ha detenido las conversaciones iniciadas por empresas en su propia cuenta de WhatsApp Business — normalmente un problema de método de pago. Soluciónelo en el Business Manager de Meta.
Iniciado desde una campaña clásica Inícielo desde el editor de campañas en su lugar. Consulte campañas clásicas en Difusiones.

Pausar y reanudar

POST /broadcasts/{broadcastId}/pause detiene una difusión Sending o Scheduled y elimina todo lo que esté en cola.

curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/pause?apiKey=YOUR_API_KEY"

Pausar una transmisión Pending Approval la devuelve a Draft en su lugar; aún no se había programado nada, por lo que no hay nada que reanudar. Cualquier otro estado devuelve 400.

POST /broadcasts/{broadcastId}/resume reinicia una transmisión Paused:

curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/resume?apiKey=YOUR_API_KEY"

Respuesta (200)

{ "success": true, "broadcast_id": "bcd123abc456" }

Se reanuda en Sending, o vuelve a Scheduled si su execution_date sigue estando en el futuro. Solo se puede reanudar una transmisión Paused.


Seguir enviando después de una pausa por baja interacción

POST /broadcasts/{broadcastId}/override-engagement-guard

Mientras una transmisión se envía por lotes, medimos cuántas personas respondieron a cada lote antes de iniciar el siguiente. Si casi nadie responde, la transmisión se pausa automáticamente: un envío que sigue insistiendo en el silencio es la forma más rápida de que un número sea filtrado o bloqueado. Es el botón Continuar de todos modos en el panel de control.

Debido a que la tasa de respuesta que causó la pausa no puede cambiar mientras la transmisión está detenida, un resume simple volvería a ser pausado en la siguiente comprobación. Este endpoint es la decisión de continuar de todos modos: registra la anulación en esa transmisión y levanta la pausa en la misma llamada si la transmisión se pausó por baja interacción.

curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/override-engagement-guard?apiKey=YOUR_API_KEY"

Respuesta (200)

{ "success": true, "broadcast_id": "bcd123abc456", "status": "Sending", "resumed": true }
  • resumed: true — la transmisión se pausó por baja interacción y ahora se está ejecutando de nuevo; status es donde se reanudó.
  • resumed: false — no se levantó nada, la anulación simplemente se registra para futuras comprobaciones. Eso es lo que obtienes si la transmisión nunca se pausó o se pausó por una razón diferente (la pausaste manualmente, se alcanzó un límite de envío o demasiados envíos dieron error). Esas pausas no se levantan aquí; reanúdala tú mismo una vez que hayas solucionado la causa.

La anulación se aplica solo a esta transmisión. No es una configuración de la cuenta y es seguro llamarla dos veces.


Duplicar una transmisión

POST /broadcasts/{broadcastId}/duplicate — copia la audiencia, el mensaje y la configuración en una nueva Draft. Todo lo relacionado con la ejecución anterior (contadores, lotes, programación, estadísticas de respuesta) comienza desde cero.

Campo Obligatorio Descripción
to_channel No Crea la copia en un canal diferente. Así es como envías lo mismo en dos canales; una transmisión solo tiene uno.
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/duplicate?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "to_channel": "sms" }'

Respuesta (201)

{ "success": true, "broadcast_id": "bcd999new111", "source_broadcast_id": "bcd123abc456" }

Una copia nunca hereda una aprobación de WhatsApp activa: en una copia de WhatsApp, la plantilla llega necesitando tu confirmación, y en una copia a otro canal, se elimina y el texto se convierte en el mensaje de apertura simple. Copiar a SMS también elimina cualquier archivo adjunto, ya que los SMS no pueden enviarlos.


Eliminar una transmisión

DELETE /broadcasts/{broadcastId}

curl -X DELETE "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456?apiKey=YOUR_API_KEY"

Se rechaza una difusión Sending o Scheduled con 400: póngala en pausa primero.


Difusiones que reflejan una campaña clásica

Las campañas clásicas que envían mensajes también aparecen en Difusiones, y la API las devuelve junto con las difusiones nativas (llevan un source_campaign_id). Se comportan de forma ligeramente distinta, ya que la campaña sigue estando al mando:

  • Editar la audiencia, el mensaje o la programación funciona y se aplica a la campaña.
  • El canal, el agente de respuesta, el archivo adjunto y todos los contadores de ejecución son de solo lectura aquí: 400 si intenta cambiarlos. Cámbielos en la campaña.
  • Iniciar devuelve 400 indicándole el editor de la campaña.
  • Pausar y reanudar funcionan y actúan sobre la campaña.
  • Eliminar devuelve 400: elimine la campaña en su lugar, y su entrada en Difusiones desaparecerá con ella.
  • Duplicar genera una difusión nativa independiente, que es la forma admitida de trasladar una campaña probada.

Errores

Las solicitudes fallidas devuelven {"success": false, "error": "<message>"} con estos estados:

Estado Significado
400 Algo en la solicitud o en el estado de la difusión es incorrecto: falta un campo, un archivo adjunto no es válido o se ha intentado iniciar/pausar/reanudar/eliminar algo que no está permitido en el estado actual de la difusión. El mensaje error indica el motivo.
401 Falta la clave de API o no es válida.
403 Su plan no incluye acceso a la API.
404 No existe tal difusión en su cuenta (o, en la selección de plantillas, no existe tal plantilla).
429 Límite de tasa alcanzado. Espere y vuelva a intentarlo.
500 Algo salió mal por nuestra parte. Vuelva a intentarlo tras una breve espera.

Próximos pasos

  • Guía de difusiones: el producto detrás de estos endpoints, incluyendo el ritmo y el comportamiento de seguridad
  • API de contactos: cree la lista a la que se envía una difusión
  • API de plantillas: gestione las plantillas de WhatsApp aprobadas que puede seleccionar
  • API de webhooks: suscríbase a Broadcast Started y Broadcast Completed en lugar de realizar sondeos