Como usar la API de WhaPlus





WhaPlus API — Documentación en castellano

WhaPlus API — Documentación en castellano

APIs

Introducción

La colección usa estas variables (placeholders) típicas:

  • {{apiBaseUrl}} → URL base de la API
  • {{vendorUid}} → identificador del vendor/proveedor
  • {{bearerToken}} → token de autenticación (Bearer)
  • {{phoneNumber}} → número destino (formato internacional)
  • {{fromPhoneNumberId}} → (opcional) ID del número origen

Autenticación

Todos los endpoints requieren Bearer Token:

Authorization: Bearer {{bearerToken}}

Nota: en varios endpoints se indica que from_phone_number_id es opcional. Si no se envía, la API usa el número por defecto.

POST Enviar mensaje

{{apiBaseUrl}}/{{vendorUid}}/contact/send-message

Body (raw JSON)

{
  // opcional: si no se proporciona el ID del número origen, se usará el número por defecto
  "from_phone_number_id": "{{fromPhoneNumberId}}",
  "phone_number": "{{phoneNumber}}",
  "message_body": "cuerpo del mensaje",

  // si quieres crear el contacto si no existe
  "contact": {
    "first_name": "Johan",
    "last_name": "Doe",
    "email": "johndoe@doamin.com",
    "country": "india",
    "language_code": "en",
    "groups": "examplegroup1,examplegroup2",
    "custom_fields": {
      "BDay": "2025-09-04"
    }
  }
}

Ejemplo cURL

curl --location -g '{{apiBaseUrl}}/{{vendorUid}}/contact/send-message' \
--header 'Authorization: Bearer {{bearerToken}}' \
--data-raw '{
  "from_phone_number_id": "{{fromPhoneNumberId}}",
  "phone_number": "{{phoneNumber}}",
  "message_body": "cuerpo del mensaje",
  "contact": {
    "first_name": "Johan",
    "last_name": "Doe",
    "email": "johndoe@doamin.com",
    "country": "india",
    "language_code": "en",
    "groups": "examplegroup1,examplegroup2",
    "custom_fields": { "BDay": "2025-09-04" }
  }
}'

POST Enviar multimedia

{{apiBaseUrl}}/{{vendorUid}}/contact/send-media-message

Body (raw JSON)

{
  // opcional: si no se proporciona el ID del número origen, se usará el número por defecto
  "from_phone_number_id": "{{fromPhoneNumberId}}",
  "phone_number": "{{phoneNumber}}",
  "media_type": "document",
  "media_url": "https://images.pexels.com/photos/276267/pexels-photo-276267.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2",
  "caption": "tu texto/caption para media_type image o video",
  "file_name": "nombre de archivo para media_type document",

  // si quieres crear el contacto si no existe
  "contact": {
    "first_name": "Johan",
    "last_name": "Doe",
    "email": "johndoe@doamin.com",
    "country": "india",
    "language_code": "en",
    "groups": "examplegroup1,examplegroup2"
  }
}

Ejemplo cURL

curl --location -g '{{apiBaseUrl}}/{{vendorUid}}/contact/send-media-message' \
--header 'Authorization: Bearer {{bearerToken}}' \
--data-raw '{
  "from_phone_number_id": "{{fromPhoneNumberId}}",
  "phone_number": "{{phoneNumber}}",
  "media_type": "document",
  "media_url": "https://images.pexels.com/photos/276267/pexels-photo-276267.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2",
  "caption": "tu texto/caption para image o video",
  "file_name": "nombre de archivo para document",
  "contact": {
    "first_name": "Johan",
    "last_name": "Doe",
    "email": "johndoe@doamin.com",
    "country": "india",
    "language_code": "en",
    "groups": "examplegroup1,examplegroup2"
  }
}'

POST Enviar mensaje de plantilla

{{apiBaseUrl}}/{{vendorUid}}/contact/send-template-message

Body (raw JSON)

