Polymorfa
Open Console

Polymorfa vs whatsapp-web.js

We maintain whatsapp-web.js. Polymorfa runs no browser at all.

Polymorfa connects numbers with a protocol client on its own servers and gives you an HTTP API, signed webhooks and calls from code. There is no Chrome to host, patch or scale per number.1,2,3

Runs for each connected number
whatsapp-web.js
A Chromium or Chrome browser
Polymorfa
Nothing on your servers

From the maintainer of whatsapp-web.js.

Polymorfa's co-founder, Rajeh Taher, maintains whatsapp-web.js, so we know what a browser per number costs to run: memory, a separate Chrome install for video, session files and breakage after WhatsApp Web updates. Polymorfa removes that whole layer. Your numbers pair through QuickLink and your code sends over HTTP.4,1

Linked devices and the official Cloud API, behind one API.5
2 routes
Per message. A number costs credits only for the days it is online.6
$0
To place and answer calls: in the browser, in server code with the raw audio, and on your PBX over SIP.3,7
3 ways
In the hosted MCP server, for agents that run WhatsApp.8
195 tools

Three reasons teams move from whatsapp-web.js

  1. 01

    No browser to run for each number

    Polymorfa runs the sessions and stores their keys. Your code sends over HTTP.1

    whatsapp-web.js: whatsapp-web.js runs WhatsApp Web in a Puppeteer-controlled browser, and sending video requires Google Chrome.9 You run that browser, keep it patched and store the session with an authentication strategy.10

    wwebjs.js
    const { Client, LocalAuth } = require('whatsapp-web.js')
    
    const client = new Client({ authStrategy: new LocalAuth() })
    client.on('ready', async () => {
      await client.sendMessage('15550001111@c.us', 'Your order shipped.')
    })
    client.initialize()
    polymorfa.sh
    curl -X POST https://api.polymorfa.com/messaging/support/messages/send \
      -H "Authorization: Bearer $POLYMORFA_API_KEY" \
      -H "Idempotency-Key: order-1042-shipped" \
      -H "Content-Type: application/json" \
      -d '{"conversation":{"phoneNumber":"+15550001111"},"content":{"text":"Your order shipped."}}'
  2. 02

    Webhooks and retries built in

    Polymorfa signs every delivery with HMAC-SHA256 and makes up to eight delivery attempts over 24 hours, set per webhook.2 A send with an Idempotency-Key that repeats within 24 hours returns 409 and does not send again.11

    whatsapp-web.js: whatsapp-web.js delivers events inside your process. Forwarding them to other services, signing them and retrying failures is yours to build.9

  3. 03

    Calls from code and over SIP

    Polymorfa places and answers calls in a browser, in server code that reads and writes the audio, or on your PBX through a SIP trunk. Linked-device numbers also take video and group calls.3,7

    whatsapp-web.js: whatsapp-web.js represents an incoming call as a Call object whose one method is reject().12

One credit pool. Only the days a number is online.

One credit balance pays for every number your team runs, and a number costs credits only for the UTC days it is online.6 The monthly bonus is part of the price: buy 100,000 credits in a month and you get 250,000.13

Bonus credits on the whole month's purchase, every month

+10%
from 10,000 credits
+25%
from 20,000 credits
+75%
from 50,000 credits
+150%
from 100,000 credits

What Polymorfa gives you that whatsapp-web.js does not

Polymorfa and whatsapp-web.js
FeaturePolymorfawhatsapp-web.js
Hosted onboarding link for your customersQuickLink4You build it9
Idempotent sends24-hour keys11You build it9
Place and answer calls from codeBrowser, server, SIP3Not supported12
SIP trunk to your PBXBoth directions7You build it9
REST API with OpenAPI specOpenAPI 3.114In-process library
Signed webhooks with retriesHMAC-SHA2562You build it9
Customer accounts for SaaS buildersCustomers API15You build it9
Number health estimate0–100, rules-based16You build it9

Move from whatsapp-web.js in an afternoon

  1. 01

    Create a project and an API key

    Sign up, create a project and generate an API key in the Console.17

  2. 02

    Pair each number again

    Send a QuickLink to pair by QR or pairing code.4 Log out the whatsapp-web.js client first, so two linked devices do not compete.

  3. 03

    Replace client calls

    Move each sendMessage call to the Polymorfa send endpoint and add an Idempotency-Key.1

Questions

How do I move my whatsapp-web.js numbers?

Pair each number again with QuickLink, by QR or pairing code. Session import covers Baileys sessions as a preview feature and whatsmeow devices through an assisted migration, not whatsapp-web.js sessions.18,4

How does Polymorfa connect a number without a browser?

It connects linked-device numbers with a protocol client that runs on its servers, and your code reaches them over HTTP and webhooks.1,2

Leave the WhatsApp infrastructure to us.

Start free

Also compare: Baileys, whatsmeow