WhatsApp Business API SDK
Node.js connector for WhatsApp Business Cloud API, with TypeScript support.
This project offers a solution to easily interact with WhatsApp Business Cloud API with Heavy integration testing with real API calls to support implementation stability. Built with Axios and no other extra dependency!
The connector is fully typed, tested and documented!
Installation
npm install whatsapp-business
yarn add whatsapp-business
Documentation
Most methods accept JS objects. These can be populated using parameters specified by WhatsApp's API documentation or following the typescript schema.
Usage
Basic usage
import { WABAClient, WABAErrorAPI } from "whatsapp-business";
const client = new WABAClient({
accountId: "<YOUR_ACCOUNT_ID>",
apiToken: "<YOUR_API_TOKEN>",
phoneId: "<YOUR_BUSINESS_PHONE_ID>",
});
const foo = async () => {
try {
const res = await client.getBusinessPhoneNumbers();
console.log(res);
} catch (err) {
const error: WABAErrorAPI = err;
console.error(error.message);
}
};
foo();
Sending messages
You can send a text message
const sendTextMessage = async (body: string, to: string) => {
try {
const res = await client.sendMessage({ to, type: "text", text: { body } });
console.log(res);
} catch (err) {
const error: WABAErrorAPI = err;
console.error(error.message);
}
};
or an image
const sendPictureMessage = async ({ link, caption }: MediaObject, to: string) => {
try {
const res = await client.sendMessage({ to, type: "image", image: { link, caption } });
console.log(res);
} catch (err) {
const error: WABAErrorAPI = err;
console.error(error.message);
}
};
sendPictureMessage(
{ link: "<url_link_to_your_image>", caption: "<image_description>" },
"<PHONE_NUMBER>"
);
Webhooks
The webhook client will handle the subscription and setup for the webhooks. You must have an HTTPS connection and add the server URL in your application management.
For more info, checks the docs here.
import { WebhookClient, WABAClient } from "./index";
const webhookClient = new WebhookClient({
token: "<YOUR_VALIDATION_TOKEN>",
path: "/whatsapp/webhook",
port: 8080,
});
const wabaClient = new WABAClient({
accountId: "<ACCOUNT_ID>",
phoneId: "<PHONE_ID>",
apiToken: "<API_TOKEN>",
});
webhookClient.initWebhook({
onStartListening: () => {
console.log("Server started listening");
},
onTextMessageReceived: async (payload, contact) => {
try {
const messageId = payload.id.toString();
const contactNumber = contact.wa_id;
await wabaClient.markMessageAsRead(messageId);
await wabaClient.sendMessage({
to: contactNumber,
type: "reaction",
reaction: { message_id: messageId, emoji: "😄" },
});
await wabaClient.sendMessage({
type: "text",
to: contactNumber,
text: { body: "Ok!" },
context: {
message_id: messageId,
},
});
} catch (err) {
console.log(err);
}
},
});
You can also provide your own express app:
import { WebhookClient } from "./index";
import express from "express";
const myApp = express();
const webhookClient = new WebhookClient({
token: "<YOUR_VALIDATION_TOKEN>",
path: "/whatsapp/webhook",
expressApp: {
shouldStartListening: false,
app: myApp,
},
});
myApp.listen(8080, () => {
console.log("My server nows listens to whatsapp webhooks");
});
If you don't provide a express app the client will create a default app on its own, which you can later access:
import { WebhookClient } from "./index";
const webhookClient = new WebhookClient({
token: "<YOUR_VALIDATION_TOKEN>",
path: "/whatsapp/webhook",
port: 8080,
});
const app = webhookClient.expressApp.app;
app.set("trust proxy", true);
webhookClient.initWebhook({
onStartListening: () => {
console.log("Server started listening");
},
});
Support
Cloud API |
---|
- - [x] Business profiles endpoints
|
|
|
- - [x] Phone Numbers endpoints
|
- - [x] Registration endpoints
|
- - [x] Two-Step-Verification endpoints
|
Webhooks |
---|
|
- - [ ] Business Management
|
Business Management API |
---|
Currently working on |
Analytics API |
---|
Planning to add future support |
Project
Structure
This project uses typescript. Resources are stored in 2 key structures:
- src: the whole connector written in typescript
- dist the packed bundle of the project for use in nodejs environments (generated when running yarn run build).
- __tests__ all the tests for the connector
Contribution and thanks
Contributions are encouraged, I will review any incoming pull requests.
If you found this project interesting or useful, you would help so much by giving this project a star. Thank you!