Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Complete WhatsApp automation via Evolution API Go v3 - instances, messages (text/media/polls/carousels), groups, contacts, chats, communities, newsletters, and real-time webhooks
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 521% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 219% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 367% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 314% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 234% | 0% |
Complete WhatsApp automation via Evolution API Go v3. Send messages, manage groups, automate conversations, and integrate webhooks.
json5{ env: { EVOGO_API_URL: "http://localhost:8080", // Your API URL EVOGO_GLOBAL_KEY: "your-global-admin-key", // Admin key (instance mgmt) EVOGO_INSTANCE: "my-bot", // Instance name EVOGO_API_KEY: "your-instance-token" // Instance token (messaging) } }
bash# Create instance curl -X POST "$EVOGO_API_URL/instance/create" \ -H "apikey: $EVOGO_GLOBAL_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "my-bot", "token": "my-secret-token", "qrcode": true }' # Connect & get QR code curl -X POST "$EVOGO_API_URL/instance/connect" \ -H "apikey: $EVOGO_API_KEY" \ -H "Content-Type: application/json" \ -d '{"number": ""}'
Scan the QR code returned in qrcode.base64.
bashcurl -X POST "$EVOGO_API_URL/send/text" \ -H "apikey: $EVOGO_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "number": "5511999999999", "text": "Hello from evoGo! 🚀" }'
Two authentication levels:
| Type | Header | Usage | |------|--------|-------| | Global API Key | apikey: xxx | Admin: create/delete instances, logs | | Instance Token | apikey: xxx | Messaging: send messages, groups, contacts |
Set via environment or pass directly in headers.
| Context | Format | Example | |---------|--------|---------| | Sending messages | International (no +) | 5511999999999 | | Group participants | JID format | 5511999999999@s.whatsapp.net | | Groups | Group JID | 120363123456789012@g.us | | Newsletters | Newsletter JID | 120363123456789012@newsletter |
Add delay (milliseconds) to avoid rate limits:
json{ "number": "5511999999999", "text": "Message with delay", "delay": 2000 }
bashPOST /instance/create Header: apikey: $EVOGO_GLOBAL_KEY { "name": "bot-name", "token": "secret-token", "qrcode": true, "advancedSettings": { "rejectCalls": false, "groupsIgnore": false, "alwaysOnline": true, "readMessages": true, "readStatus": true, "syncFullHistory": true } }
Advanced Settings:
rejectCalls - Auto-reject callsgroupsIgnore - Ignore group messagesalwaysOnline - Stay online alwaysreadMessages - Auto-mark messages as readreadStatus - Auto-mark status as viewedsyncFullHistory - Sync full chat historybashPOST /instance/connect GET /instance/qr Header: apikey: $EVOGO_API_KEY {"number": ""} # Leave empty for QR, or phone number for pairing
bashGET /instance/status Header: apikey: $EVOGO_API_KEY
Returns: connected, connecting, disconnected
bashGET /instance/all Header: apikey: $EVOGO_GLOBAL_KEY
bashDELETE /instance/delete/{instance} Header: apikey: $EVOGO_GLOBAL_KEY
bashPOST /instance/forcereconnect/{instance} Header: apikey: $EVOGO_GLOBAL_KEY {"number": "5511999999999"}
bashGET /instance/logs/{instance}?start_date=2026-01-01&end_date=2026-02-10&level=info&limit=100 Header: apikey: $EVOGO_GLOBAL_KEY
Log levels: info, warn, error, debug
bashPOST /send/text { "number": "5511999999999", "text": "Hello World!", "delay": 1000, "mentionsEveryOne": false, "mentioned": ["5511888888888@s.whatsapp.net"] }
bashPOST /send/media { "number": "5511999999999", "url": "https://example.com/photo.jpg", "type": "image", "caption": "Check this out!", "filename": "photo.jpg" }
Media types:
image - JPG, PNG, GIF, WEBPvideo - MP4, AVI, MOV, MKVaudio - MP3, OGG, WAV (sent as voice note/PTT)document - PDF, DOC, DOCX, XLS, XLSX, PPT, TXT, ZIPptv - Round video (Instagram-style)bashPOST /send/media Content-Type: multipart/form-data number=5511999999999 type=image file=@/path/to/file.jpg caption=Photo caption filename=custom-name.jpg
bashPOST /send/poll { "number": "5511999999999", "question": "Best language?", "options": ["JavaScript", "Python", "Go", "Rust"], "selectableCount": 1 }
Get poll results:
bashGET /polls/{messageId}/results
bashPOST /send/sticker { "number": "5511999999999", "sticker": "https://example.com/sticker.webp" }
Auto-converts images to WebP format.
bashPOST /send/location { "number": "5511999999999", "latitude": -23.550520, "longitude": -46.633308, "name": "Avenida Paulista", "address": "Av. Paulista, São Paulo - SP" }
bashPOST /send/contact { "number": "5511999999999", "vcard": { "fullName": "João Silva", "phone": "5511988888888", "organization": "Company XYZ", "email": "joao@example.com" } }
bashPOST /send/carousel { "number": "5511999999999", "body": "Main carousel text", "footer": "Footer text", "cards": [ { "header": { "title": "Card 1", "subtitle": "Subtitle", "imageUrl": "https://example.com/img1.jpg" }, "body": {"text": "Card description"}, "footer": "Card footer", "buttons": [ { "displayText": "Click Me", "id": "btn1", "type": "REPLY" } ] } ] }
Button types:
REPLY - Simple replyURL - Opens linkCALL - Initiates callCOPY - Copies textbashPOST /message/react { "number": "5511999999999", "reaction": "👍", "id": "MESSAGE_ID", "fromMe": false, "participant": "5511888888888@s.whatsapp.net" # Required in groups }
Reactions: 👍, ❤️, 😂, 😮, 😢, 🙏, or "remove"
bashPOST /message/presence { "number": "5511999999999", "state": "composing", "isAudio": false }
States:
composing + isAudio: false → "typing..."composing + isAudio: true → "recording audio..."paused → Stops indicatorbashPOST /message/markread { "number": "5511999999999", "id": ["MESSAGE_ID_1", "MESSAGE_ID_2"] }
bashPOST /message/downloadmedia { "message": {} # Full message object from webhook }
Returns base64-encoded media.
bashPOST /message/edit { "chat": "5511999999999@s.whatsapp.net", "messageId": "MESSAGE_ID", "message": "Edited text" }
Limitations:
bashPOST /message/delete { "chat": "5511999999999@s.whatsapp.net", "messageId": "MESSAGE_ID" }
Limitations:
bashPOST /message/status { "id": "MESSAGE_ID" }
Returns delivery/read status.
bashGET /group/list # Basic info (JID + name) GET /group/myall # Full info (participants, settings, etc)
bashPOST /group/info { "groupJid": "120363123456789012@g.us" }
bashPOST /group/create { "groupName": "My Team", "participants": [ "5511999999999@s.whatsapp.net", "5511888888888@s.whatsapp.net" ] }
Requirements:
bashPOST /group/participant { "groupJid": "120363123456789012@g.us", "action": "add", "participants": ["5511999999999@s.whatsapp.net"] }
Actions:
add - Add membersremove - Remove memberspromote - Make admindemote - Remove adminbashPOST /group/settings { "groupJid": "120363123456789012@g.us", "action": "announcement" }
Settings:
announcement / not_announcement - Only admins send messageslocked / unlocked - Only admins edit group infoapproval_on / approval_off - Require approval to joinadmin_add / all_member_add - Who can add membersbashPOST /group/invitelink { "groupJid": "120363123456789012@g.us", "reset": false }
Set reset: true to revoke old link and generate new one.
bashPOST /group/join { "code": "https://chat.whatsapp.com/XXXXXX" }
Accepts full link or just the code.
bashPOST /group/leave { "groupJid": "120363123456789012@g.us" }
bash# Get pending requests POST /group/requests { "groupJid": "120363123456789012@g.us" } # Approve/Reject POST /group/requests/action { "groupJid": "120363123456789012@g.us", "action": "approve", "participants": ["5511999999999@s.whatsapp.net"] }
Actions: approve, reject
bash# Set photo POST /group/photo { "groupJid": "120363123456789012@g.us", "image": "https://example.com/photo.jpg" } # Set name POST /group/name { "groupJid": "120363123456789012@g.us", "name": "New Group Name" } # Set description POST /group/description { "groupJid": "120363123456789012@g.us", "description": "New description" }
bashPOST /chat/pin POST /chat/unpin { "chat": "5511999999999@s.whatsapp.net" }
bashPOST /chat/archive POST /chat/unarchive { "chat": "5511999999999@s.whatsapp.net" }
bashPOST /chat/mute POST /chat/unmute { "chat": "5511999999999@s.whatsapp.net" }
bashPOST /chat/history-sync-request
Requests full chat history sync (may take time).
bashPOST /user/info { "number": ["5511999999999", "5511888888888"], "formatJid": true }
Returns: status, profile photo, verified badge, linked devices, etc.
bashPOST /user/check { "number": ["5511999999999", "5511888888888"] }
Returns: isInWhatsapp (true/false) for each number.
bashPOST /user/avatar { "number": "5511999999999", "preview": false }
Preview options:
false - Full resolutiontrue - Low resolution previewbashGET /user/contacts
Lists all saved contacts.
bash# Get privacy settings GET /user/privacy # Set privacy settings POST /user/privacy { "groupAdd": "all", "lastSeen": "contacts", "status": "all", "profile": "all", "readReceipts": "all", "callAdd": "all", "online": "match_last_seen" }
Options: all, contacts, contact_blacklist, none, match_last_seen (online only)
bashPOST /user/block POST /user/unblock { "number": "5511999999999" } # Get block list GET /user/blocklist
bash# Set profile picture POST /user/profilePicture { "image": "https://example.com/photo.jpg" } # Set profile name POST /user/profileName { "name": "My Name" } # Set status/about POST /user/profileStatus { "status": "My custom status" }
Limits:
bash# To chat POST /label/chat { "jid": "5511999999999@s.whatsapp.net", "labelId": "1" } # To message POST /label/message { "jid": "5511999999999@s.whatsapp.net", "labelId": "1", "messageId": "MESSAGE_ID" }
bashPOST /unlabel/chat POST /unlabel/message { "jid": "5511999999999@s.whatsapp.net", "labelId": "1", "messageId": "MESSAGE_ID" # Only for /unlabel/message }
bashPOST /label/edit { "labelId": "1", "name": "New Label Name" }
bashGET /label
bashPOST /community/create { "communityName": "My Community", "description": "Optional description" }
bashPOST /community/add { "communityJID": "120363123456789012@g.us", "groupJID": ["120363111111111111@g.us"] } POST /community/remove { "communityJID": "120363123456789012@g.us", "groupJID": ["120363111111111111@g.us"] }
bashPOST /newsletter/create { "name": "My Channel", "description": "Optional description" }
bashGET /newsletter/list
bashPOST /newsletter/info { "jid": "120363123456789012@newsletter" }
bashPOST /newsletter/subscribe { "jid": "120363123456789012@newsletter" }
bashPOST /newsletter/messages { "jid": "120363123456789012@newsletter", "limit": 50 }
bashPOST /newsletter/link { "key": "INVITE_KEY" }
bashPOST /call/reject # Webhook payload from call event
Use with webhook automation to auto-reject calls.
bashfor number in 5511999999999 5511888888888 5511777777777; do curl -X POST "$EVOGO_API_URL/send/text" \ -H "apikey: $EVOGO_API_KEY" \ -H "Content-Type: application/json" \ -d "{ \"number\": \"$number\", \"text\": \"Broadcast message\", \"delay\": 2000 }" done
bashcurl -X POST "$EVOGO_API_URL/send/media" \ -H "apikey: $EVOGO_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "number": "120363123456789012@g.us", "url": "https://example.com/report.jpg", "type": "image", "caption": "Report ready! @5511999999999 please review", "mentionedJid": ["5511999999999@s.whatsapp.net"] }'
bash# 1. Create group GROUP_JID=$(curl -s -X POST "$EVOGO_API_URL/group/create" \ -H "apikey: $EVOGO_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "groupName": "Team Alpha", "participants": ["5511999999999@s.whatsapp.net"] }' | jq -r '.groupJid') # 2. Send welcome message curl -X POST "$EVOGO_API_URL/send/text" \ -H "apikey: $EVOGO_API_KEY" \ -H "Content-Type: application/json" \ -d "{ \"number\": \"$GROUP_JID\", \"text\": \"Welcome to Team Alpha! 🎉\" }"
bashcurl -X POST "$EVOGO_API_URL/user/check" \ -H "apikey: $EVOGO_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "number": [ "5511999999999", "5511888888888", "5511777777777" ] }'
Always add delays between messages:
json{"delay": 2000} // 2 seconds
Recommended:
HTTP Status Codes:
200 - Success400 - Bad request (check parameters)401 - Unauthorized (check API key)404 - Not found (instance/resource doesn't exist)500 - Server errorCommon Issues:
| Error | Solution | |-------|----------| | Instance not connected | Run POST /instance/connect | | Invalid phone format | Use international without +: 5511999999999 | | Message not sent | Check GET /instance/status | | Group operation failed | Verify you're admin (for admin operations) |
Configure webhooks to receive real-time events:
Use POST /webhook/set endpoint to configure webhook URL (see Postman collection for details).
bash# 1. Check if instance exists GET /instance/all # 2. Force reconnect POST /instance/forcereconnect/{instance} # 3. Check logs GET /instance/logs/{instance}?level=error
GET /instance/status+ or spaces)xxxxx@g.usnumber@s.whatsapp.netnumber@s.whatsapp.net for users, xxxxx@g.us for groupsNot Working (v3.0):
/send/button - Interactive buttons (deprecated by WhatsApp)/send/list - Interactive lists (deprecated by WhatsApp)These endpoints exist but are non-functional due to WhatsApp API changes.
evoGo simplifies WhatsApp automation with Evolution API Go v3. For advanced features, check the full Postman collection or API documentation.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 5,979 | 4,536 | -24% | 1 | 1 | 0% | 1,215 | 7,551 | +521% | 0 | 0 | — |
case-02 | fail→pass | 11,478 | 3,716 | -68% | 1 | 1 | 0% | 2,309 | 7,364 | +219% | 0 | 0 | — |
case-03 | fail→pass | 9,842 | 9,888 | +0% | 1 | 1 | 0% | 1,809 | 8,451 | +367% | 0 | 0 | — |
case-04 | pass→pass | 9,892 | 8,661 | -12% | 1 | 1 | 0% | 2,102 | 8,514 | +305% | 0 | 0 | — |
case-05 | pass→pass | 27,760 | 7,936 | -71% | 1 | 1 | 0% | 1,620 | 8,353 | +416% | 0 | 0 | — |
case-06 | pass→pass | 16,321 | 9,366 | -43% | 1 | 1 | 0% | 2,839 | 8,511 | +200% | 0 | 0 | — |
case-07 | fail→pass | 10,022 | 4,326 | -57% | 1 | 1 | 0% | 1,792 | 7,417 | +314% | 0 | 0 | — |
case-08 | fail→pass | 12,022 | 6,820 | -43% | 1 | 1 | 0% | 2,400 | 8,024 | +234% | 0 | 0 | — |
case-09 | fail→pass | 9,046 | 3,719 | -59% | 1 | 1 | 0% | 1,568 | 7,280 | +364% | 0 | 0 | — |
case-10 | fail→pass | 10,780 | 3,515 | -67% | 1 | 1 | 0% | 2,297 | 7,219 | +214% | 0 | 0 | — |
case-11 | fail→pass | 7,932 | 7,080 | -11% | 1 | 1 | 0% | 1,435 | 6,898 | +381% | 0 | 0 | — |
case-12 | fail→pass | 8,265 | 3,021 | -63% | 1 | 1 | 0% | 1,686 | 7,190 | +326% | 0 | 0 | — |
case-13 | pass→pass | 9,168 | 4,662 | -49% | 1 | 1 | 0% | 1,688 | 7,524 | +346% | 0 | 0 | — |
case-14 | fail→pass | 10,944 | 4,280 | -61% | 1 | 1 | 0% | 2,173 | 7,368 | +239% | 0 | 0 | — |
case-15 | pass→pass | 7,170 | 3,630 | -49% | 1 | 1 | 0% | 1,300 | 7,272 | +459% | 0 | 0 | — |
case-16 | fail→pass | 7,658 | 2,980 | -61% | 1 | 1 | 0% | 1,303 | 7,207 | +453% | 0 | 0 | — |
case-17 | pass→pass | 5,912 | 4,445 | -25% | 1 | 1 | 0% | 1,125 | 7,111 | +532% | 0 | 0 | — |
case-18 | fail→pass | 5,988 | 2,500 | -58% | 1 | 1 | 0% | 1,067 | 6,987 | +555% | 0 | 0 | — |
case-19 | pass→pass | 6,200 | 1,992 | -68% | 1 | 1 | 0% | 1,091 | 6,904 | +533% | 0 | 0 | — |
case-20 | fail→pass | 5,943 | 3,355 | -44% | 1 | 1 | 0% | 1,059 | 7,081 | +569% | 0 | 0 | — |
case-21 | fail→pass | 12,552 | 5,410 | -57% | 1 | 1 | 0% | 2,607 | 7,716 | +196% | 0 | 0 | — |
case-22 | fail→pass | 6,766 | 4,056 | -40% | 1 | 1 | 0% | 1,330 | 7,238 | +444% | 0 | 0 | — |
case-23 | fail→pass | 13,552 | 4,210 | -69% | 1 | 1 | 0% | 2,755 | 7,305 | +165% | 0 | 0 | — |
case-24 | fail→pass | 8,168 | 2,494 | -69% | 1 | 1 | 0% | 1,517 | 7,037 | +364% | 0 | 0 | — |
case-25 | fail→pass | 7,667 | 2,750 | -64% | 1 | 1 | 0% | 1,541 | 7,105 | +361% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted. The headline lift of +72 percentage points is the difference between those two pass rates over the 25 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 7/27/2026 | +52% |
Other measured skills in the registry, with their headline benchmark lift.