{
  // opcional: si no se proporciona el ID del número origen, se usará el número por defecto
  "from_phone_number_id": "{{fromPhoneNumberId}}",
  "phone_number": "{{phoneNumber}}",
  "template_name": "your_template_name",
  "template_language": "en",

  "header_image": "https://cdn.pixabay.com/photo/2015/01/07/15/51/woman-591576_1280.jpg",
  "header_video": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4",
  "header_document": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4",
  "header_document_name": "{full_name}",
  "header_field_1": "{full_name}",

  "location_latitude": "22.22",
  "location_longitude": "22.22",
  "location_name": "{first_name}",
  "location_address": "{country}",

  "field_1": "{Age}",
  "field_2": "{full_name}",
  "field_3": "{first_name}",
  "field_4": "{last_name}",

  "button_0": "{email}",
  "button_1": "{phone_number}",
  "copy_code": "YourCode",

  // si quieres crear el contacto si no existe
  "contact": {
    "first_name": "Johan",
    "last_name": "Doe",
    "email": "johndoe@doamin.com",
    "country": "india",
    "language_code": "en",
    "groups": "examplegroup1,examplegroup2"
  }
}

Nota: incluye solo los campos que aplique tu plantilla (variables, cabeceras, ubicación, botones, etc.).

POST Crear contacto

{{apiBaseUrl}}/{{vendorUid}}/contact/create

Body (raw JSON)

{
  "phone_number": "{{phoneNumber}}",
  "first_name": "Johan",
  "last_name": "Doe",
  "email": "johndoe@doamin.com",
  "country": "india",
  "language_code": "en",
  "groups": "examplegroup1,examplegroup2",
  "custom_fields": {
    "BDay": "2025-09-01"
  }
}

POST Actualizar contacto

{{apiBaseUrl}}/{{vendorUid}}/contact/update/{{phoneNumber}}

Actualiza un contacto por número ({{phoneNumber}} en la ruta). Importante: según el comentario del ejemplo, enviar valores en blanco podría eliminar valores existentes.

Body (raw JSON)

{
  // envía solo los campos necesarios para actualizar; enviar valores en blanco puede eliminar valores existentes
  "first_name": "Johan",
  "last_name": "Doe",
  "email": "johndoe@doamin.com",
  "country": "91",
  "language_code": "mr",
  "whatsapp_opt_out": false,
  "enable_ai_bot": true,
  "groups": "examplegroup1,examplegroup9",
  "custom_fields": {
    "BDay": "2025-09-04"
  }
}

POST Enviar mensaje interactivo

{{apiBaseUrl}}/{{vendorUid}}/contact/send-interactive-message

Permite enviar mensajes interactivos con botones, CTA URL o listas.

Body (raw JSON)

{
  // opcional: si no se proporciona el ID del número origen, se usará el número por defecto
  "from_phone_number_id": "",
  "phone_number": "918856066529",

  "interactive_type": "button", // cta_url, list

  "media_link": "", // cuando header_type es image, video o document
  "header_type": "text",
  "header_text": "Cabecera de texto interactiva",
  "body_text": "Interactive bot 1",
  "footer_text": "texto de pie",

  "buttons": { // cuando interactive_type es "button"
    "1": "botón 1",
    "2": "botón 2",
    "3": "botón 3"
  },

  "cta_url": { // cuando interactive_type es "cta_url"
    "display_text": "Texto del botón CTA",
    "url": "URL del botón CTA"
  },

  "list_data": { // cuando interactive_type es "list"
    "button_text": "Etiqueta del botón de lista",
    "sections": {
      "section_1": {
        "title": "Sección 1",
        "id": "section_1",
        "rows": {
          "row_1": {
            "id": "row_1",
            "row_id": "1",
            "title": "Título fila 1",
            "description": "descripción fila 1"
          }
        }
      },
      "section_2": {
        "title": "Sección 2",
        "id": "section_2",
        "rows": {
          "row_1": {
            "id": "row_1",
            "row_id": "1",
            "title": "título fila 1",
            "description": "descripción fila 1"
          }
        }
      }
    }
  },

  // si quieres crear el contacto si no existe
  "contact": {
    "first_name": "Johan",
    "last_name": "Doe",
    "email": "johndoe@doamin.com",
    "country": "india",
    "language_code": "en",
    "groups": "examplegroup1,examplegroup2"
  }
}

