WhaPlus API — Documentación en castellano
WhaPlus API — Documentación en castellano
APIs
- Introducción Variables + autenticación
- POST · Enviar mensaje /contact/send-message
- POST · Enviar multimedia /contact/send-media-message
- POST · Enviar plantilla /contact/send-template-message
- POST · Crear contacto /contact/create
- POST · Actualizar contacto /contact/update/{{phoneNumber}}
- POST · Enviar interactivo /contact/send-interactive-message
- POST · Asignar miembro del equipo /contact/assign-team-member
- POST · Enviar carrusel (plantilla) /contact/send-carousel-template-message
- GET · Contacto /contact?phone_number_or_email=
- GET · Contactos /contacts
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}}'