← Blog

·

Errores 132000 y 132012 en la API de WhatsApp: los parámetros de la plantilla no coinciden

Actualizado el 29/10/2026

El error 132000 de la API de WhatsApp significa que la cantidad de parámetros enviada no coincide con la cantidad de variables definida en la plantilla. El error 132012 es su pariente cercano: la cantidad está bien, pero el formato de algún valor no es el que la plantilla espera. Los dos se resuelven igual: leer la estructura de la plantilla aprobada y armar el payload a partir de ella, no de memoria.

Esta guía explica qué quiere decir cada error de la familia 132xxx, muestra ejemplos de payload incorrecto y corregido, y te da una función de validación para ejecutar antes de cada envío.

La familia 132xxx: qué significa cada código

Los códigos 132xxx tratan problemas con plantillas (plantillas de mensaje). La tabla de abajo resume los que más aparecen en el envío, según la tabla oficial de códigos de error de Meta:

CódigoQué dice MetaCausa más común en la práctica
132000La cantidad de parámetros enviados no coincide con la cantidad de variables de la plantillaFaltó o sobró un elemento en parameters, o quedó afuera el componente correcto (header, body, botón)
132001La plantilla no existe en el idioma pedido o no fue aprobadaNombre mal escrito, language.code distinto del aprobado (pt_BR vs. pt) o plantilla todavía en revisión
132005El texto traducido quedó demasiado largoTraducción de la plantilla incompleta o demasiado larga en el idioma enviado
132007El contenido de la plantilla viola una política de WhatsAppPlantilla rechazada o contenido enviado que infringe la política
132012Los valores de los parámetros tienen el formato incorrectoTipo de parámetro distinto del definido (texto donde va una imagen, por ejemplo) o nombre de parámetro que no existe
132015Plantilla pausada por baja calidadMuchos bloqueos o denuncias de los destinatarios
132016Plantilla desactivada definitivamente tras pausas repetidasHay que crear otra plantilla
132018Error de validación de la plantillaAlgún parámetro con problema; el detalle viene en la respuesta

Los códigos 132015 y 132016 no tienen que ver con el payload, sino con la calidad de la plantilla. Los tratamos en plantilla pausada o desactivada. Para la lista general de códigos de la API, consulta errores de la API de WhatsApp.

Cómo llega la respuesta de error

El error puede llegar de dos formas. En el caso más común, la llamada a POST /<PHONE_NUMBER_ID>/messages vuelve directamente con un status HTTP de error y un objeto error en el cuerpo. El ejemplo de abajo es ilustrativo; los campos son los del formato de error de la Graph API:

{
  "error": {
    "message": "(#132000) ...",
    "type": "OAuthException",
    "code": 132000,
    "error_data": {
      "messaging_product": "whatsapp",
      "details": "<descripción del problema, con el componente y la cantidad>"
    },
    "fbtrace_id": "A1b2C3d4E5f6"
  }
}

El campo que resuelve el problema es error_data.details. Ahí Meta describe el problema con más detalle. Registra siempre en el log el cuerpo completo de la respuesta de error, no solo el código.

El texto exacto del mensaje y de details varía; usa code para la lógica de tu sistema y details para quien vaya a depurar. En algunos casos la llamada se acepta y la falla aparece después, en el webhook de estado, con status: "failed" y el mismo código dentro de errors. El artículo sobre estado de mensajes por webhook muestra ese formato.

¿Quieres probar mientras lees? Crea tu cuenta en Vectalk y envía el primer mensaje por la API oficial. Crear cuenta gratis →

Error 132000: parámetros de más o de menos

Toma una plantilla de utilidad aprobada con este cuerpo:

{
  "type": "BODY",
  "text": "Hola {{1}}, tu pedido {{2}} salió para entrega."
}

Hay dos variables en el cuerpo. El payload de abajo envía solo una y recibe 132000:

