@funnelchat-hq/n8n-nodes-funnelchat 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -101,13 +101,22 @@ disconnect with **Number connected** (`device.connected`) and **Number disconnec
|
|
|
101
101
|
|
|
102
102
|
### Groups
|
|
103
103
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
104
|
+
Everything starts from your number, without the panel:
|
|
105
|
+
|
|
106
|
+
1. **Groups → List the groups a number manages** (**Number ID**): the number's WhatsApp groups, read live (with a key
|
|
107
|
+
the list is reused for one minute). Each one brings its `uid`; the ones already in your account also bring
|
|
108
|
+
`device_id`. Your account's groups are in **Groups → List groups**.
|
|
109
|
+
2. **Groups → Send a message to a group**: **Group UID** (from that list), **Number ID** (connected, and an admin of
|
|
110
|
+
the group if it is a QR number), **Type** `text` and **Additional Fields → Text**. A group that is not in your
|
|
111
|
+
account yet is imported first. It answers at once with an `action_id`; **Groups → Get a group action** says how it
|
|
112
|
+
went, and so do the `group_action.completed` and `group_action.failed` events.
|
|
113
|
+
3. **Groups → Follow a group** (**Group UID**, **Number ID**) to know who joins and who leaves without writing to it:
|
|
114
|
+
it imports the group (QR numbers only), and from then on a **Funnelchat Trigger** with **Participant joined**
|
|
115
|
+
(`group_participant.joined`) and **Participant left** (`group_participant.left`) receives them.
|
|
116
|
+
|
|
117
|
+
The key needs `communities:read` to list and receive the events, `communities:send` to send, and
|
|
118
|
+
`communities:operate` to import a group, which is what following it, or writing to one not yet in your account, does
|
|
119
|
+
(without it, `403 import_permission_required`). A number imports up to 5 groups per minute.
|
|
111
120
|
|
|
112
121
|
### Workspaces
|
|
113
122
|
|
|
@@ -230,7 +239,7 @@ The node can also be used as a tool of an n8n AI agent.
|
|
|
230
239
|
|
|
231
240
|
<!-- operations:start (generated by npm run generate) -->
|
|
232
241
|
|
|
233
|
-
|
|
242
|
+
154 operations generated from the specification (sha256 `0ffaad2b2573`) and its supplements. The ones marked ⚠ show a notice in the node (what the code requires and the specification does not say, a route closed to keys, or an irreversible operation).
|
|
234
243
|
|
|
235
244
|
<details><summary><strong>Contacts</strong> (15)</summary>
|
|
236
245
|
|
|
@@ -347,15 +356,16 @@ The node can also be used as a tool of an n8n AI agent.
|
|
|
347
356
|
|
|
348
357
|
</details>
|
|
349
358
|
|
|
350
|
-
<details><summary><strong>Groups</strong> (
|
|
359
|
+
<details><summary><strong>Groups</strong> (31)</summary>
|
|
351
360
|
|
|
352
361
|
| Operation | Route | Permission |
|
|
353
362
|
|---|---|---|
|
|
354
363
|
| List groups "return all" | `GET /api/v1/groups` | `communities:read` |
|
|
355
|
-
| List the groups a number manages "return all" | `GET /api/v1/devices/{device}/groups` | `communities:read` |
|
|
364
|
+
| List the groups a number manages ⚠ "return all" | `GET /api/v1/devices/{device}/groups` | `communities:read` |
|
|
356
365
|
| List a number's announcement groups "return all" | `GET /api/v1/devices/{device}/ad-groups` | `communities:read` |
|
|
357
366
|
| List a number's channels "return all" | `GET /api/v1/devices/{device}/channels` | `communities:read` |
|
|
358
367
|
| Get a group's current data on WhatsApp | `GET /api/v1/groups/{groupUid}/metadata` | `communities:read` |
|
|
368
|
+
| Follow a group ⚠ | `POST /api/v1/groups/{group}/import` | `communities:operate` |
|
|
359
369
|
| Get a group | `GET /api/v1/groups/{group}` | `communities:read` |
|
|
360
370
|
| List the session actions on a group "return all" | `GET /api/v1/groups/{group}/actions` | `communities:read` |
|
|
361
371
|
| List the messages sent to a group "return all" | `GET /api/v1/groups/{group}/messages` | `communities:read` |
|
|
@@ -698,7 +708,7 @@ npm run dev # starts n8n on http://localhost:5678 with the nod
|
|
|
698
708
|
|
|
699
709
|
| What | Where it comes from | Status on 2026-11-04 |
|
|
700
710
|
| ------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
701
|
-
| The full unified specification (most operations) | developers-portal `main` @ `
|
|
711
|
+
| The full unified specification (most operations) | developers-portal `main` @ `99928866` (`v0.6.3`), with the snapshots of accounts `v1.5.97`, conversations `v1.19.21` and communities `v2.35.7` | The versions in production on 2026-11-05: sending by phone (conversations `v1.19.21`) and following a group (communities `v2.35.7`) |
|
|
702
712
|
| WhatsApp forms, poll and event invitation | conversations tag `v1.18.10`, read from the code and checked again against `v1.19.7` (production); the 15-10 copy of the specification | Forms open to API keys, routed by api-edge; the portal leaves them out (its edge table is from 13-10). Poll and event are still closed to keys. `operationId`s of the forms not checked against a generated specification |
|
|
703
713
|
| A message to a group, and the other group actions | The specification (communities `v2.35.5`) | Open to API keys in production (`communities:send` to send, `communities:operate` to act on a group) |
|
|
704
714
|
| The trigger's fallback event catalog | accounts tag `v1.5.97`, extracted from the code | 59 types, 54 being emitted; every event carries `data.workspace_id` |
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.OPERATIONS = exports.RESOURCES = exports.SPEC_SOURCE = void 0;
|
|
4
4
|
exports.SPEC_SOURCE = {
|
|
5
5
|
"title": "Funnelchat API v0",
|
|
6
|
-
"sha256": "
|
|
6
|
+
"sha256": "0ffaad2b25733d28b2cc07dde8152400c3c68974b3515e71e116ce599312b0fa",
|
|
7
7
|
"description": "Unified OpenAPI specification of the Funnelchat public API, copied from the developer portal (see spec/PROVENANCE.md).",
|
|
8
8
|
"supplements": [
|
|
9
9
|
{
|
|
@@ -4790,6 +4790,7 @@ exports.OPERATIONS = [
|
|
|
4790
4790
|
"method": "GET",
|
|
4791
4791
|
"path": "/api/v1/devices/{device}/groups",
|
|
4792
4792
|
"permission": "communities:read",
|
|
4793
|
+
"notice": "Read live from WhatsApp; with an API key the list is reused for one minute per number, so a group just created may take up to a minute to show. A group already in your account comes with its device_id; to follow one that is not, use Follow a group.",
|
|
4793
4794
|
"source": "spec",
|
|
4794
4795
|
"list": {
|
|
4795
4796
|
"pagination": "page",
|
|
@@ -4950,6 +4951,43 @@ exports.OPERATIONS = [
|
|
|
4950
4951
|
}
|
|
4951
4952
|
]
|
|
4952
4953
|
},
|
|
4954
|
+
{
|
|
4955
|
+
"resource": "group",
|
|
4956
|
+
"value": "v2.apiGroupImport",
|
|
4957
|
+
"name": "Follow a group",
|
|
4958
|
+
"description": "Starts following a WhatsApp group of your number without writing to it: imports it into your account, and from then on you get who joins and who leaves. If it is already in your account, it is not imported again. Permission: communities:operate.",
|
|
4959
|
+
"method": "POST",
|
|
4960
|
+
"path": "/api/v1/groups/{group}/import",
|
|
4961
|
+
"permission": "communities:operate",
|
|
4962
|
+
"notice": "QR numbers only (an official number answers 422 provider_unsupported). It answers 201 when it imports the group and 200 when it was already in the account, with is_admin, read from WhatsApp in the same call. Needs communities:operate (403 import_permission_required). Up to 5 per number per minute (429 import_rate_limited, with Retry-After); a group of another number answers 404 group_not_found, one in another workspace of the account cannot be imported here. From then on the group sends the group_participant.joined and group_participant.left events.",
|
|
4963
|
+
"source": "spec",
|
|
4964
|
+
"body": {
|
|
4965
|
+
"required": true,
|
|
4966
|
+
"root": "object"
|
|
4967
|
+
},
|
|
4968
|
+
"params": [
|
|
4969
|
+
{
|
|
4970
|
+
"name": "group",
|
|
4971
|
+
"apiName": "group",
|
|
4972
|
+
"location": "path",
|
|
4973
|
+
"required": true,
|
|
4974
|
+
"kind": "string",
|
|
4975
|
+
"displayName": "Group ID",
|
|
4976
|
+
"description": "The group's ID on WhatsApp, as List the groups a number manages returns it. In the API: group.",
|
|
4977
|
+
"valueType": "string"
|
|
4978
|
+
},
|
|
4979
|
+
{
|
|
4980
|
+
"name": "device_id",
|
|
4981
|
+
"apiName": "device_id",
|
|
4982
|
+
"location": "body",
|
|
4983
|
+
"required": true,
|
|
4984
|
+
"kind": "number",
|
|
4985
|
+
"displayName": "Number ID",
|
|
4986
|
+
"description": "The QR number the group belongs to. In the API: device_id.",
|
|
4987
|
+
"valueType": "integer"
|
|
4988
|
+
}
|
|
4989
|
+
]
|
|
4990
|
+
},
|
|
4953
4991
|
{
|
|
4954
4992
|
"resource": "group",
|
|
4955
4993
|
"value": "group.show",
|
|
@@ -5188,7 +5226,7 @@ exports.OPERATIONS = [
|
|
|
5188
5226
|
"method": "POST",
|
|
5189
5227
|
"path": "/api/v1/groups/{group}/messages",
|
|
5190
5228
|
"permission": "communities:send",
|
|
5191
|
-
"notice": "Asynchronous: it answers 202 with action_id and status queued. Read the outcome with \"Get a group action\" (result.message.uid is the message's ID in WhatsApp) or with the group_action.completed and group_action.failed events. With a QR number it goes out at the pace of low-speed scheduled messages; with an official number the 24-hour window and the number's quality are checked first.",
|
|
5229
|
+
"notice": "Asynchronous: it answers 202 with action_id and status queued. Read the outcome with \"Get a group action\" (result.message.uid is the message's ID in WhatsApp) or with the group_action.completed and group_action.failed events. With a QR number it goes out at the pace of low-speed scheduled messages; with an official number the 24-hour window and the number's quality are checked first. A group that is not in your account yet (one of the number's live list) is imported first, as Follow a group does: that also needs communities:operate (403 import_permission_required) and counts in its 5 per minute; if the number is not an admin of the group nothing is imported and it answers 422 device_not_group_admin.",
|
|
5192
5230
|
"source": "spec",
|
|
5193
5231
|
"body": {
|
|
5194
5232
|
"required": true,
|
|
@@ -5202,7 +5240,7 @@ exports.OPERATIONS = [
|
|
|
5202
5240
|
"required": true,
|
|
5203
5241
|
"kind": "string",
|
|
5204
5242
|
"displayName": "Group UID",
|
|
5205
|
-
"description": "The group's uid
|
|
5243
|
+
"description": "The group's uid: one of your groups (List groups) or of the number's live list (List the groups a number manages), which is imported first. In the API: group.",
|
|
5206
5244
|
"valueType": "string"
|
|
5207
5245
|
},
|
|
5208
5246
|
{
|