@graph8/sdk 0.251.0 → 0.262.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 (350) hide show
  1. package/README.md +9 -2
  2. package/dist/cli.js +216 -0
  3. package/dist/index.d.mts +105 -7
  4. package/dist/index.d.ts +105 -7
  5. package/dist/index.js +44 -3
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.mjs +44 -3
  8. package/dist/index.mjs.map +1 -1
  9. package/dist/react.d.mts +103 -7
  10. package/dist/react.d.ts +103 -7
  11. package/dist/react.js +62 -11
  12. package/dist/react.js.map +1 -1
  13. package/dist/react.mjs +53 -12
  14. package/dist/react.mjs.map +1 -1
  15. package/dist/types/README.md +7 -0
  16. package/dist/types/agency.d.ts +20 -0
  17. package/dist/types/agentSetup.d.ts +57 -0
  18. package/dist/types/api.d.ts +127 -0
  19. package/dist/types/appClient.d.ts +99 -0
  20. package/dist/types/appPlatform.d.ts +269 -0
  21. package/dist/types/appTokens.d.ts +125 -0
  22. package/dist/types/apps.d.ts +130 -0
  23. package/dist/types/audiences.d.ts +88 -0
  24. package/dist/types/calendar.d.ts +55 -0
  25. package/dist/types/campaigns.d.ts +61 -0
  26. package/dist/types/chat.d.ts +35 -0
  27. package/dist/types/cli.d.ts +14 -0
  28. package/dist/types/companies.d.ts +123 -0
  29. package/dist/types/contacts.d.ts +200 -0
  30. package/dist/types/copilot.d.ts +31 -0
  31. package/dist/types/core.d.ts +1052 -0
  32. package/dist/types/deals.d.ts +215 -0
  33. package/dist/types/enrich.d.ts +51 -0
  34. package/dist/types/fields.d.ts +84 -0
  35. package/dist/types/forms.d.ts +16 -0
  36. package/dist/types/http.d.ts +141 -0
  37. package/dist/types/inbox.d.ts +123 -0
  38. package/dist/types/index.d.ts +63 -0
  39. package/dist/types/intent.d.ts +196 -0
  40. package/dist/types/lists.d.ts +44 -0
  41. package/dist/types/mailboxes.d.ts +240 -0
  42. package/dist/types/marketplace.d.ts +62 -0
  43. package/dist/types/meetings.d.ts +70 -0
  44. package/dist/types/newsletter.d.ts +212 -0
  45. package/dist/types/notes.d.ts +57 -0
  46. package/dist/types/objects.d.ts +281 -0
  47. package/dist/types/pipelines.d.ts +135 -0
  48. package/dist/types/quotes.d.ts +143 -0
  49. package/dist/types/react.d.ts +978 -0
  50. package/dist/types/search.d.ts +99 -0
  51. package/dist/types/sequences.d.ts +255 -0
  52. package/dist/types/signals.d.ts +28 -0
  53. package/dist/types/skills.d.ts +176 -0
  54. package/dist/types/snippet.d.ts +24 -0
  55. package/dist/types/studio.d.ts +161 -0
  56. package/dist/types/tasks.d.ts +101 -0
  57. package/dist/types/types.d.ts +45 -0
  58. package/dist/types/utils.d.ts +21 -0
  59. package/dist/types/version.d.ts +10 -0
  60. package/dist/types/visitors.d.ts +29 -0
  61. package/dist/types/voice.d.ts +304 -0
  62. package/dist/types/webhooks.d.ts +71 -0
  63. package/dist/types/workflows.d.ts +229 -0
  64. package/docs/agents.md +748 -0
  65. package/docs/api/README.md +165 -0
  66. package/docs/api/accounts.d.ts +396 -0
  67. package/docs/api/accounts.md +644 -0
  68. package/docs/api/adCampaigns.d.ts +707 -0
  69. package/docs/api/adCampaigns.md +1091 -0
  70. package/docs/api/adCreatives.d.ts +996 -0
  71. package/docs/api/adCreatives.md +1708 -0
  72. package/docs/api/agency.d.ts +556 -0
  73. package/docs/api/agency.md +845 -0
  74. package/docs/api/agent.d.ts +330 -0
  75. package/docs/api/agent.md +514 -0
  76. package/docs/api/agents.d.ts +1622 -0
  77. package/docs/api/agents.md +2860 -0
  78. package/docs/api/aiInbox.d.ts +1984 -0
  79. package/docs/api/aiInbox.md +3490 -0
  80. package/docs/api/analytics.d.ts +1273 -0
  81. package/docs/api/analytics.md +2095 -0
  82. package/docs/api/apiKeys.d.ts +252 -0
  83. package/docs/api/apiKeys.md +318 -0
  84. package/docs/api/appDeployments.d.ts +236 -0
  85. package/docs/api/appDeployments.md +471 -0
  86. package/docs/api/appDomains.d.ts +171 -0
  87. package/docs/api/appDomains.md +281 -0
  88. package/docs/api/appLogs.d.ts +120 -0
  89. package/docs/api/appLogs.md +159 -0
  90. package/docs/api/appObjects.d.ts +415 -0
  91. package/docs/api/appObjects.md +568 -0
  92. package/docs/api/appPages.d.ts +557 -0
  93. package/docs/api/appPages.md +796 -0
  94. package/docs/api/appPlatformTokens.d.ts +123 -0
  95. package/docs/api/appPlatformTokens.md +172 -0
  96. package/docs/api/appointments.d.ts +2361 -0
  97. package/docs/api/appointments.md +3917 -0
  98. package/docs/api/apps.d.ts +822 -0
  99. package/docs/api/apps.md +1342 -0
  100. package/docs/api/assertUpsert.d.ts +286 -0
  101. package/docs/api/assertUpsert.md +370 -0
  102. package/docs/api/audienceSyncs.d.ts +259 -0
  103. package/docs/api/audienceSyncs.md +395 -0
  104. package/docs/api/brandKit.d.ts +686 -0
  105. package/docs/api/brandKit.md +1133 -0
  106. package/docs/api/bugReports.d.ts +181 -0
  107. package/docs/api/bugReports.md +268 -0
  108. package/docs/api/by-path.md +3260 -0
  109. package/docs/api/calendarInvites.d.ts +117 -0
  110. package/docs/api/calendarInvites.md +148 -0
  111. package/docs/api/campaignWorkflows.d.ts +152 -0
  112. package/docs/api/campaignWorkflows.md +200 -0
  113. package/docs/api/campaigns.d.ts +721 -0
  114. package/docs/api/campaigns.md +1236 -0
  115. package/docs/api/channels.d.ts +171 -0
  116. package/docs/api/channels.md +235 -0
  117. package/docs/api/cliCampaigns.d.ts +205 -0
  118. package/docs/api/cliCampaigns.md +256 -0
  119. package/docs/api/cliPipelines.d.ts +324 -0
  120. package/docs/api/cliPipelines.md +562 -0
  121. package/docs/api/clickHouse.d.ts +115 -0
  122. package/docs/api/clickHouse.md +138 -0
  123. package/docs/api/companies.d.ts +1636 -0
  124. package/docs/api/companies.md +2211 -0
  125. package/docs/api/companyIntelligence.d.ts +299 -0
  126. package/docs/api/companyIntelligence.md +488 -0
  127. package/docs/api/contacts.d.ts +2173 -0
  128. package/docs/api/contacts.md +3143 -0
  129. package/docs/api/content.d.ts +968 -0
  130. package/docs/api/content.md +1667 -0
  131. package/docs/api/contentGridSkills.d.ts +177 -0
  132. package/docs/api/contentGridSkills.md +271 -0
  133. package/docs/api/copilot.d.ts +1017 -0
  134. package/docs/api/copilot.md +1765 -0
  135. package/docs/api/crmSyncs.d.ts +215 -0
  136. package/docs/api/crmSyncs.md +301 -0
  137. package/docs/api/customerSuccess.d.ts +491 -0
  138. package/docs/api/customerSuccess.md +776 -0
  139. package/docs/api/deals.d.ts +1697 -0
  140. package/docs/api/deals.md +2436 -0
  141. package/docs/api/deliverability.d.ts +418 -0
  142. package/docs/api/deliverability.md +677 -0
  143. package/docs/api/desk.d.ts +1765 -0
  144. package/docs/api/desk.md +3007 -0
  145. package/docs/api/dialer.d.ts +1185 -0
  146. package/docs/api/dialer.md +2166 -0
  147. package/docs/api/dialerAnalytics.d.ts +187 -0
  148. package/docs/api/dialerAnalytics.md +257 -0
  149. package/docs/api/documents.d.ts +895 -0
  150. package/docs/api/documents.md +1440 -0
  151. package/docs/api/duplicates.d.ts +195 -0
  152. package/docs/api/duplicates.md +315 -0
  153. package/docs/api/eSign.d.ts +38 -0
  154. package/docs/api/eSign.md +54 -0
  155. package/docs/api/eSignature.d.ts +242 -0
  156. package/docs/api/eSignature.md +341 -0
  157. package/docs/api/enrichment.d.ts +3207 -0
  158. package/docs/api/enrichment.md +5225 -0
  159. package/docs/api/events.d.ts +115 -0
  160. package/docs/api/events.md +105 -0
  161. package/docs/api/fields.d.ts +482 -0
  162. package/docs/api/fields.md +566 -0
  163. package/docs/api/forms.d.ts +1012 -0
  164. package/docs/api/forms.md +1542 -0
  165. package/docs/api/gtmCampaigns.d.ts +662 -0
  166. package/docs/api/gtmCampaigns.md +1044 -0
  167. package/docs/api/gtmContext.d.ts +1187 -0
  168. package/docs/api/gtmContext.md +2112 -0
  169. package/docs/api/gtmDeliverability.d.ts +60 -0
  170. package/docs/api/gtmDeliverability.md +63 -0
  171. package/docs/api/gtmKnowledgeBase.d.ts +76 -0
  172. package/docs/api/gtmKnowledgeBase.md +91 -0
  173. package/docs/api/gtmLaunchHelpers.d.ts +123 -0
  174. package/docs/api/gtmLaunchHelpers.md +148 -0
  175. package/docs/api/gtmLibrary.d.ts +448 -0
  176. package/docs/api/gtmLibrary.md +780 -0
  177. package/docs/api/health.d.ts +39 -0
  178. package/docs/api/health.md +58 -0
  179. package/docs/api/imageLibrary.d.ts +341 -0
  180. package/docs/api/imageLibrary.md +569 -0
  181. package/docs/api/imports.d.ts +157 -0
  182. package/docs/api/imports.md +174 -0
  183. package/docs/api/inbox.d.ts +709 -0
  184. package/docs/api/inbox.md +1067 -0
  185. package/docs/api/install.d.ts +213 -0
  186. package/docs/api/install.md +317 -0
  187. package/docs/api/installedApps.d.ts +131 -0
  188. package/docs/api/installedApps.md +241 -0
  189. package/docs/api/integrationStatus.d.ts +142 -0
  190. package/docs/api/integrationStatus.md +205 -0
  191. package/docs/api/integrations.d.ts +2327 -0
  192. package/docs/api/integrations.md +3791 -0
  193. package/docs/api/intent.d.ts +482 -0
  194. package/docs/api/intent.md +858 -0
  195. package/docs/api/knowledge.d.ts +501 -0
  196. package/docs/api/knowledge.md +843 -0
  197. package/docs/api/knowledgeBase.d.ts +84 -0
  198. package/docs/api/knowledgeBase.md +96 -0
  199. package/docs/api/landingPages.d.ts +1411 -0
  200. package/docs/api/landingPages.md +2488 -0
  201. package/docs/api/leads.d.ts +133 -0
  202. package/docs/api/leads.md +180 -0
  203. package/docs/api/library.d.ts +217 -0
  204. package/docs/api/library.md +338 -0
  205. package/docs/api/linkedIn.d.ts +227 -0
  206. package/docs/api/linkedIn.md +289 -0
  207. package/docs/api/linkedInOutreach.d.ts +727 -0
  208. package/docs/api/linkedInOutreach.md +990 -0
  209. package/docs/api/lists.d.ts +1106 -0
  210. package/docs/api/lists.md +1609 -0
  211. package/docs/api/logs.d.ts +71 -0
  212. package/docs/api/logs.md +70 -0
  213. package/docs/api/mailboxes.d.ts +1050 -0
  214. package/docs/api/mailboxes.md +1690 -0
  215. package/docs/api/marketingIntelligence.d.ts +256 -0
  216. package/docs/api/marketingIntelligence.md +454 -0
  217. package/docs/api/marketplace.d.ts +3173 -0
  218. package/docs/api/marketplace.md +5953 -0
  219. package/docs/api/mcp.d.ts +69 -0
  220. package/docs/api/mcp.md +69 -0
  221. package/docs/api/me.d.ts +54 -0
  222. package/docs/api/me.md +56 -0
  223. package/docs/api/meetings.d.ts +539 -0
  224. package/docs/api/meetings.md +747 -0
  225. package/docs/api/newsletter.d.ts +1613 -0
  226. package/docs/api/newsletter.md +2746 -0
  227. package/docs/api/notes.d.ts +517 -0
  228. package/docs/api/notes.md +888 -0
  229. package/docs/api/notifications.d.ts +94 -0
  230. package/docs/api/notifications.md +105 -0
  231. package/docs/api/objects.d.ts +621 -0
  232. package/docs/api/objects.md +1098 -0
  233. package/docs/api/openSearch.d.ts +234 -0
  234. package/docs/api/openSearch.md +297 -0
  235. package/docs/api/ops.d.ts +299 -0
  236. package/docs/api/ops.md +339 -0
  237. package/docs/api/orgGovernance.d.ts +393 -0
  238. package/docs/api/orgGovernance.md +623 -0
  239. package/docs/api/orgVideos.d.ts +184 -0
  240. package/docs/api/orgVideos.md +252 -0
  241. package/docs/api/organizationSettings.d.ts +626 -0
  242. package/docs/api/organizationSettings.md +911 -0
  243. package/docs/api/phoneNumbers.d.ts +484 -0
  244. package/docs/api/phoneNumbers.md +777 -0
  245. package/docs/api/profile.d.ts +329 -0
  246. package/docs/api/profile.md +540 -0
  247. package/docs/api/programmaticPages.d.ts +400 -0
  248. package/docs/api/programmaticPages.md +626 -0
  249. package/docs/api/providerDomains.d.ts +866 -0
  250. package/docs/api/providerDomains.md +1446 -0
  251. package/docs/api/providerUsage.d.ts +129 -0
  252. package/docs/api/providerUsage.md +186 -0
  253. package/docs/api/public.d.ts +69 -0
  254. package/docs/api/public.md +78 -0
  255. package/docs/api/publicCopilot.d.ts +67 -0
  256. package/docs/api/publicCopilot.md +80 -0
  257. package/docs/api/publicSignals.d.ts +66 -0
  258. package/docs/api/publicSignals.md +71 -0
  259. package/docs/api/publicVisitors.d.ts +97 -0
  260. package/docs/api/publicVisitors.md +118 -0
  261. package/docs/api/quotes.d.ts +1564 -0
  262. package/docs/api/quotes.md +2553 -0
  263. package/docs/api/radar.d.ts +808 -0
  264. package/docs/api/radar.md +1431 -0
  265. package/docs/api/radarReports.d.ts +208 -0
  266. package/docs/api/radarReports.md +306 -0
  267. package/docs/api/recordRoles.d.ts +143 -0
  268. package/docs/api/recordRoles.md +175 -0
  269. package/docs/api/repos.d.ts +146 -0
  270. package/docs/api/repos.md +211 -0
  271. package/docs/api/research.d.ts +295 -0
  272. package/docs/api/research.md +534 -0
  273. package/docs/api/revenue.d.ts +402 -0
  274. package/docs/api/revenue.md +608 -0
  275. package/docs/api/revenueAnalytics.d.ts +147 -0
  276. package/docs/api/revenueAnalytics.md +212 -0
  277. package/docs/api/revenueLifecycle.d.ts +207 -0
  278. package/docs/api/revenueLifecycle.md +274 -0
  279. package/docs/api/revenueRecords.d.ts +372 -0
  280. package/docs/api/revenueRecords.md +563 -0
  281. package/docs/api/roles.d.ts +431 -0
  282. package/docs/api/roles.md +812 -0
  283. package/docs/api/salesCoach.d.ts +877 -0
  284. package/docs/api/salesCoach.md +1540 -0
  285. package/docs/api/sandbox.d.ts +210 -0
  286. package/docs/api/sandbox.md +380 -0
  287. package/docs/api/scans.d.ts +104 -0
  288. package/docs/api/scans.md +136 -0
  289. package/docs/api/scheduleBuy.d.ts +293 -0
  290. package/docs/api/scheduleBuy.md +431 -0
  291. package/docs/api/scraping.d.ts +266 -0
  292. package/docs/api/scraping.md +383 -0
  293. package/docs/api/sdrAnalytics.d.ts +138 -0
  294. package/docs/api/sdrAnalytics.md +246 -0
  295. package/docs/api/search.d.ts +598 -0
  296. package/docs/api/search.md +866 -0
  297. package/docs/api/seo.d.ts +447 -0
  298. package/docs/api/seo.md +660 -0
  299. package/docs/api/sequenceLifecycle.d.ts +439 -0
  300. package/docs/api/sequenceLifecycle.md +513 -0
  301. package/docs/api/sequences.d.ts +1936 -0
  302. package/docs/api/sequences.md +3232 -0
  303. package/docs/api/settings.d.ts +448 -0
  304. package/docs/api/settings.md +731 -0
  305. package/docs/api/signals.d.ts +1441 -0
  306. package/docs/api/signals.md +2526 -0
  307. package/docs/api/signatures.d.ts +719 -0
  308. package/docs/api/signatures.md +1247 -0
  309. package/docs/api/skills.d.ts +230 -0
  310. package/docs/api/skills.md +466 -0
  311. package/docs/api/snippet.d.ts +85 -0
  312. package/docs/api/snippet.md +106 -0
  313. package/docs/api/socialPublishing.d.ts +824 -0
  314. package/docs/api/socialPublishing.md +1245 -0
  315. package/docs/api/studioDocuments.d.ts +244 -0
  316. package/docs/api/studioDocuments.md +348 -0
  317. package/docs/api/support.d.ts +90 -0
  318. package/docs/api/support.md +76 -0
  319. package/docs/api/suppressions.d.ts +241 -0
  320. package/docs/api/suppressions.md +343 -0
  321. package/docs/api/surveys.d.ts +847 -0
  322. package/docs/api/surveys.md +1223 -0
  323. package/docs/api/tasks.d.ts +813 -0
  324. package/docs/api/tasks.md +1344 -0
  325. package/docs/api/teamMembers.d.ts +668 -0
  326. package/docs/api/teamMembers.md +1040 -0
  327. package/docs/api/teams.d.ts +784 -0
  328. package/docs/api/teams.md +1395 -0
  329. package/docs/api/usage.d.ts +277 -0
  330. package/docs/api/usage.md +389 -0
  331. package/docs/api/visitors.d.ts +690 -0
  332. package/docs/api/visitors.md +1075 -0
  333. package/docs/api/voice.d.ts +4661 -0
  334. package/docs/api/voice.md +7905 -0
  335. package/docs/api/webAnalytics.d.ts +964 -0
  336. package/docs/api/webAnalytics.md +1452 -0
  337. package/docs/api/webChat.d.ts +1704 -0
  338. package/docs/api/webChat.md +2048 -0
  339. package/docs/api/webhooks.d.ts +251 -0
  340. package/docs/api/webhooks.md +386 -0
  341. package/docs/api/websiteEditor.d.ts +324 -0
  342. package/docs/api/websiteEditor.md +517 -0
  343. package/docs/api/work.d.ts +2298 -0
  344. package/docs/api/work.md +3096 -0
  345. package/docs/api/workbench.d.ts +2962 -0
  346. package/docs/api/workbench.md +4884 -0
  347. package/docs/api/workflows.d.ts +1218 -0
  348. package/docs/api/workflows.md +2302 -0
  349. package/docs/sdk-clients.md +4339 -0
  350. package/package.json +10 -3
