Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Complete WhatsApp automation via Evolution API Go v3 - instances, messages (text/media/polls/carousels), groups, contacts, chats, communities, newsletters, and real-time webhooks
Complete WhatsApp automation via Evolution API Go v3 - instances, messages (text/media/polls/carousels), groups, contacts, chats, communities, newsletters, and real-time webhooks
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
Complete WhatsApp automation via Evolution API Go v3. Send messages, manage groups, automate conversations, and integrate webhooks.
{ 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) } }
# 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.
curl -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: TypeHeaderUsageGlobal API Keyapikey: xxxAdmin: create/delete instances, logsInstance Tokenapikey: xxxMessaging: send messages, groups, contacts Set via environment or pass directly in headers.
ContextFormatExampleSending messagesInternational (no +)5511999999999Group participantsJID format5511999999999@s.whatsapp.netGroupsGroup JID120363123456789012@g.usNewslettersNewsletter JID120363123456789012@newsletter
Add delay (milliseconds) to avoid rate limits: { "number": "5511999999999", "text": "Message with delay", "delay": 2000 }
Create Instance POST /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 calls groupsIgnore - Ignore group messages alwaysOnline - Stay online always readMessages - Auto-mark messages as read readStatus - Auto-mark status as viewed syncFullHistory - Sync full chat history Connect / Get QR Code POST /instance/connect GET /instance/qr Header: apikey: $EVOGO_API_KEY {"number": ""} # Leave empty for QR, or phone number for pairing Connection Status GET /instance/status Header: apikey: $EVOGO_API_KEY Returns: connected, connecting, disconnected List All Instances GET /instance/all Header: apikey: $EVOGO_GLOBAL_KEY Delete Instance DELETE /instance/delete/{instance} Header: apikey: $EVOGO_GLOBAL_KEY Force Reconnect POST /instance/forcereconnect/{instance} Header: apikey: $EVOGO_GLOBAL_KEY {"number": "5511999999999"} Logs GET /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
Text Message POST /send/text { "number": "5511999999999", "text": "Hello World!", "delay": 1000, "mentionsEveryOne": false, "mentioned": ["5511888888888@s.whatsapp.net"] } Media (URL) POST /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, WEBP video - MP4, AVI, MOV, MKV audio - MP3, OGG, WAV (sent as voice note/PTT) document - PDF, DOC, DOCX, XLS, XLSX, PPT, TXT, ZIP ptv - Round video (Instagram-style) Media (File Upload) POST /send/media Content-Type: multipart/form-data number=5511999999999 type=image file=@/path/to/file.jpg caption=Photo caption filename=custom-name.jpg Poll POST /send/poll { "number": "5511999999999", "question": "Best language?", "options": ["JavaScript", "Python", "Go", "Rust"], "selectableCount": 1 } Get poll results: GET /polls/{messageId}/results Sticker POST /send/sticker { "number": "5511999999999", "sticker": "https://example.com/sticker.webp" } Auto-converts images to WebP format. Location POST /send/location { "number": "5511999999999", "latitude": -23.550520, "longitude": -46.633308, "name": "Avenida Paulista", "address": "Av. Paulista, Sรฃo Paulo - SP" } Contact POST /send/contact { "number": "5511999999999", "vcard": { "fullName": "Joรฃo Silva", "phone": "5511988888888", "organization": "Company XYZ", "email": "joao@example.com" } } Carousel POST /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 reply URL - Opens link CALL - Initiates call COPY - Copies text
React to Message POST /message/react { "number": "5511999999999", "reaction": "๐", "id": "MESSAGE_ID", "fromMe": false, "participant": "5511888888888@s.whatsapp.net" # Required in groups } Reactions: ๐, โค๏ธ, ๐, ๐ฎ, ๐ข, ๐, or "remove" Typing/Recording Indicator POST /message/presence { "number": "5511999999999", "state": "composing", "isAudio": false } States: composing + isAudio: false โ "typing..." composing + isAudio: true โ "recording audio..." paused โ Stops indicator Mark as Read POST /message/markread { "number": "5511999999999", "id": ["MESSAGE_ID_1", "MESSAGE_ID_2"] } Download Media POST /message/downloadmedia { "message": {} # Full message object from webhook } Returns base64-encoded media. Edit Message POST /message/edit { "chat": "5511999999999@s.whatsapp.net", "messageId": "MESSAGE_ID", "message": "Edited text" } Limitations: Text messages only Your messages only ~15 minute time limit Delete Message POST /message/delete { "chat": "5511999999999@s.whatsapp.net", "messageId": "MESSAGE_ID" } Limitations: Your messages only ~48 hour time limit Get Message Status POST /message/status { "id": "MESSAGE_ID" } Returns delivery/read status.
List Groups GET /group/list # Basic info (JID + name) GET /group/myall # Full info (participants, settings, etc) Get Group Info POST /group/info { "groupJid": "120363123456789012@g.us" } Create Group POST /group/create { "groupName": "My Team", "participants": [ "5511999999999@s.whatsapp.net", "5511888888888@s.whatsapp.net" ] } Requirements: Name: max 25 characters Participants: minimum 1 Manage Participants POST /group/participant { "groupJid": "120363123456789012@g.us", "action": "add", "participants": ["5511999999999@s.whatsapp.net"] } Actions: add - Add members remove - Remove members promote - Make admin demote - Remove admin Update Group Settings POST /group/settings { "groupJid": "120363123456789012@g.us", "action": "announcement" } Settings: announcement / not_announcement - Only admins send messages locked / unlocked - Only admins edit group info approval_on / approval_off - Require approval to join admin_add / all_member_add - Who can add members Get Invite Link POST /group/invitelink { "groupJid": "120363123456789012@g.us", "reset": false } Set reset: true to revoke old link and generate new one. Join Group POST /group/join { "code": "https://chat.whatsapp.com/XXXXXX" } Accepts full link or just the code. Leave Group POST /group/leave { "groupJid": "120363123456789012@g.us" } Manage Join Requests # 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 Update Group Metadata # 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" }
Pin/Unpin Chat POST /chat/pin POST /chat/unpin { "chat": "5511999999999@s.whatsapp.net" } Archive/Unarchive Chat POST /chat/archive POST /chat/unarchive { "chat": "5511999999999@s.whatsapp.net" } Mute/Unmute Chat POST /chat/mute POST /chat/unmute { "chat": "5511999999999@s.whatsapp.net" } Sync History POST /chat/history-sync-request Requests full chat history sync (may take time).
Get User Info POST /user/info { "number": ["5511999999999", "5511888888888"], "formatJid": true } Returns: status, profile photo, verified badge, linked devices, etc. Check WhatsApp Registration POST /user/check { "number": ["5511999999999", "5511888888888"] } Returns: isInWhatsapp (true/false) for each number. Get Profile Picture POST /user/avatar { "number": "5511999999999", "preview": false } Preview options: false - Full resolution true - Low resolution preview Get Contacts GET /user/contacts Lists all saved contacts. Privacy Settings # 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) Block/Unblock Contact POST /user/block POST /user/unblock { "number": "5511999999999" } # Get block list GET /user/blocklist Update Profile # 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: Name: 25 characters max Status: 139 characters max
Add Label # 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" } Remove Label POST /unlabel/chat POST /unlabel/message { "jid": "5511999999999@s.whatsapp.net", "labelId": "1", "messageId": "MESSAGE_ID" # Only for /unlabel/message } Edit Label POST /label/edit { "labelId": "1", "name": "New Label Name" } List Labels GET /label
Create Community POST /community/create { "communityName": "My Community", "description": "Optional description" } Add/Remove Groups POST /community/add { "communityJID": "120363123456789012@g.us", "groupJID": ["120363111111111111@g.us"] } POST /community/remove { "communityJID": "120363123456789012@g.us", "groupJID": ["120363111111111111@g.us"] }
Create Newsletter POST /newsletter/create { "name": "My Channel", "description": "Optional description" } List Newsletters GET /newsletter/list Get Newsletter Info POST /newsletter/info { "jid": "120363123456789012@newsletter" } Subscribe POST /newsletter/subscribe { "jid": "120363123456789012@newsletter" } Get Newsletter Messages POST /newsletter/messages { "jid": "120363123456789012@newsletter", "limit": 50 } Get Invite Link Info POST /newsletter/link { "key": "INVITE_KEY" }
Reject Call POST /call/reject # Webhook payload from call event Use with webhook automation to auto-reject calls.
for 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
curl -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"] }'
# 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! ๐\" }"
curl -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: {"delay": 2000} // 2 seconds Recommended: 1-2 seconds between individual messages 3-5 seconds between mass sends Exponential backoff on errors
HTTP Status Codes: 200 - Success 400 - Bad request (check parameters) 401 - Unauthorized (check API key) 404 - Not found (instance/resource doesn't exist) 500 - Server error Common Issues: ErrorSolutionInstance not connectedRun POST /instance/connectInvalid phone formatUse international without +: 5511999999999Message not sentCheck GET /instance/statusGroup operation failedVerify you're admin (for admin operations)
Configure webhooks to receive real-time events: Message received Message sent Connection status Group updates Calls received And more... Use POST /webhook/set endpoint to configure webhook URL (see Postman collection for details).
# 1. Check if instance exists GET /instance/all # 2. Force reconnect POST /instance/forcereconnect/{instance} # 3. Check logs GET /instance/logs/{instance}?level=error
Verify connection: GET /instance/status Check phone format (no + or spaces) Ensure recipient has WhatsApp Verify API key is correct
Check you're admin (for admin operations) Verify group JID format: xxxxx@g.us Ensure participants use format: number@s.whatsapp.net
Evolution API Go: https://github.com/EvolutionAPI/evolution-api WhatsApp Business API: https://developers.facebook.com/docs/whatsapp JID Format Guide: number@s.whatsapp.net for users, xxxxx@g.us for groups
Not 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.
Always check status before operations Use delays to avoid rate limits (1-2s minimum) Store tokens securely in environment variables Handle disconnects with automatic reconnection Validate numbers before sending Use webhooks for real-time event handling Monitor logs for troubleshooting Test with small groups before mass operations evoGo simplifies WhatsApp automation with Evolution API Go v3. For advanced features, check the full Postman collection or API documentation.
Code helpers, APIs, CLIs, browser automation, testing, and developer operations.
Largest current source with strong distribution and engagement signals.