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
π Multi-Device Support | π± QR & Pairing Code | π¨ Rich Messages | π Real-time Events |
---|---|---|---|
Connect as secondary device | Multiple connection methods | Buttons, polls, media, etc. | Live message updates |
π₯ Group Management | π Privacy Controls | π Message History | π― Custom Functions |
---|---|---|---|
Full admin capabilities | Block, privacy settings | Fetch chat history | Extensible architecture |
Choose your preferred package manager:
# 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();
π Click to expand full contents
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
Always save auth keys when they update (authState.keys.set()
is called) to ensure message delivery!
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
}
});
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
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());
});
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 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);
});
π Contact | π¬ WhatsApp | π§ Issues |
---|---|---|
6285358977442 | For Baileys support | GitHub Issues |
We welcome contributions! Here's how you can help:
- π΄ 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.
- Built with β€οΈ using libsignal-node
- Special thanks to the WhatsApp Web reverse engineering community