tupiflow registry /plugins/whatsapp/0.2.1

whatsapp @ 0.2.1

WhatsApp (Baileys) integration. Link a personal/business account via QR; receive messages + send replies.

Publisher / author
tupiflow
Type
whatsapp
Signing key
kid-20260520-e5fe9257

Bundle

Download signed bundle verifies against kid-20260520-e5fe9257

Signed manifest (spec)

Byte-for-byte signed payload. Hash with RFC 8785 canonical JSON, verify the Ed25519 signature against the public key for kid-20260520-e5fe9257.

{
  "icon": {
    "kind": "svg",
    "path": "icon.svg"
  },
  "bundle": {
    "sha256": "372b7a577cbdf64c6dbef4c7938693c5ba17c4149e9e6c05459f48f5a204b2b4",
    "sizeBytes": 39741
  },
  "routes": [
    {
      "path": "/qr/:integrationId",
      "method": "GET",
      "handlerExport": "whatsappQrHandler"
    },
    {
      "path": "/reset/:integrationId",
      "method": "POST",
      "handlerExport": "whatsappResetHandler"
    }
  ],
  "actions": [
    {
      "slug": "send-reply",
      "label": "Send WhatsApp Reply",
      "category": "WhatsApp",
      "description": "Reply to the incoming WhatsApp thread",
      "configFields": [
        {
          "key": "text",
          "type": "template-textarea",
          "label": "Reply Text",
          "example": "Hello from my workflow!",
          "required": true
        },
        {
          "key": "chatId",
          "type": "template-input",
          "label": "Chat ID (fallback)"
        },
        {
          "key": "splitBubbles",
          "type": "select",
          "label": "Split into multiple bubbles"
        },
        {
          "key": "bubbleDelayMs",
          "type": "number",
          "label": "Delay between bubbles (ms)"
        }
      ],
      "outputFields": [
        {
          "field": "messageId",
          "description": "ID of the last posted message (final bubble)"
        },
        {
          "field": "messageIds",
          "description": "IDs of every posted message in order. Length matches bubbleCount."
        },
        {
          "field": "bubbleCount",
          "description": "How many WhatsApp messages were posted (1 unless splitBubbles is on)"
        },
        {
          "field": "threadId",
          "description": "ID of the thread replied to"
        }
      ],
      "stepFunction": "whatsappSendReplyStep"
    }
  ],
  "runtime": {
    "minTupiflowVersion": "0.0.0"
  },
  "workers": [
    {
      "id": "whatsapp-qr-encode",
      "entry": "workers/whatsapp-qr-encode.mjs",
      "timeoutMs": 5000,
      "memLimitMb": 128
    }
  ],
  "identity": {
    "name": "whatsapp",
    "type": "whatsapp",
    "version": "0.2.1",
    "publisher": "tupiflow",
    "description": "WhatsApp (Baileys) integration. Link a personal/business account via QR; receive messages + send replies."
  },
  "connection": {
    "triggerIcon": "MessageCircle",
    "triggerType": "Chat Message",
    "triggerLabel": "WhatsApp Message",
    "triggerInputFields": [
      {
        "field": "text",
        "description": "Text of the incoming message"
      },
      {
        "field": "integrationId",
        "description": "WhatsApp integration ID"
      },
      {
        "field": "threadId",
        "description": "WhatsApp thread ID"
      },
      {
        "field": "channelId",
        "description": "WhatsApp channel (JID)"
      },
      {
        "field": "userName",
        "description": "Sender's display name"
      },
      {
        "field": "isDM",
        "description": "True if the message is a 1:1 DM"
      },
      {
        "field": "isMention",
        "description": "True if the bot was @-mentioned"
      },
      {
        "field": "threadJson",
        "description": "Serialized thread for replies"
      },
      {
        "field": "imageUrls",
        "description": "Image attachments from the message (data URLs)"
      },
      {
        "field": "fileUrls",
        "description": "Document/file attachments from the message (data URLs, excludes images/audio/video)"
      },
      {
        "field": "audioUrls",
        "description": "Audio attachments from the message (voice notes, audio files; data URLs)"
      },
      {
        "field": "videoUrls",
        "description": "Video attachments from the message (mp4, webm, mov; data URLs). Requires a model that supports video input (e.g. Gemini)."
      }
    ],
    "supportsAttachments": false
  },
  "entrypoint": "bundle.mjs",
  "credentials": [],
  "capabilities": [
    "net.fetch",
    "secrets.read",
    "connection.lifecycle",
    "workflow.dispatch",
    "integration.test",
    "chat.takeover.read",
    "chat.history.write",
    "telemetry.write",
    "worker.run",
    "route.context.user",
    "db.read",
    "storage.read",
    "storage.write"
  ],
  "requiredNpmDeps": {
    "chat": "^4.26.0",
    "baileys": "7.0.0-rc13",
    "chat-adapter-baileys": "^2.0.2"
  },
  "requiresHostRestart": true,
  "integrationRowActions": [
    {
      "icon": "QrCode",
      "label": "QR / status",
      "bundleEntry": "frontend/qr-overlay.mjs",
      "componentExport": "WhatsappQrOverlay"
    }
  ]
}

Signature

HPIPf7bMsQYGWBPCSOmHE+rDmYxZMksXyENFXoiZCurjsinxG8IG/63MCXekdK8Nu4QJ5HhLjj9k2PKj73zDCQ==