Enviar Mensaje Personalizado

Envía un mensaje a un cliente dentro de una conversación que ya está abierta. A diferencia de Enviar Plantilla — que sirve para iniciar la conversación — este endpoint asume que el cliente ya inició una conversación o respondió recientemente a una plantilla, por lo que la ventana de servicio sigue activa.

POST https://api.platica.mx/v1/messages

Cuerpo de la solicitud

{
  "channelId": "521234567890",
  "conversationId": "521234567890",
  "content": "¡Hola! ¿En qué puedo ayudarte?",
  "client": {
    "name": "José",
    "customFields": {
      "placas": "ABC123"
    }
  }
}

Parámetros del cuerpo

CampoTipoDescripciónRequerido
channelIdstringID interno del canal O número de teléfono del agente (formato E.164 sin +)
conversationIdstringNúmero de teléfono del cliente en formato E.164 sin +
contentstring | objectContenido del mensaje. Si es string, se envía como texto. Para media e interactivos, usa un objeto — ver Tipos de mensaje
typeenumtext, image, video, file, audio, interactive, email. Opcional cuando content es string
clientobjectInformación del cliente a actualizar (Upsert)
campaignIdstringID de la campaña a la que se atribuye el mensaje. Si se omite, se registra bajo la campaña api
delaynumberRetraso en milisegundos (3,000 – 86,400,000)
scheduleTimestringFecha/hora de envío programado (ISO 8601). Máximo 1 año en el futuro

Tipos de mensaje

content puede ser un texto simple o un objeto estructurado. Cuando es objeto, debes especificar type y la forma de content depende del tipo.

Texto

Forma corta:

{
  "channelId": "521234567890",
  "conversationId": "521234567890",
  "content": "¡Hola! ¿En qué puedo ayudarte?"
}

Forma explícita:

{
  "channelId": "521234567890",
  "conversationId": "521234567890",
  "type": "text",
  "content": { "text": "¡Hola! ¿En qué puedo ayudarte?" }
}

Imagen

{
  "channelId": "521234567890",
  "conversationId": "521234567890",
  "type": "image",
  "content": {
    "image": {
      "url": "https://cdn.assets.com/foto.jpg",
      "caption": "Aquí está la foto que me pediste"
    }
  }
}
CampoTipoDescripciónRequerido
content.image.urlstringURL pública https:// de la imagen
content.image.captionstringTexto que aparece debajo de la imagen

Video

{
  "channelId": "521234567890",
  "conversationId": "521234567890",
  "type": "video",
  "content": {
    "video": {
      "url": "https://cdn.assets.com/video.mp4",
      "caption": "Mira este video"
    }
  }
}
CampoTipoDescripciónRequerido
content.video.urlstringURL pública https:// del video
content.video.captionstringTexto que aparece debajo del video

Documento / archivo

{
  "channelId": "521234567890",
  "conversationId": "521234567890",
  "type": "file",
  "content": {
    "file": {
      "url": "https://cdn.assets.com/factura.pdf",
      "filename": "factura-2025-09.pdf",
      "caption": "Tu factura del mes"
    }
  }
}
CampoTipoDescripciónRequerido
content.file.urlstringURL pública https:// del archivo
content.file.filenamestringNombre con el que el cliente verá el archivo
content.file.captionstringTexto que aparece junto al archivo

Audio

{
  "channelId": "521234567890",
  "conversationId": "521234567890",
  "type": "audio",
  "content": {
    "audio": {
      "url": "https://cdn.assets.com/nota.ogg"
    }
  }
}
CampoTipoDescripciónRequerido
content.audio.urlstringURL pública https:// del audio

Mensajes interactivos

Los mensajes interactivos (botones, listas y flows) están disponibles únicamente en WhatsApp.

Hasta 3 botones por mensaje. El cliente toca uno y la API recibe la respuesta como un mensaje normal con el id del botón seleccionado.

