{
  "schemaVersion": "1.0",
  "item": {
    "slug": "evolution-api",
    "name": "Evolution Api v2",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/impa365/evolution-api",
    "canonicalUrl": "https://clawhub.ai/impa365/evolution-api",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/evolution-api",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=evolution-api",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "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."
        },
        {
          "label": "Upgrade existing",
          "body": "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."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/evolution-api"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/evolution-api",
    "agentPageUrl": "https://openagent3.xyz/skills/evolution-api/agent",
    "manifestUrl": "https://openagent3.xyz/skills/evolution-api/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/evolution-api/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "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."
      },
      {
        "label": "Upgrade existing",
        "body": "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."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Evolution API v2.3",
        "body": "Complete WhatsApp automation via Evolution API v2.3. Send messages, manage groups, integrate chatbots (Typebot, OpenAI, Dify, Flowise, N8N, Evo AI), configure webhooks, and connect with Chatwoot."
      },
      {
        "title": "1. Set Environment Variables",
        "body": "{\n  env: {\n    EVO_API_URL: \"http://localhost:8080\",       // Your API URL\n    EVO_GLOBAL_KEY: \"your-global-admin-key\",    // Admin key (instance mgmt)\n    EVO_INSTANCE: \"my-bot\",                     // Instance name\n    EVO_API_KEY: \"your-instance-token\"          // Instance token (messaging)\n  }\n}"
      },
      {
        "title": "2. Create Instance & Connect",
        "body": "# Create instance (supports Baileys, Business, or Evolution integration)\ncurl -X POST \"$EVO_API_URL/instance/create\" \\\n  -H \"apikey: $EVO_GLOBAL_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"instanceName\": \"my-bot\",\n    \"qrcode\": true,\n    \"integration\": \"WHATSAPP-BAILEYS\"\n  }'\n\n# Connect & get QR code\ncurl -X GET \"$EVO_API_URL/instance/connect/$EVO_INSTANCE\" \\\n  -H \"apikey: $EVO_API_KEY\"\n\nScan the QR code returned in base64 field. Alternately pass ?number=5511999999999 for pairing code."
      },
      {
        "title": "3. Send First Message",
        "body": "curl -X POST \"$EVO_API_URL/message/sendText/$EVO_INSTANCE\" \\\n  -H \"apikey: $EVO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"number\": \"5511999999999\",\n    \"text\": \"Hello from Evolution API v2! 🚀\"\n  }'"
      },
      {
        "title": "Authentication",
        "body": "Two authentication levels:\n\nTypeHeaderUsageGlobal API Keyapikey: $EVO_GLOBAL_KEYAdmin: create/delete instances, fetch allInstance API Keyapikey: $EVO_API_KEYMessaging, groups, chat, profile, labels\n\nAll instance endpoints use the path pattern: /{resource}/{action}/{instanceName}"
      },
      {
        "title": "Phone Number Formats",
        "body": "ContextFormatExampleSending messagesCountry code + number5511999999999Group JIDGroup ID999999999999999999@g.usUser JIDNumber + suffix5511999999999@s.whatsapp.net"
      },
      {
        "title": "Integration Types",
        "body": "ValueDescriptionWHATSAPP-BAILEYSUnofficial (default, full features)WHATSAPP-BUSINESSOfficial Cloud APIEVOLUTIONEvolution channel"
      },
      {
        "title": "Message Delay",
        "body": "Add delay (milliseconds) to avoid rate limits:\n\n{ \"delay\": 1200 }"
      },
      {
        "title": "Instance Management",
        "body": "Create Instance\n\nPOST /instance/create\nHeader: apikey: $EVO_GLOBAL_KEY\n\n{\n  \"instanceName\": \"my-bot\",\n  \"qrcode\": true,\n  \"integration\": \"WHATSAPP-BAILEYS\",\n  // Optional\n  \"token\": \"custom-api-key\",\n  \"number\": \"5511999999999\",\n  // Settings (optional)\n  \"rejectCall\": false,\n  \"msgCall\": \"\",\n  \"groupsIgnore\": false,\n  \"alwaysOnline\": false,\n  \"readMessages\": false,\n  \"readStatus\": false,\n  \"syncFullHistory\": false,\n  // Proxy (optional)\n  \"proxyHost\": \"\",\n  \"proxyPort\": \"\",\n  \"proxyProtocol\": \"\",\n  \"proxyUsername\": \"\",\n  \"proxyPassword\": \"\"\n}\n\nInline webhook (optional during creation):\n\n{\n  \"webhook\": {\n    \"url\": \"https://webhook.site/your-id\",\n    \"byEvents\": false,\n    \"base64\": true,\n    \"headers\": {\n      \"autorization\": \"Bearer TOKEN\"\n    },\n    \"events\": [\"MESSAGES_UPSERT\", \"CONNECTION_UPDATE\"]\n  }\n}\n\nInline RabbitMQ / SQS (optional during creation):\n\n{\n  \"rabbitmq\": { \"enabled\": true, \"events\": [\"MESSAGES_UPSERT\"] },\n  \"sqs\": { \"enabled\": true, \"events\": [\"MESSAGES_UPSERT\"] }\n}\n\nInline Chatwoot (optional during creation):\n\n{\n  \"chatwootAccountId\": \"1\",\n  \"chatwootToken\": \"TOKEN\",\n  \"chatwootUrl\": \"https://chatwoot.com\",\n  \"chatwootSignMsg\": true,\n  \"chatwootReopenConversation\": true,\n  \"chatwootConversationPending\": false,\n  \"chatwootImportContacts\": true,\n  \"chatwootNameInbox\": \"evolution\",\n  \"chatwootMergeBrazilContacts\": true,\n  \"chatwootImportMessages\": true,\n  \"chatwootDaysLimitImportMessages\": 3\n}\n\nFetch Instances\n\nGET /instance/fetchInstances\nHeader: apikey: $EVO_GLOBAL_KEY\n\n# Optional query params:\n# ?instanceName=my-bot\n# ?instanceId=INSTANCE_ID\n\nConnect Instance (QR Code)\n\nGET /instance/connect/{instance}\nHeader: apikey: $EVO_API_KEY\n\n# Optional: ?number=5511999999999 (for pairing code)\n\nConnection Status\n\nGET /instance/connectionState/{instance}\nHeader: apikey: $EVO_API_KEY\n\nRestart Instance\n\nPOST /instance/restart/{instance}\nHeader: apikey: $EVO_API_KEY\n\nSet Presence\n\nPOST /instance/setPresence/{instance}\nHeader: apikey: $EVO_API_KEY\n\n{ \"presence\": \"available\" }\n\nOptions: available, unavailable\n\nLogout Instance\n\nDELETE /instance/logout/{instance}\nHeader: apikey: $EVO_API_KEY\n\nDelete Instance\n\nDELETE /instance/delete/{instance}\nHeader: apikey: $EVO_GLOBAL_KEY"
      },
      {
        "title": "Settings",
        "body": "Set Settings\n\nPOST /settings/set/{instance}\nHeader: apikey: $EVO_API_KEY\n\n{\n  \"rejectCall\": true,\n  \"msgCall\": \"I do not accept calls\",\n  \"groupsIgnore\": false,\n  \"alwaysOnline\": true,\n  \"readMessages\": false,\n  \"syncFullHistory\": false,\n  \"readStatus\": false\n}\n\nFind Settings\n\nGET /settings/find/{instance}\nHeader: apikey: $EVO_API_KEY"
      },
      {
        "title": "Proxy",
        "body": "Set Proxy\n\nPOST /proxy/set/{instance}\nHeader: apikey: $EVO_API_KEY\n\n{\n  \"enabled\": true,\n  \"host\": \"0.0.0.0\",\n  \"port\": \"8000\",\n  \"protocol\": \"http\",\n  \"username\": \"user\",\n  \"password\": \"pass\"\n}\n\nFind Proxy\n\nGET /proxy/find/{instance}\nHeader: apikey: $EVO_API_KEY"
      },
      {
        "title": "Send Messages",
        "body": "Send Text\n\nPOST /message/sendText/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"text\": \"Hello World!\"\n  // Options:\n  // \"delay\": 1200,\n  // \"linkPreview\": false,\n  // \"mentionsEveryOne\": false,\n  // \"mentioned\": [\"5511888888888\"],\n  // \"quoted\": { \"key\": { \"id\": \"MESSAGE_ID\" }, \"message\": { \"conversation\": \"quoted text\" } }\n}\n\nSend Media (URL)\n\nPOST /message/sendMedia/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"mediatype\": \"image\",\n  \"mimetype\": \"image/png\",\n  \"caption\": \"Caption text\",\n  \"media\": \"https://example.com/photo.jpg\",\n  \"fileName\": \"photo.png\"\n  // Options: delay, quoted, mentionsEveryOne, mentioned\n}\n\nMedia types: image, video, document\n\nSend Media (File Upload)\n\nPOST /message/sendMedia/{instance}\nContent-Type: multipart/form-data\n\n# Use form-data with file field\n\nSend PTV (Round Video)\n\nPOST /message/sendPtv/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"video\": \"https://example.com/video.mp4\"\n  // Options: delay, quoted, mentionsEveryOne, mentioned\n}\n\nAlso supports file upload via form-data.\n\nSend Narrated Audio (Voice Note)\n\nPOST /message/sendWhatsAppAudio/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"audio\": \"https://example.com/audio.mp3\"\n  // Options: delay, quoted, encoding (true/false)\n}\n\nSend Status/Stories\n\nPOST /message/sendStatus/{instance}\n\n{\n  \"type\": \"text\",\n  \"content\": \"My status update!\",\n  \"backgroundColor\": \"#008000\",\n  \"font\": 1,\n  \"allContacts\": false,\n  \"statusJidList\": [\"5511999999999@s.whatsapp.net\"]\n}\n\nTypes: text, image, video, audio\nFonts (text only): 1 SERIF, 2 NORICAN_REGULAR, 3 BRYNDAN_WRITE, 4 BEBASNEUE_REGULAR, 5 OSWALD_HEAVY\nFor image/video: use content as URL and caption for text.\n\nSend Sticker\n\nPOST /message/sendSticker/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"sticker\": \"https://example.com/sticker.webp\"\n  // Options: delay, quoted\n}\n\nSend Location\n\nPOST /message/sendLocation/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"name\": \"Bora Bora\",\n  \"address\": \"French Polynesia\",\n  \"latitude\": -16.505538,\n  \"longitude\": -151.742277\n  // Options: delay, quoted\n}\n\nSend Contact (vCard)\n\nPOST /message/sendContact/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"contact\": [\n    {\n      \"fullName\": \"Contact Name\",\n      \"wuid\": \"559999999999\",\n      \"phoneNumber\": \"+55 99 9 9999-9999\",\n      \"organization\": \"Company\",\n      \"email\": \"email@example.com\",\n      \"url\": \"https://example.com\"\n    }\n  ]\n}\n\nMultiple contacts can be sent in the array.\n\nSend Reaction\n\nPOST /message/sendReaction/{instance}\n\n{\n  \"key\": {\n    \"remoteJid\": \"5511999999999@s.whatsapp.net\",\n    \"fromMe\": true,\n    \"id\": \"BAE5A75CB0F39712\"\n  },\n  \"reaction\": \"🚀\"\n}\n\nSet reaction: \"\" to remove.\n\nSend Poll\n\nPOST /message/sendPoll/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"name\": \"What is your favorite color?\",\n  \"selectableCount\": 1,\n  \"values\": [\"Red\", \"Blue\", \"Green\"]\n  // Options: delay, quoted\n}\n\nSend List\n\nPOST /message/sendList/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"title\": \"List Title\",\n  \"description\": \"Choose an option\",\n  \"buttonText\": \"Click Here\",\n  \"footerText\": \"Footer text\",\n  \"sections\": [\n    {\n      \"title\": \"Section 1\",\n      \"rows\": [\n        {\n          \"title\": \"Option A\",\n          \"description\": \"Description of option A\",\n          \"rowId\": \"opt_a\"\n        },\n        {\n          \"title\": \"Option B\",\n          \"description\": \"Description of option B\",\n          \"rowId\": \"opt_b\"\n        }\n      ]\n    }\n  ]\n  // Options: delay, quoted\n}\n\nSend Buttons\n\nPOST /message/sendButtons/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"title\": \"Button Title\",\n  \"description\": \"Button Description\",\n  \"footer\": \"Footer Text\",\n  \"buttons\": [\n    { \"type\": \"reply\", \"displayText\": \"Reply\", \"id\": \"btn_1\" },\n    { \"type\": \"copy\", \"displayText\": \"Copy Code\", \"copyCode\": \"ABC123\" },\n    { \"type\": \"url\", \"displayText\": \"Open Link\", \"url\": \"https://example.com\" },\n    { \"type\": \"call\", \"displayText\": \"Call Us\", \"phoneNumber\": \"5511999999999\" },\n    { \"type\": \"pix\", \"currency\": \"BRL\", \"name\": \"John Doe\", \"keyType\": \"random\", \"key\": \"uuid-key\" }\n  ]\n  // Options: delay, quoted\n}\n\nButton types: reply, copy, url, call, pix\nPix keyType: phone, email, cpf, cnpj, random"
      },
      {
        "title": "Chat Operations",
        "body": "Check WhatsApp Numbers\n\nPOST /chat/whatsappNumbers/{instance}\n\n{\n  \"numbers\": [\n    \"55911111111\",\n    \"55922222222\",\n    \"55933333333\"\n  ]\n}\n\nRead Messages (Mark as Read)\n\nPOST /chat/markMessageAsRead/{instance}\n\n{\n  \"readMessages\": [\n    {\n      \"remoteJid\": \"5511999999999@s.whatsapp.net\",\n      \"fromMe\": false,\n      \"id\": \"MESSAGE_ID\"\n    }\n  ]\n}\n\nArchive Chat\n\nPOST /chat/archiveChat/{instance}\n\n{\n  \"lastMessage\": {\n    \"key\": {\n      \"remoteJid\": \"5511999999999@s.whatsapp.net\",\n      \"fromMe\": false,\n      \"id\": \"MESSAGE_ID\"\n    }\n  },\n  \"chat\": \"5511999999999@s.whatsapp.net\",\n  \"archive\": true\n}\n\nSet archive: false to unarchive.\n\nMark Chat Unread\n\nPOST /chat/markChatUnread/{instance}\n\n{\n  \"lastMessage\": {\n    \"key\": {\n      \"remoteJid\": \"5511999999999@s.whatsapp.net\",\n      \"fromMe\": false,\n      \"id\": \"MESSAGE_ID\"\n    }\n  },\n  \"chat\": \"5511999999999@s.whatsapp.net\"\n}\n\nDelete Message\n\nDELETE /chat/deleteMessageForEveryone/{instance}\n\n{\n  \"id\": \"MESSAGE_ID\",\n  \"remoteJid\": \"5511999999999@s.whatsapp.net\",\n  \"fromMe\": true,\n  \"participant\": \"participant_jid\"\n}\n\nUpdate Message (Edit)\n\nPOST /chat/updateMessage/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"key\": {\n    \"remoteJid\": \"5511999999999@s.whatsapp.net\",\n    \"fromMe\": true,\n    \"id\": \"MESSAGE_ID\"\n  },\n  \"text\": \"new edited message\"\n}\n\nSend Presence (Typing Indicator)\n\nPOST /chat/sendPresence/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"delay\": 1200,\n  \"presence\": \"composing\"\n}\n\nOptions: composing, recording, paused\n\nUpdate Block Status\n\nPOST /message/updateBlockStatus/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"status\": \"block\"\n}\n\nOptions: block, unblock\n\nFetch Profile Picture\n\nPOST /chat/fetchProfilePictureUrl/{instance}\n\n{ \"number\": \"5511999999999\" }\n\nGet Base64 From Media Message\n\nPOST /chat/getBase64FromMediaMessage/{instance}\n\n{\n  \"message\": {\n    \"key\": { \"id\": \"MESSAGE_ID\" }\n  },\n  \"convertToMp4\": false\n}\n\nExtracts base64 from received media. Set convertToMp4: true for audio files to get MP4 instead of OGG.\n\nFind Contacts\n\nPOST /chat/findContacts/{instance}\n\n{\n  \"where\": {\n    \"id\": \"5511999999999\"\n  }\n}\n\nOmit id to list all contacts.\n\nFind Messages\n\nPOST /chat/findMessages/{instance}\n\n{\n  \"where\": {\n    \"key\": {\n      \"remoteJid\": \"5511999999999\"\n    }\n  },\n  \"page\": 1,\n  \"offset\": 10\n}\n\nFind Status Message\n\nPOST /chat/findStatusMessage/{instance}\n\n{\n  \"where\": {\n    \"remoteJid\": \"5511999999999@s.whatsapp.net\",\n    \"id\": \"MESSAGE_ID\"\n  },\n  \"page\": 1,\n  \"offset\": 10\n}\n\nFind Chats\n\nPOST /chat/findChats/{instance}"
      },
      {
        "title": "Calls",
        "body": "Fake Call (Offer)\n\nPOST /call/offer/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"isVideo\": false,\n  \"callDuration\": 3\n}\n\nSimulates a call offer to the number. callDuration is in seconds."
      },
      {
        "title": "Labels",
        "body": "Find Labels\n\nGET /label/findLabels/{instance}\n\nHandle Labels (Add/Remove)\n\nPOST /label/handleLabel/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"labelId\": \"label_id_here\",\n  \"action\": \"add\"\n}\n\nActions: add, remove"
      },
      {
        "title": "Profile Settings",
        "body": "Fetch Business Profile\n\nPOST /chat/fetchBusinessProfile/{instance}\n\n{ \"number\": \"5511999999999\" }\n\nFetch Profile\n\nPOST /chat/fetchProfile/{instance}\n\n{ \"number\": \"5511999999999\" }\n\nUpdate Profile Name\n\nPOST /chat/updateProfileName/{instance}\n\n{ \"name\": \"My Bot Name\" }\n\nUpdate Profile Status\n\nPOST /chat/updateProfileStatus/{instance}\n\n{ \"status\": \"Available 24/7\" }\n\nUpdate Profile Picture\n\nPOST /chat/updateProfilePicture/{instance}\n\n{ \"picture\": \"https://example.com/avatar.jpg\" }\n\nRemove Profile Picture\n\nDELETE /chat/removeProfilePicture/{instance}\n\nFetch Privacy Settings\n\nGET /chat/fetchPrivacySettings/{instance}\n\nUpdate Privacy Settings\n\nPOST /chat/updatePrivacySettings/{instance}\n\n{\n  \"readreceipts\": \"all\",\n  \"profile\": \"all\",\n  \"status\": \"contacts\",\n  \"online\": \"all\",\n  \"last\": \"contacts\",\n  \"groupadd\": \"none\"\n}\n\nPrivacy values:\n\nreadreceipts: all, none\nprofile: all, contacts, contact_blacklist, none\nstatus: all, contacts, contact_blacklist, none\nonline: all, match_last_seen\nlast: all, contacts, contact_blacklist, none\ngroupadd: all, contacts, contact_blacklist"
      },
      {
        "title": "Group Management",
        "body": "Create Group\n\nPOST /group/create/{instance}\n\n{\n  \"subject\": \"Group Name\",\n  \"description\": \"Group description (optional)\",\n  \"participants\": [\n    \"5531900000000\",\n    \"5531900000000\"\n  ]\n}\n\nUpdate Group Picture\n\nPOST /group/updateGroupPicture/{instance}?groupJid={groupJid}\n\n{ \"image\": \"https://example.com/group-photo.png\" }\n\nUpdate Group Subject (Name)\n\nPOST /group/updateGroupSubject/{instance}?groupJid={groupJid}\n\n{ \"subject\": \"New Group Name\" }\n\nUpdate Group Description\n\nPOST /group/updateGroupDescription/{instance}?groupJid={groupJid}\n\n{ \"description\": \"New group description\" }\n\nFetch Invite Code\n\nGET /group/inviteCode/{instance}?groupJid={groupJid}\n\nRevoke Invite Code\n\nPOST /group/revokeInviteCode/{instance}?groupJid={groupJid}\n\nSend Invite URL\n\nPOST /group/sendInvite/{instance}\n\n{\n  \"groupJid\": \"999999999@g.us\",\n  \"description\": \"Join my WhatsApp group:\",\n  \"numbers\": [\"5511999999999\"]\n}\n\nFind Group by Invite Code\n\nGET /group/inviteInfo/{instance}?inviteCode={inviteCode}\n\nFind Group by JID\n\nGET /group/findGroupInfos/{instance}?groupJid={groupJid}\n\nFetch All Groups\n\nGET /group/fetchAllGroups/{instance}\n# Optional: ?getParticipants=true\n\nFind Participants\n\nGET /group/participants/{instance}?groupJid={groupJid}\n\nUpdate Participants\n\nPOST /group/updateParticipant/{instance}?groupJid={groupJid}\n\n{\n  \"action\": \"add\",\n  \"participants\": [\"5511999999999\"]\n}\n\nActions: add, remove, promote, demote\n\nUpdate Group Settings\n\nPOST /group/updateSetting/{instance}?groupJid={groupJid}\n\n{ \"action\": \"announcement\" }\n\nActions:\n\nannouncement - Only admins send messages\nnot_announcement - Everyone can send\nlocked - Only admins edit group info\nunlocked - Everyone can edit group info\n\nToggle Ephemeral (Disappearing Messages)\n\nPOST /group/toggleEphemeral/{instance}?groupJid={groupJid}\n\n{ \"expiration\": 86400 }\n\nExpiration values (seconds):\n\n0 - Off\n86400 - 24 hours\n604800 - 7 days\n7776000 - 90 days\n\nLeave Group\n\nDELETE /group/leaveGroup/{instance}?groupJid={groupJid}"
      },
      {
        "title": "Integrations - Events",
        "body": "Webhook\n\n# Set Webhook\nPOST /webhook/set/{instance}\n\n{\n  \"webhook\": {\n    \"enabled\": true,\n    \"url\": \"https://webhook.site/your-id\",\n    \"headers\": {\n      \"autorization\": \"Bearer TOKEN\",\n      \"Content-Type\": \"application/json\"\n    },\n    \"byEvents\": false,\n    \"base64\": false,\n    \"events\": [\n      \"APPLICATION_STARTUP\",\n      \"QRCODE_UPDATED\",\n      \"MESSAGES_UPSERT\",\n      \"MESSAGES_UPDATE\",\n      \"MESSAGES_DELETE\",\n      \"SEND_MESSAGE\",\n      \"CONTACTS_UPDATE\",\n      \"PRESENCE_UPDATE\",\n      \"CHATS_UPDATE\",\n      \"CHATS_DELETE\",\n      \"GROUPS_UPSERT\",\n      \"GROUP_UPDATE\",\n      \"GROUP_PARTICIPANTS_UPDATE\",\n      \"CONNECTION_UPDATE\",\n      \"LABELS_EDIT\",\n      \"LABELS_ASSOCIATION\",\n      \"CALL\",\n      \"TYPEBOT_START\",\n      \"TYPEBOT_CHANGE_STATUS\"\n    ]\n  }\n}\n\n# Find Webhook\nGET /webhook/find/{instance}\n\nKey options:\n\nbyEvents - If true, sends to separate URLs per event type\nbase64 - If true, media comes as base64 in payload\n\nWebSocket\n\nPOST /websocket/set/{instance}\n\n{\n  \"websocket\": {\n    \"enabled\": true,\n    \"events\": [\"MESSAGES_UPSERT\", \"CONNECTION_UPDATE\"]\n  }\n}\n\nGET /websocket/find/{instance}\n\nRabbitMQ\n\nPOST /rabbitmq/set/{instance}\n\n{\n  \"rabbitmq\": {\n    \"enabled\": true,\n    \"events\": [\"MESSAGES_UPSERT\", \"CONNECTION_UPDATE\"]\n  }\n}\n\nGET /rabbitmq/find/{instance}\n\nSQS (Amazon)\n\nPOST /sqs/set/{instance}\n\n{\n  \"sqs\": {\n    \"enabled\": true,\n    \"events\": [\"MESSAGES_UPSERT\", \"CONNECTION_UPDATE\"]\n  }\n}\n\nGET /sqs/find/{instance}\n\nNATS\n\nPOST /nats/set/{instance}\nGET /nats/find/{instance}\n\nSame payload structure as SQS/RabbitMQ.\n\nPusher\n\nPOST /pusher/set/{instance}\nGET /pusher/find/{instance}\n\nSame payload structure as SQS/RabbitMQ.\n\nAvailable Events (all transports):\nAPPLICATION_STARTUP, QRCODE_UPDATED, MESSAGES_SET, MESSAGES_UPSERT, MESSAGES_UPDATE, MESSAGES_DELETE, SEND_MESSAGE, CONTACTS_SET, CONTACTS_UPSERT, CONTACTS_UPDATE, PRESENCE_UPDATE, CHATS_SET, CHATS_UPSERT, CHATS_UPDATE, CHATS_DELETE, GROUPS_UPSERT, GROUP_UPDATE, GROUP_PARTICIPANTS_UPDATE, CONNECTION_UPDATE, LABELS_EDIT, LABELS_ASSOCIATION, CALL, TYPEBOT_START, TYPEBOT_CHANGE_STATUS"
      },
      {
        "title": "Integrations - Chatbots",
        "body": "All chatbot integrations share a common pattern with settings, session management, CRUD, and trigger configuration.\n\nCommon trigger options (all chatbots):\n\n{\n  \"triggerType\": \"keyword\",\n  \"triggerOperator\": \"equals\",\n  \"triggerValue\": \"hello\",\n  \"expire\": 20,\n  \"keywordFinish\": \"#SAIR\",\n  \"delayMessage\": 1000,\n  \"unknownMessage\": \"Message not recognized\",\n  \"listeningFromMe\": false,\n  \"stopBotFromMe\": false,\n  \"keepOpen\": false,\n  \"debounceTime\": 10,\n  \"ignoreJids\": []\n}\n\nFieldDescriptiontriggerTypeall (every message) or keyword (matched)triggerOperatorcontains, equals, startsWith, endsWith, regex, nonetriggerValueThe keyword/pattern to matchexpireSession timeout (minutes)keywordFinishKeyword to end bot sessiondelayMessageDelay between messages (ms)unknownMessageResponse for unrecognized inputlisteningFromMeProcess messages sent by youstopBotFromMePause bot when you send a messagekeepOpenKeep session alive after flow endsdebounceTimeDebounce interval (seconds)ignoreJidsJIDs to ignore (e.g., [\"@g.us\"] to ignore groups)\n\nChatwoot\n\n# Set Chatwoot\nPOST /chatwoot/set/{instance}\n\n{\n  \"enabled\": true,\n  \"accountId\": \"1\",\n  \"token\": \"CHATWOOT_TOKEN\",\n  \"url\": \"https://chatwoot.yourdomain.com\",\n  \"signMsg\": true,\n  \"reopenConversation\": true,\n  \"conversationPending\": false,\n  \"nameInbox\": \"evolution\",\n  \"mergeBrazilContacts\": true,\n  \"importContacts\": true,\n  \"importMessages\": true,\n  \"daysLimitImportMessages\": 2,\n  \"signDelimiter\": \"\\n\",\n  \"autoCreate\": true,\n  \"organization\": \"BOT\",\n  \"logo\": \"https://example.com/logo.png\",\n  \"ignoreJids\": [\"@g.us\"]\n}\n\n# Find Chatwoot\nGET /chatwoot/find/{instance}\n\nTypebot\n\n# Create Typebot\nPOST /typebot/create/{instance}\n\n{\n  \"enabled\": true,\n  \"url\": \"https://typebot.yourdomain.com\",\n  \"typebot\": \"my-typebot-flow-id\",\n  \"triggerType\": \"keyword\",\n  \"triggerOperator\": \"regex\",\n  \"triggerValue\": \"^atend.*\",\n  \"expire\": 20,\n  \"keywordFinish\": \"#SAIR\",\n  \"delayMessage\": 1000,\n  \"unknownMessage\": \"Message not recognized\",\n  \"listeningFromMe\": false,\n  \"stopBotFromMe\": false,\n  \"keepOpen\": false,\n  \"debounceTime\": 10\n}\n\n# Find/Fetch/Update/Delete\nGET  /typebot/find/{instance}\nGET  /typebot/fetch/{typebotId}/{instance}\nPUT  /typebot/update/{typebotId}/{instance}\nDELETE /typebot/delete/{typebotId}/{instance}\n\n# Start Typebot manually\nPOST /typebot/start/{instance}\n\n{\n  \"url\": \"https://typebot.yourdomain.com\",\n  \"typebot\": \"flow-id\",\n  \"remoteJid\": \"5511999999999@s.whatsapp.net\",\n  \"startSession\": false,\n  \"variables\": [\n    { \"name\": \"pushName\", \"value\": \"User Name\" }\n  ]\n}\n\n# Change session status\nPOST /typebot/changeStatus/{instance}\n{ \"remoteJid\": \"5511999999999@s.whatsapp.net\", \"status\": \"closed\" }\n\n# Fetch sessions\nGET /typebot/fetchSessions/{typebotId}/{instance}\n\n# Default settings\nPOST /typebot/settings/{instance}\nGET  /typebot/fetchSettings/{instance}\n\n{\n  \"expire\": 20,\n  \"keywordFinish\": \"#SAIR\",\n  \"delayMessage\": 1000,\n  \"unknownMessage\": \"Not recognized\",\n  \"listeningFromMe\": false,\n  \"stopBotFromMe\": false,\n  \"keepOpen\": false,\n  \"debounceTime\": 10,\n  \"ignoreJids\": [],\n  \"typebotIdFallback\": \"fallback-typebot-id\"\n}\n\nSession statuses: opened, paused, closed\n\nOpenAI\n\n# Set Credentials\nPOST /openai/creds/{instance}\n{ \"name\": \"apikey\", \"apiKey\": \"sk-proj-...\" }\n\nGET /openai/creds/{instance}\nDELETE /openai/creds/{openaiCredsId}/{instance}\n\n# Create Bot (Assistant or Chat Completion)\nPOST /openai/create/{instance}\n\n{\n  \"enabled\": true,\n  \"openaiCredsId\": \"creds-id\",\n  \"botType\": \"assistant\",\n  // For assistants:\n  \"assistantId\": \"asst_XXXXX\",\n  \"functionUrl\": \"https://n8n.site.com\",\n  // For chatCompletion:\n  \"model\": \"gpt-4o\",\n  \"systemMessages\": [\"You are a helpful assistant.\"],\n  \"assistantMessages\": [\"Hello, how can I help?\"],\n  \"userMessages\": [\"Hello!\"],\n  \"maxTokens\": 300,\n  // Trigger options...\n  \"triggerType\": \"keyword\",\n  \"triggerOperator\": \"equals\",\n  \"triggerValue\": \"ai\"\n}\n\n# Find/Fetch/Update/Delete\nGET  /openai/find/{instance}\nGET  /openai/fetch/{openaiBotId}/{instance}\nPUT  /openai/update/{openaiBotId}/{instance}\nDELETE /openai/delete/{openaiBotId}/{instance}\n\n# Session management\nPOST /openai/changeStatus/{instance}\nGET  /openai/fetchSessions/{openaiBotId}/{instance}\n\n# Default settings\nPOST /openai/settings/{instance}\nGET  /openai/fetchSettings/{instance}\n\nBot types: assistant, chatCompletion\n\nDify\n\nPOST /dify/create/{instance}\n\n{\n  \"enabled\": true,\n  \"botType\": \"chatBot\",\n  \"apiUrl\": \"http://dify.site.com/v1\",\n  \"apiKey\": \"app-123456\",\n  // Trigger options...\n}\n\nGET  /dify/find/{instance}\nGET  /dify/fetch/{difyId}/{instance}\nPUT  /dify/update/{difyId}/{instance}\nDELETE /dify/delete/{difyId}/{instance}\n\nPOST /dify/changeStatus/{instance}\nGET  /dify/fetchSessions/{difyId}/{instance}\n\nPOST /dify/settings/{instance}\nGET  /dify/fetchSettings/{instance}\n\nDify bot types: chatBot, textGenerator, agent, workflow\n\nFlowise\n\nPOST /flowise/create/{instance}\n\n{\n  \"enabled\": true,\n  \"apiUrl\": \"http://flowise.site.com/v1\",\n  \"apiKey\": \"app-123456\",\n  // Trigger options...\n}\n\nGET  /flowise/find/{instance}\nGET  /flowise/fetch/{flowiseId}/{instance}\nPUT  /flowise/update/{flowiseId}/{instance}\nDELETE /flowise/delete/{flowiseId}/{instance}\n\nPOST /flowise/changeStatus/{instance}\nGET  /flowise/fetchSessions/{flowiseId}/{instance}\n\nPOST /flowise/settings/{instance}\nGET  /flowise/fetchSettings/{instance}\n\nN8N\n\nPOST /n8n/create/{instance}\n\n{\n  \"enabled\": true,\n  \"apiUrl\": \"http://n8n.site.com/v1\",\n  \"apiKey\": \"app-123456\",\n  // Trigger options...\n}\n\nGET  /n8n/find/{instance}\nGET  /n8n/fetch/{n8nId}/{instance}\nPUT  /n8n/update/{n8nId}/{instance}\nDELETE /n8n/delete/{n8nId}/{instance}\n\nPOST /n8n/changeStatus/{instance}\nGET  /n8n/fetchSessions/{n8nId}/{instance}\n\nPOST /n8n/settings/{instance}\nGET  /n8n/fetchSettings/{instance}\n\nEvolution Bot\n\nPOST /evolutionBot/create/{instance}\n\n{\n  \"enabled\": true,\n  \"apiUrl\": \"http://api.site.com/v1\",\n  \"apiKey\": \"app-123456\",\n  // Trigger options...\n}\n\nGET  /evolutionBot/find/{instance}\nGET  /evolutionBot/fetch/{evolutionBotId}/{instance}\nPUT  /evolutionBot/update/{evolutionBotId}/{instance}\nDELETE /evolutionBot/delete/{evolutionBotId}/{instance}\n\nPOST /evolutionBot/changeStatus/{instance}\nGET  /evolutionBot/fetchSessions/{evolutionBotId}/{instance}\n\nPOST /evolutionBot/settings/{instance}\nGET  /evolutionBot/fetchSettings/{instance}\n\nEvo AI\n\nPOST /evoai/create/{instance}\n\n{\n  \"enabled\": true,\n  \"apiUrl\": \"http://evoai.site.com/v1\",\n  \"apiKey\": \"app-123456\",\n  // Trigger options...\n}\n\nGET  /evoai/find/{instance}\nGET  /evoai/fetch/{evoaiId}/{instance}\nPUT  /evoai/update/{evoaiId}/{instance}\nDELETE /evoai/delete/{evoaiId}/{instance}\n\nPOST /evoai/changeStatus/{instance}\nGET  /evoai/fetchSessions/{evoaiId}/{instance}\n\nPOST /evoai/settings/{instance}\nGET  /evoai/fetchSettings/{instance}"
      },
      {
        "title": "Integrations - Channel (WhatsApp Business Cloud API)",
        "body": "Send Template\n\nPOST /message/sendTemplate/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"name\": \"hello_world\",\n  \"language\": \"en_US\",\n  \"components\": [\n    {\n      \"type\": \"body\",\n      \"parameters\": [\n        { \"type\": \"text\", \"text\": \"John\" },\n        { \"type\": \"text\", \"text\": \"email@email.com\" }\n      ]\n    },\n    {\n      \"type\": \"button\",\n      \"sub_type\": \"URL\",\n      \"index\": \"1\",\n      \"parameters\": [\n        { \"type\": \"text\", \"text\": \"/reset-password/1234\" }\n      ]\n    }\n  ]\n}\n\nCreate Template\n\nPOST /template/create/{instance}\n\n{\n  \"name\": \"my_template\",\n  \"category\": \"MARKETING\",\n  \"allowCategoryChange\": false,\n  \"language\": \"en_US\",\n  \"components\": [\n    {\n      \"type\": \"BODY\",\n      \"text\": \"Thank you {{1}}! Confirmation: {{2}}\",\n      \"example\": {\n        \"body_text\": [[\"John\", \"860198-230332\"]]\n      }\n    },\n    {\n      \"type\": \"BUTTONS\",\n      \"buttons\": [\n        { \"type\": \"QUICK_REPLY\", \"text\": \"Unsubscribe\" },\n        { \"type\": \"URL\", \"text\": \"Support\", \"url\": \"https://example.com\" }\n      ]\n    }\n  ]\n}\n\nCategories: AUTHENTICATION, MARKETING, UTILITY\n\nFind Templates\n\nGET /template/find/{instance}\n\nEvolution Channel Webhook\n\nPOST /webhook/evolution\n\n{\n  \"numberId\": \"5511999999999\",\n  \"key\": {\n    \"remoteJid\": \"5511888888888\",\n    \"fromMe\": false,\n    \"id\": \"ABC1234\"\n  },\n  \"pushName\": \"Contact Name\",\n  \"message\": {\n    \"conversation\": \"Hello\"\n  },\n  \"messageType\": \"conversation\"\n}\n\nMessage types: conversation, imageMessage, videoMessage, documentMessage, audioMessage"
      },
      {
        "title": "Storage (S3/MinIO)",
        "body": "Get Media\n\nPOST /s3/getMedia/{instance}\n\n{\n  \"id\": \"media-id\",\n  \"type\": \"image\",\n  \"messageId\": \"MESSAGE_ID\"\n}\n\nGet Media URL\n\nPOST /s3/getMediaUrl/{instance}\n\n{\n  \"id\": \"media-id\"\n}"
      },
      {
        "title": "System",
        "body": "Get API Information\n\nGET /\n\nReturns API version and system info.\n\nMetrics\n\nGET /metrics\nAuthorization: Basic (METRICS_USER:password)"
      },
      {
        "title": "Broadcast Message",
        "body": "for number in 5511999999999 5511888888888 5511777777777; do\n  curl -X POST \"$EVO_API_URL/message/sendText/$EVO_INSTANCE\" \\\n    -H \"apikey: $EVO_API_KEY\" \\\n    -H \"Content-Type: application/json\" \\\n    -d \"{\n      \\\"number\\\": \\\"$number\\\",\n      \\\"text\\\": \\\"Broadcast message!\\\",\n      \\\"delay\\\": 2000\n    }\"\ndone"
      },
      {
        "title": "Auto-Create Group + Configure Bot",
        "body": "# 1. Create group\ncurl -X POST \"$EVO_API_URL/group/create/$EVO_INSTANCE\" \\\n  -H \"apikey: $EVO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"subject\": \"Support Group\",\n    \"participants\": [\"5511999999999\"]\n  }'\n\n# 2. Attach Typebot for auto-response\ncurl -X POST \"$EVO_API_URL/typebot/create/$EVO_INSTANCE\" \\\n  -H \"apikey: $EVO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"enabled\": true,\n    \"url\": \"https://typebot.yourdomain.com\",\n    \"typebot\": \"support-flow-id\",\n    \"triggerType\": \"all\"\n  }'"
      },
      {
        "title": "Full Instance Setup (Instance + Webhook + Chatwoot)",
        "body": "# 1. Create instance with webhook inline\ncurl -X POST \"$EVO_API_URL/instance/create\" \\\n  -H \"apikey: $EVO_GLOBAL_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"instanceName\": \"support-bot\",\n    \"qrcode\": true,\n    \"integration\": \"WHATSAPP-BAILEYS\",\n    \"webhook\": {\n      \"url\": \"https://n8n.yourdomain.com/webhook/evo\",\n      \"byEvents\": false,\n      \"base64\": false,\n      \"events\": [\"MESSAGES_UPSERT\", \"CONNECTION_UPDATE\"]\n    }\n  }'\n\n# 2. Connect\ncurl -X GET \"$EVO_API_URL/instance/connect/support-bot\" \\\n  -H \"apikey: $EVO_API_KEY\"\n\n# 3. Configure Chatwoot\ncurl -X POST \"$EVO_API_URL/chatwoot/set/support-bot\" \\\n  -H \"apikey: $EVO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"enabled\": true,\n    \"accountId\": \"1\",\n    \"token\": \"CHATWOOT_TOKEN\",\n    \"url\": \"https://chatwoot.yourdomain.com\",\n    \"signMsg\": true,\n    \"importContacts\": true,\n    \"importMessages\": true,\n    \"autoCreate\": true,\n    \"nameInbox\": \"support-bot\"\n  }'"
      },
      {
        "title": "Check Numbers Before Sending",
        "body": "# 1. Validate numbers\ncurl -X POST \"$EVO_API_URL/chat/whatsappNumbers/$EVO_INSTANCE\" \\\n  -H \"apikey: $EVO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"numbers\": [\"5511999999999\", \"5511888888888\"] }'\n\n# 2. Send only to valid numbers"
      },
      {
        "title": "Delays",
        "body": "Always add delays between messages:\n\n{ \"delay\": 1200 }\n\nRecommended:\n\n1-2 seconds between individual messages\n3-5 seconds between mass sends\nExponential backoff on errors"
      },
      {
        "title": "Error Handling",
        "body": "StatusMeaning200Success400Bad request (check body/params)401Unauthorized (check API key)404Not found (instance/resource)500Server error"
      },
      {
        "title": "Common Issues",
        "body": "ErrorSolutionInstance not connectedRun GET /instance/connect/{instance}Invalid phone formatUse country code without +: 5511999999999Message not sentCheck GET /instance/connectionState/{instance}Group operation failedVerify you're adminMedia extraction failsEnsure MongoDB/file storage is enabledChatwoot not syncingCheck token and URL, verify importMessages is true"
      },
      {
        "title": "Instance Won't Connect",
        "body": "# 1. Check instances\nGET /instance/fetchInstances\n\n# 2. Restart instance\nPOST /instance/restart/{instance}\n\n# 3. Reconnect\nGET /instance/connect/{instance}"
      },
      {
        "title": "Chatbot Not Responding",
        "body": "Check bot is enabled: GET /{botType}/find/{instance}\nCheck trigger matches incoming message\nCheck session status: GET /{botType}/fetchSessions/{botId}/{instance}\nReset session: POST /{botType}/changeStatus/{instance} with status: \"closed\""
      },
      {
        "title": "Messages Not Being Delivered",
        "body": "Verify connection: GET /instance/connectionState/{instance}\nCheck phone format (no +, no spaces)\nVerify recipient has WhatsApp: POST /chat/whatsappNumbers/{instance}\nCheck webhook for delivery status events"
      },
      {
        "title": "v2 vs v3 (Evolution Go) Differences",
        "body": "Featurev2.3v3 (Go)LanguageNode.js/TypeScriptGoEndpoints/message/sendText/{instance}/send/textChatbot integrations7 (Typebot, OpenAI, Dify, Flowise, N8N, EvolutionBot, EvoAI)Fewer built-inChatwootNative integrationSeparateEvent transports6 (Webhook, WS, RabbitMQ, SQS, NATS, Pusher)FewerLists/ButtonsSupportedDeprecatedPTV (Round Video)SupportedSupportedStatus/StoriesSupportedSupportedTemplatesBusiness Cloud APIBusiness Cloud APIS3 StorageBuilt-inSeparate"
      },
      {
        "title": "Resources",
        "body": "Evolution API: https://github.com/EvolutionAPI/evolution-api\nDocumentation: https://doc.evolution-api.com\nChatwoot: https://www.chatwoot.com\nTypebot: https://typebot.io\nWhatsApp Business API: https://developers.facebook.com/docs/whatsapp"
      },
      {
        "title": "Tips",
        "body": "Always check connection before operations\nUse delays to avoid rate limits (1.2s+ between messages)\nStore keys in environment variables, never hardcode\nHandle disconnects with webhook CONNECTION_UPDATE event\nValidate numbers with whatsappNumbers before bulk sends\nUse debounceTime in chatbots to group fast messages\nSet ignoreJids: [\"@g.us\"] in chatbots to ignore group messages\nTest triggers with triggerType: \"keyword\" before switching to \"all\"\nMonitor sessions - expired sessions stop chatbot responses\nUse Chatwoot for human handoff from chatbot flows"
      }
    ],
    "body": "Evolution API v2.3\n\nComplete WhatsApp automation via Evolution API v2.3. Send messages, manage groups, integrate chatbots (Typebot, OpenAI, Dify, Flowise, N8N, Evo AI), configure webhooks, and connect with Chatwoot.\n\nQuick Start\n1. Set Environment Variables\n{\n  env: {\n    EVO_API_URL: \"http://localhost:8080\",       // Your API URL\n    EVO_GLOBAL_KEY: \"your-global-admin-key\",    // Admin key (instance mgmt)\n    EVO_INSTANCE: \"my-bot\",                     // Instance name\n    EVO_API_KEY: \"your-instance-token\"          // Instance token (messaging)\n  }\n}\n\n2. Create Instance & Connect\n# Create instance (supports Baileys, Business, or Evolution integration)\ncurl -X POST \"$EVO_API_URL/instance/create\" \\\n  -H \"apikey: $EVO_GLOBAL_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"instanceName\": \"my-bot\",\n    \"qrcode\": true,\n    \"integration\": \"WHATSAPP-BAILEYS\"\n  }'\n\n# Connect & get QR code\ncurl -X GET \"$EVO_API_URL/instance/connect/$EVO_INSTANCE\" \\\n  -H \"apikey: $EVO_API_KEY\"\n\n\nScan the QR code returned in base64 field. Alternately pass ?number=5511999999999 for pairing code.\n\n3. Send First Message\ncurl -X POST \"$EVO_API_URL/message/sendText/$EVO_INSTANCE\" \\\n  -H \"apikey: $EVO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"number\": \"5511999999999\",\n    \"text\": \"Hello from Evolution API v2! 🚀\"\n  }'\n\nAuthentication\n\nTwo authentication levels:\n\nType\tHeader\tUsage\nGlobal API Key\tapikey: $EVO_GLOBAL_KEY\tAdmin: create/delete instances, fetch all\nInstance API Key\tapikey: $EVO_API_KEY\tMessaging, groups, chat, profile, labels\n\nAll instance endpoints use the path pattern: /{resource}/{action}/{instanceName}\n\nCore Concepts\nPhone Number Formats\nContext\tFormat\tExample\nSending messages\tCountry code + number\t5511999999999\nGroup JID\tGroup ID\t999999999999999999@g.us\nUser JID\tNumber + suffix\t5511999999999@s.whatsapp.net\nIntegration Types\nValue\tDescription\nWHATSAPP-BAILEYS\tUnofficial (default, full features)\nWHATSAPP-BUSINESS\tOfficial Cloud API\nEVOLUTION\tEvolution channel\nMessage Delay\n\nAdd delay (milliseconds) to avoid rate limits:\n\n{ \"delay\": 1200 }\n\nFeature Reference\nInstance Management\nCreate Instance\nPOST /instance/create\nHeader: apikey: $EVO_GLOBAL_KEY\n\n{\n  \"instanceName\": \"my-bot\",\n  \"qrcode\": true,\n  \"integration\": \"WHATSAPP-BAILEYS\",\n  // Optional\n  \"token\": \"custom-api-key\",\n  \"number\": \"5511999999999\",\n  // Settings (optional)\n  \"rejectCall\": false,\n  \"msgCall\": \"\",\n  \"groupsIgnore\": false,\n  \"alwaysOnline\": false,\n  \"readMessages\": false,\n  \"readStatus\": false,\n  \"syncFullHistory\": false,\n  // Proxy (optional)\n  \"proxyHost\": \"\",\n  \"proxyPort\": \"\",\n  \"proxyProtocol\": \"\",\n  \"proxyUsername\": \"\",\n  \"proxyPassword\": \"\"\n}\n\n\nInline webhook (optional during creation):\n\n{\n  \"webhook\": {\n    \"url\": \"https://webhook.site/your-id\",\n    \"byEvents\": false,\n    \"base64\": true,\n    \"headers\": {\n      \"autorization\": \"Bearer TOKEN\"\n    },\n    \"events\": [\"MESSAGES_UPSERT\", \"CONNECTION_UPDATE\"]\n  }\n}\n\n\nInline RabbitMQ / SQS (optional during creation):\n\n{\n  \"rabbitmq\": { \"enabled\": true, \"events\": [\"MESSAGES_UPSERT\"] },\n  \"sqs\": { \"enabled\": true, \"events\": [\"MESSAGES_UPSERT\"] }\n}\n\n\nInline Chatwoot (optional during creation):\n\n{\n  \"chatwootAccountId\": \"1\",\n  \"chatwootToken\": \"TOKEN\",\n  \"chatwootUrl\": \"https://chatwoot.com\",\n  \"chatwootSignMsg\": true,\n  \"chatwootReopenConversation\": true,\n  \"chatwootConversationPending\": false,\n  \"chatwootImportContacts\": true,\n  \"chatwootNameInbox\": \"evolution\",\n  \"chatwootMergeBrazilContacts\": true,\n  \"chatwootImportMessages\": true,\n  \"chatwootDaysLimitImportMessages\": 3\n}\n\nFetch Instances\nGET /instance/fetchInstances\nHeader: apikey: $EVO_GLOBAL_KEY\n\n# Optional query params:\n# ?instanceName=my-bot\n# ?instanceId=INSTANCE_ID\n\nConnect Instance (QR Code)\nGET /instance/connect/{instance}\nHeader: apikey: $EVO_API_KEY\n\n# Optional: ?number=5511999999999 (for pairing code)\n\nConnection Status\nGET /instance/connectionState/{instance}\nHeader: apikey: $EVO_API_KEY\n\nRestart Instance\nPOST /instance/restart/{instance}\nHeader: apikey: $EVO_API_KEY\n\nSet Presence\nPOST /instance/setPresence/{instance}\nHeader: apikey: $EVO_API_KEY\n\n{ \"presence\": \"available\" }\n\n\nOptions: available, unavailable\n\nLogout Instance\nDELETE /instance/logout/{instance}\nHeader: apikey: $EVO_API_KEY\n\nDelete Instance\nDELETE /instance/delete/{instance}\nHeader: apikey: $EVO_GLOBAL_KEY\n\nSettings\nSet Settings\nPOST /settings/set/{instance}\nHeader: apikey: $EVO_API_KEY\n\n{\n  \"rejectCall\": true,\n  \"msgCall\": \"I do not accept calls\",\n  \"groupsIgnore\": false,\n  \"alwaysOnline\": true,\n  \"readMessages\": false,\n  \"syncFullHistory\": false,\n  \"readStatus\": false\n}\n\nFind Settings\nGET /settings/find/{instance}\nHeader: apikey: $EVO_API_KEY\n\nProxy\nSet Proxy\nPOST /proxy/set/{instance}\nHeader: apikey: $EVO_API_KEY\n\n{\n  \"enabled\": true,\n  \"host\": \"0.0.0.0\",\n  \"port\": \"8000\",\n  \"protocol\": \"http\",\n  \"username\": \"user\",\n  \"password\": \"pass\"\n}\n\nFind Proxy\nGET /proxy/find/{instance}\nHeader: apikey: $EVO_API_KEY\n\nSend Messages\nSend Text\nPOST /message/sendText/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"text\": \"Hello World!\"\n  // Options:\n  // \"delay\": 1200,\n  // \"linkPreview\": false,\n  // \"mentionsEveryOne\": false,\n  // \"mentioned\": [\"5511888888888\"],\n  // \"quoted\": { \"key\": { \"id\": \"MESSAGE_ID\" }, \"message\": { \"conversation\": \"quoted text\" } }\n}\n\nSend Media (URL)\nPOST /message/sendMedia/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"mediatype\": \"image\",\n  \"mimetype\": \"image/png\",\n  \"caption\": \"Caption text\",\n  \"media\": \"https://example.com/photo.jpg\",\n  \"fileName\": \"photo.png\"\n  // Options: delay, quoted, mentionsEveryOne, mentioned\n}\n\n\nMedia types: image, video, document\n\nSend Media (File Upload)\nPOST /message/sendMedia/{instance}\nContent-Type: multipart/form-data\n\n# Use form-data with file field\n\nSend PTV (Round Video)\nPOST /message/sendPtv/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"video\": \"https://example.com/video.mp4\"\n  // Options: delay, quoted, mentionsEveryOne, mentioned\n}\n\n\nAlso supports file upload via form-data.\n\nSend Narrated Audio (Voice Note)\nPOST /message/sendWhatsAppAudio/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"audio\": \"https://example.com/audio.mp3\"\n  // Options: delay, quoted, encoding (true/false)\n}\n\nSend Status/Stories\nPOST /message/sendStatus/{instance}\n\n{\n  \"type\": \"text\",\n  \"content\": \"My status update!\",\n  \"backgroundColor\": \"#008000\",\n  \"font\": 1,\n  \"allContacts\": false,\n  \"statusJidList\": [\"5511999999999@s.whatsapp.net\"]\n}\n\n\nTypes: text, image, video, audio\nFonts (text only): 1 SERIF, 2 NORICAN_REGULAR, 3 BRYNDAN_WRITE, 4 BEBASNEUE_REGULAR, 5 OSWALD_HEAVY\nFor image/video: use content as URL and caption for text.\n\nSend Sticker\nPOST /message/sendSticker/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"sticker\": \"https://example.com/sticker.webp\"\n  // Options: delay, quoted\n}\n\nSend Location\nPOST /message/sendLocation/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"name\": \"Bora Bora\",\n  \"address\": \"French Polynesia\",\n  \"latitude\": -16.505538,\n  \"longitude\": -151.742277\n  // Options: delay, quoted\n}\n\nSend Contact (vCard)\nPOST /message/sendContact/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"contact\": [\n    {\n      \"fullName\": \"Contact Name\",\n      \"wuid\": \"559999999999\",\n      \"phoneNumber\": \"+55 99 9 9999-9999\",\n      \"organization\": \"Company\",\n      \"email\": \"email@example.com\",\n      \"url\": \"https://example.com\"\n    }\n  ]\n}\n\n\nMultiple contacts can be sent in the array.\n\nSend Reaction\nPOST /message/sendReaction/{instance}\n\n{\n  \"key\": {\n    \"remoteJid\": \"5511999999999@s.whatsapp.net\",\n    \"fromMe\": true,\n    \"id\": \"BAE5A75CB0F39712\"\n  },\n  \"reaction\": \"🚀\"\n}\n\n\nSet reaction: \"\" to remove.\n\nSend Poll\nPOST /message/sendPoll/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"name\": \"What is your favorite color?\",\n  \"selectableCount\": 1,\n  \"values\": [\"Red\", \"Blue\", \"Green\"]\n  // Options: delay, quoted\n}\n\nSend List\nPOST /message/sendList/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"title\": \"List Title\",\n  \"description\": \"Choose an option\",\n  \"buttonText\": \"Click Here\",\n  \"footerText\": \"Footer text\",\n  \"sections\": [\n    {\n      \"title\": \"Section 1\",\n      \"rows\": [\n        {\n          \"title\": \"Option A\",\n          \"description\": \"Description of option A\",\n          \"rowId\": \"opt_a\"\n        },\n        {\n          \"title\": \"Option B\",\n          \"description\": \"Description of option B\",\n          \"rowId\": \"opt_b\"\n        }\n      ]\n    }\n  ]\n  // Options: delay, quoted\n}\n\nSend Buttons\nPOST /message/sendButtons/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"title\": \"Button Title\",\n  \"description\": \"Button Description\",\n  \"footer\": \"Footer Text\",\n  \"buttons\": [\n    { \"type\": \"reply\", \"displayText\": \"Reply\", \"id\": \"btn_1\" },\n    { \"type\": \"copy\", \"displayText\": \"Copy Code\", \"copyCode\": \"ABC123\" },\n    { \"type\": \"url\", \"displayText\": \"Open Link\", \"url\": \"https://example.com\" },\n    { \"type\": \"call\", \"displayText\": \"Call Us\", \"phoneNumber\": \"5511999999999\" },\n    { \"type\": \"pix\", \"currency\": \"BRL\", \"name\": \"John Doe\", \"keyType\": \"random\", \"key\": \"uuid-key\" }\n  ]\n  // Options: delay, quoted\n}\n\n\nButton types: reply, copy, url, call, pix\nPix keyType: phone, email, cpf, cnpj, random\n\nChat Operations\nCheck WhatsApp Numbers\nPOST /chat/whatsappNumbers/{instance}\n\n{\n  \"numbers\": [\n    \"55911111111\",\n    \"55922222222\",\n    \"55933333333\"\n  ]\n}\n\nRead Messages (Mark as Read)\nPOST /chat/markMessageAsRead/{instance}\n\n{\n  \"readMessages\": [\n    {\n      \"remoteJid\": \"5511999999999@s.whatsapp.net\",\n      \"fromMe\": false,\n      \"id\": \"MESSAGE_ID\"\n    }\n  ]\n}\n\nArchive Chat\nPOST /chat/archiveChat/{instance}\n\n{\n  \"lastMessage\": {\n    \"key\": {\n      \"remoteJid\": \"5511999999999@s.whatsapp.net\",\n      \"fromMe\": false,\n      \"id\": \"MESSAGE_ID\"\n    }\n  },\n  \"chat\": \"5511999999999@s.whatsapp.net\",\n  \"archive\": true\n}\n\n\nSet archive: false to unarchive.\n\nMark Chat Unread\nPOST /chat/markChatUnread/{instance}\n\n{\n  \"lastMessage\": {\n    \"key\": {\n      \"remoteJid\": \"5511999999999@s.whatsapp.net\",\n      \"fromMe\": false,\n      \"id\": \"MESSAGE_ID\"\n    }\n  },\n  \"chat\": \"5511999999999@s.whatsapp.net\"\n}\n\nDelete Message\nDELETE /chat/deleteMessageForEveryone/{instance}\n\n{\n  \"id\": \"MESSAGE_ID\",\n  \"remoteJid\": \"5511999999999@s.whatsapp.net\",\n  \"fromMe\": true,\n  \"participant\": \"participant_jid\"\n}\n\nUpdate Message (Edit)\nPOST /chat/updateMessage/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"key\": {\n    \"remoteJid\": \"5511999999999@s.whatsapp.net\",\n    \"fromMe\": true,\n    \"id\": \"MESSAGE_ID\"\n  },\n  \"text\": \"new edited message\"\n}\n\nSend Presence (Typing Indicator)\nPOST /chat/sendPresence/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"delay\": 1200,\n  \"presence\": \"composing\"\n}\n\n\nOptions: composing, recording, paused\n\nUpdate Block Status\nPOST /message/updateBlockStatus/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"status\": \"block\"\n}\n\n\nOptions: block, unblock\n\nFetch Profile Picture\nPOST /chat/fetchProfilePictureUrl/{instance}\n\n{ \"number\": \"5511999999999\" }\n\nGet Base64 From Media Message\nPOST /chat/getBase64FromMediaMessage/{instance}\n\n{\n  \"message\": {\n    \"key\": { \"id\": \"MESSAGE_ID\" }\n  },\n  \"convertToMp4\": false\n}\n\n\nExtracts base64 from received media. Set convertToMp4: true for audio files to get MP4 instead of OGG.\n\nFind Contacts\nPOST /chat/findContacts/{instance}\n\n{\n  \"where\": {\n    \"id\": \"5511999999999\"\n  }\n}\n\n\nOmit id to list all contacts.\n\nFind Messages\nPOST /chat/findMessages/{instance}\n\n{\n  \"where\": {\n    \"key\": {\n      \"remoteJid\": \"5511999999999\"\n    }\n  },\n  \"page\": 1,\n  \"offset\": 10\n}\n\nFind Status Message\nPOST /chat/findStatusMessage/{instance}\n\n{\n  \"where\": {\n    \"remoteJid\": \"5511999999999@s.whatsapp.net\",\n    \"id\": \"MESSAGE_ID\"\n  },\n  \"page\": 1,\n  \"offset\": 10\n}\n\nFind Chats\nPOST /chat/findChats/{instance}\n\nCalls\nFake Call (Offer)\nPOST /call/offer/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"isVideo\": false,\n  \"callDuration\": 3\n}\n\n\nSimulates a call offer to the number. callDuration is in seconds.\n\nLabels\nFind Labels\nGET /label/findLabels/{instance}\n\nHandle Labels (Add/Remove)\nPOST /label/handleLabel/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"labelId\": \"label_id_here\",\n  \"action\": \"add\"\n}\n\n\nActions: add, remove\n\nProfile Settings\nFetch Business Profile\nPOST /chat/fetchBusinessProfile/{instance}\n\n{ \"number\": \"5511999999999\" }\n\nFetch Profile\nPOST /chat/fetchProfile/{instance}\n\n{ \"number\": \"5511999999999\" }\n\nUpdate Profile Name\nPOST /chat/updateProfileName/{instance}\n\n{ \"name\": \"My Bot Name\" }\n\nUpdate Profile Status\nPOST /chat/updateProfileStatus/{instance}\n\n{ \"status\": \"Available 24/7\" }\n\nUpdate Profile Picture\nPOST /chat/updateProfilePicture/{instance}\n\n{ \"picture\": \"https://example.com/avatar.jpg\" }\n\nRemove Profile Picture\nDELETE /chat/removeProfilePicture/{instance}\n\nFetch Privacy Settings\nGET /chat/fetchPrivacySettings/{instance}\n\nUpdate Privacy Settings\nPOST /chat/updatePrivacySettings/{instance}\n\n{\n  \"readreceipts\": \"all\",\n  \"profile\": \"all\",\n  \"status\": \"contacts\",\n  \"online\": \"all\",\n  \"last\": \"contacts\",\n  \"groupadd\": \"none\"\n}\n\n\nPrivacy values:\n\nreadreceipts: all, none\nprofile: all, contacts, contact_blacklist, none\nstatus: all, contacts, contact_blacklist, none\nonline: all, match_last_seen\nlast: all, contacts, contact_blacklist, none\ngroupadd: all, contacts, contact_blacklist\nGroup Management\nCreate Group\nPOST /group/create/{instance}\n\n{\n  \"subject\": \"Group Name\",\n  \"description\": \"Group description (optional)\",\n  \"participants\": [\n    \"5531900000000\",\n    \"5531900000000\"\n  ]\n}\n\nUpdate Group Picture\nPOST /group/updateGroupPicture/{instance}?groupJid={groupJid}\n\n{ \"image\": \"https://example.com/group-photo.png\" }\n\nUpdate Group Subject (Name)\nPOST /group/updateGroupSubject/{instance}?groupJid={groupJid}\n\n{ \"subject\": \"New Group Name\" }\n\nUpdate Group Description\nPOST /group/updateGroupDescription/{instance}?groupJid={groupJid}\n\n{ \"description\": \"New group description\" }\n\nFetch Invite Code\nGET /group/inviteCode/{instance}?groupJid={groupJid}\n\nRevoke Invite Code\nPOST /group/revokeInviteCode/{instance}?groupJid={groupJid}\n\nSend Invite URL\nPOST /group/sendInvite/{instance}\n\n{\n  \"groupJid\": \"999999999@g.us\",\n  \"description\": \"Join my WhatsApp group:\",\n  \"numbers\": [\"5511999999999\"]\n}\n\nFind Group by Invite Code\nGET /group/inviteInfo/{instance}?inviteCode={inviteCode}\n\nFind Group by JID\nGET /group/findGroupInfos/{instance}?groupJid={groupJid}\n\nFetch All Groups\nGET /group/fetchAllGroups/{instance}\n# Optional: ?getParticipants=true\n\nFind Participants\nGET /group/participants/{instance}?groupJid={groupJid}\n\nUpdate Participants\nPOST /group/updateParticipant/{instance}?groupJid={groupJid}\n\n{\n  \"action\": \"add\",\n  \"participants\": [\"5511999999999\"]\n}\n\n\nActions: add, remove, promote, demote\n\nUpdate Group Settings\nPOST /group/updateSetting/{instance}?groupJid={groupJid}\n\n{ \"action\": \"announcement\" }\n\n\nActions:\n\nannouncement - Only admins send messages\nnot_announcement - Everyone can send\nlocked - Only admins edit group info\nunlocked - Everyone can edit group info\nToggle Ephemeral (Disappearing Messages)\nPOST /group/toggleEphemeral/{instance}?groupJid={groupJid}\n\n{ \"expiration\": 86400 }\n\n\nExpiration values (seconds):\n\n0 - Off\n86400 - 24 hours\n604800 - 7 days\n7776000 - 90 days\nLeave Group\nDELETE /group/leaveGroup/{instance}?groupJid={groupJid}\n\nIntegrations - Events\nWebhook\n# Set Webhook\nPOST /webhook/set/{instance}\n\n{\n  \"webhook\": {\n    \"enabled\": true,\n    \"url\": \"https://webhook.site/your-id\",\n    \"headers\": {\n      \"autorization\": \"Bearer TOKEN\",\n      \"Content-Type\": \"application/json\"\n    },\n    \"byEvents\": false,\n    \"base64\": false,\n    \"events\": [\n      \"APPLICATION_STARTUP\",\n      \"QRCODE_UPDATED\",\n      \"MESSAGES_UPSERT\",\n      \"MESSAGES_UPDATE\",\n      \"MESSAGES_DELETE\",\n      \"SEND_MESSAGE\",\n      \"CONTACTS_UPDATE\",\n      \"PRESENCE_UPDATE\",\n      \"CHATS_UPDATE\",\n      \"CHATS_DELETE\",\n      \"GROUPS_UPSERT\",\n      \"GROUP_UPDATE\",\n      \"GROUP_PARTICIPANTS_UPDATE\",\n      \"CONNECTION_UPDATE\",\n      \"LABELS_EDIT\",\n      \"LABELS_ASSOCIATION\",\n      \"CALL\",\n      \"TYPEBOT_START\",\n      \"TYPEBOT_CHANGE_STATUS\"\n    ]\n  }\n}\n\n# Find Webhook\nGET /webhook/find/{instance}\n\n\nKey options:\n\nbyEvents - If true, sends to separate URLs per event type\nbase64 - If true, media comes as base64 in payload\nWebSocket\nPOST /websocket/set/{instance}\n\n{\n  \"websocket\": {\n    \"enabled\": true,\n    \"events\": [\"MESSAGES_UPSERT\", \"CONNECTION_UPDATE\"]\n  }\n}\n\nGET /websocket/find/{instance}\n\nRabbitMQ\nPOST /rabbitmq/set/{instance}\n\n{\n  \"rabbitmq\": {\n    \"enabled\": true,\n    \"events\": [\"MESSAGES_UPSERT\", \"CONNECTION_UPDATE\"]\n  }\n}\n\nGET /rabbitmq/find/{instance}\n\nSQS (Amazon)\nPOST /sqs/set/{instance}\n\n{\n  \"sqs\": {\n    \"enabled\": true,\n    \"events\": [\"MESSAGES_UPSERT\", \"CONNECTION_UPDATE\"]\n  }\n}\n\nGET /sqs/find/{instance}\n\nNATS\nPOST /nats/set/{instance}\nGET /nats/find/{instance}\n\n\nSame payload structure as SQS/RabbitMQ.\n\nPusher\nPOST /pusher/set/{instance}\nGET /pusher/find/{instance}\n\n\nSame payload structure as SQS/RabbitMQ.\n\nAvailable Events (all transports): APPLICATION_STARTUP, QRCODE_UPDATED, MESSAGES_SET, MESSAGES_UPSERT, MESSAGES_UPDATE, MESSAGES_DELETE, SEND_MESSAGE, CONTACTS_SET, CONTACTS_UPSERT, CONTACTS_UPDATE, PRESENCE_UPDATE, CHATS_SET, CHATS_UPSERT, CHATS_UPDATE, CHATS_DELETE, GROUPS_UPSERT, GROUP_UPDATE, GROUP_PARTICIPANTS_UPDATE, CONNECTION_UPDATE, LABELS_EDIT, LABELS_ASSOCIATION, CALL, TYPEBOT_START, TYPEBOT_CHANGE_STATUS\n\nIntegrations - Chatbots\n\nAll chatbot integrations share a common pattern with settings, session management, CRUD, and trigger configuration.\n\nCommon trigger options (all chatbots):\n\n{\n  \"triggerType\": \"keyword\",\n  \"triggerOperator\": \"equals\",\n  \"triggerValue\": \"hello\",\n  \"expire\": 20,\n  \"keywordFinish\": \"#SAIR\",\n  \"delayMessage\": 1000,\n  \"unknownMessage\": \"Message not recognized\",\n  \"listeningFromMe\": false,\n  \"stopBotFromMe\": false,\n  \"keepOpen\": false,\n  \"debounceTime\": 10,\n  \"ignoreJids\": []\n}\n\nField\tDescription\ntriggerType\tall (every message) or keyword (matched)\ntriggerOperator\tcontains, equals, startsWith, endsWith, regex, none\ntriggerValue\tThe keyword/pattern to match\nexpire\tSession timeout (minutes)\nkeywordFinish\tKeyword to end bot session\ndelayMessage\tDelay between messages (ms)\nunknownMessage\tResponse for unrecognized input\nlisteningFromMe\tProcess messages sent by you\nstopBotFromMe\tPause bot when you send a message\nkeepOpen\tKeep session alive after flow ends\ndebounceTime\tDebounce interval (seconds)\nignoreJids\tJIDs to ignore (e.g., [\"@g.us\"] to ignore groups)\nChatwoot\n# Set Chatwoot\nPOST /chatwoot/set/{instance}\n\n{\n  \"enabled\": true,\n  \"accountId\": \"1\",\n  \"token\": \"CHATWOOT_TOKEN\",\n  \"url\": \"https://chatwoot.yourdomain.com\",\n  \"signMsg\": true,\n  \"reopenConversation\": true,\n  \"conversationPending\": false,\n  \"nameInbox\": \"evolution\",\n  \"mergeBrazilContacts\": true,\n  \"importContacts\": true,\n  \"importMessages\": true,\n  \"daysLimitImportMessages\": 2,\n  \"signDelimiter\": \"\\n\",\n  \"autoCreate\": true,\n  \"organization\": \"BOT\",\n  \"logo\": \"https://example.com/logo.png\",\n  \"ignoreJids\": [\"@g.us\"]\n}\n\n# Find Chatwoot\nGET /chatwoot/find/{instance}\n\nTypebot\n# Create Typebot\nPOST /typebot/create/{instance}\n\n{\n  \"enabled\": true,\n  \"url\": \"https://typebot.yourdomain.com\",\n  \"typebot\": \"my-typebot-flow-id\",\n  \"triggerType\": \"keyword\",\n  \"triggerOperator\": \"regex\",\n  \"triggerValue\": \"^atend.*\",\n  \"expire\": 20,\n  \"keywordFinish\": \"#SAIR\",\n  \"delayMessage\": 1000,\n  \"unknownMessage\": \"Message not recognized\",\n  \"listeningFromMe\": false,\n  \"stopBotFromMe\": false,\n  \"keepOpen\": false,\n  \"debounceTime\": 10\n}\n\n# Find/Fetch/Update/Delete\nGET  /typebot/find/{instance}\nGET  /typebot/fetch/{typebotId}/{instance}\nPUT  /typebot/update/{typebotId}/{instance}\nDELETE /typebot/delete/{typebotId}/{instance}\n\n# Start Typebot manually\nPOST /typebot/start/{instance}\n\n{\n  \"url\": \"https://typebot.yourdomain.com\",\n  \"typebot\": \"flow-id\",\n  \"remoteJid\": \"5511999999999@s.whatsapp.net\",\n  \"startSession\": false,\n  \"variables\": [\n    { \"name\": \"pushName\", \"value\": \"User Name\" }\n  ]\n}\n\n# Change session status\nPOST /typebot/changeStatus/{instance}\n{ \"remoteJid\": \"5511999999999@s.whatsapp.net\", \"status\": \"closed\" }\n\n# Fetch sessions\nGET /typebot/fetchSessions/{typebotId}/{instance}\n\n# Default settings\nPOST /typebot/settings/{instance}\nGET  /typebot/fetchSettings/{instance}\n\n{\n  \"expire\": 20,\n  \"keywordFinish\": \"#SAIR\",\n  \"delayMessage\": 1000,\n  \"unknownMessage\": \"Not recognized\",\n  \"listeningFromMe\": false,\n  \"stopBotFromMe\": false,\n  \"keepOpen\": false,\n  \"debounceTime\": 10,\n  \"ignoreJids\": [],\n  \"typebotIdFallback\": \"fallback-typebot-id\"\n}\n\n\nSession statuses: opened, paused, closed\n\nOpenAI\n# Set Credentials\nPOST /openai/creds/{instance}\n{ \"name\": \"apikey\", \"apiKey\": \"sk-proj-...\" }\n\nGET /openai/creds/{instance}\nDELETE /openai/creds/{openaiCredsId}/{instance}\n\n# Create Bot (Assistant or Chat Completion)\nPOST /openai/create/{instance}\n\n{\n  \"enabled\": true,\n  \"openaiCredsId\": \"creds-id\",\n  \"botType\": \"assistant\",\n  // For assistants:\n  \"assistantId\": \"asst_XXXXX\",\n  \"functionUrl\": \"https://n8n.site.com\",\n  // For chatCompletion:\n  \"model\": \"gpt-4o\",\n  \"systemMessages\": [\"You are a helpful assistant.\"],\n  \"assistantMessages\": [\"Hello, how can I help?\"],\n  \"userMessages\": [\"Hello!\"],\n  \"maxTokens\": 300,\n  // Trigger options...\n  \"triggerType\": \"keyword\",\n  \"triggerOperator\": \"equals\",\n  \"triggerValue\": \"ai\"\n}\n\n# Find/Fetch/Update/Delete\nGET  /openai/find/{instance}\nGET  /openai/fetch/{openaiBotId}/{instance}\nPUT  /openai/update/{openaiBotId}/{instance}\nDELETE /openai/delete/{openaiBotId}/{instance}\n\n# Session management\nPOST /openai/changeStatus/{instance}\nGET  /openai/fetchSessions/{openaiBotId}/{instance}\n\n# Default settings\nPOST /openai/settings/{instance}\nGET  /openai/fetchSettings/{instance}\n\n\nBot types: assistant, chatCompletion\n\nDify\nPOST /dify/create/{instance}\n\n{\n  \"enabled\": true,\n  \"botType\": \"chatBot\",\n  \"apiUrl\": \"http://dify.site.com/v1\",\n  \"apiKey\": \"app-123456\",\n  // Trigger options...\n}\n\nGET  /dify/find/{instance}\nGET  /dify/fetch/{difyId}/{instance}\nPUT  /dify/update/{difyId}/{instance}\nDELETE /dify/delete/{difyId}/{instance}\n\nPOST /dify/changeStatus/{instance}\nGET  /dify/fetchSessions/{difyId}/{instance}\n\nPOST /dify/settings/{instance}\nGET  /dify/fetchSettings/{instance}\n\n\nDify bot types: chatBot, textGenerator, agent, workflow\n\nFlowise\nPOST /flowise/create/{instance}\n\n{\n  \"enabled\": true,\n  \"apiUrl\": \"http://flowise.site.com/v1\",\n  \"apiKey\": \"app-123456\",\n  // Trigger options...\n}\n\nGET  /flowise/find/{instance}\nGET  /flowise/fetch/{flowiseId}/{instance}\nPUT  /flowise/update/{flowiseId}/{instance}\nDELETE /flowise/delete/{flowiseId}/{instance}\n\nPOST /flowise/changeStatus/{instance}\nGET  /flowise/fetchSessions/{flowiseId}/{instance}\n\nPOST /flowise/settings/{instance}\nGET  /flowise/fetchSettings/{instance}\n\nN8N\nPOST /n8n/create/{instance}\n\n{\n  \"enabled\": true,\n  \"apiUrl\": \"http://n8n.site.com/v1\",\n  \"apiKey\": \"app-123456\",\n  // Trigger options...\n}\n\nGET  /n8n/find/{instance}\nGET  /n8n/fetch/{n8nId}/{instance}\nPUT  /n8n/update/{n8nId}/{instance}\nDELETE /n8n/delete/{n8nId}/{instance}\n\nPOST /n8n/changeStatus/{instance}\nGET  /n8n/fetchSessions/{n8nId}/{instance}\n\nPOST /n8n/settings/{instance}\nGET  /n8n/fetchSettings/{instance}\n\nEvolution Bot\nPOST /evolutionBot/create/{instance}\n\n{\n  \"enabled\": true,\n  \"apiUrl\": \"http://api.site.com/v1\",\n  \"apiKey\": \"app-123456\",\n  // Trigger options...\n}\n\nGET  /evolutionBot/find/{instance}\nGET  /evolutionBot/fetch/{evolutionBotId}/{instance}\nPUT  /evolutionBot/update/{evolutionBotId}/{instance}\nDELETE /evolutionBot/delete/{evolutionBotId}/{instance}\n\nPOST /evolutionBot/changeStatus/{instance}\nGET  /evolutionBot/fetchSessions/{evolutionBotId}/{instance}\n\nPOST /evolutionBot/settings/{instance}\nGET  /evolutionBot/fetchSettings/{instance}\n\nEvo AI\nPOST /evoai/create/{instance}\n\n{\n  \"enabled\": true,\n  \"apiUrl\": \"http://evoai.site.com/v1\",\n  \"apiKey\": \"app-123456\",\n  // Trigger options...\n}\n\nGET  /evoai/find/{instance}\nGET  /evoai/fetch/{evoaiId}/{instance}\nPUT  /evoai/update/{evoaiId}/{instance}\nDELETE /evoai/delete/{evoaiId}/{instance}\n\nPOST /evoai/changeStatus/{instance}\nGET  /evoai/fetchSessions/{evoaiId}/{instance}\n\nPOST /evoai/settings/{instance}\nGET  /evoai/fetchSettings/{instance}\n\nIntegrations - Channel (WhatsApp Business Cloud API)\nSend Template\nPOST /message/sendTemplate/{instance}\n\n{\n  \"number\": \"5511999999999\",\n  \"name\": \"hello_world\",\n  \"language\": \"en_US\",\n  \"components\": [\n    {\n      \"type\": \"body\",\n      \"parameters\": [\n        { \"type\": \"text\", \"text\": \"John\" },\n        { \"type\": \"text\", \"text\": \"email@email.com\" }\n      ]\n    },\n    {\n      \"type\": \"button\",\n      \"sub_type\": \"URL\",\n      \"index\": \"1\",\n      \"parameters\": [\n        { \"type\": \"text\", \"text\": \"/reset-password/1234\" }\n      ]\n    }\n  ]\n}\n\nCreate Template\nPOST /template/create/{instance}\n\n{\n  \"name\": \"my_template\",\n  \"category\": \"MARKETING\",\n  \"allowCategoryChange\": false,\n  \"language\": \"en_US\",\n  \"components\": [\n    {\n      \"type\": \"BODY\",\n      \"text\": \"Thank you {{1}}! Confirmation: {{2}}\",\n      \"example\": {\n        \"body_text\": [[\"John\", \"860198-230332\"]]\n      }\n    },\n    {\n      \"type\": \"BUTTONS\",\n      \"buttons\": [\n        { \"type\": \"QUICK_REPLY\", \"text\": \"Unsubscribe\" },\n        { \"type\": \"URL\", \"text\": \"Support\", \"url\": \"https://example.com\" }\n      ]\n    }\n  ]\n}\n\n\nCategories: AUTHENTICATION, MARKETING, UTILITY\n\nFind Templates\nGET /template/find/{instance}\n\nEvolution Channel Webhook\nPOST /webhook/evolution\n\n{\n  \"numberId\": \"5511999999999\",\n  \"key\": {\n    \"remoteJid\": \"5511888888888\",\n    \"fromMe\": false,\n    \"id\": \"ABC1234\"\n  },\n  \"pushName\": \"Contact Name\",\n  \"message\": {\n    \"conversation\": \"Hello\"\n  },\n  \"messageType\": \"conversation\"\n}\n\n\nMessage types: conversation, imageMessage, videoMessage, documentMessage, audioMessage\n\nStorage (S3/MinIO)\nGet Media\nPOST /s3/getMedia/{instance}\n\n{\n  \"id\": \"media-id\",\n  \"type\": \"image\",\n  \"messageId\": \"MESSAGE_ID\"\n}\n\nGet Media URL\nPOST /s3/getMediaUrl/{instance}\n\n{\n  \"id\": \"media-id\"\n}\n\nSystem\nGet API Information\nGET /\n\n\nReturns API version and system info.\n\nMetrics\nGET /metrics\nAuthorization: Basic (METRICS_USER:password)\n\nCommon Workflows\nBroadcast Message\nfor number in 5511999999999 5511888888888 5511777777777; do\n  curl -X POST \"$EVO_API_URL/message/sendText/$EVO_INSTANCE\" \\\n    -H \"apikey: $EVO_API_KEY\" \\\n    -H \"Content-Type: application/json\" \\\n    -d \"{\n      \\\"number\\\": \\\"$number\\\",\n      \\\"text\\\": \\\"Broadcast message!\\\",\n      \\\"delay\\\": 2000\n    }\"\ndone\n\nAuto-Create Group + Configure Bot\n# 1. Create group\ncurl -X POST \"$EVO_API_URL/group/create/$EVO_INSTANCE\" \\\n  -H \"apikey: $EVO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"subject\": \"Support Group\",\n    \"participants\": [\"5511999999999\"]\n  }'\n\n# 2. Attach Typebot for auto-response\ncurl -X POST \"$EVO_API_URL/typebot/create/$EVO_INSTANCE\" \\\n  -H \"apikey: $EVO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"enabled\": true,\n    \"url\": \"https://typebot.yourdomain.com\",\n    \"typebot\": \"support-flow-id\",\n    \"triggerType\": \"all\"\n  }'\n\nFull Instance Setup (Instance + Webhook + Chatwoot)\n# 1. Create instance with webhook inline\ncurl -X POST \"$EVO_API_URL/instance/create\" \\\n  -H \"apikey: $EVO_GLOBAL_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"instanceName\": \"support-bot\",\n    \"qrcode\": true,\n    \"integration\": \"WHATSAPP-BAILEYS\",\n    \"webhook\": {\n      \"url\": \"https://n8n.yourdomain.com/webhook/evo\",\n      \"byEvents\": false,\n      \"base64\": false,\n      \"events\": [\"MESSAGES_UPSERT\", \"CONNECTION_UPDATE\"]\n    }\n  }'\n\n# 2. Connect\ncurl -X GET \"$EVO_API_URL/instance/connect/support-bot\" \\\n  -H \"apikey: $EVO_API_KEY\"\n\n# 3. Configure Chatwoot\ncurl -X POST \"$EVO_API_URL/chatwoot/set/support-bot\" \\\n  -H \"apikey: $EVO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"enabled\": true,\n    \"accountId\": \"1\",\n    \"token\": \"CHATWOOT_TOKEN\",\n    \"url\": \"https://chatwoot.yourdomain.com\",\n    \"signMsg\": true,\n    \"importContacts\": true,\n    \"importMessages\": true,\n    \"autoCreate\": true,\n    \"nameInbox\": \"support-bot\"\n  }'\n\nCheck Numbers Before Sending\n# 1. Validate numbers\ncurl -X POST \"$EVO_API_URL/chat/whatsappNumbers/$EVO_INSTANCE\" \\\n  -H \"apikey: $EVO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"numbers\": [\"5511999999999\", \"5511888888888\"] }'\n\n# 2. Send only to valid numbers\n\nRate Limits & Best Practices\nDelays\n\nAlways add delays between messages:\n\n{ \"delay\": 1200 }\n\n\nRecommended:\n\n1-2 seconds between individual messages\n3-5 seconds between mass sends\nExponential backoff on errors\nError Handling\nStatus\tMeaning\n200\tSuccess\n400\tBad request (check body/params)\n401\tUnauthorized (check API key)\n404\tNot found (instance/resource)\n500\tServer error\nCommon Issues\nError\tSolution\nInstance not connected\tRun GET /instance/connect/{instance}\nInvalid phone format\tUse country code without +: 5511999999999\nMessage not sent\tCheck GET /instance/connectionState/{instance}\nGroup operation failed\tVerify you're admin\nMedia extraction fails\tEnsure MongoDB/file storage is enabled\nChatwoot not syncing\tCheck token and URL, verify importMessages is true\nTroubleshooting\nInstance Won't Connect\n# 1. Check instances\nGET /instance/fetchInstances\n\n# 2. Restart instance\nPOST /instance/restart/{instance}\n\n# 3. Reconnect\nGET /instance/connect/{instance}\n\nChatbot Not Responding\nCheck bot is enabled: GET /{botType}/find/{instance}\nCheck trigger matches incoming message\nCheck session status: GET /{botType}/fetchSessions/{botId}/{instance}\nReset session: POST /{botType}/changeStatus/{instance} with status: \"closed\"\nMessages Not Being Delivered\nVerify connection: GET /instance/connectionState/{instance}\nCheck phone format (no +, no spaces)\nVerify recipient has WhatsApp: POST /chat/whatsappNumbers/{instance}\nCheck webhook for delivery status events\nv2 vs v3 (Evolution Go) Differences\nFeature\tv2.3\tv3 (Go)\nLanguage\tNode.js/TypeScript\tGo\nEndpoints\t/message/sendText/{instance}\t/send/text\nChatbot integrations\t7 (Typebot, OpenAI, Dify, Flowise, N8N, EvolutionBot, EvoAI)\tFewer built-in\nChatwoot\tNative integration\tSeparate\nEvent transports\t6 (Webhook, WS, RabbitMQ, SQS, NATS, Pusher)\tFewer\nLists/Buttons\tSupported\tDeprecated\nPTV (Round Video)\tSupported\tSupported\nStatus/Stories\tSupported\tSupported\nTemplates\tBusiness Cloud API\tBusiness Cloud API\nS3 Storage\tBuilt-in\tSeparate\nResources\nEvolution API: https://github.com/EvolutionAPI/evolution-api\nDocumentation: https://doc.evolution-api.com\nChatwoot: https://www.chatwoot.com\nTypebot: https://typebot.io\nWhatsApp Business API: https://developers.facebook.com/docs/whatsapp\nTips\nAlways check connection before operations\nUse delays to avoid rate limits (1.2s+ between messages)\nStore keys in environment variables, never hardcode\nHandle disconnects with webhook CONNECTION_UPDATE event\nValidate numbers with whatsappNumbers before bulk sends\nUse debounceTime in chatbots to group fast messages\nSet ignoreJids: [\"@g.us\"] in chatbots to ignore group messages\nTest triggers with triggerType: \"keyword\" before switching to \"all\"\nMonitor sessions - expired sessions stop chatbot responses\nUse Chatwoot for human handoff from chatbot flows"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/impa365/evolution-api",
    "publisherUrl": "https://clawhub.ai/impa365/evolution-api",
    "owner": "impa365",
    "version": "2.3.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/evolution-api",
    "downloadUrl": "https://openagent3.xyz/downloads/evolution-api",
    "agentUrl": "https://openagent3.xyz/skills/evolution-api/agent",
    "manifestUrl": "https://openagent3.xyz/skills/evolution-api/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/evolution-api/agent.md"
  }
}