Run WAHA on your Mac in under ten minutes
WhatsApp HTTP API, self-hosted on your own machine. Docker does the heavy lifting, so there is no Chrome install, no Node version juggling, no dependency hell. Six commands and you are sending messages.
Which Mac are you on?Apple Silicon needs the ARM image. Pick one and the commands below update.
Install Docker Desktop
WAHA runs on top of Docker, and that is the only prerequisite. Install Docker Desktop for Mac, launch it, and wait for the whale icon in the menu bar to go steady before you carry on.
brew install --cask docker
Or download it directly from docker.com. Once it is running, confirm the daemon is alive:
docker --version docker info | head -5
Not sure which chip you have? Ask the machine:
uname -m
arm64 means Apple Silicon (M1 through M4). x86_64 means Intel. Set the switch above to match.
Make a working folder
WAHA writes a credentials file and a sessions folder into whatever directory you run it from. Give it a home of its own so nothing lands in your home folder by accident.
mkdir -p ~/waha && cd ~/waha
Every command from here on assumes you are inside ~/waha. If you open a new Terminal tab, run cd ~/waha again first.
Download the image
Apple Silicon needs the ARM build. Pull it, then tag it as devlikeapro/waha so every later command works unchanged.
Intel Macs use the standard image, so this is a single pull.
# Download the ARM image docker pull devlikeapro/waha:arm # Rename it, so you can use devlikeapro/waha everywhere else docker tag devlikeapro/waha:arm devlikeapro/waha
docker pull devlikeapro/waha
It is roughly a gigabyte, so this is the slow step. Good moment to fill the kettle.
Generate your credentials
This one-off command creates a .env file in your folder holding the dashboard login and your API key.
docker run --rm -v "$(pwd)":/app/env devlikeapro/waha init-waha /app/env
You will get output along these lines:
Credentials generated. Dashboard and Swagger: - Username: admin - Password: 11111111111111111111111111111111 API key: - 00000000000000000000000000000000
.env file in ~/waha. Open it any time you forget them.cat ~/waha/.env
Start the server
This runs WAHA in the foreground on port 3000, with your sessions folder mounted so logins survive a restart.
docker run -it \ --env-file "$(pwd)/.env" \ -v "$(pwd)/sessions:/app/.sessions" \ --rm -p 3000:3000 \ --name waha devlikeapro/waha
Leave that Terminal window running and open the dashboard at localhost:3000/dashboard. Sign in with the username and password from step 3, then connect to the server using the API key.
This command is for getting started only. Before you put anything real on it, work through the WAHA install and update guide to secure the instance properly.
If port 3000 is already taken by something else, remap it and use the new port everywhere below:
lsof -i :3000
Start a session and scan the QR
Have your phone to hand with WhatsApp installed. In the dashboard the default session starts at STOPPED.
- Start the default session, leaving every setting as it comes.
- Wait for the status to reach
SCAN_QR, then click the camera icon. - On your phone, go to Settings, Linked devices, Link a device and scan the code.
- The status moves to
WORKING. You are connected.
Stop the session and start it again. The QR expires quickly, so scan it promptly once it appears.
Send your first message
Swap 123123 for your own number without the plus sign, keeping the @c.us suffix, and swap the placeholder key for the real one from your .env file.
curl -X 'POST' \
'http://localhost:3000/api/sendText' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-H "X-Api-Key: 00000000000000000000000000000000" \
-d '{
"chatId": "[email protected]",
"text": "Hi there!",
"session": "default"
}' fetch('http://localhost:3000/api/sendText', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'X-Api-Key': '00000000000000000000000000000000'
},
body: JSON.stringify({
chatId: "[email protected]",
text: "Hi there!",
session: "default"
})
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error)); import requests
url = "http://localhost:3000/api/sendText"
headers = {
"Accept": "application/json",
"Content-Type": "application/json",
"X-Api-Key": "00000000000000000000000000000000"
}
data = {
"chatId": "[email protected]",
"text": "Hi there!",
"session": "default"
}
response = requests.post(url, json=data, headers=headers)
print(response.json()) Prefer clicking to typing? Open Swagger at localhost:3000/#/chatting, authorise with your API key, expand POST /api/sendText, hit Try it out, drop your number in and Execute.
Stopping, restarting and updating
Press Ctrl+C in the running Terminal window to stop the server. Your session data stays in ~/waha/sessions, so the next start will not ask you to scan again.
# Stop it from another tab docker stop waha # Pull the latest build docker pull devlikeapro/waha # Start it again cd ~/waha && docker run -it --env-file "$(pwd)/.env" \ -v "$(pwd)/sessions:/app/.sessions" \ --rm -p 3000:3000 --name waha devlikeapro/waha
docker logs -f waha
What to do next
You have a working WhatsApp HTTP API on your own machine. From here:
- Point a webhook at your own endpoint to receive inbound messages.
- Wire it into n8n, Make or your own service.
- Read the security and storage guides before anything goes live.
- Run it on a real UK Numbrrs number rather than a personal handset.
Instructions adapted from the WAHA quick start guide. Back to the Numbrrs help centre.