{
  "channelId": "521234567890",
  "conversationId": "521234567890",
  "type": "interactive",
  "content": {
    "type": "button",
    "body": { "text": "¿Quieres confirmar tu cita?" },
    "action": {
      "buttons": [
        { "id": "confirmar", "title": "Sí, confirmar" },
        { "id": "reagendar", "title": "Reagendar" },
        { "id": "cancelar", "title": "Cancelar" }
      ]
    }
  }
}
CampoTipoDescripciónRequerido
content.body.textstringTexto principal del mensaje
content.headerobjectEncabezado opcional ({ type: "text", text })
content.footer.textstringTexto pequeño debajo de los botones
content.action.buttons[].idstringIdentificador del botón. Lo recibirás cuando el cliente lo toque
content.action.buttons[].titlestringTexto visible del botón (máx. 20 caracteres recomendado)

Hasta 10 filas en total, distribuidas en una o más secciones. El cliente abre la lista, toca una fila y la API recibe la respuesta con el id de la fila seleccionada.

{
  "channelId": "521234567890",
  "conversationId": "521234567890",
  "type": "interactive",
  "content": {
    "type": "list",
    "body": { "text": "Elige el horario que prefieras" },
    "action": {
      "button": "Ver horarios",
      "sections": [
        {
          "title": "Esta semana",
          "rows": [
            { "id": "lun-10", "title": "Lunes 10:00", "description": "Disponible" },
            { "id": "mar-12", "title": "Martes 12:00", "description": "Disponible" }
          ]
        }
      ]
    }
  }
}
CampoTipoDescripciónRequerido
content.body.textstringTexto principal del mensaje
content.action.buttonstringTexto del botón que abre la lista
content.action.sections[].titlestringTítulo de la sección
content.action.sections[].rows[].idstringIdentificador de la fila. Lo recibirás cuando el cliente la toque
content.action.sections[].rows[].titlestringTexto visible de la fila
content.action.sections[].rows[].descriptionstringTexto secundario debajo del título

Para enviar un Flow de WhatsApp ya publicado, indica flow_id (o flow_name) y el texto del CTA. La API genera automáticamente el flow_token y correlaciona la respuesta del cliente con el envío.

{
  "channelId": "521234567890",
  "conversationId": "521234567890",
  "type": "interactive",
  "content": {
    "type": "flow",
    "body": { "text": "Completa tu registro en menos de un minuto" },
    "action": {
      "parameters": {
        "flow_id": "1234567890",
        "flow_cta": "Empezar"
      }
    }
  }
}
CampoTipoDescripciónRequerido
content.body.textstringTexto principal del mensaje
content.action.parameters.flow_idstringID del Flow publicado en WhatsApp. Alternativa: flow_name✓¹
content.action.parameters.flow_namestringNombre del Flow publicado. Alternativa a flow_id✓¹
content.action.parameters.flow_ctastringTexto del botón que abre el Flow

¹ Debes enviar flow_id o flow_name, no es necesario ambos.

Instrucción al agente

Una instrucción no se envía al cliente: actúa sobre el agente que opera la conversación. Es útil cuando estás supervisando el chat desde la API y quieres que el agente espere o retome el control. El campo mode define el comportamiento.

{
  "channelId": "521234567890",
  "conversationId": "521234567890",
  "type": "instruction",
  "content": {
    "text": "Espera a que el cliente confirme la cita antes de continuar.",
    "mode": "wait"
  }
}
CampoTipoDescripciónRequerido
content.textstringOrden o contexto que el agente debe tener en cuenta
content.modeenumwait o resume

Comportamiento por modo

  • wait: registra la instrucción como mensaje de sistema en el historial y deja la conversación esperando al próximo mensaje del cliente. El agente no responde de inmediato; cuando entre el siguiente mensaje del cliente, leerá la instrucción como contexto.
  • resume: marca la conversación como reanudada y dispara al agente para que continúe el flujo usando la instrucción como guía. El agente puede decidir responder al cliente o no según su propia lógica.
{
  "channelId": "521234567890",
  "conversationId": "521234567890",
  "type": "instruction",
  "content": {
    "text": "Continúa con el flujo de venta y ofrece un descuento del 10%.",
    "mode": "resume"
  }
}

Programación

