Evolution API
Open-source WhatsApp integration API supporting Baileys (WhatsApp Web) and official WhatsApp Business API (Cloud API). Built with Node.js + TypeScript + Express.js + Prisma.
Authentication
All requests use the apikey header. Two levels of keys exist:
- Global API Key: Set via
AUTHENTICATION_API_KEYenv var. Has full access to all instances. - Instance Token: Per-instance key returned on creation. Scoped to that instance only.
apikey: YOUR_API_KEYEvery request follows this pattern:
curl --request <METHOD> \
--url https://<SERVER_URL>/<path>/{instanceName} \
--header 'Content-Type: application/json' \
--header 'apikey: <api-key>' \
--data '<json-body>'Instance Lifecycle
Create Instance
POST /instance/create
{
"instanceName": "my-instance",
"integration": "WHATSAPP-BAILEYS",
"token": "optional-custom-token",
"qrcode": true,
"number": "5511999999999",
"rejectCall": true,
"msgCall": "I can't answer calls",
"groupsIgnore": true,
"alwaysOnline": true,
"readMessages": true,
"readStatus": true,
"syncFullHistory": true,
"webhook": {
"url": "https://your-server.com/webhook",
"byEvents": false,
"base64": true,
"headers": { "authorization": "Bearer token" },
"events": ["MESSAGES_UPSERT", "CONNECTION_UPDATE"]
}
}Response (201):
{
"instance": {
"instanceName": "my-instance",
"instanceId": "af6c5b7c-ee27-4f94-9ea8-192393746ddd",
"status": "created"
},
"hash": { "apikey": "generated-instance-token" },
"qrcode": { "base64": "data:image/png;base64,..." }
}The integration field accepts:
WHATSAPP-BAILEYS— Free, based on WhatsApp Web (Baileys library)WHATSAPP-BUSINESS— Official Meta Cloud API (requires Facebook App setup)
Connect Instance (get QR code)
GET /instance/connect/{instanceName}Returns QR code as base64 for scanning with WhatsApp mobile app.
Check Connection State
GET /instance/connectionState/{instanceName}Returns: open, close, or connecting.
Other Instance Operations
| Method | Endpoint | Description |
|---|---|---|
| GET | /instance/fetchInstances | List all instances |
| PUT | /instance/restart/{instance} | Restart instance |
| DELETE | /instance/logout/{instance} | Logout (keep instance) |
| DELETE | /instance/delete/{instance} | Delete instance entirely |
| POST | /instance/setPresence/{instance} | Set online/offline status |
Sending Messages
Text Message
POST /message/sendText/{instanceName}
{
"number": "5511999999999",
"text": "Hello from Evolution API!",
"delay": 1200,
"linkPreview": true,
"mentionsEveryOne": false,
"mentioned": ["5511888888888@s.whatsapp.net"]
}Response (201):
{
"key": {
"remoteJid": "5511999999999@s.whatsapp.net",
"fromMe": true,
"id": "BAE594145F4C59B4"
},
"message": { "extendedTextMessage": { "text": "Hello from Evolution API!" } },
"messageTimestamp": "1717689097",
"status": "PENDING"
}Number format: Use full international format without + sign. For groups, use the group JID (e.g., 120363025486748009@g.us).
Reply / Quote a Message
Add quoted to any send payload:
{
"number": "5511999999999",
"text": "This is a reply",
"quoted": {
"key": { "id": "ORIGINAL_MESSAGE_ID" },
"message": { "conversation": "Original message text" }
}
}Media Message
POST /message/sendMedia/{instanceName}
{
"number": "5511999999999",
"mediatype": "image",
"mimetype": "image/png",
"caption": "Check this out",
"media": "https://example.com/image.png"
}mediatype options: image, video, document. media accepts a URL or base64-encoded string.
Audio Message
POST /message/sendWhatsAppAudio/{instanceName}
{
"number": "5511999999999",
"audio": "https://example.com/audio.mp3"
}Audio is automatically converted to WhatsApp PTT (push-to-talk) format.
Other Message Types
| Endpoint | Body fields | Notes |
|---|---|---|
POST /message/sendLocation/{instance} | number, latitude, longitude, name, address | |
POST /message/sendContact/{instance} | number, contact: [{fullName, wuid, phoneNumber}] | |
POST /message/sendReaction/{instance} | key: {remoteJid, fromMe, id}, reaction | Use empty string to remove |
POST /message/sendPoll/{instance} | number, name, values[], selectableCount | |
POST /message/sendList/{instance} | number, title, description, buttonText, footerText, sections[] | |
POST /message/sendButtons/{instance} | number, title, description, buttons[], footer | |
POST /message/sendSticker/{instance} | number, sticker (URL or base64) | |
POST /message/sendStatus/{instance} | type, content, statusJidList[], caption | Post to WhatsApp Status |
Webhook Configuration
Set Webhook via API
POST /webhook/set/{instanceName}
{
"webhook": {
"enabled": true,
"url": "https://your-server.com/webhook",
"webhookByEvents": false,
"webhookBase64": true,
"events": [
"MESSAGES_UPSERT",
"MESSAGES_UPDATE",
"CONNECTION_UPDATE",
"SEND_MESSAGE"
]
}
}When webhookByEvents is true, events are sent to {url}/{EVENT_NAME} (e.g., /webhook/MESSAGES_UPSERT).
Get Webhook Config
GET /webhook/find/{instanceName}For the complete list of available events, see references/events.md.
Chat Operations
| Method | Endpoint | Body | Description |
|---|---|---|---|
| POST | /chat/checkIsWhatsApp/{instance} | numbers: ["5511..."] | Verify numbers on WhatsApp |
| POST | /chat/findMessages/{instance} | where: {key: {remoteJid}} | Search messages |
| POST | /chat/findChats/{instance} | {} | List all chats |
| POST | /chat/findContacts/{instance} | where: {id} | Search contacts |
| POST | /chat/markMessageAsRead/{instance} | readMessages: [{remoteJid, id}] | Mark as read |
| POST | /chat/archiveChat/{instance} | chat, archive: true | Archive/unarchive chat |
| DELETE | /chat/deleteMessageForEveryone/{instance} | key: {remoteJid, fromMe, id} | Delete for everyone |
| POST | /chat/updateMessage/{instance} | number, text, key: {id} | Edit sent message |
| POST | /chat/sendPresence/{instance} | number, presence | Show typing/recording |
| POST | /chat/getBase64/{instance} | message: {key} | Get media as base64 |
presence values: composing, recording, paused.
Group Management
| Method | Endpoint | Body / Params | Description |
|---|---|---|---|
| POST | /group/create/{instance} | subject, participants[] | Create group |
| GET | /group/fetchAllGroups/{instance} | query: getParticipants=true | List all groups |
| GET | /group/findGroupInfos/{instance}?groupJid= | query param | Group details |
| GET | /group/inviteCode/{instance}?groupJid= | query param | Get invite link |
| GET | /group/participants/{instance}?groupJid= | query param | List members |
| POST | /group/updateParticipant/{instance} | groupJid, action, participants[] | Add/remove/promote/demote |
| POST | /group/updateSetting/{instance} | groupJid, action | Lock/unlock group settings |
| POST | /group/toggleEphemeral/{instance} | groupJid, expiration | Set disappearing messages |
| DELETE | /group/leaveGroup/{instance} | groupJid | Leave group |
action for participants: add, remove, promote, demote.
Profile Settings
| Method | Endpoint | Description |
|---|---|---|
| POST | /profile/fetchProfile/{instance} | Fetch profile info |
| POST | /profile/updateProfileName/{instance} | Update display name |
| POST | /profile/updateProfileStatus/{instance} | Update status text |
| POST | /profile/updateProfilePicture/{instance} | Update avatar |
| DELETE | /profile/removeProfilePicture/{instance} | Remove avatar |
| GET | /profile/fetchPrivacySettings/{instance} | Get privacy settings |
| POST | /profile/updatePrivacySettings/{instance} | Update privacy |
Integrations
Evolution API supports chatbot integrations configured per-instance:
| Integration | Endpoints prefix | Description |
|---|---|---|
| Typebot | /typebot/ | Conversational bot flows |
| Chatwoot | /chatwoot/ | Help desk / CRM |
| OpenAI | /openai/ | AI-powered bots + audio transcription |
| Dify | /dify/ | AI agent platform |
| n8n | /n8n/ | Workflow automation |
| Flowise | /flowise/ | LLM flow builder |
| EvoAI | /evoai/ | Evolution's own AI bot |
Each integration follows the CRUD pattern: create, find, update, delete, settings, change-status, fetch-session.
Event Delivery Channels
Beyond webhooks, Evolution API can deliver events via:
- RabbitMQ —
POST /rabbitmq/set/{instance} - Amazon SQS —
POST /sqs/set/{instance} - WebSocket (Socket.io) —
POST /websocket/set/{instance} - Apache Kafka — Via environment variables
Advanced References
- Full endpoint table: See references/api-endpoints.md
- Environment variables (self-hosted): See references/environment-variables.md
- Webhook events catalog: See references/events.md