@pake-ai/n8n-nodes-dibales-ai
v0.1.0
Published
n8n community nodes for dibales.ai — simplified flow-builder with matcher triggers and chainable senders for chat automation across Instagram, WhatsApp, and TikTok.
Maintainers
Readme
n8n-nodes-dibales-ai
Simplified flow-builder nodes for dibales.ai chat platforms — Instagram, WhatsApp, and TikTok.
This package is the opinionated, chatbot-first companion to n8n-nodes-pake-ai. Where the base package gives you raw webhook ports and a single monolithic action node, this one gives you a matcher trigger and chainable sender nodes with automatic postback routing — wire button outputs straight to the next Send Buttons node and the multi-level menu just works.
When to use which package
| Need | Package |
|---|---|
| Raw access to every event type on its own output port | n8n-nodes-pake-ai |
| Build a chatbot flow with keyword matching and tappable button menus | n8n-nodes-dibales-ai |
| Both — they install side by side | install both |
Install
In n8n, go to Settings → Community Nodes → Install and enter the package name:
@pake-ai/n8n-nodes-dibales-aiAfter installing, search the node palette for "dibales.ai" — the triggers and action nodes for Instagram, WhatsApp, and TikTok will appear.
Requires n8n with community nodes enabled (
N8N_COMMUNITY_PACKAGES_ENABLED=true, the default on most setups).
Local install (development)
Build this package:
cd /path/to/dibales-ai-flow npm install npm run buildMake it available as a global link:
npm linkIn your n8n custom-nodes directory, link against it:
mkdir -p ~/.n8n/custom cd ~/.n8n/custom npm init -y # only the first time npm link n8n-nodes-dibales-aiStart (or restart) n8n:
n8n startIn the n8n editor, search the node palette for "dibales.ai". The trigger and the consolidated Instagram action node will appear.
Setup in a workflow
- Add dibales.ai - Instagram Trigger to a new workflow.
- Copy the test webhook URL that n8n generates.
- Open Webhooks in the dibales.ai dashboard (cs.pake.ai), create a new webhook:
- Paste the URL.
- Select the Instagram events you want to receive.
- Save. The dashboard shows a Webhook Secret once.
- (Recommended) Copy the Webhook Secret into the node's "Webhook Secret" field for HMAC-SHA256 verification.
- Add one or more Triggers in the matcher — each rule gets its own internal index and routes the matched event out through the Match port. Unmatched events leave through No Match.
- Wire Match → dibales.ai - Instagram (operation: Send Buttons or Send Text). For multi-level menus, wire each button output of a Send Buttons node to another Send Buttons node — postback routing happens automatically by walking the workflow graph.
Nodes
dibales.ai - Instagram Trigger
Single-webhook trigger with a per-rule matcher. Each entry in the Triggers collection is either:
- User Comments on Post or Reel — pick a post/reel, choose "Any Comment" or filter by include/exclude keywords (case-insensitive).
- User Sends a Direct Message — match DMs by exact text or substring against one or more keywords.
The first rule that matches wins; re-order entries to control precedence. Matched events leave on Match with a _trigger annotation ({ index, type }). Unmatched DMs and comments exit on No Match.
Postbacks and quick replies are a special case: they always pass through Match with a passthrough: true flag, because downstream Send Buttons / Send Text (with quick replies) nodes need them to decode and route the click.
Forward Events (opt-in passive event ports)
The Forward Events parameter (multi-checkbox) lets you surface three passive event types on dedicated output ports:
| Option | Event type | Use case |
|---|---|---|
| Outbound Echo | instagram.message.echo | Log outbound messages, sync to CRM |
| Reactions | instagram.message.reaction | Tag engaged users, trigger follow-ups |
| Read Receipts | instagram.message.read | Schedule unread follow-ups |
Each checked option adds an output port between Match and No Match, in declaration order (Echo → Reactions → Reads).
Port layout examples:
| Forward Events selected | Output ports |
|---|---|
| (none — default) | Match, No Match |
| Reactions | Match, Reactions, No Match |
| Echo + Read | Match, Echo, Reads, No Match |
| All three | Match, Echo, Reactions, Reads, No Match |
Routing rules (full)
message.received/comment.createdmatching a rule → Match (with_trigger: { index, type })message.received/comment.creatednot matching any rule → No Matchmessage.postback/message.quick_reply→ Match (with_trigger: { passthrough: true })message.echo/message.reaction/message.read→ dedicated port if opted in; otherwise dropped silently (HTTP 200, no workflow emission)- Everything else (
story.reply,story.mention,live_comment.created, unknown event types) → dropped silently
"Drop silently" means the node returns HTTP 200 OK to the dibales.ai backend (no retry) but does not emit on any output. No Match therefore has a single clean meaning: "the user sent content that didn't match any rule." Wire a default-reply Send Text to it without worrying about misfiring on reactions or read receipts.
dibales.ai - Instagram
Single action node for all Instagram outbound calls. Pick the Operation in the node panel:
Recipient Mode (Send Text / Send Buttons / Send Attachment)
All three Send operations expose a Recipient Mode selector with two choices:
- User ID (Direct Message) — default. Send a regular DM addressed by IGSID. Auto-extracts from upstream DM / postback / quick-reply events.
- Comment ID (Private Reply) — send the message as a "private reply" to a comment author. Backend posts to Meta with
to.comment_id; Meta delivers the DM to the comment author. Auto-extracts from upstreaminstagram.comment.createdevents.
Use Comment ID only at the entry of a comment-triggered flow. Once the user is in DM context (after the first reply), subsequent menu / follow-up nodes should switch back to User ID mode — postback events don't carry a comment ID.
Operation: Send Text
Send a plain text DM. Recipient is auto-extracted from the upstream event by default. Optionally attach up to 13 Quick Replies — each chip becomes its own output port and fires when tapped (chips disappear after one tap).
Operation: Send Buttons
Send a button template (1–3 buttons). Each Postback button gets its own output port; Web URL buttons open a link and have no port. The node runs in one of three modes per execution:
- SEND — initial event or an upstream Send Buttons just routed a click here. Delivers the template via the public API.
- ROUTE — an inbound postback's encoded payload addresses this node. Emits on the matching button output with a
_routedmarker so downstream Send Buttons can detect "this click is for me" and fall through to SEND for the next page. - FORWARD — the postback belongs to a descendant Send Buttons reachable through one of this node's button outputs. Walks the workflow graph and re-emits on the right output with
_forward: trueso intermediate nodes (Set, IF, HTTP, etc.) can skip themselves during routing passes.
The net effect: wire button output → next Send Buttons → its button output → another Send Buttons, and the multi-level menu works without any manual postback fan-out.
Operation: Send Attachment
Send a media DM by public URL. Type picks the matching API endpoint: Image (JPG/PNG/GIF), Video (MP4), Audio (MP3/M4A/OGG), or File (PDF/document).
Operation: Reply to a Comment
Post a public reply to a comment. Comment ID auto-extracts from upstream instagram.comment.created events.
Operation: Hide / Unhide a Comment
Hide a comment from public view (only the author still sees it) or restore a previously-hidden one. Reversible — use for moderating spam, abuse, or off-topic replies. Comment ID auto-extracts from the upstream event.
Operation: Delete a Comment
Permanently delete a comment. The author is NOT notified, but the action is irreversible — prefer Hide for cases where you may want to undo. Comment ID auto-extracts from the upstream event.
Operation: Get Profile
Look up an Instagram user's public profile. Pick which fields to fetch from: name, username, profile_pic, follower_count, is_user_follow_business, is_business_follow_user, is_verified_user. Defaults to name + username.
Some fields (follower count, follow flags, verified) are only populated for business / professional accounts and may return null for personal accounts.
Operation: Check If User Is Following
Convenience wrapper around Get Profile that requests only is_user_follow_business. Has two output ports for direct branching:
- Yes — Meta confirmed the user follows the business account.
- No — Meta said they don't, OR returned null (e.g. personal account where the flag isn't available).
Each item still carries { user_id, is_following, raw } so you have full context downstream. If you need to distinguish "definitely not following" from "couldn't determine", use Get Profile with is_user_follow_business and inspect the field yourself.
Credential: dibales.ai API
One credential powers every action node in this package. Configure once.
| Field | Description |
|---|---|
| Host URL | Base URL with /v1 suffix. Default: https://public-api.dibales.ai/v1. |
| API Key | Personal access token from cs.pake.ai scoped to a specific agent. |
If you also install
n8n-nodes-pake-ai, both packages declare adibales.ai APIcredential — they are independent (configure each, even though the values can be identical).
Deduplication
Webhook events may be delivered more than once. Each delivery carries a unique event_id in both the envelope and the X-Dibales-Event-Id header — use that as a dedup key downstream (e.g. upsert into a database).
Security
When a Webhook Secret is configured, the request body is verified against X-Dibales-Signature (format: sha256=<hex>, HMAC-SHA256). Mismatch → HTTP 401, workflow does not run.
Development
npm test # run Jest unit tests
npm run dev # tsc watch
npm run build # tsc + copy SVG assets