Business WhatsApp on your own server
WALazy connects your WhatsApp numbers to an API, a team inbox, campaigns and automations. Messages, contacts and files stay on the server you run.
Accounts are created by your workspace admin.
Rina Wulandari
via Main CS
!ai what time does the shop open on Sunday?
On Sundays we're open 9 am to 3 pm. You can still send online orders on WhatsApp any time.
If I order 50 bouquets for an office event, is there a discount?
Yes, Rina. 50 bouquets get 10% off. Here's the catalog.
Bouquet-Catalog-2026.pdf
Works with
- OpenAI and compatible APIs
- Google Sheets
- Webhooks and HTTP
- TypeScript plugins
- SQLite or MySQL
One dashboard for all of your WhatsApp work
Pick a tab to see the parts your team uses every day.
-
RW
Rina Wulandari
Yes, Rina. 50 bouquets get…
-
BS
1
Budi Santoso
!track JNE88120045
-
CJ
4
Central Java Resellers
Hendra: any red roses left?
-
SS
Sehat Sentosa Pharmacy
Order #1042 has shipped
Rina Wulandari
+62 812-3456-7890
!ai what time does the shop open on Sunday?
On Sundays we're open 9 am to 3 pm. You can still send online orders on WhatsApp any time.
If I order 50 bouquets for an office event, is there a discount?
Internal note: returning customer, give wholesale prices.
Yes, Rina. 50 bouquets get 10% off. Here's the catalog.
Chats from every number land in one inbox. Assign them to agents, write internal notes, and see bot replies in the same thread.
-
Trigger
Incoming message
-
Logic
Starts with !ai?
No: Wait for reply
-
AI
Ask AI
-
Action
Send the answer
+ Save to Sheets
Build flows by dragging blocks. Test them with real messages before you switch them on.
Eid promo: loyal customers
Running- Sent
- 842
- Waiting
- 351
- Failed
- 7
Numbers in rotation
Random 8–20 s delay, 60 s pause every 30 messages
Send to contact labels on a schedule, with random delays and several numbers taking turns.
import { definePlugin } from 'walazy'
export default definePlugin({
permissions: ['reply', 'storage', 'send', 'schedule'],
commands: [{
name: 'stok',
async run(ctx) {
const item = ctx.command!.argsText
const stock = await ctx.storage.get<number>(item)
await ctx.reply(stock === null ? 'Not found' : `${item}: ${stock}`)
},
}],
schedules: [{
name: 'morning-report',
cron: '0 8 * * 1-5',
async run(ctx) {
await ctx.send('6281234567890', 'Stock report is ready')
},
}],
})
Write commands and scheduled jobs in the Plugin Studio. Plugins run sandboxed, with only the permissions they declare.
Start in three steps
-
1
Connect a number
Add a device, then scan the QR code or enter the pairing code in WhatsApp on your phone.
-
2
Set up your team and automations
Invite members with their roles, create auto replies and workflows, or enable plugins.
-
3
Send and reply
Messages arrive in the team inbox, your apps send through the API, and campaigns run on schedule.
What it does
Send
- REST API
- Send text, images, video and documents from your own apps, with a playground to try every call.
- Quick Send
- One-off messages straight from the dashboard.
- Broadcast Campaigns
- Send to contact labels with schedules, random delays and several numbers in rotation.
Reply
- Live Chat (Inbox)
- One inbox for every agent: assignment, internal notes, statuses, and bot replies recorded in the thread.
- Saved replies
- Ready answers you call up with "/" while typing.
- Chat Automations
- Automatic replies triggered by keywords.
Automate
- Visual Workflows
- Build flows with conditions, waiting for answers, AI, HTTP and Google Sheets, then test them with real messages.
- Plugins
- Commands and scheduled jobs in TypeScript, sandboxed, with the permissions you choose.
- Webhooks and Custom API Mappers
- Forward incoming messages to other systems, or turn their data into WhatsApp messages.
Manage
- Device Connection
- Many numbers at once, linked with a QR or a pairing code.
- Workspaces
- Separate team, devices and data per client or department, with member invitations.
- Users and Roles
- Decide who can open and change each menu.
Send a message with one request
Create an API key in the REST API menu, then call the endpoint from any app. The response carries the WhatsApp message ID.
curl -X POST https://walazy.atherisholding.com/api/v1/send \
-H "Authorization: Bearer $WALAZY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"device_id": 1, "to": "6281234567890", "text": "Order #1042 has shipped, tracking JNE 8812 0045 7731"}'
const res = await fetch('https://walazy.atherisholding.com/api/v1/send', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.WALAZY_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ device_id: 1, to: '6281234567890', text: "Order #1042 has shipped, tracking JNE 8812 0045 7731" }),
})
const { data } = await res.json() // data.message_id
$ch = curl_init('https://walazy.atherisholding.com/api/v1/send');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('WALAZY_API_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'device_id' => 1, 'to' => '6281234567890', 'text' => "Order #1042 has shipped, tracking JNE 8812 0045 7731",
]),
]);
$data = json_decode(curl_exec($ch), true)['data']; // message_id
Response
{ "ok": true, "code": 200, "message": "Success",
"data": { "message_id": "3EB0E35DE40D0800310A41" } }
Safe for your customers' data
Built to run on your own server, with protections that cannot be switched off by accident.
Data on your server
Messages, contacts and files live in the database and storage you run.
Hashed API keys
A key is shown once when it is created, then only its hash is kept.
Encrypted credentials
AI keys, Google accounts and HTTP headers are encrypted and never sent to the browser.
Sandboxed plugins
No access to files, the network or server keys beyond the permissions you grant per workspace.
Guarded outbound requests
Requests to internal network addresses are blocked, and secret headers are dropped on cross-domain redirects.
Separate workspaces
Each workspace has its own devices, contacts, API keys and roles, invisible to the others.
Frequently asked questions
Is this the official WhatsApp API?
No. WALazy connects as a linked device, like WhatsApp Web. Only message contacts who expect to hear from you: numbers that get reported as spam can be banned by WhatsApp.
How many numbers can I connect?
The app sets no limit. Each number runs as one linked-device session, so your server's capacity is the limit.
What server do I need?
A server with Node.js 24 or newer and an SQLite or MySQL database. Add an SMTP server for invitation emails.
Can I use it for several clients?
Yes. Each client or department gets its own workspace, with its own devices, contacts, API keys and team.
Which AI can workflows use?
Any service compatible with the OpenAI API: OpenAI, OpenRouter, Groq, DeepSeek, or your own AI server.
What if I need a feature that is not there?
Write a TypeScript plugin in the Plugin Studio. Plugins can have commands, scheduled jobs, per-workspace settings and npm packages.
Ready to connect your first number?
Sign in, add a device and scan the QR code with your phone.