Igual que en Enviar Plantilla , puedes enviar el mensaje inmediatamente, con un retraso, o en una fecha específica.

Envío con retraso (delay):

  • Mínimo: 3000 ms (3 segundos)
  • Máximo: 86400000 ms (24 horas)
  • Ejemplo: "delay": 5000 envía el mensaje en 5 segundos

Envío programado (scheduleTime):

  • Formato ISO 8601
  • Debe ser una fecha futura
  • No puede ser más de 1 año en el futuro
  • Ejemplos:
    • "2025-07-01T18:40:00" — Hora de México (UTC-6)
    • "2025-07-01T18:40:00Z" — Hora UTC
    • "2025-07-01T18:40:00-06:00" — Con zona horaria específica
CampoTipoDescripción
client.namestringNombre completo del cliente
client.firstnamestringPrimer nombre
client.lastnamestringApellido
client.emailstringCorreo electrónico
client.birthdatestringFecha de nacimiento (dd/mm/yyyy)
client.genderenumGénero: male o female
client.companystringNombre de la compañía
client.countryenumCódigo ISO 3166-1 alpha-2 (ej: MX, US)
client.statestringEstado de residencia
client.citystringCiudad de residencia
client.addressstringDirección completa
client.postalCodestringCódigo postal
client.customFieldsmapObjeto con pares clave-valor de los campos personalizados definidos en el workspace. Consulta Campos Personalizados para ver los disponibles.
client.ownersarrayCorreos de usuarios responsables

Respuesta

La respuesta varía según si el mensaje se envía de forma inmediata, diferida o programada.

Envío inmediato:

{
  "messageId": "msg_123xyz",
  "status": "sent",
  "timestamp": "2025-02-14T12:00:00Z"
}

Con delay:

{
  "messageId": "msg_123xyz",
  "status": "delayed",
  "timestamp": "2025-02-14T12:00:00Z",
  "executeAt": "2025-02-14T12:00:05.000Z",
  "delayMs": 5000
}

Con scheduleTime:

{
  "messageId": "msg_123xyz",
  "status": "scheduled",
  "timestamp": "2025-02-14T12:00:00Z",
  "executeAt": "2025-07-01T00:40:00.000Z",
  "scheduledTime": "2025-07-01T18:40:00"
}
CampoTipoDescripción
messageIdstringID del mensaje creado. Úsalo para rastrear el estado en la campaña
statusenumsent, delayed o scheduled
timestampstringFecha/hora en que se procesó la solicitud (ISO 8601 UTC)
executeAtstringFecha/hora en que se enviará el mensaje (ISO 8601 UTC). Solo presente en envíos diferidos o programados
delayMsnumberRetraso configurado en milisegundos. Solo presente cuando se usó delay
scheduledTimestringValor original de scheduleTime enviado en la solicitud. Solo presente cuando se usó scheduleTime

Errores comunes

CódigoCaso
400Schema inválido, delay fuera del rango permitido, delay y scheduleTime enviados juntos, o scheduleTime inválido
404No se encontró un agente para el channelId indicado, o el cliente no tiene una conversación abierta en ese canal
422La conversación existe pero la ventana de servicio está cerrada. Envía una plantilla con Enviar Plantilla para reabrirla

Reglas por canal

WhatsApp

  • Plantillas obligatorias para iniciar conversación. Una vez que el cliente responde, la ventana de servicio queda abierta 24 horas y puedes enviar cualquier tipo de mensaje hasta que se cierre.
  • Cada mensaje del cliente reinicia la ventana.
  • Soporta texto, imágenes, videos, archivos, audio, botones, listas y flows.

Instagram y Facebook

  • Soporta texto, imágenes, videos, archivos y audio. Los mensajes interactivos (botones, listas, flows) no están disponibles fuera de WhatsApp.
  • Las plataformas pueden tener ventanas y políticas distintas a las de WhatsApp; valida siempre canSendDirectMessage antes de enviar.

Consultar estado

Verifica si tu mensaje fue entregado:

  1. Desde la bandeja de entrada de la plataforma.
  2. Usando el endpoint Obtener Conversación .