{
  "messaging_product": "whatsapp",
  "to": "5511999999999",
  "type": "template",
  "template": {
    "name": "pedido_em_rota",
    "language": { "code": "pt_BR" },
    "components": [
      {
        "type": "body",
        "parameters": [
          { "type": "text", "text": "Maria" }
        ]
      }
    ]
  }
}

La versión correcta tiene un elemento por cada variable, en el orden en que aparecen en el texto:

{
  "messaging_product": "whatsapp",
  "to": "5511999999999",
  "type": "template",
  "template": {
    "name": "pedido_em_rota",
    "language": { "code": "pt_BR" },
    "components": [
      {
        "type": "body",
        "parameters": [
          { "type": "text", "text": "Maria" },
          { "type": "text", "text": "#4821" }
        ]
      }
    ]
  }
}

Las causas de 132000 que más vemos:

  • Plantilla editada después de escribir el código. Alguien agregó {{3}} al texto, Meta aprobó la nueva versión y el sistema sigue enviando dos valores.
  • Header o botón olvidado. Si el encabezado tiene variable (Pedido {{1}}) o el botón de URL tiene sufijo dinámico, cada uno necesita su propio componente en el payload. El encabezado de texto acepta como máximo una variable; el botón de URL también acepta una, al final de la URL.
  • Valor vacío eliminado por el código. Algunas rutinas filtran los parámetros con valor nulo antes de enviar. El resultado es un elemento de menos. Reemplaza el vacío por un texto por defecto en lugar de quitar el elemento.
  • Plantilla con el mismo nombre en otro idioma. Las versiones pt_BR y en_US de una plantilla pueden tener cantidades distintas de variables. El payload tiene que seguir la versión del idioma enviado.

Ejemplo con encabezado y botón de URL dinámico, con todos los componentes presentes:

{
  "messaging_product": "whatsapp",
  "to": "5511999999999",
  "type": "template",
  "template": {
    "name": "pedido_em_rota_rastreio",
    "language": { "code": "pt_BR" },
    "components": [
      {
        "type": "header",
        "parameters": [ { "type": "text", "text": "#4821" } ]
      },
      {
        "type": "body",
        "parameters": [
          { "type": "text", "text": "Maria" },
          { "type": "text", "text": "hoy antes de las 18 h" }
        ]
      },
      {
        "type": "button",
        "sub_type": "url",
        "index": "0",
        "parameters": [ { "type": "text", "text": "4821XYZ" } ]
      }
    ]
  }
}

En el botón, index es la posición del botón en la plantilla, empezando en cero. Meta pide que los valores con caracteres especiales en el sufijo de la URL se codifiquen (percent-encoding) antes del envío; si no, la URL generada puede fallar en la validación.

Error 132012: formato de parámetro incorrecto

El 132012 aparece cuando el valor existe, pero no tiene el formato que la plantilla definió. Dos casos explican la mayoría de las ocurrencias.

Tipo de parámetro distinto del componente

Si el encabezado de la plantilla es de imagen, el parámetro del header tiene que ser de tipo image. Enviar texto ahí da error:

{
  "type": "header",
  "parameters": [ { "type": "text", "text": "https://exemplo.com/banner.jpg" } ]
}

Correcto:

{
  "type": "header",
  "parameters": [
    { "type": "image", "image": { "link": "https://exemplo.com/banner.jpg" } }
  ]
}

La misma regla vale para encabezados de video (video), documento (document) y ubicación (location).

Parámetros nombrados vs. posicionales

Desde que Meta empezó a aceptar parámetros nombrados ({{nome_cliente}} en lugar de {{1}}), surgió otra fuente de errores. El formato se define al crear la plantilla con el campo parameter_format, que puede ser positional (por defecto) o named, según la descripción general de plantillas.

En una plantilla nombrada, cada parámetro enviado necesita el campo parameter_name igual al nombre de la variable:

