featurebase-node 0.13.0 → 0.14.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 (497) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/api-promise.d.mts +1 -0
  3. package/api-promise.d.mts.map +1 -1
  4. package/api-promise.d.ts +1 -0
  5. package/api-promise.d.ts.map +1 -1
  6. package/api-promise.mjs +1 -0
  7. package/api-promise.mjs.map +1 -1
  8. package/client.d.mts +9 -3
  9. package/client.d.mts.map +1 -1
  10. package/client.d.ts +9 -3
  11. package/client.d.ts.map +1 -1
  12. package/client.js +6 -0
  13. package/client.js.map +1 -1
  14. package/client.mjs +6 -0
  15. package/client.mjs.map +1 -1
  16. package/core/api-promise.d.mts.map +1 -1
  17. package/core/api-promise.d.ts.map +1 -1
  18. package/core/api-promise.mjs.map +1 -1
  19. package/core/error.mjs.map +1 -1
  20. package/core/pagination.d.mts.map +1 -1
  21. package/core/pagination.d.ts.map +1 -1
  22. package/core/pagination.mjs.map +1 -1
  23. package/core/resource.d.mts.map +1 -1
  24. package/core/resource.d.ts.map +1 -1
  25. package/core/uploads.d.mts.map +1 -1
  26. package/core/uploads.d.ts.map +1 -1
  27. package/core/uploads.mjs.map +1 -1
  28. package/error.d.mts +1 -0
  29. package/error.d.mts.map +1 -1
  30. package/error.d.ts +1 -0
  31. package/error.d.ts.map +1 -1
  32. package/error.mjs +1 -0
  33. package/error.mjs.map +1 -1
  34. package/index.d.mts.map +1 -1
  35. package/index.d.ts.map +1 -1
  36. package/index.mjs.map +1 -1
  37. package/internal/detect-platform.mjs.map +1 -1
  38. package/internal/headers.mjs.map +1 -1
  39. package/internal/parse.d.mts.map +1 -1
  40. package/internal/parse.d.ts.map +1 -1
  41. package/internal/parse.mjs.map +1 -1
  42. package/internal/qs/formats.d.mts.map +1 -1
  43. package/internal/qs/formats.d.ts.map +1 -1
  44. package/internal/qs/index.d.mts +2 -2
  45. package/internal/qs/index.d.mts.map +1 -1
  46. package/internal/qs/index.d.ts +2 -2
  47. package/internal/qs/index.d.ts.map +1 -1
  48. package/internal/qs/index.mjs.map +1 -1
  49. package/internal/qs/stringify.d.mts.map +1 -1
  50. package/internal/qs/stringify.d.ts.map +1 -1
  51. package/internal/qs/stringify.mjs.map +1 -1
  52. package/internal/qs/utils.d.mts.map +1 -1
  53. package/internal/qs/utils.d.ts.map +1 -1
  54. package/internal/qs/utils.mjs.map +1 -1
  55. package/internal/request-options.d.mts.map +1 -1
  56. package/internal/request-options.d.ts.map +1 -1
  57. package/internal/shims.d.mts +6 -0
  58. package/internal/shims.d.mts.map +1 -1
  59. package/internal/shims.d.ts +6 -0
  60. package/internal/shims.d.ts.map +1 -1
  61. package/internal/to-file.d.mts.map +1 -1
  62. package/internal/to-file.d.ts.map +1 -1
  63. package/internal/to-file.mjs.map +1 -1
  64. package/internal/types.d.mts +4 -4
  65. package/internal/types.d.mts.map +1 -1
  66. package/internal/types.d.ts +4 -4
  67. package/internal/types.d.ts.map +1 -1
  68. package/internal/uploads.d.mts.map +1 -1
  69. package/internal/uploads.d.ts.map +1 -1
  70. package/internal/uploads.mjs.map +1 -1
  71. package/internal/utils/base64.mjs.map +1 -1
  72. package/internal/utils/log.d.mts.map +1 -1
  73. package/internal/utils/log.d.ts.map +1 -1
  74. package/internal/utils/log.mjs.map +1 -1
  75. package/internal/utils/path.mjs.map +1 -1
  76. package/internal/utils/query.mjs.map +1 -1
  77. package/internal/utils/values.mjs.map +1 -1
  78. package/internal/utils.d.mts.map +1 -1
  79. package/internal/utils.d.ts.map +1 -1
  80. package/internal/utils.mjs.map +1 -1
  81. package/package.json +16 -10
  82. package/pagination.d.mts +1 -0
  83. package/pagination.d.mts.map +1 -1
  84. package/pagination.d.ts +1 -0
  85. package/pagination.d.ts.map +1 -1
  86. package/pagination.mjs +1 -0
  87. package/pagination.mjs.map +1 -1
  88. package/resource.d.mts +1 -0
  89. package/resource.d.mts.map +1 -1
  90. package/resource.d.ts +1 -0
  91. package/resource.d.ts.map +1 -1
  92. package/resource.mjs +1 -0
  93. package/resource.mjs.map +1 -1
  94. package/resources/changelogs/changelogs.d.mts +106 -106
  95. package/resources/changelogs/changelogs.d.mts.map +1 -1
  96. package/resources/changelogs/changelogs.d.ts +106 -106
  97. package/resources/changelogs/changelogs.d.ts.map +1 -1
  98. package/resources/changelogs/changelogs.js +74 -74
  99. package/resources/changelogs/changelogs.js.map +1 -1
  100. package/resources/changelogs/changelogs.mjs +74 -74
  101. package/resources/changelogs/changelogs.mjs.map +1 -1
  102. package/resources/changelogs/index.d.mts +1 -1
  103. package/resources/changelogs/index.d.mts.map +1 -1
  104. package/resources/changelogs/index.d.ts +1 -1
  105. package/resources/changelogs/index.d.ts.map +1 -1
  106. package/resources/changelogs/index.mjs.map +1 -1
  107. package/resources/changelogs/subscribers.d.mts.map +1 -1
  108. package/resources/changelogs/subscribers.d.ts.map +1 -1
  109. package/resources/changelogs/subscribers.mjs.map +1 -1
  110. package/resources/changelogs.d.mts.map +1 -1
  111. package/resources/changelogs.d.ts.map +1 -1
  112. package/resources/changelogs.mjs.map +1 -1
  113. package/resources/conversation-attributes.d.mts +117 -0
  114. package/resources/conversation-attributes.d.mts.map +1 -0
  115. package/resources/conversation-attributes.d.ts +117 -0
  116. package/resources/conversation-attributes.d.ts.map +1 -0
  117. package/resources/conversation-attributes.js +61 -0
  118. package/resources/conversation-attributes.js.map +1 -0
  119. package/resources/conversation-attributes.mjs +57 -0
  120. package/resources/conversation-attributes.mjs.map +1 -0
  121. package/resources/feedback/boards.d.mts +17 -17
  122. package/resources/feedback/boards.d.mts.map +1 -1
  123. package/resources/feedback/boards.d.ts +17 -17
  124. package/resources/feedback/boards.d.ts.map +1 -1
  125. package/resources/feedback/boards.js +20 -20
  126. package/resources/feedback/boards.js.map +1 -1
  127. package/resources/feedback/boards.mjs +20 -20
  128. package/resources/feedback/boards.mjs.map +1 -1
  129. package/resources/feedback/comments.d.mts +129 -191
  130. package/resources/feedback/comments.d.mts.map +1 -1
  131. package/resources/feedback/comments.d.ts +129 -191
  132. package/resources/feedback/comments.d.ts.map +1 -1
  133. package/resources/feedback/comments.js +93 -93
  134. package/resources/feedback/comments.js.map +1 -1
  135. package/resources/feedback/comments.mjs +93 -93
  136. package/resources/feedback/comments.mjs.map +1 -1
  137. package/resources/feedback/custom-fields.d.mts +34 -34
  138. package/resources/feedback/custom-fields.d.mts.map +1 -1
  139. package/resources/feedback/custom-fields.d.ts +34 -34
  140. package/resources/feedback/custom-fields.d.ts.map +1 -1
  141. package/resources/feedback/custom-fields.js +36 -36
  142. package/resources/feedback/custom-fields.js.map +1 -1
  143. package/resources/feedback/custom-fields.mjs +36 -36
  144. package/resources/feedback/custom-fields.mjs.map +1 -1
  145. package/resources/feedback/feedback.d.mts +7 -7
  146. package/resources/feedback/feedback.d.mts.map +1 -1
  147. package/resources/feedback/feedback.d.ts +7 -7
  148. package/resources/feedback/feedback.d.ts.map +1 -1
  149. package/resources/feedback/feedback.js.map +1 -1
  150. package/resources/feedback/feedback.mjs.map +1 -1
  151. package/resources/feedback/index.d.mts +5 -5
  152. package/resources/feedback/index.d.mts.map +1 -1
  153. package/resources/feedback/index.d.ts +5 -5
  154. package/resources/feedback/index.d.ts.map +1 -1
  155. package/resources/feedback/index.js.map +1 -1
  156. package/resources/feedback/index.mjs.map +1 -1
  157. package/resources/feedback/post-statuses.d.mts +18 -18
  158. package/resources/feedback/post-statuses.d.mts.map +1 -1
  159. package/resources/feedback/post-statuses.d.ts +18 -18
  160. package/resources/feedback/post-statuses.d.ts.map +1 -1
  161. package/resources/feedback/post-statuses.js +23 -23
  162. package/resources/feedback/post-statuses.js.map +1 -1
  163. package/resources/feedback/post-statuses.mjs +23 -23
  164. package/resources/feedback/post-statuses.mjs.map +1 -1
  165. package/resources/feedback/posts/index.d.mts +1 -1
  166. package/resources/feedback/posts/index.d.mts.map +1 -1
  167. package/resources/feedback/posts/index.d.ts +1 -1
  168. package/resources/feedback/posts/index.d.ts.map +1 -1
  169. package/resources/feedback/posts/index.js.map +1 -1
  170. package/resources/feedback/posts/index.mjs.map +1 -1
  171. package/resources/feedback/posts/posts.d.mts +187 -260
  172. package/resources/feedback/posts/posts.d.mts.map +1 -1
  173. package/resources/feedback/posts/posts.d.ts +187 -260
  174. package/resources/feedback/posts/posts.d.ts.map +1 -1
  175. package/resources/feedback/posts/posts.js +75 -75
  176. package/resources/feedback/posts/posts.js.map +1 -1
  177. package/resources/feedback/posts/posts.mjs +75 -75
  178. package/resources/feedback/posts/posts.mjs.map +1 -1
  179. package/resources/feedback/posts/voters.d.mts.map +1 -1
  180. package/resources/feedback/posts/voters.d.ts.map +1 -1
  181. package/resources/feedback/posts/voters.mjs.map +1 -1
  182. package/resources/feedback/posts.d.mts.map +1 -1
  183. package/resources/feedback/posts.d.ts.map +1 -1
  184. package/resources/feedback/posts.mjs.map +1 -1
  185. package/resources/feedback.d.mts.map +1 -1
  186. package/resources/feedback.d.ts.map +1 -1
  187. package/resources/feedback.mjs.map +1 -1
  188. package/resources/help-center/articles.d.mts +98 -152
  189. package/resources/help-center/articles.d.mts.map +1 -1
  190. package/resources/help-center/articles.d.ts +98 -152
  191. package/resources/help-center/articles.d.ts.map +1 -1
  192. package/resources/help-center/articles.js +73 -73
  193. package/resources/help-center/articles.js.map +1 -1
  194. package/resources/help-center/articles.mjs +73 -73
  195. package/resources/help-center/articles.mjs.map +1 -1
  196. package/resources/help-center/collections.d.mts +64 -64
  197. package/resources/help-center/collections.d.mts.map +1 -1
  198. package/resources/help-center/collections.d.ts +64 -64
  199. package/resources/help-center/collections.d.ts.map +1 -1
  200. package/resources/help-center/collections.js +65 -65
  201. package/resources/help-center/collections.js.map +1 -1
  202. package/resources/help-center/collections.mjs +65 -65
  203. package/resources/help-center/collections.mjs.map +1 -1
  204. package/resources/help-center/help-center.d.mts +5 -5
  205. package/resources/help-center/help-center.d.mts.map +1 -1
  206. package/resources/help-center/help-center.d.ts +5 -5
  207. package/resources/help-center/help-center.d.ts.map +1 -1
  208. package/resources/help-center/help-center.js.map +1 -1
  209. package/resources/help-center/help-center.mjs.map +1 -1
  210. package/resources/help-center/help-centers.d.mts +43 -43
  211. package/resources/help-center/help-centers.d.mts.map +1 -1
  212. package/resources/help-center/help-centers.d.ts +43 -43
  213. package/resources/help-center/help-centers.d.ts.map +1 -1
  214. package/resources/help-center/help-centers.js +43 -43
  215. package/resources/help-center/help-centers.js.map +1 -1
  216. package/resources/help-center/help-centers.mjs +43 -43
  217. package/resources/help-center/help-centers.mjs.map +1 -1
  218. package/resources/help-center/index.d.mts +4 -4
  219. package/resources/help-center/index.d.mts.map +1 -1
  220. package/resources/help-center/index.d.ts +4 -4
  221. package/resources/help-center/index.d.ts.map +1 -1
  222. package/resources/help-center/index.js.map +1 -1
  223. package/resources/help-center/index.mjs.map +1 -1
  224. package/resources/help-center/redirect-rules.d.mts +117 -117
  225. package/resources/help-center/redirect-rules.d.mts.map +1 -1
  226. package/resources/help-center/redirect-rules.d.ts +117 -117
  227. package/resources/help-center/redirect-rules.d.ts.map +1 -1
  228. package/resources/help-center/redirect-rules.js +112 -112
  229. package/resources/help-center/redirect-rules.js.map +1 -1
  230. package/resources/help-center/redirect-rules.mjs +112 -112
  231. package/resources/help-center/redirect-rules.mjs.map +1 -1
  232. package/resources/help-center.d.mts.map +1 -1
  233. package/resources/help-center.d.ts.map +1 -1
  234. package/resources/help-center.mjs.map +1 -1
  235. package/resources/index.d.mts +4 -3
  236. package/resources/index.d.mts.map +1 -1
  237. package/resources/index.d.ts +4 -3
  238. package/resources/index.d.ts.map +1 -1
  239. package/resources/index.js +3 -1
  240. package/resources/index.js.map +1 -1
  241. package/resources/index.mjs +1 -0
  242. package/resources/index.mjs.map +1 -1
  243. package/resources/organization/admins.d.mts +23 -23
  244. package/resources/organization/admins.d.mts.map +1 -1
  245. package/resources/organization/admins.d.ts +23 -23
  246. package/resources/organization/admins.d.ts.map +1 -1
  247. package/resources/organization/admins.js +25 -25
  248. package/resources/organization/admins.js.map +1 -1
  249. package/resources/organization/admins.mjs +25 -25
  250. package/resources/organization/admins.mjs.map +1 -1
  251. package/resources/organization/brands.d.mts +50 -50
  252. package/resources/organization/brands.d.mts.map +1 -1
  253. package/resources/organization/brands.d.ts +50 -50
  254. package/resources/organization/brands.d.ts.map +1 -1
  255. package/resources/organization/brands.js +54 -54
  256. package/resources/organization/brands.js.map +1 -1
  257. package/resources/organization/brands.mjs +54 -54
  258. package/resources/organization/brands.mjs.map +1 -1
  259. package/resources/organization/index.d.mts +3 -3
  260. package/resources/organization/index.d.mts.map +1 -1
  261. package/resources/organization/index.d.ts +3 -3
  262. package/resources/organization/index.d.ts.map +1 -1
  263. package/resources/organization/index.mjs.map +1 -1
  264. package/resources/organization/organization.d.mts +3 -3
  265. package/resources/organization/organization.d.mts.map +1 -1
  266. package/resources/organization/organization.d.ts +3 -3
  267. package/resources/organization/organization.d.ts.map +1 -1
  268. package/resources/organization/organization.mjs.map +1 -1
  269. package/resources/organization/teams.d.mts +45 -45
  270. package/resources/organization/teams.d.mts.map +1 -1
  271. package/resources/organization/teams.d.ts +45 -45
  272. package/resources/organization/teams.d.ts.map +1 -1
  273. package/resources/organization/teams.js +44 -44
  274. package/resources/organization/teams.js.map +1 -1
  275. package/resources/organization/teams.mjs +44 -44
  276. package/resources/organization/teams.mjs.map +1 -1
  277. package/resources/organization.d.mts.map +1 -1
  278. package/resources/organization.d.ts.map +1 -1
  279. package/resources/organization.mjs.map +1 -1
  280. package/resources/support/conversation-tags.d.mts +40 -40
  281. package/resources/support/conversation-tags.d.mts.map +1 -1
  282. package/resources/support/conversation-tags.d.ts +40 -40
  283. package/resources/support/conversation-tags.d.ts.map +1 -1
  284. package/resources/support/conversation-tags.js +32 -32
  285. package/resources/support/conversation-tags.js.map +1 -1
  286. package/resources/support/conversation-tags.mjs +32 -32
  287. package/resources/support/conversation-tags.mjs.map +1 -1
  288. package/resources/support/conversations/conversations.d.mts +599 -705
  289. package/resources/support/conversations/conversations.d.mts.map +1 -1
  290. package/resources/support/conversations/conversations.d.ts +599 -705
  291. package/resources/support/conversations/conversations.d.ts.map +1 -1
  292. package/resources/support/conversations/conversations.js +289 -288
  293. package/resources/support/conversations/conversations.js.map +1 -1
  294. package/resources/support/conversations/conversations.mjs +289 -288
  295. package/resources/support/conversations/conversations.mjs.map +1 -1
  296. package/resources/support/conversations/index.d.mts +1 -1
  297. package/resources/support/conversations/index.d.mts.map +1 -1
  298. package/resources/support/conversations/index.d.ts +1 -1
  299. package/resources/support/conversations/index.d.ts.map +1 -1
  300. package/resources/support/conversations/index.js.map +1 -1
  301. package/resources/support/conversations/index.mjs.map +1 -1
  302. package/resources/support/conversations/participants.d.mts.map +1 -1
  303. package/resources/support/conversations/participants.d.ts.map +1 -1
  304. package/resources/support/conversations/participants.mjs.map +1 -1
  305. package/resources/support/conversations.d.mts.map +1 -1
  306. package/resources/support/conversations.d.ts.map +1 -1
  307. package/resources/support/conversations.mjs.map +1 -1
  308. package/resources/support/index.d.mts +3 -3
  309. package/resources/support/index.d.mts.map +1 -1
  310. package/resources/support/index.d.ts +3 -3
  311. package/resources/support/index.d.ts.map +1 -1
  312. package/resources/support/index.js.map +1 -1
  313. package/resources/support/index.mjs.map +1 -1
  314. package/resources/support/support.d.mts +4 -4
  315. package/resources/support/support.d.mts.map +1 -1
  316. package/resources/support/support.d.ts +4 -4
  317. package/resources/support/support.d.ts.map +1 -1
  318. package/resources/support/support.js.map +1 -1
  319. package/resources/support/support.mjs.map +1 -1
  320. package/resources/support/tickets/categories.d.mts +18 -18
  321. package/resources/support/tickets/categories.d.mts.map +1 -1
  322. package/resources/support/tickets/categories.d.ts +18 -18
  323. package/resources/support/tickets/categories.d.ts.map +1 -1
  324. package/resources/support/tickets/categories.js +25 -25
  325. package/resources/support/tickets/categories.js.map +1 -1
  326. package/resources/support/tickets/categories.mjs +25 -25
  327. package/resources/support/tickets/categories.mjs.map +1 -1
  328. package/resources/support/tickets/custom-fields.d.mts +20 -20
  329. package/resources/support/tickets/custom-fields.d.mts.map +1 -1
  330. package/resources/support/tickets/custom-fields.d.ts +20 -20
  331. package/resources/support/tickets/custom-fields.d.ts.map +1 -1
  332. package/resources/support/tickets/custom-fields.js +19 -19
  333. package/resources/support/tickets/custom-fields.js.map +1 -1
  334. package/resources/support/tickets/custom-fields.mjs +19 -19
  335. package/resources/support/tickets/custom-fields.mjs.map +1 -1
  336. package/resources/support/tickets/index.d.mts +4 -4
  337. package/resources/support/tickets/index.d.mts.map +1 -1
  338. package/resources/support/tickets/index.d.ts +4 -4
  339. package/resources/support/tickets/index.d.ts.map +1 -1
  340. package/resources/support/tickets/index.mjs.map +1 -1
  341. package/resources/support/tickets/statuses.d.mts +17 -17
  342. package/resources/support/tickets/statuses.d.mts.map +1 -1
  343. package/resources/support/tickets/statuses.d.ts +17 -17
  344. package/resources/support/tickets/statuses.d.ts.map +1 -1
  345. package/resources/support/tickets/statuses.js +21 -21
  346. package/resources/support/tickets/statuses.js.map +1 -1
  347. package/resources/support/tickets/statuses.mjs +21 -21
  348. package/resources/support/tickets/statuses.mjs.map +1 -1
  349. package/resources/support/tickets/tickets.d.mts +69 -69
  350. package/resources/support/tickets/tickets.d.mts.map +1 -1
  351. package/resources/support/tickets/tickets.d.ts +69 -69
  352. package/resources/support/tickets/tickets.d.ts.map +1 -1
  353. package/resources/support/tickets/tickets.js +44 -44
  354. package/resources/support/tickets/tickets.js.map +1 -1
  355. package/resources/support/tickets/tickets.mjs +44 -44
  356. package/resources/support/tickets/tickets.mjs.map +1 -1
  357. package/resources/support/tickets.d.mts.map +1 -1
  358. package/resources/support/tickets.d.ts.map +1 -1
  359. package/resources/support/tickets.mjs.map +1 -1
  360. package/resources/support.d.mts.map +1 -1
  361. package/resources/support.d.ts.map +1 -1
  362. package/resources/support.mjs.map +1 -1
  363. package/resources/surveys.d.mts +41 -41
  364. package/resources/surveys.d.mts.map +1 -1
  365. package/resources/surveys.d.ts +41 -41
  366. package/resources/surveys.d.ts.map +1 -1
  367. package/resources/surveys.js +44 -44
  368. package/resources/surveys.js.map +1 -1
  369. package/resources/surveys.mjs +44 -44
  370. package/resources/surveys.mjs.map +1 -1
  371. package/resources/users/companies/companies.d.mts +116 -157
  372. package/resources/users/companies/companies.d.mts.map +1 -1
  373. package/resources/users/companies/companies.d.ts +116 -157
  374. package/resources/users/companies/companies.d.ts.map +1 -1
  375. package/resources/users/companies/companies.js +125 -125
  376. package/resources/users/companies/companies.js.map +1 -1
  377. package/resources/users/companies/companies.mjs +125 -125
  378. package/resources/users/companies/companies.mjs.map +1 -1
  379. package/resources/users/companies/contacts.d.mts.map +1 -1
  380. package/resources/users/companies/contacts.d.ts.map +1 -1
  381. package/resources/users/companies/contacts.mjs.map +1 -1
  382. package/resources/users/companies/index.d.mts +1 -1
  383. package/resources/users/companies/index.d.mts.map +1 -1
  384. package/resources/users/companies/index.d.ts +1 -1
  385. package/resources/users/companies/index.d.ts.map +1 -1
  386. package/resources/users/companies/index.mjs.map +1 -1
  387. package/resources/users/companies.d.mts.map +1 -1
  388. package/resources/users/companies.d.ts.map +1 -1
  389. package/resources/users/companies.mjs.map +1 -1
  390. package/resources/users/contacts/by-user-id/by-user-id.d.mts.map +1 -1
  391. package/resources/users/contacts/by-user-id/by-user-id.d.ts.map +1 -1
  392. package/resources/users/contacts/by-user-id/by-user-id.mjs.map +1 -1
  393. package/resources/users/contacts/by-user-id/email-preferences.d.mts.map +1 -1
  394. package/resources/users/contacts/by-user-id/email-preferences.d.ts.map +1 -1
  395. package/resources/users/contacts/by-user-id/email-preferences.mjs.map +1 -1
  396. package/resources/users/contacts/by-user-id/index.d.mts.map +1 -1
  397. package/resources/users/contacts/by-user-id/index.d.ts.map +1 -1
  398. package/resources/users/contacts/by-user-id/index.mjs.map +1 -1
  399. package/resources/users/contacts/by-user-id.d.mts.map +1 -1
  400. package/resources/users/contacts/by-user-id.d.ts.map +1 -1
  401. package/resources/users/contacts/by-user-id.mjs.map +1 -1
  402. package/resources/users/contacts/contacts.d.mts +196 -235
  403. package/resources/users/contacts/contacts.d.mts.map +1 -1
  404. package/resources/users/contacts/contacts.d.ts +196 -235
  405. package/resources/users/contacts/contacts.d.ts.map +1 -1
  406. package/resources/users/contacts/contacts.js +186 -184
  407. package/resources/users/contacts/contacts.js.map +1 -1
  408. package/resources/users/contacts/contacts.mjs +186 -184
  409. package/resources/users/contacts/contacts.mjs.map +1 -1
  410. package/resources/users/contacts/email-preferences.d.mts.map +1 -1
  411. package/resources/users/contacts/email-preferences.d.ts.map +1 -1
  412. package/resources/users/contacts/email-preferences.mjs.map +1 -1
  413. package/resources/users/contacts/index.d.mts +1 -1
  414. package/resources/users/contacts/index.d.mts.map +1 -1
  415. package/resources/users/contacts/index.d.ts +1 -1
  416. package/resources/users/contacts/index.d.ts.map +1 -1
  417. package/resources/users/contacts/index.mjs.map +1 -1
  418. package/resources/users/contacts.d.mts.map +1 -1
  419. package/resources/users/contacts.d.ts.map +1 -1
  420. package/resources/users/contacts.mjs.map +1 -1
  421. package/resources/users/index.d.mts +2 -2
  422. package/resources/users/index.d.mts.map +1 -1
  423. package/resources/users/index.d.ts +2 -2
  424. package/resources/users/index.d.ts.map +1 -1
  425. package/resources/users/index.mjs.map +1 -1
  426. package/resources/users/users.d.mts +2 -2
  427. package/resources/users/users.d.mts.map +1 -1
  428. package/resources/users/users.d.ts +2 -2
  429. package/resources/users/users.d.ts.map +1 -1
  430. package/resources/users/users.mjs.map +1 -1
  431. package/resources/users.d.mts.map +1 -1
  432. package/resources/users.d.ts.map +1 -1
  433. package/resources/users.mjs.map +1 -1
  434. package/resources/webhooks.d.mts +75 -75
  435. package/resources/webhooks.d.mts.map +1 -1
  436. package/resources/webhooks.d.ts +75 -75
  437. package/resources/webhooks.d.ts.map +1 -1
  438. package/resources/webhooks.js +77 -77
  439. package/resources/webhooks.js.map +1 -1
  440. package/resources/webhooks.mjs +77 -77
  441. package/resources/webhooks.mjs.map +1 -1
  442. package/resources.d.mts.map +1 -1
  443. package/resources.d.ts.map +1 -1
  444. package/resources.mjs.map +1 -1
  445. package/src/client.ts +25 -3
  446. package/src/resources/changelogs/changelogs.ts +170 -170
  447. package/src/resources/changelogs/index.ts +1 -1
  448. package/src/resources/conversation-attributes.ts +181 -0
  449. package/src/resources/feedback/boards.ts +28 -28
  450. package/src/resources/feedback/comments.ts +153 -226
  451. package/src/resources/feedback/custom-fields.ts +44 -44
  452. package/src/resources/feedback/feedback.ts +19 -5
  453. package/src/resources/feedback/index.ts +12 -5
  454. package/src/resources/feedback/post-statuses.ts +31 -31
  455. package/src/resources/feedback/posts/index.ts +7 -1
  456. package/src/resources/feedback/posts/posts.ts +230 -311
  457. package/src/resources/help-center/articles.ts +123 -186
  458. package/src/resources/help-center/collections.ts +84 -84
  459. package/src/resources/help-center/help-center.ts +7 -5
  460. package/src/resources/help-center/help-centers.ts +55 -55
  461. package/src/resources/help-center/index.ts +6 -5
  462. package/src/resources/help-center/redirect-rules.ts +174 -174
  463. package/src/resources/index.ts +11 -3
  464. package/src/resources/organization/admins.ts +33 -33
  465. package/src/resources/organization/brands.ts +66 -66
  466. package/src/resources/organization/index.ts +3 -3
  467. package/src/resources/organization/organization.ts +3 -3
  468. package/src/resources/organization/teams.ts +52 -52
  469. package/src/resources/support/conversation-tags.ts +59 -59
  470. package/src/resources/support/conversations/conversations.ts +723 -850
  471. package/src/resources/support/conversations/index.ts +11 -6
  472. package/src/resources/support/index.ts +14 -9
  473. package/src/resources/support/support.ts +21 -11
  474. package/src/resources/support/tickets/categories.ts +33 -33
  475. package/src/resources/support/tickets/custom-fields.ts +27 -27
  476. package/src/resources/support/tickets/index.ts +4 -4
  477. package/src/resources/support/tickets/statuses.ts +29 -29
  478. package/src/resources/support/tickets/tickets.ts +95 -95
  479. package/src/resources/surveys.ts +58 -58
  480. package/src/resources/users/companies/companies.ts +155 -204
  481. package/src/resources/users/companies/index.ts +2 -2
  482. package/src/resources/users/contacts/contacts.ts +235 -282
  483. package/src/resources/users/contacts/index.ts +3 -3
  484. package/src/resources/users/index.ts +5 -5
  485. package/src/resources/users/users.ts +5 -5
  486. package/src/resources/webhooks.ts +95 -95
  487. package/src/version.ts +1 -1
  488. package/uploads.d.mts +1 -0
  489. package/uploads.d.mts.map +1 -1
  490. package/uploads.d.ts +1 -0
  491. package/uploads.d.ts.map +1 -1
  492. package/uploads.mjs +1 -0
  493. package/uploads.mjs.map +1 -1
  494. package/version.d.mts +1 -1
  495. package/version.d.ts +1 -1
  496. package/version.js +1 -1
  497. package/version.mjs +1 -1
