{"id":280,"date":"2026-10-25T13:05:09","date_gmt":"2026-10-25T13:05:09","guid":{"rendered":"https:\/\/vectalk.com.br\/blog\/enviar-mensaje-api-whatsapp-ejemplos\/"},"modified":"2026-10-25T13:05:19","modified_gmt":"2026-10-25T13:05:19","slug":"enviar-mensaje-api-whatsapp-ejemplos","status":"publish","type":"post","link":"https:\/\/vectalk.com.br\/blog\/es\/enviar-mensaje-api-whatsapp-ejemplos\/","title":{"rendered":"C\u00f3mo enviar un mensaje con la API de WhatsApp: ejemplos en cURL, Node.js y Python"},"content":{"rendered":"\n<p><em>Actualizado el 25\/10\/2026<\/em><\/p>\n\n\n\n<p>Para enviar un mensaje con la API oficial de WhatsApp, haz un <code>POST<\/code> a <code>https:\/\/graph.facebook.com\/v26.0\/&lt;PHONE_NUMBER_ID&gt;\/messages<\/code> con el token en el encabezado <code>Authorization<\/code> y un JSON con <code>messaging_product<\/code>, <code>to<\/code>, <code>type<\/code> y el contenido. El texto libre solo se puede enviar dentro de la ventana de 24 horas que abre el cliente; fuera de ella, necesitas una plantilla aprobada. La respuesta 200 indica que Meta acept\u00f3 la solicitud, y la entrega se confirma despu\u00e9s, por webhook.<\/p>\n\n\n\n<p>A continuaci\u00f3n tienes ejemplos para copiar de texto y plantilla en cURL, Node.js y Python, la misma llamada con Vectalk y una tabla con los errores que m\u00e1s aparecen en el primer env\u00edo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Qu\u00e9 necesitas antes<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>El <strong>Phone Number ID<\/strong> del n\u00famero que va a enviar. No es el n\u00famero en s\u00ed; es el ID que Meta genera para \u00e9l. Mira el <a href=\"https:\/\/vectalk.com.br\/blog\/es\/glosario-api-whatsapp\/\">glosario de la API<\/a>.<\/li>\n\n\n<li>Un <strong>token de acceso<\/strong> con el permiso <code>whatsapp_business_messaging<\/code>. Para producci\u00f3n, usa un token de usuario del sistema, como en <a href=\"https:\/\/vectalk.com.br\/blog\/es\/token-permanente-api-whatsapp-es\/\">token permanente<\/a>.<\/li>\n\n\n<li>El <strong>n\u00famero del destinatario<\/strong> con <code>+<\/code> y c\u00f3digo de pa\u00eds, por ejemplo <code>+5215512345678<\/code>.<\/li>\n\n\n<li>Una <strong>plantilla aprobada<\/strong>, si el cliente no escribi\u00f3 en las \u00faltimas 24 horas.<\/li>\n\n<\/ul>\n\n\n\n<p>Sobre el formato del n\u00famero: la <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/messages\/send-messages\" target=\"_blank\" rel=\"noreferrer noopener\">documentaci\u00f3n de env\u00edo<\/a> recomienda incluir siempre el <code>+<\/code> y el c\u00f3digo de pa\u00eds. Sin el <code>+<\/code>, Meta antepone el c\u00f3digo de pa\u00eds de tu n\u00famero comercial, lo que puede mandar el mensaje a la persona equivocada. La misma p\u00e1gina aclara que, para Brasil y M\u00e9xico, la API puede ajustar el prefijo del n\u00famero, y que eso es el comportamiento esperado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Estructura del payload<\/h2>\n\n\n\n<p>Todos los env\u00edos usan el mismo endpoint. Lo que cambia es el <code>type<\/code> y el objeto con el mismo nombre:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Campo<\/th><th>Obligatorio<\/th><th>Valor<\/th><\/tr><\/thead><tbody><tr><td><code>messaging_product<\/code><\/td><td>S\u00ed<\/td><td>Siempre <code>\"whatsapp\"<\/code><\/td><\/tr><tr><td><code>recipient_type<\/code><\/td><td>No<\/td><td><code>\"individual\"<\/code> (por defecto) o <code>\"group\"<\/code><\/td><\/tr><tr><td><code>to<\/code><\/td><td>S\u00ed<\/td><td>N\u00famero del destinatario, de preferencia con <code>+<\/code><\/td><\/tr><tr><td><code>type<\/code><\/td><td>S\u00ed<\/td><td><code>text<\/code>, <code>template<\/code>, <code>image<\/code>, <code>document<\/code>, <code>interactive<\/code>, etc.<\/td><\/tr><tr><td><code>&lt;type&gt;<\/code><\/td><td>S\u00ed<\/td><td>Objeto con el contenido, por ejemplo <code>text: { body }<\/code><\/td><\/tr><tr><td><code>context.message_id<\/code><\/td><td>No<\/td><td><code>wamid<\/code> de un mensaje del cliente, para responder cit\u00e1ndolo<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Enviar texto<\/h2>\n\n\n\n<p>Un mensaje de texto es un mensaje de servicio: solo funciona con la ventana de atenci\u00f3n abierta. El cuerpo acepta hasta 4.096 caracteres, y <code>preview_url: true<\/code> le pide a WhatsApp que muestre la vista previa del primer enlace (<a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/messages\/text-messages\" target=\"_blank\" rel=\"noreferrer noopener\">text messages<\/a>).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">cURL<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-bash\">curl 'https:\/\/graph.facebook.com\/v26.0\/TU_PHONE_NUMBER_ID\/messages' \\\n  -H 'Content-Type: application\/json' \\\n  -H 'Authorization: Bearer TU_TOKEN' \\\n  -d '{\n    \"messaging_product\": \"whatsapp\",\n    \"recipient_type\": \"individual\",\n    \"to\": \"+5215512345678\",\n    \"type\": \"text\",\n    \"text\": {\n      \"preview_url\": true,\n      \"body\": \"Tu pedido fue enviado. S\u00edguelo en https:\/\/ejemplo.com\/seguimiento\/123\"\n    }\n  }'<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Node.js (18 o superior)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-js\">const PHONE_NUMBER_ID = process.env.WA_PHONE_NUMBER_ID;\nconst TOKEN = process.env.WA_TOKEN;\n\nasync function enviarTexto(para, texto) {\n  const r = await fetch(`https:\/\/graph.facebook.com\/v26.0\/${PHONE_NUMBER_ID}\/messages`, {\n    method: 'POST',\n    headers: { Authorization: `Bearer ${TOKEN}`, 'Content-Type': 'application\/json' },\n    body: JSON.stringify({\n      messaging_product: 'whatsapp',\n      to: para,\n      type: 'text',\n      text: { body: texto },\n    }),\n  });\n  const cuerpo = await r.json();\n  if (!r.ok) throw new Error(`${cuerpo.error?.code}: ${cuerpo.error?.message}`);\n  return cuerpo.messages[0].id; \/\/ wamid\n}\n\nenviarTexto('+5215512345678', '\u00a1Hola! Recibimos tu mensaje.').then(console.log);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Python<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-python\">import os\nimport requests\n\nPHONE_NUMBER_ID = os.environ[\"WA_PHONE_NUMBER_ID\"]\nTOKEN = os.environ[\"WA_TOKEN\"]\n\ndef enviar_texto(para: str, texto: str) -&gt; str:\n    r = requests.post(\n        f\"https:\/\/graph.facebook.com\/v26.0\/{PHONE_NUMBER_ID}\/messages\",\n        headers={\"Authorization\": f\"Bearer {TOKEN}\"},\n        json={\n            \"messaging_product\": \"whatsapp\",\n            \"to\": para,\n            \"type\": \"text\",\n            \"text\": {\"body\": texto},\n        },\n        timeout=15,\n    )\n    cuerpo = r.json()\n    if not r.ok:\n        raise RuntimeError(f\"{cuerpo['error']['code']}: {cuerpo['error']['message']}\")\n    return cuerpo[\"messages\"][0][\"id\"]  # wamid\n\nprint(enviar_texto(\"+5215512345678\", \"\u00a1Hola! Recibimos tu mensaje.\"))<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Enviar una plantilla<\/h2>\n\n\n\n<p>La plantilla es lo que permite iniciar la conversaci\u00f3n. Debe tener estado <code>APPROVED<\/code>, y tienes que indicar el nombre y el c\u00f3digo de idioma exactos con los que se cre\u00f3. Su categor\u00eda (marketing, utilidad o autenticaci\u00f3n) se defini\u00f3 al crearla y determina el precio; el tema est\u00e1 en <a href=\"https:\/\/vectalk.com.br\/blog\/es\/categorias-plantillas-whatsapp\/\">categor\u00edas de plantilla<\/a>.<\/p>\n\n\n\n<p>Sup\u00f3n una plantilla de utilidad <code>confirmacion_pedido<\/code> con el cuerpo &#8220;\u00a1Hola, {{1}}! Tu pedido {{2}} fue confirmado.&#8221;:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">cURL<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-bash\">curl 'https:\/\/graph.facebook.com\/v26.0\/TU_PHONE_NUMBER_ID\/messages' \\\n  -H 'Content-Type: application\/json' \\\n  -H 'Authorization: Bearer TU_TOKEN' \\\n  -d '{\n    \"messaging_product\": \"whatsapp\",\n    \"to\": \"+5215512345678\",\n    \"type\": \"template\",\n    \"template\": {\n      \"name\": \"confirmacion_pedido\",\n      \"language\": { \"code\": \"es_MX\" },\n      \"components\": [\n        {\n          \"type\": \"body\",\n          \"parameters\": [\n            { \"type\": \"text\", \"text\": \"Mar\u00eda\" },\n            { \"type\": \"text\", \"text\": \"#12345\" }\n          ]\n        }\n      ]\n    }\n  }'<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Node.js<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-js\">async function enviarPlantilla(para, nombre, variables, idioma = 'es_MX') {\n  const r = await fetch(`https:\/\/graph.facebook.com\/v26.0\/${PHONE_NUMBER_ID}\/messages`, {\n    method: 'POST',\n    headers: { Authorization: `Bearer ${TOKEN}`, 'Content-Type': 'application\/json' },\n    body: JSON.stringify({\n      messaging_product: 'whatsapp',\n      to: para,\n      type: 'template',\n      template: {\n        name: nombre,\n        language: { code: idioma },\n        components: [\n          { type: 'body', parameters: variables.map((v) =&gt; ({ type: 'text', text: v })) },\n        ],\n      },\n    }),\n  });\n  const cuerpo = await r.json();\n  if (!r.ok) throw new Error(`${cuerpo.error?.code}: ${cuerpo.error?.message}`);\n  return cuerpo.messages[0].id;\n}\n\nenviarPlantilla('+5215512345678', 'confirmacion_pedido', ['Mar\u00eda', '#12345']).then(console.log);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Python<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-python\">def enviar_plantilla(para: str, nombre: str, variables: list[str], idioma: str = \"es_MX\") -&gt; str:\n    r = requests.post(\n        f\"https:\/\/graph.facebook.com\/v26.0\/{PHONE_NUMBER_ID}\/messages\",\n        headers={\"Authorization\": f\"Bearer {TOKEN}\"},\n        json={\n            \"messaging_product\": \"whatsapp\",\n            \"to\": para,\n            \"type\": \"template\",\n            \"template\": {\n                \"name\": nombre,\n                \"language\": {\"code\": idioma},\n                \"components\": [\n                    {\"type\": \"body\", \"parameters\": [{\"type\": \"text\", \"text\": v} for v in variables]}\n                ],\n            },\n        },\n        timeout=15,\n    )\n    cuerpo = r.json()\n    if not r.ok:\n        raise RuntimeError(f\"{cuerpo['error']['code']}: {cuerpo['error']['message']}\")\n    return cuerpo[\"messages\"][0][\"id\"]\n\nprint(enviar_plantilla(\"+5215512345678\", \"confirmacion_pedido\", [\"Mar\u00eda\", \"#12345\"]))<\/code><\/pre>\n\n\n\n<p>Si la plantilla se cre\u00f3 con <strong>par\u00e1metros con nombre<\/strong> (<code>{{nombre_cliente}}<\/code>), cada par\u00e1metro lleva tambi\u00e9n <code>parameter_name<\/code>, y el orden deja de importar (<a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/templates\/overview\" target=\"_blank\" rel=\"noreferrer noopener\">templates<\/a>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-json\">{ \"type\": \"text\", \"parameter_name\": \"nombre_cliente\", \"text\": \"Mar\u00eda\" }<\/code><\/pre>\n\n\n\n<p>Para plantillas con imagen, documento o video en el encabezado, agrega un componente <code>header<\/code> con el archivo. El env\u00edo de multimedia est\u00e1 en <a href=\"https:\/\/vectalk.com.br\/blog\/es\/enviar-multimedia-api-whatsapp\/\">c\u00f3mo enviar im\u00e1genes, PDF, audio y video<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Qu\u00e9 devuelve la API<\/h2>\n\n\n\n<p>Cuando Meta acepta la solicitud, la respuesta es esta:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-json\">{\n  \"messaging_product\": \"whatsapp\",\n  \"contacts\": [{ \"input\": \"+5215512345678\", \"wa_id\": \"5215512345678\" }],\n  \"messages\": [{ \"id\": \"wamid.HBgNNTIxNTUxMjM0NTY3OBUCABEYEg...\" }]\n}<\/code><\/pre>\n\n\n\n<p>Tres cuidados:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Guarda el <code>wamid<\/code>.<\/strong> Es el que aparece en los webhooks de estado <code>sent<\/code>, <code>delivered<\/code>, <code>read<\/code> y <code>failed<\/code>. Mira <a href=\"https:\/\/vectalk.com.br\/blog\/es\/estado-mensaje-webhook-whatsapp\/\">estados de mensaje por webhook<\/a>.<\/li>\n\n\n<li><strong>200 no es entrega.<\/strong> Errores como el l\u00edmite de marketing por usuario llegan despu\u00e9s, en el webhook, con estado <code>failed<\/code>.<\/li>\n\n\n<li><strong>El orden no est\u00e1 garantizado.<\/strong> Si env\u00edas varios mensajes seguidos, Meta no garantiza que lleguen en el orden de las solicitudes. Para asegurar la secuencia, espera el estado <code>delivered<\/code> de uno antes de enviar el siguiente.<\/li>\n\n<\/ol>\n\n\n\n<p>Meta intenta entregar el mensaje durante hasta 30 d\u00edas (10 minutos para plantillas de autenticaci\u00f3n). Si el estado <code>delivered<\/code> no llega en ese plazo, considera el mensaje descartado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Errores m\u00e1s comunes en el primer env\u00edo<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>C\u00f3digo<\/th><th>Qu\u00e9 significa<\/th><th>C\u00f3mo resolverlo<\/th><\/tr><\/thead><tbody><tr><td><code>131047<\/code><\/td><td>Pasaron m\u00e1s de 24 horas desde el \u00faltimo mensaje del cliente<\/td><td>Env\u00eda una plantilla<\/td><\/tr><tr><td><code>132001<\/code><\/td><td>La plantilla no existe en ese idioma o no est\u00e1 aprobada<\/td><td>Revisa nombre, c\u00f3digo de idioma y estado<\/td><\/tr><tr><td><code>132000<\/code><\/td><td>La cantidad de variables no coincide con la plantilla<\/td><td>Env\u00eda un valor por cada variable<\/td><\/tr><tr><td><code>132012<\/code><\/td><td>Variables con formato incorrecto<\/td><td>Usa el formato de la plantilla (posicional o con nombre)<\/td><\/tr><tr><td><code>131026<\/code><\/td><td>No se pudo entregar (n\u00famero sin WhatsApp, versi\u00f3n antigua, t\u00e9rminos no aceptados)<\/td><td>Confirma el n\u00famero con el cliente<\/td><\/tr><tr><td><code>130429<\/code><\/td><td>Se alcanz\u00f3 el l\u00edmite de mensajes por segundo<\/td><td>Baja el ritmo y reintenta con espera creciente<\/td><\/tr><tr><td><code>131056<\/code><\/td><td>Demasiados mensajes al mismo destinatario en poco tiempo<\/td><td>Espera antes de volver a escribir a ese n\u00famero<\/td><\/tr><tr><td><code>133010<\/code><\/td><td>N\u00famero comercial no registrado en la plataforma<\/td><td>Registra el n\u00famero<\/td><\/tr><tr><td><code>190<\/code><\/td><td>Token vencido<\/td><td>Genera un nuevo token de usuario del sistema<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Fuente: <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/support\/error-codes\" target=\"_blank\" rel=\"noreferrer noopener\">c\u00f3digos de error de Meta<\/a>. La lista completa, con causas y soluciones, est\u00e1 en <a href=\"https:\/\/vectalk.com.br\/blog\/es\/errores-api-whatsapp\/\">errores de la API de WhatsApp<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Buenas pr\u00e1cticas para el c\u00f3digo de env\u00edo<\/h2>\n\n\n\n<p>Los ejemplos de arriba son lo m\u00ednimo para que el mensaje salga. En producci\u00f3n, algunos cuidados evitan mensajes duplicados, costos innecesarios y problemas de calidad:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Registra cada env\u00edo antes de llamar a la API.<\/strong> Guarda la solicitud con un ID interno y, tras la respuesta, el <code>wamid<\/code>. Si el proceso se cae a mitad de camino, sabes qu\u00e9 ya sali\u00f3 y no lo reenv\u00edas.<\/li>\n\n\n<li><strong>Reintenta solo lo que vale la pena.<\/strong> Reintenta con espera creciente en <code>130429<\/code>, <code>131056<\/code> y fallas de red o HTTP 5xx. Los errores de par\u00e1metros (<code>132000<\/code>, <code>132012<\/code>) y de plantilla (<code>132001<\/code>) no mejoran al reintentar: corrige el payload.<\/li>\n\n\n<li><strong>Respeta el l\u00edmite de marketing por usuario.<\/strong> Meta indica esperar al menos 24 horas antes de reenviar una plantilla que volvi\u00f3 con <code>131049<\/code>.<\/li>\n\n\n<li><strong>Define un timeout en las llamadas.<\/strong> Una solicitud sin timeout puede trabar toda la cola si la red falla.<\/li>\n\n\n<li><strong>No expongas el token.<\/strong> L\u00e9elo de una variable de entorno o de un gestor de secretos y nunca lo pongas en el front-end ni en el repositorio.<\/li>\n\n\n<li><strong>Valida el n\u00famero antes.<\/strong> Normaliza los n\u00fameros a formato internacional con <code>+<\/code> al registrarlos, no al momento del env\u00edo.<\/li>\n\n\n<li><strong>Marca como le\u00eddo.<\/strong> Al procesar el mensaje del cliente, puedes marcarlo como le\u00eddo por la API, lo que le muestra los dos tildes azules.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">El mismo env\u00edo con Vectalk<\/h2>\n\n\n\n<p>Vectalk es un proxy de la WhatsApp Cloud API oficial. Los payloads son id\u00e9nticos a los de Meta; solo cambian la URL base y el token, seg\u00fan la <a href=\"https:\/\/docs.vectalk.com.br\/introduction\">introducci\u00f3n de la documentaci\u00f3n<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th><\/th><th>Meta (directo)<\/th><th>Vectalk<\/th><\/tr><\/thead><tbody><tr><td>URL de env\u00edo<\/td><td><code>https:\/\/graph.facebook.com\/v26.0\/&lt;PHONE_NUMBER_ID&gt;\/messages<\/code><\/td><td><code>https:\/\/apis.vectalk.com.br\/api\/messages<\/code><\/td><\/tr><tr><td>Token<\/td><td>Token de Meta (usuario del sistema)<\/td><td>Token generado en Vectalk<\/td><\/tr><tr><td>Phone Number ID<\/td><td>En la URL<\/td><td>Lo resuelve el token de instancia, o va en el cuerpo con token de organizaci\u00f3n<\/td><\/tr><tr><td>Payload y respuesta<\/td><td>Formato de Meta<\/td><td>Iguales<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Con un <strong>token de instancia<\/strong>, el n\u00famero se resuelve autom\u00e1ticamente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-bash\">curl -X POST https:\/\/apis.vectalk.com.br\/api\/messages \\\n  -H \"Authorization: Bearer TU_TOKEN_VECTALK\" \\\n  -H \"Content-Type: application\/json\" \\\n  -d '{\n    \"messaging_product\": \"whatsapp\",\n    \"to\": \"5215512345678\",\n    \"type\": \"template\",\n    \"template\": {\n      \"name\": \"confirmacion_pedido\",\n      \"language\": { \"code\": \"es_MX\" },\n      \"components\": [\n        { \"type\": \"body\", \"parameters\": [\n          { \"type\": \"text\", \"text\": \"Mar\u00eda\" },\n          { \"type\": \"text\", \"text\": \"#12345\" }\n        ] }\n      ]\n    }\n  }'<\/code><\/pre>\n\n\n\n<p>Con un <strong>token de organizaci\u00f3n<\/strong>, que accede a todas tus instancias, incluye el <code>phone_number_id<\/code> en el cuerpo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-python\">import os\nimport requests\n\nr = requests.post(\n    \"https:\/\/apis.vectalk.com.br\/api\/messages\",\n    headers={\"Authorization\": f\"Bearer {os.environ['VECTALK_TOKEN']}\"},\n    json={\n        \"messaging_product\": \"whatsapp\",\n        \"phone_number_id\": \"1234567890\",\n        \"to\": \"5215512345678\",\n        \"type\": \"text\",\n        \"text\": {\"body\": \"\u00a1Hola! Recibimos tu mensaje.\"},\n    },\n    timeout=15,\n)\nprint(r.json()[\"messages\"][0][\"id\"])<\/code><\/pre>\n\n\n\n<p>Cada tipo de mensaje est\u00e1 documentado en <a href=\"https:\/\/docs.vectalk.com.br\/api-reference\/messages\/send\">Mensajes<\/a>, y los tipos de token en <a href=\"https:\/\/docs.vectalk.com.br\/authentication\">Autenticaci\u00f3n<\/a>. Para generar tu token, <a href=\"https:\/\/apps.vectalk.com.br\/register\">crea tu cuenta<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Preguntas frecuentes<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfPuedo enviar texto a alguien que nunca me escribi\u00f3?<\/h3>\n\n\n\n<p>No. Fuera de la ventana de 24 horas, incluso para quien nunca escribi\u00f3, solo se pueden enviar plantillas aprobadas. La API devuelve el error <code>131047<\/code> si intentas mandar texto libre. Y, seg\u00fan la pol\u00edtica de WhatsApp, la persona debe haber dado su opt-in.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">La API respondi\u00f3 200, pero el mensaje no lleg\u00f3. \u00bfPor qu\u00e9?<\/h3>\n\n\n\n<p>El 200 solo confirma que Meta acept\u00f3 la solicitud. La entrega se informa en el webhook de estado. Si llega <code>failed<\/code>, el c\u00f3digo de error explica el motivo, como <code>131049<\/code> (l\u00edmite de marketing por usuario) o <code>131026<\/code> (n\u00famero sin WhatsApp).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfQu\u00e9 versi\u00f3n de Graph API debo usar?<\/h3>\n\n\n\n<p>Los ejemplos de la documentaci\u00f3n actual de Meta usan la v26.0. Fija la versi\u00f3n en la URL y revisa el changelog de Meta antes de actualizar, porque cada versi\u00f3n tiene fecha de baja.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfC\u00f3mo env\u00edo a muchos contactos a la vez?<\/h3>\n\n\n\n<p>No existe un endpoint de env\u00edo por lotes: cada mensaje es una llamada. Controla el ritmo, respeta el l\u00edmite de mensajes del portafolio y maneja el error <code>130429<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfC\u00f3mo respondo citando el mensaje del cliente?<\/h3>\n\n\n\n<p>Incluye <code>\"context\": { \"message_id\": \"&lt;wamid del mensaje del cliente&gt;\" }<\/code> en el payload. La respuesta aparece en WhatsApp como una cita del mensaje original.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Fuentes oficiales consultadas el 25\/10\/2026:<\/strong> <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/messages\/send-messages\" target=\"_blank\" rel=\"noreferrer noopener\">Send messages (service messages)<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/messages\/text-messages\" target=\"_blank\" rel=\"noreferrer noopener\">Text messages<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/templates\/overview\" target=\"_blank\" rel=\"noreferrer noopener\">Templates<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/support\/error-codes\" target=\"_blank\" rel=\"noreferrer noopener\">Error codes<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/webhooks\/reference\/messages\/status\" target=\"_blank\" rel=\"noreferrer noopener\">Status webhook<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/access-tokens\" target=\"_blank\" rel=\"noreferrer noopener\">Access tokens<\/a>, documentaci\u00f3n de Vectalk: <a href=\"https:\/\/docs.vectalk.com.br\/introduction\">introducci\u00f3n<\/a>, <a href=\"https:\/\/docs.vectalk.com.br\/api-reference\/messages\/send\">mensajes<\/a> y <a href=\"https:\/\/docs.vectalk.com.br\/authentication\">autenticaci\u00f3n<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ejemplos listos para enviar texto y plantillas con la API oficial de WhatsApp en cURL, Node.js y Python, directo con Meta o con Vectalk, y los errores comunes.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[12],"tags":[],"class_list":["post-280","post","type-post","status-publish","format-standard","hentry","category-uncategorized-es"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Enviar mensajes con la API de WhatsApp: ejemplos | Vectalk<\/title>\n<meta name=\"description\" content=\"C\u00f3mo enviar un mensaje con la API de WhatsApp: payload, texto y plantilla con ejemplos en cURL, Node.js y Python, respuesta, wamid y errores comunes.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vectalk.com.br\/blog\/es\/enviar-mensaje-api-whatsapp-ejemplos\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Enviar mensajes con la API de WhatsApp: ejemplos | Vectalk\" \/>\n<meta property=\"og:description\" content=\"C\u00f3mo enviar un mensaje con la API de WhatsApp: payload, texto y plantilla con ejemplos en cURL, Node.js y Python, respuesta, wamid y errores comunes.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vectalk.com.br\/blog\/es\/enviar-mensaje-api-whatsapp-ejemplos\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog Vectalk\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-25T13:05:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-25T13:05:19+00:00\" \/>\n<meta name=\"author\" content=\"wanderleyfcunha\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"wanderleyfcunha\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/es\\\/enviar-mensaje-api-whatsapp-ejemplos\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/es\\\/enviar-mensaje-api-whatsapp-ejemplos\\\/\"},\"author\":{\"name\":\"wanderleyfcunha\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/ff36ecd9d8257856f227f8e5d639db2b\"},\"headline\":\"C\u00f3mo enviar un mensaje con la API de WhatsApp: ejemplos en cURL, Node.js y Python\",\"datePublished\":\"2026-10-25T13:05:09+00:00\",\"dateModified\":\"2026-10-25T13:05:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/es\\\/enviar-mensaje-api-whatsapp-ejemplos\\\/\"},\"wordCount\":1417,\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/es\\\/enviar-mensaje-api-whatsapp-ejemplos\\\/\",\"url\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/es\\\/enviar-mensaje-api-whatsapp-ejemplos\\\/\",\"name\":\"Enviar mensajes con la API de WhatsApp: ejemplos | Vectalk\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#website\"},\"datePublished\":\"2026-10-25T13:05:09+00:00\",\"dateModified\":\"2026-10-25T13:05:19+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/ff36ecd9d8257856f227f8e5d639db2b\"},\"description\":\"C\u00f3mo enviar un mensaje con la API de WhatsApp: payload, texto y plantilla con ejemplos en cURL, Node.js y Python, respuesta, wamid y errores comunes.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/es\\\/enviar-mensaje-api-whatsapp-ejemplos\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/es\\\/enviar-mensaje-api-whatsapp-ejemplos\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/es\\\/enviar-mensaje-api-whatsapp-ejemplos\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C\u00f3mo enviar un mensaje con la API de WhatsApp: ejemplos en cURL, Node.js y Python\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/\",\"name\":\"Blog Vectalk\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/ff36ecd9d8257856f227f8e5d639db2b\",\"name\":\"wanderleyfcunha\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g\",\"caption\":\"wanderleyfcunha\"},\"sameAs\":[\"https:\\\/\\\/vectalk.com.br\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Enviar mensajes con la API de WhatsApp: ejemplos | Vectalk","description":"C\u00f3mo enviar un mensaje con la API de WhatsApp: payload, texto y plantilla con ejemplos en cURL, Node.js y Python, respuesta, wamid y errores comunes.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vectalk.com.br\/blog\/es\/enviar-mensaje-api-whatsapp-ejemplos\/","og_locale":"en_US","og_type":"article","og_title":"Enviar mensajes con la API de WhatsApp: ejemplos | Vectalk","og_description":"C\u00f3mo enviar un mensaje con la API de WhatsApp: payload, texto y plantilla con ejemplos en cURL, Node.js y Python, respuesta, wamid y errores comunes.","og_url":"https:\/\/vectalk.com.br\/blog\/es\/enviar-mensaje-api-whatsapp-ejemplos\/","og_site_name":"Blog Vectalk","article_published_time":"2026-10-25T13:05:09+00:00","article_modified_time":"2026-10-25T13:05:19+00:00","author":"wanderleyfcunha","twitter_card":"summary_large_image","twitter_misc":{"Written by":"wanderleyfcunha","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vectalk.com.br\/blog\/es\/enviar-mensaje-api-whatsapp-ejemplos\/#article","isPartOf":{"@id":"https:\/\/vectalk.com.br\/blog\/es\/enviar-mensaje-api-whatsapp-ejemplos\/"},"author":{"name":"wanderleyfcunha","@id":"https:\/\/vectalk.com.br\/blog\/#\/schema\/person\/ff36ecd9d8257856f227f8e5d639db2b"},"headline":"C\u00f3mo enviar un mensaje con la API de WhatsApp: ejemplos en cURL, Node.js y Python","datePublished":"2026-10-25T13:05:09+00:00","dateModified":"2026-10-25T13:05:19+00:00","mainEntityOfPage":{"@id":"https:\/\/vectalk.com.br\/blog\/es\/enviar-mensaje-api-whatsapp-ejemplos\/"},"wordCount":1417,"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/vectalk.com.br\/blog\/es\/enviar-mensaje-api-whatsapp-ejemplos\/","url":"https:\/\/vectalk.com.br\/blog\/es\/enviar-mensaje-api-whatsapp-ejemplos\/","name":"Enviar mensajes con la API de WhatsApp: ejemplos | Vectalk","isPartOf":{"@id":"https:\/\/vectalk.com.br\/blog\/#website"},"datePublished":"2026-10-25T13:05:09+00:00","dateModified":"2026-10-25T13:05:19+00:00","author":{"@id":"https:\/\/vectalk.com.br\/blog\/#\/schema\/person\/ff36ecd9d8257856f227f8e5d639db2b"},"description":"C\u00f3mo enviar un mensaje con la API de WhatsApp: payload, texto y plantilla con ejemplos en cURL, Node.js y Python, respuesta, wamid y errores comunes.","breadcrumb":{"@id":"https:\/\/vectalk.com.br\/blog\/es\/enviar-mensaje-api-whatsapp-ejemplos\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vectalk.com.br\/blog\/es\/enviar-mensaje-api-whatsapp-ejemplos\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/vectalk.com.br\/blog\/es\/enviar-mensaje-api-whatsapp-ejemplos\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vectalk.com.br\/blog\/"},{"@type":"ListItem","position":2,"name":"C\u00f3mo enviar un mensaje con la API de WhatsApp: ejemplos en cURL, Node.js y Python"}]},{"@type":"WebSite","@id":"https:\/\/vectalk.com.br\/blog\/#website","url":"https:\/\/vectalk.com.br\/blog\/","name":"Blog Vectalk","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vectalk.com.br\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/vectalk.com.br\/blog\/#\/schema\/person\/ff36ecd9d8257856f227f8e5d639db2b","name":"wanderleyfcunha","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g","caption":"wanderleyfcunha"},"sameAs":["https:\/\/vectalk.com.br\/blog"]}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts\/280","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/comments?post=280"}],"version-history":[{"count":1,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts\/280\/revisions"}],"predecessor-version":[{"id":283,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts\/280\/revisions\/283"}],"wp:attachment":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/media?parent=280"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/categories?post=280"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/tags?post=280"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}