@@ -0,0 +1,3490 @@
1
+ <!-- Generated by sdk/js/scripts/generate-agent-docs.ts from developer-contract/openapi.json. Regenerated on every build. -->
2
+
3
+ # `g8.api.aiInbox`: AI Inbox
4
+
5
+ 79 operations (32 read, 26 write, 10 destructive, 1 billable, 10 external).
6
+
7
+ No hand-written client covers this area. Call it through `g8.api.aiInbox.*` as shown below, or by operationId with `g8.api.call(operationId, input)`.
8
+
9
+ Every example below assumes this setup (server-side, API key):
10
+
11
+ ```ts
12
+ import { g8 } from "@graph8/sdk";
13
+
14
+ g8.init({ apiKey: process.env.G8_API_KEY! });
15
+ ```
16
+
17
+ Example values are placeholders that match each field's type. Only required fields are shown. Every example is type-checked against the SDK in CI.
18
+
19
+ Exact TypeScript types for every operation on this page, and every schema they use: [aiInbox.d.ts](aiInbox.d.ts).
20
+
21
+ ## Operations
22
+
23
+ | Call | HTTP | Tier | Scope | Summary |
24
+ |---|---|---|---|---|
25
+ | [`activateInboxMailboxes`](#op-activateinboxmailboxes) | `POST /api/v1/inbox/mailboxes/activate` | external | `inbox:run` | Activate Inbox Mailboxes |
26
+ | [`addChannelComment`](#op-addchannelcomment) | `POST /api/v1/inbox/channels/{channel_id}/comments` | write | `inbox:write` | Add Channel Comment |
27
+ | [`addChannelTag`](#op-addchanneltag) | `POST /api/v1/inbox/channels/{channel_id}/tags` | write | `inbox:write` | Add Channel Tag |
28
+ | [`addMailboxToWorkspace`](#op-addmailboxtoworkspace) | `POST /api/v1/inbox/workspaces/{workspace_id}/mailboxes` | write | `inbox:write` | Add Mailbox To Workspace |
29
+ | [`assignChannel`](#op-assignchannel) | `POST /api/v1/inbox/channels/{channel_id}/assign` | write | `inbox:write` | Assign Channel |
30
+ | [`blockInboxSender`](#op-blockinboxsender) | `POST /api/v1/inbox/blocked-senders` | write | `inbox:write` | Block Inbox Sender |
31
+ | [`clearMeetingTranscriptLink`](#op-clearmeetingtranscriptlink) | `DELETE /api/v1/inbox/meetings/{meeting_id}/transcript-link` | destructive | `meetings:delete` | Clear Meeting Transcript Link |
32
+ | [`composeInboxEmail`](#op-composeinboxemail) | `POST /api/v1/inbox/emails/compose` | external | `inbox:run` | Compose Inbox Email |
33
+ | [`composeInboxLinkedinMessage`](#op-composeinboxlinkedinmessage) | `POST /api/v1/inbox/linkedin/compose` | external | `inbox:run` | Compose Inbox Linkedin Message |
34
+ | [`composeInboxSms`](#op-composeinboxsms) | `POST /api/v1/inbox/sms/compose` | external | `inbox:run` | Compose Inbox Sms |
35
+ | [`createInboxAgent`](#op-createinboxagent) | `POST /api/v1/inbox/agents` | write | `inbox:write` | Create Inbox Agent |
36
+ | [`createInboxTag`](#op-createinboxtag) | `POST /api/v1/inbox/tags` | write | `inbox:write` | Create Inbox Tag |
37
+ | [`createMeetingTask`](#op-createmeetingtask) | `POST /api/v1/inbox/meetings/{meeting_id}/tasks` | write | `meetings:write` | Create Meeting Task |
38
+ | [`deactivateInboxMailboxes`](#op-deactivateinboxmailboxes) | `POST /api/v1/inbox/mailboxes/deactivate` | write | `inbox:write` | Deactivate Inbox Mailboxes |
39
+ | [`deleteInboxEmailDraft`](#op-deleteinboxemaildraft) | `DELETE /api/v1/inbox/drafts/emails/{draft_id}` | destructive | `inbox:delete` | Delete Inbox Email Draft |
40
+ | [`deleteInboxLinkedinDraft`](#op-deleteinboxlinkedindraft) | `DELETE /api/v1/inbox/linkedin/accounts/{account_id}/conversations/{conversation_id}/draft` | destructive | `inbox:delete` | Delete Inbox Linkedin Draft |
41
+ | [`deleteInboxTag`](#op-deleteinboxtag) | `DELETE /api/v1/inbox/tags/{tag_id}` | destructive | `inbox:delete` | Delete Inbox Tag |
42
+ | [`deleteMeetingTask`](#op-deletemeetingtask) | `DELETE /api/v1/inbox/meetings/tasks/{task_id}` | destructive | `meetings:delete` | Delete Meeting Task |
43
+ | [`disableInboxLinkedinAccount`](#op-disableinboxlinkedinaccount) | `POST /api/v1/inbox/linkedin/accounts/{account_id}/disable` | write | `inbox:write` | Disable Inbox Linkedin Account |
44
+ | [`downloadInboxAttachment`](#op-downloadinboxattachment) | `GET /api/v1/inbox/attachments/{token}` | read | `inbox:read` | Download Inbox Attachment |
45
+ | [`enableInboxLinkedinAccount`](#op-enableinboxlinkedinaccount) | `POST /api/v1/inbox/linkedin/accounts/{account_id}/enable` | external | `inbox:run` | Enable Inbox Linkedin Account |
46
+ | [`generateInboxDraft`](#op-generateinboxdraft) | `POST /api/v1/inbox/drafts/generate` | billable | `inbox:run` | Generate Inbox Draft |
47
+ | [`getAssigneeEligibility`](#op-getassigneeeligibility) | `GET /api/v1/inbox/channels/{channel_id}/assignee-eligibility` | read | `inbox:read` | Get Assignee Eligibility |
48
+ | [`getInboxCallResult`](#op-getinboxcallresult) | `GET /api/v1/inbox/call-results/{call_id}` | read | `inbox:read` | Get Inbox Call Result |
49
+ | [`getInboxChannel`](#op-getinboxchannel) | `GET /api/v1/inbox/channels/{channel_id}` | read | `inbox:read` | Get Inbox Channel |
50
+ | [`getInboxEmailSettings`](#op-getinboxemailsettings) | `GET /api/v1/inbox/email-settings` | read | `inbox:read` | Get Inbox Email Settings |
51
+ | [`getInboxLinkedinAccount`](#op-getinboxlinkedinaccount) | `GET /api/v1/inbox/linkedin/accounts/{account_id}` | read | `inbox:read` | Get Inbox Linkedin Account |
52
+ | [`getInboxLinkedinConversation`](#op-getinboxlinkedinconversation) | `GET /api/v1/inbox/linkedin/accounts/{account_id}/conversations/{conversation_id}` | read | `inbox:read` | Get Inbox Linkedin Conversation |
53
+ | [`getInboxLinkedinConversationDetail`](#op-getinboxlinkedinconversationdetail) | `GET /api/v1/inbox/linkedin/accounts/{account_id}/conversations/{conversation_id}/detail` | read | `inbox:read` | Get Inbox Linkedin Conversation Detail |
54
+ | [`getInboxMailboxSync`](#op-getinboxmailboxsync) | `GET /api/v1/inbox/mailboxes/{mailbox}/sync` | read | `inbox:read` | Get Inbox Mailbox Sync |
55
+ | [`getInboxTagAgent`](#op-getinboxtagagent) | `GET /api/v1/inbox/tags/{tag_id}/agent` | read | `inbox:read` | Get Inbox Tag Agent |
56
+ | [`getInboxWorkspace`](#op-getinboxworkspace) | `GET /api/v1/inbox/workspaces/{workspace_id}` | read | `inbox:read` | Get Inbox Workspace |
57
+ | [`getSequenceChannels`](#op-getsequencechannels) | `GET /api/v1/inbox/workspaces/sequence-channels/{sequence_id}` | read | `inbox:read` | Get Sequence Channels |
58
+ | [`getWorkspaceUnreadCounts`](#op-getworkspaceunreadcounts) | `GET /api/v1/inbox/workspaces/unread-counts` | read | `inbox:read` | Get Workspace Unread Counts |
59
+ | [`linkInboxEmailToSequence`](#op-linkinboxemailtosequence) | `POST /api/v1/inbox/emails/{email_id}/link-sequence` | write | `inbox:write` | Link Inbox Email To Sequence |
60
+ | [`linkMeetingTranscript`](#op-linkmeetingtranscript) | `POST /api/v1/inbox/meetings/{meeting_id}/transcript-link` | write | `meetings:write` | Link Meeting Transcript |
61
+ | [`listAllInboxMailboxes`](#op-listallinboxmailboxes) | `GET /api/v1/inbox/mailboxes/all` | read | `inbox:read` | List All Inbox Mailboxes |
62
+ | [`listAssignableMeetingUsers`](#op-listassignablemeetingusers) | `GET /api/v1/inbox/meetings/{meeting_id}/assignable-users` | read | `meetings:read` | List Assignable Meeting Users |
63
+ | [`listChannelComments`](#op-listchannelcomments) | `GET /api/v1/inbox/channels/{channel_id}/comments` | read | `inbox:read` | List Channel Comments |
64
+ | [`listInboxBlockedSenders`](#op-listinboxblockedsenders) | `GET /api/v1/inbox/blocked-senders` | read | `inbox:read` | List Inbox Blocked Senders |
65
+ | [`listInboxEmailSequenceCandidates`](#op-listinboxemailsequencecandidates) | `GET /api/v1/inbox/emails/{email_id}/sequence-candidates` | read | `inbox:read` | List Inbox Email Sequence Candidates |
66
+ | [`listInboxEmailSettingsTimezones`](#op-listinboxemailsettingstimezones) | `GET /api/v1/inbox/email-settings/timezones` | read | `inbox:read` | List Inbox Email Settings Timezones |
67
+ | [`listInboxEmailsBySequence`](#op-listinboxemailsbysequence) | `GET /api/v1/inbox/emails/by-sequence/{sequence_id}` | read | `inbox:read` | List Inbox Emails By Sequence |
68
+ | [`listInboxLinkedinAccounts`](#op-listinboxlinkedinaccounts) | `GET /api/v1/inbox/linkedin/accounts` | read | `inbox:read` | List Inbox Linkedin Accounts |
69
+ | [`listInboxMailboxes`](#op-listinboxmailboxes) | `GET /api/v1/inbox/mailboxes` | read | `inbox:read` | List Inbox Mailboxes |
70
+ | [`listInboxMailboxesPaginated`](#op-listinboxmailboxespaginated) | `GET /api/v1/inbox/mailboxes/paginated` | read | `inbox:read` | List Inbox Mailboxes Paginated |
71
+ | [`listInboxUsers`](#op-listinboxusers) | `GET /api/v1/inbox/users` | read | `inbox:read` | List Inbox Users |
72
+ | [`listInboxWorkspaces`](#op-listinboxworkspaces) | `GET /api/v1/inbox/workspaces` | read | `inbox:read` | List Inbox Workspaces |
73
+ | [`listMailboxAssociatedSequences`](#op-listmailboxassociatedsequences) | `POST /api/v1/inbox/mailboxes/associated-sequences` | read | `inbox:read` | List Mailbox Associated Sequences |
74
+ | [`listMeetingTasks`](#op-listmeetingtasks) | `GET /api/v1/inbox/meetings/{meeting_id}/tasks` | read | `meetings:read` | List Meeting Tasks |
75
+ | [`listMyMeetingTasks`](#op-listmymeetingtasks) | `GET /api/v1/inbox/meetings/my-tasks` | read | `meetings:read` | List My Meeting Tasks |
76
+ | [`markInboxEmailRead`](#op-markinboxemailread) | `POST /api/v1/inbox/emails/{email_id}/mark-read` | write | `inbox:write` | Mark Inbox Email Read |
77
+ | [`markInboxLinkedinConversationRead`](#op-markinboxlinkedinconversationread) | `POST /api/v1/inbox/linkedin/accounts/{account_id}/conversations/{conversation_id}/read` | write | `inbox:write` | Mark Inbox Linkedin Conversation Read |
78
+ | [`markInboxLinkedinConversationUnread`](#op-markinboxlinkedinconversationunread) | `POST /api/v1/inbox/linkedin/accounts/{account_id}/conversations/{conversation_id}/unread` | write | `inbox:write` | Mark Inbox Linkedin Conversation Unread |
79
+ | [`markInboxSmsRead`](#op-markinboxsmsread) | `POST /api/v1/inbox/sms/{thread_id}/mark-read` | write | `inbox:write` | Mark Inbox Sms Read |
80
+ | [`markMeetingNoTranscriptExpected`](#op-markmeetingnotranscriptexpected) | `POST /api/v1/inbox/meetings/{meeting_id}/no-transcript` | write | `meetings:write` | Mark Meeting No Transcript Expected |
81
+ | [`removeChannelTag`](#op-removechanneltag) | `DELETE /api/v1/inbox/channels/{channel_id}/tags` | destructive | `inbox:delete` | Remove Channel Tag |
82
+ | [`revalidateInboxMailbox`](#op-revalidateinboxmailbox) | `POST /api/v1/inbox/mailboxes/{mailbox}/revalidate` | write | `inbox:write` | Revalidate Inbox Mailbox |
83
+ | [`searchInboxCallResults`](#op-searchinboxcallresults) | `POST /api/v1/inbox/call-results/search` | read | `inbox:read` | Search Inbox Call Results |
84
+ | [`searchInboxLinkedinConversations`](#op-searchinboxlinkedinconversations) | `POST /api/v1/inbox/linkedin/conversations/search` | read | `inbox:read` | Search Inbox Linkedin Conversations |
85
+ | [`setChannelAiPause`](#op-setchannelaipause) | `POST /api/v1/inbox/channels/{channel_id}/ai-pause` | write | `inbox:write` | Set Channel Ai Pause |
86
+ | [`setInboxEmailSequence`](#op-setinboxemailsequence) | `POST /api/v1/inbox/emails/{email_id}/sequence` | write | `inbox:write` | Set Inbox Email Sequence |
87
+ | [`setInboxEmailSettings`](#op-setinboxemailsettings) | `PUT /api/v1/inbox/email-settings` | write | `inbox:write` | Set Inbox Email Settings |
88
+ | [`setInboxMailboxVisibility`](#op-setinboxmailboxvisibility) | `PATCH /api/v1/inbox/mailboxes/{mailbox}/visibility` | write | `inbox:write` | Set Inbox Mailbox Visibility |
89
+ | [`setMeetingSensitivity`](#op-setmeetingsensitivity) | `PATCH /api/v1/inbox/meetings/{meeting_id}/sensitivity` | destructive | `meetings:delete` | Set Meeting Sensitivity |
90
+ | [`startInboxMailboxSync`](#op-startinboxmailboxsync) | `POST /api/v1/inbox/mailboxes/{mailbox}/sync` | external | `inbox:run` | Start Inbox Mailbox Sync |
91
+ | [`stopInboxMailboxSync`](#op-stopinboxmailboxsync) | `DELETE /api/v1/inbox/mailboxes/{mailbox}/sync` | destructive | `inbox:delete` | Stop Inbox Mailbox Sync |
92
+ | [`syncInboxLinkedinAccounts`](#op-syncinboxlinkedinaccounts) | `POST /api/v1/inbox/linkedin/accounts/sync` | external | `inbox:run` | Sync Inbox Linkedin Accounts |
93
+ | [`toggleInboxMailboxes`](#op-toggleinboxmailboxes) | `PATCH /api/v1/inbox/mailboxes/bulk` | external | `inbox:run` | Toggle Inbox Mailboxes |
94
+ | [`unassignChannel`](#op-unassignchannel) | `DELETE /api/v1/inbox/channels/{channel_id}/assign` | destructive | `inbox:delete` | Unassign Channel |
95
+ | [`unblockInboxSender`](#op-unblockinboxsender) | `DELETE /api/v1/inbox/blocked-senders/{blocked_sender_id}` | destructive | `inbox:delete` | Unblock Inbox Sender |
96
+ | [`updateInboxLinkedinAccount`](#op-updateinboxlinkedinaccount) | `PUT /api/v1/inbox/linkedin/accounts/{account_id}` | external | `inbox:run` | Update Inbox Linkedin Account |
97
+ | [`updateInboxMailboxSettings`](#op-updateinboxmailboxsettings) | `PATCH /api/v1/inbox/mailboxes/{mailbox}/settings` | external | `inbox:run` | Update Inbox Mailbox Settings |
98
+ | [`updateInboxTag`](#op-updateinboxtag) | `PUT /api/v1/inbox/tags/{tag_id}` | write | `inbox:write` | Update Inbox Tag |
99
+ | [`updateMeetingTask`](#op-updatemeetingtask) | `PATCH /api/v1/inbox/meetings/tasks/{task_id}` | write | `meetings:write` | Update Meeting Task |
100
+ | [`uploadInboxDraftAttachment`](#op-uploadinboxdraftattachment) | `POST /api/v1/inbox/drafts/attachments` | write | `inbox:write` | Upload Inbox Draft Attachment |
101
+ | [`uploadInboxNoteAttachment`](#op-uploadinboxnoteattachment) | `POST /api/v1/inbox/notes/attachments` | write | `inbox:write` | Upload Inbox Note Attachment |
102
+ | [`validateInboxLinkedinAccount`](#op-validateinboxlinkedinaccount) | `POST /api/v1/inbox/linkedin/validate-account` | read | `inbox:read` | Validate Inbox Linkedin Account |
103
+ | [`validateInboxSendMailbox`](#op-validateinboxsendmailbox) | `POST /api/v1/inbox/emails/validate-mailbox` | read | `inbox:read` | Validate Inbox Send Mailbox |
104
+
105
+ ---
106
+
107
+ <a id="op-activateinboxmailboxes"></a>
108
+
109
+ ### `g8.api.aiInbox.activateInboxMailboxes(input)`
110
+
111
+ **Activate Inbox Mailboxes**
112
+
113
+ - HTTP: `POST /api/v1/inbox/mailboxes/activate`
114
+ - operationId: `activate_inbox_mailboxes_inbox_mailboxes_activate_post` (also callable as `g8.api.call("activate_inbox_mailboxes_inbox_mailboxes_activate_post", input)`)
115
+ - Tier: `external`: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first
116
+ - API-key scope: `inbox:run`
117
+
118
+ Start polling SEVERAL mailboxes, each with its own provider.
119
+
120
+ NOT ATOMIC, and the failure shape is the thing to know: the app returns
121
+ 400 if ANY mailbox fails, but the ones that succeeded REMAIN ACTIVATED.
122
+ The 400 body carries `successful` and `failed`, so read them rather than
123
+ assuming the call did nothing.
124
+
125
+ Reaches outside graph8 for the same reason the single-mailbox start does.
126
+
127
+ **Input**
128
+
129
+ | Field | Type | Required | Description |
130
+ |---|---|---|---|
131
+ | `body` | `MailboxActivateRequest` | yes | Request body; fields below. |
132
+
133
+ Body fields (`MailboxActivateRequest`):
134
+
135
+ | Field | Type | Required | Description |
136
+ |---|---|---|---|
137
+ | `body.mailboxes` | `Array<MailboxJobItem>` | yes | min items 1 |
138
+ | `body.auto_respond` | `boolean \| null` | no | Let the AI answer on these mailboxes. Omit to leave each mailbox as it is. |
139
+ | `body.campaign_id` | `string \| null` | no | Sequence id to attribute synced threads to. Applies to every mailbox listed. |
140
+ | `body.campaign_name` | `string \| null` | no | |
141
+ | `body.last_unread_limit` | `integer \| null` | no | How many unread threads the first sync reaches back for. |
142
+
143
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
144
+
145
+ Other envelope fields: `pagination` (PaginationMeta).
146
+
147
+ **Example**
148
+
149
+ ```ts
150
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
151
+ const result = await g8.api.aiInbox.activateInboxMailboxes({
152
+ body: { mailboxes: [{ mailbox: "example", provider: "google_mailbox" }] },
153
+ });
154
+ ```
155
+
156
+ ---
157
+
158
+ <a id="op-addchannelcomment"></a>
159
+
160
+ ### `g8.api.aiInbox.addChannelComment(input)`
161
+
162
+ **Add Channel Comment**
163
+
164
+ - HTTP: `POST /api/v1/inbox/channels/{channel_id}/comments`
165
+ - operationId: `add_channel_comment_inbox_channels__channel_id__comments_post` (also callable as `g8.api.call("add_channel_comment_inbox_channels__channel_id__comments_post", input)`)
166
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
167
+ - API-key scope: `inbox:write`
168
+
169
+ Leave an INTERNAL note. Not a reply - the customer never sees it.
170
+
171
+ MENTIONING SOMEONE CREATES THEM A TASK in the Work app. The two mention
172
+ lists are additive rather than alternatives: an id with no matching email
173
+ still gets the task, it just gets no notification, so send both to get the
174
+ bell as well.
175
+
176
+ Attachments must already be uploaded; only their token and key are
177
+ load-bearing, because the server re-validates and never trusts a
178
+ client-sent name, size or type.
179
+
180
+ **Input**
181
+
182
+ | Field | Type | Required | Description |
183
+ |---|---|---|---|
184
+ | `path.channel_id` | `string` | yes | Conversation id. |
185
+ | `query.channel_type` | `"email" \| "chat" \| "phone" \| "sms" \| "heyreach" \| "meetings" \| "support" \| "all"` | yes | Which channel the conversation lives in. REQUIRED: the same id means different rows in different channels, so this is what identifies the conversation, not a filter. |
186
+ | `body` | `CommentCreateRequest` | yes | Request body; fields below. |
187
+
188
+ Body fields (`CommentCreateRequest`):
189
+
190
+ | Field | Type | Required | Description |
191
+ |---|---|---|---|
192
+ | `body.content` | `string` | yes | min length 1, max length 5000 |
193
+ | `body.attachments` | `Array<CommentAttachmentRef>` | no | |
194
+ | `body.mentioned_user_emails` | `Array<string>` | no | The same users by email. Additive - this is what drives the notification. |
195
+ | `body.mentioned_user_ids` | `Array<string>` | no | Mentioned users by id. Each gets a Work task. |
196
+
197
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
198
+
199
+ Other envelope fields: `pagination` (PaginationMeta).
200
+
201
+ **Example**
202
+
203
+ ```ts
204
+ const result = await g8.api.aiInbox.addChannelComment({
205
+ path: { channel_id: "id" },
206
+ query: { channel_type: "email" },
207
+ body: { content: "example" },
208
+ });
209
+ ```
210
+
211
+ ---
212
+
213
+ <a id="op-addchanneltag"></a>
214
+
215
+ ### `g8.api.aiInbox.addChannelTag(input)`
216
+
217
+ **Add Channel Tag**
218
+
219
+ - HTTP: `POST /api/v1/inbox/channels/{channel_id}/tags`
220
+ - operationId: `add_channel_tag_inbox_channels__channel_id__tags_post` (also callable as `g8.api.call("add_channel_tag_inbox_channels__channel_id__tags_post", input)`)
221
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
222
+ - API-key scope: `inbox:write`
223
+
224
+ Attach an existing tag to a conversation.
225
+
226
+ The tag must already exist - this links, it does not create.
227
+
228
+ **Input**
229
+
230
+ | Field | Type | Required | Description |
231
+ |---|---|---|---|
232
+ | `path.channel_id` | `string` | yes | Conversation id. |
233
+ | `query.channel_type` | `"email" \| "chat" \| "phone" \| "sms" \| "heyreach" \| "meetings" \| "support" \| "all"` | yes | Which channel the conversation lives in. REQUIRED: the same id means different rows in different channels, so this is what identifies the conversation, not a filter. |
234
+ | `body` | `developer_api__interfaces__dtos__inbox_collab__TagRequest` | yes | Request body; fields below. |
235
+ | `query.linkedin_account_id` | `integer \| null` | no | LinkedIn account id. Required only for `heyreach`, where the id is account-scoped and ambiguous without it. |
236
+
237
+ Body fields (`developer_api__interfaces__dtos__inbox_collab__TagRequest`):
238
+
239
+ | Field | Type | Required | Description |
240
+ |---|---|---|---|
241
+ | `body.tag_id` | `string` | yes | The tag to attach. It must already exist. |
242
+
243
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
244
+
245
+ Other envelope fields: `pagination` (PaginationMeta).
246
+
247
+ **Example**
248
+
249
+ ```ts
250
+ const result = await g8.api.aiInbox.addChannelTag({
251
+ path: { channel_id: "id" },
252
+ query: { channel_type: "email" },
253
+ body: { tag_id: "id" },
254
+ });
255
+ ```
256
+
257
+ ---
258
+
259
+ <a id="op-addmailboxtoworkspace"></a>
260
+
261
+ ### `g8.api.aiInbox.addMailboxToWorkspace(input)`
262
+
263
+ **Add Mailbox To Workspace**
264
+
265
+ - HTTP: `POST /api/v1/inbox/workspaces/{workspace_id}/mailboxes`
266
+ - operationId: `add_mailbox_to_workspace_inbox_workspaces__workspace_id__mailboxes_post` (also callable as `g8.api.call("add_mailbox_to_workspace_inbox_workspaces__workspace_id__mailboxes_post", input)`)
267
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
268
+ - API-key scope: `inbox:write`
269
+
270
+ Put a mailbox into a workspace.
271
+
272
+ IDEMPOTENT: adding a mailbox that is already a member is a no-op, and the
273
+ response says which happened rather than failing.
274
+
275
+ This one handler wants a `PropelAuthUser` rather than the shared principal,
276
+ so it gets one from `build_api_principal` - resolved from the validated
277
+ key, never client-supplied.
278
+
279
+ **Input**
280
+
281
+ | Field | Type | Required | Description |
282
+ |---|---|---|---|
283
+ | `path.workspace_id` | `string` | yes | Workspace id (UUID). |
284
+ | `body` | `Body_add_mailbox_to_workspace_inbox_workspaces__workspace_id__mailboxes_post` | yes | Request body; fields below. |
285
+
286
+ Body fields (`Body_add_mailbox_to_workspace_inbox_workspaces__workspace_id__mailboxes_post`):
287
+
288
+ | Field | Type | Required | Description |
289
+ |---|---|---|---|
290
+ | `body.mailbox_id` | `integer` | yes | Integer `mailboxes.id` - the database primary key, NOT the cron-job string id. The app is explicit about the difference and so is this. |
291
+
292
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
293
+
294
+ Other envelope fields: `pagination` (PaginationMeta).
295
+
296
+ **Example**
297
+
298
+ ```ts
299
+ const result = await g8.api.aiInbox.addMailboxToWorkspace({ path: { workspace_id: "id" }, body: { mailbox_id: 123 } });
300
+ ```
301
+
302
+ ---
303
+
304
+ <a id="op-assignchannel"></a>
305
+
306
+ ### `g8.api.aiInbox.assignChannel(input)`
307
+
308
+ **Assign Channel**
309
+
310
+ - HTTP: `POST /api/v1/inbox/channels/{channel_id}/assign`
311
+ - operationId: `assign_channel_inbox_channels__channel_id__assign_post` (also callable as `g8.api.call("assign_channel_inbox_channels__channel_id__assign_post", input)`)
312
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
313
+ - API-key scope: `inbox:write`
314
+
315
+ Give a conversation to one or more people.
316
+
317
+ Ownership is SHARED, not singular: assigning ADDS people rather than
318
+ replacing whoever is already there. Take someone off with
319
+ `DELETE /inbox/channels/{id}/assign`.
320
+
321
+ **Input**
322
+
323
+ | Field | Type | Required | Description |
324
+ |---|---|---|---|
325
+ | `path.channel_id` | `string` | yes | Conversation id. |
326
+ | `query.channel_type` | `"email" \| "chat" \| "phone" \| "sms" \| "heyreach" \| "meetings" \| "support" \| "all"` | yes | Which channel the conversation lives in. REQUIRED: the same id means different rows in different channels, so this is what identifies the conversation, not a filter. |
327
+ | `body` | `AssignmentCreateRequest` | yes | Request body; fields below. |
328
+ | `query.linkedin_account_id` | `integer \| null` | no | LinkedIn account id. Required only for `heyreach`, where the id is account-scoped and ambiguous without it. |
329
+
330
+ Body fields (`AssignmentCreateRequest`):
331
+
332
+ | Field | Type | Required | Description |
333
+ |---|---|---|---|
334
+ | `body.assignee_emails` | `Array<string>` | yes | Who owns this conversation. Check eligibility first. min items 1, max items 20 |
335
+
336
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
337
+
338
+ Other envelope fields: `pagination` (PaginationMeta).
339
+
340
+ **Example**
341
+
342
+ ```ts
343
+ const result = await g8.api.aiInbox.assignChannel({
344
+ path: { channel_id: "id" },
345
+ query: { channel_type: "email" },
346
+ body: { assignee_emails: ["jane@acme.com"] },
347
+ });
348
+ ```
349
+
350
+ ---
351
+
352
+ <a id="op-blockinboxsender"></a>
353
+
354
+ ### `g8.api.aiInbox.blockInboxSender(input)`
355
+
356
+ **Block Inbox Sender**
357
+
358
+ - HTTP: `POST /api/v1/inbox/blocked-senders`
359
+ - operationId: `block_inbox_sender_inbox_blocked_senders_post` (also callable as `g8.api.call("block_inbox_sender_inbox_blocked_senders_post", input)`)
360
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
361
+ - API-key scope: `inbox:write`
362
+
363
+ Stop a sender reaching ONE mailbox.
364
+
365
+ Scoped to the mailbox named in the body, not to the organisation: the same
366
+ sender still reaches every other mailbox until blocked there too. This is
367
+ an INGESTION filter - it is not a suppression, and it does not stop
368
+ graph8 emailing them (see `/contacts/suppressions` for that).
369
+
370
+ **Input**
371
+
372
+ | Field | Type | Required | Description |
373
+ |---|---|---|---|
374
+ | `body` | `BlockedSenderCreateRequest` | yes | Request body; fields below. |
375
+
376
+ Body fields (`BlockedSenderCreateRequest`):
377
+
378
+ | Field | Type | Required | Description |
379
+ |---|---|---|---|
380
+ | `body.mailbox` | `string` | yes | The mailbox to block them on. |
381
+ | `body.sender_email` | `string` | yes | The address to block. |
382
+ | `body.reason` | `string \| null` | no | |
383
+
384
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
385
+
386
+ Other envelope fields: `pagination` (PaginationMeta).
387
+
388
+ **Example**
389
+
390
+ ```ts
391
+ const result = await g8.api.aiInbox.blockInboxSender({ body: { mailbox: "example", sender_email: "jane@acme.com" } });
392
+ ```
393
+
394
+ ---
395
+
396
+ <a id="op-clearmeetingtranscriptlink"></a>
397
+
398
+ ### `g8.api.aiInbox.clearMeetingTranscriptLink(input)`
399
+
400
+ **Clear Meeting Transcript Link**
401
+
402
+ - HTTP: `DELETE /api/v1/inbox/meetings/{meeting_id}/transcript-link`
403
+ - operationId: `clear_meeting_transcript_link_inbox_meetings__meeting_id__transcript_link_delete` (also callable as `g8.api.call("clear_meeting_transcript_link_inbox_meetings__meeting_id__transcript_link_delete", input)`)
404
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
405
+ - API-key scope: `meetings:delete`
406
+
407
+ Detach the transcript from a meeting.
408
+
409
+ Breaks the LINK, not the transcript: the recording and its text survive
410
+ and can be attached to the right meeting instead.
411
+
412
+ **Input**
413
+
414
+ | Field | Type | Required | Description |
415
+ |---|---|---|---|
416
+ | `path.meeting_id` | `string` | yes | Meeting id, as returned by `GET /inbox/meetings`. |
417
+
418
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
419
+
420
+ Other envelope fields: `pagination` (PaginationMeta).
421
+
422
+ **Example**
423
+
424
+ ```ts
425
+ // destructive: deletes or archives data; confirm with a human before calling.
426
+ const result = await g8.api.aiInbox.clearMeetingTranscriptLink({ path: { meeting_id: "id" } });
427
+ ```
428
+
429
+ ---
430
+
431
+ <a id="op-composeinboxemail"></a>
432
+
433
+ ### `g8.api.aiInbox.composeInboxEmail(input)`
434
+
435
+ **Compose Inbox Email**
436
+
437
+ - HTTP: `POST /api/v1/inbox/emails/compose`
438
+ - operationId: `compose_inbox_email_inbox_emails_compose_post` (also callable as `g8.api.call("compose_inbox_email_inbox_emails_compose_post", input)`)
439
+ - Tier: `external`: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first
440
+ - API-key scope: `inbox:run`
441
+
442
+ COMPOSE AN EMAIL. WITH `save_as_draft` FALSE THIS REACHES A REAL PERSON.
443
+
444
+ The one call that does everything the compose window does:
445
+
446
+ * new thread, sent now - `to`, `from_mailbox`, `subject`, `content`
447
+ * new thread, saved as a draft - the same plus `save_as_draft: true`
448
+ * reply into a thread - add `reply_to_email_id`
449
+ * edit an existing draft - add `draft_id`
450
+ * send a draft you saved - `draft_id` plus `save_as_draft: false`
451
+
452
+ `save_as_draft` DEFAULTS TO FALSE, which means SEND. That is the app's own
453
+ default and it is kept rather than made safer here, because two ends
454
+ disagreeing about what an omitted field does is worse than a default you
455
+ can read.
456
+
457
+ Classified `external` (`inbox:run`) because it can deliver. Sending as a
458
+ mailbox the caller is not authorised for is a 403 from the sender
459
+ authorisation gate, not a silent success - check first with
460
+ `POST /inbox/emails/validate-mailbox`.
461
+
462
+ Distinct from `POST /inbox/emails/{email_id}/send`, which can only reply
463
+ into a thread that already exists.
464
+
465
+ **Input**
466
+
467
+ | Field | Type | Required | Description |
468
+ |---|---|---|---|
469
+ | `body` | `EmailComposeRequest` | yes | Request body; fields below. |
470
+
471
+ Body fields (`EmailComposeRequest`):
472
+
473
+ | Field | Type | Required | Description |
474
+ |---|---|---|---|
475
+ | `body.content` | `string` | yes | Body, HTML. |
476
+ | `body.from_mailbox` | `string` | yes | The mailbox to send AS. Must already be syncing - check with `POST /inbox/emails/validate-mailbox` first. |
477
+ | `body.to` | `Array<string>` | yes | Recipients. These are real addresses. min items 1 |
478
+ | `body.assigned_users` | `Array<string>` | no | Emails to assign the resulting thread to. |
479
+ | `body.attachments` | `Array<Record<string, unknown>>` | no | Already-uploaded attachment references. The server re-validates each one. |
480
+ | `body.bcc` | `Array<string>` | no | |
481
+ | `body.cc` | `Array<string>` | no | |
482
+ | `body.draft_id` | `string \| null` | no | Edit or send an existing draft. |
483
+ | `body.include_signature` | `boolean` | no | default `true` |
484
+ | `body.reply_to_email_id` | `string \| null` | no | Thread to reply into. Omit to start a new conversation. |
485
+ | `body.save_as_draft` | `boolean` | no | FALSE SENDS THE MESSAGE. True stores a draft and contacts nobody. default `false` |
486
+ | `body.subject` | `string \| null` | no | Auto-filled as `Re: {original}` on a reply if omitted. |
487
+ | `body.tag_ids` | `Array<string>` | no | Tags to attach to the thread. |
488
+
489
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
490
+
491
+ Other envelope fields: `pagination` (PaginationMeta).
492
+
493
+ **Example**
494
+
495
+ ```ts
496
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
497
+ const result = await g8.api.aiInbox.composeInboxEmail({
498
+ body: { content: "example", from_mailbox: "example", to: ["+15555550100"] },
499
+ });
500
+ ```
501
+
502
+ ---
503
+
504
+ <a id="op-composeinboxlinkedinmessage"></a>
505
+
506
+ ### `g8.api.aiInbox.composeInboxLinkedinMessage(input)`
507
+
508
+ **Compose Inbox Linkedin Message**
509
+
510
+ - HTTP: `POST /api/v1/inbox/linkedin/compose`
511
+ - operationId: `compose_inbox_linkedin_message_inbox_linkedin_compose_post` (also callable as `g8.api.call("compose_inbox_linkedin_message_inbox_linkedin_compose_post", input)`)
512
+ - Tier: `external`: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first
513
+ - API-key scope: `inbox:run`
514
+
515
+ COMPOSE A LINKEDIN MESSAGE. WITH `save_as_draft` FALSE IT REACHES A PERSON.
516
+
517
+ ONE DRAFT PER CONVERSATION: saving over an existing draft replaces it, and
518
+ sending deletes whatever draft was there. `save_as_draft` defaults to
519
+ FALSE, which means send.
520
+
521
+ Classified `external` (`inbox:run`). The account must be synced and
522
+ enabled for the inbox - check with `POST /inbox/linkedin/validate-account`.
523
+
524
+ **Input**
525
+
526
+ | Field | Type | Required | Description |
527
+ |---|---|---|---|
528
+ | `body` | `LinkedInComposeRequest` | yes | Request body; fields below. |
529
+
530
+ Body fields (`LinkedInComposeRequest`):
531
+
532
+ | Field | Type | Required | Description |
533
+ |---|---|---|---|
534
+ | `body.conversation_id` | `string` | yes | An existing conversation on that account. |
535
+ | `body.linkedin_account_id` | `integer` | yes | The sending account. Integer id. |
536
+ | `body.message` | `string` | yes | |
537
+ | `body.assigned_users` | `Array<string>` | no | |
538
+ | `body.save_as_draft` | `boolean` | no | FALSE SENDS THE MESSAGE. True stores a draft. default `false` |
539
+ | `body.tag_ids` | `Array<string>` | no | |
540
+
541
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
542
+
543
+ Other envelope fields: `pagination` (PaginationMeta).
544
+
545
+ **Example**
546
+
547
+ ```ts
548
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
549
+ const result = await g8.api.aiInbox.composeInboxLinkedinMessage({
550
+ body: {
551
+ conversation_id: "id",
552
+ linkedin_account_id: 123,
553
+ message: "example",
554
+ },
555
+ });
556
+ ```
557
+
558
+ ---
559
+
560
+ <a id="op-composeinboxsms"></a>
561
+
562
+ ### `g8.api.aiInbox.composeInboxSms(input)`
563
+
564
+ **Compose Inbox Sms**
565
+
566
+ - HTTP: `POST /api/v1/inbox/sms/compose`
567
+ - operationId: `compose_inbox_sms_inbox_sms_compose_post` (also callable as `g8.api.call("compose_inbox_sms_inbox_sms_compose_post", input)`)
568
+ - Tier: `external`: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first
569
+ - API-key scope: `inbox:run`
570
+
571
+ COMPOSE AN SMS. WITH `save_as_draft` FALSE THIS REACHES A REAL PHONE.
572
+
573
+ Sends through the organisation's own number and files the message into the
574
+ SMS thread, so the conversation stays in one place. `save_as_draft`
575
+ defaults to FALSE, which means send.
576
+
577
+ Classified `external` (`inbox:run`). `from_number` must be a number this
578
+ organisation owns - checked before anything is saved or sent, a 400
579
+ otherwise (see the module docstring for why the check lives here).
580
+
581
+ **Input**
582
+
583
+ | Field | Type | Required | Description |
584
+ |---|---|---|---|
585
+ | `body` | `SmsComposeRequest` | yes | Request body; fields below. |
586
+
587
+ Body fields (`SmsComposeRequest`):
588
+
589
+ | Field | Type | Required | Description |
590
+ |---|---|---|---|
591
+ | `body.body` | `string` | yes | Message text. |
592
+ | `body.from_number` | `string` | yes | A number this organisation owns, E.164. |
593
+ | `body.to_number` | `string` | yes | The recipient's number, E.164. A real phone. |
594
+ | `body.draft_id` | `string \| null` | no | |
595
+ | `body.save_as_draft` | `boolean` | no | FALSE SENDS THE MESSAGE. True stores a draft. default `false` |
596
+ | `body.thread_id` | `string \| null` | no | Existing SMS thread to continue. |
597
+
598
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
599
+
600
+ Other envelope fields: `pagination` (PaginationMeta).
601
+
602
+ **Example**
603
+
604
+ ```ts
605
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
606
+ const result = await g8.api.aiInbox.composeInboxSms({
607
+ body: { body: "example", from_number: "example", to_number: "example" },
608
+ });
609
+ ```
610
+
611
+ ---
612
+
613
+ <a id="op-createinboxagent"></a>
614
+
615
+ ### `g8.api.aiInbox.createInboxAgent(input)`
616
+
617
+ **Create Inbox Agent**
618
+
619
+ - HTTP: `POST /api/v1/inbox/agents`
620
+ - operationId: `create_inbox_agent_inbox_agents_post` (also callable as `g8.api.call("create_inbox_agent_inbox_agents_post", input)`)
621
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
622
+ - API-key scope: `inbox:write`
623
+
624
+ Create an AI Inbox agent - the named responder tags and email settings
625
+ point at.
626
+
627
+ NOT the Copilot Agent Runtime at `/agent/*`, which runs and approves
628
+ autonomous work. Different object, similar name; the context notes record
629
+ that this pair has already misled an audit.
630
+
631
+ Names are unique per organisation: a repeat is a 400, not a second agent.
632
+
633
+ **Input**
634
+
635
+ | Field | Type | Required | Description |
636
+ |---|---|---|---|
637
+ | `body` | `InboxAgentCreateRequest` | yes | Request body; fields below. |
638
+
639
+ Body fields (`InboxAgentCreateRequest`):
640
+
641
+ | Field | Type | Required | Description |
642
+ |---|---|---|---|
643
+ | `body.name` | `string` | yes | Unique within the organisation. |
644
+
645
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
646
+
647
+ Other envelope fields: `pagination` (PaginationMeta).
648
+
649
+ **Example**
650
+
651
+ ```ts
652
+ const result = await g8.api.aiInbox.createInboxAgent({ body: { name: "Example" } });
653
+ ```
654
+
655
+ ---
656
+
657
+ <a id="op-createinboxtag"></a>
658
+
659
+ ### `g8.api.aiInbox.createInboxTag(input)`
660
+
661
+ **Create Inbox Tag**
662
+
663
+ - HTTP: `POST /api/v1/inbox/tags`
664
+ - operationId: `create_inbox_tag_inbox_tags_post` (also callable as `g8.api.call("create_inbox_tag_inbox_tags_post", input)`)
665
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
666
+ - API-key scope: `inbox:write`
667
+
668
+ Create an inbox tag - a conversation label, not a CRM contact tag.
669
+
670
+ The read of these objects ships as `GET /workflows/inbox-tags`. With
671
+ `ai_can_apply` true and `rules` set, the auto-tagger may apply this tag to
672
+ threads on its own; with `agent_id` set, the agent answers threads carrying
673
+ it.
674
+
675
+ **Input**
676
+
677
+ | Field | Type | Required | Description |
678
+ |---|---|---|---|
679
+ | `body` | `TagCreateRequest` | yes | Request body; fields below. |
680
+
681
+ Body fields (`TagCreateRequest`):
682
+
683
+ | Field | Type | Required | Description |
684
+ |---|---|---|---|
685
+ | `body.name` | `string` | yes | Tag name, unique per organisation. min length 1 |
686
+ | `body.agent_id` | `string \| null` | no | AI Inbox agent that answers threads carrying this tag. |
687
+ | `body.ai_can_apply` | `boolean` | no | Whether the auto-tagger may apply this tag on its own. default `false` |
688
+ | `body.color` | `string \| null` | no | |
689
+ | `body.description` | `string \| null` | no | |
690
+ | `body.priority` | `integer \| null` | no | 1-100. min 1, max 100 |
691
+ | `body.rules` | `Array<string> \| null` | no | Plain-language rules the auto-tagger applies this tag by. |
692
+
693
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
694
+
695
+ Other envelope fields: `pagination` (PaginationMeta).
696
+
697
+ **Example**
698
+
699
+ ```ts
700
+ const result = await g8.api.aiInbox.createInboxTag({ body: { name: "Example" } });
701
+ ```
702
+
703
+ ---
704
+
705
+ <a id="op-createmeetingtask"></a>
706
+
707
+ ### `g8.api.aiInbox.createMeetingTask(input)`
708
+
709
+ **Create Meeting Task**
710
+
711
+ - HTTP: `POST /api/v1/inbox/meetings/{meeting_id}/tasks`
712
+ - operationId: `create_meeting_task_inbox_meetings__meeting_id__tasks_post` (also callable as `g8.api.call("create_meeting_task_inbox_meetings__meeting_id__tasks_post", input)`)
713
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
714
+ - API-key scope: `meetings:write`
715
+
716
+ Create a follow-up on this meeting.
717
+
718
+ The meeting and its transcript are filled in from the meeting itself, so
719
+ the task stays traceable to what was said. The assignee must be a
720
+ PARTICIPANT - checked server-side, because a client-side filter is not a
721
+ permission.
722
+
723
+ **Input**
724
+
725
+ | Field | Type | Required | Description |
726
+ |---|---|---|---|
727
+ | `path.meeting_id` | `string` | yes | Meeting id, as returned by `GET /inbox/meetings`. |
728
+ | `body` | `MeetingTaskCreateRequest` | yes | Request body; fields below. |
729
+
730
+ Body fields (`MeetingTaskCreateRequest`):
731
+
732
+ | Field | Type | Required | Description |
733
+ |---|---|---|---|
734
+ | `body.title` | `string` | yes | What needs doing. |
735
+ | `body.assignee_user_id` | `string \| null` | no | The assignee's user id, from `GET /inbox/meetings/{meeting_id}/assignable-users`. Must be a meeting participant. |
736
+ | `body.description` | `string \| null` | no | |
737
+ | `body.due_date` | `string (date-time) \| null` | no | |
738
+ | `body.priority` | `integer` | no | Lower is more urgent. The app's default is 2. default `2` |
739
+
740
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
741
+
742
+ Other envelope fields: `pagination` (PaginationMeta).
743
+
744
+ **Example**
745
+
746
+ ```ts
747
+ const result = await g8.api.aiInbox.createMeetingTask({ path: { meeting_id: "id" }, body: { title: "Example" } });
748
+ ```
749
+
750
+ ---
751
+
752
+ <a id="op-deactivateinboxmailboxes"></a>
753
+
754
+ ### `g8.api.aiInbox.deactivateInboxMailboxes(input)`
755
+
756
+ **Deactivate Inbox Mailboxes**
757
+
758
+ - HTTP: `POST /api/v1/inbox/mailboxes/deactivate`
759
+ - operationId: `deactivate_inbox_mailboxes_inbox_mailboxes_deactivate_post` (also callable as `g8.api.call("deactivate_inbox_mailboxes_inbox_mailboxes_deactivate_post", input)`)
760
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
761
+ - API-key scope: `inbox:write`
762
+
763
+ Stop polling several mailboxes at once.
764
+
765
+ Takes the same body as activate - the campaign and auto-respond fields are
766
+ simply ignored on this path, which is the app's own shape and is left
767
+ alone rather than split into a narrower model that would drift from it.
768
+
769
+ **Input**
770
+
771
+ | Field | Type | Required | Description |
772
+ |---|---|---|---|
773
+ | `body` | `MailboxActivateRequest` | yes | Request body; fields below. |
774
+
775
+ Body fields (`MailboxActivateRequest`):
776
+
777
+ | Field | Type | Required | Description |
778
+ |---|---|---|---|
779
+ | `body.mailboxes` | `Array<MailboxJobItem>` | yes | min items 1 |
780
+ | `body.auto_respond` | `boolean \| null` | no | Let the AI answer on these mailboxes. Omit to leave each mailbox as it is. |
781
+ | `body.campaign_id` | `string \| null` | no | Sequence id to attribute synced threads to. Applies to every mailbox listed. |
782
+ | `body.campaign_name` | `string \| null` | no | |
783
+ | `body.last_unread_limit` | `integer \| null` | no | How many unread threads the first sync reaches back for. |
784
+
785
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
786
+
787
+ Other envelope fields: `pagination` (PaginationMeta).
788
+
789
+ **Example**
790
+
791
+ ```ts
792
+ const result = await g8.api.aiInbox.deactivateInboxMailboxes({
793
+ body: { mailboxes: [{ mailbox: "example", provider: "google_mailbox" }] },
794
+ });
795
+ ```
796
+
797
+ ---
798
+
799
+ <a id="op-deleteinboxemaildraft"></a>
800
+
801
+ ### `g8.api.aiInbox.deleteInboxEmailDraft(input)`
802
+
803
+ **Delete Inbox Email Draft**
804
+
805
+ - HTTP: `DELETE /api/v1/inbox/drafts/emails/{draft_id}`
806
+ - operationId: `delete_inbox_email_draft_inbox_drafts_emails__draft_id__delete` (also callable as `g8.api.call("delete_inbox_email_draft_inbox_drafts_emails__draft_id__delete", input)`)
807
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
808
+ - API-key scope: `inbox:delete`
809
+
810
+ Delete a saved email draft by its id, wherever it sits.
811
+
812
+ Not `DELETE /inbox/emails/{email_id}/draft`, which discards the AI's
813
+ latest suggestion on a thread: this removes ONE draft by id, and if it was
814
+ the only message in its thread the thread goes too. Refused with 403 unless
815
+ the caller may send from the draft's mailbox - deleting a draft carries the
816
+ same authority as sending it. Files attached to the draft are deleted.
817
+
818
+ **Input**
819
+
820
+ | Field | Type | Required | Description |
821
+ |---|---|---|---|
822
+ | `path.draft_id` | `string` | yes | The draft's message id, from `POST /inbox/emails/compose`. |
823
+
824
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
825
+
826
+ Other envelope fields: `pagination` (PaginationMeta).
827
+
828
+ **Example**
829
+
830
+ ```ts
831
+ // destructive: deletes or archives data; confirm with a human before calling.
832
+ const result = await g8.api.aiInbox.deleteInboxEmailDraft({ path: { draft_id: "id" } });
833
+ ```
834
+
835
+ ---
836
+
837
+ <a id="op-deleteinboxlinkedindraft"></a>
838
+
839
+ ### `g8.api.aiInbox.deleteInboxLinkedinDraft(input)`
840
+
841
+ **Delete Inbox Linkedin Draft**
842
+
843
+ - HTTP: `DELETE /api/v1/inbox/linkedin/accounts/{account_id}/conversations/{conversation_id}/draft`
844
+ - operationId: `delete_inbox_linkedin_draft_inbox_linkedin_accounts__account_id__conversations__conversation_id__draft_delete` (also callable as `g8.api.call("delete_inbox_linkedin_draft_inbox_linkedin_accounts__account_id__conversations__conversation_id__draft_delete", input)`)
845
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
846
+ - API-key scope: `inbox:delete`
847
+
848
+ Delete the saved draft on a LinkedIn conversation (there is at most one).
849
+ 404 when there is none. Nothing is sent.
850
+
851
+ **Input**
852
+
853
+ | Field | Type | Required | Description |
854
+ |---|---|---|---|
855
+ | `path.account_id` | `integer` | yes | LinkedIn account id (integer). |
856
+ | `path.conversation_id` | `string` | yes | LinkedIn conversation id. |
857
+
858
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
859
+
860
+ Other envelope fields: `pagination` (PaginationMeta).
861
+
862
+ **Example**
863
+
864
+ ```ts
865
+ // destructive: deletes or archives data; confirm with a human before calling.
866
+ const result = await g8.api.aiInbox.deleteInboxLinkedinDraft({ path: { account_id: 123, conversation_id: "id" } });
867
+ ```
868
+
869
+ ---
870
+
871
+ <a id="op-deleteinboxtag"></a>
872
+
873
+ ### `g8.api.aiInbox.deleteInboxTag(input)`
874
+
875
+ **Delete Inbox Tag**
876
+
877
+ - HTTP: `DELETE /api/v1/inbox/tags/{tag_id}`
878
+ - operationId: `delete_inbox_tag_inbox_tags__tag_id__delete` (also callable as `g8.api.call("delete_inbox_tag_inbox_tags__tag_id__delete", input)`)
879
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
880
+ - API-key scope: `inbox:delete`
881
+
882
+ Delete an inbox tag. Threads lose the label; nothing else is removed.
883
+
884
+ **Input**
885
+
886
+ | Field | Type | Required | Description |
887
+ |---|---|---|---|
888
+ | `path.tag_id` | `string` | yes | Tag id. |
889
+
890
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
891
+
892
+ Other envelope fields: `pagination` (PaginationMeta).
893
+
894
+ **Example**
895
+
896
+ ```ts
897
+ // destructive: deletes or archives data; confirm with a human before calling.
898
+ const result = await g8.api.aiInbox.deleteInboxTag({ path: { tag_id: "id" } });
899
+ ```
900
+
901
+ ---
902
+
903
+ <a id="op-deletemeetingtask"></a>
904
+
905
+ ### `g8.api.aiInbox.deleteMeetingTask(input)`
906
+
907
+ **Delete Meeting Task**
908
+
909
+ - HTTP: `DELETE /api/v1/inbox/meetings/tasks/{task_id}`
910
+ - operationId: `delete_meeting_task_inbox_meetings_tasks__task_id__delete` (also callable as `g8.api.call("delete_meeting_task_inbox_meetings_tasks__task_id__delete", input)`)
911
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
912
+ - API-key scope: `meetings:delete`
913
+
914
+ Delete a meeting follow-up. The meeting and its transcript survive.
915
+
916
+ **Input**
917
+
918
+ | Field | Type | Required | Description |
919
+ |---|---|---|---|
920
+ | `path.task_id` | `string` | yes | Meeting task id. |
921
+
922
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
923
+
924
+ Other envelope fields: `pagination` (PaginationMeta).
925
+
926
+ **Example**
927
+
928
+ ```ts
929
+ // destructive: deletes or archives data; confirm with a human before calling.
930
+ const result = await g8.api.aiInbox.deleteMeetingTask({ path: { task_id: "id" } });
931
+ ```
932
+
933
+ ---
934
+
935
+ <a id="op-disableinboxlinkedinaccount"></a>
936
+
937
+ ### `g8.api.aiInbox.disableInboxLinkedinAccount(input)`
938
+
939
+ **Disable Inbox Linkedin Account**
940
+
941
+ - HTTP: `POST /api/v1/inbox/linkedin/accounts/{account_id}/disable`
942
+ - operationId: `disable_inbox_linkedin_account_inbox_linkedin_accounts__account_id__disable_post` (also callable as `g8.api.call("disable_inbox_linkedin_account_inbox_linkedin_accounts__account_id__disable_post", input)`)
943
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
944
+ - API-key scope: `inbox:write`
945
+
946
+ Take a LinkedIn account out of the inbox. Stops the AI answering on it;
947
+ its configuration is kept for when it is enabled again.
948
+
949
+ **Input**
950
+
951
+ | Field | Type | Required | Description |
952
+ |---|---|---|---|
953
+ | `path.account_id` | `integer` | yes | LinkedIn account id (integer). |
954
+
955
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
956
+
957
+ Other envelope fields: `pagination` (PaginationMeta).
958
+
959
+ **Example**
960
+
961
+ ```ts
962
+ const result = await g8.api.aiInbox.disableInboxLinkedinAccount({ path: { account_id: 123 } });
963
+ ```
964
+
965
+ ---
966
+
967
+ <a id="op-downloadinboxattachment"></a>
968
+
969
+ ### `g8.api.aiInbox.downloadInboxAttachment(input)`
970
+
971
+ **Download Inbox Attachment**
972
+
973
+ - HTTP: `GET /api/v1/inbox/attachments/{token}`
974
+ - operationId: `download_inbox_attachment_inbox_attachments__token__get` (also callable as `g8.api.call("download_inbox_attachment_inbox_attachments__token__get", input)`)
975
+ - Tier: `read`: reads data; safe to call and to retry
976
+ - API-key scope: `inbox:read`
977
+
978
+ Download a draft or internal-note attachment. Not enveloped: bytes are bytes.
979
+
980
+ The token only opens a file of THIS organisation: it is bound to the org
981
+ that uploaded it, and a token from anywhere else is a flat 404. Served
982
+ with `Content-Disposition: attachment` and `nosniff`, never inline.
983
+
984
+ **Input**
985
+
986
+ | Field | Type | Required | Description |
987
+ |---|---|---|---|
988
+ | `path.token` | `string` | yes | The `token` returned by `POST /inbox/drafts/attachments` or `POST /inbox/notes/attachments`. |
989
+
990
+ **Returns**: no JSON body is declared for the success response.
991
+
992
+ **Example**
993
+
994
+ ```ts
995
+ const result = await g8.api.aiInbox.downloadInboxAttachment({ path: { token: "example" } });
996
+ ```
997
+
998
+ ---
999
+
1000
+ <a id="op-enableinboxlinkedinaccount"></a>
1001
+
1002
+ ### `g8.api.aiInbox.enableInboxLinkedinAccount(input)`
1003
+
1004
+ **Enable Inbox Linkedin Account**
1005
+
1006
+ - HTTP: `POST /api/v1/inbox/linkedin/accounts/{account_id}/enable`
1007
+ - operationId: `enable_inbox_linkedin_account_inbox_linkedin_accounts__account_id__enable_post` (also callable as `g8.api.call("enable_inbox_linkedin_account_inbox_linkedin_accounts__account_id__enable_post", input)`)
1008
+ - Tier: `external`: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first
1009
+ - API-key scope: `inbox:run`
1010
+
1011
+ Bring a LinkedIn account's conversations into the inbox.
1012
+
1013
+ If the account's configuration already has `auto_respond` on, enabling it
1014
+ is what lets the AI start messaging people from it - so this is classified
1015
+ `external`, the same tier as the configuration update.
1016
+
1017
+ **Input**
1018
+
1019
+ | Field | Type | Required | Description |
1020
+ |---|---|---|---|
1021
+ | `path.account_id` | `integer` | yes | LinkedIn account id (integer). |
1022
+
1023
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1024
+
1025
+ Other envelope fields: `pagination` (PaginationMeta).
1026
+
1027
+ **Example**
1028
+
1029
+ ```ts
1030
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
1031
+ const result = await g8.api.aiInbox.enableInboxLinkedinAccount({ path: { account_id: 123 } });
1032
+ ```
1033
+
1034
+ ---
1035
+
1036
+ <a id="op-generateinboxdraft"></a>
1037
+
1038
+ ### `g8.api.aiInbox.generateInboxDraft(input)`
1039
+
1040
+ **Generate Inbox Draft**
1041
+
1042
+ - HTTP: `POST /api/v1/inbox/drafts/generate`
1043
+ - operationId: `generate_inbox_draft_inbox_drafts_generate_post` (also callable as `g8.api.call("generate_inbox_draft_inbox_drafts_generate_post", input)`)
1044
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
1045
+ - API-key scope: `inbox:run`
1046
+
1047
+ Write or rewrite a message with the model. THIS SPENDS CREDITS.
1048
+
1049
+ DELIVERS NOTHING. It returns text; sending it is a separate, `external`
1050
+ call. Classified `billable` (`inbox:run`) because it charges - 402 when
1051
+ the organisation has no credits left.
1052
+
1053
+ ONE CHARGE PER CALL, including a multi-operation call: pass a LIST in
1054
+ `operation` to apply several transforms in a single generation rather than
1055
+ paying per transform.
1056
+
1057
+ `generate_from_scratch` is the only operation that does not need
1058
+ `message_html`; give it either a `conversation_id` + `channel_type` to
1059
+ ground the reply in the thread, or free-text `instructions` to write
1060
+ something with no thread at all.
1061
+
1062
+ Wider than the already-published `GET /inbox/{reply_id}/draft`, which only
1063
+ ever generates from scratch on an existing thread.
1064
+
1065
+ **Input**
1066
+
1067
+ | Field | Type | Required | Description |
1068
+ |---|---|---|---|
1069
+ | `body` | `AiDraftGenerateRequest` | yes | Request body; fields below. |
1070
+
1071
+ Body fields (`AiDraftGenerateRequest`):
1072
+
1073
+ | Field | Type | Required | Description |
1074
+ |---|---|---|---|
1075
+ | `body.operation` | `"change_tone" \| "fix_grammar_spelling" \| "change_objective" \| "expand" \| "shorten" \| "change_persona" \| "generate_from_scratch" \| Array<"change_tone" \| "fix_grammar_spelling" \| "change_objective" \| "expand" \| "shorten" \| "change_persona" \| "generate_from_scratch">` | yes | One operation, or several applied together in a single charged call. |
1076
+ | `body.channel_type` | `"email" \| "heyreach" \| "sms" \| null` | no | Required alongside `conversation_id`. `heyreach` is the LinkedIn channel and additionally needs `linkedin_account_id`. |
1077
+ | `body.conversation_id` | `string \| null` | no | Ground the draft in this thread's history. |
1078
+ | `body.instructions` | `string \| null` | no | Free-text prompt. With `generate_from_scratch` this writes a message with no thread at all. |
1079
+ | `body.linkedin_account_id` | `integer \| null` | no | |
1080
+ | `body.message_html` | `string` | no | The text to transform. Required by every operation except `generate_from_scratch`. default `""` |
1081
+ | `body.objective` | `"book_meeting" \| "follow_up" \| "re_engage" \| "provide_value" \| "handle_objection" \| "close_deal" \| null` | no | |
1082
+ | `body.persona` | `"sdr" \| "growth_manager" \| "account_executive" \| "customer_success" \| "founder" \| null` | no | |
1083
+ | `body.tone` | `"professional" \| "friendly" \| "casual" \| "assertive" \| "empathetic" \| "urgent" \| null` | no | |
1084
+
1085
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1086
+
1087
+ Other envelope fields: `pagination` (PaginationMeta).
1088
+
1089
+ **Example**
1090
+
1091
+ ```ts
1092
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
1093
+ const result = await g8.api.aiInbox.generateInboxDraft({ body: { operation: "change_tone" } });
1094
+ ```
1095
+
1096
+ ---
1097
+
1098
+ <a id="op-getassigneeeligibility"></a>
1099
+
1100
+ ### `g8.api.aiInbox.getAssigneeEligibility(input)`
1101
+
1102
+ **Get Assignee Eligibility**
1103
+
1104
+ - HTTP: `GET /api/v1/inbox/channels/{channel_id}/assignee-eligibility`
1105
+ - operationId: `get_assignee_eligibility_inbox_channels__channel_id__assignee_eligibility_get` (also callable as `g8.api.call("get_assignee_eligibility_inbox_channels__channel_id__assignee_eligibility_get", input)`)
1106
+ - Tier: `read`: reads data; safe to call and to retry
1107
+ - API-key scope: `inbox:read`
1108
+
1109
+ Who can be given this conversation, and who cannot.
1110
+
1111
+ Read this before assigning: eligibility depends on the channel and on
1112
+ mailbox access, so a user who appears in `/inbox/users` is not necessarily
1113
+ assignable to THIS thread.
1114
+
1115
+ **Input**
1116
+
1117
+ | Field | Type | Required | Description |
1118
+ |---|---|---|---|
1119
+ | `path.channel_id` | `string` | yes | Conversation id. |
1120
+ | `query.channel_type` | `"email" \| "chat" \| "phone" \| "sms" \| "heyreach" \| "meetings" \| "support" \| "all"` | yes | Which channel the conversation lives in. REQUIRED: the same id means different rows in different channels, so this is what identifies the conversation, not a filter. |
1121
+
1122
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1123
+
1124
+ Other envelope fields: `pagination` (PaginationMeta).
1125
+
1126
+ **Example**
1127
+
1128
+ ```ts
1129
+ const result = await g8.api.aiInbox.getAssigneeEligibility({ path: { channel_id: "id" }, query: { channel_type: "email" } });
1130
+ ```
1131
+
1132
+ ---
1133
+
1134
+ <a id="op-getinboxcallresult"></a>
1135
+
1136
+ ### `g8.api.aiInbox.getInboxCallResult(input)`
1137
+
1138
+ **Get Inbox Call Result**
1139
+
1140
+ - HTTP: `GET /api/v1/inbox/call-results/{call_id}`
1141
+ - operationId: `get_inbox_call_result_inbox_call_results__call_id__get` (also callable as `g8.api.call("get_inbox_call_result_inbox_call_results__call_id__get", input)`)
1142
+ - Tier: `read`: reads data; safe to call and to retry
1143
+ - API-key scope: `inbox:read`
1144
+
1145
+ One call outcome, with its transcript, disposition and tags.
1146
+
1147
+ **Input**
1148
+
1149
+ | Field | Type | Required | Description |
1150
+ |---|---|---|---|
1151
+ | `path.call_id` | `integer` | yes | Integer call-result id. |
1152
+
1153
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1154
+
1155
+ Other envelope fields: `pagination` (PaginationMeta).
1156
+
1157
+ **Example**
1158
+
1159
+ ```ts
1160
+ const result = await g8.api.aiInbox.getInboxCallResult({ path: { call_id: 123 } });
1161
+ ```
1162
+
1163
+ ---
1164
+
1165
+ <a id="op-getinboxchannel"></a>
1166
+
1167
+ ### `g8.api.aiInbox.getInboxChannel(input)`
1168
+
1169
+ **Get Inbox Channel**
1170
+
1171
+ - HTTP: `GET /api/v1/inbox/channels/{channel_id}`
1172
+ - operationId: `get_inbox_channel_inbox_channels__channel_id__get` (also callable as `g8.api.call("get_inbox_channel_inbox_channels__channel_id__get", input)`)
1173
+ - Tier: `read`: reads data; safe to call and to retry
1174
+ - API-key scope: `inbox:read`
1175
+
1176
+ One conversation in the unified inbox shape - messages, tags and
1177
+ assignees - for any channel.
1178
+
1179
+ The same row `GET /inbox` lists, fetched by id. Visibility is the app's:
1180
+ a thread in a personal mailbox is owner-only, so another person's key gets
1181
+ a 403/404 rather than the thread.
1182
+
1183
+ **Input**
1184
+
1185
+ | Field | Type | Required | Description |
1186
+ |---|---|---|---|
1187
+ | `path.channel_id` | `string` | yes | Conversation id. |
1188
+ | `query.channel_type` | `"email" \| "chat" \| "phone" \| "sms" \| "heyreach" \| "meetings" \| "support" \| "all"` | yes | Which channel the conversation lives in. REQUIRED: the same id means different rows in different channels. |
1189
+
1190
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1191
+
1192
+ Other envelope fields: `pagination` (PaginationMeta).
1193
+
1194
+ **Example**
1195
+
1196
+ ```ts
1197
+ const result = await g8.api.aiInbox.getInboxChannel({ path: { channel_id: "id" }, query: { channel_type: "email" } });
1198
+ ```
1199
+
1200
+ ---
1201
+
1202
+ <a id="op-getinboxemailsettings"></a>
1203
+
1204
+ ### `g8.api.aiInbox.getInboxEmailSettings(input?)`
1205
+
1206
+ **Get Inbox Email Settings**
1207
+
1208
+ - HTTP: `GET /api/v1/inbox/email-settings`
1209
+ - operationId: `get_inbox_email_settings_inbox_email_settings_get` (also callable as `g8.api.call("get_inbox_email_settings_inbox_email_settings_get", input)`)
1210
+ - Tier: `read`: reads data; safe to call and to retry
1211
+ - API-key scope: `inbox:read`
1212
+
1213
+ The organisation's AI Inbox email settings.
1214
+
1215
+ ORGANISATION-WIDE - there is no per-user copy, so a change here moves the
1216
+ behaviour for everyone. Answers `{"message": "Email settings not found"}`
1217
+ rather than 404 when nothing has been configured yet.
1218
+
1219
+ **Input**: none.
1220
+
1221
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1222
+
1223
+ Other envelope fields: `pagination` (PaginationMeta).
1224
+
1225
+ **Example**
1226
+
1227
+ ```ts
1228
+ const result = await g8.api.aiInbox.getInboxEmailSettings();
1229
+ ```
1230
+
1231
+ ---
1232
+
1233
+ <a id="op-getinboxlinkedinaccount"></a>
1234
+
1235
+ ### `g8.api.aiInbox.getInboxLinkedinAccount(input)`
1236
+
1237
+ **Get Inbox Linkedin Account**
1238
+
1239
+ - HTTP: `GET /api/v1/inbox/linkedin/accounts/{account_id}`
1240
+ - operationId: `get_inbox_linkedin_account_inbox_linkedin_accounts__account_id__get` (also callable as `g8.api.call("get_inbox_linkedin_account_inbox_linkedin_accounts__account_id__get", input)`)
1241
+ - Tier: `read`: reads data; safe to call and to retry
1242
+ - API-key scope: `inbox:read`
1243
+
1244
+ One LinkedIn account's inbox configuration - enabled, auto-respond and
1245
+ its rules, the sequence it is attributed to - plus the cached profile.
1246
+ The read side of `PUT /inbox/linkedin/accounts/{account_id}`; 404 until the
1247
+ account has been synced.
1248
+
1249
+ **Input**
1250
+
1251
+ | Field | Type | Required | Description |
1252
+ |---|---|---|---|
1253
+ | `path.account_id` | `integer` | yes | LinkedIn account id (integer). |
1254
+
1255
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1256
+
1257
+ Other envelope fields: `pagination` (PaginationMeta).
1258
+
1259
+ **Example**
1260
+
1261
+ ```ts
1262
+ const result = await g8.api.aiInbox.getInboxLinkedinAccount({ path: { account_id: 123 } });
1263
+ ```
1264
+
1265
+ ---
1266
+
1267
+ <a id="op-getinboxlinkedinconversation"></a>
1268
+
1269
+ ### `g8.api.aiInbox.getInboxLinkedinConversation(input)`
1270
+
1271
+ **Get Inbox Linkedin Conversation**
1272
+
1273
+ - HTTP: `GET /api/v1/inbox/linkedin/accounts/{account_id}/conversations/{conversation_id}`
1274
+ - operationId: `get_inbox_linkedin_conversation_inbox_linkedin_accounts__account_id__conversations__conversation_id__get` (also callable as `g8.api.call("get_inbox_linkedin_conversation_inbox_linkedin_accounts__account_id__conversations__conversation_id__get", input)`)
1275
+ - Tier: `read`: reads data; safe to call and to retry
1276
+ - API-key scope: `inbox:read`
1277
+
1278
+ One LinkedIn conversation, with its whole message history.
1279
+
1280
+ BOTH ids are required and neither is redundant: the same conversation id
1281
+ can appear under two LinkedIn accounts, so the account is what identifies
1282
+ the thread rather than filtering it.
1283
+
1284
+ **Input**
1285
+
1286
+ | Field | Type | Required | Description |
1287
+ |---|---|---|---|
1288
+ | `path.account_id` | `integer` | yes | LinkedIn account id (integer). |
1289
+ | `path.conversation_id` | `string` | yes | LinkedIn conversation id. |
1290
+
1291
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1292
+
1293
+ Other envelope fields: `pagination` (PaginationMeta).
1294
+
1295
+ **Example**
1296
+
1297
+ ```ts
1298
+ const result = await g8.api.aiInbox.getInboxLinkedinConversation({ path: { account_id: 123, conversation_id: "id" } });
1299
+ ```
1300
+
1301
+ ---
1302
+
1303
+ <a id="op-getinboxlinkedinconversationdetail"></a>
1304
+
1305
+ ### `g8.api.aiInbox.getInboxLinkedinConversationDetail(input)`
1306
+
1307
+ **Get Inbox Linkedin Conversation Detail**
1308
+
1309
+ - HTTP: `GET /api/v1/inbox/linkedin/accounts/{account_id}/conversations/{conversation_id}/detail`
1310
+ - operationId: `get_inbox_linkedin_conversation_detail_inbox_linkedin_accounts__account_id__conversations__conversation_id__detail_get` (also callable as `g8.api.call("get_inbox_linkedin_conversation_detail_inbox_linkedin_accounts__account_id__conversations__conversation_id__detail_get", input)`)
1311
+ - Tier: `read`: reads data; safe to call and to retry
1312
+ - API-key scope: `inbox:read`
1313
+
1314
+ One LinkedIn conversation MERGED with what graph8 holds about it: the
1315
+ AI analysis, the linked contact, tags, the saved draft and assignees.
1316
+
1317
+ `GET .../conversations/{conversation_id}` is the provider's view alone;
1318
+ this is the view the inbox renders.
1319
+
1320
+ **Input**
1321
+
1322
+ | Field | Type | Required | Description |
1323
+ |---|---|---|---|
1324
+ | `path.account_id` | `integer` | yes | LinkedIn account id (integer). |
1325
+ | `path.conversation_id` | `string` | yes | LinkedIn conversation id. |
1326
+
1327
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1328
+
1329
+ Other envelope fields: `pagination` (PaginationMeta).
1330
+
1331
+ **Example**
1332
+
1333
+ ```ts
1334
+ const result = await g8.api.aiInbox.getInboxLinkedinConversationDetail({ path: { account_id: 123, conversation_id: "id" } });
1335
+ ```
1336
+
1337
+ ---
1338
+
1339
+ <a id="op-getinboxmailboxsync"></a>
1340
+
1341
+ ### `g8.api.aiInbox.getInboxMailboxSync(input)`
1342
+
1343
+ **Get Inbox Mailbox Sync**
1344
+
1345
+ - HTTP: `GET /api/v1/inbox/mailboxes/{mailbox}/sync`
1346
+ - operationId: `get_inbox_mailbox_sync_inbox_mailboxes__mailbox__sync_get` (also callable as `g8.api.call("get_inbox_mailbox_sync_inbox_mailboxes__mailbox__sync_get", input)`)
1347
+ - Tier: `read`: reads data; safe to call and to retry
1348
+ - API-key scope: `inbox:read`
1349
+
1350
+ Is this mailbox being polled, and how did the last round go.
1351
+
1352
+ A mailbox that was never connected is not an error - it answers
1353
+ `{"status": "STOPPED"}`.
1354
+
1355
+ NOTE the asymmetry this proxy has to respect: the internal handler takes
1356
+ NO `current_user`, while its siblings do. Supplying one would be a
1357
+ TypeError on every call.
1358
+
1359
+ **Input**
1360
+
1361
+ | Field | Type | Required | Description |
1362
+ |---|---|---|---|
1363
+ | `path.mailbox` | `string` | yes | The mailbox ADDRESS, e.g. `sales@acme.com`. Not a numeric id. |
1364
+ | `query.provider` | `"google_mailbox" \| "smtp"` | yes | How the mailbox is connected. REQUIRED and not inferred: the same address can be connected either way, and guessing would act on the wrong transport. Closed to a Literal so an unknown value is a 422 naming both, rather than a `ValueError` raised inside the handler. |
1365
+
1366
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1367
+
1368
+ Other envelope fields: `pagination` (PaginationMeta).
1369
+
1370
+ **Example**
1371
+
1372
+ ```ts
1373
+ const result = await g8.api.aiInbox.getInboxMailboxSync({
1374
+ path: { mailbox: "example" },
1375
+ query: { provider: "google_mailbox" },
1376
+ });
1377
+ ```
1378
+
1379
+ ---
1380
+
1381
+ <a id="op-getinboxtagagent"></a>
1382
+
1383
+ ### `g8.api.aiInbox.getInboxTagAgent(input)`
1384
+
1385
+ **Get Inbox Tag Agent**
1386
+
1387
+ - HTTP: `GET /api/v1/inbox/tags/{tag_id}/agent`
1388
+ - operationId: `get_inbox_tag_agent_inbox_tags__tag_id__agent_get` (also callable as `g8.api.call("get_inbox_tag_agent_inbox_tags__tag_id__agent_get", input)`)
1389
+ - Tier: `read`: reads data; safe to call and to retry
1390
+ - API-key scope: `inbox:read`
1391
+
1392
+ Which AI agent answers threads carrying this tag.
1393
+
1394
+ The bridge between a label and a behaviour: tagging a thread with a tag
1395
+ that has an agent is how that agent gets the conversation.
1396
+
1397
+ **Input**
1398
+
1399
+ | Field | Type | Required | Description |
1400
+ |---|---|---|---|
1401
+ | `path.tag_id` | `string` | yes | Tag id. |
1402
+
1403
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1404
+
1405
+ Other envelope fields: `pagination` (PaginationMeta).
1406
+
1407
+ **Example**
1408
+
1409
+ ```ts
1410
+ const result = await g8.api.aiInbox.getInboxTagAgent({ path: { tag_id: "id" } });
1411
+ ```
1412
+
1413
+ ---
1414
+
1415
+ <a id="op-getinboxworkspace"></a>
1416
+
1417
+ ### `g8.api.aiInbox.getInboxWorkspace(input)`
1418
+
1419
+ **Get Inbox Workspace**
1420
+
1421
+ - HTTP: `GET /api/v1/inbox/workspaces/{workspace_id}`
1422
+ - operationId: `get_inbox_workspace_inbox_workspaces__workspace_id__get` (also callable as `g8.api.call("get_inbox_workspace_inbox_workspaces__workspace_id__get", input)`)
1423
+ - Tier: `read`: reads data; safe to call and to retry
1424
+ - API-key scope: `inbox:read`
1425
+
1426
+ One workspace, with its mailboxes.
1427
+
1428
+ **Input**
1429
+
1430
+ | Field | Type | Required | Description |
1431
+ |---|---|---|---|
1432
+ | `path.workspace_id` | `string` | yes | Workspace id (UUID). |
1433
+
1434
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1435
+
1436
+ Other envelope fields: `pagination` (PaginationMeta).
1437
+
1438
+ **Example**
1439
+
1440
+ ```ts
1441
+ const result = await g8.api.aiInbox.getInboxWorkspace({ path: { workspace_id: "id" } });
1442
+ ```
1443
+
1444
+ ---
1445
+
1446
+ <a id="op-getsequencechannels"></a>
1447
+
1448
+ ### `g8.api.aiInbox.getSequenceChannels(input)`
1449
+
1450
+ **Get Sequence Channels**
1451
+
1452
+ - HTTP: `GET /api/v1/inbox/workspaces/sequence-channels/{sequence_id}`
1453
+ - operationId: `get_sequence_channels_inbox_workspaces_sequence_channels__sequence_id__get` (also callable as `g8.api.call("get_sequence_channels_inbox_workspaces_sequence_channels__sequence_id__get", input)`)
1454
+ - Tier: `read`: reads data; safe to call and to retry
1455
+ - API-key scope: `inbox:read`
1456
+
1457
+ The conversations a sequence produced.
1458
+
1459
+ The bridge between a sequence and its replies: what went out, and what
1460
+ came back.
1461
+
1462
+ **Input**
1463
+
1464
+ | Field | Type | Required | Description |
1465
+ |---|---|---|---|
1466
+ | `path.sequence_id` | `string` | yes | Sequence id. |
1467
+
1468
+ **Returns** `ApiResponse_InboxListPayload_`: the envelope `{ data: InboxListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1469
+
1470
+ Other envelope fields: `pagination` (PaginationMeta).
1471
+
1472
+ `InboxListPayload` fields:
1473
+
1474
+ | Field | Type | Required | Description |
1475
+ |---|---|---|---|
1476
+ | `items` | `Array<unknown>` | no | |
1477
+
1478
+ **Example**
1479
+
1480
+ ```ts
1481
+ const result = await g8.api.aiInbox.getSequenceChannels({ path: { sequence_id: "id" } });
1482
+ ```
1483
+
1484
+ ---
1485
+
1486
+ <a id="op-getworkspaceunreadcounts"></a>
1487
+
1488
+ ### `g8.api.aiInbox.getWorkspaceUnreadCounts(input?)`
1489
+
1490
+ **Get Workspace Unread Counts**
1491
+
1492
+ - HTTP: `GET /api/v1/inbox/workspaces/unread-counts`
1493
+ - operationId: `get_workspace_unread_counts_inbox_workspaces_unread_counts_get` (also callable as `g8.api.call("get_workspace_unread_counts_inbox_workspaces_unread_counts_get", input)`)
1494
+ - Tier: `read`: reads data; safe to call and to retry
1495
+ - API-key scope: `inbox:read`
1496
+
1497
+ Unread per workspace, in one call.
1498
+
1499
+ Declared BEFORE `/workspaces/{workspace_id}` so the literal wins - the id
1500
+ route would otherwise match `unread-counts` and fail parsing it as a UUID.
1501
+
1502
+ **Input**: none.
1503
+
1504
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1505
+
1506
+ Other envelope fields: `pagination` (PaginationMeta).
1507
+
1508
+ **Example**
1509
+
1510
+ ```ts
1511
+ const result = await g8.api.aiInbox.getWorkspaceUnreadCounts();
1512
+ ```
1513
+
1514
+ ---
1515
+
1516
+ <a id="op-linkinboxemailtosequence"></a>
1517
+
1518
+ ### `g8.api.aiInbox.linkInboxEmailToSequence(input)`
1519
+
1520
+ **Link Inbox Email To Sequence**
1521
+
1522
+ - HTTP: `POST /api/v1/inbox/emails/{email_id}/link-sequence`
1523
+ - operationId: `link_inbox_email_to_sequence_inbox_emails__email_id__link_sequence_post` (also callable as `g8.api.call("link_inbox_email_to_sequence_inbox_emails__email_id__link_sequence_post", input)`)
1524
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
1525
+ - API-key scope: `inbox:write`
1526
+
1527
+ Attach a thread to the sequence that produced it AND STOP THE SEQUENCE.
1528
+
1529
+ The second half is the point, not a side effect: linking tells the
1530
+ sequencer this contact replied, which halts their remaining steps. It is
1531
+ how someone who answered stops being chased.
1532
+
1533
+ Only a sequence from `sequence-candidates` is accepted. If the sequencer
1534
+ call fails the link is KEPT - the association is committed first - so a
1535
+ successful response with `already_replied: false` after a provider hiccup
1536
+ can mean the halt did not register. Re-linking is safe.
1537
+
1538
+ **Input**
1539
+
1540
+ | Field | Type | Required | Description |
1541
+ |---|---|---|---|
1542
+ | `path.email_id` | `string` | yes | Email thread id. |
1543
+ | `body` | `LinkSequenceRequest` | yes | Request body; fields below. |
1544
+
1545
+ Body fields (`LinkSequenceRequest`):
1546
+
1547
+ | Field | Type | Required | Description |
1548
+ |---|---|---|---|
1549
+ | `body.contact_id` | `integer` | yes | Integer contact id - the CDP primary key, not an email address. |
1550
+ | `body.sequence_id` | `string` | yes | From `GET /inbox/emails/{email_id}/sequence-candidates`. Only sequences that actually emailed this contact are accepted. |
1551
+
1552
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1553
+
1554
+ Other envelope fields: `pagination` (PaginationMeta).
1555
+
1556
+ **Example**
1557
+
1558
+ ```ts
1559
+ const result = await g8.api.aiInbox.linkInboxEmailToSequence({
1560
+ path: { email_id: "jane@acme.com" },
1561
+ body: { contact_id: 123, sequence_id: "id" },
1562
+ });
1563
+ ```
1564
+
1565
+ ---
1566
+
1567
+ <a id="op-linkmeetingtranscript"></a>
1568
+
1569
+ ### `g8.api.aiInbox.linkMeetingTranscript(input)`
1570
+
1571
+ **Link Meeting Transcript**
1572
+
1573
+ - HTTP: `POST /api/v1/inbox/meetings/{meeting_id}/transcript-link`
1574
+ - operationId: `link_meeting_transcript_inbox_meetings__meeting_id__transcript_link_post` (also callable as `g8.api.call("link_meeting_transcript_inbox_meetings__meeting_id__transcript_link_post", input)`)
1575
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
1576
+ - API-key scope: `meetings:write`
1577
+
1578
+ Attach an existing transcript to a meeting.
1579
+
1580
+ Contacts nobody. It corrects the RECORD - which recording belongs to which
1581
+ calendar event - when the automatic match got it wrong or never ran.
1582
+
1583
+ Who may then read that transcript is a separate question, answered by
1584
+ `PATCH /inbox/meetings/{id}/sensitivity`.
1585
+
1586
+ **Input**
1587
+
1588
+ | Field | Type | Required | Description |
1589
+ |---|---|---|---|
1590
+ | `path.meeting_id` | `string` | yes | Meeting id, as returned by `GET /inbox/meetings`. |
1591
+ | `body` | `MeetingTranscriptLinkRequest` | yes | Request body; fields below. |
1592
+
1593
+ Body fields (`MeetingTranscriptLinkRequest`):
1594
+
1595
+ | Field | Type | Required | Description |
1596
+ |---|---|---|---|
1597
+ | `body.transcript_id` | `string` | yes | Id of a transcript that already exists in this organisation. |
1598
+
1599
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1600
+
1601
+ Other envelope fields: `pagination` (PaginationMeta).
1602
+
1603
+ **Example**
1604
+
1605
+ ```ts
1606
+ const result = await g8.api.aiInbox.linkMeetingTranscript({ path: { meeting_id: "id" }, body: { transcript_id: "id" } });
1607
+ ```
1608
+
1609
+ ---
1610
+
1611
+ <a id="op-listallinboxmailboxes"></a>
1612
+
1613
+ ### `g8.api.aiInbox.listAllInboxMailboxes(input?)`
1614
+
1615
+ **List All Inbox Mailboxes**
1616
+
1617
+ - HTTP: `GET /api/v1/inbox/mailboxes/all`
1618
+ - operationId: `list_all_inbox_mailboxes_inbox_mailboxes_all_get` (also callable as `g8.api.call("list_all_inbox_mailboxes_inbox_mailboxes_all_get", input)`)
1619
+ - Tier: `read`: reads data; safe to call and to retry
1620
+ - API-key scope: `inbox:read`
1621
+
1622
+ Team AND personal mailboxes in one list, unfiltered.
1623
+
1624
+ A three-segment LITERAL, declared before nothing that would swallow it -
1625
+ there is no `/inbox/mailboxes/{mailbox}` route, only deeper ones - but
1626
+ kept distinct from `GET /inbox/mailboxes` because that route defaults to
1627
+ a narrower set and callers reading only the obvious one would miss
1628
+ mailboxes.
1629
+
1630
+ **Input**
1631
+
1632
+ | Field | Type | Required | Description |
1633
+ |---|---|---|---|
1634
+ | `query.user_email` | `string \| null` | no | Whose personal mailboxes to include. Defaults to this key's human. |
1635
+
1636
+ **Returns** `ApiResponse_InboxOpsListPayload_`: the envelope `{ data: InboxOpsListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1637
+
1638
+ Other envelope fields: `pagination` (PaginationMeta).
1639
+
1640
+ `InboxOpsListPayload` fields:
1641
+
1642
+ | Field | Type | Required | Description |
1643
+ |---|---|---|---|
1644
+ | `items` | `Array<unknown>` | no | |
1645
+
1646
+ **Example**
1647
+
1648
+ ```ts
1649
+ const result = await g8.api.aiInbox.listAllInboxMailboxes();
1650
+ ```
1651
+
1652
+ ---
1653
+
1654
+ <a id="op-listassignablemeetingusers"></a>
1655
+
1656
+ ### `g8.api.aiInbox.listAssignableMeetingUsers(input)`
1657
+
1658
+ **List Assignable Meeting Users**
1659
+
1660
+ - HTTP: `GET /api/v1/inbox/meetings/{meeting_id}/assignable-users`
1661
+ - operationId: `list_assignable_meeting_users_inbox_meetings__meeting_id__assignable_users_get` (also callable as `g8.api.call("list_assignable_meeting_users_inbox_meetings__meeting_id__assignable_users_get", input)`)
1662
+ - Tier: `read`: reads data; safe to call and to retry
1663
+ - API-key scope: `meetings:read`
1664
+
1665
+ Who a task on this meeting may be given to.
1666
+
1667
+ PARTICIPANTS ONLY, mapped to their team-member records. Read this before
1668
+ creating a task: the server re-validates the assignee against the same
1669
+ list, so an arbitrary colleague is refused rather than silently accepted.
1670
+
1671
+ **Input**
1672
+
1673
+ | Field | Type | Required | Description |
1674
+ |---|---|---|---|
1675
+ | `path.meeting_id` | `string` | yes | Meeting id, as returned by `GET /inbox/meetings`. |
1676
+
1677
+ **Returns** `ApiResponse_InboxOpsListPayload_`: the envelope `{ data: InboxOpsListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1678
+
1679
+ Other envelope fields: `pagination` (PaginationMeta).
1680
+
1681
+ `InboxOpsListPayload` fields:
1682
+
1683
+ | Field | Type | Required | Description |
1684
+ |---|---|---|---|
1685
+ | `items` | `Array<unknown>` | no | |
1686
+
1687
+ **Example**
1688
+
1689
+ ```ts
1690
+ const result = await g8.api.aiInbox.listAssignableMeetingUsers({ path: { meeting_id: "id" } });
1691
+ ```
1692
+
1693
+ ---
1694
+
1695
+ <a id="op-listchannelcomments"></a>
1696
+
1697
+ ### `g8.api.aiInbox.listChannelComments(input)`
1698
+
1699
+ **List Channel Comments**
1700
+
1701
+ - HTTP: `GET /api/v1/inbox/channels/{channel_id}/comments`
1702
+ - operationId: `list_channel_comments_inbox_channels__channel_id__comments_get` (also callable as `g8.api.call("list_channel_comments_inbox_channels__channel_id__comments_get", input)`)
1703
+ - Tier: `read`: reads data; safe to call and to retry
1704
+ - API-key scope: `inbox:read`
1705
+
1706
+ Internal notes on a conversation. The customer never sees these.
1707
+
1708
+ **Input**
1709
+
1710
+ | Field | Type | Required | Description |
1711
+ |---|---|---|---|
1712
+ | `path.channel_id` | `string` | yes | Conversation id. |
1713
+ | `query.channel_type` | `"email" \| "chat" \| "phone" \| "sms" \| "heyreach" \| "meetings" \| "support" \| "all"` | yes | Which channel the conversation lives in. REQUIRED: the same id means different rows in different channels, so this is what identifies the conversation, not a filter. |
1714
+
1715
+ **Returns** `ApiResponse_InboxListPayload_`: the envelope `{ data: InboxListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1716
+
1717
+ Other envelope fields: `pagination` (PaginationMeta).
1718
+
1719
+ `InboxListPayload` fields:
1720
+
1721
+ | Field | Type | Required | Description |
1722
+ |---|---|---|---|
1723
+ | `items` | `Array<unknown>` | no | |
1724
+
1725
+ **Example**
1726
+
1727
+ ```ts
1728
+ const result = await g8.api.aiInbox.listChannelComments({ path: { channel_id: "id" }, query: { channel_type: "email" } });
1729
+ ```
1730
+
1731
+ ---
1732
+
1733
+ <a id="op-listinboxblockedsenders"></a>
1734
+
1735
+ ### `g8.api.aiInbox.listInboxBlockedSenders(input?)`
1736
+
1737
+ **List Inbox Blocked Senders**
1738
+
1739
+ - HTTP: `GET /api/v1/inbox/blocked-senders`
1740
+ - operationId: `list_inbox_blocked_senders_inbox_blocked_senders_get` (also callable as `g8.api.call("list_inbox_blocked_senders_inbox_blocked_senders_get", input)`)
1741
+ - Tier: `read`: reads data; safe to call and to retry
1742
+ - API-key scope: `inbox:read`
1743
+
1744
+ Senders the inbox refuses to ingest, per mailbox.
1745
+
1746
+ **Input**
1747
+
1748
+ | Field | Type | Required | Description |
1749
+ |---|---|---|---|
1750
+ | `query.page` | `integer` | no | default `1` |
1751
+ | `query.page_size` | `integer` | no | default `10` |
1752
+
1753
+ **Returns** `ApiResponse_InboxOpsListPayload_`: the envelope `{ data: InboxOpsListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1754
+
1755
+ Other envelope fields: `pagination` (PaginationMeta).
1756
+
1757
+ `InboxOpsListPayload` fields:
1758
+
1759
+ | Field | Type | Required | Description |
1760
+ |---|---|---|---|
1761
+ | `items` | `Array<unknown>` | no | |
1762
+
1763
+ **Example**
1764
+
1765
+ ```ts
1766
+ const result = await g8.api.aiInbox.listInboxBlockedSenders();
1767
+ ```
1768
+
1769
+ ---
1770
+
1771
+ <a id="op-listinboxemailsequencecandidates"></a>
1772
+
1773
+ ### `g8.api.aiInbox.listInboxEmailSequenceCandidates(input)`
1774
+
1775
+ **List Inbox Email Sequence Candidates**
1776
+
1777
+ - HTTP: `GET /api/v1/inbox/emails/{email_id}/sequence-candidates`
1778
+ - operationId: `list_inbox_email_sequence_candidates_inbox_emails__email_id__sequence_candidates_get` (also callable as `g8.api.call("list_inbox_email_sequence_candidates_inbox_emails__email_id__sequence_candidates_get", input)`)
1779
+ - Tier: `read`: reads data; safe to call and to retry
1780
+ - API-key scope: `inbox:read`
1781
+
1782
+ Sequences this contact was ACTUALLY emailed from.
1783
+
1784
+ The only sequences `link-sequence` will accept, so read this first - it is
1785
+ the safety guard, not a convenience. Scoping is by organisation and
1786
+ contact; the thread id is in the path for symmetry with the link call.
1787
+
1788
+ **Input**
1789
+
1790
+ | Field | Type | Required | Description |
1791
+ |---|---|---|---|
1792
+ | `path.email_id` | `string` | yes | Email thread id. |
1793
+ | `query.contact_id` | `integer` | yes | Integer contact id - the CDP primary key, not an email address. |
1794
+
1795
+ **Returns** `ApiResponse_InboxOpsListPayload_`: the envelope `{ data: InboxOpsListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1796
+
1797
+ Other envelope fields: `pagination` (PaginationMeta).
1798
+
1799
+ `InboxOpsListPayload` fields:
1800
+
1801
+ | Field | Type | Required | Description |
1802
+ |---|---|---|---|
1803
+ | `items` | `Array<unknown>` | no | |
1804
+
1805
+ **Example**
1806
+
1807
+ ```ts
1808
+ const result = await g8.api.aiInbox.listInboxEmailSequenceCandidates({ path: { email_id: "jane@acme.com" }, query: { contact_id: 123 } });
1809
+ ```
1810
+
1811
+ ---
1812
+
1813
+ <a id="op-listinboxemailsettingstimezones"></a>
1814
+
1815
+ ### `g8.api.aiInbox.listInboxEmailSettingsTimezones(input?)`
1816
+
1817
+ **List Inbox Email Settings Timezones**
1818
+
1819
+ - HTTP: `GET /api/v1/inbox/email-settings/timezones`
1820
+ - operationId: `list_inbox_email_settings_timezones_inbox_email_settings_timezones_get` (also callable as `g8.api.call("list_inbox_email_settings_timezones_inbox_email_settings_timezones_get", input)`)
1821
+ - Tier: `read`: reads data; safe to call and to retry
1822
+ - API-key scope: `inbox:read`
1823
+
1824
+ Every timezone name `timezone` in the email settings accepts (IANA
1825
+ names, as `items`). Static - it does not depend on the organisation.
1826
+
1827
+ **Input**: none.
1828
+
1829
+ **Returns** `ApiResponse_InboxOpsListPayload_`: the envelope `{ data: InboxOpsListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1830
+
1831
+ Other envelope fields: `pagination` (PaginationMeta).
1832
+
1833
+ `InboxOpsListPayload` fields:
1834
+
1835
+ | Field | Type | Required | Description |
1836
+ |---|---|---|---|
1837
+ | `items` | `Array<unknown>` | no | |
1838
+
1839
+ **Example**
1840
+
1841
+ ```ts
1842
+ const result = await g8.api.aiInbox.listInboxEmailSettingsTimezones();
1843
+ ```
1844
+
1845
+ ---
1846
+
1847
+ <a id="op-listinboxemailsbysequence"></a>
1848
+
1849
+ ### `g8.api.aiInbox.listInboxEmailsBySequence(input)`
1850
+
1851
+ **List Inbox Emails By Sequence**
1852
+
1853
+ - HTTP: `GET /api/v1/inbox/emails/by-sequence/{sequence_id}`
1854
+ - operationId: `list_inbox_emails_by_sequence_inbox_emails_by_sequence__sequence_id__get` (also callable as `g8.api.call("list_inbox_emails_by_sequence_inbox_emails_by_sequence__sequence_id__get", input)`)
1855
+ - Tier: `read`: reads data; safe to call and to retry
1856
+ - API-key scope: `inbox:read`
1857
+
1858
+ Email threads attributed to one sequence, newest first.
1859
+
1860
+ A narrow projection - messages, mailbox and `updated_at` only - which is
1861
+ what makes it cheap enough to page through a whole campaign.
1862
+ `GET /inbox?channel=email&sequence_id=...` answers the same question with
1863
+ the full unified thread shape; use that when you need tags and assignees.
1864
+
1865
+ Declared BEFORE nothing, but note the shape: `by-sequence` is a LITERAL in
1866
+ the position `/inbox/emails/{email_id}` fills at one segment shorter, so
1867
+ the two cannot collide.
1868
+
1869
+ **Input**
1870
+
1871
+ | Field | Type | Required | Description |
1872
+ |---|---|---|---|
1873
+ | `path.sequence_id` | `string` | yes | Sequence (campaign) id. |
1874
+ | `query.page` | `integer` | no | default `1` |
1875
+ | `query.page_size` | `integer` | no | default `10` |
1876
+
1877
+ **Returns** `ApiResponse_InboxOpsListPayload_`: the envelope `{ data: InboxOpsListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1878
+
1879
+ Other envelope fields: `pagination` (PaginationMeta).
1880
+
1881
+ `InboxOpsListPayload` fields:
1882
+
1883
+ | Field | Type | Required | Description |
1884
+ |---|---|---|---|
1885
+ | `items` | `Array<unknown>` | no | |
1886
+
1887
+ **Example**
1888
+
1889
+ ```ts
1890
+ const result = await g8.api.aiInbox.listInboxEmailsBySequence({ path: { sequence_id: "id" } });
1891
+ ```
1892
+
1893
+ ---
1894
+
1895
+ <a id="op-listinboxlinkedinaccounts"></a>
1896
+
1897
+ ### `g8.api.aiInbox.listInboxLinkedinAccounts(input?)`
1898
+
1899
+ **List Inbox Linkedin Accounts**
1900
+
1901
+ - HTTP: `GET /api/v1/inbox/linkedin/accounts`
1902
+ - operationId: `list_inbox_linkedin_accounts_inbox_linkedin_accounts_get` (also callable as `g8.api.call("list_inbox_linkedin_accounts_inbox_linkedin_accounts_get", input)`)
1903
+ - Tier: `read`: reads data; safe to call and to retry
1904
+ - API-key scope: `inbox:read`
1905
+
1906
+ LinkedIn accounts as the PROVIDER reports them.
1907
+
1908
+ Live from the provider, so it reflects a disconnected or suspended account
1909
+ immediately - but it carries none of the local inbox configuration. Read
1910
+ the configuration back from the update call, or set it with
1911
+ `PUT /inbox/linkedin/accounts/{account_id}`.
1912
+
1913
+ **Input**
1914
+
1915
+ | Field | Type | Required | Description |
1916
+ |---|---|---|---|
1917
+ | `query.keyword` | `string \| null` | no | Filter by name. |
1918
+ | `query.offset` | `integer` | no | default `0` |
1919
+ | `query.limit` | `integer` | no | default `50` |
1920
+
1921
+ **Returns** `ApiResponse_InboxOpsListPayload_`: the envelope `{ data: InboxOpsListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1922
+
1923
+ Other envelope fields: `pagination` (PaginationMeta).
1924
+
1925
+ `InboxOpsListPayload` fields:
1926
+
1927
+ | Field | Type | Required | Description |
1928
+ |---|---|---|---|
1929
+ | `items` | `Array<unknown>` | no | |
1930
+
1931
+ **Example**
1932
+
1933
+ ```ts
1934
+ const result = await g8.api.aiInbox.listInboxLinkedinAccounts();
1935
+ ```
1936
+
1937
+ ---
1938
+
1939
+ <a id="op-listinboxmailboxes"></a>
1940
+
1941
+ ### `g8.api.aiInbox.listInboxMailboxes(input?)`
1942
+
1943
+ **List Inbox Mailboxes**
1944
+
1945
+ - HTTP: `GET /api/v1/inbox/mailboxes`
1946
+ - operationId: `list_inbox_mailboxes_inbox_mailboxes_get` (also callable as `g8.api.call("list_inbox_mailboxes_inbox_mailboxes_get", input)`)
1947
+ - Tier: `read`: reads data; safe to call and to retry
1948
+ - API-key scope: `inbox:read`
1949
+
1950
+ Mailboxes with their AI Inbox sync state.
1951
+
1952
+ Each row carries the mailbox record PLUS `cron_status`, `auto_respond`,
1953
+ `is_supported`, `has_credential_error` and `last_unread_limit` - the
1954
+ inbox-only columns `/mailboxes` does not have.
1955
+
1956
+ **Input**
1957
+
1958
+ | Field | Type | Required | Description |
1959
+ |---|---|---|---|
1960
+ | `query.user_email` | `string \| null` | no | Whose PERSONAL mailboxes to include. Defaults to the human who minted this key. An org-scoped key has no human, so it sees the team mailboxes only. |
1961
+ | `query.provider` | `"google_mailbox" \| "smtp" \| null` | no | Filter by connection type. |
1962
+ | `query.category` | `"team" \| "personal" \| null` | no | `team` (shared) or `personal` (owner-only). |
1963
+
1964
+ **Returns** `ApiResponse_InboxOpsListPayload_`: the envelope `{ data: InboxOpsListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1965
+
1966
+ Other envelope fields: `pagination` (PaginationMeta).
1967
+
1968
+ `InboxOpsListPayload` fields:
1969
+
1970
+ | Field | Type | Required | Description |
1971
+ |---|---|---|---|
1972
+ | `items` | `Array<unknown>` | no | |
1973
+
1974
+ **Example**
1975
+
1976
+ ```ts
1977
+ const result = await g8.api.aiInbox.listInboxMailboxes();
1978
+ ```
1979
+
1980
+ ---
1981
+
1982
+ <a id="op-listinboxmailboxespaginated"></a>
1983
+
1984
+ ### `g8.api.aiInbox.listInboxMailboxesPaginated(input?)`
1985
+
1986
+ **List Inbox Mailboxes Paginated**
1987
+
1988
+ - HTTP: `GET /api/v1/inbox/mailboxes/paginated`
1989
+ - operationId: `list_inbox_mailboxes_paginated_inbox_mailboxes_paginated_get` (also callable as `g8.api.call("list_inbox_mailboxes_paginated_inbox_mailboxes_paginated_get", input)`)
1990
+ - Tier: `read`: reads data; safe to call and to retry
1991
+ - API-key scope: `inbox:read`
1992
+
1993
+ Mailboxes with their sync state, paged and filterable - the settings
1994
+ screen's list.
1995
+
1996
+ Every VISIBLE mailbox is returned, disconnected ones included, and each is
1997
+ annotated with `can_send` / `send_blocked_reason` for THIS caller, so a
1998
+ mailbox the key may see but not send from is distinguishable before a send
1999
+ is attempted. `total_count` carries the unpaged total. Credentials are
2000
+ scrubbed from every row.
2001
+
2002
+ **Input**
2003
+
2004
+ | Field | Type | Required | Description |
2005
+ |---|---|---|---|
2006
+ | `query.page` | `integer` | no | default `1` |
2007
+ | `query.page_size` | `integer` | no | default `20` |
2008
+ | `query.status` | `"RUNNING" \| "STOPPED" \| null` | no | `RUNNING` (being polled) or `STOPPED`. |
2009
+ | `query.provider` | `"google_mailbox" \| "smtp" \| null` | no | Filter by connection type. |
2010
+ | `query.search` | `string \| null` | no | Substring of the mailbox address. |
2011
+
2012
+ **Returns** `ApiResponse_InboxOpsListPayload_`: the envelope `{ data: InboxOpsListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2013
+
2014
+ Other envelope fields: `pagination` (PaginationMeta).
2015
+
2016
+ `InboxOpsListPayload` fields:
2017
+
2018
+ | Field | Type | Required | Description |
2019
+ |---|---|---|---|
2020
+ | `items` | `Array<unknown>` | no | |
2021
+
2022
+ **Example**
2023
+
2024
+ ```ts
2025
+ const result = await g8.api.aiInbox.listInboxMailboxesPaginated();
2026
+ ```
2027
+
2028
+ ---
2029
+
2030
+ <a id="op-listinboxusers"></a>
2031
+
2032
+ ### `g8.api.aiInbox.listInboxUsers(input?)`
2033
+
2034
+ **List Inbox Users**
2035
+
2036
+ - HTTP: `GET /api/v1/inbox/users`
2037
+ - operationId: `list_inbox_users_inbox_users_get` (also callable as `g8.api.call("list_inbox_users_inbox_users_get", input)`)
2038
+ - Tier: `read`: reads data; safe to call and to retry
2039
+ - API-key scope: `inbox:read`
2040
+
2041
+ Everyone in the organisation, as the inbox sees them.
2042
+
2043
+ The directory an assignment draws from - but eligibility for a SPECIFIC
2044
+ conversation is a separate question, answered by
2045
+ `/inbox/channels/{id}/assignee-eligibility`.
2046
+
2047
+ **Input**: none.
2048
+
2049
+ **Returns** `ApiResponse_InboxListPayload_`: the envelope `{ data: InboxListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2050
+
2051
+ Other envelope fields: `pagination` (PaginationMeta).
2052
+
2053
+ `InboxListPayload` fields:
2054
+
2055
+ | Field | Type | Required | Description |
2056
+ |---|---|---|---|
2057
+ | `items` | `Array<unknown>` | no | |
2058
+
2059
+ **Example**
2060
+
2061
+ ```ts
2062
+ const result = await g8.api.aiInbox.listInboxUsers();
2063
+ ```
2064
+
2065
+ ---
2066
+
2067
+ <a id="op-listinboxworkspaces"></a>
2068
+
2069
+ ### `g8.api.aiInbox.listInboxWorkspaces(input?)`
2070
+
2071
+ **List Inbox Workspaces**
2072
+
2073
+ - HTTP: `GET /api/v1/inbox/workspaces`
2074
+ - operationId: `list_inbox_workspaces_inbox_workspaces_get` (also callable as `g8.api.call("list_inbox_workspaces_inbox_workspaces_get", input)`)
2075
+ - Tier: `read`: reads data; safe to call and to retry
2076
+ - API-key scope: `inbox:read`
2077
+
2078
+ Inbox workspaces - the mailbox groupings a team works out of.
2079
+
2080
+ PLURAL here, though the app splits reads onto `/workspace` and the one
2081
+ write onto `/workspaces`. Two paths one letter apart do not belong in a
2082
+ public contract.
2083
+
2084
+ **Input**
2085
+
2086
+ | Field | Type | Required | Description |
2087
+ |---|---|---|---|
2088
+ | `query.page` | `integer` | no | default `1` |
2089
+ | `query.page_size` | `integer` | no | default `20` |
2090
+
2091
+ **Returns** `ApiResponse_InboxListPayload_`: the envelope `{ data: InboxListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2092
+
2093
+ Other envelope fields: `pagination` (PaginationMeta).
2094
+
2095
+ `InboxListPayload` fields:
2096
+
2097
+ | Field | Type | Required | Description |
2098
+ |---|---|---|---|
2099
+ | `items` | `Array<unknown>` | no | |
2100
+
2101
+ **Example**
2102
+
2103
+ ```ts
2104
+ const result = await g8.api.aiInbox.listInboxWorkspaces();
2105
+ ```
2106
+
2107
+ ---
2108
+
2109
+ <a id="op-listmailboxassociatedsequences"></a>
2110
+
2111
+ ### `g8.api.aiInbox.listMailboxAssociatedSequences(input)`
2112
+
2113
+ **List Mailbox Associated Sequences**
2114
+
2115
+ - HTTP: `POST /api/v1/inbox/mailboxes/associated-sequences`
2116
+ - operationId: `list_mailbox_associated_sequences_inbox_mailboxes_associated_sequences_post` (also callable as `g8.api.call("list_mailbox_associated_sequences_inbox_mailboxes_associated_sequences_post", input)`)
2117
+ - Tier: `read`: reads data; safe to call and to retry
2118
+ - API-key scope: `inbox:read`
2119
+
2120
+ Which sequences have threads in these mailboxes.
2121
+
2122
+ A POST because the mailbox list is a body; it reads and writes nothing,
2123
+ so it gates on `inbox:read`.
2124
+
2125
+ Keyed by mailbox ADDRESS. `/mailboxes/{mailbox_id}/associated-sequences`
2126
+ is the same question asked of one mailbox by its numeric id - a different
2127
+ key, which is why this is not folded into it.
2128
+
2129
+ **Input**
2130
+
2131
+ | Field | Type | Required | Description |
2132
+ |---|---|---|---|
2133
+ | `body` | `MailboxAddressesRequest` | yes | Request body; fields below. |
2134
+
2135
+ Body fields (`MailboxAddressesRequest`):
2136
+
2137
+ | Field | Type | Required | Description |
2138
+ |---|---|---|---|
2139
+ | `body.mailboxes` | `Array<string>` | yes | Mailbox addresses. An empty list returns an empty result. |
2140
+
2141
+ **Returns** `ApiResponse_InboxOpsListPayload_`: the envelope `{ data: InboxOpsListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2142
+
2143
+ Other envelope fields: `pagination` (PaginationMeta).
2144
+
2145
+ `InboxOpsListPayload` fields:
2146
+
2147
+ | Field | Type | Required | Description |
2148
+ |---|---|---|---|
2149
+ | `items` | `Array<unknown>` | no | |
2150
+
2151
+ **Example**
2152
+
2153
+ ```ts
2154
+ const result = await g8.api.aiInbox.listMailboxAssociatedSequences({ body: { mailboxes: ["example"] } });
2155
+ ```
2156
+
2157
+ ---
2158
+
2159
+ <a id="op-listmeetingtasks"></a>
2160
+
2161
+ ### `g8.api.aiInbox.listMeetingTasks(input)`
2162
+
2163
+ **List Meeting Tasks**
2164
+
2165
+ - HTTP: `GET /api/v1/inbox/meetings/{meeting_id}/tasks`
2166
+ - operationId: `list_meeting_tasks_inbox_meetings__meeting_id__tasks_get` (also callable as `g8.api.call("list_meeting_tasks_inbox_meetings__meeting_id__tasks_get", input)`)
2167
+ - Tier: `read`: reads data; safe to call and to retry
2168
+ - API-key scope: `meetings:read`
2169
+
2170
+ Follow-ups hung off this meeting, filtered by the caller's task
2171
+ visibility - team-only tasks do not cross team boundaries just because the
2172
+ caller can open the meeting.
2173
+
2174
+ **Input**
2175
+
2176
+ | Field | Type | Required | Description |
2177
+ |---|---|---|---|
2178
+ | `path.meeting_id` | `string` | yes | Meeting id, as returned by `GET /inbox/meetings`. |
2179
+
2180
+ **Returns** `ApiResponse_InboxOpsListPayload_`: the envelope `{ data: InboxOpsListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2181
+
2182
+ Other envelope fields: `pagination` (PaginationMeta).
2183
+
2184
+ `InboxOpsListPayload` fields:
2185
+
2186
+ | Field | Type | Required | Description |
2187
+ |---|---|---|---|
2188
+ | `items` | `Array<unknown>` | no | |
2189
+
2190
+ **Example**
2191
+
2192
+ ```ts
2193
+ const result = await g8.api.aiInbox.listMeetingTasks({ path: { meeting_id: "id" } });
2194
+ ```
2195
+
2196
+ ---
2197
+
2198
+ <a id="op-listmymeetingtasks"></a>
2199
+
2200
+ ### `g8.api.aiInbox.listMyMeetingTasks(input?)`
2201
+
2202
+ **List My Meeting Tasks**
2203
+
2204
+ - HTTP: `GET /api/v1/inbox/meetings/my-tasks`
2205
+ - operationId: `list_my_meeting_tasks_inbox_meetings_my_tasks_get` (also callable as `g8.api.call("list_my_meeting_tasks_inbox_meetings_my_tasks_get", input)`)
2206
+ - Tier: `read`: reads data; safe to call and to retry
2207
+ - API-key scope: `meetings:read`
2208
+
2209
+ Every meeting follow-up assigned to the caller, across all meetings.
2210
+
2211
+ Declared BEFORE nothing in this router, but registered BEFORE
2212
+ `meetings_router`: `GET /inbox/meetings/{meeting_id}` already ships, and
2213
+ the parameter route would otherwise match `my-tasks` and look it up as a
2214
+ meeting id.
2215
+
2216
+ Strictly meeting-derived tasks, not a general task list - see
2217
+ `GET /tasks` for that. Returns an empty list, not an error, when the
2218
+ caller has no team-member row in this organisation, which is what an
2219
+ org-scoped key will see.
2220
+
2221
+ **Input**: none.
2222
+
2223
+ **Returns** `ApiResponse_InboxOpsListPayload_`: the envelope `{ data: InboxOpsListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2224
+
2225
+ Other envelope fields: `pagination` (PaginationMeta).
2226
+
2227
+ `InboxOpsListPayload` fields:
2228
+
2229
+ | Field | Type | Required | Description |
2230
+ |---|---|---|---|
2231
+ | `items` | `Array<unknown>` | no | |
2232
+
2233
+ **Example**
2234
+
2235
+ ```ts
2236
+ const result = await g8.api.aiInbox.listMyMeetingTasks();
2237
+ ```
2238
+
2239
+ ---
2240
+
2241
+ <a id="op-markinboxemailread"></a>
2242
+
2243
+ ### `g8.api.aiInbox.markInboxEmailRead(input)`
2244
+
2245
+ **Mark Inbox Email Read**
2246
+
2247
+ - HTTP: `POST /api/v1/inbox/emails/{email_id}/mark-read`
2248
+ - operationId: `mark_inbox_email_read_inbox_emails__email_id__mark_read_post` (also callable as `g8.api.call("mark_inbox_email_read_inbox_emails__email_id__mark_read_post", input)`)
2249
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2250
+ - API-key scope: `inbox:write`
2251
+
2252
+ Mark an email thread read. Contacts nobody.
2253
+
2254
+ Best-effort syncs the read state up to the mail provider as well, so the customer's
2255
+ own mailbox agrees. Idempotent.
2256
+
2257
+ Gated on VISIBILITY of the owning mailbox: a personal mailbox is
2258
+ owner-only, so marking someone else's thread read is a 403 rather than a
2259
+ quiet mutation of their inbox.
2260
+
2261
+ **Input**
2262
+
2263
+ | Field | Type | Required | Description |
2264
+ |---|---|---|---|
2265
+ | `path.email_id` | `string` | yes | Email thread id. |
2266
+
2267
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2268
+
2269
+ Other envelope fields: `pagination` (PaginationMeta).
2270
+
2271
+ **Example**
2272
+
2273
+ ```ts
2274
+ const result = await g8.api.aiInbox.markInboxEmailRead({ path: { email_id: "jane@acme.com" } });
2275
+ ```
2276
+
2277
+ ---
2278
+
2279
+ <a id="op-markinboxlinkedinconversationread"></a>
2280
+
2281
+ ### `g8.api.aiInbox.markInboxLinkedinConversationRead(input)`
2282
+
2283
+ **Mark Inbox Linkedin Conversation Read**
2284
+
2285
+ - HTTP: `POST /api/v1/inbox/linkedin/accounts/{account_id}/conversations/{conversation_id}/read`
2286
+ - operationId: `mark_inbox_linkedin_conversation_read_inbox_linkedin_accounts__account_id__conversations__conversation_id__read_post` (also callable as `g8.api.call("mark_inbox_linkedin_conversation_read_inbox_linkedin_accounts__account_id__conversations__conversation_id__read_post", input)`)
2287
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2288
+ - API-key scope: `inbox:write`
2289
+
2290
+ Mark a LinkedIn conversation read. Contacts nobody.
2291
+
2292
+ Syncs seen-state to whichever provider serves this organisation. The
2293
+ handler resolves that STRICTLY on this path, so a credential-store failure
2294
+ surfaces as an error rather than quietly toggling read state on the wrong
2295
+ provider.
2296
+
2297
+ **Input**
2298
+
2299
+ | Field | Type | Required | Description |
2300
+ |---|---|---|---|
2301
+ | `path.account_id` | `integer` | yes | LinkedIn account id (integer). |
2302
+ | `path.conversation_id` | `string` | yes | LinkedIn conversation id. |
2303
+
2304
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2305
+
2306
+ Other envelope fields: `pagination` (PaginationMeta).
2307
+
2308
+ **Example**
2309
+
2310
+ ```ts
2311
+ const result = await g8.api.aiInbox.markInboxLinkedinConversationRead({ path: { account_id: 123, conversation_id: "id" } });
2312
+ ```
2313
+
2314
+ ---
2315
+
2316
+ <a id="op-markinboxlinkedinconversationunread"></a>
2317
+
2318
+ ### `g8.api.aiInbox.markInboxLinkedinConversationUnread(input)`
2319
+
2320
+ **Mark Inbox Linkedin Conversation Unread**
2321
+
2322
+ - HTTP: `POST /api/v1/inbox/linkedin/accounts/{account_id}/conversations/{conversation_id}/unread`
2323
+ - operationId: `mark_inbox_linkedin_conversation_unread_inbox_linkedin_accounts__account_id__conversations__conversation_id__unread_post` (also callable as `g8.api.call("mark_inbox_linkedin_conversation_unread_inbox_linkedin_accounts__account_id__conversations__conversation_id__unread_post", input)`)
2324
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2325
+ - API-key scope: `inbox:write`
2326
+
2327
+ Put a LinkedIn conversation back in the unread queue.
2328
+
2329
+ **Input**
2330
+
2331
+ | Field | Type | Required | Description |
2332
+ |---|---|---|---|
2333
+ | `path.account_id` | `integer` | yes | LinkedIn account id (integer). |
2334
+ | `path.conversation_id` | `string` | yes | LinkedIn conversation id. |
2335
+
2336
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2337
+
2338
+ Other envelope fields: `pagination` (PaginationMeta).
2339
+
2340
+ **Example**
2341
+
2342
+ ```ts
2343
+ const result = await g8.api.aiInbox.markInboxLinkedinConversationUnread({ path: { account_id: 123, conversation_id: "id" } });
2344
+ ```
2345
+
2346
+ ---
2347
+
2348
+ <a id="op-markinboxsmsread"></a>
2349
+
2350
+ ### `g8.api.aiInbox.markInboxSmsRead(input)`
2351
+
2352
+ **Mark Inbox Sms Read**
2353
+
2354
+ - HTTP: `POST /api/v1/inbox/sms/{thread_id}/mark-read`
2355
+ - operationId: `mark_inbox_sms_read_inbox_sms__thread_id__mark_read_post` (also callable as `g8.api.call("mark_inbox_sms_read_inbox_sms__thread_id__mark_read_post", input)`)
2356
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2357
+ - API-key scope: `inbox:write`
2358
+
2359
+ Mark an SMS thread read. Contacts nobody.
2360
+
2361
+ Answers 200 whether or not the thread exists - the underlying update
2362
+ matches zero rows silently - so do not read success as proof the id was
2363
+ real.
2364
+
2365
+ **Input**
2366
+
2367
+ | Field | Type | Required | Description |
2368
+ |---|---|---|---|
2369
+ | `path.thread_id` | `string` | yes | SMS thread id. |
2370
+
2371
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2372
+
2373
+ Other envelope fields: `pagination` (PaginationMeta).
2374
+
2375
+ **Example**
2376
+
2377
+ ```ts
2378
+ const result = await g8.api.aiInbox.markInboxSmsRead({ path: { thread_id: "id" } });
2379
+ ```
2380
+
2381
+ ---
2382
+
2383
+ <a id="op-markmeetingnotranscriptexpected"></a>
2384
+
2385
+ ### `g8.api.aiInbox.markMeetingNoTranscriptExpected(input)`
2386
+
2387
+ **Mark Meeting No Transcript Expected**
2388
+
2389
+ - HTTP: `POST /api/v1/inbox/meetings/{meeting_id}/no-transcript`
2390
+ - operationId: `mark_meeting_no_transcript_expected_inbox_meetings__meeting_id__no_transcript_post` (also callable as `g8.api.call("mark_meeting_no_transcript_expected_inbox_meetings__meeting_id__no_transcript_post", input)`)
2391
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2392
+ - API-key scope: `meetings:write`
2393
+
2394
+ Say that this meeting was never recorded, so stop waiting for one.
2395
+
2396
+ Distinguishes "nothing was captured" from "the recording has not arrived
2397
+ yet", which is what stops the meeting sitting in a pending state forever.
2398
+
2399
+ **Input**
2400
+
2401
+ | Field | Type | Required | Description |
2402
+ |---|---|---|---|
2403
+ | `path.meeting_id` | `string` | yes | Meeting id, as returned by `GET /inbox/meetings`. |
2404
+
2405
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2406
+
2407
+ Other envelope fields: `pagination` (PaginationMeta).
2408
+
2409
+ **Example**
2410
+
2411
+ ```ts
2412
+ const result = await g8.api.aiInbox.markMeetingNoTranscriptExpected({ path: { meeting_id: "id" } });
2413
+ ```
2414
+
2415
+ ---
2416
+
2417
+ <a id="op-removechanneltag"></a>
2418
+
2419
+ ### `g8.api.aiInbox.removeChannelTag(input)`
2420
+
2421
+ **Remove Channel Tag**
2422
+
2423
+ - HTTP: `DELETE /api/v1/inbox/channels/{channel_id}/tags`
2424
+ - operationId: `remove_channel_tag_inbox_channels__channel_id__tags_delete` (also callable as `g8.api.call("remove_channel_tag_inbox_channels__channel_id__tags_delete", input)`)
2425
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
2426
+ - API-key scope: `inbox:delete`
2427
+
2428
+ Take a tag off a conversation. The tag itself survives.
2429
+
2430
+ **Input**
2431
+
2432
+ | Field | Type | Required | Description |
2433
+ |---|---|---|---|
2434
+ | `path.channel_id` | `string` | yes | Conversation id. |
2435
+ | `query.tag_id` | `string` | yes | The tag to remove. |
2436
+ | `query.channel_type` | `"email" \| "chat" \| "phone" \| "sms" \| "heyreach" \| "meetings" \| "support" \| "all"` | yes | Which channel the conversation lives in. REQUIRED: the same id means different rows in different channels, so this is what identifies the conversation, not a filter. |
2437
+ | `query.linkedin_account_id` | `integer \| null` | no | LinkedIn account id. Required only for `heyreach`, where the id is account-scoped and ambiguous without it. |
2438
+
2439
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2440
+
2441
+ Other envelope fields: `pagination` (PaginationMeta).
2442
+
2443
+ **Example**
2444
+
2445
+ ```ts
2446
+ // destructive: deletes or archives data; confirm with a human before calling.
2447
+ const result = await g8.api.aiInbox.removeChannelTag({
2448
+ path: { channel_id: "id" },
2449
+ query: { tag_id: "id", channel_type: "email" },
2450
+ });
2451
+ ```
2452
+
2453
+ ---
2454
+
2455
+ <a id="op-revalidateinboxmailbox"></a>
2456
+
2457
+ ### `g8.api.aiInbox.revalidateInboxMailbox(input)`
2458
+
2459
+ **Revalidate Inbox Mailbox**
2460
+
2461
+ - HTTP: `POST /api/v1/inbox/mailboxes/{mailbox}/revalidate`
2462
+ - operationId: `revalidate_inbox_mailbox_inbox_mailboxes__mailbox__revalidate_post` (also callable as `g8.api.call("revalidate_inbox_mailbox_inbox_mailboxes__mailbox__revalidate_post", input)`)
2463
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2464
+ - API-key scope: `inbox:write`
2465
+
2466
+ Re-check this mailbox's credentials and folders, and store the answer.
2467
+
2468
+ Contacts no recipient. It connects to the provider to find out whether the
2469
+ stored credentials still work, then writes `is_supported`, the error
2470
+ message and the credential-error flag back onto the sync record - which is
2471
+ what makes a mailbox that silently stopped working visible.
2472
+
2473
+ **Input**
2474
+
2475
+ | Field | Type | Required | Description |
2476
+ |---|---|---|---|
2477
+ | `path.mailbox` | `string` | yes | The mailbox ADDRESS, e.g. `sales@acme.com`. Not a numeric id. |
2478
+
2479
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2480
+
2481
+ Other envelope fields: `pagination` (PaginationMeta).
2482
+
2483
+ **Example**
2484
+
2485
+ ```ts
2486
+ const result = await g8.api.aiInbox.revalidateInboxMailbox({ path: { mailbox: "example" } });
2487
+ ```
2488
+
2489
+ ---
2490
+
2491
+ <a id="op-searchinboxcallresults"></a>
2492
+
2493
+ ### `g8.api.aiInbox.searchInboxCallResults(input?)`
2494
+
2495
+ **Search Inbox Call Results**
2496
+
2497
+ - HTTP: `POST /api/v1/inbox/call-results/search`
2498
+ - operationId: `search_inbox_call_results_inbox_call_results_search_post` (also callable as `g8.api.call("search_inbox_call_results_inbox_call_results_search_post", input)`)
2499
+ - Tier: `read`: reads data; safe to call and to retry
2500
+ - API-key scope: `inbox:read`
2501
+
2502
+ Inbound call outcomes, filtered and paged. Reads only.
2503
+
2504
+ A POST because the filter set is a body; it gates on `inbox:read`.
2505
+ FAILED calls are excluded by the handler - this is the answered-call
2506
+ record, not a call log.
2507
+
2508
+ NOT `/voice/dialer/calls`, which reads the outbound dialer's own tables.
2509
+ Same-sounding feature, different rows.
2510
+
2511
+ **Input**
2512
+
2513
+ | Field | Type | Required | Description |
2514
+ |---|---|---|---|
2515
+ | `body` | `CallResultSearchRequest` | no | Request body; fields below. |
2516
+
2517
+ Body fields (`CallResultSearchRequest`):
2518
+
2519
+ | Field | Type | Required | Description |
2520
+ |---|---|---|---|
2521
+ | `body.assigned_to_user_email` | `string \| null` | no | |
2522
+ | `body.campaign_ids` | `Array<string> \| null` | no | |
2523
+ | `body.disposition` | `"booked" \| "positive" \| "neutral" \| "negative" \| "voicemail" \| null` | no | |
2524
+ | `body.page` | `integer` | no | default `1`, min 1 |
2525
+ | `body.page_size` | `integer` | no | default `20`, min 1, max 100 |
2526
+ | `body.sort_by` | `"updated_at" \| "created_at" \| "last_message_at"` | no | default `"updated_at"` |
2527
+ | `body.sort_order` | `"asc" \| "desc"` | no | default `"desc"` |
2528
+ | `body.tag_ids` | `Array<string> \| null` | no | |
2529
+ | `body.updated_after` | `string (date-time) \| null` | no | |
2530
+ | `body.updated_before` | `string (date-time) \| null` | no | |
2531
+
2532
+ **Returns** `ApiResponse_InboxOpsListPayload_`: the envelope `{ data: InboxOpsListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2533
+
2534
+ Other envelope fields: `pagination` (PaginationMeta).
2535
+
2536
+ `InboxOpsListPayload` fields:
2537
+
2538
+ | Field | Type | Required | Description |
2539
+ |---|---|---|---|
2540
+ | `items` | `Array<unknown>` | no | |
2541
+
2542
+ **Example**
2543
+
2544
+ ```ts
2545
+ const result = await g8.api.aiInbox.searchInboxCallResults();
2546
+ ```
2547
+
2548
+ ---
2549
+
2550
+ <a id="op-searchinboxlinkedinconversations"></a>
2551
+
2552
+ ### `g8.api.aiInbox.searchInboxLinkedinConversations(input?)`
2553
+
2554
+ **Search Inbox Linkedin Conversations**
2555
+
2556
+ - HTTP: `POST /api/v1/inbox/linkedin/conversations/search`
2557
+ - operationId: `search_inbox_linkedin_conversations_inbox_linkedin_conversations_search_post` (also callable as `g8.api.call("search_inbox_linkedin_conversations_inbox_linkedin_conversations_search_post", input)`)
2558
+ - Tier: `read`: reads data; safe to call and to retry
2559
+ - API-key scope: `inbox:read`
2560
+
2561
+ Search LinkedIn conversations across accounts.
2562
+
2563
+ A POST because the filter is a body, not because it writes anything - it
2564
+ gates on `inbox:read`, matching `POST /inbox/chats/search` beside it.
2565
+
2566
+ `seen: false` is the unread view. `sequence_ids` are graph8 sequence ids;
2567
+ the handler maps them onto the provider's own campaign ids for you.
2568
+
2569
+ **Input**
2570
+
2571
+ | Field | Type | Required | Description |
2572
+ |---|---|---|---|
2573
+ | `body` | `LinkedInConversationSearchRequest` | no | Request body; fields below. |
2574
+
2575
+ Body fields (`LinkedInConversationSearchRequest`):
2576
+
2577
+ | Field | Type | Required | Description |
2578
+ |---|---|---|---|
2579
+ | `body.limit` | `integer` | no | default `25`, min 1, max 100 |
2580
+ | `body.linkedin_account_ids` | `Array<integer> \| null` | no | |
2581
+ | `body.offset` | `integer` | no | default `0`, min 0 |
2582
+ | `body.search` | `string \| null` | no | |
2583
+ | `body.seen` | `boolean \| null` | no | False returns only unread conversations. |
2584
+ | `body.sequence_ids` | `Array<string> \| null` | no | |
2585
+ | `body.sort_order` | `"asc" \| "desc"` | no | default `"desc"` |
2586
+ | `body.tags` | `Array<string> \| null` | no | |
2587
+ | `body.updated_after` | `string (date-time) \| null` | no | |
2588
+ | `body.updated_before` | `string (date-time) \| null` | no | |
2589
+
2590
+ **Returns** `ApiResponse_InboxOpsListPayload_`: the envelope `{ data: InboxOpsListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2591
+
2592
+ Other envelope fields: `pagination` (PaginationMeta).
2593
+
2594
+ `InboxOpsListPayload` fields:
2595
+
2596
+ | Field | Type | Required | Description |
2597
+ |---|---|---|---|
2598
+ | `items` | `Array<unknown>` | no | |
2599
+
2600
+ **Example**
2601
+
2602
+ ```ts
2603
+ const result = await g8.api.aiInbox.searchInboxLinkedinConversations();
2604
+ ```
2605
+
2606
+ ---
2607
+
2608
+ <a id="op-setchannelaipause"></a>
2609
+
2610
+ ### `g8.api.aiInbox.setChannelAiPause(input)`
2611
+
2612
+ **Set Channel Ai Pause**
2613
+
2614
+ - HTTP: `POST /api/v1/inbox/channels/{channel_id}/ai-pause`
2615
+ - operationId: `set_channel_ai_pause_inbox_channels__channel_id__ai_pause_post` (also callable as `g8.api.call("set_channel_ai_pause_inbox_channels__channel_id__ai_pause_post", input)`)
2616
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2617
+ - API-key scope: `inbox:write`
2618
+
2619
+ Stop the AI answering THIS conversation, or let it resume.
2620
+
2621
+ Scoped to the one thread: pausing here does not disable the responder
2622
+ anywhere else. This is the handover switch - pause it when a human takes
2623
+ over, so the customer does not get two replies.
2624
+
2625
+ `paused` is explicit rather than a toggle, so a retried request is
2626
+ idempotent instead of flipping the state back.
2627
+
2628
+ **Input**
2629
+
2630
+ | Field | Type | Required | Description |
2631
+ |---|---|---|---|
2632
+ | `path.channel_id` | `string` | yes | Conversation id. |
2633
+ | `query.channel_type` | `"email" \| "chat" \| "phone" \| "sms" \| "heyreach" \| "meetings" \| "support" \| "all"` | yes | Which channel the conversation lives in. REQUIRED: the same id means different rows in different channels, so this is what identifies the conversation, not a filter. |
2634
+ | `body` | `AiPauseRequest` | yes | Request body; fields below. |
2635
+
2636
+ Body fields (`AiPauseRequest`):
2637
+
2638
+ | Field | Type | Required | Description |
2639
+ |---|---|---|---|
2640
+ | `body.paused` | `boolean` | yes | True stops the AI answering this thread; false lets it resume. |
2641
+
2642
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2643
+
2644
+ Other envelope fields: `pagination` (PaginationMeta).
2645
+
2646
+ **Example**
2647
+
2648
+ ```ts
2649
+ const result = await g8.api.aiInbox.setChannelAiPause({
2650
+ path: { channel_id: "id" },
2651
+ query: { channel_type: "email" },
2652
+ body: { paused: true },
2653
+ });
2654
+ ```
2655
+
2656
+ ---
2657
+
2658
+ <a id="op-setinboxemailsequence"></a>
2659
+
2660
+ ### `g8.api.aiInbox.setInboxEmailSequence(input)`
2661
+
2662
+ **Set Inbox Email Sequence**
2663
+
2664
+ - HTTP: `POST /api/v1/inbox/emails/{email_id}/sequence`
2665
+ - operationId: `set_inbox_email_sequence_inbox_emails__email_id__sequence_post` (also callable as `g8.api.call("set_inbox_email_sequence_inbox_emails__email_id__sequence_post", input)`)
2666
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2667
+ - API-key scope: `inbox:write`
2668
+
2669
+ Attribute a thread to a sequence, WITHOUT touching the sequencer.
2670
+
2671
+ The quiet twin of `link-sequence`: it re-labels the thread for reporting
2672
+ and does not tell the sequencer anything, so the contact keeps receiving
2673
+ the remaining steps. Use `link-sequence` when someone replied.
2674
+
2675
+ Accepts any id - unlike `link-sequence` there is no candidate check - so
2676
+ a wrong value mislabels the thread silently. Gated on visibility of the
2677
+ owning mailbox.
2678
+
2679
+ **Input**
2680
+
2681
+ | Field | Type | Required | Description |
2682
+ |---|---|---|---|
2683
+ | `path.email_id` | `string` | yes | Email thread id. |
2684
+ | `query.sequence_id` | `string` | yes | Sequence (campaign) id to attribute the thread to. |
2685
+ | `query.sequence_name` | `string` | yes | Display name stored alongside the id. |
2686
+
2687
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2688
+
2689
+ Other envelope fields: `pagination` (PaginationMeta).
2690
+
2691
+ **Example**
2692
+
2693
+ ```ts
2694
+ const result = await g8.api.aiInbox.setInboxEmailSequence({
2695
+ path: { email_id: "jane@acme.com" },
2696
+ query: { sequence_id: "id", sequence_name: "Example" },
2697
+ });
2698
+ ```
2699
+
2700
+ ---
2701
+
2702
+ <a id="op-setinboxemailsettings"></a>
2703
+
2704
+ ### `g8.api.aiInbox.setInboxEmailSettings(input)`
2705
+
2706
+ **Set Inbox Email Settings**
2707
+
2708
+ - HTTP: `PUT /api/v1/inbox/email-settings`
2709
+ - operationId: `set_inbox_email_settings_inbox_email_settings_put` (also callable as `g8.api.call("set_inbox_email_settings_inbox_email_settings_put", input)`)
2710
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2711
+ - API-key scope: `inbox:write`
2712
+
2713
+ Create or replace the organisation's AI Inbox email settings.
2714
+
2715
+ A PUT because it REPLACES: the app writes every field, so anything you
2716
+ omit is written as its default rather than left alone. Read the current
2717
+ settings, change the one field, send the whole thing back.
2718
+
2719
+ `business_hours_only` plus the start/end hours are what stop the AI
2720
+ replying to a customer at 3am. `event_id` is the booking event it offers
2721
+ when it schedules a meeting.
2722
+
2723
+ **Input**
2724
+
2725
+ | Field | Type | Required | Description |
2726
+ |---|---|---|---|
2727
+ | `body` | `EmailSettingsRequest` | yes | Request body; fields below. |
2728
+
2729
+ Body fields (`EmailSettingsRequest`):
2730
+
2731
+ | Field | Type | Required | Description |
2732
+ |---|---|---|---|
2733
+ | `body.timezone` | `string` | yes | IANA timezone name, e.g. `America/New_York`. Required. |
2734
+ | `body.agent_id` | `string \| integer \| null \| null` | no | AI Inbox agent that answers. See `POST /inbox/agents`. |
2735
+ | `body.auto_tagging` | `boolean` | no | default `false` |
2736
+ | `body.business_hours_end` | `integer` | no | default `17` |
2737
+ | `body.business_hours_only` | `boolean` | no | Restrict AI replies to the hours below. default `false` |
2738
+ | `body.business_hours_start` | `integer` | no | default `9` |
2739
+ | `body.event_id` | `integer \| null` | no | Booking event the AI offers when it schedules a meeting. |
2740
+ | `body.refresh_rate` | `integer` | no | Minutes between sync rounds. default `1` |
2741
+
2742
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2743
+
2744
+ Other envelope fields: `pagination` (PaginationMeta).
2745
+
2746
+ **Example**
2747
+
2748
+ ```ts
2749
+ const result = await g8.api.aiInbox.setInboxEmailSettings({ body: { timezone: "example" } });
2750
+ ```
2751
+
2752
+ ---
2753
+
2754
+ <a id="op-setinboxmailboxvisibility"></a>
2755
+
2756
+ ### `g8.api.aiInbox.setInboxMailboxVisibility(input)`
2757
+
2758
+ **Set Inbox Mailbox Visibility**
2759
+
2760
+ - HTTP: `PATCH /api/v1/inbox/mailboxes/{mailbox}/visibility`
2761
+ - operationId: `set_inbox_mailbox_visibility_inbox_mailboxes__mailbox__visibility_patch` (also callable as `g8.api.call("set_inbox_mailbox_visibility_inbox_mailboxes__mailbox__visibility_patch", input)`)
2762
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2763
+ - API-key scope: `inbox:write`
2764
+
2765
+ Share a mailbox with the team, or make it personal again.
2766
+
2767
+ THIS CHANGES WHO CAN READ THE THREADS IN IT. Sharing exposes the
2768
+ conversation history of that mailbox to every team member; un-sharing
2769
+ hides it again, but not retroactively.
2770
+
2771
+ ONLY THE OWNER may change it - the person the mailbox was created by.
2772
+ An API key acts as its minting human, so a key held by anyone else gets a
2773
+ 403, and an org-scoped key (which owns nothing) always does.
2774
+
2775
+ **Input**
2776
+
2777
+ | Field | Type | Required | Description |
2778
+ |---|---|---|---|
2779
+ | `path.mailbox` | `string` | yes | The mailbox ADDRESS, e.g. `sales@acme.com`. Not a numeric id. |
2780
+ | `query.shared_with_team` | `boolean` | yes | True makes the mailbox and its threads visible to the whole team. False makes it personal to its owner. |
2781
+
2782
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2783
+
2784
+ Other envelope fields: `pagination` (PaginationMeta).
2785
+
2786
+ **Example**
2787
+
2788
+ ```ts
2789
+ const result = await g8.api.aiInbox.setInboxMailboxVisibility({ path: { mailbox: "example" }, query: { shared_with_team: true } });
2790
+ ```
2791
+
2792
+ ---
2793
+
2794
+ <a id="op-setmeetingsensitivity"></a>
2795
+
2796
+ ### `g8.api.aiInbox.setMeetingSensitivity(input)`
2797
+
2798
+ **Set Meeting Sensitivity**
2799
+
2800
+ - HTTP: `PATCH /api/v1/inbox/meetings/{meeting_id}/sensitivity`
2801
+ - operationId: `set_meeting_sensitivity_inbox_meetings__meeting_id__sensitivity_patch` (also callable as `g8.api.call("set_meeting_sensitivity_inbox_meetings__meeting_id__sensitivity_patch", input)`)
2802
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
2803
+ - API-key scope: `meetings:delete`
2804
+
2805
+ CHANGE WHO MAY READ THE RECORDING OF THIS MEETING.
2806
+
2807
+ `private` HIDES the transcript from everyone except the meeting's
2808
+ participants. `normal` EXPOSES it to the organisation again - and a
2809
+ transcript that has been read cannot be un-read, so going back to `normal`
2810
+ is not a reversible edit in any sense that matters.
2811
+
2812
+ Only a PARTICIPANT may change it; anyone else gets a 403. Classified
2813
+ `destructive`, so it needs `inbox:delete` rather than riding along with
2814
+ `inbox:write` - a key that triages the inbox should not also be able to
2815
+ publish a private recording.
2816
+
2817
+ `sensitivity` is REQUIRED here. The app defaults a missing key to
2818
+ `normal`, which is the exposing direction, so this contract refuses to
2819
+ guess.
2820
+
2821
+ **Input**
2822
+
2823
+ | Field | Type | Required | Description |
2824
+ |---|---|---|---|
2825
+ | `path.meeting_id` | `string` | yes | Meeting id, as returned by `GET /inbox/meetings`. |
2826
+ | `body` | `MeetingSensitivityRequest` | yes | Request body; fields below. |
2827
+
2828
+ Body fields (`MeetingSensitivityRequest`):
2829
+
2830
+ | Field | Type | Required | Description |
2831
+ |---|---|---|---|
2832
+ | `body.sensitivity` | `"normal" \| "private"` | yes | `private` = participants only. `normal` = visible to the organisation. Required - there is no safe default. |
2833
+
2834
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2835
+
2836
+ Other envelope fields: `pagination` (PaginationMeta).
2837
+
2838
+ **Example**
2839
+
2840
+ ```ts
2841
+ // destructive: deletes or archives data; confirm with a human before calling.
2842
+ const result = await g8.api.aiInbox.setMeetingSensitivity({ path: { meeting_id: "id" }, body: { sensitivity: "normal" } });
2843
+ ```
2844
+
2845
+ ---
2846
+
2847
+ <a id="op-startinboxmailboxsync"></a>
2848
+
2849
+ ### `g8.api.aiInbox.startInboxMailboxSync(input)`
2850
+
2851
+ **Start Inbox Mailbox Sync**
2852
+
2853
+ - HTTP: `POST /api/v1/inbox/mailboxes/{mailbox}/sync`
2854
+ - operationId: `start_inbox_mailbox_sync_inbox_mailboxes__mailbox__sync_post` (also callable as `g8.api.call("start_inbox_mailbox_sync_inbox_mailboxes__mailbox__sync_post", input)`)
2855
+ - Tier: `external`: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first
2856
+ - API-key scope: `inbox:run`
2857
+
2858
+ START POLLING this mailbox.
2859
+
2860
+ REACHES OUTSIDE GRAPH8: from here on the platform connects to the
2861
+ customer's Google or IMAP server with their stored credentials, on a
2862
+ schedule, until it is stopped. Classified `external`, so it needs
2863
+ `inbox:run` rather than plain write.
2864
+
2865
+ It contacts no recipient - nothing is SENT by turning sync on. What it
2866
+ can lead to is the AI answering on this mailbox, which is governed
2867
+ separately by `auto_respond`.
2868
+
2869
+ Refuses with 400 if the mailbox is already running, so a retry is safe
2870
+ rather than doubling the polling.
2871
+
2872
+ 202 because the first sync round happens on the org-level worker's next
2873
+ pass, not inside this request.
2874
+
2875
+ **Input**
2876
+
2877
+ | Field | Type | Required | Description |
2878
+ |---|---|---|---|
2879
+ | `path.mailbox` | `string` | yes | The mailbox ADDRESS, e.g. `sales@acme.com`. Not a numeric id. |
2880
+ | `query.provider` | `"google_mailbox" \| "smtp"` | yes | How the mailbox is connected. REQUIRED and not inferred: the same address can be connected either way, and guessing would act on the wrong transport. Closed to a Literal so an unknown value is a 422 naming both, rather than a `ValueError` raised inside the handler. |
2881
+ | `query.display_name` | `string \| null` | no | Label shown beside the address. |
2882
+
2883
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2884
+
2885
+ Other envelope fields: `pagination` (PaginationMeta).
2886
+
2887
+ **Example**
2888
+
2889
+ ```ts
2890
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
2891
+ const result = await g8.api.aiInbox.startInboxMailboxSync({
2892
+ path: { mailbox: "example" },
2893
+ query: { provider: "google_mailbox" },
2894
+ });
2895
+ ```
2896
+
2897
+ ---
2898
+
2899
+ <a id="op-stopinboxmailboxsync"></a>
2900
+
2901
+ ### `g8.api.aiInbox.stopInboxMailboxSync(input)`
2902
+
2903
+ **Stop Inbox Mailbox Sync**
2904
+
2905
+ - HTTP: `DELETE /api/v1/inbox/mailboxes/{mailbox}/sync`
2906
+ - operationId: `stop_inbox_mailbox_sync_inbox_mailboxes__mailbox__sync_delete` (also callable as `g8.api.call("stop_inbox_mailbox_sync_inbox_mailboxes__mailbox__sync_delete", input)`)
2907
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
2908
+ - API-key scope: `inbox:delete`
2909
+
2910
+ STOP polling this mailbox.
2911
+
2912
+ Stops the sync, not the mailbox: the threads already pulled in stay, and
2913
+ the mailbox record itself is untouched. 404 if this mailbox was never
2914
+ connected to the inbox.
2915
+
2916
+ **Input**
2917
+
2918
+ | Field | Type | Required | Description |
2919
+ |---|---|---|---|
2920
+ | `path.mailbox` | `string` | yes | The mailbox ADDRESS, e.g. `sales@acme.com`. Not a numeric id. |
2921
+ | `query.provider` | `"google_mailbox" \| "smtp"` | yes | How the mailbox is connected. REQUIRED and not inferred: the same address can be connected either way, and guessing would act on the wrong transport. Closed to a Literal so an unknown value is a 422 naming both, rather than a `ValueError` raised inside the handler. |
2922
+
2923
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2924
+
2925
+ Other envelope fields: `pagination` (PaginationMeta).
2926
+
2927
+ **Example**
2928
+
2929
+ ```ts
2930
+ // destructive: deletes or archives data; confirm with a human before calling.
2931
+ const result = await g8.api.aiInbox.stopInboxMailboxSync({
2932
+ path: { mailbox: "example" },
2933
+ query: { provider: "google_mailbox" },
2934
+ });
2935
+ ```
2936
+
2937
+ ---
2938
+
2939
+ <a id="op-syncinboxlinkedinaccounts"></a>
2940
+
2941
+ ### `g8.api.aiInbox.syncInboxLinkedinAccounts(input?)`
2942
+
2943
+ **Sync Inbox Linkedin Accounts**
2944
+
2945
+ - HTTP: `POST /api/v1/inbox/linkedin/accounts/sync`
2946
+ - operationId: `sync_inbox_linkedin_accounts_inbox_linkedin_accounts_sync_post` (also callable as `g8.api.call("sync_inbox_linkedin_accounts_inbox_linkedin_accounts_sync_post", input)`)
2947
+ - Tier: `external`: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first
2948
+ - API-key scope: `inbox:run`
2949
+
2950
+ Refresh the organisation's LinkedIn accounts from the provider.
2951
+
2952
+ Creates a local configuration record for every account the provider
2953
+ reports that graph8 has not seen, and refreshes the cached profile of the
2954
+ rest. Existing configuration (enabled, auto-respond) is not changed.
2955
+ Returns the counts. Sends nothing.
2956
+
2957
+ **Input**: none.
2958
+
2959
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2960
+
2961
+ Other envelope fields: `pagination` (PaginationMeta).
2962
+
2963
+ **Example**
2964
+
2965
+ ```ts
2966
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
2967
+ const result = await g8.api.aiInbox.syncInboxLinkedinAccounts();
2968
+ ```
2969
+
2970
+ ---
2971
+
2972
+ <a id="op-toggleinboxmailboxes"></a>
2973
+
2974
+ ### `g8.api.aiInbox.toggleInboxMailboxes(input)`
2975
+
2976
+ **Toggle Inbox Mailboxes**
2977
+
2978
+ - HTTP: `PATCH /api/v1/inbox/mailboxes/bulk`
2979
+ - operationId: `toggle_inbox_mailboxes_inbox_mailboxes_bulk_patch` (also callable as `g8.api.call("toggle_inbox_mailboxes_inbox_mailboxes_bulk_patch", input)`)
2980
+ - Tier: `external`: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first
2981
+ - API-key scope: `inbox:run`
2982
+
2983
+ Flip several mailboxes on or off by address, and optionally set
2984
+ auto-respond on all of them in the same call.
2985
+
2986
+ PARTIALLY TOLERANT where activate is not: this one reports failures in the
2987
+ body and still returns 200. Check `total_failed`.
2988
+
2989
+ `activate` is explicit rather than a toggle, so a retried request is
2990
+ idempotent instead of putting the mailboxes back the way they were.
2991
+
2992
+ **Input**
2993
+
2994
+ | Field | Type | Required | Description |
2995
+ |---|---|---|---|
2996
+ | `body` | `MailboxToggleRequest` | yes | Request body; fields below. |
2997
+
2998
+ Body fields (`MailboxToggleRequest`):
2999
+
3000
+ | Field | Type | Required | Description |
3001
+ |---|---|---|---|
3002
+ | `body.activate` | `boolean` | yes | True starts syncing, false stops it. |
3003
+ | `body.mailboxes` | `Array<string>` | yes | Mailbox addresses. min items 1 |
3004
+ | `body.auto_respond` | `boolean \| null` | no | |
3005
+
3006
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3007
+
3008
+ Other envelope fields: `pagination` (PaginationMeta).
3009
+
3010
+ **Example**
3011
+
3012
+ ```ts
3013
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
3014
+ const result = await g8.api.aiInbox.toggleInboxMailboxes({ body: { activate: true, mailboxes: ["example"] } });
3015
+ ```
3016
+
3017
+ ---
3018
+
3019
+ <a id="op-unassignchannel"></a>
3020
+
3021
+ ### `g8.api.aiInbox.unassignChannel(input)`
3022
+
3023
+ **Unassign Channel**
3024
+
3025
+ - HTTP: `DELETE /api/v1/inbox/channels/{channel_id}/assign`
3026
+ - operationId: `unassign_channel_inbox_channels__channel_id__assign_delete` (also callable as `g8.api.call("unassign_channel_inbox_channels__channel_id__assign_delete", input)`)
3027
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
3028
+ - API-key scope: `inbox:delete`
3029
+
3030
+ Take ONE person off a conversation. The others keep it.
3031
+
3032
+ **Input**
3033
+
3034
+ | Field | Type | Required | Description |
3035
+ |---|---|---|---|
3036
+ | `path.channel_id` | `string` | yes | Conversation id. |
3037
+ | `query.assignee_email` | `string` | yes | The person to take off. |
3038
+ | `query.channel_type` | `"email" \| "chat" \| "phone" \| "sms" \| "heyreach" \| "meetings" \| "support" \| "all"` | yes | Which channel the conversation lives in. REQUIRED: the same id means different rows in different channels, so this is what identifies the conversation, not a filter. |
3039
+ | `query.linkedin_account_id` | `integer \| null` | no | LinkedIn account id. Required only for `heyreach`, where the id is account-scoped and ambiguous without it. |
3040
+
3041
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3042
+
3043
+ Other envelope fields: `pagination` (PaginationMeta).
3044
+
3045
+ **Example**
3046
+
3047
+ ```ts
3048
+ // destructive: deletes or archives data; confirm with a human before calling.
3049
+ const result = await g8.api.aiInbox.unassignChannel({
3050
+ path: { channel_id: "id" },
3051
+ query: { assignee_email: "jane@acme.com", channel_type: "email" },
3052
+ });
3053
+ ```
3054
+
3055
+ ---
3056
+
3057
+ <a id="op-unblockinboxsender"></a>
3058
+
3059
+ ### `g8.api.aiInbox.unblockInboxSender(input)`
3060
+
3061
+ **Unblock Inbox Sender**
3062
+
3063
+ - HTTP: `DELETE /api/v1/inbox/blocked-senders/{blocked_sender_id}`
3064
+ - operationId: `unblock_inbox_sender_inbox_blocked_senders__blocked_sender_id__delete` (also callable as `g8.api.call("unblock_inbox_sender_inbox_blocked_senders__blocked_sender_id__delete", input)`)
3065
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
3066
+ - API-key scope: `inbox:delete`
3067
+
3068
+ Let a sender through again. Mail already refused is not recovered.
3069
+
3070
+ **Input**
3071
+
3072
+ | Field | Type | Required | Description |
3073
+ |---|---|---|---|
3074
+ | `path.blocked_sender_id` | `string` | yes | Id of the block record, from `GET /inbox/blocked-senders`. |
3075
+
3076
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3077
+
3078
+ Other envelope fields: `pagination` (PaginationMeta).
3079
+
3080
+ **Example**
3081
+
3082
+ ```ts
3083
+ // destructive: deletes or archives data; confirm with a human before calling.
3084
+ const result = await g8.api.aiInbox.unblockInboxSender({ path: { blocked_sender_id: "id" } });
3085
+ ```
3086
+
3087
+ ---
3088
+
3089
+ <a id="op-updateinboxlinkedinaccount"></a>
3090
+
3091
+ ### `g8.api.aiInbox.updateInboxLinkedinAccount(input)`
3092
+
3093
+ **Update Inbox Linkedin Account**
3094
+
3095
+ - HTTP: `PUT /api/v1/inbox/linkedin/accounts/{account_id}`
3096
+ - operationId: `update_inbox_linkedin_account_inbox_linkedin_accounts__account_id__put` (also callable as `g8.api.call("update_inbox_linkedin_account_inbox_linkedin_accounts__account_id__put", input)`)
3097
+ - Tier: `external`: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first
3098
+ - API-key scope: `inbox:run`
3099
+
3100
+ Configure one LinkedIn account's place in the inbox.
3101
+
3102
+ PARTIAL: only the fields you send are written, so omitting
3103
+ `auto_respond_config` leaves the existing one alone.
3104
+
3105
+ READ THIS BEFORE TURNING ANYTHING ON. `auto_respond: true` with
3106
+ `auto_respond_config.require_human_review: false` is the combination that
3107
+ lets the AI message real people on this account unattended - no draft, no
3108
+ approval. `require_human_review` defaults to TRUE and this route does not
3109
+ change that; it only stops applying if you send a config that says
3110
+ otherwise.
3111
+
3112
+ **Input**
3113
+
3114
+ | Field | Type | Required | Description |
3115
+ |---|---|---|---|
3116
+ | `path.account_id` | `integer` | yes | LinkedIn account id (integer). |
3117
+ | `body` | `LinkedInAccountConfigRequest` | yes | Request body; fields below. |
3118
+
3119
+ Body fields (`LinkedInAccountConfigRequest`):
3120
+
3121
+ | Field | Type | Required | Description |
3122
+ |---|---|---|---|
3123
+ | `body.ai_inbox_enabled` | `boolean \| null` | no | Whether the account's conversations appear in the inbox at all. |
3124
+ | `body.auto_respond` | `boolean \| null` | no | |
3125
+ | `body.auto_respond_config` | `LinkedInAutoRespondConfig \| null` | no | |
3126
+ | `body.linkedin_campaign_id` | `integer \| null` | no | Provider-side campaign id to attribute conversations to. |
3127
+ | `body.sequence_id` | `string \| null` | no | |
3128
+
3129
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3130
+
3131
+ Other envelope fields: `pagination` (PaginationMeta).
3132
+
3133
+ **Example**
3134
+
3135
+ ```ts
3136
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
3137
+ const result = await g8.api.aiInbox.updateInboxLinkedinAccount({ path: { account_id: 123 }, body: {} });
3138
+ ```
3139
+
3140
+ ---
3141
+
3142
+ <a id="op-updateinboxmailboxsettings"></a>
3143
+
3144
+ ### `g8.api.aiInbox.updateInboxMailboxSettings(input)`
3145
+
3146
+ **Update Inbox Mailbox Settings**
3147
+
3148
+ - HTTP: `PATCH /api/v1/inbox/mailboxes/{mailbox}/settings`
3149
+ - operationId: `update_inbox_mailbox_settings_inbox_mailboxes__mailbox__settings_patch` (also callable as `g8.api.call("update_inbox_mailbox_settings_inbox_mailboxes__mailbox__settings_patch", input)`)
3150
+ - Tier: `external`: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first
3151
+ - API-key scope: `inbox:run`
3152
+
3153
+ Change one mailbox's inbox settings. PARTIAL: omitted fields are left alone.
3154
+
3155
+ `auto_respond: true` LETS THE AI ANSWER REAL PEOPLE from this mailbox,
3156
+ unattended, so the operation is classified `external` (`inbox:run`) - the
3157
+ same call already made for the LinkedIn account configuration. 404 if the
3158
+ mailbox was never connected to the inbox.
3159
+
3160
+ **Input**
3161
+
3162
+ | Field | Type | Required | Description |
3163
+ |---|---|---|---|
3164
+ | `path.mailbox` | `string` | yes | The mailbox ADDRESS, e.g. `sales@acme.com`. Not a numeric id. |
3165
+ | `query.provider` | `"google_mailbox" \| "smtp"` | yes | How the mailbox is connected. REQUIRED and not inferred: the same address can be connected either way, and guessing would act on the wrong transport. Closed to a Literal so an unknown value is a 422 naming both, rather than a `ValueError` raised inside the handler. |
3166
+ | `body` | `MailboxSettingsRequest` | yes | Request body; fields below. |
3167
+
3168
+ Body fields (`MailboxSettingsRequest`):
3169
+
3170
+ | Field | Type | Required | Description |
3171
+ |---|---|---|---|
3172
+ | `body.auto_respond` | `boolean \| null` | no | True lets the AI answer inbound mail on this mailbox. It will message real people. |
3173
+ | `body.last_unread_limit` | `integer \| null` | no | How many unread emails a sync round fetches. min 1, max 100 |
3174
+
3175
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3176
+
3177
+ Other envelope fields: `pagination` (PaginationMeta).
3178
+
3179
+ **Example**
3180
+
3181
+ ```ts
3182
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
3183
+ const result = await g8.api.aiInbox.updateInboxMailboxSettings({
3184
+ path: { mailbox: "example" },
3185
+ query: { provider: "google_mailbox" },
3186
+ body: {},
3187
+ });
3188
+ ```
3189
+
3190
+ ---
3191
+
3192
+ <a id="op-updateinboxtag"></a>
3193
+
3194
+ ### `g8.api.aiInbox.updateInboxTag(input)`
3195
+
3196
+ **Update Inbox Tag**
3197
+
3198
+ - HTTP: `PUT /api/v1/inbox/tags/{tag_id}`
3199
+ - operationId: `update_inbox_tag_inbox_tags__tag_id__put` (also callable as `g8.api.call("update_inbox_tag_inbox_tags__tag_id__put", input)`)
3200
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
3201
+ - API-key scope: `inbox:write`
3202
+
3203
+ Edit an inbox tag.
3204
+
3205
+ `/inbox/tags/...`, not `/tags/...`: `/contacts/tags` is a DIFFERENT
3206
+ vocabulary (contact tags on a CRM record) and these are conversation
3207
+ labels. The published READ of these same objects ships as
3208
+ `GET /workflows/inbox-tags`, because the workflow builder needed it first.
3209
+
3210
+ `ai_can_apply` and `rules` are what let the auto-tagger reach for this tag
3211
+ on its own, so changing them changes what the AI does to threads nobody
3212
+ looked at.
3213
+
3214
+ **Input**
3215
+
3216
+ | Field | Type | Required | Description |
3217
+ |---|---|---|---|
3218
+ | `path.tag_id` | `string` | yes | Tag id, from `GET /workflows/inbox-tags`. |
3219
+ | `body` | `TagUpdateRequest` | yes | Request body; fields below. |
3220
+
3221
+ Body fields (`TagUpdateRequest`):
3222
+
3223
+ | Field | Type | Required | Description |
3224
+ |---|---|---|---|
3225
+ | `body.agent_id` | `string \| null` | no | |
3226
+ | `body.ai_can_apply` | `boolean \| null` | no | Whether the AI may apply this tag on its own. |
3227
+ | `body.color` | `string \| null` | no | |
3228
+ | `body.description` | `string \| null` | no | |
3229
+ | `body.name` | `string \| null` | no | |
3230
+ | `body.priority` | `integer \| null` | no | 1-100. min 1, max 100 |
3231
+ | `body.rules` | `Array<string> \| null` | no | Natural-language rules the AI uses to decide the tag applies. |
3232
+
3233
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3234
+
3235
+ Other envelope fields: `pagination` (PaginationMeta).
3236
+
3237
+ **Example**
3238
+
3239
+ ```ts
3240
+ const result = await g8.api.aiInbox.updateInboxTag({ path: { tag_id: "id" }, body: {} });
3241
+ ```
3242
+
3243
+ ---
3244
+
3245
+ <a id="op-updatemeetingtask"></a>
3246
+
3247
+ ### `g8.api.aiInbox.updateMeetingTask(input)`
3248
+
3249
+ **Update Meeting Task**
3250
+
3251
+ - HTTP: `PATCH /api/v1/inbox/meetings/tasks/{task_id}`
3252
+ - operationId: `update_meeting_task_inbox_meetings_tasks__task_id__patch` (also callable as `g8.api.call("update_meeting_task_inbox_meetings_tasks__task_id__patch", input)`)
3253
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
3254
+ - API-key scope: `meetings:write`
3255
+
3256
+ Patch a meeting task. Reassignment re-checks participant scope.
3257
+
3258
+ THREE-STATE nullable fields: omit `assignee_user_id` or
3259
+ `due_date` to leave it alone, send it as `null` to CLEAR it. The proxy
3260
+ forwards with `exclude_unset=True` precisely so the app can still tell
3261
+ those apart - dumping every field would turn each PATCH into a full
3262
+ overwrite that cleared whatever the caller did not mention.
3263
+
3264
+ Pass `expected_updated_at` to refuse the write if someone else moved the
3265
+ task since you read it.
3266
+
3267
+ **Input**
3268
+
3269
+ | Field | Type | Required | Description |
3270
+ |---|---|---|---|
3271
+ | `path.task_id` | `string` | yes | Meeting task id. |
3272
+ | `body` | `MeetingTaskUpdateRequest` | yes | Request body; fields below. |
3273
+
3274
+ Body fields (`MeetingTaskUpdateRequest`):
3275
+
3276
+ | Field | Type | Required | Description |
3277
+ |---|---|---|---|
3278
+ | `body.assignee_user_id` | `string \| null` | no | |
3279
+ | `body.description` | `string \| null` | no | |
3280
+ | `body.due_date` | `string (date-time) \| null` | no | |
3281
+ | `body.expected_updated_at` | `string (date-time) \| null` | no | Optimistic concurrency: the `updated_at` you read. If the task moved since, the update is refused instead of silently overwriting someone else's edit. |
3282
+ | `body.priority` | `integer \| null` | no | |
3283
+ | `body.status` | `"open" \| "in_progress" \| "completed" \| "done" \| "cancelled" \| null` | no | |
3284
+ | `body.title` | `string \| null` | no | |
3285
+
3286
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3287
+
3288
+ Other envelope fields: `pagination` (PaginationMeta).
3289
+
3290
+ **Example**
3291
+
3292
+ ```ts
3293
+ const result = await g8.api.aiInbox.updateMeetingTask({ path: { task_id: "id" }, body: {} });
3294
+ ```
3295
+
3296
+ ---
3297
+
3298
+ <a id="op-uploadinboxdraftattachment"></a>
3299
+
3300
+ ### `g8.api.aiInbox.uploadInboxDraftAttachment(input?)`
3301
+
3302
+ **Upload Inbox Draft Attachment**
3303
+
3304
+ - HTTP: `POST /api/v1/inbox/drafts/attachments`
3305
+ - operationId: `upload_inbox_draft_attachment_inbox_drafts_attachments_post` (also callable as `g8.api.call("upload_inbox_draft_attachment_inbox_drafts_attachments_post", input)`)
3306
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
3307
+ - API-key scope: `inbox:write`
3308
+
3309
+ Attach a file to an existing email draft (multipart: `file`, `draft_id`).
3310
+
3311
+ Returns `token`, `key`, `name`, `size`, `contentType`. The draft must
3312
+ already exist and the caller must be allowed to send from its mailbox - a
3313
+ 403 otherwise; 413 over 25 MB. Nothing is sent: the file rides along when
3314
+ the draft is.
3315
+
3316
+ Calls the app handler's own body (`__wrapped__`): the app wraps it in a
3317
+ per-process rate limiter bound to the APP's state, and this API's own
3318
+ rate limit applies instead.
3319
+
3320
+ **Input**: none.
3321
+
3322
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3323
+
3324
+ Other envelope fields: `pagination` (PaginationMeta).
3325
+
3326
+ **Example**
3327
+
3328
+ ```ts
3329
+ const result = await g8.api.aiInbox.uploadInboxDraftAttachment();
3330
+ ```
3331
+
3332
+ ---
3333
+
3334
+ <a id="op-uploadinboxnoteattachment"></a>
3335
+
3336
+ ### `g8.api.aiInbox.uploadInboxNoteAttachment(input?)`
3337
+
3338
+ **Upload Inbox Note Attachment**
3339
+
3340
+ - HTTP: `POST /api/v1/inbox/notes/attachments`
3341
+ - operationId: `upload_inbox_note_attachment_inbox_notes_attachments_post` (also callable as `g8.api.call("upload_inbox_note_attachment_inbox_notes_attachments_post", input)`)
3342
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
3343
+ - API-key scope: `inbox:write`
3344
+
3345
+ Upload a file for an INTERNAL note (multipart: `file`).
3346
+
3347
+ Returns the attachment ref (`token`, `key`, `name`, `size`,
3348
+ `contentType`) that `POST /inbox/channels/{channel_id}/comments` accepts
3349
+ in `attachments`. Notes are internal, so nothing reaches a customer.
3350
+
3351
+ **Input**: none.
3352
+
3353
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3354
+
3355
+ Other envelope fields: `pagination` (PaginationMeta).
3356
+
3357
+ **Example**
3358
+
3359
+ ```ts
3360
+ const result = await g8.api.aiInbox.uploadInboxNoteAttachment();
3361
+ ```
3362
+
3363
+ ---
3364
+
3365
+ <a id="op-validateinboxlinkedinaccount"></a>
3366
+
3367
+ ### `g8.api.aiInbox.validateInboxLinkedinAccount(input)`
3368
+
3369
+ **Validate Inbox Linkedin Account**
3370
+
3371
+ - HTTP: `POST /api/v1/inbox/linkedin/validate-account`
3372
+ - operationId: `validate_inbox_linkedin_account_inbox_linkedin_validate_account_post` (also callable as `g8.api.call("validate_inbox_linkedin_account_inbox_linkedin_validate_account_post", input)`)
3373
+ - Tier: `read`: reads data; safe to call and to retry
3374
+ - API-key scope: `inbox:read`
3375
+
3376
+ Can this LinkedIn account send right now? Reads only.
3377
+
3378
+ Checks the account is synced locally, enabled for the inbox, active at the
3379
+ provider, and that the provider credentials still authenticate. Gates on
3380
+ `inbox:read`.
3381
+
3382
+ NOTE the app's shape, preserved here: a failure to reach the provider is
3383
+ reported as `valid: false` with an `error` string and HTTP 200, not as a
3384
+ 5xx. Read `valid`, not the status code.
3385
+
3386
+ **Input**
3387
+
3388
+ | Field | Type | Required | Description |
3389
+ |---|---|---|---|
3390
+ | `query.linkedin_account_id` | `integer` | yes | The account you intend to send from. |
3391
+
3392
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3393
+
3394
+ Other envelope fields: `pagination` (PaginationMeta).
3395
+
3396
+ **Example**
3397
+
3398
+ ```ts
3399
+ const result = await g8.api.aiInbox.validateInboxLinkedinAccount({ query: { linkedin_account_id: 123 } });
3400
+ ```
3401
+
3402
+ ---
3403
+
3404
+ <a id="op-validateinboxsendmailbox"></a>
3405
+
3406
+ ### `g8.api.aiInbox.validateInboxSendMailbox(input)`
3407
+
3408
+ **Validate Inbox Send Mailbox**
3409
+
3410
+ - HTTP: `POST /api/v1/inbox/emails/validate-mailbox`
3411
+ - operationId: `validate_inbox_send_mailbox_inbox_emails_validate_mailbox_post` (also callable as `g8.api.call("validate_inbox_send_mailbox_inbox_emails_validate_mailbox_post", input)`)
3412
+ - Tier: `read`: reads data; safe to call and to retry
3413
+ - API-key scope: `inbox:read`
3414
+
3415
+ Can this mailbox send right now? Reads only - nothing is delivered.
3416
+
3417
+ Checks that the mailbox is connected, syncing, of a supported provider,
3418
+ that its credentials still work, and that this caller is allowed to send
3419
+ as it. Gates on `inbox:read`: a key that can only read the inbox must
3420
+ still be able to find out whether a send WOULD work before anyone tries.
3421
+
3422
+ An unauthorised mailbox is a 403 here, the same refusal the send itself
3423
+ gives, so the pre-flight and the real thing cannot disagree.
3424
+
3425
+ **Input**
3426
+
3427
+ | Field | Type | Required | Description |
3428
+ |---|---|---|---|
3429
+ | `query.mailbox` | `string` | yes | The mailbox address you intend to send AS. |
3430
+
3431
+ **Returns** `ApiResponse_InboxPayload_`: the envelope `{ data: InboxPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3432
+
3433
+ Other envelope fields: `pagination` (PaginationMeta).
3434
+
3435
+ **Example**
3436
+
3437
+ ```ts
3438
+ const result = await g8.api.aiInbox.validateInboxSendMailbox({ query: { mailbox: "example" } });
3439
+ ```
3440
+
3441
+ ---
3442
+
3443
+ ## Referenced types
3444
+
3445
+ Named types that appear in the tables above. Full TypeScript definitions: `G8Contract.<Name>` (`import type { G8Contract } from "@graph8/sdk"`).
3446
+
3447
+ <a id="type-commentattachmentref"></a>
3448
+
3449
+ ### `CommentAttachmentRef`
3450
+
3451
+ A file already uploaded to the private note namespace. Only `token` and `key` are load-bearing: the server re-validates the capability token and never trusts the name, size or type a client sends. They are accepted because the app's model accepts them.
3452
+
3453
+ | Field | Type | Required | Description |
3454
+ |---|---|---|---|
3455
+ | `key` | `string` | yes | max length 1024 |
3456
+ | `token` | `string` | yes | max length 8192 |
3457
+ | `name` | `string \| null` | no | |
3458
+ | `size` | `integer \| null` | no | |
3459
+ | `type` | `string \| null` | no | |
3460
+
3461
+ <a id="type-linkedinautorespondconfig"></a>
3462
+
3463
+ ### `LinkedInAutoRespondConfig`
3464
+
3465
+ When the AI is allowed to answer on a LinkedIn account by itself.
3466
+
3467
+ | Field | Type | Required | Description |
3468
+ |---|---|---|---|
3469
+ | `business_hours_end` | `integer` | no | default `17` |
3470
+ | `business_hours_only` | `boolean` | no | default `true` |
3471
+ | `business_hours_start` | `integer` | no | default `9` |
3472
+ | `enabled` | `boolean` | no | default `false` |
3473
+ | `exclude_intents` | `Array<string>` | no | |
3474
+ | `max_replies_per_conversation` | `integer` | no | default `2` |
3475
+ | `min_delay_minutes` | `integer` | no | default `5` |
3476
+ | `require_human_review` | `boolean` | no | True holds the reply as a draft instead of sending it. default `true` |
3477
+ | `timezone` | `string` | no | default `"America/New_York"` |
3478
+ | `trigger_on_intents` | `Array<string>` | no | |
3479
+
3480
+ <a id="type-mailboxjobitem"></a>
3481
+
3482
+ ### `MailboxJobItem`
3483
+
3484
+ One mailbox in a bulk activate/deactivate request.
3485
+
3486
+ | Field | Type | Required | Description |
3487
+ |---|---|---|---|
3488
+ | `mailbox` | `string` | yes | The mailbox address. |
3489
+ | `provider` | `"google_mailbox" \| "smtp"` | yes | |
3490
+ | `display_name` | `string \| null` | no | |