Coming from wuzapi
whatsapi runs wuzapi underneath, so nothing you already know is wrong. It is just no longer the surface you touch. Here is the translation table.
Same gateway, different contract
| POST /send/text {Phone, Body} | POST /v1/messages {to, text} |
| POST /session/qr | POST /v1/numbers/:id/pair {mode: "qr"} |
| POST /session/pairphone | POST /v1/numbers/:id/pair {mode: "code", phone} |
| GET /user/check | GET /v1/numbers/check/:phone |
| POST /send/image|video|audio|document | POST /v1/messages/image|video|audio|document |
| webhooks: 13 raw PascalCase events | PUT /v1/webhooks: 7 normalized, signed events |
| token header per instance | Authorization: Bearer wa_… (one key, all numbers) |
What you stop doing
Session ids per phone, token headers and PascalCase payloads all go away. A key owns the account, and single-number accounts leave out from entirely. The already connected 500 that meant three different things on wuzapi is resolved for you: connected is a status, cooldown is a 429 with Retry-After, and anything else is a 502.
before
POST wa.whatsapi.sh:8001/send/text
token: <instance token>
{ "Phone": "5511988887777", "Body": "hi" }after
POST api.whatsapi.sh/v1/messages
Authorization: Bearer wa_…
{ "to": "+5511988887777", "text": "hi" }