{
  "type": "body",
  "parameters": [
    { "type": "text", "parameter_name": "nome_cliente", "text": "Maria" },
    { "type": "text", "parameter_name": "numero_pedido", "text": "#4821" }
  ]
}

Los errores típicos aquí son enviar la plantilla nombrada sin parameter_name, enviar un nombre que no existe (nome en lugar de nome_cliente) o usar mayúsculas, ya que Meta exige nombres en minúsculas con guion bajo. En las plantillas nombradas, el orden de los elementos no importa; en las posicionales, importa y mucho.

Los vecinos: 132001, 132005 y 132007

132001: la plantilla no existe o no está aprobada en ese idioma

Revisa tres cosas, en este orden:

  1. El nombre exacto. Los nombres de plantilla usan solo minúsculas, números y guion bajo. Pedido_em_rota y pedido_em_rota son plantillas distintas.
  2. El código de idioma. El language.code tiene que ser exactamente el que se aprobó. Portugués de Brasil es pt_BR; pt_PT es portugués de Portugal.
  3. El estado. Una plantilla PENDING, REJECTED o recién creada todavía no se puede enviar.

El motivo del rechazo y cómo corregirlo están en plantilla rechazada en WhatsApp.

132005: texto traducido demasiado largo

La tabla de Meta indica revisar en el WhatsApp Manager que la plantilla esté traducida y remite a la página de calidad de plantillas. En la práctica, abre la versión del idioma que estás enviando y confirma que exista, esté completa y respete el límite de 1.024 caracteres del cuerpo.

132007: el contenido viola la política

Aquí no sirve tocar el payload. El texto de la plantilla o el contenido enviado en las variables infringe la Política de Mensajes Comerciales. Revisa la plantilla y lo que está entrando en las variables. Usar una variable para meter texto de marketing en una plantilla de utilidad es un camino conocido hacia los problemas.

Validación antes del envío

La forma más segura de evitar 132000 y 132012 es dejar de armar el payload a mano. Obtén la estructura de la plantilla desde la API, guárdala en caché y compárala antes de enviar. El listado de plantillas de la cuenta de mensajes acepta filtro de campos, como muestra la documentación de gestión de plantillas:

curl "https://graph.facebook.com/v26.0/<WABA_ID>/message_templates?fields=name,language,status,components&name=pedido_em_rota" \
  -H "Authorization: Bearer <ACCESS_TOKEN>"

Con los componentes en mano, una función sencilla cuenta las variables de cada parte y las compara con lo que vas a enviar. Ejemplo en JavaScript:

const VAR = /\{\{\s*([a-z0-9_]+)\s*\}\}/g;

function expectedParams(template) {
  const exp = {};
  for (const c of template.components) {
    const type = c.type.toLowerCase();
    if (type === "header" && c.format && c.format !== "TEXT") {
      exp.header = { count: 1, media: c.format.toLowerCase() };
    } else if ((type === "header" || type === "body") && c.text) {
      const names = [...c.text.matchAll(VAR)].map((m) => m[1]);
      if (names.length) exp[type] = { count: names.length, names };
    } else if (type === "buttons") {
      c.buttons.forEach((b, i) => {
        if (b.type === "URL" && VAR.test(b.url)) exp[`button_${i}`] = { count: 1 };
        VAR.lastIndex = 0;
      });
    }
  }
  return exp;
}

function validate(template, components) {
  const exp = expectedParams(template);
  const named = String(template.parameter_format).toLowerCase() === "named";
  const errors = [];
  for (const [key, rule] of Object.entries(exp)) {
    const comp = components.find((c) =>
      key.startsWith("button_")
        ? c.type === "button" && String(c.index) === key.split("_")[1]
        : c.type === key
    );
    const params = comp?.parameters ?? [];
    if (params.length !== rule.count) {
      errors.push(`${key}: esperado ${rule.count}, enviado ${params.length}`);
    }
    if (rule.media && params[0]?.type !== rule.media) {
      errors.push(`${key}: se esperaba un parámetro de tipo ${rule.media}`);
    }
    if (named && rule.names) {
      for (const p of params) {
        if (!rule.names.includes(p.parameter_name)) {
          errors.push(`${key}: parameter_name inválido "${p.parameter_name}"`);
        }
      }
    }
    for (const p of params) {
      if (p.type === "text" && !String(p.text ?? "").trim()) {
        errors.push(`${key}: valor de texto vacío`);
      }
    }
  }
  return errors;
}

