A powerful WebSockets-based TypeScript library for interacting with the WhatsApp Web API
π Documentation β’ π Quick Start β’ π¬ Support β’ π€ Contributing
Warning
This project is not affiliated with WhatsApp Inc. Use responsibly and comply with WhatsApp's Terms of Service.
We strongly discourage:
- Spam messaging
- Bulk messaging
- Stalkerware usage
- Any automated abuse
Connect as secondary device Advanced multi-device support with seamless synchronization across platforms |
Multiple connection methods Support for both QR code scanning and pairing code authentication |
Buttons, polls, media, etc. Interactive messages with buttons, polls, location sharing, and media attachments |
Live message updates WebSocket-based real-time messaging with instant delivery notifications |
Full admin capabilities Complete group administration including member management and settings control |
Block, privacy settings Comprehensive privacy management and user blocking functionality |
Fetch chat history Access and manage complete conversation history with powerful search capabilities |
Extensible architecture Highly customizable with plugin support and custom event handlers |
# π¦ Using npm (stable version) **not available**
npm install @owensdev1/baileys
# π§Ά Using yarn (edge version)
yarn add @owensdev1/baileys
const { default: makeWASocket, DisconnectReason, useMultiFileAuthState } = require("@owensdev1/baileys");
const { Boom } = require('@hapi/boom');
async function connectToWhatsApp() {
const { state, saveCreds } = await useMultiFileAuthState('auth_info_baileys');
const sock = makeWASocket({
auth: state,
printQRInTerminal: true
});
sock.ev.on('connection.update', (update) => {
const { connection, lastDisconnect } = update;
if(connection === 'close') {
const shouldReconnect = (lastDisconnect.error as Boom)?.output?.statusCode !== DisconnectReason.loggedOut;
console.log('Connection closed, reconnecting...', shouldReconnect);
if(shouldReconnect) {
connectToWhatsApp();
}
} else if(connection === 'open') {
console.log('β
Connected to WhatsApp!');
}
});
sock.ev.on('messages.upsert', async (m) => {
console.log('π© New message:', JSON.stringify(m, undefined, 2));
// Echo received messages
const msg = m.messages[0];
if (!msg.key.fromMe && msg.message) {
await sock.sendMessage(msg.key.remoteJid, { text: 'Hello! π' });
}
});
sock.ev.on('creds.update', saveCreds);
}
connectToWhatsApp();
[!TIP] Pro Tip: Customize browser name using the
Browser
constant. See available browsers.
const { default: makeWASocket, Browsers } = require("@owensdev1/baileys");
const sock = makeWASocket({
browser: Browsers.ubuntu('My App'),
printQRInTerminal: true
});
[!IMPORTANT] Pairing Code connects WhatsApp Web without QR-CODE.
Phone number format: country code + number (no +, (), or -)
const sock = makeWASocket({
printQRInTerminal: false // Must be false for pairing code
});
// Standard pairing
if (!sock.authState.creds.registered) {
const number = '1234567890'; // Your phone number
const code = await sock.requestPairingCode(number);
console.log('π Pairing Code:', code);
}
// Custom pairing (8 digits/letters)
if (!sock.authState.creds.registered) {
const customPair = "12345678";
const number = '1234567890';
const code = await sock.requestPairingCode(number, customPair);
console.log('π Custom Pairing Code:', code);
}
π― Never scan QR codes again! Save your session:
const { useMultiFileAuthState } = require("@owensdev1/baileys");
const { state, saveCreds } = await useMultiFileAuthState('auth_info_baileys');
const sock = makeWASocket({ auth: state });
// Auto-save credentials when they update
sock.ev.on('creds.update', saveCreds);
[!WARNING] Critical: Always save auth keys when they update (
authState.keys.set()
is called) to ensure message delivery!
π Text Simple text messages |
π Buttons Interactive buttons |
π Polls Survey & voting |
π¬ Media Images, videos, audio |
await sock.sendMessage(jid, { text: 'Hello World! π' });
await sock.sendMessage(jid, {
text: "Choose an option:",
footer: "Β© 2025 Your Bot",
buttons: [
{
buttonId: 'btn1',
buttonText: { displayText: 'β
Option 1' },
type: 1
},
{
buttonId: 'btn2',
buttonText: { displayText: 'β Option 2' },
type: 1
}
],
headerType: 1
});
await sock.sendMessage(jid, {
text: "Interactive Menu",
footer: "Β© 2025 Bot",
buttons: [
{
buttonId: 'menu',
buttonText: { displayText: 'π Show Menu' },
type: 4,
nativeFlowInfo: {
name: 'single_select',
paramsJson: JSON.stringify({
title: 'Select Option',
sections: [{
title: 'Available Options',
highlight_label: 'β',
rows: [
{
header: 'OPTION 1',
title: 'First Choice',
description: 'Description for option 1',
id: 'opt1'
},
{
header: 'OPTION 2',
title: 'Second Choice',
description: 'Description for option 2',
id: 'opt2'
}
]
}]
})
}
}
]
});
await sock.sendMessage(jid, {
poll: {
name: 'What\'s your favorite color? π¨',
values: ['π΄ Red', 'π΅ Blue', 'π’ Green', 'π‘ Yellow'],
selectableCount: 1
}
});
πΌοΈ Images JPG, PNG, WebP support |
π₯ Videos MP4, AVI with captions |
π΅ Audio Voice notes & music |
await sock.sendMessage(jid, {
image: { url: './path/to/image.jpg' },
caption: 'Beautiful image! πΈ'
});
await sock.sendMessage(jid, {
video: { url: './path/to/video.mp4' },
caption: 'Check this out! π¬',
ptv: false // Set to true for video note
});
await sock.sendMessage(jid, {
audio: { url: './path/to/audio.mp3' },
mimetype: 'audio/mp4'
});
[!IMPORTANT] Production Ready: Build your own data store for production. The in-memory store is just for testing!
const { makeInMemoryStore } = require("@owensdev1/baileys");
const store = makeInMemoryStore({});
// Load from file
store.readFromFile('./baileys_store.json');
// Auto-save every 10 seconds
setInterval(() => {
store.writeToFile('./baileys_store.json');
}, 10_000);
// Bind to socket
const sock = makeWASocket({});
store.bind(sock.ev);
// Access stored data
sock.ev.on('chats.upsert', () => {
console.log('π¬ Chats:', store.chats.all());
});
π Create |
π€ Members |
βοΈ Settings |
π‘οΈ Admin |
const group = await sock.groupCreate('π My Awesome Group', [
'1234567890@s.whatsapp.net',
'0987654321@s.whatsapp.net'
]);
console.log('β
Group created:', group.id);
await sock.sendMessage(group.id, { text: 'Welcome everyone! π' });
await sock.groupParticipantsUpdate(
groupJid,
['1234567890@s.whatsapp.net'],
'add' // 'remove', 'promote', 'demote'
);
// Update group name
await sock.groupUpdateSubject(groupJid, 'π New Group Name');
// Update description
await sock.groupUpdateDescription(groupJid, 'π New group description');
// Admin-only messages
await sock.groupSettingUpdate(groupJid, 'announcement');
// Everyone can send messages
await sock.groupSettingUpdate(groupJid, 'not_announcement');
π« Block Management |
βοΈ Privacy Settings |
// Block user
await sock.updateBlockStatus(jid, 'block');
// Unblock user
await sock.updateBlockStatus(jid, 'unblock');
// Update various privacy settings
await sock.updateLastSeenPrivacy('contacts'); // 'all', 'contacts', 'none'
await sock.updateOnlinePrivacy('all'); // 'all', 'match_last_seen'
await sock.updateProfilePicturePrivacy('contacts');
await sock.updateStatusPrivacy('contacts');
await sock.updateReadReceiptsPrivacy('all'); // 'all', 'none'
π Enable debug mode to see all WhatsApp communications:
const sock = makeWASocket({
logger: P({ level: 'debug' }),
});
// Listen for specific WebSocket events
sock.ws.on('CB:edge_routing', (node) => {
console.log('π‘ Edge routing message:', node);
});
// Listen with specific attributes
sock.ws.on('CB:edge_routing,id:abcd', (node) => {
console.log('π― Specific edge routing message:', node);
});
6285358977442 |
WhatsApp Group |
GitHub Issues |
We welcome contributions! Here's how you can help:
graph LR
A[π΄ Fork] --> B[π Branch]
B --> C[π» Code]
C --> D[π€ Push]
D --> E[π PR]
style A fill:#e1f5fe
style B fill:#f3e5f5
style C fill:#e8f5e8
style D fill:#fff3e0
style E fill:#fce4ec
- π΄ Fork the repository
- π Create your feature branch (
git checkout -b feature/AmazingFeature
) - π» Commit your changes (
git commit -m 'Add some AmazingFeature'
) - π€ Push to the branch (
git push origin feature/AmazingFeature
) - π Open a Pull Request
This project is licensed under the GPL v3 License - see the LICENSE file for details.
Special thanks to our amazing team and contributors who made this project possible:
Project Owner |
Technical Support |
Development Support |
Development |
- Built with β€οΈ using libsignal-node
- Special thanks to the WhatsApp Web reverse engineering community