@linqapp/sdk 0.24.2 → 0.26.0

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.
Files changed (98) hide show
  1. package/CHANGELOG.md +2 -506
  2. package/client.d.mts +165 -87
  3. package/client.d.mts.map +1 -1
  4. package/client.d.ts +165 -87
  5. package/client.d.ts.map +1 -1
  6. package/client.js +162 -84
  7. package/client.js.map +1 -1
  8. package/client.mjs +162 -84
  9. package/client.mjs.map +1 -1
  10. package/package.json +1 -1
  11. package/resources/chats/chats.d.mts +67 -63
  12. package/resources/chats/chats.d.mts.map +1 -1
  13. package/resources/chats/chats.d.ts +67 -63
  14. package/resources/chats/chats.d.ts.map +1 -1
  15. package/resources/chats/chats.js +63 -59
  16. package/resources/chats/chats.js.map +1 -1
  17. package/resources/chats/chats.mjs +63 -59
  18. package/resources/chats/chats.mjs.map +1 -1
  19. package/resources/chats/index.d.mts +3 -2
  20. package/resources/chats/index.d.mts.map +1 -1
  21. package/resources/chats/index.d.ts +3 -2
  22. package/resources/chats/index.d.ts.map +1 -1
  23. package/resources/chats/index.js +3 -1
  24. package/resources/chats/index.js.map +1 -1
  25. package/resources/chats/index.mjs +1 -0
  26. package/resources/chats/index.mjs.map +1 -1
  27. package/resources/chats/location.d.mts +107 -0
  28. package/resources/chats/location.d.mts.map +1 -0
  29. package/resources/chats/location.d.ts +107 -0
  30. package/resources/chats/location.d.ts.map +1 -0
  31. package/resources/chats/location.js +68 -0
  32. package/resources/chats/location.js.map +1 -0
  33. package/resources/chats/location.mjs +64 -0
  34. package/resources/chats/location.mjs.map +1 -0
  35. package/resources/chats/messages.d.mts +17 -17
  36. package/resources/chats/messages.d.mts.map +1 -1
  37. package/resources/chats/messages.d.ts +17 -17
  38. package/resources/chats/messages.d.ts.map +1 -1
  39. package/resources/chats/messages.js +16 -16
  40. package/resources/chats/messages.js.map +1 -1
  41. package/resources/chats/messages.mjs +16 -16
  42. package/resources/chats/messages.mjs.map +1 -1
  43. package/resources/contact-card.d.mts +18 -18
  44. package/resources/contact-card.d.mts.map +1 -1
  45. package/resources/contact-card.d.ts +18 -18
  46. package/resources/contact-card.d.ts.map +1 -1
  47. package/resources/contact-card.js +12 -12
  48. package/resources/contact-card.js.map +1 -1
  49. package/resources/contact-card.mjs +12 -12
  50. package/resources/contact-card.mjs.map +1 -1
  51. package/resources/index.d.mts +3 -3
  52. package/resources/index.d.mts.map +1 -1
  53. package/resources/index.d.ts +3 -3
  54. package/resources/index.d.ts.map +1 -1
  55. package/resources/messages.d.mts +34 -34
  56. package/resources/messages.d.mts.map +1 -1
  57. package/resources/messages.d.ts +34 -34
  58. package/resources/messages.d.ts.map +1 -1
  59. package/resources/messages.js +29 -29
  60. package/resources/messages.js.map +1 -1
  61. package/resources/messages.mjs +29 -29
  62. package/resources/messages.mjs.map +1 -1
  63. package/resources/webhook-events.d.mts +83 -44
  64. package/resources/webhook-events.d.mts.map +1 -1
  65. package/resources/webhook-events.d.ts +83 -44
  66. package/resources/webhook-events.d.ts.map +1 -1
  67. package/resources/webhook-events.js +81 -42
  68. package/resources/webhook-events.js.map +1 -1
  69. package/resources/webhook-events.mjs +81 -42
  70. package/resources/webhook-events.mjs.map +1 -1
  71. package/resources/webhook-subscriptions.d.mts +100 -55
  72. package/resources/webhook-subscriptions.d.mts.map +1 -1
  73. package/resources/webhook-subscriptions.d.ts +100 -55
  74. package/resources/webhook-subscriptions.d.ts.map +1 -1
  75. package/resources/webhook-subscriptions.js +103 -58
  76. package/resources/webhook-subscriptions.js.map +1 -1
  77. package/resources/webhook-subscriptions.mjs +103 -58
  78. package/resources/webhook-subscriptions.mjs.map +1 -1
  79. package/resources/webhooks.d.mts +4 -4
  80. package/resources/webhooks.d.mts.map +1 -1
  81. package/resources/webhooks.d.ts +4 -4
  82. package/resources/webhooks.d.ts.map +1 -1
  83. package/src/client.ts +166 -88
  84. package/src/resources/chats/chats.ts +88 -78
  85. package/src/resources/chats/index.ts +3 -2
  86. package/src/resources/chats/location.ts +138 -0
  87. package/src/resources/chats/messages.ts +28 -28
  88. package/src/resources/contact-card.ts +25 -25
  89. package/src/resources/index.ts +4 -4
  90. package/src/resources/messages.ts +46 -46
  91. package/src/resources/webhook-events.ts +85 -44
  92. package/src/resources/webhook-subscriptions.ts +103 -58
  93. package/src/resources/webhooks.ts +6 -4
  94. package/src/version.ts +1 -1
  95. package/version.d.mts +1 -1
  96. package/version.d.ts +1 -1
  97. package/version.js +1 -1
  98. package/version.mjs +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/resources/messages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/resources/messages.ts"],"names":[],"mappings":"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"}
@@ -28,35 +28,42 @@ const path_1 = require("../internal/utils/path.js");
28
28
  */
