Skip to content

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.

RW

Rina Wulandari

via Main CS

!ai what time does the shop open on Sunday?

AI !ai workflow

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?

Dimas took over the conversation
Dimas (CS)

Yes, Rina. 50 bouquets get 10% off. Here's the catalog.

Bouquet-Catalog-2026.pdf

Type a reply, / for saved replies

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.

Rina Wulandari

+62 812-3456-7890

Assigned to Dimas Open

!ai what time does the shop open on Sunday?

AI !ai workflow

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.

Dimas (CS)

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.

  1. Trigger

    Incoming message

  2. Logic

    Starts with !ai?

    No: Wait for reply

  3. AI

    Ask AI

  4. 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

CS Utama CS 2 Marketing

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. 1

    Connect a number

    Add a device, then scan the QR code or enter the pairing code in WhatsApp on your phone.

  2. 2

    Set up your team and automations

    Invite members with their roles, create auto replies and workflows, or enable plugins.

  3. 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.

Sign in to the dashboard