Si validate devuelve cualquier error, no envíes: regístralo y avisa a quien se encarga de la plantilla. Tres hábitos completan la protección:

  • Actualiza la caché cuando la plantilla cambia. El webhook message_template_status_update avisa los cambios de estado; usa el evento para recargar la estructura.
  • Versiona por nombre. En lugar de editar una plantilla en producción, crea pedido_em_rota_v2 y cambia el código y la plantilla juntos.
  • Prueba con un número interno cada plantilla nueva, antes de activar el envío automático.

Para armar payloads con multimedia, botones y carrusel desde cero, consulta cómo enviar una plantilla por la API con el JSON completo. Para crear y editar plantillas por código, consulta crear una plantilla vía API.

Cómo hacerlo con Vectalk

Vectalk es un proxy de la API oficial de WhatsApp: el payload de plantilla es el mismo de Meta, y los códigos de error también. Envías a POST https://apis.vectalk.com.br/api/messages y, con un token de instancia, el phone_number_id se resuelve solo. Para validar antes del envío, el listado GET https://apis.vectalk.com.br/api/templates?name=pedido_em_rota devuelve los componentes de la plantilla, y la misma función de arriba funciona sobre esa respuesta.

En el panel, el área de plantillas muestra el texto aprobado de cada plantilla, y los logs muestran la respuesta de error completa de cada envío, lo que ayuda a encontrar el details sin abrir el código. La referencia está en docs.vectalk.com.br, y el registro en apps.vectalk.com.br/register.

Preguntas frecuentes

¿Se cobra un mensaje con error 132000?

Meta cobra por mensaje entregado. Un mensaje rechazado con 132000 no llega al destinatario, así que no genera cobro de plantilla.

¿El 132000 puede aparecer de repente, sin que yo cambie el código?

Sí. El caso clásico es que alguien edite la plantilla en el WhatsApp Manager y agregue una variable. Cuando la nueva versión se aprueba, el payload antiguo pasa a tener parámetros de menos. Por eso conviene obtener la estructura de la plantilla por la API en lugar de dejarla fija en el código.

¿Cuál es la diferencia entre 132000 y 132012?

El 132000 es de cantidad: el número de parámetros enviados es distinto del número de variables. El 132012 es de formato: la cantidad coincide, pero algún valor no está en el formato definido en la plantilla, como texto en un encabezado de imagen o un parameter_name que no existe.

¿Puedo enviar un texto vacío en una variable?

Evítalo. Un valor vacío suele ser eliminado por las bibliotecas o rechazado por la API, y termina convirtiéndose en 132000 u otro error de validación. Usa un texto por defecto, como «cliente», cuando el dato no exista.

El error 132001 aparece aunque la plantilla esté aprobada. ¿Por qué?

Casi siempre es el idioma. La plantilla puede estar aprobada en pt_BR y el payload pedir pt_PT o en_US. También conviene verificar que la plantilla pertenezca a la misma cuenta de mensajes del número que está enviando.


Fuentes oficiales consultadas el 29/10/2026: Códigos de error (Meta), Template fundamentals: parámetros (Meta), Componentes de plantilla (Meta), Gestión de plantillas (Meta), Política de Mensajes Comerciales, Vectalk: enviar plantilla, Vectalk: listar plantillas.

Prueba hoy la API oficial de WhatsApp

Crea tu cuenta, genera el token y envía el primer mensaje con la guía de la documentación. Los mismos payloads y webhooks de la Cloud API de Meta.