@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
- - **Groups → List groups**: your groups, with the `uid` the other operations use.
105
- - **Groups → Send a message to a group**: **Group UID**, **Number ID** (connected, and an admin of the group if it is a
106
- QR number), **Type** `text` and **Additional Fields → Text**. It answers at once with an `action_id`; **Groups → Get
107
- a group action** says how it went, and so do the `group_action.completed` and `group_action.failed` events. The key
108
- needs `communities:send` (and `communities:read` to list).
109
- - **Funnelchat Trigger** with **Participant joined** (`group_participant.joined`) and **Participant left**
110
- (`group_participant.left`), with `communities:read`.
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
- 153 operations generated from the specification (sha256 `8228ea7369da`) 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).
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> (30)</summary>
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` @ `f5464516` (`v0.6.2`), with the snapshots of accounts `v1.5.97`, conversations `v1.19.21` and communities `v2.35.5` | The versions in production on 2026-11-05; sending by phone since conversations `v1.19.21` |
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": "8228ea7369daed0655b779ca6af381355a6c1cc13dd702ed6e9c322779bafe94",
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, as List groups returns it (for example 120363012345678901@g.us). In the API: group.",
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
  {