base on WAHA - WhatsApp HTTP API (REST API) that you can configure in a click! 3 engines: WEBJS (browser based), NOWEB (websocket nodejs), GOWS (websocket go) # WAHA <p align="center"> <img src="./logo.png" style='border-radius: 50%' width='150'/> </p> **WAHA** - **W**hats**A**pp **H**TTP **A**PI (REST API) that you can install on your own server and run in less than 5 minutes! [![Docker Pulls](https://img.shields.io/docker/pulls/devlikeapro/waha)](https://hub.docker.com/r/devlikeapro/waha) - Documentation: [https://waha.devlike.pro/](https://waha.devlike.pro/) - Dashboard Example: [https://waha.devlike.pro/dashboard](https://waha.devlike.pro/dashboard) - Swagger Example: [https://waha.devlike.pro/swagger](https://waha.devlike.pro/swagger) # Tables of Contents <!-- toc --> - [Quick start](#quick-start) * [Requirements](#requirements) * [Send your first message](#send-your-first-message) + [1. Download image](#1-download-image) + [2. Run WhatsApp HTTP API](#2-run-whatsapp-http-api) + [3. Start a new session](#3-start-a-new-session) + [4. Get and scan QR](#4-get-and-scan-qr) + [5. Get the screenshot](#5-get-the-screenshot) + [6. Send a text message](#6-send-a-text-message) * [What is next?](#what-is-next) - [Development](#development) * [Start the project](#start-the-project) <!-- tocstop --> # Quick start ## Requirements Only thing that you must have - installed docker. Please follow the original instruction <a href="https://docs.docker.com/get-docker/" target="_blank" rel="noopener">how to install docker -></a>. When you are ready - come back and follows the below steps to send the first text message to WhatsApp via HTTP API! ## Send your first message Let's go over steps that allow you to send your first text message via WhatsApp HTTP API! ### 1. Download image Assuming you have installed [Docker](https://docs.docker.com/get-docker/), let's download the image. ```bash docker pull devlikeapro/waha ``` ```bash docker login -u devlikeapro -p {KEY} docker pull devlikeapro/waha-plus docker logout ``` Read more about how to get `PASSWORD` for [**➕ WAHA Plus**](https://waha.devlike.pro/docs/how-to/waha-plus/) ### 2. Run WhatsApp HTTP API Run WhatsApp HTTP API: ```bash docker run -it --rm -p 3000:3000/tcp --name waha devlikeapro/waha # It prints logs and the last line must be # WhatsApp HTTP API is running on: http://[::1]:3000 ``` Open the link in your browser [http://localhost:3000/](http://localhost:3000/) and you'll see API documentation (Swagger). ### 3. Start a new session To start a new session you should have your mobile phone with installed WhatsApp application close to you. Please go and read how what we'll need to a bit later: <a href="https://faq.whatsapp.com/381777293328336/?helpref=hc_fnav" target="_blank"> How to log in - the instruction on WhatsApp site </a> When your ready - find `POST /api/sessions`, click on **Try it out**, then **Execute** a bit below. The example payload: ```json { "name": "default" } ``` By using the request with `name` values you can start multiple session (WhatsApp accounts) inside the single docker container in Plus ### 4. Get and scan QR Find `GET /api/screenshot` and execute it, it shows you QR code. **Scan the QR with your cell phone's WhatsApp app.** ### 5. Get the screenshot Execute `GET /api/screenshot` after a few seconds after scanning the QR - it'll show you the screenshot of you Whatsapp instance. If you can get the actual screenshot - then you're ready to start sending messages! ### 6. Send a text message Let's send a text message - find `POST /api/sendText` in [swagger](http://localhost:3000/) and change `chatId` this way: use a phone international phone number without `+` symbol and add `@c.us` at the end. For phone number `12132132131` the `chatId` is `[email protected]`. The example payload: ```json { "chatId": "[email protected]", "text": "Hi there!", "session": "default" } ``` Also, you can use `curl` and send POST request like this: ```bash # Phone without + export PHONE=12132132130 curl -d "{\"chatId\": \"${PHONE}@c.us\", \"text\": \"Hello from WhatsApp HTTP API\" }" -H "Content-Type: application/json" -X POST http://localhost:3000/api/sendText ``` ## What is next? [Go and read the full documentation!](https://waha.devlike.pro/docs/overview/introduction/) # Development ## Start the project 1. Clone the repository 2. Make sure you're using node>=22 (check [.nvmrc](/.nvmrc) to get the version) 3. Run the following commands: ```bash # Install dependencies yarn install # Fetch and compile proto files yarn gows:proto # Run yarn start # open http://localhost:3000 ```", Assign "at most 3 tags" to the expected json: {"id":"13017","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"