Advanced WhatsApp Web API Built on WhiskeySockets/Baileys
Modern, feature-rich, and developer-friendly WhatsApp automation library
- β¨ Features
- π¦ Installation
- π Quick Start
- π Authentication
- π‘ Socket Configuration
- πΎ Session Management
- π‘ Event Handling
- π οΈ Data Store
- π WhatsApp IDs
- π¬ Sending Messages
- βοΈ Message Modifications
- π₯ Media Operations
- π₯ Group Management
- π± User Operations
- π Privacy Controls
- π¬ Chat Operations
- π’ Broadcast & Stories
- π§© Advanced Features
|
|
npm install @nexustechpro/baileysyarn add @nexustechpro/baileysAdd to your package.json:
{
"dependencies": {
"@whiskeysockets/baileys": "npm:@nexustechpro/baileys"
}
}// ESM
import makeWASocket from '@nexustechpro/baileys'
// CommonJS
const { default: makeWASocket } = require('@nexustechpro/baileys')import makeWASocket, { DisconnectReason, useMultiFileAuthState } from '@nexustechpro/baileys'
async function connectToWhatsApp() {
const { state, saveCreds } = await useMultiFileAuthState('auth_session')
const sock = makeWASocket({
auth: state,
printQRInTerminal: true,
browser: ['NexusTechPro', 'Chrome', '1.0.0']
})
sock.ev.on('connection.update', (update) => {
const { connection, lastDisconnect } = update
if(connection === 'close') {
const shouldReconnect = lastDisconnect?.error?.output?.statusCode !== DisconnectReason.loggedOut
if(shouldReconnect) {
connectToWhatsApp()
}
} else if(connection === 'open') {
console.log('β
Connected to WhatsApp!')
}
})
sock.ev.on('messages.upsert', async ({ messages }) => {
for(const msg of messages) {
if(!msg.key.fromMe && msg.message) {
await sock.sendMessage(msg.key.remoteJid, {
text: 'Hello from NexusTechPro Baileys!'
})
}
}
})
sock.ev.on('creds.update', saveCreds)
}
connectToWhatsApp()import makeWASocket from '@nexustechpro/baileys'
const sock = makeWASocket({
auth: state,
printQRInTerminal: true,
browser: ['NexusTechPro Bot', 'Chrome', '1.0.0']
})const sock = makeWASocket({
auth: state,
printQRInTerminal: false
})
if(!sock.authState.creds.registered) {
const phoneNumber = '1234567890' // without + or spaces
const code = await sock.requestPairingCode(phoneNumber)
console.log(`Pairing code: ${code}`)
}const phoneNumber = "628XXXXX"
const code = await sock.requestPairingCode(phoneNumber.trim(), "NEXUS01")
console.log("Your pairing code: " + code)const groupCache = new NodeCache({ stdTTL: 5 * 60, useClones: false })
const sock = makeWASocket({
cachedGroupMetadata: async (jid) => groupCache.get(jid)
})
sock.ev.on('groups.update', async ([event]) => {
const metadata = await sock.groupMetadata(event.id)
groupCache.set(event.id, metadata)
})const sock = makeWASocket({
getMessage: async (key) => await getMessageFromStore(key)
})const sock = makeWASocket({
markOnlineOnConnect: false
})Avoid scanning QR every time:
import makeWASocket, { useMultiFileAuthState } from '@nexustechpro/baileys'
const { state, saveCreds } = await useMultiFileAuthState('auth_info_baileys')
const sock = makeWASocket({ auth: state })
sock.ev.on('creds.update', saveCreds)π‘ Tip: For production, store auth in a database instead of files.
sock.ev.on('connection.update', (update) => {
const { connection, lastDisconnect } = update
if(connection === 'close') {
const shouldReconnect = lastDisconnect?.error?.output?.statusCode !== DisconnectReason.loggedOut
console.log('Connection closed, reconnecting:', shouldReconnect)
if(shouldReconnect) connectToWhatsApp()
} else if(connection === 'open') {
console.log('Connection opened')
}
})sock.ev.on('messages.upsert', async ({ messages }) => {
for(const msg of messages) {
console.log('New message:', msg)
}
})sock.ev.on('messages.update', async (updates) => {
for(const update of updates) {
console.log('Message updated:', update)
}
})sock.ev.on('messages.update', async (event) => {
for(const { key, update } of event) {
if(update.pollUpdates) {
const pollCreation = await getMessage(key)
if(pollCreation) {
console.log('Poll update:', getAggregateVotesInPollMessage({
message: pollCreation,
pollUpdates: update.pollUpdates,
}))
}
}
}
})import makeWASocket, { makeInMemoryStore } from '@nexustechpro/baileys'
const store = makeInMemoryStore({})
store.readFromFile('./baileys_store.json')
setInterval(() => {
store.writeToFile('./baileys_store.json')
}, 10_000)
const sock = makeWASocket({})
store.bind(sock.ev)
sock.ev.on('chats.upsert', () => {
console.log('Got chats:', store.chats.all())
})
sock.ev.on('contacts.upsert', () => {
console.log('Got contacts:', Object.values(store.contacts))
})
β οΈ Important: Build your own data store for production. In-memory storage wastes RAM.
- Personal Chats:
[country code][phone number]@s.whatsapp.net- Example:
1234567890@s.whatsapp.net
- Example:
- Groups:
[group id]@g.us- Example:
123456789-987654321@g.us
- Example:
- Broadcast Lists:
[timestamp]@broadcast - Status:
status@broadcast
await sock.sendMessage(jid, { text: 'Hello World!' })await sock.sendMessage(jid, { text: 'This is a reply' }, { quoted: message })await sock.sendMessage(jid, {
text: '@12345678901',
mentions: ['12345678901@s.whatsapp.net']
})await sock.sendStatusMentions(
{
text: "Hello", // or image / video / audio (url or buffer)
},
[
"123456789123456789@g.us",
"123456789@s.whatsapp.net",
// Enter jid chat here
]
)await sock.sendMessage(jid, {
pollResult: {
name: "Text poll",
votes: [["Options 1", 10], ["Options 2", 10]], // 10 for fake polling count results
}
}, { quoted: message })await sock.sendAlbumMessage(
jid,
[
{
image: { url: "https://example.jpg" }, // or buffer
caption: "Hello World",
},
{
video: { url: "https://example.mp4" }, // or buffer
caption: "Hello World",
},
],
{
quoted: message,
delay: 2000 // number in milliseconds
}
)// Example non media sticker
await sock.sendMessage(jid, {
requestPayment: {
currency: "IDR",
amount: "10000000",
from: "123456@s.whatsapp.net",
note: "Payment Request",
background: { /* background of the message */ }
}
}, { quoted: message })
// With media sticker buffer
await sock.sendMessage(jid, {
requestPayment: {
currency: "IDR",
amount: "10000000",
from: "123456@s.whatsapp.net",
sticker: buffer,
background: { /* background of the message */ }
}
}, { quoted: message })
// With media sticker url
await sock.sendMessage(jid, {
requestPayment: {
currency: "IDR",
amount: "10000000",
from: "123456@s.whatsapp.net",
sticker: { url: "https://example.com/sticker.webp" },
background: { /* background of the message */ }
}
}, { quoted: message })await sock.sendMessage(jid, {
event: {
isCanceled: false, // or true for cancel event
name: "Event Name",
description: "Event Description",
location: {
degreesLatitude: -0,
degreesLongitude: -0
},
link: "https://call-link.example.com",
startTime: m.messageTimestamp.low,
endTime: m.messageTimestamp.low + 86400, // 86400 is day in seconds
extraGuestsAllowed: true // or false
}
}, { quoted: message })await sock.sendMessage(jid, {
productMessage: {
title: "Product Title",
description: "Product Description",
thumbnail: "https://example.png",
productId: "123456789",
retailerId: "STORE",
url: "https://example.png",
body: "Product Body",
footer: "Product Footer",
buttons: [
{
name: "cta_url",
buttonParamsJson: JSON.stringify({
display_text: "Visit Site",
url: "https://example.com"
})
}
]
}
}, { quoted: message })await sock.sendMessage(jid, {
carouselMessage: {
caption: "Click URL",
footer: "Powered By NexusTechPro",
cards: [
// Card Mode Product
{
headerTitle: "`</> Owner Bot </>`",
imageUrl: "https://example.com/image.jpg",
productTitle: "Premium Bot",
productDescription: "Get premium access",
bodyText: "[NexusTechPro]\n- Important chat only\n- Don't call owner",
buttons: [
{
name: "cta_call",
params: {
display_text: "Contact Owner",
phone_number: "+1234567890"
}
}
]
},
// Card Mode Image
{
headerTitle: "`</> Bot Assistant </>`",
imageUrl: "https://example.com/image2.jpg",
bodyText: "[AI Assistant]\n- Don't spam bot\n- Don't call bot",
buttons: [
{
name: "cta_url",
params: {
display_text: "Chat Bot",
url: "https://wa.me/1234567890",
merchant_url: "https://wa.me/1234567890"
}
}
]
}
]
}
}, { quoted: message })await sock.sendMessage(jid, {
interactiveMessage: {
title: "Hello World",
footer: "NexusTechPro",
image: { url: "https://example.com/image.jpg" },
nativeFlowMessage: {
messageParamsJson: JSON.stringify({
limited_time_offer: {
text: "Limited offer!",
url: "https://nexustechpro.com",
copy_code: "NEXUS2025",
expiration_time: Date.now() + (24 * 60 * 60 * 1000)
},
bottom_sheet: {
in_thread_buttons_limit: 2,
divider_indices: [1, 2, 3, 4, 5],
list_title: "Select Option",
button_title: "Click Here"
},
tap_target_configuration: {
title: "Tap Target",
description: "Description here",
canonical_url: "https://nexustechpro.com",
domain: "nexustechpro.com",
button_index: 0
}
}),
buttons: [
{
name: "single_select",
buttonParamsJson: JSON.stringify({
has_multiple_buttons: true
})
},
{
name: "call_permission_request",
buttonParamsJson: JSON.stringify({
has_multiple_buttons: true
})
},
{
name: "single_select",
buttonParamsJson: JSON.stringify({
title: "Select Option",
sections: [
{
title: "Section Title",
highlight_label: "Popular",
rows: [
{
title: "Option 1",
description: "Description 1",
id: "row_1"
},
{
title: "Option 2",
description: "Description 2",
id: "row_2"
}
]
}
],
has_multiple_buttons: true
})
},
{
name: "cta_copy",
buttonParamsJson: JSON.stringify({
display_text: "Copy Code",
id: "123456789",
copy_code: "NEXUS2025"
})
}
]
}
}
}, { quoted: message })// Example non header media
await sock.sendMessage(jid, {
text: "Description of Message",
title: "Title of Message",
subtitle: "Subtitle Message",
footer: "Footer Message",
interactiveButtons: [
{
name: "quick_reply",
buttonParamsJson: JSON.stringify({
display_text: "Quick Reply",
id: "button_1"
})
},
{
name: "cta_url",
buttonParamsJson: JSON.stringify({
display_text: "Visit Website",
url: "https://nexustechpro.com"
})
}
]
}, { quoted: message })
// Example with media
await sock.sendMessage(jid, {
image: { url: "https://example.jpg" }, // or buffer
caption: "Description of Message",
title: "Title of Message",
subtitle: "Subtitle Message",
footer: "Footer Message",
media: true,
interactiveButtons: [
{
name: "quick_reply",
buttonParamsJson: JSON.stringify({
display_text: "Quick Reply",
id: "button_1"
})
},
{
name: "cta_url",
buttonParamsJson: JSON.stringify({
display_text: "Visit Website",
url: "https://nexustechpro.com"
})
}
]
}, { quoted: message })
// Example with header product
await sock.sendMessage(jid, {
product: {
productImage: { url: "https://example.jpg" }, // or buffer
productImageCount: 1,
title: "Product Title",
description: "Product Description",
priceAmount1000: 20000 * 1000,
currencyCode: "USD",
retailerId: "Retail",
url: "https://example.com",
},
businessOwnerJid: "1234@s.whatsapp.net",
caption: "Description of Message",
title: "Title of Message",
footer: "Footer Message",
media: true,
interactiveButtons: [
{
name: "quick_reply",
buttonParamsJson: JSON.stringify({
display_text: "Quick Reply",
id: "button_1"
})
},
{
name: "cta_url",
buttonParamsJson: JSON.stringify({
display_text: "Visit Website",
url: "https://nexustechpro.com"
})
}
]
}, { quoted: message })const msg = getMessageFromStore() // implement this on your end
await sock.sendMessage(jid, { forward: msg })await sock.sendMessage(jid, {
location: {
degreesLatitude: 24.121231,
degreesLongitude: 55.1121221,
name: "Location Name",
address: "Location Address"
}
})const vcard = 'BEGIN:VCARD\n'
+ 'VERSION:3.0\n'
+ 'FN:John Doe\n'
+ 'ORG:NexusTechPro;\n'
+ 'TEL;type=CELL;type=VOICE;waid=1234567890:+1 234 567 890\n'
+ 'END:VCARD'
await sock.sendMessage(jid, {
contacts: {
displayName: 'John Doe',
contacts: [{ vcard }]
}
})await sock.sendMessage(jid, {
react: {
text: 'π', // use empty string to remove reaction
key: message.key
}
})await sock.sendMessage(jid, {
pin: {
type: 1, // 0 to remove
time: 86400, // 24 hours in seconds
key: message.key
}
})Pin Time Options:
| Time | Seconds |
|---|---|
| 24h | 86,400 |
| 7d | 604,800 |
| 30d | 2,592,000 |
await sock.sendMessage(jid, {
keep: message.key,
type: 1, // 2 to unpin
time: 86400
})Keep Time Options:
| Time | Seconds |
|---|---|
| 24h | 86,400 |
| 7d | 604,800 |
| 30d | 2,592,000 |
await sock.sendMessage(jid, {
poll: {
name: 'Favorite Color?',
values: ['Red', 'Blue', 'Green', 'Yellow'],
selectableCount: 1,
toAnnouncementGroup: false
}
})await sock.sendMessage(jid, {
text: 'Check out https://github.com/nexustechpro/baileys'
})π Note: You can pass
{ stream: Stream },{ url: Url }, orBufferdirectly
// From URL
await sock.sendMessage(jid, {
image: { url: 'https://example.com/image.jpg' },
caption: 'Beautiful image!'
})
// From Buffer
await sock.sendMessage(jid, {
image: buffer,
caption: 'Image from buffer'
})
// From File
await sock.sendMessage(jid, {
image: fs.readFileSync('./image.jpg'),
caption: 'Local image'
})await sock.sendMessage(jid, {
video: { url: './video.mp4' },
caption: 'Check this out!',
gifPlayback: false, // set true for GIF
ptv: false // set true for video note
})await sock.sendMessage(jid, {
video: fs.readFileSync('Media/gif.mp4'),
caption: 'Funny GIF',
gifPlayback: true
})await sock.sendMessage(jid, {
audio: { url: './audio.mp3' },
mimetype: 'audio/mp4',
ptt: true // voice message
})π‘ Audio Conversion Tip:
ffmpeg -i input.mp4 -avoid_negative_ts make_zero -ac 1 output.ogg
await sock.sendMessage(jid, {
document: { url: './document.pdf' },
fileName: 'document.pdf',
mimetype: 'application/pdf'
})await sock.sendMessage(jid, {
sticker: { url: './sticker.webp' }
})await sock.stickerPackMessage(jid, {
name: 'My Stickers',
publisher: 'Your Bot',
description: 'Collection of stickers',
stickers: [
{ data: buffer, emojis: ['π'] },
{ data: './sticker.png', emojis: ['π'] },
{ data: './sticker.webp', emojis: ['π'] },
{ data: 'https://example.com/sticker.jpg', emojis: ['β€οΈ'] }
],
cover: buffer
}, { quoted: message });await sock.sendMessage(jid, {
stickerPack: {
name: 'My Stickers',
publisher: 'Your Bot',
description: 'Collection of stickers',
stickers: [
{ data: buffer, emojis: ['π'] },
{ data: './sticker.png', emojis: ['π'] },
{ data: './sticker.webp', emojis: ['π'] },
{ data: 'https://example.com/sticker.jpg', emojis: ['β€οΈ'] }
],
cover: buffer
}
}, { quoted: message });Stickers automatically convert to WebP format. The following image formats are supported:
| Format | Support | Notes |
|---|---|---|
| WebP | β Full | Used as-is, no conversion needed |
| PNG | β Full | Auto-converts to WebP |
| JPG/JPEG | β Full | Auto-converts to WebP |
| GIF | β Limited | Converts to static WebP (animated GIFs become static) |
| BMP | β Full | Auto-converts to WebP |
| Video (MP4, MOV, WebM, etc.) | β Not supported | Only static images are supported |
Each sticker can be provided in multiple formats:
{
data: fs.readFileSync('./sticker.png'),
emojis: ['π']
}{
data: './stickers/sticker.jpg',
emojis: ['π']
}{
data: 'https://example.com/sticker.png',
emojis: ['π']
}The cover image supports all the same formats:
// From buffer
cover: fs.readFileSync('./cover.png')
// From file path
cover: './cover.jpg'
// From URL
cover: 'https://example.com/cover.png'await sock.stickerPackMessage(jid, {
name: 'My Stickers',
publisher: 'Your Bot',
description: 'Collection of stickers',
stickers: [
{ data: fs.readFileSync('./sticker1.png'), emojis: ['π', 'π'] },
{ data: './sticker2.jpg', emojis: ['π'] },
{ data: './sticker3.webp', emojis: ['π'] },
{ data: 'https://example.com/sticker4.png', emojis: ['β€οΈ'] }
],
cover: './cover.jpg'
});β
Automatic batching - Splits packs >60 stickers into multiple messages
β
Compression - Auto-compresses stickers exceeding 1MB
β
Auto-conversion - Converts PNG, JPG, GIF, BMP to WebP
β
Multiple formats - Supports buffers, file paths, URLs, and streams
β
Rate limiting - 2-second delays between batch sends
β
Error handling - Gracefully skips invalid stickers
β
Emoji support - Each sticker supports multiple emojis
β
Cover image - Custom pack thumbnail
await sock.sendMessage(jid, {
image: { url: './secret.jpg' },
viewOnce: true,
caption: 'View once only!'
})All button types available in NexusTechPro Baileys:
{
name: "quick_reply",
buttonParamsJson: JSON.stringify({
display_text: "Quick Reply",
id: "button_id"
})
}{
name: "cta_url",
buttonParamsJson: JSON.stringify({
display_text: "Visit Website",
url: "https://nexustechpro.com",
merchant_url: "https://nexustechpro.com"
})
}{
name: "cta_call",
buttonParamsJson: JSON.stringify({
display_text: "Call Us",
phone_number: "+1234567890"
})
}{
name: "cta_copy",
buttonParamsJson: JSON.stringify({
display_text: "Copy Code",
id: "copy_id",
copy_code: "PROMO2025"
})
}{
name: "single_select",
buttonParamsJson: JSON.stringify({
title: "Select Option",
sections: [{
title: "Section 1",
highlight_label: "Popular",
rows: [
{ title: "Option 1", description: "Description 1", id: "opt1" },
{ title: "Option 2", description: "Description 2", id: "opt2" }
]
}]
})
}{
name: "call_permission_request",
buttonParamsJson: JSON.stringify({
has_multiple_buttons: true
})
}const msg = await sock.sendMessage(jid, { text: 'hello' })
await sock.sendMessage(jid, { delete: msg.key })await sock.sendMessage(jid, {
text: 'Updated message text',
edit: originalMessage.key
})import { downloadMediaMessage, getContentType } from '@nexustechpro/baileys'
sock.ev.on('messages.upsert', async ({ messages }) => {
const msg = messages[0]
if(!msg.message) return
const messageType = getContentType(msg.message)
if(messageType === 'imageMessage') {
const buffer = await downloadMediaMessage(
msg,
'buffer',
{},
{
logger: console,
reuploadRequest: sock.updateMediaMessage
}
)
// Save buffer to file
fs.writeFileSync('./download.jpeg', buffer)
}
})await sock.updateMediaMessage(msg)const group = await sock.groupCreate('Group Name', [
'1234567890@s.whatsapp.net',
'0987654321@s.whatsapp.net'
])
console.log('Group created:', group.id)// Add
await sock.groupParticipantsUpdate(groupJid, ['1234567890@s.whatsapp.net'], 'add')
// Remove
await sock.groupParticipantsUpdate(groupJid, ['1234567890@s.whatsapp.net'], 'remove')
// Promote to admin
await sock.groupParticipantsUpdate(groupJid, ['1234567890@s.whatsapp.net'], 'promote')
// Demote from admin
await sock.groupParticipantsUpdate(groupJid, ['1234567890@s.whatsapp.net'], 'demote')await sock.groupUpdateSubject(groupJid, 'New Group Name')await sock.groupUpdateDescription(groupJid, 'New group description')// Only admins can send messages
await sock.groupSettingUpdate(groupJid, 'announcement')
// Everyone can send messages
await sock.groupSettingUpdate(groupJid, 'not_announcement')
// Only admins can edit group info
await sock.groupSettingUpdate(groupJid, 'locked')
// Everyone can edit group info
await sock.groupSettingUpdate(groupJid, 'unlocked')const metadata = await sock.groupMetadata(groupJid)
console.log('Group:', metadata.subject)
console.log('Participants:', metadata.participants.length)const code = await sock.groupInviteCode(groupJid)
console.log('Invite link:', `https://chat.whatsapp.com/${code}`)const newCode = await sock.groupRevokeInvite(groupJid)
console.log('New invite code:', newCode)await sock.groupAcceptInvite('INVITE_CODE_HERE')await sock.groupLeave(groupJid)const info = await sock.groupGetInviteInfo('INVITE_CODE')
console.log('Group info:', info)const [result] = await sock.onWhatsApp('1234567890')
if(result?.exists) {
console.log('Number exists:', result.jid)
}// Low resolution
const ppUrl = await sock.profilePictureUrl(jid)
// High resolution
const ppUrlHD = await sock.profilePictureUrl(jid, 'image')await sock.updateProfilePicture(jid, {
url: './profile.jpg'
})await sock.removeProfilePicture(jid)const status = await sock.fetchStatus(jid)
console.log('Status:', status)await sock.updateProfileStatus('Available 24/7')await sock.updateProfileName('NexusTech Bot')const profile = await sock.getBusinessProfile(jid)
console.log('Business:', profile.description)// Subscribe to presence updates
await sock.presenceSubscribe(jid)
// Send presence
await sock.sendPresenceUpdate('available', jid) // available, unavailable, composing, recording, pausedawait sock.readMessages([message.key])// Block
await sock.updateBlockStatus(jid, 'block')
// Unblock
await sock.updateBlockStatus(jid, 'unblock')const settings = await sock.fetchPrivacySettings()
console.log(settings)// Last seen: 'all', 'contacts', 'contact_blacklist', 'none'
await sock.updateLastSeenPrivacy('contacts')
// Online: 'all', 'match_last_seen'
await sock.updateOnlinePrivacy('all')
// Profile picture: 'all', 'contacts', 'contact_blacklist', 'none'
await sock.updateProfilePicturePrivacy('contacts')
// Status: 'all', 'contacts', 'contact_blacklist', 'none'
await sock.updateStatusPrivacy('contacts')
// Read receipts: 'all', 'none'
await sock.updateReadReceiptsPrivacy('all')
// Groups add: 'all', 'contacts', 'contact_blacklist'
await sock.updateGroupsAddPrivacy('contacts')const blocklist = await sock.fetchBlocklist()
console.log('Blocked users:', blocklist)const lastMsg = await getLastMessageInChat(jid)
await sock.chatModify({
archive: true,
lastMessages: [lastMsg]
}, jid)// Mute for 8 hours
await sock.chatModify({
mute: 8 * 60 * 60 * 1000
}, jid)
// Unmute
await sock.chatModify({
mute: null
}, jid)// Pin
await sock.chatModify({ pin: true }, jid)
// Unpin
await sock.chatModify({ pin: false }, jid)const lastMsg = await getLastMessageInChat(jid)
await sock.chatModify({
delete: true,
lastMessages: [{
key: lastMsg.key,
messageTimestamp: lastMsg.messageTimestamp
}]
}, jid)// Mark as read
await sock.chatModify({ markRead: true }, jid)
// Mark as unread
await sock.chatModify({ markRead: false }, jid)await sock.sendMessage(jid, {
text: 'Broadcast message',
statusJidList: [
'1234567890@s.whatsapp.net',
'0987654321@s.whatsapp.net'
],
broadcast: true
})await sock.sendMessage('status@broadcast', {
image: { url: './story.jpg' },
caption: 'My story update!'
})// Create newsletter
await sock.newsletterCreate('Newsletter Name', {
description: 'Newsletter description',
picture: buffer // optional
})
// Update newsletter metadata
await sock.newsletterUpdateMetadata(newsletterJid, {
name: 'New Name',
description: 'New description'
})
// Update newsletter picture
await sock.newsletterUpdatePicture(newsletterJid, buffer)
// React to newsletter message
await sock.newsletterReactMessage(newsletterJid, messageId, 'π')
// Follow newsletter
await sock.newsletterFollow(newsletterJid)
// Unfollow newsletter
await sock.newsletterUnfollow(newsletterJid)
// Mute newsletter
await sock.newsletterMute(newsletterJid)
// Unmute newsletter
await sock.newsletterUnmute(newsletterJid)// Enable (86400 = 24 hours, 604800 = 7 days, 7776000 = 90 days)
await sock.sendMessage(jid, {
disappearingMessagesInChat: 86400
})
// Disable
await sock.sendMessage(jid, {
disappearingMessagesInChat: false
})const msg = await sock.loadMessage(jid, messageId)
console.log('Message:', msg)const info = await sock.messageInfo(jid, messageId)
console.log('Read by:', info.readBy.length)
console.log('Played by:', info.playedBy.length)// Sync app state
await sock.appPatch(['regular', 'critical_block', 'critical_unblock_low'])const browserId = sock.generateBrowserId()
console.log('Browser ID:', browserId)import { useMultiFileAuthState } from '@nexustechpro/baileys'
const { state, saveCreds } = await useMultiFileAuthState('auth_folder')
const sock = makeWASocket({ auth: state })
sock.ev.on('creds.update', saveCreds)import { makeInMemoryStore } from '@nexustechpro/baileys'
const store = makeInMemoryStore({})
store.readFromFile('./store.json')
setInterval(() => {
store.writeToFile('./store.json')
}, 10_000)
store.bind(sock.ev)try {
await sock.sendMessage(jid, { text: 'Hello' })
} catch(error) {
if(error.output?.statusCode === 401) {
console.log('Not authorized')
} else {
console.error('Send failed:', error)
}
}sock.ev.on('connection.update', async (update) => {
const { connection, lastDisconnect } = update
if(connection === 'close') {
const shouldReconnect = lastDisconnect?.error?.output?.statusCode !== DisconnectReason.loggedOut
if(shouldReconnect) {
console.log('Reconnecting...')
await connectToWhatsApp()
} else {
console.log('Logged out')
}
}
})const queue = []
const sending = false
async function queueMessage(jid, message) {
queue.push({ jid, message })
if(!sending) processQueue()
}
async function processQueue() {
sending = true
while(queue.length > 0) {
const { jid, message } = queue.shift()
await sock.sendMessage(jid, message)
await delay(1000) // 1 second delay between messages
}
sending = false
}- Personal:
[country_code][phone_number]@s.whatsapp.net - Group:
[group_id]@g.us - Broadcast:
[timestamp]@broadcast - Status:
status@broadcast - Newsletter:
[newsletter_id]@newsletter
All supported message types:
conversation- TextimageMessage- ImagevideoMessage- VideoaudioMessage- AudiodocumentMessage- DocumentstickerMessage- StickerlocationMessage- LocationcontactMessage- ContactpollCreationMessage- PollreactionMessage- ReactioneditedMessage- Edited messageviewOnceMessage- View once mediaextendedTextMessage- Text with link preview
// Connection events
'connection.update'
'creds.update'
// Message events
'messages.upsert'
'messages.update'
'messages.delete'
'message-receipt.update'
// Chat events
'chats.set'
'chats.upsert'
'chats.update'
'chats.delete'
// Contact events
'contacts.set'
'contacts.upsert'
'contacts.update'
// Group events
'groups.upsert'
'groups.update'
'group-participants.update'
// Presence events
'presence.update'
// Call events
'call'
// Blocklist events
'blocklist.set'
'blocklist.update'Contributions are welcome! Please follow these guidelines:
- 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 MIT License - see the LICENSE file for details.
This project is NOT officially affiliated with WhatsApp or Meta. This is an independent project and should be used responsibly. The authors and maintainers are not responsible for any misuse of this library.
Important:
- Follow WhatsApp's Terms of Service
- Don't spam or send unsolicited messages
- Respect user privacy
- Use for legitimate purposes only
- Be aware of WhatsApp's rate limits
Special thanks to:
- WhiskeySockets for the original Baileys library
- All contributors who have helped improve this project
- The open-source community for their continuous support
- Issues: Whatsapp Channel
- Discussions: Whatsapp Channel
- NPM: @nexustechpro/baileys
