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 +). En canales internos puedes usar el channelId interno del chat✓
conversationIdstringNúmero de teléfono del cliente en formato E.164 sin +. En canales internos , el conversationId del chat (chat_*)✓
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; máximo 24 horas)—
scheduleTimestringFecha/hora de envío programado (ISO 8601). Máximo 30 días después de la solicitud—

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. Después puedes consultarlo, reprogramarlo o cancelarlo por messageId .

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 30 días después de la solicitud
  • Ejemplos:
    • "2026-10-15T18:40:00" — Hora de México (UTC-6)
    • "2026-10-15T18:40:00Z" — Hora UTC
    • "2026-10-15T18: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": "2026-09-20T20:00:00Z"
}

Con delay (HTTP 202):

{
  "messageId": "msg_123xyz",
  "kind": "service",
  "status": "delayed",
  "timestamp": "2026-09-20T20:00:00Z",
  "executeAt": "2026-09-20T20:00:05.000Z",
  "delayMs": 5000
}

Con scheduleTime (HTTP 202):

{
  "messageId": "msg_123xyz",
  "kind": "service",
  "status": "scheduled",
  "timestamp": "2026-09-20T20:00:00Z",
  "executeAt": "2026-10-16T00:40:00.000Z",
  "scheduledTime": "2026-10-15T18:40:00"
}
CampoTipoDescripción
messageIdstringID del mensaje creado. En envíos programados, úsalo para consultar, reprogramar o cancelar el recurso ; no necesitas campaignId ni runId
kindenumservice en las respuestas HTTP 202 de este endpoint
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

Los envíos con delay o scheduleTime quedan aceptados, pero todavía no enviados. Consulta Mensajes Programados para conocer sus estados y reglas de ejecución.

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.
  • La ventana se calcula desde el último mensaje del usuario; valida canSendDirectMessage antes de enviar.

Canales internos (chats con agentes)

POST /v1/messages también funciona sobre las conversaciones internas creadas por la API de Chat . Identifica el hilo con el conversationId del chat (chat_*) o con su channelId interno:

{
  "channelId": "workspace-ws_001-agent-agent_001",
  "conversationId": "chat_01JCHAT23456789",
  "content": "Un asesor revisará tu caso en unos minutos."
}
  • Tipos soportados: text, image, video, file, audio e instruction. Los mensajes interactive, email y las plantillas son exclusivos de canales externos y devuelven 422 en un canal interno.
  • Las instrucciones al agente (wait / resume) funcionan exactamente igual que en canales externos.
  • No hay ventana de servicio en canales internos: canSendDirectMessage siempre es true.

Matriz de compatibilidad por canal

TipoWhatsAppInstagram / FacebookInterno (Chat API)
text✓✓✓
image✓✓✓
video✓✓✓
file✓✓✓
audio✓✓✓
instruction✓✓✓
interactive (botones, listas, flows)✓——
email ¹———
Plantillas (Enviar Plantilla )✓——
Ventana de servicio24 hSegún plataformaSin ventana

¹ email solo está disponible en canales de correo conectados; en un canal interno devuelve 422.

Consultar estado

Verifica si tu mensaje fue entregado:

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