Skip to main content

Documentation Index

Fetch the complete documentation index at: https://zapo.to/llms.txt

Use this file to discover all available pages before exploring further.

Newsletters — WhatsApp channels — live on client.newsletter (WaNewsletterCoordinator). The coordinator combines three operation sets: discovery, admin, and messaging. Newsletter JIDs end in @newsletter.

Discovery

// Fetch metadata by JID or invite code
const meta = await client.newsletter.fetch('1234567890@newsletter')
const byInvite = await client.newsletter.fetchByInvite('AbCdEf')

// Channels the account follows
const subscribed = await client.newsletter.listSubscribed()

// Search the public directory
const results = await client.newsletter.searchDirectory({ /* text, categories */ })

// Recommendations & similar channels
const recommended = await client.newsletter.fetchRecommended()
const similar = await client.newsletter.fetchSimilar(newsletterJid)

Following

await client.newsletter.follow(newsletterJid)
await client.newsletter.unfollow(newsletterJid)
await client.newsletter.mute({ newsletterJid, muted: true })

Posting

send takes the same content union as a normal message — text, media, polls, and so on:
const result = await client.newsletter.send(newsletterJid, 'Hello, subscribers!')

// Edit a published message
await client.newsletter.editMessage(newsletterJid, result.stanzaId, 'Edited')

// Revoke it
await client.newsletter.revoke({ newsletterJid, messageId: result.stanzaId })

Reactions & poll votes

await client.newsletter.react({ newsletterJid, messageServerId, reaction: '🔥' })
await client.newsletter.votePoll({ /* WaNewsletterVotePollInput */ })
await client.newsletter.sendViewReceipt({ /* WaNewsletterViewReceiptInput */ })

Reading messages

const page = await client.newsletter.fetchMessages({
  newsletterJid,
  count: 50
})

// Edits / reactions / poll updates since a point
const updates = await client.newsletter.fetchMessageUpdates({
  newsletterJid,
  count: 50,
  since: someTimestamp
})

// Live updates subscription
const { durationSeconds } = await client.newsletter.subscribeLiveUpdates(newsletterJid)

Administration

For channels the account owns:
// Create a channel
const created = await client.newsletter.create({ name: 'My channel', description: '...' })

// Update editable fields (name / description / picture)
await client.newsletter.update(newsletterJid, { name: 'Renamed' })

// Delete
await client.newsletter.delete(newsletterJid)

// Admin views
const adminInfo = await client.newsletter.fetchAdminInfo(newsletterJid)
const followers = await client.newsletter.fetchFollowers(newsletterJid)
const insights = await client.newsletter.fetchInsights(newsletterJid, metrics)

Admins & ownership

await client.newsletter.createAdminInvite({ /* WaNewsletterAdminInviteInput */ })
await client.newsletter.changeOwner({ /* ... */ })
await client.newsletter.demoteAdmin({ /* ... */ })

Poll voters & reaction senders

const voters = await client.newsletter.fetchPollVoters({
  newsletterJid,
  messageServerId,
  voteHash
})

const reactors = await client.newsletter.fetchMessageReactionSenders({
  newsletterJid,
  messageServerId
})

Events

Newsletter activity arrives on newsletter, and edits/reactions/poll updates on newsletter_message_update:
client.on('newsletter', (event) => console.log(event))
client.on('newsletter_message_update', (event) => console.log(event))
Last modified on May 27, 2026