Everything you can automate in WhatsApp
One REST API for every WhatsApp automation surface — JSON endpoints, real-time events, and full docs.
Jump to a section:
One REST API for every WhatsApp automation surface — JSON endpoints, real-time events, and full docs.
Jump to a section:
Pair your number via QR
Link any personal or Business WhatsApp — like WhatsApp Web. Start in the free sandbox to connect and test.
Send your first API request
Use your token in the sandbox, curl, or Postman. One REST API for messages, groups, channels, and more.
Add webhooks when you need events
Receive messages and WhatsApp events in real time — configure only the events your app uses.
Automate WhatsApp groups from your backend — post messages, read group chats, add or remove participants, and manage admins without opening the app. Export member phone numbers for CRM sync and onboard users at scale. When you outgrow a single group, run Communities with linked sub-groups — same REST API for both. Groups API guide →
Create and manage WhatsApp Channels from your backend — publish posts, assign admins, and read reactions without the app. Cross-post news, release notes, and deal alerts from your website, Telegram, or CRM. Channel posts carry no per-message fees. Channel API overview →
Engage customers with unlimited direct messaging and built-in e-commerce tools. Send rich media, interactive buttons, and product catalogs directly in chat — with zero per-message fees and no pre-approval templates. Build smart chatbots, sync orders with your CRM, and handle the entire sales funnel on a single API.
Engage your audience with automated WhatsApp Status (Stories) updates. Publish images, videos, or text with custom colored backgrounds programmatically. Unlock a powerful marketing channel that is completely missing from most official WhatsApp APIs.
Built-in utility features on a clear, developer-friendly API — get started fast with any action. Automate voice calls, polls, number verification, and chat labels — fully included, no add-on fees.
Call events
Start group calls, initiate outgoing calls, reject incoming calls, and get call events on webhooks — missed, answered, and ringing.
Polls
Create polls in chats and groups and react when people vote.
Number check
Check if a number is on WhatsApp before you send.
Business labels
Tag chats from the API — useful for CRM stages and support queues.
Get WhatsApp events on your server in real time — new messages, group changes, channel posts, and orders. Connect multiple URLs to distribute workloads across different services, and subscribe only to the events you need. If your server goes down, we automatically retry delivery. Webhook docs →
Pick only the event types your app needs.
Configure delivery method, retries, and security — not just where events land.
Protect your numbers with proactive safety tools and dedicated infrastructure. WhatsApp's AI anti-spam is aggressive — soft bans and blocks are common and depend on how you use the number: bulk sends, cold outreach, and how recipients react. We don't promise zero risk — we give you tools to scale more safely: isolated regional proxies, a built-in warm-up module, and a real-time Activity Safety Meter.
One API token for REST calls, Make/n8n modules, and agent tools — connect Whapi to any stack.
curl --request POST \
--url 'https://gate.whapi.cloud/messages/text' \
--header 'accept: application/json' \
--header 'authorization: Bearer {your_token}' \
--header 'content-type: application/json' \
--data '
{
"to": "15056482143",
"body": "Hello, world!"
}
'
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://gate.whapi.cloud/messages/text",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'to' => '15056482143',
'body' => 'Hello, world!'
]),
CURLOPT_HTTPHEADER => [
"accept: application/json",
"authorization: Bearer {your_token}",
"content-type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
import requests
url = "https://gate.whapi.cloud/messages/text"
payload = {
"to": "15056482143",
"body": "Hello, world!"
}
headers = {
"accept": "application/json",
"authorization": "Bearer {your_token}",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
const url = 'https://gate.whapi.cloud/messages/text';
const payload = { to: '15056482143', body: 'Hello, world!' };
const response = await fetch(url, {
method: 'POST',
headers: {
accept: 'application/json',
authorization: 'Bearer {your_token}',
'content-type': 'application/json',
},
body: JSON.stringify(payload),
});
console.log(await response.text());
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create("{"to":"15056482143","body":"Hello, world!"}", mediaType);
Request request = new Request.Builder()
.url("https://gate.whapi.cloud/messages/text")
.post(body)
.addHeader("accept", "application/json")
.addHeader("authorization", "Bearer {your_token}")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();
using RestSharp;
var options = new RestClientOptions("https://gate.whapi.cloud/messages/text");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("Authorization", "Bearer {your_token}");
request.AddJsonBody("{"to":"15056482143","body":"Hello, world!"}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
# First get chat_id via GET /chats, GET /groups, or GET /newsletters
curl --request POST \
--url 'https://gate.whapi.cloud/messages/text' \
--header 'accept: application/json' \
--header 'authorization: Bearer {your_token}' \
--header 'content-type: application/json' \
--data '
{
"to": "[email protected]",
"body": "Hello, group!"
}
'
// First get chat_id via GET /chats, GET /groups, or GET /newsletters
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://gate.whapi.cloud/messages/text",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'to' => '[email protected]',
'body' => 'Hello, group!'
]),
CURLOPT_HTTPHEADER => [
"accept: application/json",
"authorization: Bearer {your_token}",
"content-type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
# First get chat_id via GET /chats, GET /groups, or GET /newsletters
import requests
url = "https://gate.whapi.cloud/messages/text"
payload = {
"to": "[email protected]",
"body": "Hello, group!"
}
headers = {
"accept": "application/json",
"authorization": "Bearer {your_token}",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
// First get chat_id via GET /chats, GET /groups, or GET /newsletters
const url = 'https://gate.whapi.cloud/messages/text';
const payload = { to: '[email protected]', body: 'Hello, group!' };
const response = await fetch(url, {
method: 'POST',
headers: {
accept: 'application/json',
authorization: 'Bearer {your_token}',
'content-type': 'application/json',
},
body: JSON.stringify(payload),
});
console.log(await response.text());
// First get chat_id via GET /chats, GET /groups, or GET /newsletters
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create("{\"to\":\"[email protected]\",\"body\":\"Hello, group!\"}", mediaType);
Request request = new Request.Builder()
.url("https://gate.whapi.cloud/messages/text")
.post(body)
.addHeader("accept", "application/json")
.addHeader("authorization", "Bearer {your_token}")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();
// First get chat_id via GET /chats, GET /groups, or GET /newsletters
using RestSharp;
var options = new RestClientOptions("https://gate.whapi.cloud/messages/text");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("Authorization", "Bearer {your_token}");
request.AddJsonBody("{\"to\":\"[email protected]\",\"body\":\"Hello, group!\"}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
curl --request GET \
--url 'https://gate.whapi.cloud/chats?count=100' \
--header 'accept: application/json' \
--header 'authorization: Bearer {your_token}'
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://gate.whapi.cloud/chats?count=100",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"accept: application/json",
"authorization: Bearer {your_token}"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
import requests
url = "https://gate.whapi.cloud/chats?count=100"
headers = {
"accept": "application/json",
"authorization": "Bearer {your_token}"
}
response = requests.get(url, headers=headers)
print(response.text)
const url = 'https://gate.whapi.cloud/chats?count=100';
const response = await fetch(url, {
method: 'GET',
headers: {
accept: 'application/json',
authorization: 'Bearer {your_token}',
},
});
console.log(await response.text());
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://gate.whapi.cloud/chats?count=100")
.get()
.addHeader("accept", "application/json")
.addHeader("authorization", "Bearer {your_token}")
.build();
Response response = client.newCall(request).execute();
using RestSharp;
var options = new RestClientOptions("https://gate.whapi.cloud/chats?count=100");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("Authorization", "Bearer {your_token}");
var response = await client.GetAsync(request);
Console.WriteLine("{0}", response.Content);
curl --request GET \
--url 'https://gate.whapi.cloud/messages/list?count=100' \
--header 'accept: application/json' \
--header 'authorization: Bearer {your_token}'
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://gate.whapi.cloud/messages/list?count=100",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"accept: application/json",
"authorization: Bearer {your_token}"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
import requests
url = "https://gate.whapi.cloud/messages/list?count=100"
headers = {
"accept": "application/json",
"authorization": "Bearer {your_token}"
}
response = requests.get(url, headers=headers)
print(response.text)
const url = 'https://gate.whapi.cloud/messages/list?count=100';
const response = await fetch(url, {
method: 'GET',
headers: {
accept: 'application/json',
authorization: 'Bearer {your_token}',
},
});
console.log(await response.text());
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://gate.whapi.cloud/messages/list?count=100")
.get()
.addHeader("accept", "application/json")
.addHeader("authorization", "Bearer {your_token}")
.build();
Response response = client.newCall(request).execute();
using RestSharp;
var options = new RestClientOptions("https://gate.whapi.cloud/messages/list?count=100");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("Authorization", "Bearer {your_token}");
var response = await client.GetAsync(request);
Console.WriteLine("{0}", response.Content);
curl --request GET \
--url 'https://gate.whapi.cloud/groups' \
--header 'accept: application/json' \
--header 'authorization: Bearer {your_token}'
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://gate.whapi.cloud/groups",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"accept: application/json",
"authorization: Bearer {your_token}"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
import requests
url = "https://gate.whapi.cloud/groups"
headers = {
"accept": "application/json",
"authorization": "Bearer {your_token}"
}
response = requests.get(url, headers=headers)
print(response.text)
const url = 'https://gate.whapi.cloud/groups';
const response = await fetch(url, {
method: 'GET',
headers: {
accept: 'application/json',
authorization: 'Bearer {your_token}',
},
});
console.log(await response.text());
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://gate.whapi.cloud/groups")
.get()
.addHeader("accept", "application/json")
.addHeader("authorization", "Bearer {your_token}")
.build();
Response response = client.newCall(request).execute();
using RestSharp;
var options = new RestClientOptions("https://gate.whapi.cloud/groups");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("Authorization", "Bearer {your_token}");
var response = await client.GetAsync(request);
Console.WriteLine("{0}", response.Content);
curl --request POST \
--url https://gate.whapi.cloud/contacts \
--header 'accept: application/json' \
--header 'authorization: Bearer {your_token}' \
--header 'content-type: application/json' \
--data '
{
"force_check": false,
"contacts": [
"919984351847",
"61371989950"
]
}
'
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://gate.whapi.cloud/contacts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'force_check' => false,
'contacts' => ['919984351847', '61371989950']
]),
CURLOPT_HTTPHEADER => [
"accept: application/json",
"authorization: Bearer {your_token}",
"content-type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
import requests
url = "https://gate.whapi.cloud/contacts"
payload = {
"force_check": False,
"contacts": ["919984351847", "61371989950"]
}
headers = {
"accept": "application/json",
"authorization": "Bearer {your_token}",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
const url = 'https://gate.whapi.cloud/contacts';
const payload = {
force_check: false,
contacts: ['919984351847', '61371989950'],
};
const response = await fetch(url, {
method: 'POST',
headers: {
accept: 'application/json',
authorization: 'Bearer {your_token}',
'content-type': 'application/json',
},
body: JSON.stringify(payload),
});
console.log(await response.text());
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create("{"force_check":false,"contacts":["919984351847","61371989950"]}", mediaType);
Request request = new Request.Builder()
.url("https://gate.whapi.cloud/contacts")
.post(body)
.addHeader("accept", "application/json")
.addHeader("authorization", "Bearer {your_token}")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();
using RestSharp;
var options = new RestClientOptions("https://gate.whapi.cloud/contacts");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("Authorization", "Bearer {your_token}");
request.AddJsonBody("{"force_check":false,"contacts":["919984351847","61371989950"]}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
curl --request GET \
--url https://gate.whapi.cloud/contacts/ids/118876465958956%40lid \
--header 'accept: application/json' \
--header 'authorization: Bearer {your_token}'
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://gate.whapi.cloud/contacts/ids/118876465958956%40lid",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"accept: application/json",
"authorization: Bearer {your_token}"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
import requests
url = "https://gate.whapi.cloud/contacts/ids/118876465958956%40lid"
headers = {
"accept": "application/json",
"authorization": "Bearer {your_token}"
}
response = requests.get(url, headers=headers)
print(response.text)
const url = 'https://gate.whapi.cloud/contacts/ids/118876465958956%40lid';
const response = await fetch(url, {
method: 'GET',
headers: {
accept: 'application/json',
authorization: 'Bearer {your_token}',
},
});
console.log(await response.text());
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://gate.whapi.cloud/contacts/ids/118876465958956%40lid")
.get()
.addHeader("accept", "application/json")
.addHeader("authorization", "Bearer {your_token}")
.build();
Response response = client.newCall(request).execute();
using RestSharp;
var options = new RestClientOptions("https://gate.whapi.cloud/contacts/ids/118876465958956%40lid");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("Authorization", "Bearer {your_token}");
var response = await client.GetAsync(request);
Console.WriteLine("{0}", response.Content);
curl --request PATCH \
--url 'https://gate.whapi.cloud/settings' \
--header 'accept: application/json' \
--header 'authorization: Bearer {your_token}' \
--header 'content-type: application/json' \
--data '
{
"callback_backoff_delay_ms": 3000,
"max_callback_backoff_delay_ms": 900000,
"callback_persist": true,
"webhooks": [
{
"headers": {
"myKey": "secret-key"
},
"mode": "body",
"events": [
{
"type": "messages",
"method": "post"
},
{
"type": "statuses",
"method": "post"
},
{
"type": "groups",
"method": "patch"
}
],
"url": ""
}
]
}
'
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://gate.whapi.cloud/settings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'callback_backoff_delay_ms' => 3000,
'max_callback_backoff_delay_ms' => 900000,
'callback_persist' => true,
'webhooks' => [
[
'headers' => ['myKey' => 'secret-key'],
'mode' => 'body',
'events' => [
['type' => 'messages', 'method' => 'post'],
['type' => 'statuses', 'method' => 'post'],
['type' => 'groups', 'method' => 'patch']
],
'url' => ''
]
]
]),
CURLOPT_HTTPHEADER => [
"accept: application/json",
"authorization: Bearer {your_token}",
"content-type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
import requests
url = "https://gate.whapi.cloud/settings"
payload = {
"callback_backoff_delay_ms": 3000,
"max_callback_backoff_delay_ms": 900000,
"callback_persist": True,
"webhooks": [
{
"headers": {"myKey": "secret-key"},
"mode": "body",
"events": [
{"type": "messages", "method": "post"},
{"type": "statuses", "method": "post"},
{"type": "groups", "method": "patch"}
],
"url": ""
}
]
}
headers = {
"accept": "application/json",
"authorization": "Bearer {your_token}",
"content-type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)
const url = 'https://gate.whapi.cloud/settings';
const payload = {
callback_backoff_delay_ms: 3000,
max_callback_backoff_delay_ms: 900000,
callback_persist: true,
webhooks: [
{
headers: { myKey: 'secret-key' },
mode: 'body',
events: [
{ type: 'messages', method: 'post' },
{ type: 'statuses', method: 'post' },
{ type: 'groups', method: 'patch' },
],
url: '',
},
],
};
const response = await fetch(url, {
method: 'PATCH',
headers: {
accept: 'application/json',
authorization: 'Bearer {your_token}',
'content-type': 'application/json',
},
body: JSON.stringify(payload),
});
console.log(await response.text());
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create("{\"callback_backoff_delay_ms\":3000,\"max_callback_backoff_delay_ms\":900000,\"callback_persist\":true,\"webhooks\":[{\"headers\":{\"myKey\":\"secret-key\"},\"mode\":\"body\",\"events\":[{\"type\":\"messages\",\"method\":\"post\"},{\"type\":\"statuses\",\"method\":\"post\"},{\"type\":\"groups\",\"method\":\"patch\"}],\"url\":\"\"}]}", mediaType);
Request request = new Request.Builder()
.url("https://gate.whapi.cloud/settings")
.patch(body)
.addHeader("accept", "application/json")
.addHeader("authorization", "Bearer {your_token}")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();
using RestSharp;
var options = new RestClientOptions("https://gate.whapi.cloud/settings");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("Authorization", "Bearer {your_token}");
request.AddJsonBody("{\"callback_backoff_delay_ms\":3000,\"max_callback_backoff_delay_ms\":900000,\"callback_persist\":true,\"webhooks\":[{\"headers\":{\"myKey\":\"secret-key\"},\"mode\":\"body\",\"events\":[{\"type\":\"messages\",\"method\":\"post\"},{\"type\":\"statuses\",\"method\":\"post\"},{\"type\":\"groups\",\"method\":\"patch\"}],\"url\":\"\"}]}", false);
var response = await client.PatchAsync(request);
Console.WriteLine("{0}", response.Content);
Step-by-step guides with copy-paste code for Python, PHP, Node.js, and Java — plus open-source bots, checkers, and automation templates on GitHub. Fork a repo and ship faster. Browse 20+ repos on GitHub →
Same decision criteria as our full guide: cost model, onboarding, feature scope, and operational trade-offs between Meta’s Cloud API and Whapi.Cloud.
| Meta Cloud API | Whapi.Cloud API | |
|---|---|---|
| Pricing & onboarding | ||
| Outbound cost model | Per-message fees (category + market) | Flat subscription, no Meta fees |
| Pricing predictability | Variable (limits, auctions) | Predictable monthly cost |
| Onboarding speed | Multi-step verification & templates | QR scan — minutes to first message |
| Message templates | Required for most outbound | Not required — send any message type to anyone |
| Features & access | ||
| WhatsApp Groups | Limited — 8 members, enterprise | Full API groups (1024–2048) |
| Channels & statuses | Not available | Full API access |
| Number existence check | Not available | Available |
| Phone app + API on same number | Limited coexistence | Multi-device, app stays usable |
| Native features (catalogs, carts) | Basic messaging only | Groups, channels, statuses, catalogs |
| Risk & operations | ||
| Business category restrictions | Meta category gates | Use any number you already have |
| Message moderation | Meta pre/post-moderation | No pre-moderation |
| Ban / restriction profile | Multi-step restrictions | Soft bans, often recoverable |
| Warm-up & safety tools | Not available | Warm-up + Safety Meter |
| VoIP / calling API | Meta Cloud telephony | REST messaging only |
Developers worldwide rely on Whapi.Cloud to build automations, bots, CRM integrations, bulk messaging tools and advanced WhatsApp workflows. Our infrastructure processes millions of API requests with high stability — and grows every month.
active API channels
API requests processed monthly
roberto k. / Web Developer
Martin p. / Developer
Oscar T. / CTO
Billed monthly
Billed annually
Full API functionality for testing and development, with usage limits applied
Up to 5 active conversations per month
Up to 150 messages per day
Up to 30 WhatsApp number checks per day
Up to 1,000 API requests per month
Periodic activity required
Standard support (non-priority)
A stable and reliable service for production workloads with priority support
Unlimited messaging & media
Full access to Groups, Channels & Webhooks
No per-message charges
Priority live support & faster incident handling
Automatic number warming module
Built-in tools and automation integrations
Suitable for long-term, stable production workflows
Price per WhatsApp number. Discounts for multiple numbers.