Consejo: usa solo el bloque que corresponda a tu interactive_type (buttons / cta_url / list_data).

POST Asignar miembro del equipo

{{apiBaseUrl}}/{{vendorUid}}/contact/assign-team-member

Asigna un miembro del equipo (por usuario/email) a un contacto y configura flags de bots.

Body (raw JSON)

{
  // usuario o email del miembro del equipo
  "username_or_email": "916598653265",
  "phone_number": {{phoneNumber}},

  // poner 1 para true y 0 para false
  "enable_ai_bot": 1,
  "enable_reply_bot": 1
}

Ojo: el ejemplo original deja phone_number sin comillas (no es JSON estricto). En la práctica, si tu API exige JSON válido, envíalo como cadena: "phone_number": "{{phoneNumber}}".

POST Enviar carrusel (plantilla)

{{apiBaseUrl}}/{{vendorUid}}/contact/send-carousel-template-message

Body (raw JSON)

{
  // opcional: si no se indica, se usará el ID del número por defecto
  "from_phone_number_id": "669217672941135",
  "phone_number": "{{phoneNumber}}",
  "template_name": "carsoule_template_131",
  "template_language": "en_us",

  // Si el cuerpo del carrusel contiene una variable, inclúyela. Si no, omítela del payload.
  "field_1": "{Age}",
  "field_2": "{full_name}",
  "field_3": "{last_name}",

  // Se requieren mínimo 2 tarjetas, máximo 10.
  // La secuencia de tarjetas y botones se mantendrá tal cual se definió en la plantilla creada.
  "carousel_templates": [
    {
      "media_type": "IMAGE",
      "media_url": "https://cdn.pixabay.com/photo/2015/01/07/15/51/woman-591576_1280.jpg",

      // Si el cuerpo de la tarjeta contiene una variable, inclúyela. Si no, omítela.
      // Se requiere al menos 1 botón, máximo 2; los tipos de botón se pueden mezclar.
      // "body_example_fields": [
      //   "first name",
      //   "last name"
      // ],
      "button_type": [
        "QUICK_REPLY",
        "PHONE_NUMBER",
        "URL"
      ]
    },
    {
      "media_type": "IMAGE",
      "media_url": "https://cdn.pixabay.com/photo/2015/01/07/15/51/woman-591576_1280.jpg",

      // "body_example_fields": [
      //   "Address 1",
      //   "Address 2"
      // ],
      "button_type": [
        "QUICK_REPLY",
        "PHONE_NUMBER",
        "URL"
      ]
    }
  ],

  // si quieres crear el contacto si no existe
  "contact": {
    "first_name": "Johan",
    "last_name": "Doe",
    "email": "johndoe@doamin.com",
    "country": "india",
    "language_code": "en",
    "groups": "examplegroup1,examplegroup2"
  }
}

GET Contacto

{{apiBaseUrl}}/{{vendorUid}}/contact?phone_number_or_email=91XXXXXXXXX

Query params

  • phone_number_or_email → teléfono o email a consultar

Ejemplo cURL

curl --location -g '{{apiBaseUrl}}/{{vendorUid}}/contact?phone_number_or_email=91XXXXXXXXX' \
--header 'Authorization: Bearer {{bearerToken}}'

GET Contactos

{{apiBaseUrl}}/{{vendorUid}}/contacts

Query params (en la colección aparecen como opcionales/deshabilitados)

  • page → página (ej.: 2)
  • page_size → tamaño de página (ej.: 5)
  • search_term → término de búsqueda (ej.: vinod)

Ejemplo cURL

curl --location -g '{{apiBaseUrl}}/{{vendorUid}}/contacts?page=2&page_size=5&search_term=vinod' \
--header 'Authorization: Bearer {{bearerToken}}'

Comentarios

Aún no hay comentarios. ¿Por qué no comienzas el debate?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *