featurebase-node 0.12.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 (501) hide show
  1. package/CHANGELOG.md +37 -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.js +2 -0
  75. package/internal/utils/log.js.map +1 -1
  76. package/internal/utils/log.mjs +2 -0
  77. package/internal/utils/log.mjs.map +1 -1
  78. package/internal/utils/path.mjs.map +1 -1
  79. package/internal/utils/query.mjs.map +1 -1
  80. package/internal/utils/values.mjs.map +1 -1
  81. package/internal/utils.d.mts.map +1 -1
  82. package/internal/utils.d.ts.map +1 -1
  83. package/internal/utils.mjs.map +1 -1
  84. package/package.json +16 -10
  85. package/pagination.d.mts +1 -0
  86. package/pagination.d.mts.map +1 -1
  87. package/pagination.d.ts +1 -0
  88. package/pagination.d.ts.map +1 -1
  89. package/pagination.mjs +1 -0
  90. package/pagination.mjs.map +1 -1
  91. package/resource.d.mts +1 -0
  92. package/resource.d.mts.map +1 -1
  93. package/resource.d.ts +1 -0
  94. package/resource.d.ts.map +1 -1
  95. package/resource.mjs +1 -0
  96. package/resource.mjs.map +1 -1
  97. package/resources/changelogs/changelogs.d.mts +106 -106
  98. package/resources/changelogs/changelogs.d.mts.map +1 -1
  99. package/resources/changelogs/changelogs.d.ts +106 -106
  100. package/resources/changelogs/changelogs.d.ts.map +1 -1
  101. package/resources/changelogs/changelogs.js +74 -74
  102. package/resources/changelogs/changelogs.js.map +1 -1
  103. package/resources/changelogs/changelogs.mjs +74 -74
  104. package/resources/changelogs/changelogs.mjs.map +1 -1
  105. package/resources/changelogs/index.d.mts +1 -1
  106. package/resources/changelogs/index.d.mts.map +1 -1
  107. package/resources/changelogs/index.d.ts +1 -1
  108. package/resources/changelogs/index.d.ts.map +1 -1
  109. package/resources/changelogs/index.mjs.map +1 -1
  110. package/resources/changelogs/subscribers.d.mts.map +1 -1
  111. package/resources/changelogs/subscribers.d.ts.map +1 -1
  112. package/resources/changelogs/subscribers.mjs.map +1 -1
  113. package/resources/changelogs.d.mts.map +1 -1
  114. package/resources/changelogs.d.ts.map +1 -1
  115. package/resources/changelogs.mjs.map +1 -1
  116. package/resources/conversation-attributes.d.mts +117 -0
  117. package/resources/conversation-attributes.d.mts.map +1 -0
  118. package/resources/conversation-attributes.d.ts +117 -0
  119. package/resources/conversation-attributes.d.ts.map +1 -0
  120. package/resources/conversation-attributes.js +61 -0
  121. package/resources/conversation-attributes.js.map +1 -0
  122. package/resources/conversation-attributes.mjs +57 -0
  123. package/resources/conversation-attributes.mjs.map +1 -0
  124. package/resources/feedback/boards.d.mts +17 -17
  125. package/resources/feedback/boards.d.mts.map +1 -1
  126. package/resources/feedback/boards.d.ts +17 -17
  127. package/resources/feedback/boards.d.ts.map +1 -1
  128. package/resources/feedback/boards.js +20 -20
  129. package/resources/feedback/boards.js.map +1 -1
  130. package/resources/feedback/boards.mjs +20 -20
  131. package/resources/feedback/boards.mjs.map +1 -1
  132. package/resources/feedback/comments.d.mts +400 -123
  133. package/resources/feedback/comments.d.mts.map +1 -1
  134. package/resources/feedback/comments.d.ts +400 -123
  135. package/resources/feedback/comments.d.ts.map +1 -1
  136. package/resources/feedback/comments.js +253 -93
  137. package/resources/feedback/comments.js.map +1 -1
  138. package/resources/feedback/comments.mjs +253 -93
  139. package/resources/feedback/comments.mjs.map +1 -1
  140. package/resources/feedback/custom-fields.d.mts +34 -34
  141. package/resources/feedback/custom-fields.d.mts.map +1 -1
  142. package/resources/feedback/custom-fields.d.ts +34 -34
  143. package/resources/feedback/custom-fields.d.ts.map +1 -1
  144. package/resources/feedback/custom-fields.js +36 -36
  145. package/resources/feedback/custom-fields.js.map +1 -1
  146. package/resources/feedback/custom-fields.mjs +36 -36
  147. package/resources/feedback/custom-fields.mjs.map +1 -1
  148. package/resources/feedback/feedback.d.mts +7 -7
  149. package/resources/feedback/feedback.d.mts.map +1 -1
  150. package/resources/feedback/feedback.d.ts +7 -7
  151. package/resources/feedback/feedback.d.ts.map +1 -1
  152. package/resources/feedback/feedback.js.map +1 -1
  153. package/resources/feedback/feedback.mjs.map +1 -1
  154. package/resources/feedback/index.d.mts +5 -5
  155. package/resources/feedback/index.d.mts.map +1 -1
  156. package/resources/feedback/index.d.ts +5 -5
  157. package/resources/feedback/index.d.ts.map +1 -1
  158. package/resources/feedback/index.js.map +1 -1
  159. package/resources/feedback/index.mjs.map +1 -1
  160. package/resources/feedback/post-statuses.d.mts +18 -18
  161. package/resources/feedback/post-statuses.d.mts.map +1 -1
  162. package/resources/feedback/post-statuses.d.ts +18 -18
  163. package/resources/feedback/post-statuses.d.ts.map +1 -1
  164. package/resources/feedback/post-statuses.js +23 -23
  165. package/resources/feedback/post-statuses.js.map +1 -1
  166. package/resources/feedback/post-statuses.mjs +23 -23
  167. package/resources/feedback/post-statuses.mjs.map +1 -1
  168. package/resources/feedback/posts/index.d.mts +1 -1
  169. package/resources/feedback/posts/index.d.mts.map +1 -1
  170. package/resources/feedback/posts/index.d.ts +1 -1
  171. package/resources/feedback/posts/index.d.ts.map +1 -1
  172. package/resources/feedback/posts/index.js.map +1 -1
  173. package/resources/feedback/posts/index.mjs.map +1 -1
  174. package/resources/feedback/posts/posts.d.mts +238 -284
  175. package/resources/feedback/posts/posts.d.mts.map +1 -1
  176. package/resources/feedback/posts/posts.d.ts +238 -284
  177. package/resources/feedback/posts/posts.d.ts.map +1 -1
  178. package/resources/feedback/posts/posts.js +122 -96
  179. package/resources/feedback/posts/posts.js.map +1 -1
  180. package/resources/feedback/posts/posts.mjs +122 -96
  181. package/resources/feedback/posts/posts.mjs.map +1 -1
  182. package/resources/feedback/posts/voters.d.mts.map +1 -1
  183. package/resources/feedback/posts/voters.d.ts.map +1 -1
  184. package/resources/feedback/posts/voters.mjs.map +1 -1
  185. package/resources/feedback/posts.d.mts.map +1 -1
  186. package/resources/feedback/posts.d.ts.map +1 -1
  187. package/resources/feedback/posts.mjs.map +1 -1
  188. package/resources/feedback.d.mts.map +1 -1
  189. package/resources/feedback.d.ts.map +1 -1
  190. package/resources/feedback.mjs.map +1 -1
  191. package/resources/help-center/articles.d.mts +98 -152
  192. package/resources/help-center/articles.d.mts.map +1 -1
  193. package/resources/help-center/articles.d.ts +98 -152
  194. package/resources/help-center/articles.d.ts.map +1 -1
  195. package/resources/help-center/articles.js +73 -73
  196. package/resources/help-center/articles.js.map +1 -1
  197. package/resources/help-center/articles.mjs +73 -73
  198. package/resources/help-center/articles.mjs.map +1 -1
  199. package/resources/help-center/collections.d.mts +64 -64
  200. package/resources/help-center/collections.d.mts.map +1 -1
  201. package/resources/help-center/collections.d.ts +64 -64
  202. package/resources/help-center/collections.d.ts.map +1 -1
  203. package/resources/help-center/collections.js +65 -65
  204. package/resources/help-center/collections.js.map +1 -1
  205. package/resources/help-center/collections.mjs +65 -65
  206. package/resources/help-center/collections.mjs.map +1 -1
  207. package/resources/help-center/help-center.d.mts +5 -5
  208. package/resources/help-center/help-center.d.mts.map +1 -1
  209. package/resources/help-center/help-center.d.ts +5 -5
  210. package/resources/help-center/help-center.d.ts.map +1 -1
  211. package/resources/help-center/help-center.js.map +1 -1
  212. package/resources/help-center/help-center.mjs.map +1 -1
  213. package/resources/help-center/help-centers.d.mts +43 -43
  214. package/resources/help-center/help-centers.d.mts.map +1 -1
  215. package/resources/help-center/help-centers.d.ts +43 -43
  216. package/resources/help-center/help-centers.d.ts.map +1 -1
  217. package/resources/help-center/help-centers.js +43 -43
  218. package/resources/help-center/help-centers.js.map +1 -1
  219. package/resources/help-center/help-centers.mjs +43 -43
  220. package/resources/help-center/help-centers.mjs.map +1 -1
  221. package/resources/help-center/index.d.mts +4 -4
  222. package/resources/help-center/index.d.mts.map +1 -1
  223. package/resources/help-center/index.d.ts +4 -4
  224. package/resources/help-center/index.d.ts.map +1 -1
  225. package/resources/help-center/index.js.map +1 -1
  226. package/resources/help-center/index.mjs.map +1 -1
  227. package/resources/help-center/redirect-rules.d.mts +117 -117
  228. package/resources/help-center/redirect-rules.d.mts.map +1 -1
  229. package/resources/help-center/redirect-rules.d.ts +117 -117
  230. package/resources/help-center/redirect-rules.d.ts.map +1 -1
  231. package/resources/help-center/redirect-rules.js +112 -112
  232. package/resources/help-center/redirect-rules.js.map +1 -1
  233. package/resources/help-center/redirect-rules.mjs +112 -112
  234. package/resources/help-center/redirect-rules.mjs.map +1 -1
  235. package/resources/help-center.d.mts.map +1 -1
  236. package/resources/help-center.d.ts.map +1 -1
  237. package/resources/help-center.mjs.map +1 -1
  238. package/resources/index.d.mts +4 -3
  239. package/resources/index.d.mts.map +1 -1
  240. package/resources/index.d.ts +4 -3
  241. package/resources/index.d.ts.map +1 -1
  242. package/resources/index.js +3 -1
  243. package/resources/index.js.map +1 -1
  244. package/resources/index.mjs +1 -0
  245. package/resources/index.mjs.map +1 -1
  246. package/resources/organization/admins.d.mts +23 -23
  247. package/resources/organization/admins.d.mts.map +1 -1
  248. package/resources/organization/admins.d.ts +23 -23
  249. package/resources/organization/admins.d.ts.map +1 -1
  250. package/resources/organization/admins.js +25 -25
  251. package/resources/organization/admins.js.map +1 -1
  252. package/resources/organization/admins.mjs +25 -25
  253. package/resources/organization/admins.mjs.map +1 -1
  254. package/resources/organization/brands.d.mts +50 -50
  255. package/resources/organization/brands.d.mts.map +1 -1
  256. package/resources/organization/brands.d.ts +50 -50
  257. package/resources/organization/brands.d.ts.map +1 -1
  258. package/resources/organization/brands.js +54 -54
  259. package/resources/organization/brands.js.map +1 -1
  260. package/resources/organization/brands.mjs +54 -54
  261. package/resources/organization/brands.mjs.map +1 -1
  262. package/resources/organization/index.d.mts +3 -3
  263. package/resources/organization/index.d.mts.map +1 -1
  264. package/resources/organization/index.d.ts +3 -3
  265. package/resources/organization/index.d.ts.map +1 -1
  266. package/resources/organization/index.mjs.map +1 -1
  267. package/resources/organization/organization.d.mts +3 -3
  268. package/resources/organization/organization.d.mts.map +1 -1
  269. package/resources/organization/organization.d.ts +3 -3
  270. package/resources/organization/organization.d.ts.map +1 -1
  271. package/resources/organization/organization.mjs.map +1 -1
  272. package/resources/organization/teams.d.mts +45 -45
  273. package/resources/organization/teams.d.mts.map +1 -1
  274. package/resources/organization/teams.d.ts +45 -45
  275. package/resources/organization/teams.d.ts.map +1 -1
  276. package/resources/organization/teams.js +44 -44
  277. package/resources/organization/teams.js.map +1 -1
  278. package/resources/organization/teams.mjs +44 -44
  279. package/resources/organization/teams.mjs.map +1 -1
  280. package/resources/organization.d.mts.map +1 -1
  281. package/resources/organization.d.ts.map +1 -1
  282. package/resources/organization.mjs.map +1 -1
  283. package/resources/support/conversation-tags.d.mts +40 -40
  284. package/resources/support/conversation-tags.d.mts.map +1 -1
  285. package/resources/support/conversation-tags.d.ts +40 -40
  286. package/resources/support/conversation-tags.d.ts.map +1 -1
  287. package/resources/support/conversation-tags.js +32 -32
  288. package/resources/support/conversation-tags.js.map +1 -1
  289. package/resources/support/conversation-tags.mjs +32 -32
  290. package/resources/support/conversation-tags.mjs.map +1 -1
  291. package/resources/support/conversations/conversations.d.mts +624 -722
  292. package/resources/support/conversations/conversations.d.mts.map +1 -1
  293. package/resources/support/conversations/conversations.d.ts +624 -722
  294. package/resources/support/conversations/conversations.d.ts.map +1 -1
  295. package/resources/support/conversations/conversations.js +309 -302
  296. package/resources/support/conversations/conversations.js.map +1 -1
  297. package/resources/support/conversations/conversations.mjs +309 -302
  298. package/resources/support/conversations/conversations.mjs.map +1 -1
  299. package/resources/support/conversations/index.d.mts +1 -1
  300. package/resources/support/conversations/index.d.mts.map +1 -1
  301. package/resources/support/conversations/index.d.ts +1 -1
  302. package/resources/support/conversations/index.d.ts.map +1 -1
  303. package/resources/support/conversations/index.js.map +1 -1
  304. package/resources/support/conversations/index.mjs.map +1 -1
  305. package/resources/support/conversations/participants.d.mts.map +1 -1
  306. package/resources/support/conversations/participants.d.ts.map +1 -1
  307. package/resources/support/conversations/participants.mjs.map +1 -1
  308. package/resources/support/conversations.d.mts.map +1 -1
  309. package/resources/support/conversations.d.ts.map +1 -1
  310. package/resources/support/conversations.mjs.map +1 -1
  311. package/resources/support/index.d.mts +3 -3
  312. package/resources/support/index.d.mts.map +1 -1
  313. package/resources/support/index.d.ts +3 -3
  314. package/resources/support/index.d.ts.map +1 -1
  315. package/resources/support/index.js.map +1 -1
  316. package/resources/support/index.mjs.map +1 -1
  317. package/resources/support/support.d.mts +4 -4
  318. package/resources/support/support.d.mts.map +1 -1
  319. package/resources/support/support.d.ts +4 -4
  320. package/resources/support/support.d.ts.map +1 -1
  321. package/resources/support/support.js.map +1 -1
  322. package/resources/support/support.mjs.map +1 -1
  323. package/resources/support/tickets/categories.d.mts +18 -18
  324. package/resources/support/tickets/categories.d.mts.map +1 -1
  325. package/resources/support/tickets/categories.d.ts +18 -18
  326. package/resources/support/tickets/categories.d.ts.map +1 -1
  327. package/resources/support/tickets/categories.js +25 -25
  328. package/resources/support/tickets/categories.js.map +1 -1
  329. package/resources/support/tickets/categories.mjs +25 -25
  330. package/resources/support/tickets/categories.mjs.map +1 -1
  331. package/resources/support/tickets/custom-fields.d.mts +20 -20
  332. package/resources/support/tickets/custom-fields.d.mts.map +1 -1
  333. package/resources/support/tickets/custom-fields.d.ts +20 -20
  334. package/resources/support/tickets/custom-fields.d.ts.map +1 -1
  335. package/resources/support/tickets/custom-fields.js +19 -19
  336. package/resources/support/tickets/custom-fields.js.map +1 -1
  337. package/resources/support/tickets/custom-fields.mjs +19 -19
  338. package/resources/support/tickets/custom-fields.mjs.map +1 -1
  339. package/resources/support/tickets/index.d.mts +4 -4
  340. package/resources/support/tickets/index.d.mts.map +1 -1
  341. package/resources/support/tickets/index.d.ts +4 -4
  342. package/resources/support/tickets/index.d.ts.map +1 -1
  343. package/resources/support/tickets/index.mjs.map +1 -1
  344. package/resources/support/tickets/statuses.d.mts +17 -17
  345. package/resources/support/tickets/statuses.d.mts.map +1 -1
  346. package/resources/support/tickets/statuses.d.ts +17 -17
  347. package/resources/support/tickets/statuses.d.ts.map +1 -1
  348. package/resources/support/tickets/statuses.js +21 -21
  349. package/resources/support/tickets/statuses.js.map +1 -1
  350. package/resources/support/tickets/statuses.mjs +21 -21
  351. package/resources/support/tickets/statuses.mjs.map +1 -1
  352. package/resources/support/tickets/tickets.d.mts +69 -69
  353. package/resources/support/tickets/tickets.d.mts.map +1 -1
  354. package/resources/support/tickets/tickets.d.ts +69 -69
  355. package/resources/support/tickets/tickets.d.ts.map +1 -1
  356. package/resources/support/tickets/tickets.js +44 -44
  357. package/resources/support/tickets/tickets.js.map +1 -1
  358. package/resources/support/tickets/tickets.mjs +44 -44
  359. package/resources/support/tickets/tickets.mjs.map +1 -1
  360. package/resources/support/tickets.d.mts.map +1 -1
  361. package/resources/support/tickets.d.ts.map +1 -1
  362. package/resources/support/tickets.mjs.map +1 -1
  363. package/resources/support.d.mts.map +1 -1
  364. package/resources/support.d.ts.map +1 -1
  365. package/resources/support.mjs.map +1 -1
  366. package/resources/surveys.d.mts +41 -41
  367. package/resources/surveys.d.mts.map +1 -1
  368. package/resources/surveys.d.ts +41 -41
  369. package/resources/surveys.d.ts.map +1 -1
  370. package/resources/surveys.js +44 -44
  371. package/resources/surveys.js.map +1 -1
  372. package/resources/surveys.mjs +44 -44
  373. package/resources/surveys.mjs.map +1 -1
  374. package/resources/users/companies/companies.d.mts +149 -177
  375. package/resources/users/companies/companies.d.mts.map +1 -1
  376. package/resources/users/companies/companies.d.ts +149 -177
  377. package/resources/users/companies/companies.d.ts.map +1 -1
  378. package/resources/users/companies/companies.js +153 -142
  379. package/resources/users/companies/companies.js.map +1 -1
  380. package/resources/users/companies/companies.mjs +153 -142
  381. package/resources/users/companies/companies.mjs.map +1 -1
  382. package/resources/users/companies/contacts.d.mts.map +1 -1
  383. package/resources/users/companies/contacts.d.ts.map +1 -1
  384. package/resources/users/companies/contacts.mjs.map +1 -1
  385. package/resources/users/companies/index.d.mts +1 -1
  386. package/resources/users/companies/index.d.mts.map +1 -1
  387. package/resources/users/companies/index.d.ts +1 -1
  388. package/resources/users/companies/index.d.ts.map +1 -1
  389. package/resources/users/companies/index.mjs.map +1 -1
  390. package/resources/users/companies.d.mts.map +1 -1
  391. package/resources/users/companies.d.ts.map +1 -1
  392. package/resources/users/companies.mjs.map +1 -1
  393. package/resources/users/contacts/by-user-id/by-user-id.d.mts.map +1 -1
  394. package/resources/users/contacts/by-user-id/by-user-id.d.ts.map +1 -1
  395. package/resources/users/contacts/by-user-id/by-user-id.mjs.map +1 -1
  396. package/resources/users/contacts/by-user-id/email-preferences.d.mts.map +1 -1
  397. package/resources/users/contacts/by-user-id/email-preferences.d.ts.map +1 -1
  398. package/resources/users/contacts/by-user-id/email-preferences.mjs.map +1 -1
  399. package/resources/users/contacts/by-user-id/index.d.mts.map +1 -1
  400. package/resources/users/contacts/by-user-id/index.d.ts.map +1 -1
  401. package/resources/users/contacts/by-user-id/index.mjs.map +1 -1
  402. package/resources/users/contacts/by-user-id.d.mts.map +1 -1
  403. package/resources/users/contacts/by-user-id.d.ts.map +1 -1
  404. package/resources/users/contacts/by-user-id.mjs.map +1 -1
  405. package/resources/users/contacts/contacts.d.mts +229 -256
  406. package/resources/users/contacts/contacts.d.mts.map +1 -1
  407. package/resources/users/contacts/contacts.d.ts +229 -256
  408. package/resources/users/contacts/contacts.d.ts.map +1 -1
  409. package/resources/users/contacts/contacts.js +213 -201
  410. package/resources/users/contacts/contacts.js.map +1 -1
  411. package/resources/users/contacts/contacts.mjs +213 -201
  412. package/resources/users/contacts/contacts.mjs.map +1 -1
  413. package/resources/users/contacts/email-preferences.d.mts.map +1 -1
  414. package/resources/users/contacts/email-preferences.d.ts.map +1 -1
  415. package/resources/users/contacts/email-preferences.mjs.map +1 -1
  416. package/resources/users/contacts/index.d.mts +1 -1
  417. package/resources/users/contacts/index.d.mts.map +1 -1
  418. package/resources/users/contacts/index.d.ts +1 -1
  419. package/resources/users/contacts/index.d.ts.map +1 -1
  420. package/resources/users/contacts/index.mjs.map +1 -1
  421. package/resources/users/contacts.d.mts.map +1 -1
  422. package/resources/users/contacts.d.ts.map +1 -1
  423. package/resources/users/contacts.mjs.map +1 -1
  424. package/resources/users/index.d.mts +2 -2
  425. package/resources/users/index.d.mts.map +1 -1
  426. package/resources/users/index.d.ts +2 -2
  427. package/resources/users/index.d.ts.map +1 -1
  428. package/resources/users/index.mjs.map +1 -1
  429. package/resources/users/users.d.mts +2 -2
  430. package/resources/users/users.d.mts.map +1 -1
  431. package/resources/users/users.d.ts +2 -2
  432. package/resources/users/users.d.ts.map +1 -1
  433. package/resources/users/users.mjs.map +1 -1
  434. package/resources/users.d.mts.map +1 -1
  435. package/resources/users.d.ts.map +1 -1
  436. package/resources/users.mjs.map +1 -1
  437. package/resources/webhooks.d.mts +75 -75
  438. package/resources/webhooks.d.mts.map +1 -1
  439. package/resources/webhooks.d.ts +75 -75
  440. package/resources/webhooks.d.ts.map +1 -1
  441. package/resources/webhooks.js +77 -77
  442. package/resources/webhooks.js.map +1 -1
  443. package/resources/webhooks.mjs +77 -77
  444. package/resources/webhooks.mjs.map +1 -1
  445. package/resources.d.mts.map +1 -1
  446. package/resources.d.ts.map +1 -1
  447. package/resources.mjs.map +1 -1
  448. package/src/client.ts +25 -3
  449. package/src/internal/utils/log.ts +2 -0
  450. package/src/resources/changelogs/changelogs.ts +170 -170
  451. package/src/resources/changelogs/index.ts +1 -1
  452. package/src/resources/conversation-attributes.ts +181 -0
  453. package/src/resources/feedback/boards.ts +28 -28
  454. package/src/resources/feedback/comments.ts +464 -141
  455. package/src/resources/feedback/custom-fields.ts +44 -44
  456. package/src/resources/feedback/feedback.ts +23 -5
  457. package/src/resources/feedback/index.ts +14 -5
  458. package/src/resources/feedback/post-statuses.ts +31 -31
  459. package/src/resources/feedback/posts/index.ts +7 -1
  460. package/src/resources/feedback/posts/posts.ts +294 -340
  461. package/src/resources/help-center/articles.ts +123 -186
  462. package/src/resources/help-center/collections.ts +84 -84
  463. package/src/resources/help-center/help-center.ts +7 -5
  464. package/src/resources/help-center/help-centers.ts +55 -55
  465. package/src/resources/help-center/index.ts +6 -5
  466. package/src/resources/help-center/redirect-rules.ts +174 -174
  467. package/src/resources/index.ts +11 -3
  468. package/src/resources/organization/admins.ts +33 -33
  469. package/src/resources/organization/brands.ts +66 -66
  470. package/src/resources/organization/index.ts +3 -3
  471. package/src/resources/organization/organization.ts +3 -3
  472. package/src/resources/organization/teams.ts +52 -52
  473. package/src/resources/support/conversation-tags.ts +59 -59
  474. package/src/resources/support/conversations/conversations.ts +748 -867
  475. package/src/resources/support/conversations/index.ts +11 -6
  476. package/src/resources/support/index.ts +14 -9
  477. package/src/resources/support/support.ts +21 -11
  478. package/src/resources/support/tickets/categories.ts +33 -33
  479. package/src/resources/support/tickets/custom-fields.ts +27 -27
  480. package/src/resources/support/tickets/index.ts +4 -4
  481. package/src/resources/support/tickets/statuses.ts +29 -29
  482. package/src/resources/support/tickets/tickets.ts +95 -95
  483. package/src/resources/surveys.ts +58 -58
  484. package/src/resources/users/companies/companies.ts +193 -223
  485. package/src/resources/users/companies/index.ts +2 -2
  486. package/src/resources/users/contacts/contacts.ts +275 -302
  487. package/src/resources/users/contacts/index.ts +3 -3
  488. package/src/resources/users/index.ts +5 -5
  489. package/src/resources/users/users.ts +5 -5
  490. package/src/resources/webhooks.ts +95 -95
  491. package/src/version.ts +1 -1
  492. package/uploads.d.mts +1 -0
  493. package/uploads.d.mts.map +1 -1
  494. package/uploads.d.ts +1 -0
  495. package/uploads.d.ts.map +1 -1
  496. package/uploads.mjs +1 -0
  497. package/uploads.mjs.map +1 -1
  498. package/version.d.mts +1 -1
  499. package/version.d.ts +1 -1
  500. package/version.js +1 -1
  501. 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.
@@ -943,7 +946,7 @@ export class Conversations extends APIResource {
943
946
  *
944
947
  * - **Filter mode** (`query` set, `search` omitted): structured filtering against
945
948
  * indexed conversation fields. Sorted by `lastActivityAt` desc by default; set
946
- * `sort` to `last_activity_at:asc` for the inverse.
949
+ * `sort` to `lastActivityAt:asc` for the inverse.
947
950
  * - **Search mode** (`search` set, `query` optional): full-text search across
948
951
  * conversation messages, then narrowed by the same `query` AST so the same
949
952
  * filters apply. Results are ranked by relevance by default; set `sort` to order
@@ -962,7 +965,7 @@ export class Conversations extends APIResource {
962
965
  * "value": [
963
966
  * { "field": "state", "operator": "=", "value": "open" },
964
967
  * {
965
- * "field": "admin_assignee_id",
968
+ * "field": "adminAssigneeId",
966
969
  * "operator": "=",
967
970
  * "value": "507f1f77bcf86cd799439011"
968
971
  * }
@@ -975,18 +978,24 @@ export class Conversations extends APIResource {
975
978
  *
976
979
  * ### Supported fields and operators
977
980
  *
978
- * | Field | Type | Operators |
979
- * | ---------------------------- | --------------------------------------------------------------------------- | ---------------------- |
980
- * | `state` | enum (`open` / `closed` / `snoozed`) | `=`, `!=`, `IN`, `NIN` |
981
- * | `priority` | boolean | `=`, `!=` |
982
- * | `admin_assignee_id` | id or null (unassigned) | `=`, `!=`, `IN`, `NIN` |
983
- * | `team_assignee_id` | id or null (unassigned) | `=`, `!=`, `IN`, `NIN` |
984
- * | `brand_id` | id or null | `=`, `!=`, `IN`, `NIN` |
985
- * | `tag_ids` | id (matches any conversation containing this tag) | `=`, `!=`, `IN`, `NIN` |
986
- * | `user_id` / `participant_id` | id of a conversation participant | `=`, `!=`, `IN`, `NIN` |
987
- * | `company_id` | company id (matches conversations whose participants belong to the company) | `=`, `!=`, `IN`, `NIN` |
988
- * | `mentioned_admin_ids` | admin id | `=`, `!=`, `IN`, `NIN` |
989
- * | `created_at` | unix seconds | `=`, `>`, `<` |
981
+ * Field names are camelCase, matching the rest of the v2 public API. Snake_case
982
+ * names that this endpoint originally shipped with (`admin_assignee_id`,
983
+ * `team_assignee_id`, `brand_id`, `tag_ids`, `mentioned_admin_ids`, `user_id`,
984
+ * `participant_id`, `company_id`, `created_at`) are still accepted for back-compat
985
+ * but are deprecated please migrate to camelCase in new code.
986
+ *
987
+ * | Field | Type | Operators |
988
+ * | -------------------------- | --------------------------------------------------------------------------- | ---------------------- |
989
+ * | `state` | enum (`open` / `closed` / `snoozed`) | `=`, `!=`, `IN`, `NIN` |
990
+ * | `priority` | boolean | `=`, `!=` |
991
+ * | `adminAssigneeId` | id or null (unassigned) | `=`, `!=`, `IN`, `NIN` |
992
+ * | `teamAssigneeId` | id or null (unassigned) | `=`, `!=`, `IN`, `NIN` |
993
+ * | `brandId` | id or null | `=`, `!=`, `IN`, `NIN` |
994
+ * | `tagIds` | id (matches any conversation containing this tag) | `=`, `!=`, `IN`, `NIN` |
995
+ * | `userId` / `participantId` | id of a conversation participant | `=`, `!=`, `IN`, `NIN` |
996
+ * | `companyId` | company id (matches conversations whose participants belong to the company) | `=`, `!=`, `IN`, `NIN` |
997
+ * | `mentionedAdminIds` | admin id | `=`, `!=`, `IN`, `NIN` |
998
+ * | `createdAt` | unix seconds | `=`, `>`, `<` |
990
999
  *
991
1000
  * For unbounded fields a query consisting only of `!=` or `NIN` clauses is
992
1001
  * rejected with `query_too_broad` to prevent full-org scans. Combine the negation
@@ -1053,6 +1062,49 @@ export class Conversations extends APIResource {
1053
1062
 
1054
1063
  export type ConversationsCursorPage = CursorPage<Conversation>;
1055
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
+
1056
1108
  export interface Conversation {
1057
1109
  /**
1058
1110
  * Unique conversation identifier
@@ -1182,6 +1234,19 @@ export interface Conversation {
1182
1234
  */
1183
1235
  csatSummary?: Conversation.CsatSummary;
1184
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
+
1185
1250
  /**
1186
1251
  * Whether customer replies are disabled
1187
1252
  */
@@ -1197,7 +1262,7 @@ export interface Conversation {
1197
1262
  */
1198
1263
  readReceipts?: Array<Conversation.ReadReceipt>;
1199
1264
 
1200
- source?: Conversation.Source;
1265
+ source?: MessageSource;
1201
1266
 
1202
1267
  /**
1203
1268
  * Conversation title
@@ -1231,13 +1296,16 @@ export namespace Conversation {
1231
1296
  * ISO timestamp when first-time submissions stop being accepted
1232
1297
  */
1233
1298
  lateSubmitWindowEndsAt?: string;
1299
+
1300
+ slackDelivery?: ConversationsAPI.CsatSlackDelivery;
1234
1301
  }
1235
1302
 
1236
1303
  export interface CsatHistory {
1237
1304
  /**
1238
- * 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.
1239
1307
  */
1240
- channel: 'desktop' | 'email';
1308
+ channel: 'desktop' | 'email' | 'slack';
1241
1309
 
1242
1310
  /**
1243
1311
  * Whether this row represents the currently effective CSAT request for the
@@ -1309,6 +1377,8 @@ export namespace Conversation {
1309
1377
  */
1310
1378
  score?: number;
1311
1379
 
1380
+ slackDelivery?: ConversationsAPI.CsatSlackDelivery;
1381
+
1312
1382
  workflow?: ConversationsAPI.CsatWorkflowLink;
1313
1383
  }
1314
1384
 
@@ -1335,7 +1405,7 @@ export namespace Conversation {
1335
1405
  /**
1336
1406
  * Channel used for the latest CSAT request when known
1337
1407
  */
1338
- channel?: 'desktop' | 'email';
1408
+ channel?: 'desktop' | 'email' | 'slack';
1339
1409
 
1340
1410
  /**
1341
1411
  * ISO timestamp when the request expired
@@ -1396,40 +1466,43 @@ export namespace Conversation {
1396
1466
  */
1397
1467
  userType: 'admin' | 'customer' | 'lead';
1398
1468
  }
1469
+ }
1399
1470
 
1400
- export interface Source {
1401
- /**
1402
- * Body of the initial message as HTML with signed image URLs
1403
- */
1404
- bodyHtml: string;
1471
+ export interface ConversationAttributeValue {
1472
+ /**
1473
+ * Stable machine identifier used as the key in conversation.customAttributes.
1474
+ */
1475
+ id: string;
1405
1476
 
1406
- /**
1407
- * Body of the initial message as markdown
1408
- */
1409
- bodyMarkdown: string;
1477
+ /**
1478
+ * Storage-level data type used for validation and search.
1479
+ */
1480
+ dataType: 'string' | 'number' | 'boolean' | 'date' | 'array' | 'object';
1410
1481
 
1411
- /**
1412
- * Channel through which the conversation was initiated
1413
- */
1414
- 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';
1415
1486
 
1416
- author?: ConversationsAPI.ConversationParticipant;
1487
+ /**
1488
+ * Stable internal identifier for the attribute definition.
1489
+ */
1490
+ identifier: string;
1417
1491
 
1418
- /**
1419
- * How the conversation was initiated
1420
- */
1421
- deliveredAs?: 'customer_initiated' | 'admin_initiated';
1492
+ /**
1493
+ * Human-readable attribute name shown in Featurebase.
1494
+ */
1495
+ name: string;
1422
1496
 
1423
- /**
1424
- * Subject line for email conversations
1425
- */
1426
- subject?: string;
1497
+ /**
1498
+ * Allowed values for select and multi-select attributes.
1499
+ */
1500
+ options?: Array<ConversationAttributesAPI.ConversationAttributeOption>;
1427
1501
 
1428
- /**
1429
- * URL where the conversation was initiated
1430
- */
1431
- url?: string;
1432
- }
1502
+ /**
1503
+ * The conversation-specific custom attribute value.
1504
+ */
1505
+ value?: unknown;
1433
1506
  }
1434
1507
 
1435
1508
  /**
@@ -1477,7 +1550,7 @@ export namespace ConversationPart {
1477
1550
  /**
1478
1551
  * Channel through which the message was sent
1479
1552
  */
1480
- channel: 'unknown' | 'desktop' | 'android' | 'ios' | 'email';
1553
+ channel: 'unknown' | 'desktop' | 'android' | 'ios' | 'email' | 'slack';
1481
1554
 
1482
1555
  /**
1483
1556
  * ISO timestamp when the part was created
@@ -1506,6 +1579,12 @@ export namespace ConversationPart {
1506
1579
  */
1507
1580
  redacted?: boolean;
1508
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
+
1509
1588
  /**
1510
1589
  * Reply-level tag applications and provenance for this conversation part
1511
1590
  */
@@ -1534,7 +1613,7 @@ export namespace ConversationPart {
1534
1613
  /**
1535
1614
  * Channel through which the message was sent
1536
1615
  */
1537
- channel: 'unknown' | 'desktop' | 'android' | 'ios' | 'email';
1616
+ channel: 'unknown' | 'desktop' | 'android' | 'ios' | 'email' | 'slack';
1538
1617
 
1539
1618
  /**
1540
1619
  * ISO timestamp when the part was created
@@ -1563,6 +1642,12 @@ export namespace ConversationPart {
1563
1642
  */
1564
1643
  redacted?: boolean;
1565
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
+
1566
1651
  /**
1567
1652
  * Reply-level tag applications and provenance for this conversation part
1568
1653
  */
@@ -1722,13 +1807,19 @@ export namespace ConversationPart {
1722
1807
  /**
1723
1808
  * Channel through which the message was sent
1724
1809
  */
1725
- channel?: 'unknown' | 'desktop' | 'android' | 'ios' | 'email';
1810
+ channel?: 'unknown' | 'desktop' | 'android' | 'ios' | 'email' | 'slack';
1726
1811
 
1727
1812
  /**
1728
1813
  * Whether this message has been redacted
1729
1814
  */
1730
1815
  redacted?: boolean;
1731
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
+
1732
1823
  /**
1733
1824
  * Reply-level tag applications and provenance for this conversation part
1734
1825
  */
@@ -1894,9 +1985,10 @@ export namespace ConversationPart {
1894
1985
  */
1895
1986
  export interface Csat {
1896
1987
  /**
1897
- * 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.
1898
1990
  */
1899
- channel: 'desktop' | 'email';
1991
+ channel: 'desktop' | 'email' | 'slack';
1900
1992
 
1901
1993
  /**
1902
1994
  * ISO timestamp when the request was created
@@ -1980,9 +2072,10 @@ export namespace ConversationPart {
1980
2072
  */
1981
2073
  export interface Csat {
1982
2074
  /**
1983
- * 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.
1984
2077
  */
1985
- channel: 'desktop' | 'email';
2078
+ channel: 'desktop' | 'email' | 'slack';
1986
2079
 
1987
2080
  /**
1988
2081
  * ISO timestamp when the customer submitted the rating
@@ -2270,39 +2363,17 @@ export namespace ConversationPart {
2270
2363
  /**
2271
2364
  * Actor that applied the tag
2272
2365
  */
2273
- actor?: TagUpdate.Actor;
2366
+ actor?: ConversationsAPI.ConversationTagMutationActor;
2274
2367
 
2275
- /**
2276
- * Tag name at the time of the event or the best available current display name
2277
- */
2278
- tagName?: string | null;
2279
-
2280
- /**
2281
- * Conversation part that the tag mutation targeted
2282
- */
2283
- targetPartId?: string | null;
2284
- }
2285
-
2286
- export namespace TagUpdate {
2287
- /**
2288
- * Actor that applied the tag
2289
- */
2290
- export interface Actor {
2291
- /**
2292
- * Actor that caused the tag mutation
2293
- */
2294
- type: 'admin' | 'customer' | 'lead' | 'bot' | 'integration' | 'system' | 'workflow';
2295
-
2296
- /**
2297
- * Actor identifier when available
2298
- */
2299
- 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;
2300
2372
 
2301
- /**
2302
- * Actor display name when available
2303
- */
2304
- name?: string | null;
2305
- }
2373
+ /**
2374
+ * Conversation part that the tag mutation targeted
2375
+ */
2376
+ targetPartId?: string | null;
2306
2377
  }
2307
2378
 
2308
2379
  /**
@@ -2519,7 +2590,7 @@ export interface ConversationTagApplication {
2519
2590
  /**
2520
2591
  * Actor that applied the tag
2521
2592
  */
2522
- appliedBy?: ConversationTagApplication.AppliedBy;
2593
+ appliedBy?: ConversationTagMutationActor;
2523
2594
 
2524
2595
  /**
2525
2596
  * ISO timestamp when the tag was removed from this reply, if it was removed
@@ -2529,7 +2600,7 @@ export interface ConversationTagApplication {
2529
2600
  /**
2530
2601
  * Actor that applied the tag
2531
2602
  */
2532
- removedBy?: ConversationTagApplication.RemovedBy;
2603
+ removedBy?: ConversationTagMutationActor;
2533
2604
 
2534
2605
  /**
2535
2606
  * Resolved tag object when the tag still exists in the shared workspace catalog
@@ -2537,46 +2608,24 @@ export interface ConversationTagApplication {
2537
2608
  tag?: ConversationTagsAPI.ConversationTag;
2538
2609
  }
2539
2610
 
2540
- export namespace ConversationTagApplication {
2611
+ /**
2612
+ * Actor that applied the tag
2613
+ */
2614
+ export interface ConversationTagMutationActor {
2541
2615
  /**
2542
- * Actor that applied the tag
2616
+ * Actor that caused the tag mutation
2543
2617
  */
2544
- export interface AppliedBy {
2545
- /**
2546
- * Actor that caused the tag mutation
2547
- */
2548
- type: 'admin' | 'customer' | 'lead' | 'bot' | 'integration' | 'system' | 'workflow';
2549
-
2550
- /**
2551
- * Actor identifier when available
2552
- */
2553
- id?: string | null;
2554
-
2555
- /**
2556
- * Actor display name when available
2557
- */
2558
- name?: string | null;
2559
- }
2618
+ type: 'admin' | 'customer' | 'lead' | 'bot' | 'integration' | 'system' | 'workflow';
2560
2619
 
2561
2620
  /**
2562
- * Actor that applied the tag
2621
+ * Actor identifier when available
2563
2622
  */
2564
- export interface RemovedBy {
2565
- /**
2566
- * Actor that caused the tag mutation
2567
- */
2568
- type: 'admin' | 'customer' | 'lead' | 'bot' | 'integration' | 'system' | 'workflow';
2569
-
2570
- /**
2571
- * Actor identifier when available
2572
- */
2573
- id?: string | null;
2623
+ id?: string | null;
2574
2624
 
2575
- /**
2576
- * Actor display name when available
2577
- */
2578
- name?: string | null;
2579
- }
2625
+ /**
2626
+ * Actor display name when available
2627
+ */
2628
+ name?: string | null;
2580
2629
  }
2581
2630
 
2582
2631
  export interface CsatEmailDelivery {
@@ -2618,6 +2667,44 @@ export interface CsatRatedAgent {
2618
2667
  id?: string;
2619
2668
  }
2620
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
+
2621
2708
  export interface CsatWorkflowLink {
2622
2709
  /**
2623
2710
  * Workflow action ID associated with the CSAT request
@@ -2655,191 +2742,160 @@ export interface EmailRecipients {
2655
2742
  ids?: Array<string>;
2656
2743
  }
2657
2744
 
2658
- export interface ConversationDeleteResponse {
2659
- /**
2660
- * Unique identifier of the deleted conversation
2661
- */
2662
- id: string;
2663
-
2664
- /**
2665
- * Indicates the resource was deleted
2666
- */
2667
- deleted: true;
2668
-
2669
- /**
2670
- * Object type identifier
2671
- */
2672
- object: 'conversation';
2673
- }
2674
-
2675
- export interface ConversationAttachTagResponse {
2745
+ export interface MessageSource {
2676
2746
  /**
2677
- * Unique tag identifier
2747
+ * Body of the initial message as HTML with signed image URLs
2678
2748
  */
2679
- id: string;
2749
+ bodyHtml: string;
2680
2750
 
2681
2751
  /**
2682
- * Current tag name
2752
+ * Body of the initial message as markdown
2683
2753
  */
2684
- name: string;
2754
+ bodyMarkdown: string;
2685
2755
 
2686
2756
  /**
2687
- * Object type identifier for a tag
2757
+ * Channel through which the conversation was initiated
2688
2758
  */
2689
- type: 'tag';
2759
+ channel: 'unknown' | 'desktop' | 'android' | 'ios' | 'email' | 'slack';
2690
2760
 
2691
- /**
2692
- * ISO timestamp when the tag was applied
2693
- */
2694
- appliedAt?: string | null;
2761
+ author?: ConversationParticipant;
2695
2762
 
2696
2763
  /**
2697
- * Actor that applied the tag
2764
+ * How the conversation was initiated
2698
2765
  */
2699
- appliedBy?: ConversationAttachTagResponse.AppliedBy | null;
2766
+ deliveredAs?: 'customer_initiated' | 'admin_initiated';
2700
2767
 
2701
2768
  /**
2702
- * 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.
2703
2771
  */
2704
- removedAt?: string | null;
2772
+ slack?: MessageSource.Slack;
2705
2773
 
2706
2774
  /**
2707
- * Actor that applied the tag
2775
+ * Subject line for email conversations
2708
2776
  */
2709
- removedBy?: ConversationAttachTagResponse.RemovedBy | null;
2777
+ subject?: string;
2710
2778
 
2711
2779
  /**
2712
- * Reply/message ID used as the deterministic attachment target for this
2713
- * conversation tag mutation.
2780
+ * URL where the conversation was initiated
2714
2781
  */
2715
- targetPartId?: string | null;
2782
+ url?: string;
2716
2783
  }
2717
2784
 
2718
- export namespace ConversationAttachTagResponse {
2785
+ export namespace MessageSource {
2719
2786
  /**
2720
- * Actor that applied the tag
2787
+ * Safe Slack thread identifiers. Only present for Slack-origin conversations while
2788
+ * the organization has Slack integration enabled.
2721
2789
  */
2722
- export interface AppliedBy {
2790
+ export interface Slack {
2723
2791
  /**
2724
- * Actor that caused the tag mutation
2792
+ * Slack channel ID for the thread
2725
2793
  */
2726
- type: 'admin' | 'customer' | 'lead' | 'bot' | 'integration' | 'system' | 'workflow';
2794
+ channelId: string;
2727
2795
 
2728
2796
  /**
2729
- * Actor identifier when available
2797
+ * Slack workspace/team ID for the thread
2730
2798
  */
2731
- id?: string | null;
2799
+ teamId: string;
2732
2800
 
2733
2801
  /**
2734
- * Actor display name when available
2802
+ * Slack root thread timestamp
2735
2803
  */
2736
- name?: string | null;
2804
+ threadTs: string;
2737
2805
  }
2806
+ }
2738
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 {
2739
2813
  /**
2740
- * Actor that applied the tag
2814
+ * Author id
2741
2815
  */
2742
- export interface RemovedBy {
2743
- /**
2744
- * Actor that caused the tag mutation
2745
- */
2746
- type: 'admin' | 'customer' | 'lead' | 'bot' | 'integration' | 'system' | 'workflow';
2747
-
2748
- /**
2749
- * Actor identifier when available
2750
- */
2751
- id?: string | null;
2816
+ id: string;
2752
2817
 
2753
- /**
2754
- * Actor display name when available
2755
- */
2756
- name?: string | null;
2757
- }
2758
- }
2818
+ /**
2819
+ * Author type
2820
+ */
2821
+ type: 'admin' | 'customer' | 'lead' | 'bot' | 'guest' | 'integration';
2759
2822
 
2760
- export interface ConversationDetachTagResponse {
2761
2823
  /**
2762
- * Unique tag identifier
2824
+ * Companies the author belongs to (customers only)
2763
2825
  */
2764
- id: string;
2826
+ companies?: Array<SearchMatchingPartAuthor.Company>;
2765
2827
 
2766
2828
  /**
2767
- * Current tag name
2829
+ * Email when known
2768
2830
  */
2769
- name: string;
2831
+ email?: string | null;
2770
2832
 
2771
2833
  /**
2772
- * Object type identifier for a tag
2834
+ * Display name when known
2773
2835
  */
2774
- type: 'tag';
2836
+ name?: string | null;
2775
2837
 
2776
2838
  /**
2777
- * ISO timestamp when the tag was applied
2839
+ * Profile picture URL when known
2778
2840
  */
2779
- 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
+ }
2780
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 {
2781
2863
  /**
2782
- * Actor that applied the tag
2864
+ * Slack channel ID for the message
2783
2865
  */
2784
- appliedBy?: ConversationDetachTagResponse.AppliedBy | null;
2866
+ channelId: string;
2785
2867
 
2786
2868
  /**
2787
- * ISO timestamp when the tag was removed, if applicable
2869
+ * Slack message timestamp
2788
2870
  */
2789
- removedAt?: string | null;
2871
+ messageTs: string;
2790
2872
 
2791
2873
  /**
2792
- * Actor that applied the tag
2874
+ * Slack workspace/team ID for the message
2793
2875
  */
2794
- removedBy?: ConversationDetachTagResponse.RemovedBy | null;
2876
+ teamId: string;
2795
2877
 
2796
2878
  /**
2797
- * Reply/message ID used as the deterministic attachment target for this
2798
- * conversation tag mutation.
2879
+ * Slack root thread timestamp when this message belongs to a thread
2799
2880
  */
2800
- targetPartId?: string | null;
2881
+ threadTs?: string;
2801
2882
  }
2802
2883
 
2803
- export namespace ConversationDetachTagResponse {
2884
+ export interface ConversationDeleteResponse {
2804
2885
  /**
2805
- * Actor that applied the tag
2886
+ * Unique identifier of the deleted conversation
2806
2887
  */
2807
- export interface AppliedBy {
2808
- /**
2809
- * Actor that caused the tag mutation
2810
- */
2811
- type: 'admin' | 'customer' | 'lead' | 'bot' | 'integration' | 'system' | 'workflow';
2812
-
2813
- /**
2814
- * Actor identifier when available
2815
- */
2816
- id?: string | null;
2817
-
2818
- /**
2819
- * Actor display name when available
2820
- */
2821
- name?: string | null;
2822
- }
2888
+ id: string;
2823
2889
 
2824
2890
  /**
2825
- * Actor that applied the tag
2891
+ * Indicates the resource was deleted
2826
2892
  */
2827
- export interface RemovedBy {
2828
- /**
2829
- * Actor that caused the tag mutation
2830
- */
2831
- type: 'admin' | 'customer' | 'lead' | 'bot' | 'integration' | 'system' | 'workflow';
2832
-
2833
- /**
2834
- * Actor identifier when available
2835
- */
2836
- id?: string | null;
2893
+ deleted: true;
2837
2894
 
2838
- /**
2839
- * Actor display name when available
2840
- */
2841
- name?: string | null;
2842
- }
2895
+ /**
2896
+ * Object type identifier
2897
+ */
2898
+ object: 'conversation';
2843
2899
  }
2844
2900
 
2845
2901
  export interface ConversationSearchResponse {
@@ -2948,7 +3004,20 @@ export namespace ConversationSearchResponse {
2948
3004
  * The customer or lead the conversation is with. Use this for the row identity;
2949
3005
  * use `matchingPartAuthor` if you specifically want the message author.
2950
3006
  */
2951
- 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>;
2952
3021
 
2953
3022
  /**
2954
3023
  * Plain-text / markdown preview of the matching conversation part body (search
@@ -2966,7 +3035,7 @@ export namespace ConversationSearchResponse {
2966
3035
  * The customer or lead the conversation is with. Use this for the row identity;
2967
3036
  * use `matchingPartAuthor` if you specifically want the message author.
2968
3037
  */
2969
- matchingPartAuthor?: Data.MatchingPartAuthor | null;
3038
+ matchingPartAuthor?: ConversationsAPI.SearchMatchingPartAuthor | null;
2970
3039
 
2971
3040
  /**
2972
3041
  * Aggregate relevance score for the conversation (search mode only). Higher is
@@ -2974,7 +3043,7 @@ export namespace ConversationSearchResponse {
2974
3043
  */
2975
3044
  relevanceScore?: number | null;
2976
3045
 
2977
- source?: Data.Source;
3046
+ source?: ConversationsAPI.MessageSource;
2978
3047
 
2979
3048
  /**
2980
3049
  * Window of conversation messages around the matching part for lightweight context
@@ -2993,147 +3062,25 @@ export namespace ConversationSearchResponse {
2993
3062
  }
2994
3063
 
2995
3064
  export namespace Data {
2996
- /**
2997
- * The customer or lead the conversation is with. Use this for the row identity;
2998
- * use `matchingPartAuthor` if you specifically want the message author.
2999
- */
3000
- export interface ConversationUser {
3001
- /**
3002
- * Author id
3003
- */
3004
- id: string;
3005
-
3006
- /**
3007
- * Author type
3008
- */
3009
- type: 'admin' | 'customer' | 'lead' | 'bot' | 'guest' | 'integration';
3010
-
3011
- /**
3012
- * Companies the author belongs to (customers only)
3013
- */
3014
- companies?: Array<ConversationUser.Company>;
3015
-
3016
- /**
3017
- * Email when known
3018
- */
3019
- email?: string | null;
3020
-
3021
- /**
3022
- * Display name when known
3023
- */
3024
- name?: string | null;
3025
-
3026
- /**
3027
- * Profile picture URL when known
3028
- */
3029
- profilePicture?: string | null;
3030
- }
3031
-
3032
- export namespace ConversationUser {
3033
- export interface Company {
3034
- id: string;
3035
-
3036
- name?: string;
3037
- }
3038
- }
3039
-
3040
3065
  /**
3041
3066
  * Reference to the conversation part that best matched the search query (search
3042
3067
  * mode only)
3043
3068
  */
3044
- export interface MatchingPart {
3045
- /**
3046
- * Conversation part id
3047
- */
3048
- id: string;
3049
-
3050
- /**
3051
- * ISO timestamp when the matching part was created
3052
- */
3053
- createdAt?: string | null;
3054
-
3055
- /**
3056
- * Conversation part type
3057
- */
3058
- partType?: string;
3059
- }
3060
-
3061
- /**
3062
- * The customer or lead the conversation is with. Use this for the row identity;
3063
- * use `matchingPartAuthor` if you specifically want the message author.
3064
- */
3065
- export interface MatchingPartAuthor {
3066
- /**
3067
- * Author id
3068
- */
3069
- id: string;
3070
-
3071
- /**
3072
- * Author type
3073
- */
3074
- type: 'admin' | 'customer' | 'lead' | 'bot' | 'guest' | 'integration';
3075
-
3076
- /**
3077
- * Companies the author belongs to (customers only)
3078
- */
3079
- companies?: Array<MatchingPartAuthor.Company>;
3080
-
3081
- /**
3082
- * Email when known
3083
- */
3084
- email?: string | null;
3085
-
3086
- /**
3087
- * Display name when known
3088
- */
3089
- name?: string | null;
3090
-
3091
- /**
3092
- * Profile picture URL when known
3093
- */
3094
- profilePicture?: string | null;
3095
- }
3096
-
3097
- export namespace MatchingPartAuthor {
3098
- export interface Company {
3099
- id: string;
3100
-
3101
- name?: string;
3102
- }
3103
- }
3104
-
3105
- export interface Source {
3106
- /**
3107
- * Body of the initial message as HTML with signed image URLs
3108
- */
3109
- bodyHtml: string;
3110
-
3111
- /**
3112
- * Body of the initial message as markdown
3113
- */
3114
- bodyMarkdown: string;
3115
-
3116
- /**
3117
- * Channel through which the conversation was initiated
3118
- */
3119
- channel: 'unknown' | 'desktop' | 'android' | 'ios' | 'email';
3120
-
3121
- author?: ConversationsAPI.ConversationParticipant;
3122
-
3069
+ export interface MatchingPart {
3123
3070
  /**
3124
- * How the conversation was initiated
3071
+ * Conversation part id
3125
3072
  */
3126
- deliveredAs?: 'customer_initiated' | 'admin_initiated';
3073
+ id: string;
3127
3074
 
3128
3075
  /**
3129
- * Subject line for email conversations
3076
+ * ISO timestamp when the matching part was created
3130
3077
  */
3131
- subject?: string;
3078
+ createdAt?: string | null;
3132
3079
 
3133
3080
  /**
3134
- * URL where the conversation was initiated
3081
+ * Conversation part type
3135
3082
  */
3136
- url?: string;
3083
+ partType?: string;
3137
3084
  }
3138
3085
 
3139
3086
  export interface SurroundingConversationPart {
@@ -3156,7 +3103,7 @@ export namespace ConversationSearchResponse {
3156
3103
  * The customer or lead the conversation is with. Use this for the row identity;
3157
3104
  * use `matchingPartAuthor` if you specifically want the message author.
3158
3105
  */
3159
- author?: SurroundingConversationPart.Author | null;
3106
+ author?: ConversationsAPI.SearchMatchingPartAuthor | null;
3160
3107
 
3161
3108
  /**
3162
3109
  * ISO timestamp when the part was created
@@ -3168,53 +3115,28 @@ export namespace ConversationSearchResponse {
3168
3115
  */
3169
3116
  partType?: string;
3170
3117
  }
3118
+ }
3119
+ }
3171
3120
 
3172
- export namespace SurroundingConversationPart {
3173
- /**
3174
- * The customer or lead the conversation is with. Use this for the row identity;
3175
- * use `matchingPartAuthor` if you specifically want the message author.
3176
- */
3177
- export interface Author {
3178
- /**
3179
- * Author id
3180
- */
3181
- id: string;
3182
-
3183
- /**
3184
- * Author type
3185
- */
3186
- type: 'admin' | 'customer' | 'lead' | 'bot' | 'guest' | 'integration';
3187
-
3188
- /**
3189
- * Companies the author belongs to (customers only)
3190
- */
3191
- companies?: Array<Author.Company>;
3192
-
3193
- /**
3194
- * Email when known
3195
- */
3196
- email?: string | null;
3197
-
3198
- /**
3199
- * Display name when known
3200
- */
3201
- name?: string | null;
3202
-
3203
- /**
3204
- * Profile picture URL when known
3205
- */
3206
- profilePicture?: string | null;
3207
- }
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>;
3208
3128
 
3209
- export namespace Author {
3210
- export interface Company {
3211
- 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>;
3212
3134
 
3213
- name?: string;
3214
- }
3215
- }
3216
- }
3217
- }
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';
3218
3140
  }
3219
3141
 
3220
3142
  export interface ConversationCreateParams {
@@ -3317,6 +3239,21 @@ export namespace ConversationCreateParams {
3317
3239
  }
3318
3240
 
3319
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 {
3320
3257
  /**
3321
3258
  * API version for this request. Defaults to your organization's configured API
3322
3259
  * version if not specified.
@@ -3338,8 +3275,9 @@ export interface ConversationUpdateParams {
3338
3275
  adminAssigneeId?: string | null;
3339
3276
 
3340
3277
  /**
3341
- * Body param: Custom attributes to set on the conversation. Uses the same
3342
- * 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.
3343
3281
  */
3344
3282
  customAttributes?: { [key: string]: unknown };
3345
3283
 
@@ -3407,96 +3345,6 @@ export namespace ConversationUpdateParams {
3407
3345
  }
3408
3346
  }
3409
3347
 
3410
- export interface ConversationListParams extends CursorPageParams {
3411
- /**
3412
- * Query param: Filter conversations by one or more tag IDs using a comma-separated
3413
- * list. Conversations must contain all provided tags.
3414
- */
3415
- tagIds?: string | Array<string>;
3416
-
3417
- /**
3418
- * Header param: API version for this request. Defaults to your organization's
3419
- * configured API version if not specified.
3420
- */
3421
- 'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
3422
- }
3423
-
3424
- export interface ConversationDeleteParams {
3425
- /**
3426
- * API version for this request. Defaults to your organization's configured API
3427
- * version if not specified.
3428
- */
3429
- 'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
3430
- }
3431
-
3432
- export interface ConversationAttachTagParams {
3433
- /**
3434
- * Body param: Required admin ID performing this tag attachment. Must be a member
3435
- * of the organization so the mutation can be attributed to a real admin actor.
3436
- */
3437
- actingAdminId: string;
3438
-
3439
- /**
3440
- * Body param: The Featurebase tag ID to attach to the conversation.
3441
- */
3442
- tagId: string;
3443
-
3444
- /**
3445
- * Header param: API version for this request. Defaults to your organization's
3446
- * configured API version if not specified.
3447
- */
3448
- 'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
3449
- }
3450
-
3451
- export interface ConversationDetachTagParams {
3452
- /**
3453
- * Path param: Conversation ID (short ID)
3454
- */
3455
- id: string;
3456
-
3457
- /**
3458
- * Body param: Required admin ID performing this tag removal. Must be a member of
3459
- * the organization so the mutation can be attributed to a real admin actor.
3460
- */
3461
- actingAdminId: string;
3462
-
3463
- /**
3464
- * Header param: API version for this request. Defaults to your organization's
3465
- * configured API version if not specified.
3466
- */
3467
- 'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
3468
- }
3469
-
3470
- export interface ConversationRedactParams {
3471
- /**
3472
- * Body param: The conversation short ID that contains the part to redact
3473
- */
3474
- conversationId: string;
3475
-
3476
- /**
3477
- * Body param: The conversation part short ID to redact
3478
- */
3479
- conversationPartId: string;
3480
-
3481
- /**
3482
- * Body param: The type of item to redact. Currently only "conversation_part" is
3483
- * supported.
3484
- */
3485
- type: 'conversation_part';
3486
-
3487
- /**
3488
- * Body param: The admin ID performing this action. If not provided, changes are
3489
- * attributed to the system bot user.
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
-
3500
3348
  export type ConversationReplyParams =
3501
3349
  | ConversationReplyParams.ContactReplyBody
3502
3350
  | ConversationReplyParams.AdminReplyBody;
@@ -3581,6 +3429,74 @@ export declare namespace ConversationReplyParams {
3581
3429
  }
3582
3430
  }
3583
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
+
3584
3500
  export interface ConversationSearchParams {
3585
3501
  /**
3586
3502
  * Body param: An opaque cursor for pagination. Use the nextCursor value from a
@@ -3588,6 +3504,13 @@ export interface ConversationSearchParams {
3588
3504
  */
3589
3505
  cursor?: string;
3590
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
+
3591
3514
  /**
3592
3515
  * Body param: A limit on the number of objects to be returned, between 1 and 100.
3593
3516
  */
@@ -3595,10 +3518,12 @@ export interface ConversationSearchParams {
3595
3518
 
3596
3519
  /**
3597
3520
  * Body param: Structured filter AST. Either a single filter clause or one
3598
- * top-level AND group. Use this for filtering by `state`, `tag_ids`,
3599
- * `admin_assignee_id`, etc.
3521
+ * top-level AND group. Use this for filtering by `state`, `tagIds`,
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.)
3600
3525
  */
3601
- query?: ConversationSearchParams.SearchFilter | ConversationSearchParams.SearchFilterGroup;
3526
+ query?: PostsAPI.SearchFilter | PostsAPI.SearchFilterGroup;
3602
3527
 
3603
3528
  /**
3604
3529
  * Body param: Plain-text full-text search across conversation messages.
@@ -3608,11 +3533,12 @@ export interface ConversationSearchParams {
3608
3533
 
3609
3534
  /**
3610
3535
  * Body param: Result ordering. When omitted, filter mode defaults to
3611
- * last_activity_at:desc and search mode defaults to relevance ranking. When set,
3536
+ * `lastActivityAt:desc` and search mode defaults to relevance ranking. When set,
3612
3537
  * both modes order by lastActivityAt in the requested direction (so you can ask a
3613
- * search query to return its hits in chronological order).
3538
+ * search query to return its hits in chronological order). Snake_case
3539
+ * `last_activity_at:*` is accepted for back-compat — prefer camelCase in new code.
3614
3540
  */
3615
- sort?: 'last_activity_at:desc' | 'last_activity_at:asc';
3541
+ sort?: 'lastActivityAt:desc' | 'lastActivityAt:asc' | 'last_activity_at:desc' | 'last_activity_at:asc';
3616
3542
 
3617
3543
  /**
3618
3544
  * Header param: API version for this request. Defaults to your organization's
@@ -3621,83 +3547,38 @@ export interface ConversationSearchParams {
3621
3547
  'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
3622
3548
  }
3623
3549
 
3624
- export namespace ConversationSearchParams {
3625
- export interface SearchFilter {
3626
- /**
3627
- * Field name to filter on (e.g. `state`, `tag_ids`, `created_at`)
3628
- */
3629
- field: string;
3630
-
3631
- /**
3632
- * Comparison operator
3633
- */
3634
- operator: '=' | '!=' | 'IN' | 'NIN' | '>' | '<' | '>=' | '<=' | '~' | '!~' | '^' | '$';
3635
-
3636
- /**
3637
- * Value to compare against (primitive or array of primitives)
3638
- */
3639
- value: string | number | boolean | Array<string | number> | null;
3640
- }
3641
-
3642
- export interface SearchFilterGroup {
3643
- /**
3644
- * Group operator: AND (all match) or OR (any match)
3645
- */
3646
- operator: 'AND' | 'OR';
3647
-
3648
- /**
3649
- * Array of filter clauses (1-15 entries)
3650
- */
3651
- value: Array<SearchFilterGroup.Value>;
3652
- }
3653
-
3654
- export namespace SearchFilterGroup {
3655
- export interface Value {
3656
- /**
3657
- * Field name to filter on (e.g. `state`, `tag_ids`, `created_at`)
3658
- */
3659
- field: string;
3660
-
3661
- /**
3662
- * Comparison operator
3663
- */
3664
- operator: '=' | '!=' | 'IN' | 'NIN' | '>' | '<' | '>=' | '<=' | '~' | '!~' | '^' | '$';
3665
-
3666
- /**
3667
- * Value to compare against (primitive or array of primitives)
3668
- */
3669
- value: string | number | boolean | Array<string | number> | null;
3670
- }
3671
- }
3672
- }
3673
-
3674
3550
  Conversations.Participants = Participants;
3675
3551
 
3676
3552
  export declare namespace Conversations {
3677
3553
  export {
3554
+ type AttachedConversationTag as AttachedConversationTag,
3678
3555
  type Conversation as Conversation,
3556
+ type ConversationAttributeValue as ConversationAttributeValue,
3679
3557
  type ConversationPart as ConversationPart,
3680
3558
  type ConversationPartAuthor as ConversationPartAuthor,
3681
3559
  type ConversationParticipant as ConversationParticipant,
3682
3560
  type ConversationTagApplication as ConversationTagApplication,
3561
+ type ConversationTagMutationActor as ConversationTagMutationActor,
3683
3562
  type CsatEmailDelivery as CsatEmailDelivery,
3684
3563
  type CsatRatedAgent as CsatRatedAgent,
3564
+ type CsatSlackDelivery as CsatSlackDelivery,
3685
3565
  type CsatWorkflowLink as CsatWorkflowLink,
3686
3566
  type EmailRecipients as EmailRecipients,
3567
+ type MessageSource as MessageSource,
3568
+ type SearchMatchingPartAuthor as SearchMatchingPartAuthor,
3569
+ type SlackMessageDetails as SlackMessageDetails,
3687
3570
  type ConversationDeleteResponse as ConversationDeleteResponse,
3688
- type ConversationAttachTagResponse as ConversationAttachTagResponse,
3689
- type ConversationDetachTagResponse as ConversationDetachTagResponse,
3690
3571
  type ConversationSearchResponse as ConversationSearchResponse,
3691
3572
  type ConversationsCursorPage as ConversationsCursorPage,
3573
+ type ConversationListParams as ConversationListParams,
3692
3574
  type ConversationCreateParams as ConversationCreateParams,
3693
3575
  type ConversationRetrieveParams as ConversationRetrieveParams,
3694
- type ConversationUpdateParams as ConversationUpdateParams,
3695
- type ConversationListParams as ConversationListParams,
3696
3576
  type ConversationDeleteParams as ConversationDeleteParams,
3577
+ type ConversationUpdateParams as ConversationUpdateParams,
3578
+ type ConversationReplyParams as ConversationReplyParams,
3579
+ type ConversationRedactParams as ConversationRedactParams,
3697
3580
  type ConversationAttachTagParams as ConversationAttachTagParams,
3698
3581
  type ConversationDetachTagParams as ConversationDetachTagParams,
3699
- type ConversationRedactParams as ConversationRedactParams,
3700
- type ConversationReplyParams as ConversationReplyParams,
3701
3582
  type ConversationSearchParams as ConversationSearchParams,
3702
3583
  };
3703
3584