29
29
  class Messages extends resource_1.APIResource {
30
30
  /**
31
- * Retrieve a specific message by its ID. This endpoint returns the full message
32
- * details including text, attachments, reactions, and metadata.
31
+ * Retrieve all messages in a conversation thread. Given any message ID in the
32
+ * thread, returns the originator message and all replies in chronological order.
33
+ *
34
+ * If the message is not part of a thread, returns just that single message.
35
+ *
36
+ * Supports pagination and configurable ordering.
33
37
  *
34
38
  * @example
35
39
  * ```ts
36
- * const message = await client.messages.retrieve(
40
+ * // Automatically fetches more pages as needed.
41
+ * for await (const message of client.messages.listMessagesThread(
37
42
  * '69a37c7d-af4f-4b5e-af42-e28e98ce873a',
38
- * );
43
+ * )) {
44
+ * // ...
45
+ * }
39
46
  * ```
40
47
  */
41
- retrieve(messageID, options) {
42
- return this._client.get((0, path_1.path) `/v3/messages/${messageID}`, options);
48
+ listMessagesThread(messageID, query = {}, options) {
49
+ return this._client.getAPIList((0, path_1.path) `/v3/messages/${messageID}/thread`, (pagination_1.ListMessagesPagination), {
50
+ query,
51
+ ...options,
52
+ });
43
53
  }
44
54
  /**
45
- * Edit the text content of a specific part of a previously sent message.
46
- *
47
- * **Note:** A message can be edited up to 5 times, and only within 15 minutes of
48
- * when it was originally sent.
55
+ * Retrieve a specific message by its ID. This endpoint returns the full message
56
+ * details including text, attachments, reactions, and metadata.
49
57
  *
50
58
  * @example
51
59
  * ```ts
52
- * const message = await client.messages.update(
60
+ * const message = await client.messages.retrieve(
53
61
  * '69a37c7d-af4f-4b5e-af42-e28e98ce873a',
54
- * { text: 'This is the edited message content' },
55
62
  * );
56
63
  * ```
57
64
  */
58
- update(messageID, body, options) {
59
- return this._client.patch((0, path_1.path) `/v3/messages/${messageID}`, { body, ...options });
65
+ retrieve(messageID, options) {
66
+ return this._client.get((0, path_1.path) `/v3/messages/${messageID}`, options);
60
67
  }
61
68
  /**
62
69
  * Deletes a message from the Linq API only. This does NOT unsend or remove the
@@ -101,28 +108,21 @@ class Messages extends resource_1.APIResource {
101
108
  return this._client.post((0, path_1.path) `/v3/messages/${messageID}/reactions`, { body, ...options });
102
109
  }
103
110
  /**
104
- * Retrieve all messages in a conversation thread. Given any message ID in the
105
- * thread, returns the originator message and all replies in chronological order.
106
- *
107
- * If the message is not part of a thread, returns just that single message.
111
+ * Edit the text content of a specific part of a previously sent message.
108
112
  *
109
- * Supports pagination and configurable ordering.
113
+ * **Note:** A message can be edited up to 5 times, and only within 15 minutes of
114
+ * when it was originally sent.
110
115
  *
111
116
  * @example
112
117
  * ```ts
113
- * // Automatically fetches more pages as needed.
114
- * for await (const message of client.messages.listMessagesThread(
118
+ * const message = await client.messages.update(
115
119
  * '69a37c7d-af4f-4b5e-af42-e28e98ce873a',
116
- * )) {
117
- * // ...
118
- * }
120
+ * { text: 'This is the edited message content' },
121
+ * );
119
122
  * ```
120
123
  */
121
- listMessagesThread(messageID, query = {}, options) {
122
- return this._client.getAPIList((0, path_1.path) `/v3/messages/${messageID}/thread`, (pagination_1.ListMessagesPagination), {
123
- query,
124
- ...options,
125
- });
124
+ update(messageID, body, options) {
125
+ return this._client.patch((0, path_1.path) `/v3/messages/${messageID}`, { body, ...options });
126
126
  }
127
127
  }
128
128
  exports.Messages = Messages;
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/resources/messages.ts"],"names":[],"mappings":";AAAA,sFAAsF;;;AAEtF,kDAA+C;AAG/C,sDAA4G;AAC5G,oDAAmD;AAEnD,oDAA8C;AAE9C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAa,QAAS,SAAQ,sBAAW;IACvC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,SAAiB,EAAE,OAAwB;QAClD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAA,WAAI,EAAA,gBAAgB,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,SAAiB,EAAE,IAAyB,EAAE,OAAwB;QAC3E,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAA,WAAI,EAAA,gBAAgB,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACnF,CAAC;IAED;;;;;;;;;;OAUG;IACH,MAAM,CAAC,SAAiB,EAAE,OAAwB;QAChD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAA,WAAI,EAAA,gBAAgB,SAAS,EAAE,EAAE;YAC1D,GAAG,OAAO;YACV,OAAO,EAAE,IAAA,sBAAY,EAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SAC7D,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,WAAW,CACT,SAAiB,EACjB,IAA8B,EAC9B,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAA,WAAI,EAAA,gBAAgB,SAAS,YAAY,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,kBAAkB,CAChB,SAAiB,EACjB,QAA4D,EAAE,EAC9D,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAA,WAAI,EAAA,gBAAgB,SAAS,SAAS,EAAE,CAAA,mCAA+B,CAAA,EAAE;YACtG,KAAK;YACL,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;CACF;AA9GD,4BA8GC"}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/resources/messages.ts"],"names":[],"mappings":";AAAA,sFAAsF;;;AAEtF,kDAA+C;AAG/C,sDAA4G;AAC5G,oDAAmD;AAEnD,oDAA8C;AAE9C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAa,QAAS,SAAQ,sBAAW;IACvC;;;;;;;;;;;;;;;;;OAiBG;IACH,kBAAkB,CAChB,SAAiB,EACjB,QAA4D,EAAE,EAC9D,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAA,WAAI,EAAA,gBAAgB,SAAS,SAAS,EAAE,CAAA,mCAA+B,CAAA,EAAE;YACtG,KAAK;YACL,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,SAAiB,EAAE,OAAwB;QAClD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAA,WAAI,EAAA,gBAAgB,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;IAED;;;;;;;;;;OAUG;IACH,MAAM,CAAC,SAAiB,EAAE,OAAwB;QAChD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAA,WAAI,EAAA,gBAAgB,SAAS,EAAE,EAAE;YAC1D,GAAG,OAAO;YACV,OAAO,EAAE,IAAA,sBAAY,EAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SAC7D,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,WAAW,CACT,SAAiB,EACjB,IAA8B,EAC9B,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAA,WAAI,EAAA,gBAAgB,SAAS,YAAY,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,SAAiB,EAAE,IAAyB,EAAE,OAAwB;QAC3E,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAA,WAAI,EAAA,gBAAgB,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACnF,CAAC;CACF;AA9GD,4BA8GC"}
@@ -25,35 +25,42 @@ import { path } from "../internal/utils/path.mjs";
25
25
  */
26
26
  export class Messages extends APIResource {
27
27
  /**
28
- * Retrieve a specific message by its ID. This endpoint returns the full message
29
- * details including text, attachments, reactions, and metadata.
28
+ * Retrieve all messages in a conversation thread. Given any message ID in the
29
+ * thread, returns the originator message and all replies in chronological order.
30
+ *
31
+ * If the message is not part of a thread, returns just that single message.
32
+ *
33
+ * Supports pagination and configurable ordering.
30
34
  *
31
35
  * @example
32
36
  * ```ts
33
- * const message = await client.messages.retrieve(
37
+ * // Automatically fetches more pages as needed.
38
+ * for await (const message of client.messages.listMessagesThread(
34
39
  * '69a37c7d-af4f-4b5e-af42-e28e98ce873a',
35
- * );
40
+ * )) {
41
+ * // ...
42
+ * }
36
43
  * ```
37
44
  */
38
- retrieve(messageID, options) {
39
- return this._client.get(path `/v3/messages/${messageID}`, options);
45
+ listMessagesThread(messageID, query = {}, options) {
46
+ return this._client.getAPIList(path `/v3/messages/${messageID}/thread`, (ListMessagesPagination), {
47
+ query,
48
+ ...options,
49
+ });
40
50
  }
41
51
  /**
42
- * Edit the text content of a specific part of a previously sent message.
43
- *
44
- * **Note:** A message can be edited up to 5 times, and only within 15 minutes of
45
- * when it was originally sent.
52
+ * Retrieve a specific message by its ID. This endpoint returns the full message
53
+ * details including text, attachments, reactions, and metadata.
46
54
  *
47
55
  * @example
48
56
  * ```ts
49
- * const message = await client.messages.update(
57
+ * const message = await client.messages.retrieve(
50
58
  * '69a37c7d-af4f-4b5e-af42-e28e98ce873a',
51
- * { text: 'This is the edited message content' },
52
59
  * );
53
60
  * ```
54
61
  */
55
- update(messageID, body, options) {
56
- return this._client.patch(path `/v3/messages/${messageID}`, { body, ...options });
62
+ retrieve(messageID, options) {
63
+ return this._client.get(path `/v3/messages/${messageID}`, options);
57
64
  }
58
65
  /**
59
66
  * Deletes a message from the Linq API only. This does NOT unsend or remove the
@@ -98,28 +105,21 @@ export class Messages extends APIResource {
98
105
  return this._client.post(path `/v3/messages/${messageID}/reactions`, { body, ...options });
99
106
  }
100
107
  /**
101
- * Retrieve all messages in a conversation thread. Given any message ID in the
102
- * thread, returns the originator message and all replies in chronological order.
103
- *
104
- * If the message is not part of a thread, returns just that single message.
108
+ * Edit the text content of a specific part of a previously sent message.
105
109
  *
106
- * Supports pagination and configurable ordering.
110
+ * **Note:** A message can be edited up to 5 times, and only within 15 minutes of
111
+ * when it was originally sent.
107
112
  *
108
113
  * @example
109
114
  * ```ts
110
- * // Automatically fetches more pages as needed.
111
- * for await (const message of client.messages.listMessagesThread(
115
+ * const message = await client.messages.update(
112
116
  * '69a37c7d-af4f-4b5e-af42-e28e98ce873a',
113
- * )) {
114
- * // ...
115
- * }
117
+ * { text: 'This is the edited message content' },
118
+ * );
116
119
  * ```
117
120
  */
118
- listMessagesThread(messageID, query = {}, options) {
119
- return this._client.getAPIList(path `/v3/messages/${messageID}/thread`, (ListMessagesPagination), {
120
- query,
121
- ...options,
122
- });
121
+ update(messageID, body, options) {
122
+ return this._client.patch(path `/v3/messages/${messageID}`, { body, ...options });
123
123
  }
124
124
  }
125
125
  //# sourceMappingURL=messages.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"messages.mjs","sourceRoot":"","sources":["../src/resources/messages.ts"],"names":[],"mappings":"AAAA,sFAAsF;AAEtF,OAAO,EAAE,WAAW,EAAE,6BAAyB;AAG/C,OAAO,EAAE,sBAAsB,EAAkD,+BAA2B;AAC5G,OAAO,EAAE,YAAY,EAAE,gCAA4B;AAEnD,OAAO,EAAE,IAAI,EAAE,mCAA+B;AAE9C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,QAAS,SAAQ,WAAW;IACvC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,SAAiB,EAAE,OAAwB;QAClD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAA,gBAAgB,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,SAAiB,EAAE,IAAyB,EAAE,OAAwB;QAC3E,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAA,gBAAgB,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACnF,CAAC;IAED;;;;;;;;;;OAUG;IACH,MAAM,CAAC,SAAiB,EAAE,OAAwB;QAChD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAA,gBAAgB,SAAS,EAAE,EAAE;YAC1D,GAAG,OAAO;YACV,OAAO,EAAE,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SAC7D,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,WAAW,CACT,SAAiB,EACjB,IAA8B,EAC9B,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAA,gBAAgB,SAAS,YAAY,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,kBAAkB,CAChB,SAAiB,EACjB,QAA4D,EAAE,EAC9D,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAA,gBAAgB,SAAS,SAAS,EAAE,CAAA,sBAA+B,CAAA,EAAE;YACtG,KAAK;YACL,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"messages.mjs","sourceRoot":"","sources":["../src/resources/messages.ts"],"names":[],"mappings":"AAAA,sFAAsF;AAEtF,OAAO,EAAE,WAAW,EAAE,6BAAyB;AAG/C,OAAO,EAAE,sBAAsB,EAAkD,+BAA2B;AAC5G,OAAO,EAAE,YAAY,EAAE,gCAA4B;AAEnD,OAAO,EAAE,IAAI,EAAE,mCAA+B;AAE9C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,QAAS,SAAQ,WAAW;IACvC;;;;;;;;;;;;;;;;;OAiBG;IACH,kBAAkB,CAChB,SAAiB,EACjB,QAA4D,EAAE,EAC9D,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAA,gBAAgB,SAAS,SAAS,EAAE,CAAA,sBAA+B,CAAA,EAAE;YACtG,KAAK;YACL,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,SAAiB,EAAE,OAAwB;QAClD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAA,gBAAgB,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;IAED;;;;;;;;;;OAUG;IACH,MAAM,CAAC,SAAiB,EAAE,OAAwB;QAChD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAA,gBAAgB,SAAS,EAAE,EAAE;YAC1D,GAAG,OAAO;YACV,OAAO,EAAE,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SAC7D,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,WAAW,CACT,SAAiB,EACjB,IAA8B,EAC9B,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAA,gBAAgB,SAAS,YAAY,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,SAAiB,EAAE,IAAyB,EAAE,OAAwB;QAC3E,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAA,gBAAgB,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACnF,CAAC;CACF"}
@@ -14,55 +14,82 @@ import { RequestOptions } from "../internal/request-options.mjs";
14
14
  *
15
15
  * ## Webhook Headers
16
16
  *
17
- * Each webhook request includes the following headers:
17
+ * All webhook requests include two sets of headers. **If you have an existing integration
18
+ * using the `X-Webhook-*` headers, nothing changes** — those headers are still sent on
19
+ * every delivery and work exactly as before. The new `webhook-*` headers follow the
20
+ * [Standard Webhooks](https://github.com/standard-webhooks/standard-webhooks) specification.
21
+ * You can safely ignore them if your current verification code works and you don't want to use this convention.
22
+ *
23
+ * ### Standard Webhooks Headers (Recommended)
24
+ *
25
+ * Used by [our SDK](https://github.com/linq-team/linq-node) and any [Standard Webhooks library](https://github.com/standard-webhooks/standard-webhooks).
18
26
  *
19
27
  * | Header | Description |
20
28
  * |--------|-------------|
21
- * | `X-Webhook-Event` | The event type (e.g., `message.sent`, `message.received`) |
22
- * | `X-Webhook-Subscription-ID` | Your webhook subscription ID |
23
- * | `X-Webhook-Timestamp` | Unix timestamp (seconds) when the webhook was sent |
24
- * | `X-Webhook-Signature` | HMAC-SHA256 signature for verification |
29
+ * | `webhook-id` | Unique event identifier (use as idempotency key) |
30
+ * | `webhook-timestamp` | Unix timestamp (seconds) when the webhook was sent |
31
+ * | `webhook-signature` | Standard Webhooks signature (`v1,{base64}` format) |
25
32
  *
26
- * ## Verifying Webhook Signatures
33
+ * ### Legacy Headers (Deprecated)
34
+ *
35
+ * Still sent on every delivery for backwards compatibility. Existing verification code
36
+ * using these headers continues to work — no changes required.
27
37
  *
28
- * All webhooks are signed using HMAC-SHA256. You should always verify the signature
29
- * to ensure the webhook originated from Linq and hasn't been tampered with.
38
+ * | Header | Description |
39
+ * |--------|-------------|
40
+ * | `X-Webhook-Event` | *(deprecated)* Event type (e.g., `message.sent`) |
41
+ * | `X-Webhook-Subscription-ID` | *(deprecated)* Webhook subscription ID |
42
+ * | `X-Webhook-Timestamp` | *(deprecated)* Unix timestamp (seconds) |
43
+ * | `X-Webhook-Signature` | *(deprecated)* HMAC-SHA256 signature (hex-encoded) |
30
44
  *
31
- * **Signature Construction:**
45
+ * ## Signing Secrets
32
46
  *
33
- * The signature is computed over a concatenation of the timestamp and payload:
47
+ * Signing secrets use the Standard Webhooks format: a `whsec_` prefix followed
48
+ * by base64-encoded random bytes (e.g., `whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw7Jxx2Oll+OE=`).
34
49
  *
35
- * ```
36
- * {timestamp}.{payload}
37
- * ```
50
+ * Strip the `whsec_` prefix and base64-decode the remainder to get the raw key bytes.
38
51
  *
39
- * Where:
40
- * - `timestamp` is the value from the `X-Webhook-Timestamp` header
41
- * - `payload` is the raw JSON request body (exact bytes, not re-serialized)
52
+ * ## Verifying Webhook Signatures
53
+ *
54
+ * Webhooks are signed following the [Standard Webhooks specification](https://github.com/standard-webhooks/standard-webhooks).
55
+ * You can use any [Standard Webhooks library](https://github.com/standard-webhooks/standard-webhooks) to verify
56
+ * signatures, or implement verification manually:
57
+ *
58
+ * **Signed content:** `{webhook-id}.{webhook-timestamp}.{body}`
42
59
  *
43
60
  * **Verification Steps:**
44
61
  *
45
- * 1. Extract the `X-Webhook-Timestamp` and `X-Webhook-Signature` headers
46
- * 2. Get the raw request body bytes (do not parse and re-serialize)
47
- * 3. Concatenate: `"{timestamp}.{payload}"`
48
- * 4. Compute HMAC-SHA256 using your signing secret as the key
49
- * 5. Hex-encode the result and compare with `X-Webhook-Signature`
50
- * 6. Use constant-time comparison to prevent timing attacks
62
+ * 1. Extract the `webhook-id`, `webhook-timestamp`, and `webhook-signature` headers
63
+ * 2. Reject if the timestamp is more than 5 minutes old (replay protection)
64
+ * 3. Get the raw request body bytes (do not parse and re-serialize)
65
+ * 4. Construct signed content: `"{webhook-id}.{webhook-timestamp}.{body}"`
66
+ * 5. Strip the `whsec_` prefix from your secret and base64-decode to get key bytes
67
+ * 6. Compute HMAC-SHA256 using the key bytes over the signed content
68
+ * 7. Base64-encode the result and compare with the value after `v1,` in `webhook-signature`
69
+ * 8. Use constant-time comparison to prevent timing attacks
51
70
  *
52
71
  * **Example (Python):**
53
72
  *
54
73
  * ```python
55
- * import hmac
56
- * import hashlib
57
- *
58
- * def verify_webhook(signing_secret, payload, timestamp, signature):
59
- * message = f"{timestamp}.{payload.decode('utf-8')}"
60
- * expected = hmac.new(
61
- * signing_secret.encode('utf-8'),
62
- * message.encode('utf-8'),
63
- * hashlib.sha256
64
- * ).hexdigest()
65
- * return hmac.compare_digest(expected, signature)
74
+ * import base64, hmac, hashlib
75
+ *
76
+ * def verify_webhook(secret, body, headers):
77
+ * msg_id = headers['webhook-id']
78
+ * timestamp = headers['webhook-timestamp']
79
+ * signature = headers['webhook-signature']
80
+ *
81
+ * secret_str = secret.removeprefix('whsec_')
82
+ * key = base64.b64decode(secret_str)
83
+ *
84
+ * signed_content = f"{msg_id}.{timestamp}.{body}"
85
+ * expected = base64.b64encode(
86
+ * hmac.new(key, signed_content.encode(), hashlib.sha256).digest()
87
+ * ).decode()
88
+ *
89
+ * for sig in signature.split(' '):
90
+ * if sig.startswith('v1,') and hmac.compare_digest(expected, sig[3:]):
91
+ * return True
92
+ * return False
66
93
  * ```
67
94
  *
68
95
  * **Example (Node.js):**
@@ -70,16 +97,28 @@ import { RequestOptions } from "../internal/request-options.mjs";
70
97
  * ```javascript
71
98
  * const crypto = require('crypto');
72
99
  *
73
- * function verifyWebhook(signingSecret, payload, timestamp, signature) {
74
- * const message = `${timestamp}.${payload}`;
100
+ * function verifyWebhook(secret, rawBody, headers) {
101
+ * const msgId = headers['webhook-id'];
102
+ * const timestamp = headers['webhook-timestamp'];
103
+ * const signature = headers['webhook-signature'];
104
+ *
105
+ * const secretStr = secret.startsWith('whsec_') ? secret.slice(6) : secret;
106
+ * const keyBytes = Buffer.from(secretStr, 'base64');
107
+ * const signedContent = `${msgId}.${timestamp}.${rawBody}`;
75
108
  * const expected = crypto
76
- * .createHmac('sha256', signingSecret)
77
- * .update(message)
78
- * .digest('hex');
79
- * return crypto.timingSafeEqual(
80
- * Buffer.from(expected),
81
- * Buffer.from(signature)
82
- * );
109
+ * .createHmac('sha256', keyBytes)
110
+ * .update(signedContent)
111
+ * .digest('base64');
112
+ *
113
+ * return signature.split(' ').some(sig => {
114
+ * if (!sig.startsWith('v1,')) return false;
115
+ * try {
116
+ * return crypto.timingSafeEqual(
117
+ * Buffer.from(expected, 'base64'),
118
+ * Buffer.from(sig.slice(3), 'base64')
119
+ * );
120
+ * } catch { return false; }
121
+ * });
83
122
  * }
84
123
  * ```
85
124
  *
@@ -105,12 +144,12 @@ export declare class WebhookEvents extends APIResource {
105
144
  * `webhook_version: "2026-02-03"`. Subscribing to this event on a v2025
106
145
  * subscription will not produce any deliveries.
107
146
  */
108
- export type WebhookEventType = 'message.sent' | 'message.received' | 'message.read' | 'message.delivered' | 'message.failed' | 'message.edited' | 'reaction.added' | 'reaction.removed' | 'participant.added' | 'participant.removed' | 'chat.created' | 'chat.group_name_updated' | 'chat.group_icon_updated' | 'chat.group_name_update_failed' | 'chat.group_icon_update_failed' | 'chat.typing_indicator.started' | 'chat.typing_indicator.stopped' | 'phone_number.status_updated' | 'call.initiated' | 'call.ringing' | 'call.answered' | 'call.ended' | 'call.failed' | 'call.declined' | 'call.no_answer';
147
+ export type WebhookEventType = 'message.sent' | 'message.received' | 'message.read' | 'message.delivered' | 'message.failed' | 'message.edited' | 'reaction.added' | 'reaction.removed' | 'participant.added' | 'participant.removed' | 'chat.created' | 'chat.group_name_updated' | 'chat.group_icon_updated' | 'chat.group_name_update_failed' | 'chat.group_icon_update_failed' | 'chat.typing_indicator.started' | 'chat.typing_indicator.stopped' | 'phone_number.status_updated' | 'call.initiated' | 'call.ringing' | 'call.answered' | 'call.ended' | 'call.failed' | 'call.declined' | 'call.no_answer' | 'location.sharing.started' | 'location.sharing.stopped';
109
148
  export interface WebhookEventListResponse {
110
149
  /**
111
150
  * URL to the webhook events documentation
112
151
  */
113
- doc_url: 'https://apidocs.linqapp.com/documentation/webhook-events';
152
+ doc_url: 'https://docs.linqapp.com/guides/webhooks/events';
114
153
  /**
115
154
  * List of all available webhook event types
116
155
  */
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-events.d.mts","sourceRoot":"","sources":["../src/resources/webhook-events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,6BAAyB;AAC/C,OAAO,EAAE,UAAU,EAAE,gCAA4B;AACjD,OAAO,EAAE,cAAc,EAAE,wCAAoC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwFG;AACH,qBAAa,aAAc,SAAQ,WAAW;IAC5C;;;;OAIG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,UAAU,CAAC,wBAAwB,CAAC;CAGrE;AAED;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GACxB,cAAc,GACd,kBAAkB,GAClB,cAAc,GACd,mBAAmB,GACnB,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,GAChB,kBAAkB,GAClB,mBAAmB,GACnB,qBAAqB,GACrB,cAAc,GACd,yBAAyB,GACzB,yBAAyB,GACzB,+BAA+B,GAC/B,+BAA+B,GAC/B,+BAA+B,GAC/B,+BAA+B,GAC/B,6BAA6B,GAC7B,gBAAgB,GAChB,cAAc,GACd,eAAe,GACf,YAAY,GACZ,aAAa,GACb,eAAe,GACf,gBAAgB,CAAC;AAErB,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,OAAO,EAAE,0DAA0D,CAAC;IAEpE;;OAEG;IACH,MAAM,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;CACjC;AAED,MAAM,CAAC,OAAO,WAAW,aAAa,CAAC;IACrC,OAAO,EACL,KAAK,gBAAgB,IAAI,gBAAgB,EACzC,KAAK,wBAAwB,IAAI,wBAAwB,GAC1D,CAAC;CACH"}
1
+ {"version":3,"file":"webhook-events.d.mts","sourceRoot":"","sources":["../src/resources/webhook-events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,6BAAyB;AAC/C,OAAO,EAAE,UAAU,EAAE,gCAA4B;AACjD,OAAO,EAAE,cAAc,EAAE,wCAAoC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+HG;AACH,qBAAa,aAAc,SAAQ,WAAW;IAC5C;;;;OAIG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,UAAU,CAAC,wBAAwB,CAAC;CAGrE;AAED;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GACxB,cAAc,GACd,kBAAkB,GAClB,cAAc,GACd,mBAAmB,GACnB,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,GAChB,kBAAkB,GAClB,mBAAmB,GACnB,qBAAqB,GACrB,cAAc,GACd,yBAAyB,GACzB,yBAAyB,GACzB,+BAA+B,GAC/B,+BAA+B,GAC/B,+BAA+B,GAC/B,+BAA+B,GAC/B,6BAA6B,GAC7B,gBAAgB,GAChB,cAAc,GACd,eAAe,GACf,YAAY,GACZ,aAAa,GACb,eAAe,GACf,gBAAgB,GAChB,0BAA0B,GAC1B,0BAA0B,CAAC;AAE/B,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,OAAO,EAAE,iDAAiD,CAAC;IAE3D;;OAEG;IACH,MAAM,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;CACjC;AAED,MAAM,CAAC,OAAO,WAAW,aAAa,CAAC;IACrC,OAAO,EACL,KAAK,gBAAgB,IAAI,gBAAgB,EACzC,KAAK,wBAAwB,IAAI,wBAAwB,GAC1D,CAAC;CACH"}
@@ -14,55 +14,82 @@ import { RequestOptions } from "../internal/request-options.js";
14
14
  *
15
15
  * ## Webhook Headers
16
16
  *
17
- * Each webhook request includes the following headers:
17
+ * All webhook requests include two sets of headers. **If you have an existing integration
18
+ * using the `X-Webhook-*` headers, nothing changes** — those headers are still sent on
19
+ * every delivery and work exactly as before. The new `webhook-*` headers follow the
20
+ * [Standard Webhooks](https://github.com/standard-webhooks/standard-webhooks) specification.
21
+ * You can safely ignore them if your current verification code works and you don't want to use this convention.
22
+ *
23
+ * ### Standard Webhooks Headers (Recommended)
24
+ *
25
+ * Used by [our SDK](https://github.com/linq-team/linq-node) and any [Standard Webhooks library](https://github.com/standard-webhooks/standard-webhooks).
18
26
  *
19
27
  * | Header | Description |
20
28
  * |--------|-------------|
21
- * | `X-Webhook-Event` | The event type (e.g., `message.sent`, `message.received`) |
22
- * | `X-Webhook-Subscription-ID` | Your webhook subscription ID |
23
- * | `X-Webhook-Timestamp` | Unix timestamp (seconds) when the webhook was sent |
24
- * | `X-Webhook-Signature` | HMAC-SHA256 signature for verification |
29
+ * | `webhook-id` | Unique event identifier (use as idempotency key) |
30
+ * | `webhook-timestamp` | Unix timestamp (seconds) when the webhook was sent |
31
+ * | `webhook-signature` | Standard Webhooks signature (`v1,{base64}` format) |
25
32
  *
26
- * ## Verifying Webhook Signatures
33
+ * ### Legacy Headers (Deprecated)
34
+ *
35
+ * Still sent on every delivery for backwards compatibility. Existing verification code
36
+ * using these headers continues to work — no changes required.
27
37
  *
28
- * All webhooks are signed using HMAC-SHA256. You should always verify the signature
29
- * to ensure the webhook originated from Linq and hasn't been tampered with.
38
+ * | Header | Description |
39
+ * |--------|-------------|
40
+ * | `X-Webhook-Event` | *(deprecated)* Event type (e.g., `message.sent`) |
41
+ * | `X-Webhook-Subscription-ID` | *(deprecated)* Webhook subscription ID |
42
+ * | `X-Webhook-Timestamp` | *(deprecated)* Unix timestamp (seconds) |
43
+ * | `X-Webhook-Signature` | *(deprecated)* HMAC-SHA256 signature (hex-encoded) |
30
44
  *
31
- * **Signature Construction:**
45
+ * ## Signing Secrets
32
46
  *
33
- * The signature is computed over a concatenation of the timestamp and payload:
47
+ * Signing secrets use the Standard Webhooks format: a `whsec_` prefix followed
48
+ * by base64-encoded random bytes (e.g., `whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw7Jxx2Oll+OE=`).
34
49
  *
35
- * ```
36
- * {timestamp}.{payload}
37
- * ```
50
+ * Strip the `whsec_` prefix and base64-decode the remainder to get the raw key bytes.
38
51
  *
39
- * Where:
40
- * - `timestamp` is the value from the `X-Webhook-Timestamp` header
41
- * - `payload` is the raw JSON request body (exact bytes, not re-serialized)
52
+ * ## Verifying Webhook Signatures
53
+ *
54
+ * Webhooks are signed following the [Standard Webhooks specification](https://github.com/standard-webhooks/standard-webhooks).
55
+ * You can use any [Standard Webhooks library](https://github.com/standard-webhooks/standard-webhooks) to verify
56
+ * signatures, or implement verification manually:
57
+ *
58
+ * **Signed content:** `{webhook-id}.{webhook-timestamp}.{body}`
42
59
  *
43
60
  * **Verification Steps:**
44
61
  *
45
- * 1. Extract the `X-Webhook-Timestamp` and `X-Webhook-Signature` headers
46
- * 2. Get the raw request body bytes (do not parse and re-serialize)
47
- * 3. Concatenate: `"{timestamp}.{payload}"`
48
- * 4. Compute HMAC-SHA256 using your signing secret as the key
49
- * 5. Hex-encode the result and compare with `X-Webhook-Signature`
50
- * 6. Use constant-time comparison to prevent timing attacks
62
+ * 1. Extract the `webhook-id`, `webhook-timestamp`, and `webhook-signature` headers
63
+ * 2. Reject if the timestamp is more than 5 minutes old (replay protection)
64
+ * 3. Get the raw request body bytes (do not parse and re-serialize)
65
+ * 4. Construct signed content: `"{webhook-id}.{webhook-timestamp}.{body}"`
66
+ * 5. Strip the `whsec_` prefix from your secret and base64-decode to get key bytes
67
+ * 6. Compute HMAC-SHA256 using the key bytes over the signed content
68
+ * 7. Base64-encode the result and compare with the value after `v1,` in `webhook-signature`
69
+ * 8. Use constant-time comparison to prevent timing attacks
51
70
  *
52
71
  * **Example (Python):**
53
72
  *
54
73
  * ```python
55
- * import hmac
56
- * import hashlib
57
- *
58
- * def verify_webhook(signing_secret, payload, timestamp, signature):
59
- * message = f"{timestamp}.{payload.decode('utf-8')}"
60
- * expected = hmac.new(
61
- * signing_secret.encode('utf-8'),
62
- * message.encode('utf-8'),
63
- * hashlib.sha256
64
- * ).hexdigest()
65
- * return hmac.compare_digest(expected, signature)
74
+ * import base64, hmac, hashlib
75
+ *
76
+ * def verify_webhook(secret, body, headers):
77
+ * msg_id = headers['webhook-id']
78
+ * timestamp = headers['webhook-timestamp']
79
+ * signature = headers['webhook-signature']
80
+ *
81
+ * secret_str = secret.removeprefix('whsec_')
82
+ * key = base64.b64decode(secret_str)
83
+ *
84
+ * signed_content = f"{msg_id}.{timestamp}.{body}"
85
+ * expected = base64.b64encode(
86
+ * hmac.new(key, signed_content.encode(), hashlib.sha256).digest()
87
+ * ).decode()
88
+ *
89
+ * for sig in signature.split(' '):
90
+ * if sig.startswith('v1,') and hmac.compare_digest(expected, sig[3:]):
91
+ * return True
92
+ * return False
66
93
  * ```
67
94
  *
68
95
  * **Example (Node.js):**
@@ -70,16 +97,28 @@ import { RequestOptions } from "../internal/request-options.js";
70
97
  * ```javascript
71
98
  * const crypto = require('crypto');
72
99
  *
73
- * function verifyWebhook(signingSecret, payload, timestamp, signature) {
74
- * const message = `${timestamp}.${payload}`;
100
+ * function verifyWebhook(secret, rawBody, headers) {
101
+ * const msgId = headers['webhook-id'];
102
+ * const timestamp = headers['webhook-timestamp'];
103
+ * const signature = headers['webhook-signature'];
104
+ *
105
+ * const secretStr = secret.startsWith('whsec_') ? secret.slice(6) : secret;
106
+ * const keyBytes = Buffer.from(secretStr, 'base64');
107
+ * const signedContent = `${msgId}.${timestamp}.${rawBody}`;
75
108
  * const expected = crypto
76
- * .createHmac('sha256', signingSecret)
77
- * .update(message)
78
- * .digest('hex');
79
- * return crypto.timingSafeEqual(
80
- * Buffer.from(expected),
81
- * Buffer.from(signature)
82
- * );
109
+ * .createHmac('sha256', keyBytes)
110
+ * .update(signedContent)
111
+ * .digest('base64');
112
+ *
113
+ * return signature.split(' ').some(sig => {
114
+ * if (!sig.startsWith('v1,')) return false;
115
+ * try {
116
+ * return crypto.timingSafeEqual(
117
+ * Buffer.from(expected, 'base64'),
118
+ * Buffer.from(sig.slice(3), 'base64')
119
+ * );
120
+ * } catch { return false; }
121
+ * });
83
122
  * }
84
123
  * ```
85
124
  *
@@ -105,12 +144,12 @@ export declare class WebhookEvents extends APIResource {
105
144
  * `webhook_version: "2026-02-03"`. Subscribing to this event on a v2025
106
145
  * subscription will not produce any deliveries.
107
146
  */
108
- export type WebhookEventType = 'message.sent' | 'message.received' | 'message.read' | 'message.delivered' | 'message.failed' | 'message.edited' | 'reaction.added' | 'reaction.removed' | 'participant.added' | 'participant.removed' | 'chat.created' | 'chat.group_name_updated' | 'chat.group_icon_updated' | 'chat.group_name_update_failed' | 'chat.group_icon_update_failed' | 'chat.typing_indicator.started' | 'chat.typing_indicator.stopped' | 'phone_number.status_updated' | 'call.initiated' | 'call.ringing' | 'call.answered' | 'call.ended' | 'call.failed' | 'call.declined' | 'call.no_answer';
147
+ export type WebhookEventType = 'message.sent' | 'message.received' | 'message.read' | 'message.delivered' | 'message.failed' | 'message.edited' | 'reaction.added' | 'reaction.removed' | 'participant.added' | 'participant.removed' | 'chat.created' | 'chat.group_name_updated' | 'chat.group_icon_updated' | 'chat.group_name_update_failed' | 'chat.group_icon_update_failed' | 'chat.typing_indicator.started' | 'chat.typing_indicator.stopped' | 'phone_number.status_updated' | 'call.initiated' | 'call.ringing' | 'call.answered' | 'call.ended' | 'call.failed' | 'call.declined' | 'call.no_answer' | 'location.sharing.started' | 'location.sharing.stopped';
109
148
  export interface WebhookEventListResponse {
110
149
  /**
111
150
  * URL to the webhook events documentation
112
151
  */
113
- doc_url: 'https://apidocs.linqapp.com/documentation/webhook-events';
152
+ doc_url: 'https://docs.linqapp.com/guides/webhooks/events';
114
153
  /**
115
154
  * List of all available webhook event types
116
155
  */
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-events.d.ts","sourceRoot":"","sources":["../src/resources/webhook-events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,4BAAyB;AAC/C,OAAO,EAAE,UAAU,EAAE,+BAA4B;AACjD,OAAO,EAAE,cAAc,EAAE,uCAAoC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwFG;AACH,qBAAa,aAAc,SAAQ,WAAW;IAC5C;;;;OAIG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,UAAU,CAAC,wBAAwB,CAAC;CAGrE;AAED;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GACxB,cAAc,GACd,kBAAkB,GAClB,cAAc,GACd,mBAAmB,GACnB,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,GAChB,kBAAkB,GAClB,mBAAmB,GACnB,qBAAqB,GACrB,cAAc,GACd,yBAAyB,GACzB,yBAAyB,GACzB,+BAA+B,GAC/B,+BAA+B,GAC/B,+BAA+B,GAC/B,+BAA+B,GAC/B,6BAA6B,GAC7B,gBAAgB,GAChB,cAAc,GACd,eAAe,GACf,YAAY,GACZ,aAAa,GACb,eAAe,GACf,gBAAgB,CAAC;AAErB,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,OAAO,EAAE,0DAA0D,CAAC;IAEpE;;OAEG;IACH,MAAM,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;CACjC;AAED,MAAM,CAAC,OAAO,WAAW,aAAa,CAAC;IACrC,OAAO,EACL,KAAK,gBAAgB,IAAI,gBAAgB,EACzC,KAAK,wBAAwB,IAAI,wBAAwB,GAC1D,CAAC;CACH"}
1
+ {"version":3,"file":"webhook-events.d.ts","sourceRoot":"","sources":["../src/resources/webhook-events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,4BAAyB;AAC/C,OAAO,EAAE,UAAU,EAAE,+BAA4B;AACjD,OAAO,EAAE,cAAc,EAAE,uCAAoC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+HG;AACH,qBAAa,aAAc,SAAQ,WAAW;IAC5C;;;;OAIG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,UAAU,CAAC,wBAAwB,CAAC;CAGrE;AAED;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GACxB,cAAc,GACd,kBAAkB,GAClB,cAAc,GACd,mBAAmB,GACnB,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,GAChB,kBAAkB,GAClB,mBAAmB,GACnB,qBAAqB,GACrB,cAAc,GACd,yBAAyB,GACzB,yBAAyB,GACzB,+BAA+B,GAC/B,+BAA+B,GAC/B,+BAA+B,GAC/B,+BAA+B,GAC/B,6BAA6B,GAC7B,gBAAgB,GAChB,cAAc,GACd,eAAe,GACf,YAAY,GACZ,aAAa,GACb,eAAe,GACf,gBAAgB,GAChB,0BAA0B,GAC1B,0BAA0B,CAAC;AAE/B,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,OAAO,EAAE,iDAAiD,CAAC;IAE3D;;OAEG;IACH,MAAM,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;CACjC;AAED,MAAM,CAAC,OAAO,WAAW,aAAa,CAAC;IACrC,OAAO,EACL,KAAK,gBAAgB,IAAI,gBAAgB,EACzC,KAAK,wBAAwB,IAAI,wBAAwB,GAC1D,CAAC;CACH"}