@@ -2,7 +2,9 @@
2
2
 
3
3
  import { APIResource } from '../../../core/resource';
4
4
  import * as ConversationsAPI from './conversations';
5
+ import * as ConversationAttributesAPI from '../../conversation-attributes';
5
6
  import * as ConversationTagsAPI from '../conversation-tags';
7
+ import * as PostsAPI from '../../feedback/posts/posts';
6
8
  import * as ParticipantsAPI from './participants';
7
9
  import { ParticipantAddParams, ParticipantRemoveParams, Participants } from './participants';
8
10
  import { APIPromise } from '../../../core/api-promise';
@@ -17,6 +19,95 @@ import { path } from '../../../internal/utils/path';
17
19
  export class Conversations extends APIResource {
18
20
  participants: ParticipantsAPI.Participants = new ParticipantsAPI.Participants(this._client);
19
21
 
22
+ /**
23
+ * Returns a list of conversations in your organization using cursor-based
24
+ * pagination.
25
+ *
26
+ * ### Query Parameters
27
+ *
28
+ * - `limit` - Number of conversations to return (1-100, default 10)
29
+ * - `cursor` - Cursor from previous response for pagination
30
+ * - `tagIds` - Optional tag filter as a comma-separated list of tag IDs. Matches
31
+ * conversations that contain all of the provided tags.
32
+ *
33
+ * ### Response Format
34
+ *
35
+ * Returns a list object with:
36
+ *
37
+ * - `object` - Always "list"
38
+ * - `data` - Array of conversation objects
39
+ * - `nextCursor` - Cursor for the next page, or null if no more results
40
+ *
41
+ * ### Conversation Object
42
+ *
43
+ * Each conversation includes:
44
+ *
45
+ * - `id` - Unique conversation identifier (short ID)
46
+ * - `title` - Conversation title
47
+ * - `state` - Current state ("open", "closed", or "snoozed")
48
+ * - `priority` - Whether the conversation is marked as priority
49
+ * - `adminAssigneeId` - ID of assigned admin (if any)
50
+ * - `teamAssigneeId` - ID of assigned team (if any)
51
+ * - `tags` - Current tags applied anywhere in the conversation
52
+ * - `participants` - Array of participants
53
+ * - `source` - Information about the first message
54
+ * - `createdAt` - Creation timestamp
55
+ * - `updatedAt` - Last update timestamp
56
+ *
57
+ * ### Example
58
+ *
59
+ * ```json
60
+ * {
61
+ * "object": "list",
62
+ * "data": [
63
+ * {
64
+ * "object": "conversation",
65
+ * "id": "12345",
66
+ * "title": "Question about pricing",
67
+ * "state": "open",
68
+ * "priority": false,
69
+ * "adminAssigneeId": null,
70
+ * "participants": [
71
+ * { "type": "customer", "id": "676f0f6765bdaa7d7d760f88" }
72
+ * ],
73
+ * ...
74
+ * }
75
+ * ],
76
+ * "nextCursor": "eyJpZCI6IjEyMzQ1In0="
77
+ * }
78
+ * ```
79
+ *
80
+ * ### Version Availability
81
+ *
82
+ * This endpoint is only available in API version 2026-01-01.nova and newer.
83
+ *
84
+ * @example
85
+ * ```ts
86
+ * // Automatically fetches more pages as needed.
87
+ * for await (const conversation of client.support.conversations.list()) {
88
+ * // ...
89
+ * }
90
+ * ```
91
+ */
92
+ list(
93
+ params: ConversationListParams | null | undefined = {},
94
+ options?: RequestOptions,
95
+ ): PagePromise<ConversationsCursorPage, Conversation> {
96
+ const { 'Featurebase-Version': featurebaseVersion, ...query } = params ?? {};
97
+ return this._client.getAPIList('/v2/conversations', CursorPage<Conversation>, {
98
+ query,
99
+ ...options,
100
+ headers: buildHeaders([
101
+ {
102
+ ...(featurebaseVersion?.toString() != null ?
103
+ { 'Featurebase-Version': featurebaseVersion?.toString() }
104
+ : undefined),
105
+ },
106
+ options?.headers,
107
+ ]),
108
+ });
109
+ }
110
+
20
111
  /**
21
112
  * Creates a new conversation. Supports both contact-initiated (customer/lead) and
22
113
  * admin-initiated (outreach) conversations.
@@ -275,8 +366,62 @@ export class Conversations extends APIResource {
275
366
  params: ConversationRetrieveParams | null | undefined = {},
276
367
  options?: RequestOptions,
277
368
  ): APIPromise<Conversation> {
278
- const { 'Featurebase-Version': featurebaseVersion } = params ?? {};
369
+ const { 'Featurebase-Version': featurebaseVersion, ...query } = params ?? {};
279
370
  return this._client.get(path`/v2/conversations/${id}`, {
371
+ query,
372
+ ...options,
373
+ headers: buildHeaders([
374
+ {
375
+ ...(featurebaseVersion?.toString() != null ?
376
+ { 'Featurebase-Version': featurebaseVersion?.toString() }
377
+ : undefined),
378
+ },
379
+ options?.headers,
380
+ ]),
381
+ });
382
+ }
383
+
384
+ /**
385
+ * Permanently deletes a conversation by its short ID.
386
+ *
387
+ * ### Path Parameters
388
+ *
389
+ * - `id` - The conversation short ID (numeric)
390
+ *
391
+ * ### Response
392
+ *
393
+ * Returns a deletion confirmation object:
394
+ *
395
+ * ```json
396
+ * {
397
+ * "id": "12345",
398
+ * "object": "conversation",
399
+ * "deleted": true
400
+ * }
401
+ * ```
402
+ *
403
+ * ### Caution
404
+ *
405
+ * This operation is **irreversible**. The conversation and all its messages will
406
+ * be permanently deleted.
407
+ *
408
+ * ### Version Availability
409
+ *
410
+ * This endpoint is only available in API version 2026-01-01.nova and newer.
411
+ *
412
+ * @example
413
+ * ```ts
414
+ * const conversation =
415
+ * await client.support.conversations.delete('12345');
416
+ * ```
417
+ */
418
+ delete(
419
+ id: string,
420
+ params: ConversationDeleteParams | null | undefined = {},
421
+ options?: RequestOptions,
422
+ ): APIPromise<ConversationDeleteResponse> {
423
+ const { 'Featurebase-Version': featurebaseVersion } = params ?? {};
424
+ return this._client.delete(path`/v2/conversations/${id}`, {
280
425
  ...options,
281
426
  headers: buildHeaders([
282
427
  {
@@ -309,7 +454,7 @@ export class Conversations extends APIResource {
309
454
  * | `adminAssigneeId` | string/null | Admin ID to assign, or null to unassign |
310
455
  * | `teamAssigneeId` | string/null | Team ID to assign, or null to unassign |
311
456
  * | `title` | string | Conversation title |
312
- * | `customAttributes` | object | Custom attributes to set on the conversation |
457
+ * | `customAttributes` | object | Custom attributes to set on the conversation, keyed by conversation custom attribute ID |
313
458
  * | `markAsRead` | object | Mark conversation as read for specific users |
314
459
  *
315
460
  * ### markAsRead Object
@@ -369,8 +514,8 @@ export class Conversations extends APIResource {
369
514
  * {
370
515
  * "title": "Billing Issue - Priority",
371
516
  * "customAttributes": {
372
- * "priority_level": "high",
373
- * "category": "billing"
517
+ * "507f1f77bcf86cd799439011": 10,
518
+ * "507f1f77bcf86cd799439012": true
374
519
  * }
375
520
  * }
376
521
  * ```
@@ -433,83 +578,119 @@ export class Conversations extends APIResource {
433
578
  }
434
579
 
435
580
  /**
436
- * Returns a list of conversations in your organization using cursor-based
437
- * pagination.
581
+ * Adds a reply to an existing conversation. Supports both contact (customer/lead)
582
+ * and admin replies.
438
583
  *
439
- * ### Query Parameters
584
+ * ### Path Parameters
440
585
  *
441
- * - `limit` - Number of conversations to return (1-100, default 10)
442
- * - `cursor` - Cursor from previous response for pagination
443
- * - `tagIds` - Optional tag filter as a comma-separated list of tag IDs. Matches
444
- * conversations that contain all of the provided tags.
586
+ * - `id` - The conversation ID (short ID)
445
587
  *
446
- * ### Response Format
588
+ * ### Request Body
447
589
  *
448
- * Returns a list object with:
590
+ * The request body varies based on who is sending the reply:
449
591
  *
450
- * - `object` - Always "list"
451
- * - `data` - Array of conversation objects
452
- * - `nextCursor` - Cursor for the next page, or null if no more results
592
+ * #### Contact Reply (customer/lead)
453
593
  *
454
- * ### Conversation Object
594
+ * | Field | Type | Required | Description |
595
+ * | ------------------- | ------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------- |
596
+ * | `type` | string | Yes | Must be "contact" |
597
+ * | `userId` | string | No\* | External user ID from your system |
598
+ * | `id` | string | No\* | Featurebase contact ID (24-character ObjectId) |
599
+ * | `bodyMarkdown` | string | Yes | The message content in markdown format. Images referenced by URL or as base64 data URIs will be automatically uploaded and stored. |
600
+ * | `messageType` | string | Yes | Must be "reply" |
601
+ * | `skipNotifications` | boolean | No | Skip sending notifications (default: false). Useful for bulk imports. |
455
602
  *
456
- * Each conversation includes:
603
+ * \*At least one of `userId` or `id` is required.
457
604
  *
458
- * - `id` - Unique conversation identifier (short ID)
459
- * - `title` - Conversation title
460
- * - `state` - Current state ("open", "closed", or "snoozed")
461
- * - `priority` - Whether the conversation is marked as priority
462
- * - `adminAssigneeId` - ID of assigned admin (if any)
463
- * - `teamAssigneeId` - ID of assigned team (if any)
464
- * - `tags` - Current tags applied anywhere in the conversation
465
- * - `participants` - Array of participants
466
- * - `source` - Information about the first message
467
- * - `createdAt` - Creation timestamp
468
- * - `updatedAt` - Last update timestamp
605
+ * #### Admin Reply
469
606
  *
470
- * ### Example
607
+ * | Field | Type | Required | Description |
608
+ * | ------------------- | ------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------- |
609
+ * | `type` | string | Yes | Must be "admin" |
610
+ * | `id` | string | Yes | Featurebase admin ID (24-character ObjectId) |
611
+ * | `bodyMarkdown` | string | Yes | The message content in markdown format. Images referenced by URL or as base64 data URIs will be automatically uploaded and stored. |
612
+ * | `messageType` | string | Yes | "reply" for customer-visible reply, "note" for internal note |
613
+ * | `skipNotifications` | boolean | No | Skip sending notifications (default: false). Useful for bulk imports. |
614
+ *
615
+ * ### Response
616
+ *
617
+ * Returns the created conversation part object with a **201 Created** status. The
618
+ * response includes both `bodyHtml` (with signed image URLs) and `bodyMarkdown`
619
+ * fields.
620
+ *
621
+ * ### Example Contact Reply
471
622
  *
472
623
  * ```json
473
624
  * {
474
- * "object": "list",
475
- * "data": [
476
- * {
477
- * "object": "conversation",
478
- * "id": "12345",
479
- * "title": "Question about pricing",
480
- * "state": "open",
481
- * "priority": false,
482
- * "adminAssigneeId": null,
483
- * "participants": [
484
- * { "type": "customer", "id": "676f0f6765bdaa7d7d760f88" }
485
- * ],
486
- * ...
487
- * }
488
- * ],
489
- * "nextCursor": "eyJpZCI6IjEyMzQ1In0="
625
+ * "type": "contact",
626
+ * "userId": "user_123",
627
+ * "bodyMarkdown": "Thank you for your help!",
628
+ * "messageType": "reply"
490
629
  * }
491
630
  * ```
492
631
  *
493
- * ### Version Availability
632
+ * ### Example Admin Reply
494
633
  *
495
- * This endpoint is only available in API version 2026-01-01.nova and newer.
634
+ * ```json
635
+ * {
636
+ * "type": "admin",
637
+ * "id": "507f1f77bcf86cd799439011",
638
+ * "bodyMarkdown": "I'm happy to help! Here's what you need to do...",
639
+ * "messageType": "reply"
640
+ * }
641
+ * ```
496
642
  *
497
- * @example
498
- * ```ts
499
- * // Automatically fetches more pages as needed.
500
- * for await (const conversation of client.support.conversations.list()) {
501
- * // ...
643
+ * ### Example Admin Note (Internal)
644
+ *
645
+ * ```json
646
+ * {
647
+ * "type": "admin",
648
+ * "id": "507f1f77bcf86cd799439011",
649
+ * "bodyMarkdown": "Customer seems frustrated, escalating to tier 2.",
650
+ * "messageType": "note"
502
651
  * }
503
652
  * ```
504
- */
505
- list(
506
- params: ConversationListParams | null | undefined = {},
507
- options?: RequestOptions,
508
- ): PagePromise<ConversationsCursorPage, Conversation> {
509
- const { 'Featurebase-Version': featurebaseVersion, ...query } = params ?? {};
510
- return this._client.getAPIList('/v2/conversations', CursorPage<Conversation>, {
511
- query,
512
- ...options,
653
+ *
654
+ * ### Example Response
655
+ *
656
+ * ```json
657
+ * {
658
+ * "object": "conversation_part",
659
+ * "id": "3",
660
+ * "partType": "user_msg",
661
+ * "bodyHtml": "<p>Thank you for your help!</p>",
662
+ * "bodyMarkdown": "Thank you for your help!",
663
+ * "author": {
664
+ * "type": "customer",
665
+ * "id": "676f0f6765bdaa7d7d760f88",
666
+ * "name": "John Doe",
667
+ * "email": "john@example.com"
668
+ * },
669
+ * "channel": "desktop",
670
+ * "createdAt": "2025-01-15T10:40:00.000Z",
671
+ * "updatedAt": "2025-01-15T10:40:00.000Z"
672
+ * }
673
+ * ```
674
+ *
675
+ * ### Version Availability
676
+ *
677
+ * This endpoint is only available in API version 2026-01-01.nova and newer.
678
+ *
679
+ * @example
680
+ * ```ts
681
+ * const conversationPart =
682
+ * await client.support.conversations.reply('12345', {
683
+ * bodyMarkdown: 'Thank you for your help!',
684
+ * messageType: 'reply',
685
+ * type: 'contact',
686
+ * });
687
+ * ```
688
+ */
689
+ reply(id: string, params: ConversationReplyParams, options?: RequestOptions): APIPromise<ConversationPart> {
690
+ const { 'Featurebase-Version': featurebaseVersion, ...body } = params;
691
+ return this._client.post(path`/v2/conversations/${id}/reply`, {
692
+ body,
693
+ ...options,
513
694
  headers: buildHeaders([
514
695
  {
515
696
  ...(featurebaseVersion?.toString() != null ?
@@ -522,28 +703,68 @@ export class Conversations extends APIResource {
522
703
  }
523
704
 
524
705
  /**
525
- * Permanently deletes a conversation by its short ID.
706
+ * Redacts a conversation part (message) from a conversation. Redaction permanently
707
+ * removes the message content while preserving the conversation structure.
526
708
  *
527
- * ### Path Parameters
709
+ * Only human message types can be redacted:
528
710
  *
529
- * - `id` - The conversation short ID (numeric)
711
+ * - `user_msg` - Messages from customers/leads
712
+ * - `admin_msg` - Messages from admins
713
+ * - `email_msg` - Email messages
714
+ * - `bot_msg` - Bot messages
715
+ *
716
+ * System-generated conversation parts (assignments, status changes, etc.) cannot
717
+ * be redacted.
718
+ *
719
+ * ### Request Body
720
+ *
721
+ * | Field | Type | Required | Description |
722
+ * | -------------------- | ------ | -------- | ------------------------------------------------------------------------------ |
723
+ * | `type` | string | Yes | The type of item to redact. Currently only `"conversation_part"` is supported. |
724
+ * | `conversationId` | string | Yes | The conversation short ID containing the part to redact |
725
+ * | `conversationPartId` | string | Yes | The conversation part short ID to redact |
726
+ * | `actingAdminId` | string | No | Admin ID performing the action (for attribution) |
530
727
  *
531
728
  * ### Response
532
729
  *
533
- * Returns a deletion confirmation object:
730
+ * Returns the updated conversation object.
731
+ *
732
+ * ### Example Request
733
+ *
734
+ * ```json
735
+ * {
736
+ * "type": "conversation_part",
737
+ * "conversationId": "12345",
738
+ * "conversationPartId": "67890",
739
+ * "actingAdminId": "507f1f77bcf86cd799439011"
740
+ * }
741
+ * ```
742
+ *
743
+ * ### Example Response
534
744
  *
535
745
  * ```json
536
746
  * {
537
- * "id": "12345",
538
747
  * "object": "conversation",
539
- * "deleted": true
748
+ * "id": "12345",
749
+ * "conversationParts": [
750
+ * {
751
+ * "object": "conversation_part",
752
+ * "id": "67890",
753
+ * "partType": "user_msg",
754
+ * "bodyHtml": "",
755
+ * "bodyMarkdown": "",
756
+ * "redacted": true,
757
+ * ...
758
+ * }
759
+ * ],
760
+ * ...
540
761
  * }
541
762
  * ```
542
763
  *
543
- * ### Caution
764
+ * ### Error Cases
544
765
  *
545
- * This operation is **irreversible**. The conversation and all its messages will
546
- * be permanently deleted.
766
+ * - **400 Bad Request** - Only human messages can be redacted
767
+ * - **404 Not Found** - Conversation or conversation part not found
547
768
  *
548
769
  * ### Version Availability
549
770
  *
@@ -552,16 +773,17 @@ export class Conversations extends APIResource {
552
773
  * @example
553
774
  * ```ts
554
775
  * const conversation =
555
- * await client.support.conversations.delete('12345');
776
+ * await client.support.conversations.redact({
777
+ * conversationId: '12345',
778
+ * conversationPartId: '67890',
779
+ * type: 'conversation_part',
780
+ * });
556
781
  * ```
557
782
  */
558
- delete(
559
- id: string,
560
- params: ConversationDeleteParams | null | undefined = {},
561
- options?: RequestOptions,
562
- ): APIPromise<ConversationDeleteResponse> {
563
- const { 'Featurebase-Version': featurebaseVersion } = params ?? {};
564
- return this._client.delete(path`/v2/conversations/${id}`, {
783
+ redact(params: ConversationRedactParams, options?: RequestOptions): APIPromise<Conversation> {
784
+ const { 'Featurebase-Version': featurebaseVersion, ...body } = params;
785
+ return this._client.post('/v2/conversations/redact', {
786
+ body,
565
787
  ...options,
566
788
  headers: buildHeaders([
567
789
  {
@@ -617,7 +839,7 @@ export class Conversations extends APIResource {
617
839
  *
618
840
  * @example
619
841
  * ```ts
620
- * const response =
842
+ * const attachedConversationTag =
621
843
  * await client.support.conversations.attachTag('12345', {
622
844
  * actingAdminId: '507f1f77bcf86cd799439011',
623
845
  * tagId: '67ec1234abcd5678ef901234',
@@ -628,7 +850,7 @@ export class Conversations extends APIResource {
628
850
  id: string,
629
851
  params: ConversationAttachTagParams,
630
852
  options?: RequestOptions,
631
- ): APIPromise<ConversationAttachTagResponse> {
853
+ ): APIPromise<AttachedConversationTag> {
632
854
  const { 'Featurebase-Version': featurebaseVersion, ...body } = params;
633
855
  return this._client.post(path`/v2/conversations/${id}/tags`, {
634
856
  body,
@@ -686,7 +908,7 @@ export class Conversations extends APIResource {
686
908
  *
687
909
  * @example
688
910
  * ```ts
689
- * const response =
911
+ * const attachedConversationTag =
690
912
  * await client.support.conversations.detachTag(
691
913
  * '67ec1234abcd5678ef901234',
692
914
  * {
@@ -700,7 +922,7 @@ export class Conversations extends APIResource {
700
922
  tagID: string,
701
923
  params: ConversationDetachTagParams,
702
924
  options?: RequestOptions,
703
- ): APIPromise<ConversationDetachTagResponse> {
925
+ ): APIPromise<AttachedConversationTag> {
704
926
  const { id, 'Featurebase-Version': featurebaseVersion, ...body } = params;
705
927
  return this._client.delete(path`/v2/conversations/${id}/tags/${tagID}`, {
706
928
  body,
@@ -716,225 +938,6 @@ export class Conversations extends APIResource {
716
938
  });
717
939
  }
718
940
 
719
- /**
720
- * Redacts a conversation part (message) from a conversation. Redaction permanently
721
- * removes the message content while preserving the conversation structure.
722
- *
723
- * Only human message types can be redacted:
724
- *
725
- * - `user_msg` - Messages from customers/leads
726
- * - `admin_msg` - Messages from admins
727
- * - `email_msg` - Email messages
728
- * - `bot_msg` - Bot messages
729
- *
730
- * System-generated conversation parts (assignments, status changes, etc.) cannot
731
- * be redacted.
732
- *
733
- * ### Request Body
734
- *
735
- * | Field | Type | Required | Description |
736
- * | -------------------- | ------ | -------- | ------------------------------------------------------------------------------ |
737
- * | `type` | string | Yes | The type of item to redact. Currently only `"conversation_part"` is supported. |
738
- * | `conversationId` | string | Yes | The conversation short ID containing the part to redact |
739
- * | `conversationPartId` | string | Yes | The conversation part short ID to redact |
740
- * | `actingAdminId` | string | No | Admin ID performing the action (for attribution) |
741
- *
742
- * ### Response
743
- *
744
- * Returns the updated conversation object.
745
- *
746
- * ### Example Request
747
- *
748
- * ```json
749
- * {
750
- * "type": "conversation_part",
751
- * "conversationId": "12345",
752
- * "conversationPartId": "67890",
753
- * "actingAdminId": "507f1f77bcf86cd799439011"
754
- * }
755
- * ```
756
- *
757
- * ### Example Response
758
- *
759
- * ```json
760
- * {
761
- * "object": "conversation",
762
- * "id": "12345",
763
- * "conversationParts": [
764
- * {
765
- * "object": "conversation_part",
766
- * "id": "67890",
767
- * "partType": "user_msg",
768
- * "bodyHtml": "",
769
- * "bodyMarkdown": "",
770
- * "redacted": true,
771
- * ...
772
- * }
773
- * ],
774
- * ...
775
- * }
776
- * ```
777
- *
778
- * ### Error Cases
779
- *
780
- * - **400 Bad Request** - Only human messages can be redacted
781
- * - **404 Not Found** - Conversation or conversation part not found
782
- *
783
- * ### Version Availability
784
- *
785
- * This endpoint is only available in API version 2026-01-01.nova and newer.
786
- *
787
- * @example
788
- * ```ts
789
- * const conversation =
790
- * await client.support.conversations.redact({
791
- * conversationId: '12345',
792
- * conversationPartId: '67890',
793
- * type: 'conversation_part',
794
- * });
795
- * ```
796
- */
797
- redact(params: ConversationRedactParams, options?: RequestOptions): APIPromise<Conversation> {
798
- const { 'Featurebase-Version': featurebaseVersion, ...body } = params;
799
- return this._client.post('/v2/conversations/redact', {
800
- body,
801
- ...options,
802
- headers: buildHeaders([
803
- {
804
- ...(featurebaseVersion?.toString() != null ?
805
- { 'Featurebase-Version': featurebaseVersion?.toString() }
806
- : undefined),
807
- },
808
- options?.headers,
809
- ]),
810
- });
811
- }
812
-
813
- /**
814
- * Adds a reply to an existing conversation. Supports both contact (customer/lead)
815
- * and admin replies.
816
- *
817
- * ### Path Parameters
818
- *
819
- * - `id` - The conversation ID (short ID)
820
- *
821
- * ### Request Body
822
- *
823
- * The request body varies based on who is sending the reply:
824
- *
825
- * #### Contact Reply (customer/lead)
826
- *
827
- * | Field | Type | Required | Description |
828
- * | ------------------- | ------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------- |
829
- * | `type` | string | Yes | Must be "contact" |
830
- * | `userId` | string | No\* | External user ID from your system |
831
- * | `id` | string | No\* | Featurebase contact ID (24-character ObjectId) |
832
- * | `bodyMarkdown` | string | Yes | The message content in markdown format. Images referenced by URL or as base64 data URIs will be automatically uploaded and stored. |
833
- * | `messageType` | string | Yes | Must be "reply" |
834
- * | `skipNotifications` | boolean | No | Skip sending notifications (default: false). Useful for bulk imports. |
835
- *
836
- * \*At least one of `userId` or `id` is required.
837
- *
838
- * #### Admin Reply
839
- *
840
- * | Field | Type | Required | Description |
841
- * | ------------------- | ------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------- |
842
- * | `type` | string | Yes | Must be "admin" |
843
- * | `id` | string | Yes | Featurebase admin ID (24-character ObjectId) |
844
- * | `bodyMarkdown` | string | Yes | The message content in markdown format. Images referenced by URL or as base64 data URIs will be automatically uploaded and stored. |
845
- * | `messageType` | string | Yes | "reply" for customer-visible reply, "note" for internal note |
846
- * | `skipNotifications` | boolean | No | Skip sending notifications (default: false). Useful for bulk imports. |
847
- *
848
- * ### Response
849
- *
850
- * Returns the created conversation part object with a **201 Created** status. The
851
- * response includes both `bodyHtml` (with signed image URLs) and `bodyMarkdown`
852
- * fields.
853
- *
854
- * ### Example Contact Reply
855
- *
856
- * ```json
857
- * {
858
- * "type": "contact",
859
- * "userId": "user_123",
860
- * "bodyMarkdown": "Thank you for your help!",
861
- * "messageType": "reply"
862
- * }
863
- * ```
864
- *
865
- * ### Example Admin Reply
866
- *
867
- * ```json
868
- * {
869
- * "type": "admin",
870
- * "id": "507f1f77bcf86cd799439011",
871
- * "bodyMarkdown": "I'm happy to help! Here's what you need to do...",
872
- * "messageType": "reply"
873
- * }
874
- * ```
875
- *
876
- * ### Example Admin Note (Internal)
877
- *
878
- * ```json
879
- * {
880
- * "type": "admin",
881
- * "id": "507f1f77bcf86cd799439011",
882
- * "bodyMarkdown": "Customer seems frustrated, escalating to tier 2.",
883
- * "messageType": "note"
884
- * }
885
- * ```
886
- *
887
- * ### Example Response
888
- *
889
- * ```json
890
- * {
891
- * "object": "conversation_part",
892
- * "id": "3",
893
- * "partType": "user_msg",
894
- * "bodyHtml": "<p>Thank you for your help!</p>",
895
- * "bodyMarkdown": "Thank you for your help!",
896
- * "author": {
897
- * "type": "customer",
898
- * "id": "676f0f6765bdaa7d7d760f88",
899
- * "name": "John Doe",
900
- * "email": "john@example.com"
901
- * },
902
- * "channel": "desktop",
903
- * "createdAt": "2025-01-15T10:40:00.000Z",
904
- * "updatedAt": "2025-01-15T10:40:00.000Z"
905
- * }
906
- * ```
907
- *
908
- * ### Version Availability
909
- *
910
- * This endpoint is only available in API version 2026-01-01.nova and newer.
911
- *
912
- * @example
913
- * ```ts
914
- * const conversationPart =
915
- * await client.support.conversations.reply('12345', {
916
- * bodyMarkdown: 'Thank you for your help!',
917
- * messageType: 'reply',
918
- * type: 'contact',
919
- * });
920
- * ```
921
- */
922
- reply(id: string, params: ConversationReplyParams, options?: RequestOptions): APIPromise<ConversationPart> {
923
- const { 'Featurebase-Version': featurebaseVersion, ...body } = params;
924
- return this._client.post(path`/v2/conversations/${id}/reply`, {
925
- body,
926
- ...options,
927
- headers: buildHeaders([
928
- {
929
- ...(featurebaseVersion?.toString() != null ?
930
- { 'Featurebase-Version': featurebaseVersion?.toString() }
931
- : undefined),
932
- },
933
- options?.headers,
934
- ]),
935
- });
936
- }
937
-
938
941
  /**
939
942
  * Search conversations with a structured filter AST and an optional full-text
940
943
  * query.
@@ -1059,6 +1062,49 @@ export class Conversations extends APIResource {
1059
1062
 
1060
1063
  export type ConversationsCursorPage = CursorPage<Conversation>;
1061
1064
 
1065
+ export interface AttachedConversationTag {
1066
+ /**
1067
+ * Unique tag identifier
1068
+ */
1069
+ id: string;
1070
+
1071
+ /**
1072
+ * Current tag name
1073
+ */
1074
+ name: string;
1075
+
1076
+ /**
1077
+ * Object type identifier for a tag
1078
+ */
1079
+ type: 'tag';
1080
+
1081
+ /**
1082
+ * ISO timestamp when the tag was applied
1083
+ */
1084
+ appliedAt?: string | null;
1085
+
1086
+ /**
1087
+ * Actor that applied the tag
1088
+ */
1089
+ appliedBy?: ConversationTagMutationActor | null;
1090
+
1091
+ /**
1092
+ * ISO timestamp when the tag was removed, if applicable
1093
+ */
1094
+ removedAt?: string | null;
1095
+
1096
+ /**
1097
+ * Actor that applied the tag
1098
+ */
1099
+ removedBy?: ConversationTagMutationActor | null;
1100
+
1101
+ /**
1102
+ * Reply/message ID used as the deterministic attachment target for this
1103
+ * conversation tag mutation.
1104
+ */
1105
+ targetPartId?: string | null;
1106
+ }
1107
+
1062
1108
  export interface Conversation {
1063
1109
  /**
1064
1110
  * Unique conversation identifier
@@ -1188,6 +1234,19 @@ export interface Conversation {
1188
1234
  */
1189
1235
  csatSummary?: Conversation.CsatSummary;
1190
1236
 
1237
+ /**
1238
+ * Custom conversation attributes keyed by custom attribute ID. Only org-defined,
1239
+ * non-archived conversation attributes are returned; internal workflow metadata is
1240
+ * omitted.
1241
+ */
1242
+ customAttributes?: { [key: string]: unknown };
1243
+
1244
+ /**
1245
+ * Custom conversation attribute values expanded with definition metadata. Returned
1246
+ * only when `include=customAttributeDefinitions` is provided.
1247
+ */
1248
+ customAttributeValues?: Array<ConversationAttributeValue>;
1249
+
1191
1250
  /**
1192
1251
  * Whether customer replies are disabled
1193
1252
  */
@@ -1203,7 +1262,7 @@ export interface Conversation {
1203
1262
  */
1204
1263
  readReceipts?: Array<Conversation.ReadReceipt>;
1205
1264
 
1206
- source?: Conversation.Source;
1265
+ source?: MessageSource;
1207
1266
 
1208
1267
  /**
1209
1268
  * Conversation title
@@ -1237,13 +1296,16 @@ export namespace Conversation {
1237
1296
  * ISO timestamp when first-time submissions stop being accepted
1238
1297
  */
1239
1298
  lateSubmitWindowEndsAt?: string;
1299
+
1300
+ slackDelivery?: ConversationsAPI.CsatSlackDelivery;
1240
1301
  }
1241
1302
 
1242
1303
  export interface CsatHistory {
1243
1304
  /**
1244
- * Channel used for the CSAT request
1305
+ * Channel used for the CSAT request. `desktop` = web messenger, `email` =
1306
+ * follow-up email, `slack` = Block Kit prompt in the conversation thread.
1245
1307
  */
1246
- channel: 'desktop' | 'email';
1308
+ channel: 'desktop' | 'email' | 'slack';
1247
1309
 
1248
1310
  /**
1249
1311
  * Whether this row represents the currently effective CSAT request for the
@@ -1315,6 +1377,8 @@ export namespace Conversation {
1315
1377
  */
1316
1378
  score?: number;
1317
1379
 
1380
+ slackDelivery?: ConversationsAPI.CsatSlackDelivery;
1381
+
1318
1382
  workflow?: ConversationsAPI.CsatWorkflowLink;
1319
1383
  }
1320
1384
 
@@ -1341,7 +1405,7 @@ export namespace Conversation {
1341
1405
  /**
1342
1406
  * Channel used for the latest CSAT request when known
1343
1407
  */
1344
- channel?: 'desktop' | 'email';
1408
+ channel?: 'desktop' | 'email' | 'slack';
1345
1409
 
1346
1410
  /**
1347
1411
  * ISO timestamp when the request expired
@@ -1402,40 +1466,43 @@ export namespace Conversation {
1402
1466
  */
1403
1467
  userType: 'admin' | 'customer' | 'lead';
1404
1468
  }
1469
+ }
1405
1470
 
1406
- export interface Source {
1407
- /**
1408
- * Body of the initial message as HTML with signed image URLs
1409
- */
1410
- bodyHtml: string;
1471
+ export interface ConversationAttributeValue {
1472
+ /**
1473
+ * Stable machine identifier used as the key in conversation.customAttributes.
1474
+ */
1475
+ id: string;
1411
1476
 
1412
- /**
1413
- * Body of the initial message as markdown
1414
- */
1415
- bodyMarkdown: string;
1477
+ /**
1478
+ * Storage-level data type used for validation and search.
1479
+ */
1480
+ dataType: 'string' | 'number' | 'boolean' | 'date' | 'array' | 'object';
1416
1481
 
1417
- /**
1418
- * Channel through which the conversation was initiated
1419
- */
1420
- channel: 'unknown' | 'desktop' | 'android' | 'ios' | 'email';
1482
+ /**
1483
+ * Conversation field subtype that controls the expected value shape.
1484
+ */
1485
+ fieldSubType: 'text' | 'number' | 'select' | 'multi-select' | 'checkbox' | 'date';
1421
1486
 
1422
- author?: ConversationsAPI.ConversationParticipant;
1487
+ /**
1488
+ * Stable internal identifier for the attribute definition.
1489
+ */
1490
+ identifier: string;
1423
1491
 
1424
- /**
1425
- * How the conversation was initiated
1426
- */
1427
- deliveredAs?: 'customer_initiated' | 'admin_initiated';
1492
+ /**
1493
+ * Human-readable attribute name shown in Featurebase.
1494
+ */
1495
+ name: string;
1428
1496
 
1429
- /**
1430
- * Subject line for email conversations
1431
- */
1432
- subject?: string;
1497
+ /**
1498
+ * Allowed values for select and multi-select attributes.
1499
+ */
1500
+ options?: Array<ConversationAttributesAPI.ConversationAttributeOption>;
1433
1501
 
1434
- /**
1435
- * URL where the conversation was initiated
1436
- */
1437
- url?: string;
1438
- }
1502
+ /**
1503
+ * The conversation-specific custom attribute value.
1504
+ */
1505
+ value?: unknown;
1439
1506
  }
1440
1507
 
1441
1508
  /**
@@ -1483,7 +1550,7 @@ export namespace ConversationPart {
1483
1550
  /**
1484
1551
  * Channel through which the message was sent
1485
1552
  */
1486
- channel: 'unknown' | 'desktop' | 'android' | 'ios' | 'email';
1553
+ channel: 'unknown' | 'desktop' | 'android' | 'ios' | 'email' | 'slack';
1487
1554
 
1488
1555
  /**
1489
1556
  * ISO timestamp when the part was created
@@ -1512,6 +1579,12 @@ export namespace ConversationPart {
1512
1579
  */
1513
1580
  redacted?: boolean;
1514
1581
 
1582
+ /**
1583
+ * Safe Slack message identifiers. Only present for Slack-backed messages while the
1584
+ * organization has Slack integration enabled.
1585
+ */
1586
+ slack?: ConversationsAPI.SlackMessageDetails;
1587
+
1515
1588
  /**
1516
1589
  * Reply-level tag applications and provenance for this conversation part
1517
1590
  */
@@ -1540,7 +1613,7 @@ export namespace ConversationPart {
1540
1613
  /**
1541
1614
  * Channel through which the message was sent
1542
1615
  */
1543
- channel: 'unknown' | 'desktop' | 'android' | 'ios' | 'email';
1616
+ channel: 'unknown' | 'desktop' | 'android' | 'ios' | 'email' | 'slack';
1544
1617
 
1545
1618
  /**
1546
1619
  * ISO timestamp when the part was created
@@ -1569,6 +1642,12 @@ export namespace ConversationPart {
1569
1642
  */
1570
1643
  redacted?: boolean;
1571
1644
 
1645
+ /**
1646
+ * Safe Slack message identifiers. Only present for Slack-backed messages while the
1647
+ * organization has Slack integration enabled.
1648
+ */
1649
+ slack?: ConversationsAPI.SlackMessageDetails;
1650
+
1572
1651
  /**
1573
1652
  * Reply-level tag applications and provenance for this conversation part
1574
1653
  */
@@ -1728,13 +1807,19 @@ export namespace ConversationPart {
1728
1807
  /**
1729
1808
  * Channel through which the message was sent
1730
1809
  */
1731
- channel?: 'unknown' | 'desktop' | 'android' | 'ios' | 'email';
1810
+ channel?: 'unknown' | 'desktop' | 'android' | 'ios' | 'email' | 'slack';
1732
1811
 
1733
1812
  /**
1734
1813
  * Whether this message has been redacted
1735
1814
  */
1736
1815
  redacted?: boolean;
1737
1816
 
1817
+ /**
1818
+ * Safe Slack message identifiers. Only present for Slack-backed messages while the
1819
+ * organization has Slack integration enabled.
1820
+ */
1821
+ slack?: ConversationsAPI.SlackMessageDetails;
1822
+
1738
1823
  /**
1739
1824
  * Reply-level tag applications and provenance for this conversation part
1740
1825
  */
@@ -1900,9 +1985,10 @@ export namespace ConversationPart {
1900
1985
  */
1901
1986
  export interface Csat {
1902
1987
  /**
1903
- * Channel used for the CSAT request
1988
+ * Channel used for the CSAT request. `desktop` = web messenger, `email` =
1989
+ * follow-up email, `slack` = Block Kit prompt in the conversation thread.
1904
1990
  */
1905
- channel: 'desktop' | 'email';
1991
+ channel: 'desktop' | 'email' | 'slack';
1906
1992
 
1907
1993
  /**
1908
1994
  * ISO timestamp when the request was created
@@ -1986,9 +2072,10 @@ export namespace ConversationPart {
1986
2072
  */
1987
2073
  export interface Csat {
1988
2074
  /**
1989
- * Channel used for the CSAT request
2075
+ * Channel used for the CSAT request. `desktop` = web messenger, `email` =
2076
+ * follow-up email, `slack` = Block Kit prompt in the conversation thread.
1990
2077
  */
1991
- channel: 'desktop' | 'email';
2078
+ channel: 'desktop' | 'email' | 'slack';
1992
2079
 
1993
2080
  /**
1994
2081
  * ISO timestamp when the customer submitted the rating
@@ -2276,39 +2363,17 @@ export namespace ConversationPart {
2276
2363
  /**
2277
2364
  * Actor that applied the tag
2278
2365
  */
2279
- actor?: TagUpdate.Actor;
2366
+ actor?: ConversationsAPI.ConversationTagMutationActor;
2280
2367
 
2281
- /**
2282
- * Tag name at the time of the event or the best available current display name
2283
- */
2284
- tagName?: string | null;
2285
-
2286
- /**
2287
- * Conversation part that the tag mutation targeted
2288
- */
2289
- targetPartId?: string | null;
2290
- }
2291
-
2292
- export namespace TagUpdate {
2293
- /**
2294
- * Actor that applied the tag
2295
- */
2296
- export interface Actor {
2297
- /**
2298
- * Actor that caused the tag mutation
2299
- */
2300
- type: 'admin' | 'customer' | 'lead' | 'bot' | 'integration' | 'system' | 'workflow';
2301
-
2302
- /**
2303
- * Actor identifier when available
2304
- */
2305
- id?: string | null;
2368
+ /**
2369
+ * Tag name at the time of the event or the best available current display name
2370
+ */
2371
+ tagName?: string | null;
2306
2372
 
2307
- /**
2308
- * Actor display name when available
2309
- */
2310
- name?: string | null;
2311
- }
2373
+ /**
2374
+ * Conversation part that the tag mutation targeted
2375
+ */
2376
+ targetPartId?: string | null;
2312
2377
  }
2313
2378
 
2314
2379
  /**
@@ -2525,7 +2590,7 @@ export interface ConversationTagApplication {
2525
2590
  /**
2526
2591
  * Actor that applied the tag
2527
2592
  */
2528
- appliedBy?: ConversationTagApplication.AppliedBy;
2593
+ appliedBy?: ConversationTagMutationActor;
2529
2594
 
2530
2595
  /**
2531
2596
  * ISO timestamp when the tag was removed from this reply, if it was removed
@@ -2535,7 +2600,7 @@ export interface ConversationTagApplication {
2535
2600
  /**
2536
2601
  * Actor that applied the tag
2537
2602
  */
2538
- removedBy?: ConversationTagApplication.RemovedBy;
2603
+ removedBy?: ConversationTagMutationActor;
2539
2604
 
2540
2605
  /**
2541
2606
  * Resolved tag object when the tag still exists in the shared workspace catalog
@@ -2543,46 +2608,24 @@ export interface ConversationTagApplication {
2543
2608
  tag?: ConversationTagsAPI.ConversationTag;
2544
2609
  }
2545
2610
 
2546
- export namespace ConversationTagApplication {
2611
+ /**
2612
+ * Actor that applied the tag
2613
+ */
2614
+ export interface ConversationTagMutationActor {
2547
2615
  /**
2548
- * Actor that applied the tag
2616
+ * Actor that caused the tag mutation
2549
2617
  */
2550
- export interface AppliedBy {
2551
- /**
2552
- * Actor that caused the tag mutation
2553
- */
2554
- type: 'admin' | 'customer' | 'lead' | 'bot' | 'integration' | 'system' | 'workflow';
2555
-
2556
- /**
2557
- * Actor identifier when available
2558
- */
2559
- id?: string | null;
2560
-
2561
- /**
2562
- * Actor display name when available
2563
- */
2564
- name?: string | null;
2565
- }
2618
+ type: 'admin' | 'customer' | 'lead' | 'bot' | 'integration' | 'system' | 'workflow';
2566
2619
 
2567
2620
  /**
2568
- * Actor that applied the tag
2621
+ * Actor identifier when available
2569
2622
  */
2570
- export interface RemovedBy {
2571
- /**
2572
- * Actor that caused the tag mutation
2573
- */
2574
- type: 'admin' | 'customer' | 'lead' | 'bot' | 'integration' | 'system' | 'workflow';
2575
-
2576
- /**
2577
- * Actor identifier when available
2578
- */
2579
- id?: string | null;
2623
+ id?: string | null;
2580
2624
 
2581
- /**
2582
- * Actor display name when available
2583
- */
2584
- name?: string | null;
2585
- }
2625
+ /**
2626
+ * Actor display name when available
2627
+ */
2628
+ name?: string | null;
2586
2629
  }
2587
2630
 
2588
2631
  export interface CsatEmailDelivery {
@@ -2624,6 +2667,44 @@ export interface CsatRatedAgent {
2624
2667
  id?: string;
2625
2668
  }
2626
2669
 
2670
+ export interface CsatSlackDelivery {
2671
+ /**
2672
+ * Slack Block Kit prompt delivery status for the CSAT request when the channel is
2673
+ * Slack
2674
+ */
2675
+ status: 'pending' | 'posted' | 'failed';
2676
+
2677
+ /**
2678
+ * Slack channel id the CSAT prompt was posted to
2679
+ */
2680
+ channelId?: string;
2681
+
2682
+ /**
2683
+ * ISO timestamp when posting the CSAT prompt to Slack failed
2684
+ */
2685
+ failedAt?: string;
2686
+
2687
+ /**
2688
+ * Operational failure reason for the Slack CSAT prompt delivery
2689
+ */
2690
+ failureReason?: string;
2691
+
2692
+ /**
2693
+ * Slack message timestamp of the posted CSAT prompt
2694
+ */
2695
+ messageTs?: string;
2696
+
2697
+ /**
2698
+ * ISO timestamp when the CSAT prompt was enqueued for Slack
2699
+ */
2700
+ postedAt?: string;
2701
+
2702
+ /**
2703
+ * Slack workspace (team) the CSAT prompt was posted to
2704
+ */
2705
+ teamId?: string;
2706
+ }
2707
+
2627
2708
  export interface CsatWorkflowLink {
2628
2709
  /**
2629
2710
  * Workflow action ID associated with the CSAT request
@@ -2661,191 +2742,160 @@ export interface EmailRecipients {
2661
2742
  ids?: Array<string>;
2662
2743
  }
2663
2744
 
2664
- export interface ConversationDeleteResponse {
2665
- /**
2666
- * Unique identifier of the deleted conversation
2667
- */
2668
- id: string;
2669
-
2670
- /**
2671
- * Indicates the resource was deleted
2672
- */
2673
- deleted: true;
2674
-
2675
- /**
2676
- * Object type identifier
2677
- */
2678
- object: 'conversation';
2679
- }
2680
-
2681
- export interface ConversationAttachTagResponse {
2745
+ export interface MessageSource {
2682
2746
  /**
2683
- * Unique tag identifier
2747
+ * Body of the initial message as HTML with signed image URLs
2684
2748
  */
2685
- id: string;
2749
+ bodyHtml: string;
2686
2750
 
2687
2751
  /**
2688
- * Current tag name
2752
+ * Body of the initial message as markdown
2689
2753
  */
2690
- name: string;
2754
+ bodyMarkdown: string;
2691
2755
 
2692
2756
  /**
2693
- * Object type identifier for a tag
2757
+ * Channel through which the conversation was initiated
2694
2758
  */
2695
- type: 'tag';
2759
+ channel: 'unknown' | 'desktop' | 'android' | 'ios' | 'email' | 'slack';
2696
2760
 
2697
- /**
2698
- * ISO timestamp when the tag was applied
2699
- */
2700
- appliedAt?: string | null;
2761
+ author?: ConversationParticipant;
2701
2762
 
2702
2763
  /**
2703
- * Actor that applied the tag
2764
+ * How the conversation was initiated
2704
2765
  */
2705
- appliedBy?: ConversationAttachTagResponse.AppliedBy | null;
2766
+ deliveredAs?: 'customer_initiated' | 'admin_initiated';
2706
2767
 
2707
2768
  /**
2708
- * ISO timestamp when the tag was removed, if applicable
2769
+ * Safe Slack thread identifiers. Only present for Slack-origin conversations while
2770
+ * the organization has Slack integration enabled.
2709
2771
  */
2710
- removedAt?: string | null;
2772
+ slack?: MessageSource.Slack;
2711
2773
 
2712
2774
  /**
2713
- * Actor that applied the tag
2775
+ * Subject line for email conversations
2714
2776
  */
2715
- removedBy?: ConversationAttachTagResponse.RemovedBy | null;
2777
+ subject?: string;
2716
2778
 
2717
2779
  /**
2718
- * Reply/message ID used as the deterministic attachment target for this
2719
- * conversation tag mutation.
2780
+ * URL where the conversation was initiated
2720
2781
  */
2721
- targetPartId?: string | null;
2782
+ url?: string;
2722
2783
  }
2723
2784
 
2724
- export namespace ConversationAttachTagResponse {
2785
+ export namespace MessageSource {
2725
2786
  /**
2726
- * Actor that applied the tag
2787
+ * Safe Slack thread identifiers. Only present for Slack-origin conversations while
2788
+ * the organization has Slack integration enabled.
2727
2789
  */
2728
- export interface AppliedBy {
2790
+ export interface Slack {
2729
2791
  /**
2730
- * Actor that caused the tag mutation
2792
+ * Slack channel ID for the thread
2731
2793
  */
2732
- type: 'admin' | 'customer' | 'lead' | 'bot' | 'integration' | 'system' | 'workflow';
2794
+ channelId: string;
2733
2795
 
2734
2796
  /**
2735
- * Actor identifier when available
2797
+ * Slack workspace/team ID for the thread
2736
2798
  */
2737
- id?: string | null;
2799
+ teamId: string;
2738
2800
 
2739
2801
  /**
2740
- * Actor display name when available
2802
+ * Slack root thread timestamp
2741
2803
  */
2742
- name?: string | null;
2804
+ threadTs: string;
2743
2805
  }
2806
+ }
2744
2807
 
2808
+ /**
2809
+ * The customer or lead the conversation is with. Use this for the row identity;
2810
+ * use `matchingPartAuthor` if you specifically want the message author.
2811
+ */
2812
+ export interface SearchMatchingPartAuthor {
2745
2813
  /**
2746
- * Actor that applied the tag
2814
+ * Author id
2747
2815
  */
2748
- export interface RemovedBy {
2749
- /**
2750
- * Actor that caused the tag mutation
2751
- */
2752
- type: 'admin' | 'customer' | 'lead' | 'bot' | 'integration' | 'system' | 'workflow';
2753
-
2754
- /**
2755
- * Actor identifier when available
2756
- */
2757
- id?: string | null;
2816
+ id: string;
2758
2817
 
2759
- /**
2760
- * Actor display name when available
2761
- */
2762
- name?: string | null;
2763
- }
2764
- }
2818
+ /**
2819
+ * Author type
2820
+ */
2821
+ type: 'admin' | 'customer' | 'lead' | 'bot' | 'guest' | 'integration';
2765
2822
 
2766
- export interface ConversationDetachTagResponse {
2767
2823
  /**
2768
- * Unique tag identifier
2824
+ * Companies the author belongs to (customers only)
2769
2825
  */
2770
- id: string;
2826
+ companies?: Array<SearchMatchingPartAuthor.Company>;
2771
2827
 
2772
2828
  /**
2773
- * Current tag name
2829
+ * Email when known
2774
2830
  */
2775
- name: string;
2831
+ email?: string | null;
2776
2832
 
2777
2833
  /**
2778
- * Object type identifier for a tag
2834
+ * Display name when known
2779
2835
  */
2780
- type: 'tag';
2836
+ name?: string | null;
2781
2837
 
2782
2838
  /**
2783
- * ISO timestamp when the tag was applied
2839
+ * Profile picture URL when known
2784
2840
  */
2785
- appliedAt?: string | null;
2841
+ profilePicture?: string | null;
2842
+ }
2843
+
2844
+ export namespace SearchMatchingPartAuthor {
2845
+ export interface Company {
2846
+ /**
2847
+ * Company id
2848
+ */
2849
+ id: string;
2850
+
2851
+ /**
2852
+ * Company name
2853
+ */
2854
+ name?: string;
2855
+ }
2856
+ }
2786
2857
 
2858
+ /**
2859
+ * Safe Slack message identifiers. Only present for Slack-backed messages while the
2860
+ * organization has Slack integration enabled.
2861
+ */
2862
+ export interface SlackMessageDetails {
2787
2863
  /**
2788
- * Actor that applied the tag
2864
+ * Slack channel ID for the message
2789
2865
  */
2790
- appliedBy?: ConversationDetachTagResponse.AppliedBy | null;
2866
+ channelId: string;
2791
2867
 
2792
2868
  /**
2793
- * ISO timestamp when the tag was removed, if applicable
2869
+ * Slack message timestamp
2794
2870
  */
2795
- removedAt?: string | null;
2871
+ messageTs: string;
2796
2872
 
2797
2873
  /**
2798
- * Actor that applied the tag
2874
+ * Slack workspace/team ID for the message
2799
2875
  */
2800
- removedBy?: ConversationDetachTagResponse.RemovedBy | null;
2876
+ teamId: string;
2801
2877
 
2802
2878
  /**
2803
- * Reply/message ID used as the deterministic attachment target for this
2804
- * conversation tag mutation.
2879
+ * Slack root thread timestamp when this message belongs to a thread
2805
2880
  */
2806
- targetPartId?: string | null;
2881
+ threadTs?: string;
2807
2882
  }
2808
2883
 
2809
- export namespace ConversationDetachTagResponse {
2884
+ export interface ConversationDeleteResponse {
2810
2885
  /**
2811
- * Actor that applied the tag
2886
+ * Unique identifier of the deleted conversation
2812
2887
  */
2813
- export interface AppliedBy {
2814
- /**
2815
- * Actor that caused the tag mutation
2816
- */
2817
- type: 'admin' | 'customer' | 'lead' | 'bot' | 'integration' | 'system' | 'workflow';
2818
-
2819
- /**
2820
- * Actor identifier when available
2821
- */
2822
- id?: string | null;
2823
-
2824
- /**
2825
- * Actor display name when available
2826
- */
2827
- name?: string | null;
2828
- }
2888
+ id: string;
2829
2889
 
2830
2890
  /**
2831
- * Actor that applied the tag
2891
+ * Indicates the resource was deleted
2832
2892
  */
2833
- export interface RemovedBy {
2834
- /**
2835
- * Actor that caused the tag mutation
2836
- */
2837
- type: 'admin' | 'customer' | 'lead' | 'bot' | 'integration' | 'system' | 'workflow';
2838
-
2839
- /**
2840
- * Actor identifier when available
2841
- */
2842
- id?: string | null;
2893
+ deleted: true;
2843
2894
 
2844
- /**
2845
- * Actor display name when available
2846
- */
2847
- name?: string | null;
2848
- }
2895
+ /**
2896
+ * Object type identifier
2897
+ */
2898
+ object: 'conversation';
2849
2899
  }
2850
2900
 
2851
2901
  export interface ConversationSearchResponse {
@@ -2954,7 +3004,20 @@ export namespace ConversationSearchResponse {
2954
3004
  * The customer or lead the conversation is with. Use this for the row identity;
2955
3005
  * use `matchingPartAuthor` if you specifically want the message author.
2956
3006
  */
2957
- conversationUser?: Data.ConversationUser | null;
3007
+ conversationUser?: ConversationsAPI.SearchMatchingPartAuthor | null;
3008
+
3009
+ /**
3010
+ * Custom conversation attributes keyed by custom attribute ID. Only org-defined,
3011
+ * non-archived conversation attributes are returned; internal workflow metadata is
3012
+ * omitted.
3013
+ */
3014
+ customAttributes?: { [key: string]: unknown };
3015
+
3016
+ /**
3017
+ * Custom conversation attribute values expanded with definition metadata. Returned
3018
+ * only when `include=customAttributeDefinitions` is provided.
3019
+ */
3020
+ customAttributeValues?: Array<ConversationsAPI.ConversationAttributeValue>;
2958
3021
 
2959
3022
  /**
2960
3023
  * Plain-text / markdown preview of the matching conversation part body (search
@@ -2972,7 +3035,7 @@ export namespace ConversationSearchResponse {
2972
3035
  * The customer or lead the conversation is with. Use this for the row identity;
2973
3036
  * use `matchingPartAuthor` if you specifically want the message author.
2974
3037
  */
2975
- matchingPartAuthor?: Data.MatchingPartAuthor | null;
3038
+ matchingPartAuthor?: ConversationsAPI.SearchMatchingPartAuthor | null;
2976
3039
 
2977
3040
  /**
2978
3041
  * Aggregate relevance score for the conversation (search mode only). Higher is
@@ -2980,7 +3043,7 @@ export namespace ConversationSearchResponse {
2980
3043
  */
2981
3044
  relevanceScore?: number | null;
2982
3045
 
2983
- source?: Data.Source;
3046
+ source?: ConversationsAPI.MessageSource;
2984
3047
 
2985
3048
  /**
2986
3049
  * Window of conversation messages around the matching part for lightweight context
@@ -2999,147 +3062,25 @@ export namespace ConversationSearchResponse {
2999
3062
  }
3000
3063
 
3001
3064
  export namespace Data {
3002
- /**
3003
- * The customer or lead the conversation is with. Use this for the row identity;
3004
- * use `matchingPartAuthor` if you specifically want the message author.
3005
- */
3006
- export interface ConversationUser {
3007
- /**
3008
- * Author id
3009
- */
3010
- id: string;
3011
-
3012
- /**
3013
- * Author type
3014
- */
3015
- type: 'admin' | 'customer' | 'lead' | 'bot' | 'guest' | 'integration';
3016
-
3017
- /**
3018
- * Companies the author belongs to (customers only)
3019
- */
3020
- companies?: Array<ConversationUser.Company>;
3021
-
3022
- /**
3023
- * Email when known
3024
- */
3025
- email?: string | null;
3026
-
3027
- /**
3028
- * Display name when known
3029
- */
3030
- name?: string | null;
3031
-
3032
- /**
3033
- * Profile picture URL when known
3034
- */
3035
- profilePicture?: string | null;
3036
- }
3037
-
3038
- export namespace ConversationUser {
3039
- export interface Company {
3040
- id: string;
3041
-
3042
- name?: string;
3043
- }
3044
- }
3045
-
3046
3065
  /**
3047
3066
  * Reference to the conversation part that best matched the search query (search
3048
3067
  * mode only)
3049
3068
  */
3050
- export interface MatchingPart {
3051
- /**
3052
- * Conversation part id
3053
- */
3054
- id: string;
3055
-
3056
- /**
3057
- * ISO timestamp when the matching part was created
3058
- */
3059
- createdAt?: string | null;
3060
-
3061
- /**
3062
- * Conversation part type
3063
- */
3064
- partType?: string;
3065
- }
3066
-
3067
- /**
3068
- * The customer or lead the conversation is with. Use this for the row identity;
3069
- * use `matchingPartAuthor` if you specifically want the message author.
3070
- */
3071
- export interface MatchingPartAuthor {
3072
- /**
3073
- * Author id
3074
- */
3075
- id: string;
3076
-
3077
- /**
3078
- * Author type
3079
- */
3080
- type: 'admin' | 'customer' | 'lead' | 'bot' | 'guest' | 'integration';
3081
-
3082
- /**
3083
- * Companies the author belongs to (customers only)
3084
- */
3085
- companies?: Array<MatchingPartAuthor.Company>;
3086
-
3087
- /**
3088
- * Email when known
3089
- */
3090
- email?: string | null;
3091
-
3092
- /**
3093
- * Display name when known
3094
- */
3095
- name?: string | null;
3096
-
3097
- /**
3098
- * Profile picture URL when known
3099
- */
3100
- profilePicture?: string | null;
3101
- }
3102
-
3103
- export namespace MatchingPartAuthor {
3104
- export interface Company {
3105
- id: string;
3106
-
3107
- name?: string;
3108
- }
3109
- }
3110
-
3111
- export interface Source {
3112
- /**
3113
- * Body of the initial message as HTML with signed image URLs
3114
- */
3115
- bodyHtml: string;
3116
-
3117
- /**
3118
- * Body of the initial message as markdown
3119
- */
3120
- bodyMarkdown: string;
3121
-
3122
- /**
3123
- * Channel through which the conversation was initiated
3124
- */
3125
- channel: 'unknown' | 'desktop' | 'android' | 'ios' | 'email';
3126
-
3127
- author?: ConversationsAPI.ConversationParticipant;
3128
-
3069
+ export interface MatchingPart {
3129
3070
  /**
3130
- * How the conversation was initiated
3071
+ * Conversation part id
3131
3072
  */
3132
- deliveredAs?: 'customer_initiated' | 'admin_initiated';
3073
+ id: string;
3133
3074
 
3134
3075
  /**
3135
- * Subject line for email conversations
3076
+ * ISO timestamp when the matching part was created
3136
3077
  */
3137
- subject?: string;
3078
+ createdAt?: string | null;
3138
3079
 
3139
3080
  /**
3140
- * URL where the conversation was initiated
3081
+ * Conversation part type
3141
3082
  */
3142
- url?: string;
3083
+ partType?: string;
3143
3084
  }
3144
3085
 
3145
3086
  export interface SurroundingConversationPart {
@@ -3162,7 +3103,7 @@ export namespace ConversationSearchResponse {
3162
3103
  * The customer or lead the conversation is with. Use this for the row identity;
3163
3104
  * use `matchingPartAuthor` if you specifically want the message author.
3164
3105
  */
3165
- author?: SurroundingConversationPart.Author | null;
3106
+ author?: ConversationsAPI.SearchMatchingPartAuthor | null;
3166
3107
 
3167
3108
  /**
3168
3109
  * ISO timestamp when the part was created
@@ -3174,53 +3115,28 @@ export namespace ConversationSearchResponse {
3174
3115
  */
3175
3116
  partType?: string;
3176
3117
  }
3118
+ }
3119
+ }
3177
3120
 
3178
- export namespace SurroundingConversationPart {
3179
- /**
3180
- * The customer or lead the conversation is with. Use this for the row identity;
3181
- * use `matchingPartAuthor` if you specifically want the message author.
3182
- */
3183
- export interface Author {
3184
- /**
3185
- * Author id
3186
- */
3187
- id: string;
3188
-
3189
- /**
3190
- * Author type
3191
- */
3192
- type: 'admin' | 'customer' | 'lead' | 'bot' | 'guest' | 'integration';
3193
-
3194
- /**
3195
- * Companies the author belongs to (customers only)
3196
- */
3197
- companies?: Array<Author.Company>;
3198
-
3199
- /**
3200
- * Email when known
3201
- */
3202
- email?: string | null;
3203
-
3204
- /**
3205
- * Display name when known
3206
- */
3207
- name?: string | null;
3208
-
3209
- /**
3210
- * Profile picture URL when known
3211
- */
3212
- profilePicture?: string | null;
3213
- }
3121
+ export interface ConversationListParams extends CursorPageParams {
3122
+ /**
3123
+ * Query param: Comma-separated optional expansions. Use
3124
+ * `customAttributeDefinitions` to return `customAttributeValues` with names and
3125
+ * types alongside ID-keyed `customAttributes`.
3126
+ */
3127
+ include?: string | Array<string>;
3214
3128
 
3215
- export namespace Author {
3216
- export interface Company {
3217
- id: string;
3129
+ /**
3130
+ * Query param: Filter conversations by one or more tag IDs using a comma-separated
3131
+ * list. Conversations must contain all provided tags.
3132
+ */
3133
+ tagIds?: string | Array<string>;
3218
3134
 
3219
- name?: string;
3220
- }
3221
- }
3222
- }
3223
- }
3135
+ /**
3136
+ * Header param: API version for this request. Defaults to your organization's
3137
+ * configured API version if not specified.
3138
+ */
3139
+ 'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
3224
3140
  }
3225
3141
 
3226
3142
  export interface ConversationCreateParams {
@@ -3323,6 +3239,21 @@ export namespace ConversationCreateParams {
3323
3239
  }
3324
3240
 
3325
3241
  export interface ConversationRetrieveParams {
3242
+ /**
3243
+ * Query param: Comma-separated optional expansions. Use
3244
+ * `customAttributeDefinitions` to return `customAttributeValues` with names and
3245
+ * types alongside ID-keyed `customAttributes`.
3246
+ */
3247
+ include?: string | Array<string>;
3248
+
3249
+ /**
3250
+ * Header param: API version for this request. Defaults to your organization's
3251
+ * configured API version if not specified.
3252
+ */
3253
+ 'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
3254
+ }
3255
+
3256
+ export interface ConversationDeleteParams {
3326
3257
  /**
3327
3258
  * API version for this request. Defaults to your organization's configured API
3328
3259
  * version if not specified.
@@ -3344,8 +3275,9 @@ export interface ConversationUpdateParams {
3344
3275
  adminAssigneeId?: string | null;
3345
3276
 
3346
3277
  /**
3347
- * Body param: Custom attributes to set on the conversation. Uses the same
3348
- * validation as v1 API.
3278
+ * Body param: Custom attributes to set on the conversation, keyed by conversation
3279
+ * custom attribute ID. Use the custom attribute definitions for your organization
3280
+ * to map IDs to display names.
3349
3281
  */
3350
3282
  customAttributes?: { [key: string]: unknown };
3351
3283
 
@@ -3413,96 +3345,6 @@ export namespace ConversationUpdateParams {
3413
3345
  }
3414
3346
  }
3415
3347
 
3416
- export interface ConversationListParams extends CursorPageParams {
3417
- /**
3418
- * Query param: Filter conversations by one or more tag IDs using a comma-separated
3419
- * list. Conversations must contain all provided tags.
3420
- */
3421
- tagIds?: string | Array<string>;
3422
-
3423
- /**
3424
- * Header param: API version for this request. Defaults to your organization's
3425
- * configured API version if not specified.
3426
- */
3427
- 'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
3428
- }
3429
-
3430
- export interface ConversationDeleteParams {
3431
- /**
3432
- * API version for this request. Defaults to your organization's configured API
3433
- * version if not specified.
3434
- */
3435
- 'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
3436
- }
3437
-
3438
- export interface ConversationAttachTagParams {
3439
- /**
3440
- * Body param: Required admin ID performing this tag attachment. Must be a member
3441
- * of the organization so the mutation can be attributed to a real admin actor.
3442
- */
3443
- actingAdminId: string;
3444
-
3445
- /**
3446
- * Body param: The Featurebase tag ID to attach to the conversation.
3447
- */
3448
- tagId: string;
3449
-
3450
- /**
3451
- * Header param: API version for this request. Defaults to your organization's
3452
- * configured API version if not specified.
3453
- */
3454
- 'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
3455
- }
3456
-
3457
- export interface ConversationDetachTagParams {
3458
- /**
3459
- * Path param: Conversation ID (short ID)
3460
- */
3461
- id: string;
3462
-
3463
- /**
3464
- * Body param: Required admin ID performing this tag removal. Must be a member of
3465
- * the organization so the mutation can be attributed to a real admin actor.
3466
- */
3467
- actingAdminId: string;
3468
-
3469
- /**
3470
- * Header param: API version for this request. Defaults to your organization's
3471
- * configured API version if not specified.
3472
- */
3473
- 'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
3474
- }
3475
-
3476
- export interface ConversationRedactParams {
3477
- /**
3478
- * Body param: The conversation short ID that contains the part to redact
3479
- */
3480
- conversationId: string;
3481
-
3482
- /**
3483
- * Body param: The conversation part short ID to redact
3484
- */
3485
- conversationPartId: string;
3486
-
3487
- /**
3488
- * Body param: The type of item to redact. Currently only "conversation_part" is
3489
- * supported.
3490
- */
3491
- type: 'conversation_part';
3492
-
3493
- /**
3494
- * Body param: The admin ID performing this action. If not provided, changes are
3495
- * attributed to the system bot user.
3496
- */
3497
- actingAdminId?: string;
3498
-
3499
- /**
3500
- * Header param: API version for this request. Defaults to your organization's
3501
- * configured API version if not specified.
3502
- */
3503
- 'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
3504
- }
3505
-
3506
3348
  export type ConversationReplyParams =
3507
3349
  | ConversationReplyParams.ContactReplyBody
3508
3350
  | ConversationReplyParams.AdminReplyBody;
@@ -3587,6 +3429,74 @@ export declare namespace ConversationReplyParams {
3587
3429
  }
3588
3430
  }
3589
3431
 
3432
+ export interface ConversationRedactParams {
3433
+ /**
3434
+ * Body param: The conversation short ID that contains the part to redact
3435
+ */
3436
+ conversationId: string;
3437
+
3438
+ /**
3439
+ * Body param: The conversation part short ID to redact
3440
+ */
3441
+ conversationPartId: string;
3442
+
3443
+ /**
3444
+ * Body param: The type of item to redact. Currently only "conversation_part" is
3445
+ * supported.
3446
+ */
3447
+ type: 'conversation_part';
3448
+
3449
+ /**
3450
+ * Body param: The admin ID performing this action. If not provided, changes are
3451
+ * attributed to the system bot user.
3452
+ */
3453
+ actingAdminId?: string;
3454
+
3455
+ /**
3456
+ * Header param: API version for this request. Defaults to your organization's
3457
+ * configured API version if not specified.
3458
+ */
3459
+ 'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
3460
+ }
3461
+
3462
+ export interface ConversationAttachTagParams {
3463
+ /**
3464
+ * Body param: Required admin ID performing this tag attachment. Must be a member
3465
+ * of the organization so the mutation can be attributed to a real admin actor.
3466
+ */
3467
+ actingAdminId: string;
3468
+
3469
+ /**
3470
+ * Body param: The Featurebase tag ID to attach to the conversation.
3471
+ */
3472
+ tagId: string;
3473
+
3474
+ /**
3475
+ * Header param: API version for this request. Defaults to your organization's
3476
+ * configured API version if not specified.
3477
+ */
3478
+ 'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
3479
+ }
3480
+
3481
+ export interface ConversationDetachTagParams {
3482
+ /**
3483
+ * Path param: Conversation ID (short ID)
3484
+ */
3485
+ id: string;
3486
+
3487
+ /**
3488
+ * Body param: Required admin ID performing this tag removal. Must be a member of
3489
+ * the organization so the mutation can be attributed to a real admin actor.
3490
+ */
3491
+ actingAdminId: string;
3492
+
3493
+ /**
3494
+ * Header param: API version for this request. Defaults to your organization's
3495
+ * configured API version if not specified.
3496
+ */
3497
+ 'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
3498
+ }
3499
+
3590
3500
  export interface ConversationSearchParams {
3591
3501
  /**
3592
3502
  * Body param: An opaque cursor for pagination. Use the nextCursor value from a
@@ -3594,6 +3504,13 @@ export interface ConversationSearchParams {
3594
3504
  */
3595
3505
  cursor?: string;
3596
3506
 
3507
+ /**
3508
+ * Body param: Optional expansions. Use `customAttributeDefinitions` to return
3509
+ * `customAttributeValues` with names and types alongside ID-keyed
3510
+ * `customAttributes`.
3511
+ */
3512
+ include?: Array<'customAttributeDefinitions'>;
3513
+
3597
3514
  /**
3598
3515
  * Body param: A limit on the number of objects to be returned, between 1 and 100.
3599
3516
  */
@@ -3602,10 +3519,11 @@ export interface ConversationSearchParams {
3602
3519
  /**
3603
3520
  * Body param: Structured filter AST. Either a single filter clause or one
3604
3521
  * top-level AND group. Use this for filtering by `state`, `tagIds`,
3605
- * `adminAssigneeId`, etc. (Legacy snake_case names are accepted for back-compat —
3606
- * see the OpenAPI route description for the full alias map.)
3522
+ * `adminAssigneeId`, `customAttributes.<attributeId>`, etc. (Legacy snake_case
3523
+ * names are accepted for back-compat — see the OpenAPI route description for the
3524
+ * full alias map.)
3607
3525
  */
3608
- query?: ConversationSearchParams.SearchFilter | ConversationSearchParams.SearchFilterGroup;
3526
+ query?: PostsAPI.SearchFilter | PostsAPI.SearchFilterGroup;
3609
3527
 
3610
3528
  /**
3611
3529
  * Body param: Plain-text full-text search across conversation messages.
@@ -3629,83 +3547,38 @@ export interface ConversationSearchParams {
3629
3547
  'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
3630
3548
  }
3631
3549
 
3632
- export namespace ConversationSearchParams {
3633
- export interface SearchFilter {
3634
- /**
3635
- * Field name to filter on (e.g. `state`, `tag_ids`, `created_at`)
3636
- */
3637
- field: string;
3638
-
3639
- /**
3640
- * Comparison operator
3641
- */
3642
- operator: '=' | '!=' | 'IN' | 'NIN' | '>' | '<' | '>=' | '<=' | '~' | '!~' | '^' | '$';
3643
-
3644
- /**
3645
- * Value to compare against (primitive or array of primitives)
3646
- */
3647
- value: string | number | boolean | Array<string | number> | null;
3648
- }
3649
-
3650
- export interface SearchFilterGroup {
3651
- /**
3652
- * Group operator: AND (all match) or OR (any match)
3653
- */
3654
- operator: 'AND' | 'OR';
3655
-
3656
- /**
3657
- * Array of filter clauses (1-15 entries)
3658
- */
3659
- value: Array<SearchFilterGroup.Value>;
3660
- }
3661
-
3662
- export namespace SearchFilterGroup {
3663
- export interface Value {
3664
- /**
3665
- * Field name to filter on (e.g. `state`, `tag_ids`, `created_at`)
3666
- */
3667
- field: string;
3668
-
3669
- /**
3670
- * Comparison operator
3671
- */
3672
- operator: '=' | '!=' | 'IN' | 'NIN' | '>' | '<' | '>=' | '<=' | '~' | '!~' | '^' | '$';
3673
-
3674
- /**
3675
- * Value to compare against (primitive or array of primitives)
3676
- */
3677
- value: string | number | boolean | Array<string | number> | null;
3678
- }
3679
- }
3680
- }
3681
-
3682
3550
  Conversations.Participants = Participants;
3683
3551
 
3684
3552
  export declare namespace Conversations {
3685
3553
  export {
3554
+ type AttachedConversationTag as AttachedConversationTag,
3686
3555
  type Conversation as Conversation,
3556
+ type ConversationAttributeValue as ConversationAttributeValue,
3687
3557
  type ConversationPart as ConversationPart,
3688
3558
  type ConversationPartAuthor as ConversationPartAuthor,
3689
3559
  type ConversationParticipant as ConversationParticipant,
3690
3560
  type ConversationTagApplication as ConversationTagApplication,
3561
+ type ConversationTagMutationActor as ConversationTagMutationActor,
3691
3562
  type CsatEmailDelivery as CsatEmailDelivery,
3692
3563
  type CsatRatedAgent as CsatRatedAgent,
3564
+ type CsatSlackDelivery as CsatSlackDelivery,
3693
3565
  type CsatWorkflowLink as CsatWorkflowLink,
3694
3566
  type EmailRecipients as EmailRecipients,
3567
+ type MessageSource as MessageSource,
3568
+ type SearchMatchingPartAuthor as SearchMatchingPartAuthor,
3569
+ type SlackMessageDetails as SlackMessageDetails,
3695
3570
  type ConversationDeleteResponse as ConversationDeleteResponse,
3696
- type ConversationAttachTagResponse as ConversationAttachTagResponse,
3697
- type ConversationDetachTagResponse as ConversationDetachTagResponse,
3698
3571
  type ConversationSearchResponse as ConversationSearchResponse,
3699
3572
  type ConversationsCursorPage as ConversationsCursorPage,
3573
+ type ConversationListParams as ConversationListParams,
3700
3574
  type ConversationCreateParams as ConversationCreateParams,
3701
3575
  type ConversationRetrieveParams as ConversationRetrieveParams,
3702
- type ConversationUpdateParams as ConversationUpdateParams,
3703
- type ConversationListParams as ConversationListParams,
3704
3576
  type ConversationDeleteParams as ConversationDeleteParams,
3577
+ type ConversationUpdateParams as ConversationUpdateParams,
3578
+ type ConversationReplyParams as ConversationReplyParams,
3579
+ type ConversationRedactParams as ConversationRedactParams,
3705
3580
  type ConversationAttachTagParams as ConversationAttachTagParams,
3706
3581
  type ConversationDetachTagParams as ConversationDetachTagParams,
3707
- type ConversationRedactParams as ConversationRedactParams,
3708
- type ConversationReplyParams as ConversationReplyParams,
3709
3582
  type ConversationSearchParams as ConversationSearchParams,
3710
3583
  };
3711
3584