Skip to main content

Actions

The ballerinax/whatsapp.business package exposes the following client:

ClientPurpose
ClientSend text, media, location, contact, and template messages, and manage media on WhatsApp Business Cloud.

Client​

Configuration​

FieldTypeDefaultDescription
authhttp:BearerTokenConfigRequiredBearer-token authentication using a system-user or temporary access token.
apiVersionstring"v23.0"The Meta Graph API version path segment used for every request.
httpVersionhttp:HttpVersionhttp:HTTP_2_0The HTTP version understood by the client.
timeoutdecimal30The maximum time to wait (in seconds) for a response.
forwardedstring"disable"The choice of setting forwarded/x-forwarded header.
poolConfighttp:PoolConfiguration()Configurations associated with request pooling.
cachehttp:CacheConfigHTTP caching-related configurations.
compressionhttp:Compressionhttp:COMPRESSION_AUTOThe way of handling the accept-encoding header.
circuitBreakerhttp:CircuitBreakerConfig()Configurations associated with the behavior of the circuit breaker.

Initializing the client​

import ballerinax/whatsapp.business as business;

configurable string accessToken = ?;
configurable string phoneNumberId = ?;

business:Client whatsappClient = check new ({auth: {token: accessToken}});

Operations​

Messaging​

sendMessage

Sends a text, image, audio, video, document, location, or contact message.

Parameters:

NameTypeRequiredDescription
phoneNumberIdstringYesThe business phone number ID to send from.
payloadMessageYesThe message to send. A union of TextMessage, ImageMessage, AudioMessage, VideoMessage, DocumentMessage, LocationMessage, and ContactMessage.

Returns: MessageResponsePayload|Error

Sample code:

business:TextMessage message = {
to: "1XXXXXXXXXX",
text: {body: "Hello from Ballerina!"}
};

business:MessageResponsePayload response = check whatsappClient->sendMessage(phoneNumberId, message);

Sample response:

{
"messaging_product": "whatsapp",
"contacts": [{"input": "1XXXXXXXXXX", "wa_id": "1XXXXXXXXXX"}],
"messages": [{"id": "wamid.HBgLMTX..."}]
}
sendTemplateMessage

Sends a pre-approved message template.

Parameters:

NameTypeRequiredDescription
phoneNumberIdstringYesThe business phone number ID to send from.
payloadTemplateMessageYesThe template name, language, and component parameters.

Returns: MessageResponsePayload|Error

Sample code:

business:MessageResponsePayload response = check whatsappClient->sendTemplateMessage(phoneNumberId, {
to: "1XXXXXXXXXX",
template: {name: "hello_world", language: {code: "en_US"}}
});

Sample response:

{
"messaging_product": "whatsapp",
"contacts": [{"input": "1XXXXXXXXXX", "wa_id": "1XXXXXXXXXX"}],
"messages": [{"id": "wamid.HBgLMTX..."}]
}

Media​

uploadMedia

Uploads media to be referenced by ID in a subsequent message.

Parameters:

NameTypeRequiredDescription
phoneNumberIdstringYesThe business phone number ID to upload against.
payloadMediaUploadRequestYesThe file content, file name, and MIME type.

Returns: MediaUploadResponse|Error

Sample code:

import ballerina/io;

business:MediaUploadResponse uploaded = check whatsappClient->uploadMedia(phoneNumberId, {
fileContent: check io:fileReadBytes("image.jpg"),
fileName: "image.jpg",
mimeType: "image/jpeg"
});

Sample response:

{
"id": "1234567890"
}
retrieveMediaUrl

Retrieves the temporary download URL for a media object.

Parameters:

NameTypeRequiredDescription
mediaIdstringYesThe media object ID.

Returns: MediaUrlResponse|Error

Sample code:

business:MediaUrlResponse mediaInfo = check whatsappClient->retrieveMediaUrl(mediaId);

Sample response:

{
"url": "https://lookaside.fbsbx.com/whatsapp_business/attachments/...",
"id": "1234567890",
"mime_type": "image/jpeg",
"sha256": "...",
"file_size": 12345
}
downloadMedia

Downloads a media object's bytes given its media ID.

Parameters:

NameTypeRequiredDescription
mediaIdstringYesThe media object ID.

Returns: byte[]|Error

Sample code:

byte[] mediaBytes = check whatsappClient->downloadMedia(mediaId);
downloadMediaFromUrl

Downloads a media object's bytes from its signed download URL (a MediaUrlResponse.url, as returned by retrieveMediaUrl), without re-fetching the media's metadata. Use this when you already have the URL (for example, after calling retrieveMediaUrl yourself to inspect the media's MIME type or size before deciding whether to download it), to avoid the redundant retrieveMediaUrl call that downloadMedia makes internally.

Parameters:

NameTypeRequiredDescription
urlstringYesThe signed download URL from a MediaUrlResponse.url.

Returns: byte[]|Error

Sample code:

business:MediaUrlResponse mediaInfo = check whatsappClient->retrieveMediaUrl(mediaId);
byte[] mediaBytes = check whatsappClient->downloadMediaFromUrl(mediaInfo.url);
deleteMedia

Deletes a previously uploaded media object.

Parameters:

NameTypeRequiredDescription
mediaIdstringYesThe media object ID.

Returns: MediaDeleteResponse|Error

Sample code:

business:MediaDeleteResponse deleted = check whatsappClient->deleteMedia(mediaId);

Sample response:

{
"success": true
}

What's next​

  • Trigger Reference: react to inbound messages and status updates using the webhook listener.
  • Example: complete example integrations for the WhatsApp Business connector and trigger.
  • Setup Guide: create a Meta app and obtain credentials.