@graph8/sdk 0.251.0 → 0.260.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 +104 -7
  4. package/dist/index.d.ts +104 -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 +102 -7
  10. package/dist/react.d.ts +102 -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 +1696 -0
  140. package/docs/api/deals.md +2432 -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,3232 @@
1
+ <!-- Generated by sdk/js/scripts/generate-agent-docs.ts from developer-contract/openapi.json. Regenerated on every build. -->
2
+
3
+ # `g8.api.sequences`: Sequences
4
+
5
+ 71 operations (30 read, 19 write, 9 destructive, 4 billable, 9 external).
6
+
7
+ 6 of these also have a hand-written method (`g8.sequences`), marked **★** below. Prefer the hand-written method when one exists: it unwraps the `data` envelope and takes friendlier arguments. See [../sdk-clients.md](../sdk-clients.md).
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: [sequences.d.ts](sequences.d.ts).
20
+
21
+ ## Operations
22
+
23
+ | Call | HTTP | Tier | Scope | Summary |
24
+ |---|---|---|---|---|
25
+ | [`addContactsToSequence`](#op-addcontactstosequence) ★ | `POST /api/v1/sequences/{sequence_id}/contacts` | external | `sequences:run` | Add Contacts To Sequence |
26
+ | [`addSequenceChannels`](#op-addsequencechannels) | `POST /api/v1/sequences/{sequence_id}/channels` | write | `sequences:write` | Add Sequence Channels |
27
+ | [`addSequenceSteps`](#op-addsequencesteps) | `POST /api/v1/sequences/{sequence_id}/steps` | write | `sequences:write` | Add Sequence Steps |
28
+ | [`archiveSchedule`](#op-archiveschedule) | `PATCH /api/v1/schedules/{schedule_id}/archive` | destructive | `campaigns:delete` | Archive Schedule |
29
+ | [`archiveSequence`](#op-archivesequence) | `POST /api/v1/sequences/{sequence_id}/archive` | destructive | `sequences:delete` | Archive Sequence |
30
+ | [`archiveSequenceTemplate`](#op-archivesequencetemplate) | `PATCH /api/v1/sequencer/templates/sequences/{sequence_template_id}/archive` | destructive | `sequences:delete` | Archive Sequence Template |
31
+ | [`archiveStepTemplate`](#op-archivesteptemplate) | `PATCH /api/v1/sequencer/templates/steps/{step_template_id}/archive` | destructive | `sequences:delete` | Archive Step Template |
32
+ | [`createNurture`](#op-createnurture) | `POST /api/v1/nurtures` | write | `sequences:write` | Create Nurture |
33
+ | [`createSchedule`](#op-createschedule) | `POST /api/v1/schedules` | write | `campaigns:write` | Create Schedule |
34
+ | [`createSequenceTemplate`](#op-createsequencetemplate) | `POST /api/v1/sequencer/templates/sequences` | write | `sequences:write` | Create Sequence Template |
35
+ | [`createStepTemplate`](#op-createsteptemplate) | `POST /api/v1/sequencer/templates/steps` | write | `sequences:write` | Create Step Template |
36
+ | [`deleteNurture`](#op-deletenurture) | `DELETE /api/v1/nurtures/{nurture_id}` | destructive | `sequences:delete` | Delete Nurture |
37
+ | [`deleteSequenceStep`](#op-deletesequencestep) | `DELETE /api/v1/sequences/{sequence_id}/steps/{step_id}` | destructive | `sequences:delete` | Delete Sequence Step |
38
+ | [`draftEmail`](#op-draftemail) | `POST /api/v1/sequencer/content/email/generate` | billable | `sequences:run` | Draft Email |
39
+ | [`draftLinkedinMessage`](#op-draftlinkedinmessage) | `POST /api/v1/sequencer/content/linkedin/generate` | billable | `sequences:run` | Draft Linkedin Message |
40
+ | [`duplicateNurture`](#op-duplicatenurture) | `POST /api/v1/nurtures/{nurture_id}/duplicate` | write | `sequences:write` | Duplicate Nurture |
41
+ | [`duplicateSequence`](#op-duplicatesequence) | `POST /api/v1/sequences/{sequence_id}/duplicate` | write | `sequences:write` | Duplicate Sequence |
42
+ | [`estimateEmailDraft`](#op-estimateemaildraft) | `POST /api/v1/sequencer/content/email/estimate` | read | `sequences:read` | Estimate Email Draft |
43
+ | [`generateSequenceSpintax`](#op-generatesequencespintax) | `POST /api/v1/sequences/generate-spintax` | external | `sequences:run` | Generate Sequence Spintax |
44
+ | [`generateStepTemplates`](#op-generatesteptemplates) | `POST /api/v1/sequencer/templates/steps/generate` | billable | `sequences:run` | Generate Step Templates |
45
+ | [`getNurture`](#op-getnurture) | `GET /api/v1/nurtures/{nurture_id}` | read | `sequences:read` | Get Nurture |
46
+ | [`getProviderSizing`](#op-getprovidersizing) | `GET /api/v1/sequencer/deliverability/provider-sizing` | read | `sequences:read` | Get Provider Sizing |
47
+ | [`getSchedule`](#op-getschedule) | `GET /api/v1/schedules/{schedule_id}` | read | `campaigns:read` | Get Schedule |
48
+ | [`getSequence`](#op-getsequence) ★ | `GET /api/v1/sequences/{sequence_id}` | read | `sequences:read` | Get Sequence |
49
+ | [`getSequenceJob`](#op-getsequencejob) | `GET /api/v1/sequence-jobs/{job_id}` | read | `sequences:read` | Get Sequence Job |
50
+ | [`getSequenceReports`](#op-getsequencereports) | `GET /api/v1/sequences/{sequence_id}/reports` | read | `sequences:read` | Get Sequence Reports |
51
+ | [`getSequenceRoutingSummary`](#op-getsequenceroutingsummary) | `GET /api/v1/sequences/{sequence_id}/routing-summary` | read | `sequences:read` | Get Sequence Routing Summary |
52
+ | [`getSequenceStats`](#op-getsequencestats) | `GET /api/v1/sequences/{sequence_id}/stats` | read | `sequences:read` | Get Sequence Stats |
53
+ | [`getSequencerCapacityEstimate`](#op-getsequencercapacityestimate) | `GET /api/v1/sequencer/channels/capacity-estimate` | read | `sequences:read` | Get Sequencer Capacity Estimate |
54
+ | [`getSequencesOverview`](#op-getsequencesoverview) | `GET /api/v1/sequencer/stats` | read | `sequences:read` | Get Sequences Overview |
55
+ | [`improveStepInstruction`](#op-improvestepinstruction) | `POST /api/v1/sequencer/content/instructions/improve` | billable | `sequences:run` | Improve Step Instruction |
56
+ | [`launchNurture`](#op-launchnurture) | `POST /api/v1/nurtures/{nurture_id}/launch` | external | `sequences:run` | Launch Nurture |
57
+ | [`linkSequenceCampaign`](#op-linksequencecampaign) | `PUT /api/v1/sequences/{sequence_id}/campaign` | write | `sequences:write` | Link Sequence Campaign |
58
+ | [`listDialerContacts`](#op-listdialercontacts) | `GET /api/v1/sequencer/dialer/sequences/{sequence_id}/contacts` | read | `sequences:read` | List Dialer Contacts |
59
+ | [`listDialerSequences`](#op-listdialersequences) | `GET /api/v1/sequencer/dialer/sequences` | read | `sequences:read` | List Dialer Sequences |
60
+ | [`listEmailDraftModels`](#op-listemaildraftmodels) | `GET /api/v1/sequencer/content/email/models` | read | `sequences:read` | List Email Draft Models |
61
+ | [`listLinkedinAccounts`](#op-listlinkedinaccounts) | `GET /api/v1/sequencer/channels/linkedin_accounts` | read | `sequences:read` | List Linkedin Accounts |
62
+ | [`listNurtures`](#op-listnurtures) | `GET /api/v1/nurtures` | read | `sequences:read` | List Nurtures |
63
+ | [`listSegVendors`](#op-listsegvendors) | `GET /api/v1/sequencer/deliverability/seg-vendors` | read | `sequences:read` | List Seg Vendors |
64
+ | [`listSequenceChannels`](#op-listsequencechannels) | `GET /api/v1/sequences/{sequence_id}/channels` | read | `sequences:read` | List Sequence Channels |
65
+ | [`listSequenceContactIds`](#op-listsequencecontactids) | `GET /api/v1/sequences/{sequence_id}/contact-ids` | read | `sequences:read` | List Sequence Contact Ids |
66
+ | [`listSequenceContacts`](#op-listsequencecontacts) ★ | `GET /api/v1/sequences/{sequence_id}/contacts` | read | `sequences:read` | List Sequence Contacts |
67
+ | [`listSequenceTemplates`](#op-listsequencetemplates) | `GET /api/v1/sequencer/templates/sequences` | read | `sequences:read` | List Sequence Templates |
68
+ | [`listSequencerMailboxes`](#op-listsequencermailboxes) | `GET /api/v1/sequencer/channels/mailboxes` | read | `sequences:read` | List Sequencer Mailboxes |
69
+ | [`listSequencerPhoneNumbers`](#op-listsequencerphonenumbers) | `GET /api/v1/sequencer/channels/phone_numbers` | read | `sequences:read` | List Sequencer Phone Numbers |
70
+ | [`listSequencerSmsNumbers`](#op-listsequencersmsnumbers) | `GET /api/v1/sequencer/channels/sms_numbers` | read | `sequences:read` | List Sequencer Sms Numbers |
71
+ | [`listSequencerTextualAgents`](#op-listsequencertextualagents) | `GET /api/v1/sequencer/agents/textual` | read | `sequences:read` | List Sequencer Textual Agents |
72
+ | [`listSequencerVoiceAgents`](#op-listsequencervoiceagents) | `GET /api/v1/sequencer/agents/voice` | read | `sequences:read` | List Sequencer Voice Agents |
73
+ | [`listSequencerWhatsappNumbers`](#op-listsequencerwhatsappnumbers) | `GET /api/v1/sequencer/channels/whatsapp_numbers` | read | `sequences:read` | List Sequencer Whatsapp Numbers |
74
+ | [`listSequencerWhatsappTemplates`](#op-listsequencerwhatsapptemplates) | `GET /api/v1/sequencer/channels/whatsapp_templates` | read | `sequences:read` | List Sequencer Whatsapp Templates |
75
+ | [`listSequences`](#op-listsequences) | `GET /api/v1/sequences` | read | `sequences:read` | List Sequences |
76
+ | [`listStepTemplates`](#op-liststeptemplates) | `GET /api/v1/sequencer/templates/steps` | read | `sequences:read` | List Step Templates |
77
+ | [`pauseNurture`](#op-pausenurture) | `POST /api/v1/nurtures/{nurture_id}/pause` | write | `sequences:write` | Pause Nurture |
78
+ | [`pauseSequence`](#op-pausesequence) ★ | `POST /api/v1/sequences/{sequence_id}/pause` | external | `sequences:run` | Pause Sequence |
79
+ | [`pauseSequenceContact`](#op-pausesequencecontact) | `POST /api/v1/sequences/{sequence_id}/contacts/{contact_id}/pause` | write | `sequences:write` | Pause Sequence Contact |
80
+ | [`placeVoiceTestCall`](#op-placevoicetestcall) | `POST /api/v1/sequencer/content/voice/test-call` | external | `sequences:run` | Place Voice Test Call |
81
+ | [`recordDialerOutcome`](#op-recorddialeroutcome) | `POST /api/v1/sequencer/dialer/sequences/{sequence_id}/contacts/{contact_id}/callback` | write | `sequences:write` | Record Dialer Outcome |
82
+ | [`removeSequenceChannel`](#op-removesequencechannel) | `DELETE /api/v1/sequences/{sequence_id}/channels/{sequence_channel_id}` | destructive | `sequences:delete` | Remove Sequence Channel |
83
+ | [`removeSequenceChannels`](#op-removesequencechannels) | `DELETE /api/v1/sequences/{sequence_id}/channels` | destructive | `sequences:delete` | Remove Sequence Channels |
84
+ | [`resumeNurture`](#op-resumenurture) | `POST /api/v1/nurtures/{nurture_id}/resume` | write | `sequences:write` | Resume Nurture |
85
+ | [`resumeSequence`](#op-resumesequence) ★ | `POST /api/v1/sequences/{sequence_id}/resume` | external | `sequences:run` | Resume Sequence |
86
+ | [`resumeSequenceContact`](#op-resumesequencecontact) | `POST /api/v1/sequences/{sequence_id}/contacts/{contact_id}/resume` | external | `sequences:run` | Resume Sequence Contact |
87
+ | [`runSequence`](#op-runsequence) ★ | `POST /api/v1/sequences/{sequence_id}/run` | external | `sequences:run` | Run Sequence |
88
+ | [`setSequenceStatus`](#op-setsequencestatus) | `POST /api/v1/sequences/{sequence_id}/status` | write | `sequences:write` | Set Sequence Status |
89
+ | [`syncSequence`](#op-syncsequence) | `POST /api/v1/sequences/{sequence_id}/sync` | external | `sequences:run` | Sync Sequence |
90
+ | [`terminateSequence`](#op-terminatesequence) | `POST /api/v1/sequences/{sequence_id}/terminate` | write | `sequences:write` | Terminate Sequence |
91
+ | [`unlinkSequenceCampaign`](#op-unlinksequencecampaign) | `DELETE /api/v1/sequences/{sequence_id}/campaign` | destructive | `sequences:delete` | Unlink Sequence Campaign |
92
+ | [`updateNurture`](#op-updatenurture) | `PATCH /api/v1/nurtures/{nurture_id}` | write | `sequences:write` | Update Nurture |
93
+ | [`updateSchedule`](#op-updateschedule) | `PATCH /api/v1/schedules/{schedule_id}` | write | `campaigns:write` | Update Schedule |
94
+ | [`updateSequenceTemplate`](#op-updatesequencetemplate) | `PATCH /api/v1/sequencer/templates/sequences/{sequence_template_id}` | write | `sequences:write` | Update Sequence Template |
95
+ | [`updateStepTemplate`](#op-updatesteptemplate) | `PATCH /api/v1/sequencer/templates/steps/{step_template_id}` | write | `sequences:write` | Update Step Template |
96
+
97
+ ---
98
+
99
+ <a id="op-addcontactstosequence"></a>
100
+
101
+ ### `g8.api.sequences.addContactsToSequence(input)`
102
+
103
+ **Add Contacts To Sequence**
104
+
105
+ - HTTP: `POST /api/v1/sequences/{sequence_id}/contacts`
106
+ - operationId: `add_contacts_to_sequence_sequences__sequence_id__contacts_post` (also callable as `g8.api.call("add_contacts_to_sequence_sequences__sequence_id__contacts_post", input)`)
107
+ - 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
108
+ - API-key scope: `sequences:run`
109
+ - ★ Hand-written: [`g8.sequences.add()`](../sdk-clients.md#g8-sequences-add)
110
+
111
+ Add contacts to a live or drafted sequence using V2 queuing.
112
+
113
+ **Input**
114
+
115
+ | Field | Type | Required | Description |
116
+ |---|---|---|---|
117
+ | `path.sequence_id` | `string` | yes | Sequence ID |
118
+ | `body` | `AddSequenceContactsRequest` | yes | Request body; fields below. |
119
+
120
+ Body fields (`AddSequenceContactsRequest`):
121
+
122
+ | Field | Type | Required | Description |
123
+ |---|---|---|---|
124
+ | `body.contact_ids` | `Array<integer>` | yes | Contact IDs to add to the sequence |
125
+ | `body.list_id` | `integer` | yes | List ID the contacts belong to |
126
+
127
+ **Returns** `ApiResponse_SequenceActionResponse_`: the envelope `{ data: SequenceActionResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
128
+
129
+ Other envelope fields: `pagination` (PaginationMeta).
130
+
131
+ `SequenceActionResponse` fields:
132
+
133
+ | Field | Type | Required | Description |
134
+ |---|---|---|---|
135
+ | `sequence_id` | `string` | yes | |
136
+ | `status` | `string` | yes | |
137
+ | `contacts_affected` | `integer` | no | default `0` |
138
+
139
+ **Example**
140
+
141
+ ```ts
142
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
143
+ const result = await g8.api.sequences.addContactsToSequence({
144
+ path: { sequence_id: "id" },
145
+ body: { contact_ids: [123], list_id: 123 },
146
+ });
147
+ ```
148
+
149
+ ---
150
+
151
+ <a id="op-addsequencechannels"></a>
152
+
153
+ ### `g8.api.sequences.addSequenceChannels(input)`
154
+
155
+ **Add Sequence Channels**
156
+
157
+ - HTTP: `POST /api/v1/sequences/{sequence_id}/channels`
158
+ - operationId: `add_sequence_channels_sequences__sequence_id__channels_post` (also callable as `g8.api.call("add_sequence_channels_sequences__sequence_id__channels_post", input)`)
159
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
160
+ - API-key scope: `sequences:write`
161
+
162
+ Attach senders to a sequence. Answers with every channel now attached.
163
+
164
+ Take the values from the `/sequencer/channels/*` pickers: `channel_id` is
165
+ the sender's own id and `channel_value` its address.
166
+
167
+ **Input**
168
+
169
+ | Field | Type | Required | Description |
170
+ |---|---|---|---|
171
+ | `path.sequence_id` | `string` | yes | Sequence id. |
172
+ | `body` | `AddChannelsRequest` | yes | Request body; fields below. |
173
+
174
+ Body fields (`AddChannelsRequest`):
175
+
176
+ | Field | Type | Required | Description |
177
+ |---|---|---|---|
178
+ | `body.channels` | `Array<AddChannelItem>` | yes | min items 1 |
179
+
180
+ **Returns** `ApiResponse_SequencerListPayload_`: the envelope `{ data: SequencerListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
181
+
182
+ Other envelope fields: `pagination` (PaginationMeta).
183
+
184
+ `SequencerListPayload` fields:
185
+
186
+ | Field | Type | Required | Description |
187
+ |---|---|---|---|
188
+ | `items` | `Array<unknown>` | no | |
189
+
190
+ **Example**
191
+
192
+ ```ts
193
+ const result = await g8.api.sequences.addSequenceChannels({
194
+ path: { sequence_id: "id" },
195
+ body: {
196
+ channels: [
197
+ { channel_id: 123, channel_type: "SMTP", channel_value: "example" },
198
+ ],
199
+ },
200
+ });
201
+ ```
202
+
203
+ ---
204
+
205
+ <a id="op-addsequencesteps"></a>
206
+
207
+ ### `g8.api.sequences.addSequenceSteps(input)`
208
+
209
+ **Add Sequence Steps**
210
+
211
+ - HTTP: `POST /api/v1/sequences/{sequence_id}/steps`
212
+ - operationId: `add_sequence_steps_sequences__sequence_id__steps_post` (also callable as `g8.api.call("add_sequence_steps_sequences__sequence_id__steps_post", input)`)
213
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
214
+ - API-key scope: `sequences:write`
215
+
216
+ Add one or more steps to an existing sequence. Answers with EVERY step now in it.
217
+
218
+ The content is validated on write, as in the app: copy that cannot render
219
+ (broken spintax, unclosed merge tags) is a 400 naming the problem, and
220
+ hand-written copy on an `ON_DEMAND` step - which the generator would
221
+ silently discard - is refused rather than accepted and dropped.
222
+
223
+ **Input**
224
+
225
+ | Field | Type | Required | Description |
226
+ |---|---|---|---|
227
+ | `path.sequence_id` | `string` | yes | Sequence id. |
228
+ | `body` | `AddStepsRequest` | yes | Request body; fields below. |
229
+
230
+ Body fields (`AddStepsRequest`):
231
+
232
+ | Field | Type | Required | Description |
233
+ |---|---|---|---|
234
+ | `body.steps` | `Array<AddStepItem>` | yes | min items 1 |
235
+
236
+ **Returns** `ApiResponse_SequencerListPayload_`: the envelope `{ data: SequencerListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
237
+
238
+ Other envelope fields: `pagination` (PaginationMeta).
239
+
240
+ `SequencerListPayload` fields:
241
+
242
+ | Field | Type | Required | Description |
243
+ |---|---|---|---|
244
+ | `items` | `Array<unknown>` | no | |
245
+
246
+ **Example**
247
+
248
+ ```ts
249
+ const result = await g8.api.sequences.addSequenceSteps({
250
+ path: { sequence_id: "id" },
251
+ body: {
252
+ steps: [
253
+ {
254
+ input_type: "ON_DEMAND",
255
+ step_data: {},
256
+ step_order: 1,
257
+ step_type: "PHONE",
258
+ },
259
+ ],
260
+ },
261
+ });
262
+ ```
263
+
264
+ ---
265
+
266
+ <a id="op-archiveschedule"></a>
267
+
268
+ ### `g8.api.sequences.archiveSchedule(input)`
269
+
270
+ **Archive Schedule**
271
+
272
+ - HTTP: `PATCH /api/v1/schedules/{schedule_id}/archive`
273
+ - operationId: `archive_schedule_schedules__schedule_id__archive_patch` (also callable as `g8.api.call("archive_schedule_schedules__schedule_id__archive_patch", input)`)
274
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
275
+ - API-key scope: `campaigns:delete`
276
+
277
+ Archive or UN-archive a schedule (`is_archived` is explicit).
278
+
279
+ Archived schedules drop out of `GET /schedules` unless `include_archived`
280
+ is set. Nothing is deleted.
281
+
282
+ **Input**
283
+
284
+ | Field | Type | Required | Description |
285
+ |---|---|---|---|
286
+ | `path.schedule_id` | `string` | yes | Schedule id, from `GET /schedules`. |
287
+ | `body` | `ArchiveRequest` | yes | Request body; fields below. |
288
+
289
+ Body fields (`ArchiveRequest`):
290
+
291
+ | Field | Type | Required | Description |
292
+ |---|---|---|---|
293
+ | `body.is_archived` | `boolean` | yes | |
294
+
295
+ **Returns** `ApiResponse_SequencerPayload_`: the envelope `{ data: SequencerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
296
+
297
+ Other envelope fields: `pagination` (PaginationMeta).
298
+
299
+ **Example**
300
+
301
+ ```ts
302
+ // destructive: deletes or archives data; confirm with a human before calling.
303
+ const result = await g8.api.sequences.archiveSchedule({ path: { schedule_id: "id" }, body: { is_archived: true } });
304
+ ```
305
+
306
+ ---
307
+
308
+ <a id="op-archivesequence"></a>
309
+
310
+ ### `g8.api.sequences.archiveSequence(input)`
311
+
312
+ **Archive Sequence**
313
+
314
+ - HTTP: `POST /api/v1/sequences/{sequence_id}/archive`
315
+ - operationId: `archive_sequence_sequences__sequence_id__archive_post` (also callable as `g8.api.call("archive_sequence_sequences__sequence_id__archive_post", input)`)
316
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
317
+ - API-key scope: `sequences:delete`
318
+
319
+ Archive a sequence - a soft delete.
320
+
321
+ NOT REVERSIBLE THROUGH THIS API TODAY. The app's `unarchive` endpoint is a
322
+ reserved stub that unconditionally returns 403 ("Unarchiving is not
323
+ available yet"), so it is not published here - archiving is a one-way door
324
+ for an API caller until that lands. Contact support to restore one.
325
+
326
+ A LIVE or WAITING sequence is paused first and wound down in the
327
+ background; `is_archived` blocks every worker immediately. Archiving one
328
+ that is already archived is a 400, and one mid-transition (scheduling,
329
+ pausing) is a 409, so a retry loop cannot corrupt the state machine.
330
+
331
+ **Input**
332
+
333
+ | Field | Type | Required | Description |
334
+ |---|---|---|---|
335
+ | `path.sequence_id` | `string` | yes | Sequence id. |
336
+
337
+ **Returns** `ApiResponse_dict_`: the envelope `{ data: Record<string, unknown>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
338
+
339
+ Other envelope fields: `pagination` (PaginationMeta).
340
+
341
+ **Example**
342
+
343
+ ```ts
344
+ // destructive: deletes or archives data; confirm with a human before calling.
345
+ const result = await g8.api.sequences.archiveSequence({ path: { sequence_id: "id" } });
346
+ ```
347
+
348
+ ---
349
+
350
+ <a id="op-archivesequencetemplate"></a>
351
+
352
+ ### `g8.api.sequences.archiveSequenceTemplate(input)`
353
+
354
+ **Archive Sequence Template**
355
+
356
+ - HTTP: `PATCH /api/v1/sequencer/templates/sequences/{sequence_template_id}/archive`
357
+ - operationId: `archive_sequence_template_sequencer_templates_sequences__sequence_template_id__archive_patch` (also callable as `g8.api.call("archive_sequence_template_sequencer_templates_sequences__sequence_template_id__archive_patch", input)`)
358
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
359
+ - API-key scope: `sequences:delete`
360
+
361
+ Archive or UN-archive a sequence template (`is_archived` is explicit).
362
+
363
+ Nothing is deleted - the row stays in the list with `is_archived` set.
364
+
365
+ **Input**
366
+
367
+ | Field | Type | Required | Description |
368
+ |---|---|---|---|
369
+ | `path.sequence_template_id` | `string` | yes | Sequence template id. |
370
+ | `body` | `ArchiveRequest` | yes | Request body; fields below. |
371
+
372
+ Body fields (`ArchiveRequest`):
373
+
374
+ | Field | Type | Required | Description |
375
+ |---|---|---|---|
376
+ | `body.is_archived` | `boolean` | yes | |
377
+
378
+ **Returns** `ApiResponse_SequencerPayload_`: the envelope `{ data: SequencerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
379
+
380
+ Other envelope fields: `pagination` (PaginationMeta).
381
+
382
+ **Example**
383
+
384
+ ```ts
385
+ // destructive: deletes or archives data; confirm with a human before calling.
386
+ const result = await g8.api.sequences.archiveSequenceTemplate({ path: { sequence_template_id: "id" }, body: { is_archived: true } });
387
+ ```
388
+
389
+ ---
390
+
391
+ <a id="op-archivesteptemplate"></a>
392
+
393
+ ### `g8.api.sequences.archiveStepTemplate(input)`
394
+
395
+ **Archive Step Template**
396
+
397
+ - HTTP: `PATCH /api/v1/sequencer/templates/steps/{step_template_id}/archive`
398
+ - operationId: `archive_step_template_sequencer_templates_steps__step_template_id__archive_patch` (also callable as `g8.api.call("archive_step_template_sequencer_templates_steps__step_template_id__archive_patch", input)`)
399
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
400
+ - API-key scope: `sequences:delete`
401
+
402
+ Archive or un-archive a step template (`is_archived` is explicit).
403
+
404
+ **Input**
405
+
406
+ | Field | Type | Required | Description |
407
+ |---|---|---|---|
408
+ | `path.step_template_id` | `string` | yes | Step template id. |
409
+ | `body` | `ArchiveRequest` | yes | Request body; fields below. |
410
+
411
+ Body fields (`ArchiveRequest`):
412
+
413
+ | Field | Type | Required | Description |
414
+ |---|---|---|---|
415
+ | `body.is_archived` | `boolean` | yes | |
416
+
417
+ **Returns** `ApiResponse_SequencerPayload_`: the envelope `{ data: SequencerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
418
+
419
+ Other envelope fields: `pagination` (PaginationMeta).
420
+
421
+ **Example**
422
+
423
+ ```ts
424
+ // destructive: deletes or archives data; confirm with a human before calling.
425
+ const result = await g8.api.sequences.archiveStepTemplate({ path: { step_template_id: "id" }, body: { is_archived: true } });
426
+ ```
427
+
428
+ ---
429
+
430
+ <a id="op-createnurture"></a>
431
+
432
+ ### `g8.api.sequences.createNurture(input)`
433
+
434
+ **Create Nurture**
435
+
436
+ - HTTP: `POST /api/v1/nurtures`
437
+ - operationId: `create_nurture_nurtures_post` (also callable as `g8.api.call("create_nurture_nurtures_post", input)`)
438
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
439
+ - API-key scope: `sequences:write`
440
+
441
+ Create a nurture.
442
+
443
+ `sequence_kind` is pinned to `nurture` by the app and re-validated there,
444
+ so the nurture-specific channel rules fire even though this endpoint never
445
+ accepts the field. `user_email` defaults to the identity the key was
446
+ minted under; a personal nurture owned by anyone else is a 403.
447
+
448
+ **Input**
449
+
450
+ | Field | Type | Required | Description |
451
+ |---|---|---|---|
452
+ | `body` | `NurtureCreateRequest` | yes | Request body; fields below. |
453
+
454
+ Body fields (`NurtureCreateRequest`):
455
+
456
+ | Field | Type | Required | Description |
457
+ |---|---|---|---|
458
+ | `body.name` | `string` | yes | Nurture name. min length 1 |
459
+ | `body.pinned_mailbox_id` | `integer` | yes | The ONE mailbox this nurture sends from. Required: a nurture is pinned to a single sender so its consented audience always hears from the same address, and every email channel attached must use it. `validate_nurture_rules` rejects a nurture without one, so this is required here rather than left to fail deeper in. |
460
+ | `body.associated_list_id` | `integer \| null` | no | Audience list whose contacts this nurture engages. |
461
+ | `body.campaign_builder_campaign_id` | `string \| null` | no | Studio campaign to link this nurture to. |
462
+ | `body.channels` | `Array<Record<string, unknown>>` | no | Sending channels to attach. |
463
+ | `body.description` | `string \| null` | no | |
464
+ | `body.finish_on_reply` | `boolean` | no | Stop nurturing a contact once they reply. default `true` |
465
+ | `body.include_unsubscribe_cta` | `boolean` | no | Append the visible reply-opt-out CTA to email bodies. default `true` |
466
+ | `body.is_shared` | `boolean` | no | True makes the nurture visible org-wide. Requires an Admin or Owner role; see this router's note on org-scope promotion. default `false` |
467
+ | `body.schedule_id` | `string \| null` | no | |
468
+ | `body.send_in_same_thread` | `boolean` | no | Keep follow-ups in the original email thread. default `true` |
469
+ | `body.status` | `string` | no | Initial status. Nurtures start drafted. default `"drafted"` |
470
+ | `body.steps` | `Array<Record<string, unknown>>` | no | Sequence steps, in order. |
471
+ | `body.textual_agent_name` | `string \| null` | no | |
472
+ | `body.user_email` | `string \| null` | no | Owner of the nurture. Defaults to the identity the key was minted under. A PERSONAL nurture can only be owned by the caller - supplying anyone else's address with `is_shared=false` is a 403. |
473
+ | `body.voice_agent_name` | `string \| null` | no | |
474
+ | `body.wait_for_new_contacts` | `boolean` | no | default `false` |
475
+
476
+ **Returns** `ApiResponse_NurtureResponse_`: the envelope `{ data: NurtureResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
477
+
478
+ Other envelope fields: `pagination` (PaginationMeta).
479
+
480
+ `NurtureResponse` fields:
481
+
482
+ | Field | Type | Required | Description |
483
+ |---|---|---|---|
484
+ | `created_at` | `string (date-time) \| null` | no | |
485
+ | `id` | `string \| null` | no | |
486
+ | `is_shared` | `boolean \| null` | no | True when visible org-wide. |
487
+ | `name` | `string \| null` | no | |
488
+ | `status` | `string \| null` | no | draft, live, paused, completed, terminated. |
489
+ | `updated_at` | `string (date-time) \| null` | no | |
490
+
491
+ **Example**
492
+
493
+ ```ts
494
+ const result = await g8.api.sequences.createNurture({ body: { name: "Example", pinned_mailbox_id: 123 } });
495
+ ```
496
+
497
+ ---
498
+
499
+ <a id="op-createschedule"></a>
500
+
501
+ ### `g8.api.sequences.createSchedule(input)`
502
+
503
+ **Create Schedule**
504
+
505
+ - HTTP: `POST /api/v1/schedules`
506
+ - operationId: `create_schedule_schedules_post` (also callable as `g8.api.call("create_schedule_schedules_post", input)`)
507
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
508
+ - API-key scope: `campaigns:write`
509
+
510
+ Create a sending schedule: a weekly set of windows in one timezone.
511
+
512
+ A day left out of `config` is a day nothing is sent. Put it on a sequence
513
+ with `PATCH /sequences/{id}` (`schedule_id`).
514
+
515
+ **Input**
516
+
517
+ | Field | Type | Required | Description |
518
+ |---|---|---|---|
519
+ | `body` | `CreateSendingScheduleRequest` | yes | Request body; fields below. |
520
+
521
+ Body fields (`CreateSendingScheduleRequest`):
522
+
523
+ | Field | Type | Required | Description |
524
+ |---|---|---|---|
525
+ | `body.config` | `SendingWeek` | yes | |
526
+ | `body.name` | `string` | yes | max length 255 |
527
+ | `body.description` | `string \| null` | no | max length 1024 |
528
+ | `body.timezone` | `string` | no | IANA timezone. default `"UTC"`, max length 128 |
529
+
530
+ **Returns** `ApiResponse_SequencerPayload_`: the envelope `{ data: SequencerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
531
+
532
+ Other envelope fields: `pagination` (PaginationMeta).
533
+
534
+ **Example**
535
+
536
+ ```ts
537
+ const result = await g8.api.sequences.createSchedule({ body: { config: {}, name: "Example" } });
538
+ ```
539
+
540
+ ---
541
+
542
+ <a id="op-createsequencetemplate"></a>
543
+
544
+ ### `g8.api.sequences.createSequenceTemplate(input)`
545
+
546
+ **Create Sequence Template**
547
+
548
+ - HTTP: `POST /api/v1/sequencer/templates/sequences`
549
+ - operationId: `create_sequence_template_sequencer_templates_sequences_post` (also callable as `g8.api.call("create_sequence_template_sequencer_templates_sequences_post", input)`)
550
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
551
+ - API-key scope: `sequences:write`
552
+
553
+ Save a reusable sequence skeleton.
554
+
555
+ Answers with the FULL template list, not the new row - that is the app's
556
+ response, kept so the two cannot disagree about what was created.
557
+
558
+ **Input**
559
+
560
+ | Field | Type | Required | Description |
561
+ |---|---|---|---|
562
+ | `body` | `CreateSequenceTemplateRequest` | yes | Request body; fields below. |
563
+
564
+ Body fields (`CreateSequenceTemplateRequest`):
565
+
566
+ | Field | Type | Required | Description |
567
+ |---|---|---|---|
568
+ | `body.name` | `string` | yes | max length 255 |
569
+ | `body.appointment_id` | `integer \| null` | no | Event type id for the booking link. |
570
+ | `body.description` | `string \| null` | no | |
571
+ | `body.schedule_id` | `string \| null` | no | Sending schedule, from `GET /schedules`. |
572
+ | `body.steps` | `Array<SequenceTemplateStep> \| null` | no | |
573
+ | `body.textual_agent_name` | `string \| null` | no | Agent for email / social steps. |
574
+ | `body.voice_agent_name` | `string \| null` | no | Agent for phone / SMS steps. |
575
+
576
+ **Returns** `ApiResponse_SequencerListPayload_`: the envelope `{ data: SequencerListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
577
+
578
+ Other envelope fields: `pagination` (PaginationMeta).
579
+
580
+ `SequencerListPayload` fields:
581
+
582
+ | Field | Type | Required | Description |
583
+ |---|---|---|---|
584
+ | `items` | `Array<unknown>` | no | |
585
+
586
+ **Example**
587
+
588
+ ```ts
589
+ const result = await g8.api.sequences.createSequenceTemplate({ body: { name: "Example" } });
590
+ ```
591
+
592
+ ---
593
+
594
+ <a id="op-createsteptemplate"></a>
595
+
596
+ ### `g8.api.sequences.createStepTemplate(input)`
597
+
598
+ **Create Step Template**
599
+
600
+ - HTTP: `POST /api/v1/sequencer/templates/steps`
601
+ - operationId: `create_step_template_sequencer_templates_steps_post` (also callable as `g8.api.call("create_step_template_sequencer_templates_steps_post", input)`)
602
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
603
+ - API-key scope: `sequences:write`
604
+
605
+ Save reusable step content. Answers with the full list, as the app does.
606
+
607
+ **Input**
608
+
609
+ | Field | Type | Required | Description |
610
+ |---|---|---|---|
611
+ | `body` | `CreateStepTemplateRequest` | yes | Request body; fields below. |
612
+
613
+ Body fields (`CreateStepTemplateRequest`):
614
+
615
+ | Field | Type | Required | Description |
616
+ |---|---|---|---|
617
+ | `body.input_type` | `"ON_DEMAND" \| "AI_GENERATED_TEMPLATE" \| "MANUAL_TEMPLATE"` | yes | |
618
+ | `body.name` | `string` | yes | |
619
+ | `body.step_data` | `Record<string, unknown>` | yes | The step's content: `subject` / `body` for email, `message_body` for SMS and WhatsApp, the `linkedin_*` fields for LinkedIn, `instructions` for AI generation. The same shape as `step_data` on `GET /sequences/{sequence_id}/steps`. |
620
+ | `body.step_type` | `"PHONE" \| "EMAIL" \| "MANUAL_DIALER" \| "HEYREACH" \| "NETRION" \| "SMS" \| "WHATSAPP"` | yes | |
621
+
622
+ **Returns** `ApiResponse_SequencerListPayload_`: the envelope `{ data: SequencerListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
623
+
624
+ Other envelope fields: `pagination` (PaginationMeta).
625
+
626
+ `SequencerListPayload` fields:
627
+
628
+ | Field | Type | Required | Description |
629
+ |---|---|---|---|
630
+ | `items` | `Array<unknown>` | no | |
631
+
632
+ **Example**
633
+
634
+ ```ts
635
+ const result = await g8.api.sequences.createStepTemplate({
636
+ body: {
637
+ input_type: "ON_DEMAND",
638
+ name: "Example",
639
+ step_data: {},
640
+ step_type: "PHONE",
641
+ },
642
+ });
643
+ ```
644
+
645
+ ---
646
+
647
+ <a id="op-deletenurture"></a>
648
+
649
+ ### `g8.api.sequences.deleteNurture(input)`
650
+
651
+ **Delete Nurture**
652
+
653
+ - HTTP: `DELETE /api/v1/nurtures/{nurture_id}`
654
+ - operationId: `delete_nurture_nurtures__nurture_id__delete` (also callable as `g8.api.call("delete_nurture_nurtures__nurture_id__delete", input)`)
655
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
656
+ - API-key scope: `sequences:delete`
657
+
658
+ Archive a nurture - a soft delete, not a purge.
659
+
660
+ A LIVE or WAITING nurture is paused first and wound down in the
661
+ background; `is_archived` blocks every worker immediately. Archiving an
662
+ already-archived nurture is a 400, and one mid-transition (scheduling,
663
+ pausing) is a 409, so a retry loop cannot corrupt the state machine.
664
+
665
+ **Input**
666
+
667
+ | Field | Type | Required | Description |
668
+ |---|---|---|---|
669
+ | `path.nurture_id` | `string` | yes | Nurture id. |
670
+
671
+ **Returns** `ApiResponse_dict_`: the envelope `{ data: Record<string, unknown>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
672
+
673
+ Other envelope fields: `pagination` (PaginationMeta).
674
+
675
+ **Example**
676
+
677
+ ```ts
678
+ // destructive: deletes or archives data; confirm with a human before calling.
679
+ const result = await g8.api.sequences.deleteNurture({ path: { nurture_id: "id" } });
680
+ ```
681
+
682
+ ---
683
+
684
+ <a id="op-deletesequencestep"></a>
685
+
686
+ ### `g8.api.sequences.deleteSequenceStep(input)`
687
+
688
+ **Delete Sequence Step**
689
+
690
+ - HTTP: `DELETE /api/v1/sequences/{sequence_id}/steps/{step_id}`
691
+ - operationId: `delete_sequence_step_sequences__sequence_id__steps__step_id__delete` (also callable as `g8.api.call("delete_sequence_step_sequences__sequence_id__steps__step_id__delete", input)`)
692
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
693
+ - API-key scope: `sequences:delete`
694
+
695
+ Permanently delete a step. Returns the sequence's remaining steps.
696
+
697
+ **Input**
698
+
699
+ | Field | Type | Required | Description |
700
+ |---|---|---|---|
701
+ | `path.sequence_id` | `string` | yes | Sequence id. |
702
+ | `path.step_id` | `string` | yes | Step id. |
703
+
704
+ **Returns** `ApiResponse_SequenceOpsPayload_`: the envelope `{ data: SequenceOpsPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
705
+
706
+ Other envelope fields: `pagination` (PaginationMeta).
707
+
708
+ **Example**
709
+
710
+ ```ts
711
+ // destructive: deletes or archives data; confirm with a human before calling.
712
+ const result = await g8.api.sequences.deleteSequenceStep({ path: { sequence_id: "id", step_id: "id" } });
713
+ ```
714
+
715
+ ---
716
+
717
+ <a id="op-draftemail"></a>
718
+
719
+ ### `g8.api.sequences.draftEmail(input)`
720
+
721
+ **Draft Email**
722
+
723
+ - HTTP: `POST /api/v1/sequencer/content/email/generate`
724
+ - operationId: `draft_email_sequencer_content_email_generate_post` (also callable as `g8.api.call("draft_email_sequencer_content_email_generate_post", input)`)
725
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
726
+ - API-key scope: `sequences:run`
727
+
728
+ Draft one contact's email with an agent. SPENDS CREDITS per call.
729
+
730
+ Returns the subject and body; nothing is saved or sent. A 402 means the
731
+ organisation is out of credits. Price it first with `.../email/estimate`.
732
+
733
+ **Input**
734
+
735
+ | Field | Type | Required | Description |
736
+ |---|---|---|---|
737
+ | `body` | `DraftEmailRequest` | yes | Request body; fields below. |
738
+
739
+ Body fields (`DraftEmailRequest`):
740
+
741
+ | Field | Type | Required | Description |
742
+ |---|---|---|---|
743
+ | `body.agent_name` | `string` | yes | The textual agent whose voice and context are used. |
744
+ | `body.contact_id` | `integer` | yes | |
745
+ | `body.contact_work_email` | `string` | yes | |
746
+ | `body.first_name` | `string` | yes | |
747
+ | `body.instructions` | `string` | yes | What the email should do - the step's prompt. |
748
+ | `body.last_name` | `string` | yes | |
749
+ | `body.lead_info` | `string` | yes | What is known about the contact, as free text. |
750
+ | `body.model` | `string \| null` | no | Model slug, from `GET /sequencer/content/email/models`. |
751
+ | `body.provider` | `"openai" \| "anthropic" \| "openrouter" \| null` | no | Model provider, from `GET /sequencer/content/email/models`. |
752
+ | `body.sequence_id` | `string \| null` | no | Draft in the context of this sequence's linked campaign. |
753
+ | `body.step_order` | `integer \| null` | no | |
754
+ | `body.studio_campaign_id` | `string \| null` | no | Draft in this campaign's context; wins over `sequence_id`. |
755
+
756
+ **Returns** `ApiResponse_SequencerPayload_`: the envelope `{ data: SequencerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
757
+
758
+ Other envelope fields: `pagination` (PaginationMeta).
759
+
760
+ **Example**
761
+
762
+ ```ts
763
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
764
+ const result = await g8.api.sequences.draftEmail({
765
+ body: {
766
+ agent_name: "Example",
767
+ contact_id: 123,
768
+ contact_work_email: "jane@acme.com",
769
+ first_name: "Example",
770
+ instructions: "example",
771
+ last_name: "Example",
772
+ lead_info: "example",
773
+ },
774
+ });
775
+ ```
776
+
777
+ ---
778
+
779
+ <a id="op-draftlinkedinmessage"></a>
780
+
781
+ ### `g8.api.sequences.draftLinkedinMessage(input)`
782
+
783
+ **Draft Linkedin Message**
784
+
785
+ - HTTP: `POST /api/v1/sequencer/content/linkedin/generate`
786
+ - operationId: `draft_linkedin_message_sequencer_content_linkedin_generate_post` (also callable as `g8.api.call("draft_linkedin_message_sequencer_content_linkedin_generate_post", input)`)
787
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
788
+ - API-key scope: `sequences:run`
789
+
790
+ Draft one contact's LinkedIn message with an agent. SPENDS CREDITS per call.
791
+
792
+ Returns `message` (and `subject` for an InMail); nothing is saved or sent.
793
+
794
+ **Input**
795
+
796
+ | Field | Type | Required | Description |
797
+ |---|---|---|---|
798
+ | `body` | `DraftLinkedInRequest` | yes | Request body; fields below. |
799
+
800
+ Body fields (`DraftLinkedInRequest`):
801
+
802
+ | Field | Type | Required | Description |
803
+ |---|---|---|---|
804
+ | `body.contact_id` | `integer` | yes | |
805
+ | `body.first_name` | `string` | yes | |
806
+ | `body.instructions` | `string` | yes | |
807
+ | `body.last_name` | `string` | yes | |
808
+ | `body.lead_info` | `string` | yes | |
809
+ | `body.linkedin_action_type` | `string` | yes | The LinkedIn step kind the message is for, e.g. a connection request or a message. |
810
+ | `body.agent_name` | `string` | no | default `"default-agent"` |
811
+ | `body.step_history` | `string \| null` | no | What earlier steps already said, so the draft does not repeat it. |
812
+ | `body.studio_campaign_id` | `string \| null` | no | |
813
+
814
+ **Returns** `ApiResponse_SequencerPayload_`: the envelope `{ data: SequencerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
815
+
816
+ Other envelope fields: `pagination` (PaginationMeta).
817
+
818
+ **Example**
819
+
820
+ ```ts
821
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
822
+ const result = await g8.api.sequences.draftLinkedinMessage({
823
+ body: {
824
+ contact_id: 123,
825
+ first_name: "Example",
826
+ instructions: "example",
827
+ last_name: "Example",
828
+ lead_info: "example",
829
+ linkedin_action_type: "example",
830
+ },
831
+ });
832
+ ```
833
+
834
+ ---
835
+
836
+ <a id="op-duplicatenurture"></a>
837
+
838
+ ### `g8.api.sequences.duplicateNurture(input)`
839
+
840
+ **Duplicate Nurture**
841
+
842
+ - HTTP: `POST /api/v1/nurtures/{nurture_id}/duplicate`
843
+ - operationId: `duplicate_nurture_nurtures__nurture_id__duplicate_post` (also callable as `g8.api.call("duplicate_nurture_nurtures__nurture_id__duplicate_post", input)`)
844
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
845
+ - API-key scope: `sequences:write`
846
+
847
+ Copy a nurture. The copy is drafted, owned by the caller, no channels.
848
+
849
+ `user_email` is pinned to the caller by the app even if one is sent, which
850
+ is why the request model does not offer it.
851
+
852
+ **Input**
853
+
854
+ | Field | Type | Required | Description |
855
+ |---|---|---|---|
856
+ | `path.nurture_id` | `string` | yes | Nurture id to copy. |
857
+ | `body` | `NurtureDuplicateRequest` | no | Request body; fields below. |
858
+
859
+ Body fields (`NurtureDuplicateRequest`):
860
+
861
+ | Field | Type | Required | Description |
862
+ |---|---|---|---|
863
+ | `body.is_new_list` | `boolean \| null` | no | Give the copy a fresh contacts list instead of reusing the source's. |
864
+ | `body.is_shared` | `boolean \| null` | no | Share setting for the copy. Omit to INHERIT the source's setting - which means duplicating an already-shared nurture still needs Admin/Owner even though this field was never sent. |
865
+ | `body.name` | `string \| null` | no | Name for the copy. Defaults to the source name with ' (Copy)' appended. |
866
+ | `body.new_list_id` | `integer \| null` | no | Existing list for the copy. Ignored unless `is_new_list` is true. |
867
+
868
+ **Returns** `ApiResponse_NurtureResponse_`: the envelope `{ data: NurtureResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
869
+
870
+ Other envelope fields: `pagination` (PaginationMeta).
871
+
872
+ `NurtureResponse` fields:
873
+
874
+ | Field | Type | Required | Description |
875
+ |---|---|---|---|
876
+ | `created_at` | `string (date-time) \| null` | no | |
877
+ | `id` | `string \| null` | no | |
878
+ | `is_shared` | `boolean \| null` | no | True when visible org-wide. |
879
+ | `name` | `string \| null` | no | |
880
+ | `status` | `string \| null` | no | draft, live, paused, completed, terminated. |
881
+ | `updated_at` | `string (date-time) \| null` | no | |
882
+
883
+ **Example**
884
+
885
+ ```ts
886
+ const result = await g8.api.sequences.duplicateNurture({ path: { nurture_id: "id" } });
887
+ ```
888
+
889
+ ---
890
+
891
+ <a id="op-duplicatesequence"></a>
892
+
893
+ ### `g8.api.sequences.duplicateSequence(input)`
894
+
895
+ **Duplicate Sequence**
896
+
897
+ - HTTP: `POST /api/v1/sequences/{sequence_id}/duplicate`
898
+ - operationId: `duplicate_sequence_sequences__sequence_id__duplicate_post` (also callable as `g8.api.call("duplicate_sequence_sequences__sequence_id__duplicate_post", input)`)
899
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
900
+ - API-key scope: `sequences:write`
901
+
902
+ Copy a sequence. The copy is drafted, owned by the caller, no channels.
903
+
904
+ `user_email` is pinned to the caller by the app even if one is sent, which
905
+ is why the request model does not offer it.
906
+
907
+ **Input**
908
+
909
+ | Field | Type | Required | Description |
910
+ |---|---|---|---|
911
+ | `path.sequence_id` | `string` | yes | Sequence id to copy. |
912
+ | `body` | `SequenceDuplicateRequest` | no | Request body; fields below. |
913
+
914
+ Body fields (`SequenceDuplicateRequest`):
915
+
916
+ | Field | Type | Required | Description |
917
+ |---|---|---|---|
918
+ | `body.is_new_list` | `boolean \| null` | no | Give the copy a fresh contacts list instead of the source's. |
919
+ | `body.is_shared` | `boolean \| null` | no | Share setting for the copy. Omit to INHERIT the source's - which means duplicating an already-shared sequence can still require Admin/Owner even though this field was never sent. |
920
+ | `body.name` | `string \| null` | no | Name for the copy. Defaults to the source name with ' (Copy)' appended. |
921
+ | `body.new_list_id` | `integer \| null` | no | Existing list for the copy. Ignored unless `is_new_list` is true. |
922
+
923
+ **Returns** `ApiResponse_SequenceRecord_`: the envelope `{ data: SequenceRecord, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
924
+
925
+ Other envelope fields: `pagination` (PaginationMeta).
926
+
927
+ `SequenceRecord` fields:
928
+
929
+ | Field | Type | Required | Description |
930
+ |---|---|---|---|
931
+ | `associated_list_id` | `integer \| null` | no | |
932
+ | `campaign_builder_campaign_id` | `string \| null` | no | Linked Studio campaign, if any. |
933
+ | `created_at` | `string (date-time) \| null` | no | |
934
+ | `id` | `string \| null` | no | |
935
+ | `is_archived` | `boolean \| null` | no | |
936
+ | `is_shared` | `boolean \| null` | no | |
937
+ | `name` | `string \| null` | no | |
938
+ | `sequence_kind` | `string \| null` | no | |
939
+ | `status` | `string \| null` | no | |
940
+ | `updated_at` | `string (date-time) \| null` | no | |
941
+ | `user_email` | `string \| null` | no | Owner. |
942
+
943
+ **Example**
944
+
945
+ ```ts
946
+ const result = await g8.api.sequences.duplicateSequence({ path: { sequence_id: "id" } });
947
+ ```
948
+
949
+ ---
950
+
951
+ <a id="op-estimateemaildraft"></a>
952
+
953
+ ### `g8.api.sequences.estimateEmailDraft(input)`
954
+
955
+ **Estimate Email Draft**
956
+
957
+ - HTTP: `POST /api/v1/sequencer/content/email/estimate`
958
+ - operationId: `estimate_email_draft_sequencer_content_email_estimate_post` (also callable as `g8.api.call("estimate_email_draft_sequencer_content_email_estimate_post", input)`)
959
+ - Tier: `read`: reads data; safe to call and to retry
960
+ - API-key scope: `sequences:read`
961
+
962
+ What drafting this email WOULD cost, in credits - without drafting it. Free.
963
+
964
+ Takes exactly the body of `.../email/generate`, and builds the identical
965
+ prompt, so the number is what that call is billed. `cached: true` with
966
+ `estimated_credits: 0` means the draft would be served from cache free.
967
+ A 503 means the price list is unavailable - the cost is unknown, not zero.
968
+
969
+ **Input**
970
+
971
+ | Field | Type | Required | Description |
972
+ |---|---|---|---|
973
+ | `body` | `DraftEmailRequest` | yes | Request body; fields below. |
974
+
975
+ Body fields (`DraftEmailRequest`):
976
+
977
+ | Field | Type | Required | Description |
978
+ |---|---|---|---|
979
+ | `body.agent_name` | `string` | yes | The textual agent whose voice and context are used. |
980
+ | `body.contact_id` | `integer` | yes | |
981
+ | `body.contact_work_email` | `string` | yes | |
982
+ | `body.first_name` | `string` | yes | |
983
+ | `body.instructions` | `string` | yes | What the email should do - the step's prompt. |
984
+ | `body.last_name` | `string` | yes | |
985
+ | `body.lead_info` | `string` | yes | What is known about the contact, as free text. |
986
+ | `body.model` | `string \| null` | no | Model slug, from `GET /sequencer/content/email/models`. |
987
+ | `body.provider` | `"openai" \| "anthropic" \| "openrouter" \| null` | no | Model provider, from `GET /sequencer/content/email/models`. |
988
+ | `body.sequence_id` | `string \| null` | no | Draft in the context of this sequence's linked campaign. |
989
+ | `body.step_order` | `integer \| null` | no | |
990
+ | `body.studio_campaign_id` | `string \| null` | no | Draft in this campaign's context; wins over `sequence_id`. |
991
+
992
+ **Returns** `ApiResponse_SequencerPayload_`: the envelope `{ data: SequencerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
993
+
994
+ Other envelope fields: `pagination` (PaginationMeta).
995
+
996
+ **Example**
997
+
998
+ ```ts
999
+ const result = await g8.api.sequences.estimateEmailDraft({
1000
+ body: {
1001
+ agent_name: "Example",
1002
+ contact_id: 123,
1003
+ contact_work_email: "jane@acme.com",
1004
+ first_name: "Example",
1005
+ instructions: "example",
1006
+ last_name: "Example",
1007
+ lead_info: "example",
1008
+ },
1009
+ });
1010
+ ```
1011
+
1012
+ ---
1013
+
1014
+ <a id="op-generatesequencespintax"></a>
1015
+
1016
+ ### `g8.api.sequences.generateSequenceSpintax(input)`
1017
+
1018
+ **Generate Sequence Spintax**
1019
+
1020
+ - HTTP: `POST /api/v1/sequences/generate-spintax`
1021
+ - operationId: `generate_sequence_spintax_sequences_generate_spintax_post` (also callable as `g8.api.call("generate_sequence_spintax_sequences_generate_spintax_post", input)`)
1022
+ - 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
1023
+ - API-key scope: `sequences:run`
1024
+
1025
+ One-time AI generation: rewrite a manual email into spintax.
1026
+
1027
+ Returns the subject + body rewritten with (possibly nested)
1028
+ ``{{option a|option b}}`` blocks; the sequencer's per-contact resolver
1029
+ then sends a different-looking variant to each lead. Content-level and
1030
+ sequence-agnostic: paste the result into any sequence or campaign email
1031
+ step as a MANUAL_TEMPLATE.
1032
+
1033
+ Requires an active subscription and consumes credits (token-metered;
1034
+ 402 on either failure). Synchronous, up to ~2 minutes; per-worker
1035
+ concurrency is capped (429 + Retry-After when saturated). Output is
1036
+ validated server-side (balanced braces, ``{{variables}}`` and links
1037
+ preserved) - invalid model output surfaces as 422, never as silently
1038
+ broken content.
1039
+
1040
+ **Input**
1041
+
1042
+ | Field | Type | Required | Description |
1043
+ |---|---|---|---|
1044
+ | `body` | `GenerateSpintaxRequest` | yes | Request body; fields below. |
1045
+
1046
+ Body fields (`GenerateSpintaxRequest`):
1047
+
1048
+ | Field | Type | Required | Description |
1049
+ |---|---|---|---|
1050
+ | `body.body` | `string` | yes | Email body to rewrite into spintax min length 1, max length 50000 |
1051
+ | `body.subject` | `string` | yes | Email subject to rewrite into spintax min length 1, max length 2000 |
1052
+ | `body.email_type` | `"plain" \| "html"` | no | Body format. 'html' preserves every <a href> link and all {{variables}} in the rewrite. default `"plain"` |
1053
+ | `body.strength` | `"light" \| "balanced" \| "maximum"` | no | Variation intensity: how heavily to vary the copy and how deeply to nest spintax blocks. Each level carries an ENFORCED ceiling on total distinct renderings (subject x body), applied after generation: 'light' up to 200 (flat blocks only), 'balanced' up to 5,000, 'maximum' up to 100,000. Output over the ceiling is trimmed down, never rejected. default `"balanced"` |
1054
+ | `body.tone_instructions` | `string \| null` | no | Optional tone/style guidance applied during the rewrite (e.g. 'casual, no exclamation marks'). max length 2000 |
1055
+
1056
+ **Returns** `ApiResponse_GenerateSpintaxResponse_`: the envelope `{ data: GenerateSpintaxResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1057
+
1058
+ Other envelope fields: `pagination` (PaginationMeta).
1059
+
1060
+ `GenerateSpintaxResponse` fields:
1061
+
1062
+ | Field | Type | Required | Description |
1063
+ |---|---|---|---|
1064
+ | `body` | `string` | yes | Body rewritten with (possibly nested) spintax blocks |
1065
+ | `body_combinations` | `integer` | yes | Distinct renderings the body can produce |
1066
+ | `subject` | `string` | yes | Subject rewritten with {{option a\|option b}} spintax blocks |
1067
+ | `subject_combinations` | `integer` | yes | Distinct renderings the subject can produce |
1068
+ | `total_combinations` | `integer` | yes | Distinct full-email renderings (subject x body) |
1069
+
1070
+ **Example**
1071
+
1072
+ ```ts
1073
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
1074
+ const result = await g8.api.sequences.generateSequenceSpintax({ body: { body: "example", subject: "Example" } });
1075
+ ```
1076
+
1077
+ ---
1078
+
1079
+ <a id="op-generatesteptemplates"></a>
1080
+
1081
+ ### `g8.api.sequences.generateStepTemplates(input)`
1082
+
1083
+ **Generate Step Templates**
1084
+
1085
+ - HTTP: `POST /api/v1/sequencer/templates/steps/generate`
1086
+ - operationId: `generate_step_templates_sequencer_templates_steps_generate_post` (also callable as `g8.api.call("generate_step_templates_sequencer_templates_steps_generate_post", input)`)
1087
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
1088
+ - API-key scope: `sequences:run`
1089
+
1090
+ Have an agent DRAFT step content. Spends credits on every call.
1091
+
1092
+ Nothing is saved - the drafts come back for you to keep with
1093
+ `POST /sequencer/templates/steps` or discard. It runs a full model
1094
+ generation and can take tens of seconds; a 402 means the organisation is
1095
+ out of credits.
1096
+
1097
+ **Input**
1098
+
1099
+ | Field | Type | Required | Description |
1100
+ |---|---|---|---|
1101
+ | `body` | `GenerateStepTemplatesRequest` | yes | Request body; fields below. |
1102
+
1103
+ Body fields (`GenerateStepTemplatesRequest`):
1104
+
1105
+ | Field | Type | Required | Description |
1106
+ |---|---|---|---|
1107
+ | `body.agent_name` | `string` | yes | The agent whose voice and context the drafts use. |
1108
+
1109
+ **Returns** `ApiResponse_SequencerListPayload_`: the envelope `{ data: SequencerListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1110
+
1111
+ Other envelope fields: `pagination` (PaginationMeta).
1112
+
1113
+ `SequencerListPayload` fields:
1114
+
1115
+ | Field | Type | Required | Description |
1116
+ |---|---|---|---|
1117
+ | `items` | `Array<unknown>` | no | |
1118
+
1119
+ **Example**
1120
+
1121
+ ```ts
1122
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
1123
+ const result = await g8.api.sequences.generateStepTemplates({ body: { agent_name: "Example" } });
1124
+ ```
1125
+
1126
+ ---
1127
+
1128
+ <a id="op-getnurture"></a>
1129
+
1130
+ ### `g8.api.sequences.getNurture(input)`
1131
+
1132
+ **Get Nurture**
1133
+
1134
+ - HTTP: `GET /api/v1/nurtures/{nurture_id}`
1135
+ - operationId: `get_nurture_nurtures__nurture_id__get` (also callable as `g8.api.call("get_nurture_nurtures__nurture_id__get", input)`)
1136
+ - Tier: `read`: reads data; safe to call and to retry
1137
+ - API-key scope: `sequences:read`
1138
+
1139
+ Read one nurture. 404s if it is not a nurture, or not yours to see.
1140
+
1141
+ **Input**
1142
+
1143
+ | Field | Type | Required | Description |
1144
+ |---|---|---|---|
1145
+ | `path.nurture_id` | `string` | yes | Nurture id. |
1146
+
1147
+ **Returns** `ApiResponse_NurtureResponse_`: the envelope `{ data: NurtureResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1148
+
1149
+ Other envelope fields: `pagination` (PaginationMeta).
1150
+
1151
+ `NurtureResponse` fields:
1152
+
1153
+ | Field | Type | Required | Description |
1154
+ |---|---|---|---|
1155
+ | `created_at` | `string (date-time) \| null` | no | |
1156
+ | `id` | `string \| null` | no | |
1157
+ | `is_shared` | `boolean \| null` | no | True when visible org-wide. |
1158
+ | `name` | `string \| null` | no | |
1159
+ | `status` | `string \| null` | no | draft, live, paused, completed, terminated. |
1160
+ | `updated_at` | `string (date-time) \| null` | no | |
1161
+
1162
+ **Example**
1163
+
1164
+ ```ts
1165
+ const result = await g8.api.sequences.getNurture({ path: { nurture_id: "id" } });
1166
+ ```
1167
+
1168
+ ---
1169
+
1170
+ <a id="op-getprovidersizing"></a>
1171
+
1172
+ ### `g8.api.sequences.getProviderSizing(input?)`
1173
+
1174
+ **Get Provider Sizing**
1175
+
1176
+ - HTTP: `GET /api/v1/sequencer/deliverability/provider-sizing`
1177
+ - operationId: `get_provider_sizing_sequencer_deliverability_provider_sizing_get` (also callable as `g8.api.call("get_provider_sizing_sequencer_deliverability_provider_sizing_get", input)`)
1178
+ - Tier: `read`: reads data; safe to call and to retry
1179
+ - API-key scope: `sequences:read`
1180
+
1181
+ How the organisation's whole contact corpus splits across mail providers.
1182
+
1183
+ FAIL-OPEN by design: on a backend error it answers all zeros, so all-zero
1184
+ means "could not measure", not "no contacts".
1185
+
1186
+ **Input**: none.
1187
+
1188
+ **Returns** `ApiResponse_SequencerPayload_`: the envelope `{ data: SequencerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1189
+
1190
+ Other envelope fields: `pagination` (PaginationMeta).
1191
+
1192
+ **Example**
1193
+
1194
+ ```ts
1195
+ const result = await g8.api.sequences.getProviderSizing();
1196
+ ```
1197
+
1198
+ ---
1199
+
1200
+ <a id="op-getschedule"></a>
1201
+
1202
+ ### `g8.api.sequences.getSchedule(input)`
1203
+
1204
+ **Get Schedule**
1205
+
1206
+ - HTTP: `GET /api/v1/schedules/{schedule_id}`
1207
+ - operationId: `get_schedule_schedules__schedule_id__get` (also callable as `g8.api.call("get_schedule_schedules__schedule_id__get", input)`)
1208
+ - Tier: `read`: reads data; safe to call and to retry
1209
+ - API-key scope: `campaigns:read`
1210
+
1211
+ One sending schedule, with its full per-day `config`.
1212
+
1213
+ **Input**
1214
+
1215
+ | Field | Type | Required | Description |
1216
+ |---|---|---|---|
1217
+ | `path.schedule_id` | `string` | yes | Schedule id, from `GET /schedules`. |
1218
+
1219
+ **Returns** `ApiResponse_SequencerPayload_`: the envelope `{ data: SequencerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1220
+
1221
+ Other envelope fields: `pagination` (PaginationMeta).
1222
+
1223
+ **Example**
1224
+
1225
+ ```ts
1226
+ const result = await g8.api.sequences.getSchedule({ path: { schedule_id: "id" } });
1227
+ ```
1228
+
1229
+ ---
1230
+
1231
+ <a id="op-getsequence"></a>
1232
+
1233
+ ### `g8.api.sequences.getSequence(input)`
1234
+
1235
+ **Get Sequence**
1236
+
1237
+ - HTTP: `GET /api/v1/sequences/{sequence_id}`
1238
+ - operationId: `get_sequence_sequences__sequence_id__get` (also callable as `g8.api.call("get_sequence_sequences__sequence_id__get", input)`)
1239
+ - Tier: `read`: reads data; safe to call and to retry
1240
+ - API-key scope: `sequences:read`
1241
+ - ★ Hand-written: [`g8.sequences.get()`](../sdk-clients.md#g8-sequences-get)
1242
+
1243
+ Get detailed information about a sequence.
1244
+
1245
+ **Input**
1246
+
1247
+ | Field | Type | Required | Description |
1248
+ |---|---|---|---|
1249
+ | `path.sequence_id` | `string` | yes | Sequence ID |
1250
+
1251
+ **Returns** `ApiResponse_SequenceDetailResponse_`: the envelope `{ data: SequenceDetailResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1252
+
1253
+ Other envelope fields: `pagination` (PaginationMeta).
1254
+
1255
+ `SequenceDetailResponse` fields:
1256
+
1257
+ | Field | Type | Required | Description |
1258
+ |---|---|---|---|
1259
+ | `id` | `string` | yes | |
1260
+ | `appointment_id` | `integer \| null` | no | |
1261
+ | `associated_list_id` | `integer \| null` | no | |
1262
+ | `created_at` | `string \| null` | no | |
1263
+ | `description` | `string \| null` | no | |
1264
+ | `finish_on_reply` | `boolean` | no | default `false` |
1265
+ | `name` | `string \| null` | no | |
1266
+ | `paused_at` | `string \| null` | no | |
1267
+ | `pinned_mailbox_id` | `integer \| null` | no | |
1268
+ | `resumed_at` | `string \| null` | no | |
1269
+ | `schedule_id` | `string \| null` | no | |
1270
+ | `send_in_same_thread` | `boolean` | no | default `false` |
1271
+ | `sequence_kind` | `string \| null` | no | |
1272
+ | `status` | `string \| null` | no | |
1273
+ | `textual_agent_name` | `string \| null` | no | |
1274
+ | `updated_at` | `string \| null` | no | |
1275
+ | `user_email` | `string \| null` | no | |
1276
+ | `voice_agent_name` | `string \| null` | no | |
1277
+ | `wait_for_new_contacts` | `boolean` | no | default `false` |
1278
+
1279
+ **Example**
1280
+
1281
+ ```ts
1282
+ const result = await g8.api.sequences.getSequence({ path: { sequence_id: "id" } });
1283
+ ```
1284
+
1285
+ ---
1286
+
1287
+ <a id="op-getsequencejob"></a>
1288
+
1289
+ ### `g8.api.sequences.getSequenceJob(input)`
1290
+
1291
+ **Get Sequence Job**
1292
+
1293
+ - HTTP: `GET /api/v1/sequence-jobs/{job_id}`
1294
+ - operationId: `get_sequence_job_sequence_jobs__job_id__get` (also callable as `g8.api.call("get_sequence_job_sequence_jobs__job_id__get", input)`)
1295
+ - Tier: `read`: reads data; safe to call and to retry
1296
+ - API-key scope: `sequences:read`
1297
+
1298
+ The status of a background sequence job the org started.
1299
+
1300
+ **Input**
1301
+
1302
+ | Field | Type | Required | Description |
1303
+ |---|---|---|---|
1304
+ | `path.job_id` | `string` | yes | Background job id. |
1305
+
1306
+ **Returns** `ApiResponse_SequenceOpsPayload_`: the envelope `{ data: SequenceOpsPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1307
+
1308
+ Other envelope fields: `pagination` (PaginationMeta).
1309
+
1310
+ **Example**
1311
+
1312
+ ```ts
1313
+ const result = await g8.api.sequences.getSequenceJob({ path: { job_id: "id" } });
1314
+ ```
1315
+
1316
+ ---
1317
+
1318
+ <a id="op-getsequencereports"></a>
1319
+
1320
+ ### `g8.api.sequences.getSequenceReports(input)`
1321
+
1322
+ **Get Sequence Reports**
1323
+
1324
+ - HTTP: `GET /api/v1/sequences/{sequence_id}/reports`
1325
+ - operationId: `get_sequence_reports_sequences__sequence_id__reports_get` (also callable as `g8.api.call("get_sequence_reports_sequences__sequence_id__reports_get", input)`)
1326
+ - Tier: `read`: reads data; safe to call and to retry
1327
+ - API-key scope: `sequences:read`
1328
+
1329
+ A sequence's full report: overview, funnel, engagement, 30-day timeline, distribution.
1330
+
1331
+ **Input**
1332
+
1333
+ | Field | Type | Required | Description |
1334
+ |---|---|---|---|
1335
+ | `path.sequence_id` | `string` | yes | Sequence id. |
1336
+
1337
+ **Returns** `ApiResponse_SequenceOpsPayload_`: the envelope `{ data: SequenceOpsPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1338
+
1339
+ Other envelope fields: `pagination` (PaginationMeta).
1340
+
1341
+ **Example**
1342
+
1343
+ ```ts
1344
+ const result = await g8.api.sequences.getSequenceReports({ path: { sequence_id: "id" } });
1345
+ ```
1346
+
1347
+ ---
1348
+
1349
+ <a id="op-getsequenceroutingsummary"></a>
1350
+
1351
+ ### `g8.api.sequences.getSequenceRoutingSummary(input)`
1352
+
1353
+ **Get Sequence Routing Summary**
1354
+
1355
+ - HTTP: `GET /api/v1/sequences/{sequence_id}/routing-summary`
1356
+ - operationId: `get_sequence_routing_summary_sequences__sequence_id__routing_summary_get` (also callable as `g8.api.call("get_sequence_routing_summary_sequences__sequence_id__routing_summary_get", input)`)
1357
+ - Tier: `read`: reads data; safe to call and to retry
1358
+ - API-key scope: `sequences:read`
1359
+
1360
+ Which providers this sequence's recipients sit behind, and what is suppressed.
1361
+
1362
+ Two properties that change how the answer should be read:
1363
+
1364
+ * APPROXIMATE - it scans up to 10,000 recipients, not all of them.
1365
+ * FAIL-OPEN - on any error every count is zero, so an all-zero summary
1366
+ means "could not compute" just as much as "nothing matched". Do not
1367
+ render it as a confident zero.
1368
+
1369
+ Each recipient lands in exactly ONE bucket, suppression beating routing
1370
+ (bounce > seg > personal), so the buckets partition the scanned set rather
1371
+ than overlapping.
1372
+
1373
+ **Input**
1374
+
1375
+ | Field | Type | Required | Description |
1376
+ |---|---|---|---|
1377
+ | `path.sequence_id` | `string` | yes | Sequence id. |
1378
+
1379
+ **Returns** `ApiResponse_SequenceRoutingSummary_`: the envelope `{ data: SequenceRoutingSummary, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1380
+
1381
+ Other envelope fields: `pagination` (PaginationMeta).
1382
+
1383
+ `SequenceRoutingSummary` fields:
1384
+
1385
+ | Field | Type | Required | Description |
1386
+ |---|---|---|---|
1387
+ | `bounce_suppressed_count` | `integer` | no | default `0` |
1388
+ | `google_count` | `integer` | no | default `0` |
1389
+ | `m365_count` | `integer` | no | default `0` |
1390
+ | `other_count` | `integer` | no | default `0` |
1391
+ | `personal_suppressed_count` | `integer` | no | default `0` |
1392
+ | `scanned_count` | `integer \| null` | no | How many recipients were actually scanned (capped at 10,000). |
1393
+ | `seg_suppressed_count` | `integer` | no | default `0` |
1394
+
1395
+ **Example**
1396
+
1397
+ ```ts
1398
+ const result = await g8.api.sequences.getSequenceRoutingSummary({ path: { sequence_id: "id" } });
1399
+ ```
1400
+
1401
+ ---
1402
+
1403
+ <a id="op-getsequencestats"></a>
1404
+
1405
+ ### `g8.api.sequences.getSequenceStats(input)`
1406
+
1407
+ **Get Sequence Stats**
1408
+
1409
+ - HTTP: `GET /api/v1/sequences/{sequence_id}/stats`
1410
+ - operationId: `get_sequence_stats_sequences__sequence_id__stats_get` (also callable as `g8.api.call("get_sequence_stats_sequences__sequence_id__stats_get", input)`)
1411
+ - Tier: `read`: reads data; safe to call and to retry
1412
+ - API-key scope: `sequences:read`
1413
+
1414
+ Per-step delivery and engagement counts.
1415
+
1416
+ `skip_reason_breakdown` is SEQUENCE-level and counted once per contact, so
1417
+ its total can be LESS than the per-step `skipped` tiles sum to - the
1418
+ durable-LinkedIn-skip cascade writes one receipt per contiguous LinkedIn
1419
+ step, and a skip with no recorded reason is omitted. The two are not meant
1420
+ to reconcile.
1421
+
1422
+ **Input**
1423
+
1424
+ | Field | Type | Required | Description |
1425
+ |---|---|---|---|
1426
+ | `path.sequence_id` | `string` | yes | Sequence id. |
1427
+
1428
+ **Returns** `ApiResponse_SequenceStats_`: the envelope `{ data: SequenceStats, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1429
+
1430
+ Other envelope fields: `pagination` (PaginationMeta).
1431
+
1432
+ `SequenceStats` fields:
1433
+
1434
+ | Field | Type | Required | Description |
1435
+ |---|---|---|---|
1436
+ | `skip_reason_breakdown` | `Record<string, integer>` | no | Distinct terminal-skipped contacts by raw skip-reason token, e.g. `skipped_too_distant`. Sequence-level, counted once per contact. |
1437
+ | `step_stats` | `Array<Record<string, unknown>>` | no | |
1438
+ | `total_contacts` | `integer` | no | default `0` |
1439
+
1440
+ **Example**
1441
+
1442
+ ```ts
1443
+ const result = await g8.api.sequences.getSequenceStats({ path: { sequence_id: "id" } });
1444
+ ```
1445
+
1446
+ ---
1447
+
1448
+ <a id="op-getsequencercapacityestimate"></a>
1449
+
1450
+ ### `g8.api.sequences.getSequencerCapacityEstimate(input)`
1451
+
1452
+ **Get Sequencer Capacity Estimate**
1453
+
1454
+ - HTTP: `GET /api/v1/sequencer/channels/capacity-estimate`
1455
+ - operationId: `get_sequencer_capacity_estimate_sequencer_channels_capacity_estimate_get` (also callable as `g8.api.call("get_sequencer_capacity_estimate_sequencer_channels_capacity_estimate_get", input)`)
1456
+ - Tier: `read`: reads data; safe to call and to retry
1457
+ - API-key scope: `sequences:read`
1458
+
1459
+ How many mailboxes and domains a target volume needs, and what it costs.
1460
+
1461
+ Read-only: it computes an estimate and buys nothing.
1462
+
1463
+ **Input**
1464
+
1465
+ | Field | Type | Required | Description |
1466
+ |---|---|---|---|
1467
+ | `query.contacts_per_month` | `integer` | yes | Target contacts to reach per month. |
1468
+ | `query.warmed` | `boolean` | no | False = cold start (25/day); True = warmed (100/day). default `false` |
1469
+ | `query.domain_tld` | `string` | no | TLD for the per-domain USD cost estimate. default `".com"` |
1470
+
1471
+ **Returns** `ApiResponse_Any_`: the envelope `{ data: unknown, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1472
+
1473
+ Other envelope fields: `pagination` (PaginationMeta).
1474
+
1475
+ **Example**
1476
+
1477
+ ```ts
1478
+ const result = await g8.api.sequences.getSequencerCapacityEstimate({ query: { contacts_per_month: 0 } });
1479
+ ```
1480
+
1481
+ ---
1482
+
1483
+ <a id="op-getsequencesoverview"></a>
1484
+
1485
+ ### `g8.api.sequences.getSequencesOverview(input?)`
1486
+
1487
+ **Get Sequences Overview**
1488
+
1489
+ - HTTP: `GET /api/v1/sequencer/stats`
1490
+ - operationId: `get_sequences_overview_sequencer_stats_get` (also callable as `g8.api.call("get_sequences_overview_sequencer_stats_get", input)`)
1491
+ - Tier: `read`: reads data; safe to call and to retry
1492
+ - API-key scope: `sequences:read`
1493
+
1494
+ Every sequence with its step and contact counts, plus executed-step totals.
1495
+
1496
+ `summary` rolls executed steps up by sequence and step, which is what a
1497
+ dashboard across sequences needs - per-sequence detail is
1498
+ `GET /sequences/{id}/stats`.
1499
+
1500
+ **Input**
1501
+
1502
+ | Field | Type | Required | Description |
1503
+ |---|---|---|---|
1504
+ | `query.is_personal` | `boolean` | no | True: sequences the key owner created. False: the team's SHARED sequences. An organisation key owns none, so `true` answers empty. default `false` |
1505
+
1506
+ **Returns** `ApiResponse_SequencerPayload_`: the envelope `{ data: SequencerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1507
+
1508
+ Other envelope fields: `pagination` (PaginationMeta).
1509
+
1510
+ **Example**
1511
+
1512
+ ```ts
1513
+ const result = await g8.api.sequences.getSequencesOverview();
1514
+ ```
1515
+
1516
+ ---
1517
+
1518
+ <a id="op-improvestepinstruction"></a>
1519
+
1520
+ ### `g8.api.sequences.improveStepInstruction(input)`
1521
+
1522
+ **Improve Step Instruction**
1523
+
1524
+ - HTTP: `POST /api/v1/sequencer/content/instructions/improve`
1525
+ - operationId: `improve_step_instruction_sequencer_content_instructions_improve_post` (also callable as `g8.api.call("improve_step_instruction_sequencer_content_instructions_improve_post", input)`)
1526
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
1527
+ - API-key scope: `sequences:run`
1528
+
1529
+ Rewrite a step's drafting instruction with a model. RUNS A MODEL per call.
1530
+
1531
+ Returns the improved instruction; nothing is saved. Send the current
1532
+ instruction as `old_instruction` so the rewrite keeps its intent.
1533
+
1534
+ **Input**
1535
+
1536
+ | Field | Type | Required | Description |
1537
+ |---|---|---|---|
1538
+ | `body` | `ImproveInstructionRequest` | yes | Request body; fields below. |
1539
+
1540
+ Body fields (`ImproveInstructionRequest`):
1541
+
1542
+ | Field | Type | Required | Description |
1543
+ |---|---|---|---|
1544
+ | `body.user_instruction` | `string` | yes | What the drafting agent should do, in the author's own words. min length 1 |
1545
+ | `body.old_instruction` | `string \| null` | no | The instruction being replaced, so the rewrite keeps its intent. |
1546
+
1547
+ **Returns** `ApiResponse_SequencerPayload_`: the envelope `{ data: SequencerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1548
+
1549
+ Other envelope fields: `pagination` (PaginationMeta).
1550
+
1551
+ **Example**
1552
+
1553
+ ```ts
1554
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
1555
+ const result = await g8.api.sequences.improveStepInstruction({ body: { user_instruction: "example" } });
1556
+ ```
1557
+
1558
+ ---
1559
+
1560
+ <a id="op-launchnurture"></a>
1561
+
1562
+ ### `g8.api.sequences.launchNurture(input)`
1563
+
1564
+ **Launch Nurture**
1565
+
1566
+ - HTTP: `POST /api/v1/nurtures/{nurture_id}/launch`
1567
+ - operationId: `launch_nurture_nurtures__nurture_id__launch_post` (also callable as `g8.api.call("launch_nurture_nurtures__nurture_id__launch_post", input)`)
1568
+ - 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
1569
+ - API-key scope: `sequences:run`
1570
+
1571
+ Launch a nurture. THIS SENDS REAL MESSAGES TO REAL PEOPLE.
1572
+
1573
+ Proxies the same v2 run flow the app's Go-Live button uses, so enrollment,
1574
+ schedule and consent checks are identical.
1575
+
1576
+ WHY THE PATH IS `/launch` AND NOT THE APP'S `/run/v2`
1577
+ -----------------------------------------------------
1578
+ Two reasons, and the second is the load-bearing one.
1579
+
1580
+ The `v2` suffix is noise: v1 was removed on 2026-04-21, so there is nothing
1581
+ left to disambiguate from on a public surface.
1582
+
1583
+ `launch` rather than `run` is what gets this operation the right SCOPE.
1584
+ `build_scope_policy.EXTERNAL_PATH_MARKERS` contains `/launch`, `/send` and
1585
+ `/publish` - the fragments that mean "this reaches the outside world" - and
1586
+ an external-tier operation resolves to the `run` ACTION, so the key needs
1587
+ an explicit `sequences:run` grant rather than plain `sequences:write`. As
1588
+ `/run` this endpoint classified as an ordinary write, one tier below the
1589
+ identical `POST /sequences/{id}/run`, which is external. Sending real email
1590
+ to real people is the definition of external, and the customer issuing a
1591
+ key should be able to grant "edit my nurtures" without granting "start
1592
+ sending".
1593
+
1594
+ **Input**
1595
+
1596
+ | Field | Type | Required | Description |
1597
+ |---|---|---|---|
1598
+ | `path.nurture_id` | `string` | yes | Nurture id. |
1599
+
1600
+ **Returns** `ApiResponse_dict_`: the envelope `{ data: Record<string, unknown>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1601
+
1602
+ Other envelope fields: `pagination` (PaginationMeta).
1603
+
1604
+ **Example**
1605
+
1606
+ ```ts
1607
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
1608
+ const result = await g8.api.sequences.launchNurture({ path: { nurture_id: "id" } });
1609
+ ```
1610
+
1611
+ ---
1612
+
1613
+ <a id="op-linksequencecampaign"></a>
1614
+
1615
+ ### `g8.api.sequences.linkSequenceCampaign(input)`
1616
+
1617
+ **Link Sequence Campaign**
1618
+
1619
+ - HTTP: `PUT /api/v1/sequences/{sequence_id}/campaign`
1620
+ - operationId: `link_sequence_campaign_sequences__sequence_id__campaign_put` (also callable as `g8.api.call("link_sequence_campaign_sequences__sequence_id__campaign_put", input)`)
1621
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
1622
+ - API-key scope: `sequences:write`
1623
+
1624
+ Attach this sequence to a Studio campaign.
1625
+
1626
+ `campaign_id` is declared REQUIRED here. The app takes a bare `dict` and
1627
+ 400s on a missing key - a typed model turns that into a 422 with the field
1628
+ named, which is what a contract is for.
1629
+
1630
+ **Input**
1631
+
1632
+ | Field | Type | Required | Description |
1633
+ |---|---|---|---|
1634
+ | `path.sequence_id` | `string` | yes | Sequence id. |
1635
+ | `body` | `SequenceCampaignLinkRequest` | yes | Request body; fields below. |
1636
+
1637
+ Body fields (`SequenceCampaignLinkRequest`):
1638
+
1639
+ | Field | Type | Required | Description |
1640
+ |---|---|---|---|
1641
+ | `body.campaign_id` | `string` | yes | Studio campaign id to link. |
1642
+
1643
+ **Returns** `ApiResponse_SequenceRecord_`: the envelope `{ data: SequenceRecord, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1644
+
1645
+ Other envelope fields: `pagination` (PaginationMeta).
1646
+
1647
+ `SequenceRecord` fields:
1648
+
1649
+ | Field | Type | Required | Description |
1650
+ |---|---|---|---|
1651
+ | `associated_list_id` | `integer \| null` | no | |
1652
+ | `campaign_builder_campaign_id` | `string \| null` | no | Linked Studio campaign, if any. |
1653
+ | `created_at` | `string (date-time) \| null` | no | |
1654
+ | `id` | `string \| null` | no | |
1655
+ | `is_archived` | `boolean \| null` | no | |
1656
+ | `is_shared` | `boolean \| null` | no | |
1657
+ | `name` | `string \| null` | no | |
1658
+ | `sequence_kind` | `string \| null` | no | |
1659
+ | `status` | `string \| null` | no | |
1660
+ | `updated_at` | `string (date-time) \| null` | no | |
1661
+ | `user_email` | `string \| null` | no | Owner. |
1662
+
1663
+ **Example**
1664
+
1665
+ ```ts
1666
+ const result = await g8.api.sequences.linkSequenceCampaign({ path: { sequence_id: "id" }, body: { campaign_id: "id" } });
1667
+ ```
1668
+
1669
+ ---
1670
+
1671
+ <a id="op-listdialercontacts"></a>
1672
+
1673
+ ### `g8.api.sequences.listDialerContacts(input)`
1674
+
1675
+ **List Dialer Contacts**
1676
+
1677
+ - HTTP: `GET /api/v1/sequencer/dialer/sequences/{sequence_id}/contacts`
1678
+ - operationId: `list_dialer_contacts_sequencer_dialer_sequences__sequence_id__contacts_get` (also callable as `g8.api.call("list_dialer_contacts_sequencer_dialer_sequences__sequence_id__contacts_get", input)`)
1679
+ - Tier: `read`: reads data; safe to call and to retry
1680
+ - API-key scope: `sequences:read`
1681
+
1682
+ The contacts of one dialer sequence with their step progress, paged.
1683
+
1684
+ Carries the sequence's `associated_list_id`, so a caller can go from "who
1685
+ is due a call" to the list they came from without a second lookup.
1686
+
1687
+ **Input**
1688
+
1689
+ | Field | Type | Required | Description |
1690
+ |---|---|---|---|
1691
+ | `path.sequence_id` | `string` | yes | Sequence id. |
1692
+ | `query.limit` | `integer` | no | default `20` |
1693
+ | `query.offset` | `integer` | no | default `0` |
1694
+ | `query.sort_by` | `"created_at" \| "current_step_order" \| "state" \| "current_step_execution_at"` | no | default `"created_at"` |
1695
+ | `query.sort_order` | `"asc" \| "desc"` | no | default `"desc"` |
1696
+ | `query.state` | `string \| null` | no | Only contacts in this state. |
1697
+
1698
+ **Returns** `ApiResponse_SequencerPayload_`: the envelope `{ data: SequencerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1699
+
1700
+ Other envelope fields: `pagination` (PaginationMeta).
1701
+
1702
+ **Example**
1703
+
1704
+ ```ts
1705
+ const result = await g8.api.sequences.listDialerContacts({ path: { sequence_id: "id" } });
1706
+ ```
1707
+
1708
+ ---
1709
+
1710
+ <a id="op-listdialersequences"></a>
1711
+
1712
+ ### `g8.api.sequences.listDialerSequences(input?)`
1713
+
1714
+ **List Dialer Sequences**
1715
+
1716
+ - HTTP: `GET /api/v1/sequencer/dialer/sequences`
1717
+ - operationId: `list_dialer_sequences_sequencer_dialer_sequences_get` (also callable as `g8.api.call("list_dialer_sequences_sequencer_dialer_sequences_get", input)`)
1718
+ - Tier: `read`: reads data; safe to call and to retry
1719
+ - API-key scope: `sequences:read`
1720
+
1721
+ Sequences the dialer can work, each with its steps, paged.
1722
+
1723
+ Filtered by the key's sequence scope exactly as the in-app dropdown is, so
1724
+ a key limited to its own sequences sees only those.
1725
+
1726
+ **Input**
1727
+
1728
+ | Field | Type | Required | Description |
1729
+ |---|---|---|---|
1730
+ | `query.limit` | `integer` | no | default `20` |
1731
+ | `query.offset` | `integer` | no | default `0` |
1732
+ | `query.sort_by` | `"created_at" \| "updated_at" \| "name" \| "status"` | no | default `"created_at"` |
1733
+ | `query.sort_order` | `"asc" \| "desc"` | no | default `"desc"` |
1734
+ | `query.search` | `string \| null` | no | Sequence name contains. |
1735
+ | `query.status` | `string \| null` | no | Only sequences in this status, e.g. `running`. |
1736
+
1737
+ **Returns** `ApiResponse_SequencerPayload_`: the envelope `{ data: SequencerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1738
+
1739
+ Other envelope fields: `pagination` (PaginationMeta).
1740
+
1741
+ **Example**
1742
+
1743
+ ```ts
1744
+ const result = await g8.api.sequences.listDialerSequences();
1745
+ ```
1746
+
1747
+ ---
1748
+
1749
+ <a id="op-listemaildraftmodels"></a>
1750
+
1751
+ ### `g8.api.sequences.listEmailDraftModels(input?)`
1752
+
1753
+ **List Email Draft Models**
1754
+
1755
+ - HTTP: `GET /api/v1/sequencer/content/email/models`
1756
+ - operationId: `list_email_draft_models_sequencer_content_email_models_get` (also callable as `g8.api.call("list_email_draft_models_sequencer_content_email_models_get", input)`)
1757
+ - Tier: `read`: reads data; safe to call and to retry
1758
+ - API-key scope: `sequences:read`
1759
+
1760
+ The models an email draft can use, and which one is the default.
1761
+
1762
+ Pass a row's `provider` and `model` to the draft and estimate routes. Never
1763
+ fails: if the catalog cannot be fetched the built-in default list is
1764
+ returned.
1765
+
1766
+ **Input**: none.
1767
+
1768
+ **Returns** `ApiResponse_SequencerPayload_`: the envelope `{ data: SequencerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1769
+
1770
+ Other envelope fields: `pagination` (PaginationMeta).
1771
+
1772
+ **Example**
1773
+
1774
+ ```ts
1775
+ const result = await g8.api.sequences.listEmailDraftModels();
1776
+ ```
1777
+
1778
+ ---
1779
+
1780
+ <a id="op-listlinkedinaccounts"></a>
1781
+
1782
+ ### `g8.api.sequences.listLinkedinAccounts(input?)`
1783
+
1784
+ **List Linkedin Accounts**
1785
+
1786
+ - HTTP: `GET /api/v1/sequencer/channels/linkedin_accounts`
1787
+ - operationId: `list_linkedin_accounts_sequencer_channels_linkedin_accounts_get` (also callable as `g8.api.call("list_linkedin_accounts_sequencer_channels_linkedin_accounts_get", input)`)
1788
+ - Tier: `read`: reads data; safe to call and to retry
1789
+ - API-key scope: `sequences:read`
1790
+
1791
+ LinkedIn accounts a sequence can send from, bucketed by allocation status.
1792
+
1793
+ The last missing member of the published picker family. The path keeps
1794
+ the family's underscore spelling (`/sequencer/channels/phone_numbers` and
1795
+ its siblings already ship).
1796
+
1797
+ **Input**
1798
+
1799
+ | Field | Type | Required | Description |
1800
+ |---|---|---|---|
1801
+ | `query.exclude_sequence_id` | `string \| null` | no | Treat accounts already allocated to THIS sequence as available. Pass the sequence being edited, or every account it already uses looks taken. |
1802
+
1803
+ **Returns** `ApiResponse_SequencerPayload_`: the envelope `{ data: SequencerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1804
+
1805
+ Other envelope fields: `pagination` (PaginationMeta).
1806
+
1807
+ **Example**
1808
+
1809
+ ```ts
1810
+ const result = await g8.api.sequences.listLinkedinAccounts();
1811
+ ```
1812
+
1813
+ ---
1814
+
1815
+ <a id="op-listnurtures"></a>
1816
+
1817
+ ### `g8.api.sequences.listNurtures(input?)`
1818
+
1819
+ **List Nurtures**
1820
+
1821
+ - HTTP: `GET /api/v1/nurtures`
1822
+ - operationId: `list_nurtures_nurtures_get` (also callable as `g8.api.call("list_nurtures_nurtures_get", input)`)
1823
+ - Tier: `read`: reads data; safe to call and to retry
1824
+ - API-key scope: `sequences:read`
1825
+
1826
+ Nurtures visible to this key - its own plus org-shared.
1827
+
1828
+ No per-record gate here: a LIST is filtered by `sequence_scope` rather than
1829
+ checked row by row, which is the same shape the app uses.
1830
+
1831
+ **Input**
1832
+
1833
+ | Field | Type | Required | Description |
1834
+ |---|---|---|---|
1835
+ | `query.page` | `integer` | no | Page number (1-indexed). default `1` |
1836
+ | `query.limit` | `integer` | no | Items per page (max 200). default `50` |
1837
+
1838
+ **Returns** `ApiResponse_NurtureListResponse_`: the envelope `{ data: NurtureListResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1839
+
1840
+ Other envelope fields: `pagination` (PaginationMeta).
1841
+
1842
+ `NurtureListResponse` fields:
1843
+
1844
+ | Field | Type | Required | Description |
1845
+ |---|---|---|---|
1846
+ | `nurtures` | `Array<NurtureResponse>` | no | |
1847
+ | `total` | `integer` | no | default `0` |
1848
+
1849
+ **Example**
1850
+
1851
+ ```ts
1852
+ const result = await g8.api.sequences.listNurtures();
1853
+ ```
1854
+
1855
+ ---
1856
+
1857
+ <a id="op-listsegvendors"></a>
1858
+
1859
+ ### `g8.api.sequences.listSegVendors(input?)`
1860
+
1861
+ **List Seg Vendors**
1862
+
1863
+ - HTTP: `GET /api/v1/sequencer/deliverability/seg-vendors`
1864
+ - operationId: `list_seg_vendors_sequencer_deliverability_seg_vendors_get` (also callable as `g8.api.call("list_seg_vendors_sequencer_deliverability_seg_vendors_get", input)`)
1865
+ - Tier: `read`: reads data; safe to call and to retry
1866
+ - API-key scope: `sequences:read`
1867
+
1868
+ The secure-email-gateway vendors a vendor-scoped suppression can name.
1869
+
1870
+ Derived from the classifier's own rule table, so every slug listed is one
1871
+ the suppression gate matches. A slug not listed here suppresses nothing.
1872
+
1873
+ **Input**: none.
1874
+
1875
+ **Returns** `ApiResponse_SequencerPayload_`: the envelope `{ data: SequencerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1876
+
1877
+ Other envelope fields: `pagination` (PaginationMeta).
1878
+
1879
+ **Example**
1880
+
1881
+ ```ts
1882
+ const result = await g8.api.sequences.listSegVendors();
1883
+ ```
1884
+
1885
+ ---
1886
+
1887
+ <a id="op-listsequencechannels"></a>
1888
+
1889
+ ### `g8.api.sequences.listSequenceChannels(input)`
1890
+
1891
+ **List Sequence Channels**
1892
+
1893
+ - HTTP: `GET /api/v1/sequences/{sequence_id}/channels`
1894
+ - operationId: `list_sequence_channels_sequences__sequence_id__channels_get` (also callable as `g8.api.call("list_sequence_channels_sequences__sequence_id__channels_get", input)`)
1895
+ - Tier: `read`: reads data; safe to call and to retry
1896
+ - API-key scope: `sequences:read`
1897
+
1898
+ The mailboxes, numbers and accounts this sequence sends from.
1899
+
1900
+ Each row's `id` is the SEQUENCE-CHANNEL id - what the detach routes take -
1901
+ not the mailbox or number id itself (that is `channel_id`).
1902
+
1903
+ **Input**
1904
+
1905
+ | Field | Type | Required | Description |
1906
+ |---|---|---|---|
1907
+ | `path.sequence_id` | `string` | yes | Sequence id. |
1908
+
1909
+ **Returns** `ApiResponse_SequencerListPayload_`: the envelope `{ data: SequencerListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1910
+
1911
+ Other envelope fields: `pagination` (PaginationMeta).
1912
+
1913
+ `SequencerListPayload` fields:
1914
+
1915
+ | Field | Type | Required | Description |
1916
+ |---|---|---|---|
1917
+ | `items` | `Array<unknown>` | no | |
1918
+
1919
+ **Example**
1920
+
1921
+ ```ts
1922
+ const result = await g8.api.sequences.listSequenceChannels({ path: { sequence_id: "id" } });
1923
+ ```
1924
+
1925
+ ---
1926
+
1927
+ <a id="op-listsequencecontactids"></a>
1928
+
1929
+ ### `g8.api.sequences.listSequenceContactIds(input)`
1930
+
1931
+ **List Sequence Contact Ids**
1932
+
1933
+ - HTTP: `GET /api/v1/sequences/{sequence_id}/contact-ids`
1934
+ - operationId: `list_sequence_contact_ids_sequences__sequence_id__contact_ids_get` (also callable as `g8.api.call("list_sequence_contact_ids_sequences__sequence_id__contact_ids_get", input)`)
1935
+ - Tier: `read`: reads data; safe to call and to retry
1936
+ - API-key scope: `sequences:read`
1937
+
1938
+ EVERY contact id in a sequence matching the filters, unpaginated.
1939
+
1940
+ The companion to the paged `GET /sequences/{id}/contacts`, for "act on all
1941
+ of them" without walking pages. The app's AG Grid `filterModel` string is a
1942
+ UI grid's internal format and is not offered; every app parameter not
1943
+ offered here has a default (pinned by a test).
1944
+
1945
+ **Input**
1946
+
1947
+ | Field | Type | Required | Description |
1948
+ |---|---|---|---|
1949
+ | `path.sequence_id` | `string` | yes | Sequence id. |
1950
+ | `query.search` | `string \| null` | no | Free text over name, email and phone. |
1951
+ | `query.state_filter` | `string \| null` | no | Comma-separated states to INCLUDE. |
1952
+ | `query.exclude_states` | `string \| null` | no | Comma-separated states to EXCLUDE; composes with `state_filter`. |
1953
+ | `query.mailbox_filter` | `string \| null` | no | Allocated mailbox contains. |
1954
+ | `query.phone_allocated_filter` | `string \| null` | no | Allocated phone number contains. |
1955
+ | `query.company_filter` | `string \| null` | no | Company name contains. |
1956
+ | `query.step_order_filter` | `integer \| null` | no | Currently at this step order. |
1957
+
1958
+ **Returns** `ApiResponse_SequencerPayload_`: the envelope `{ data: SequencerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1959
+
1960
+ Other envelope fields: `pagination` (PaginationMeta).
1961
+
1962
+ **Example**
1963
+
1964
+ ```ts
1965
+ const result = await g8.api.sequences.listSequenceContactIds({ path: { sequence_id: "id" } });
1966
+ ```
1967
+
1968
+ ---
1969
+
1970
+ <a id="op-listsequencecontacts"></a>
1971
+
1972
+ ### `g8.api.sequences.listSequenceContacts(input)`
1973
+
1974
+ **List Sequence Contacts**
1975
+
1976
+ - HTTP: `GET /api/v1/sequences/{sequence_id}/contacts`
1977
+ - operationId: `list_sequence_contacts_sequences__sequence_id__contacts_get` (also callable as `g8.api.call("list_sequence_contacts_sequences__sequence_id__contacts_get", input)`)
1978
+ - Tier: `read`: reads data; safe to call and to retry
1979
+ - API-key scope: `sequences:read`
1980
+ - ★ Hand-written: [`g8.sequences.contacts()`](../sdk-clients.md#g8-sequences-contacts)
1981
+
1982
+ List contacts in a sequence with pagination.
1983
+
1984
+ **Input**
1985
+
1986
+ | Field | Type | Required | Description |
1987
+ |---|---|---|---|
1988
+ | `path.sequence_id` | `string` | yes | Sequence ID |
1989
+ | `query.page` | `integer` | no | Page number default `1` |
1990
+ | `query.limit` | `integer` | no | Items per page default `50` |
1991
+ | `query.state` | `string \| null` | no | Filter by contact state |
1992
+
1993
+ **Returns** `ApiResponse_list_SequenceContactItem__`: the envelope `{ data: Array<SequenceContactItem>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1994
+
1995
+ Other envelope fields: `pagination` (PaginationMeta).
1996
+
1997
+ `SequenceContactItem` fields:
1998
+
1999
+ | Field | Type | Required | Description |
2000
+ |---|---|---|---|
2001
+ | `contact_id` | `integer \| null` | no | |
2002
+ | `created_at` | `string \| null` | no | |
2003
+ | `current_step_order` | `integer \| null` | no | |
2004
+ | `id` | `string \| null` | no | |
2005
+ | `state` | `string \| null` | no | |
2006
+ | `updated_at` | `string \| null` | no | |
2007
+
2008
+ **Example**
2009
+
2010
+ ```ts
2011
+ const result = await g8.api.sequences.listSequenceContacts({ path: { sequence_id: "id" } });
2012
+ ```
2013
+
2014
+ ---
2015
+
2016
+ <a id="op-listsequencetemplates"></a>
2017
+
2018
+ ### `g8.api.sequences.listSequenceTemplates(input?)`
2019
+
2020
+ **List Sequence Templates**
2021
+
2022
+ - HTTP: `GET /api/v1/sequencer/templates/sequences`
2023
+ - operationId: `list_sequence_templates_sequencer_templates_sequences_get` (also callable as `g8.api.call("list_sequence_templates_sequencer_templates_sequences_get", input)`)
2024
+ - Tier: `read`: reads data; safe to call and to retry
2025
+ - API-key scope: `sequences:read`
2026
+
2027
+ The organisation's sequence templates, INCLUDING archived ones.
2028
+
2029
+ Each row carries `is_archived`; filter on it client-side. Org-SHARED:
2030
+ every key in the organisation sees the same list.
2031
+
2032
+ **Input**: none.
2033
+
2034
+ **Returns** `ApiResponse_SequencerListPayload_`: the envelope `{ data: SequencerListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2035
+
2036
+ Other envelope fields: `pagination` (PaginationMeta).
2037
+
2038
+ `SequencerListPayload` fields:
2039
+
2040
+ | Field | Type | Required | Description |
2041
+ |---|---|---|---|
2042
+ | `items` | `Array<unknown>` | no | |
2043
+
2044
+ **Example**
2045
+
2046
+ ```ts
2047
+ const result = await g8.api.sequences.listSequenceTemplates();
2048
+ ```
2049
+
2050
+ ---
2051
+
2052
+ <a id="op-listsequencermailboxes"></a>
2053
+
2054
+ ### `g8.api.sequences.listSequencerMailboxes(input)`
2055
+
2056
+ **List Sequencer Mailboxes**
2057
+
2058
+ - HTTP: `GET /api/v1/sequencer/channels/mailboxes`
2059
+ - operationId: `list_sequencer_mailboxes_sequencer_channels_mailboxes_get` (also callable as `g8.api.call("list_sequencer_mailboxes_sequencer_channels_mailboxes_get", input)`)
2060
+ - Tier: `read`: reads data; safe to call and to retry
2061
+ - API-key scope: `sequences:read`
2062
+
2063
+ Mailboxes available to send from, annotated as the app annotates them.
2064
+
2065
+ Carries the same warming, daily-capacity, warmup-ready and SURBL-listed
2066
+ annotations the in-app picker shows, so a rebuilt builder can surface the
2067
+ same warnings rather than silently offering a mailbox that cannot send.
2068
+
2069
+ **Input**
2070
+
2071
+ | Field | Type | Required | Description |
2072
+ |---|---|---|---|
2073
+ | `query.email` | `string` | yes | Mailbox email to scope the picker to. |
2074
+ | `query.exclude_sequence_id` | `string \| null` | no | Hide mailboxes already attached to this sequence. |
2075
+ | `query.include_nurture` | `boolean` | no | Include nurture-only mailboxes. default `false` |
2076
+
2077
+ **Returns** `ApiResponse_Any_`: the envelope `{ data: unknown, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2078
+
2079
+ Other envelope fields: `pagination` (PaginationMeta).
2080
+
2081
+ **Example**
2082
+
2083
+ ```ts
2084
+ const result = await g8.api.sequences.listSequencerMailboxes({ query: { email: "jane@acme.com" } });
2085
+ ```
2086
+
2087
+ ---
2088
+
2089
+ <a id="op-listsequencerphonenumbers"></a>
2090
+
2091
+ ### `g8.api.sequences.listSequencerPhoneNumbers(input?)`
2092
+
2093
+ **List Sequencer Phone Numbers**
2094
+
2095
+ - HTTP: `GET /api/v1/sequencer/channels/phone_numbers`
2096
+ - operationId: `list_sequencer_phone_numbers_sequencer_channels_phone_numbers_get` (also callable as `g8.api.call("list_sequencer_phone_numbers_sequencer_channels_phone_numbers_get", input)`)
2097
+ - Tier: `read`: reads data; safe to call and to retry
2098
+ - API-key scope: `sequences:read`
2099
+
2100
+ Voice-capable numbers available to a sequence.
2101
+
2102
+ NOTE these are the VOICE service's numbers, not the CDP `phone_numbers`
2103
+ table behind Settings -> Phone Numbers. Different tables, same word.
2104
+
2105
+ **Input**
2106
+
2107
+ | Field | Type | Required | Description |
2108
+ |---|---|---|---|
2109
+ | `query.exclude_sequence_id` | `string \| null` | no | |
2110
+
2111
+ **Returns** `ApiResponse_Any_`: the envelope `{ data: unknown, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2112
+
2113
+ Other envelope fields: `pagination` (PaginationMeta).
2114
+
2115
+ **Example**
2116
+
2117
+ ```ts
2118
+ const result = await g8.api.sequences.listSequencerPhoneNumbers();
2119
+ ```
2120
+
2121
+ ---
2122
+
2123
+ <a id="op-listsequencersmsnumbers"></a>
2124
+
2125
+ ### `g8.api.sequences.listSequencerSmsNumbers(input?)`
2126
+
2127
+ **List Sequencer Sms Numbers**
2128
+
2129
+ - HTTP: `GET /api/v1/sequencer/channels/sms_numbers`
2130
+ - operationId: `list_sequencer_sms_numbers_sequencer_channels_sms_numbers_get` (also callable as `g8.api.call("list_sequencer_sms_numbers_sequencer_channels_sms_numbers_get", input)`)
2131
+ - Tier: `read`: reads data; safe to call and to retry
2132
+ - API-key scope: `sequences:read`
2133
+
2134
+ SMS-capable numbers, annotated with SMS readiness.
2135
+
2136
+ **Input**
2137
+
2138
+ | Field | Type | Required | Description |
2139
+ |---|---|---|---|
2140
+ | `query.exclude_sequence_id` | `string \| null` | no | |
2141
+
2142
+ **Returns** `ApiResponse_Any_`: the envelope `{ data: unknown, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2143
+
2144
+ Other envelope fields: `pagination` (PaginationMeta).
2145
+
2146
+ **Example**
2147
+
2148
+ ```ts
2149
+ const result = await g8.api.sequences.listSequencerSmsNumbers();
2150
+ ```
2151
+
2152
+ ---
2153
+
2154
+ <a id="op-listsequencertextualagents"></a>
2155
+
2156
+ ### `g8.api.sequences.listSequencerTextualAgents(input?)`
2157
+
2158
+ **List Sequencer Textual Agents**
2159
+
2160
+ - HTTP: `GET /api/v1/sequencer/agents/textual`
2161
+ - operationId: `list_sequencer_textual_agents_sequencer_agents_textual_get` (also callable as `g8.api.call("list_sequencer_textual_agents_sequencer_agents_textual_get", input)`)
2162
+ - Tier: `read`: reads data; safe to call and to retry
2163
+ - API-key scope: `sequences:read`
2164
+
2165
+ Textual agents that can run an email or LinkedIn step.
2166
+
2167
+ **Input**: none.
2168
+
2169
+ **Returns** `ApiResponse_Any_`: the envelope `{ data: unknown, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2170
+
2171
+ Other envelope fields: `pagination` (PaginationMeta).
2172
+
2173
+ **Example**
2174
+
2175
+ ```ts
2176
+ const result = await g8.api.sequences.listSequencerTextualAgents();
2177
+ ```
2178
+
2179
+ ---
2180
+
2181
+ <a id="op-listsequencervoiceagents"></a>
2182
+
2183
+ ### `g8.api.sequences.listSequencerVoiceAgents(input?)`
2184
+
2185
+ **List Sequencer Voice Agents**
2186
+
2187
+ - HTTP: `GET /api/v1/sequencer/agents/voice`
2188
+ - operationId: `list_sequencer_voice_agents_sequencer_agents_voice_get` (also callable as `g8.api.call("list_sequencer_voice_agents_sequencer_agents_voice_get", input)`)
2189
+ - Tier: `read`: reads data; safe to call and to retry
2190
+ - API-key scope: `sequences:read`
2191
+
2192
+ Voice agents that can run a call step.
2193
+
2194
+ Raises the app's own error when the org has no voice subscription, rather
2195
+ than returning an empty list that would read as "no agents configured".
2196
+
2197
+ **Input**
2198
+
2199
+ | Field | Type | Required | Description |
2200
+ |---|---|---|---|
2201
+ | `query.agent_name` | `string \| null` | no | Filter by agent name. |
2202
+
2203
+ **Returns** `ApiResponse_Any_`: the envelope `{ data: unknown, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2204
+
2205
+ Other envelope fields: `pagination` (PaginationMeta).
2206
+
2207
+ **Example**
2208
+
2209
+ ```ts
2210
+ const result = await g8.api.sequences.listSequencerVoiceAgents();
2211
+ ```
2212
+
2213
+ ---
2214
+
2215
+ <a id="op-listsequencerwhatsappnumbers"></a>
2216
+
2217
+ ### `g8.api.sequences.listSequencerWhatsappNumbers(input?)`
2218
+
2219
+ **List Sequencer Whatsapp Numbers**
2220
+
2221
+ - HTTP: `GET /api/v1/sequencer/channels/whatsapp_numbers`
2222
+ - operationId: `list_sequencer_whatsapp_numbers_sequencer_channels_whatsapp_numbers_get` (also callable as `g8.api.call("list_sequencer_whatsapp_numbers_sequencer_channels_whatsapp_numbers_get", input)`)
2223
+ - Tier: `read`: reads data; safe to call and to retry
2224
+ - API-key scope: `sequences:read`
2225
+
2226
+ WhatsApp-enabled numbers.
2227
+
2228
+ **Input**
2229
+
2230
+ | Field | Type | Required | Description |
2231
+ |---|---|---|---|
2232
+ | `query.exclude_sequence_id` | `string \| null` | no | |
2233
+
2234
+ **Returns** `ApiResponse_Any_`: the envelope `{ data: unknown, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2235
+
2236
+ Other envelope fields: `pagination` (PaginationMeta).
2237
+
2238
+ **Example**
2239
+
2240
+ ```ts
2241
+ const result = await g8.api.sequences.listSequencerWhatsappNumbers();
2242
+ ```
2243
+
2244
+ ---
2245
+
2246
+ <a id="op-listsequencerwhatsapptemplates"></a>
2247
+
2248
+ ### `g8.api.sequences.listSequencerWhatsappTemplates(input?)`
2249
+
2250
+ **List Sequencer Whatsapp Templates**
2251
+
2252
+ - HTTP: `GET /api/v1/sequencer/channels/whatsapp_templates`
2253
+ - operationId: `list_sequencer_whatsapp_templates_sequencer_channels_whatsapp_templates_get` (also callable as `g8.api.call("list_sequencer_whatsapp_templates_sequencer_channels_whatsapp_templates_get", input)`)
2254
+ - Tier: `read`: reads data; safe to call and to retry
2255
+ - API-key scope: `sequences:read`
2256
+
2257
+ Approved WhatsApp message templates.
2258
+
2259
+ A WhatsApp step cannot be composed freely - it must reference an approved
2260
+ template, so this is required, not decorative.
2261
+
2262
+ **Input**: none.
2263
+
2264
+ **Returns** `ApiResponse_Any_`: the envelope `{ data: unknown, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2265
+
2266
+ Other envelope fields: `pagination` (PaginationMeta).
2267
+
2268
+ **Example**
2269
+
2270
+ ```ts
2271
+ const result = await g8.api.sequences.listSequencerWhatsappTemplates();
2272
+ ```
2273
+
2274
+ ---
2275
+
2276
+ <a id="op-listsequences"></a>
2277
+
2278
+ ### `g8.api.sequences.listSequences(input?)`
2279
+
2280
+ **List Sequences**
2281
+
2282
+ - HTTP: `GET /api/v1/sequences`
2283
+ - operationId: `list_sequences_sequences_get` (also callable as `g8.api.call("list_sequences_sequences_get", input)`)
2284
+ - Tier: `read`: reads data; safe to call and to retry
2285
+ - API-key scope: `sequences:read`
2286
+
2287
+ List all sequences with optional status / sequence_kind filters.
2288
+
2289
+ **Input**
2290
+
2291
+ | Field | Type | Required | Description |
2292
+ |---|---|---|---|
2293
+ | `query.page` | `integer` | no | Page number default `1` |
2294
+ | `query.limit` | `integer` | no | Items per page default `50` |
2295
+ | `query.status` | `string \| null` | no | Filter by status |
2296
+ | `query.sequence_kind` | `string \| null` | no | Filter by sequence kind ('cold_outbound' or 'nurture'). Omit to list all kinds. |
2297
+
2298
+ **Returns** `ApiResponse_list_SequenceListItem__`: the envelope `{ data: Array<SequenceListItem>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2299
+
2300
+ Other envelope fields: `pagination` (PaginationMeta).
2301
+
2302
+ `SequenceListItem` fields:
2303
+
2304
+ | Field | Type | Required | Description |
2305
+ |---|---|---|---|
2306
+ | `id` | `string` | yes | |
2307
+ | `associated_list_id` | `integer \| null` | no | |
2308
+ | `contact_count` | `integer \| null` | no | |
2309
+ | `created_at` | `string \| null` | no | |
2310
+ | `name` | `string \| null` | no | |
2311
+ | `sequence_kind` | `string \| null` | no | |
2312
+ | `status` | `string \| null` | no | |
2313
+ | `step_count` | `integer \| null` | no | |
2314
+ | `updated_at` | `string \| null` | no | |
2315
+ | `user_email` | `string \| null` | no | |
2316
+
2317
+ **Example**
2318
+
2319
+ ```ts
2320
+ const result = await g8.api.sequences.listSequences();
2321
+ ```
2322
+
2323
+ ---
2324
+
2325
+ <a id="op-liststeptemplates"></a>
2326
+
2327
+ ### `g8.api.sequences.listStepTemplates(input?)`
2328
+
2329
+ **List Step Templates**
2330
+
2331
+ - HTTP: `GET /api/v1/sequencer/templates/steps`
2332
+ - operationId: `list_step_templates_sequencer_templates_steps_get` (also callable as `g8.api.call("list_step_templates_sequencer_templates_steps_get", input)`)
2333
+ - Tier: `read`: reads data; safe to call and to retry
2334
+ - API-key scope: `sequences:read`
2335
+
2336
+ The organisation's reusable step content, archived rows included. Org-SHARED.
2337
+
2338
+ **Input**: none.
2339
+
2340
+ **Returns** `ApiResponse_SequencerListPayload_`: the envelope `{ data: SequencerListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2341
+
2342
+ Other envelope fields: `pagination` (PaginationMeta).
2343
+
2344
+ `SequencerListPayload` fields:
2345
+
2346
+ | Field | Type | Required | Description |
2347
+ |---|---|---|---|
2348
+ | `items` | `Array<unknown>` | no | |
2349
+
2350
+ **Example**
2351
+
2352
+ ```ts
2353
+ const result = await g8.api.sequences.listStepTemplates();
2354
+ ```
2355
+
2356
+ ---
2357
+
2358
+ <a id="op-pausenurture"></a>
2359
+
2360
+ ### `g8.api.sequences.pauseNurture(input)`
2361
+
2362
+ **Pause Nurture**
2363
+
2364
+ - HTTP: `POST /api/v1/nurtures/{nurture_id}/pause`
2365
+ - operationId: `pause_nurture_nurtures__nurture_id__pause_post` (also callable as `g8.api.call("pause_nurture_nurtures__nurture_id__pause_post", input)`)
2366
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2367
+ - API-key scope: `sequences:write`
2368
+
2369
+ Pause a running nurture. Stops further sends; does not terminate it.
2370
+
2371
+ **Input**
2372
+
2373
+ | Field | Type | Required | Description |
2374
+ |---|---|---|---|
2375
+ | `path.nurture_id` | `string` | yes | Nurture id. |
2376
+
2377
+ **Returns** `ApiResponse_dict_`: the envelope `{ data: Record<string, unknown>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2378
+
2379
+ Other envelope fields: `pagination` (PaginationMeta).
2380
+
2381
+ **Example**
2382
+
2383
+ ```ts
2384
+ const result = await g8.api.sequences.pauseNurture({ path: { nurture_id: "id" } });
2385
+ ```
2386
+
2387
+ ---
2388
+
2389
+ <a id="op-pausesequence"></a>
2390
+
2391
+ ### `g8.api.sequences.pauseSequence(input)`
2392
+
2393
+ **Pause Sequence**
2394
+
2395
+ - HTTP: `POST /api/v1/sequences/{sequence_id}/pause`
2396
+ - operationId: `pause_sequence_sequences__sequence_id__pause_post` (also callable as `g8.api.call("pause_sequence_sequences__sequence_id__pause_post", input)`)
2397
+ - 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
2398
+ - API-key scope: `sequences:run`
2399
+ - ★ Hand-written: [`g8.sequences.pause()`](../sdk-clients.md#g8-sequences-pause)
2400
+
2401
+ Pause a live sequence.
2402
+
2403
+ **Input**
2404
+
2405
+ | Field | Type | Required | Description |
2406
+ |---|---|---|---|
2407
+ | `path.sequence_id` | `string` | yes | Sequence ID |
2408
+
2409
+ **Returns** `ApiResponse_SequenceActionResponse_`: the envelope `{ data: SequenceActionResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2410
+
2411
+ Other envelope fields: `pagination` (PaginationMeta).
2412
+
2413
+ `SequenceActionResponse` fields:
2414
+
2415
+ | Field | Type | Required | Description |
2416
+ |---|---|---|---|
2417
+ | `sequence_id` | `string` | yes | |
2418
+ | `status` | `string` | yes | |
2419
+ | `contacts_affected` | `integer` | no | default `0` |
2420
+
2421
+ **Example**
2422
+
2423
+ ```ts
2424
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
2425
+ const result = await g8.api.sequences.pauseSequence({ path: { sequence_id: "id" } });
2426
+ ```
2427
+
2428
+ ---
2429
+
2430
+ <a id="op-pausesequencecontact"></a>
2431
+
2432
+ ### `g8.api.sequences.pauseSequenceContact(input)`
2433
+
2434
+ **Pause Sequence Contact**
2435
+
2436
+ - HTTP: `POST /api/v1/sequences/{sequence_id}/contacts/{contact_id}/pause`
2437
+ - operationId: `pause_sequence_contact_sequences__sequence_id__contacts__contact_id__pause_post` (also callable as `g8.api.call("pause_sequence_contact_sequences__sequence_id__contacts__contact_id__pause_post", input)`)
2438
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2439
+ - API-key scope: `sequences:write`
2440
+
2441
+ Pause one contact in a sequence. Everyone else keeps going.
2442
+
2443
+ **Input**
2444
+
2445
+ | Field | Type | Required | Description |
2446
+ |---|---|---|---|
2447
+ | `path.sequence_id` | `string` | yes | Sequence id. |
2448
+ | `path.contact_id` | `integer` | yes | Contact id. |
2449
+
2450
+ **Returns** `ApiResponse_SequenceOpsPayload_`: the envelope `{ data: SequenceOpsPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2451
+
2452
+ Other envelope fields: `pagination` (PaginationMeta).
2453
+
2454
+ **Example**
2455
+
2456
+ ```ts
2457
+ const result = await g8.api.sequences.pauseSequenceContact({ path: { sequence_id: "id", contact_id: 123 } });
2458
+ ```
2459
+
2460
+ ---
2461
+
2462
+ <a id="op-placevoicetestcall"></a>
2463
+
2464
+ ### `g8.api.sequences.placeVoiceTestCall(input)`
2465
+
2466
+ **Place Voice Test Call**
2467
+
2468
+ - HTTP: `POST /api/v1/sequencer/content/voice/test-call`
2469
+ - operationId: `place_voice_test_call_sequencer_content_voice_test_call_post` (also callable as `g8.api.call("place_voice_test_call_sequencer_content_voice_test_call_post", input)`)
2470
+ - 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
2471
+ - API-key scope: `sequences:run`
2472
+
2473
+ Place ONE real test call from a voice step. A REAL PHONE RINGS.
2474
+
2475
+ The call runs on the organisation's voice plan and is logged as a dry run,
2476
+ not against any contact or sequence enrolment. Returns the call's
2477
+ `room_name`; the outcome arrives through the call logs, not this response.
2478
+ Send an `Idempotency-Key` header so a retried request cannot ring twice.
2479
+
2480
+ **Input**
2481
+
2482
+ | Field | Type | Required | Description |
2483
+ |---|---|---|---|
2484
+ | `body` | `VoiceTestCallRequest` | yes | Request body; fields below. |
2485
+
2486
+ Body fields (`VoiceTestCallRequest`):
2487
+
2488
+ | Field | Type | Required | Description |
2489
+ |---|---|---|---|
2490
+ | `body.agent_id` | `string` | yes | The voice agent that runs the call. min length 1 |
2491
+ | `body.email` | `string` | yes | The test contact's email, as the agent would see it. |
2492
+ | `body.first_name` | `string` | yes | How the agent addresses the person it rings. |
2493
+ | `body.from_phone` | `string` | yes | One of the organisation's numbers to call from. min length 1 |
2494
+ | `body.last_name` | `string` | yes | |
2495
+ | `body.to_phone` | `string` | yes | The number to ring. A REAL phone rings. min length 1 |
2496
+
2497
+ **Returns** `ApiResponse_SequencerPayload_`: the envelope `{ data: SequencerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2498
+
2499
+ Other envelope fields: `pagination` (PaginationMeta).
2500
+
2501
+ **Example**
2502
+
2503
+ ```ts
2504
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
2505
+ const result = await g8.api.sequences.placeVoiceTestCall({
2506
+ body: {
2507
+ agent_id: "id",
2508
+ email: "jane@acme.com",
2509
+ first_name: "Example",
2510
+ from_phone: "+15555550100",
2511
+ last_name: "Example",
2512
+ to_phone: "+15555550100",
2513
+ },
2514
+ });
2515
+ ```
2516
+
2517
+ ---
2518
+
2519
+ <a id="op-recorddialeroutcome"></a>
2520
+
2521
+ ### `g8.api.sequences.recordDialerOutcome(input)`
2522
+
2523
+ **Record Dialer Outcome**
2524
+
2525
+ - HTTP: `POST /api/v1/sequencer/dialer/sequences/{sequence_id}/contacts/{contact_id}/callback`
2526
+ - operationId: `record_dialer_outcome_sequencer_dialer_sequences__sequence_id__contacts__contact_id__callback_post` (also callable as `g8.api.call("record_dialer_outcome_sequencer_dialer_sequences__sequence_id__contacts__contact_id__callback_post", input)`)
2527
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2528
+ - API-key scope: `sequences:write`
2529
+
2530
+ Record that an SDR finished a dialer call, advancing the contact.
2531
+
2532
+ A 400 means the contact is not in this sequence or is not waiting on a
2533
+ dialer step; the message says which.
2534
+
2535
+ **Input**
2536
+
2537
+ | Field | Type | Required | Description |
2538
+ |---|---|---|---|
2539
+ | `path.sequence_id` | `string` | yes | Sequence id. |
2540
+ | `path.contact_id` | `integer` | yes | The contact's integer id in this sequence. |
2541
+ | `body` | `DialerCallbackRequest` | yes | Request body; fields below. |
2542
+
2543
+ Body fields (`DialerCallbackRequest`):
2544
+
2545
+ | Field | Type | Required | Description |
2546
+ |---|---|---|---|
2547
+ | `body.success` | `boolean` | yes | True if the call connected and the contact should advance to the next step; false records an unsuccessful attempt. |
2548
+
2549
+ **Returns** `ApiResponse_SequencerPayload_`: the envelope `{ data: SequencerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2550
+
2551
+ Other envelope fields: `pagination` (PaginationMeta).
2552
+
2553
+ **Example**
2554
+
2555
+ ```ts
2556
+ const result = await g8.api.sequences.recordDialerOutcome({
2557
+ path: { sequence_id: "id", contact_id: 123 },
2558
+ body: { success: true },
2559
+ });
2560
+ ```
2561
+
2562
+ ---
2563
+
2564
+ <a id="op-removesequencechannel"></a>
2565
+
2566
+ ### `g8.api.sequences.removeSequenceChannel(input)`
2567
+
2568
+ **Remove Sequence Channel**
2569
+
2570
+ - HTTP: `DELETE /api/v1/sequences/{sequence_id}/channels/{sequence_channel_id}`
2571
+ - operationId: `remove_sequence_channel_sequences__sequence_id__channels__sequence_channel_id__delete` (also callable as `g8.api.call("remove_sequence_channel_sequences__sequence_id__channels__sequence_channel_id__delete", input)`)
2572
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
2573
+ - API-key scope: `sequences:delete`
2574
+
2575
+ Detach one sender. Answers with the channels that remain.
2576
+
2577
+ Scoped to THIS sequence: a channel id belonging to another sequence
2578
+ detaches nothing. Same 409 as the bulk form.
2579
+
2580
+ **Input**
2581
+
2582
+ | Field | Type | Required | Description |
2583
+ |---|---|---|---|
2584
+ | `path.sequence_id` | `string` | yes | Sequence id. |
2585
+ | `path.sequence_channel_id` | `string` | yes | Sequence-channel id, from `GET .../channels`. |
2586
+
2587
+ **Returns** `ApiResponse_SequencerListPayload_`: the envelope `{ data: SequencerListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2588
+
2589
+ Other envelope fields: `pagination` (PaginationMeta).
2590
+
2591
+ `SequencerListPayload` fields:
2592
+
2593
+ | Field | Type | Required | Description |
2594
+ |---|---|---|---|
2595
+ | `items` | `Array<unknown>` | no | |
2596
+
2597
+ **Example**
2598
+
2599
+ ```ts
2600
+ // destructive: deletes or archives data; confirm with a human before calling.
2601
+ const result = await g8.api.sequences.removeSequenceChannel({ path: { sequence_id: "id", sequence_channel_id: "id" } });
2602
+ ```
2603
+
2604
+ ---
2605
+
2606
+ <a id="op-removesequencechannels"></a>
2607
+
2608
+ ### `g8.api.sequences.removeSequenceChannels(input)`
2609
+
2610
+ **Remove Sequence Channels**
2611
+
2612
+ - HTTP: `DELETE /api/v1/sequences/{sequence_id}/channels`
2613
+ - operationId: `remove_sequence_channels_sequences__sequence_id__channels_delete` (also callable as `g8.api.call("remove_sequence_channels_sequences__sequence_id__channels_delete", input)`)
2614
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
2615
+ - API-key scope: `sequences:delete`
2616
+
2617
+ Detach several senders at once. Answers with the channels that remain.
2618
+
2619
+ A 409 means the detach would leave LinkedIn steps with no LinkedIn sender,
2620
+ which would stop the sequence on its next run - detach the steps first.
2621
+
2622
+ **Input**
2623
+
2624
+ | Field | Type | Required | Description |
2625
+ |---|---|---|---|
2626
+ | `path.sequence_id` | `string` | yes | Sequence id. |
2627
+ | `body` | `RemoveChannelsRequest` | yes | Request body; fields below. |
2628
+
2629
+ Body fields (`RemoveChannelsRequest`):
2630
+
2631
+ | Field | Type | Required | Description |
2632
+ |---|---|---|---|
2633
+ | `body.channel_ids` | `Array<string>` | yes | Sequence-channel ids, from `GET .../channels`. min items 1 |
2634
+
2635
+ **Returns** `ApiResponse_SequencerListPayload_`: the envelope `{ data: SequencerListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2636
+
2637
+ Other envelope fields: `pagination` (PaginationMeta).
2638
+
2639
+ `SequencerListPayload` fields:
2640
+
2641
+ | Field | Type | Required | Description |
2642
+ |---|---|---|---|
2643
+ | `items` | `Array<unknown>` | no | |
2644
+
2645
+ **Example**
2646
+
2647
+ ```ts
2648
+ // destructive: deletes or archives data; confirm with a human before calling.
2649
+ const result = await g8.api.sequences.removeSequenceChannels({ path: { sequence_id: "id" }, body: { channel_ids: ["id"] } });
2650
+ ```
2651
+
2652
+ ---
2653
+
2654
+ <a id="op-resumenurture"></a>
2655
+
2656
+ ### `g8.api.sequences.resumeNurture(input)`
2657
+
2658
+ **Resume Nurture**
2659
+
2660
+ - HTTP: `POST /api/v1/nurtures/{nurture_id}/resume`
2661
+ - operationId: `resume_nurture_nurtures__nurture_id__resume_post` (also callable as `g8.api.call("resume_nurture_nurtures__nurture_id__resume_post", input)`)
2662
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2663
+ - API-key scope: `sequences:write`
2664
+
2665
+ Resume a paused nurture.
2666
+
2667
+ **Input**
2668
+
2669
+ | Field | Type | Required | Description |
2670
+ |---|---|---|---|
2671
+ | `path.nurture_id` | `string` | yes | Nurture id. |
2672
+
2673
+ **Returns** `ApiResponse_dict_`: the envelope `{ data: Record<string, unknown>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2674
+
2675
+ Other envelope fields: `pagination` (PaginationMeta).
2676
+
2677
+ **Example**
2678
+
2679
+ ```ts
2680
+ const result = await g8.api.sequences.resumeNurture({ path: { nurture_id: "id" } });
2681
+ ```
2682
+
2683
+ ---
2684
+
2685
+ <a id="op-resumesequence"></a>
2686
+
2687
+ ### `g8.api.sequences.resumeSequence(input)`
2688
+
2689
+ **Resume Sequence**
2690
+
2691
+ - HTTP: `POST /api/v1/sequences/{sequence_id}/resume`
2692
+ - operationId: `resume_sequence_sequences__sequence_id__resume_post` (also callable as `g8.api.call("resume_sequence_sequences__sequence_id__resume_post", input)`)
2693
+ - 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
2694
+ - API-key scope: `sequences:run`
2695
+ - ★ Hand-written: [`g8.sequences.resume()`](../sdk-clients.md#g8-sequences-resume)
2696
+
2697
+ Resume a paused sequence.
2698
+
2699
+ **Input**
2700
+
2701
+ | Field | Type | Required | Description |
2702
+ |---|---|---|---|
2703
+ | `path.sequence_id` | `string` | yes | Sequence ID |
2704
+
2705
+ **Returns** `ApiResponse_SequenceActionResponse_`: the envelope `{ data: SequenceActionResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2706
+
2707
+ Other envelope fields: `pagination` (PaginationMeta).
2708
+
2709
+ `SequenceActionResponse` fields:
2710
+
2711
+ | Field | Type | Required | Description |
2712
+ |---|---|---|---|
2713
+ | `sequence_id` | `string` | yes | |
2714
+ | `status` | `string` | yes | |
2715
+ | `contacts_affected` | `integer` | no | default `0` |
2716
+
2717
+ **Example**
2718
+
2719
+ ```ts
2720
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
2721
+ const result = await g8.api.sequences.resumeSequence({ path: { sequence_id: "id" } });
2722
+ ```
2723
+
2724
+ ---
2725
+
2726
+ <a id="op-resumesequencecontact"></a>
2727
+
2728
+ ### `g8.api.sequences.resumeSequenceContact(input)`
2729
+
2730
+ **Resume Sequence Contact**
2731
+
2732
+ - HTTP: `POST /api/v1/sequences/{sequence_id}/contacts/{contact_id}/resume`
2733
+ - operationId: `resume_sequence_contact_sequences__sequence_id__contacts__contact_id__resume_post` (also callable as `g8.api.call("resume_sequence_contact_sequences__sequence_id__contacts__contact_id__resume_post", input)`)
2734
+ - 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
2735
+ - API-key scope: `sequences:run`
2736
+
2737
+ Resume a paused contact. Its next step can send.
2738
+
2739
+ **Input**
2740
+
2741
+ | Field | Type | Required | Description |
2742
+ |---|---|---|---|
2743
+ | `path.sequence_id` | `string` | yes | Sequence id. |
2744
+ | `path.contact_id` | `integer` | yes | Contact id. |
2745
+
2746
+ **Returns** `ApiResponse_SequenceOpsPayload_`: the envelope `{ data: SequenceOpsPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2747
+
2748
+ Other envelope fields: `pagination` (PaginationMeta).
2749
+
2750
+ **Example**
2751
+
2752
+ ```ts
2753
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
2754
+ const result = await g8.api.sequences.resumeSequenceContact({ path: { sequence_id: "id", contact_id: 123 } });
2755
+ ```
2756
+
2757
+ ---
2758
+
2759
+ <a id="op-runsequence"></a>
2760
+
2761
+ ### `g8.api.sequences.runSequence(input)`
2762
+
2763
+ **Run Sequence**
2764
+
2765
+ - HTTP: `POST /api/v1/sequences/{sequence_id}/run`
2766
+ - operationId: `run_sequence_sequences__sequence_id__run_post` (also callable as `g8.api.call("run_sequence_sequences__sequence_id__run_post", input)`)
2767
+ - 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
2768
+ - API-key scope: `sequences:run`
2769
+ - ★ Hand-written: [`g8.sequences.run()`](../sdk-clients.md#g8-sequences-run)
2770
+
2771
+ Run/start a drafted sequence using V2 orchestration.
2772
+
2773
+ **Input**
2774
+
2775
+ | Field | Type | Required | Description |
2776
+ |---|---|---|---|
2777
+ | `path.sequence_id` | `string` | yes | Sequence ID |
2778
+
2779
+ **Returns** `ApiResponse_SequenceActionResponse_`: the envelope `{ data: SequenceActionResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2780
+
2781
+ Other envelope fields: `pagination` (PaginationMeta).
2782
+
2783
+ `SequenceActionResponse` fields:
2784
+
2785
+ | Field | Type | Required | Description |
2786
+ |---|---|---|---|
2787
+ | `sequence_id` | `string` | yes | |
2788
+ | `status` | `string` | yes | |
2789
+ | `contacts_affected` | `integer` | no | default `0` |
2790
+
2791
+ **Example**
2792
+
2793
+ ```ts
2794
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
2795
+ const result = await g8.api.sequences.runSequence({ path: { sequence_id: "id" } });
2796
+ ```
2797
+
2798
+ ---
2799
+
2800
+ <a id="op-setsequencestatus"></a>
2801
+
2802
+ ### `g8.api.sequences.setSequenceStatus(input)`
2803
+
2804
+ **Set Sequence Status**
2805
+
2806
+ - HTTP: `POST /api/v1/sequences/{sequence_id}/status`
2807
+ - operationId: `set_sequence_status_sequences__sequence_id__status_post` (also callable as `g8.api.call("set_sequence_status_sequences__sequence_id__status_post", input)`)
2808
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2809
+ - API-key scope: `sequences:write`
2810
+
2811
+ Drive the status machine directly. PREFER THE NAMED TRANSITIONS.
2812
+
2813
+ `/launch`, `/pause`, `/resume`, `/terminate` and `/archive` each run the
2814
+ wind-down, scheduling and event work that belongs to them. This endpoint
2815
+ only SETS THE STATUS, so a sequence moved to `terminated` this way never
2816
+ emits its termination event and its workers are never wound down. It is
2817
+ exposed because the app exposes it and a rebuilt settings panel uses it -
2818
+ not because it is the way to stop a sequence.
2819
+
2820
+ The app's state machine rejects an illegal transition.
2821
+
2822
+ **Input**
2823
+
2824
+ | Field | Type | Required | Description |
2825
+ |---|---|---|---|
2826
+ | `path.sequence_id` | `string` | yes | Sequence id. |
2827
+ | `body` | `SequenceStatusRequest` | yes | Request body; fields below. |
2828
+
2829
+ Body fields (`SequenceStatusRequest`):
2830
+
2831
+ | Field | Type | Required | Description |
2832
+ |---|---|---|---|
2833
+ | `body.status` | `string` | yes | Target status: drafted, scheduling, live, pausing, paused, resuming, terminating, terminated, completed or waiting. Declared as an open string rather than an enum so a status the sequencer adds is not rejected by a stale copy here - the app's own `SequenceStatus` enum is the source of truth and an unknown value comes back as a 422 that LISTS the valid set. |
2834
+
2835
+ **Returns** `ApiResponse_SequenceRecord_`: the envelope `{ data: SequenceRecord, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2836
+
2837
+ Other envelope fields: `pagination` (PaginationMeta).
2838
+
2839
+ `SequenceRecord` fields:
2840
+
2841
+ | Field | Type | Required | Description |
2842
+ |---|---|---|---|
2843
+ | `associated_list_id` | `integer \| null` | no | |
2844
+ | `campaign_builder_campaign_id` | `string \| null` | no | Linked Studio campaign, if any. |
2845
+ | `created_at` | `string (date-time) \| null` | no | |
2846
+ | `id` | `string \| null` | no | |
2847
+ | `is_archived` | `boolean \| null` | no | |
2848
+ | `is_shared` | `boolean \| null` | no | |
2849
+ | `name` | `string \| null` | no | |
2850
+ | `sequence_kind` | `string \| null` | no | |
2851
+ | `status` | `string \| null` | no | |
2852
+ | `updated_at` | `string (date-time) \| null` | no | |
2853
+ | `user_email` | `string \| null` | no | Owner. |
2854
+
2855
+ **Example**
2856
+
2857
+ ```ts
2858
+ const result = await g8.api.sequences.setSequenceStatus({ path: { sequence_id: "id" }, body: { status: "example" } });
2859
+ ```
2860
+
2861
+ ---
2862
+
2863
+ <a id="op-syncsequence"></a>
2864
+
2865
+ ### `g8.api.sequences.syncSequence(input)`
2866
+
2867
+ **Sync Sequence**
2868
+
2869
+ - HTTP: `POST /api/v1/sequences/{sequence_id}/sync`
2870
+ - operationId: `sync_sequence_sequences__sequence_id__sync_post` (also callable as `g8.api.call("sync_sequence_sequences__sequence_id__sync_post", input)`)
2871
+ - 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
2872
+ - API-key scope: `sequences:run`
2873
+
2874
+ Re-pull the associated list so newly-matching contacts enrol.
2875
+
2876
+ This is how a live sequence picks up people added to its list after it
2877
+ started. It enrols real recipients, so it is a write, not a refresh.
2878
+
2879
+ **Input**
2880
+
2881
+ | Field | Type | Required | Description |
2882
+ |---|---|---|---|
2883
+ | `path.sequence_id` | `string` | yes | Sequence id. |
2884
+
2885
+ **Returns** `ApiResponse_dict_`: the envelope `{ data: Record<string, unknown>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2886
+
2887
+ Other envelope fields: `pagination` (PaginationMeta).
2888
+
2889
+ **Example**
2890
+
2891
+ ```ts
2892
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
2893
+ const result = await g8.api.sequences.syncSequence({ path: { sequence_id: "id" } });
2894
+ ```
2895
+
2896
+ ---
2897
+
2898
+ <a id="op-terminatesequence"></a>
2899
+
2900
+ ### `g8.api.sequences.terminateSequence(input)`
2901
+
2902
+ **Terminate Sequence**
2903
+
2904
+ - HTTP: `POST /api/v1/sequences/{sequence_id}/terminate`
2905
+ - operationId: `terminate_sequence_sequences__sequence_id__terminate_post` (also callable as `g8.api.call("terminate_sequence_sequences__sequence_id__terminate_post", input)`)
2906
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2907
+ - API-key scope: `sequences:write`
2908
+
2909
+ End a sequence for good. Enrolled contacts stop; this is not a pause.
2910
+
2911
+ The path drops the app's `-v2` suffix: v1 is gone, so there is nothing
2912
+ left to disambiguate from on a public surface.
2913
+
2914
+ **Input**
2915
+
2916
+ | Field | Type | Required | Description |
2917
+ |---|---|---|---|
2918
+ | `path.sequence_id` | `string` | yes | Sequence id. |
2919
+
2920
+ **Returns** `ApiResponse_dict_`: the envelope `{ data: Record<string, unknown>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2921
+
2922
+ Other envelope fields: `pagination` (PaginationMeta).
2923
+
2924
+ **Example**
2925
+
2926
+ ```ts
2927
+ const result = await g8.api.sequences.terminateSequence({ path: { sequence_id: "id" } });
2928
+ ```
2929
+
2930
+ ---
2931
+
2932
+ <a id="op-unlinksequencecampaign"></a>
2933
+
2934
+ ### `g8.api.sequences.unlinkSequenceCampaign(input)`
2935
+
2936
+ **Unlink Sequence Campaign**
2937
+
2938
+ - HTTP: `DELETE /api/v1/sequences/{sequence_id}/campaign`
2939
+ - operationId: `unlink_sequence_campaign_sequences__sequence_id__campaign_delete` (also callable as `g8.api.call("unlink_sequence_campaign_sequences__sequence_id__campaign_delete", input)`)
2940
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
2941
+ - API-key scope: `sequences:delete`
2942
+
2943
+ Detach the Studio campaign. The sequence and the campaign both survive.
2944
+
2945
+ **Input**
2946
+
2947
+ | Field | Type | Required | Description |
2948
+ |---|---|---|---|
2949
+ | `path.sequence_id` | `string` | yes | Sequence id. |
2950
+
2951
+ **Returns** `ApiResponse_SequenceRecord_`: the envelope `{ data: SequenceRecord, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2952
+
2953
+ Other envelope fields: `pagination` (PaginationMeta).
2954
+
2955
+ `SequenceRecord` fields:
2956
+
2957
+ | Field | Type | Required | Description |
2958
+ |---|---|---|---|
2959
+ | `associated_list_id` | `integer \| null` | no | |
2960
+ | `campaign_builder_campaign_id` | `string \| null` | no | Linked Studio campaign, if any. |
2961
+ | `created_at` | `string (date-time) \| null` | no | |
2962
+ | `id` | `string \| null` | no | |
2963
+ | `is_archived` | `boolean \| null` | no | |
2964
+ | `is_shared` | `boolean \| null` | no | |
2965
+ | `name` | `string \| null` | no | |
2966
+ | `sequence_kind` | `string \| null` | no | |
2967
+ | `status` | `string \| null` | no | |
2968
+ | `updated_at` | `string (date-time) \| null` | no | |
2969
+ | `user_email` | `string \| null` | no | Owner. |
2970
+
2971
+ **Example**
2972
+
2973
+ ```ts
2974
+ // destructive: deletes or archives data; confirm with a human before calling.
2975
+ const result = await g8.api.sequences.unlinkSequenceCampaign({ path: { sequence_id: "id" } });
2976
+ ```
2977
+
2978
+ ---
2979
+
2980
+ <a id="op-updatenurture"></a>
2981
+
2982
+ ### `g8.api.sequences.updateNurture(input)`
2983
+
2984
+ **Update Nurture**
2985
+
2986
+ - HTTP: `PATCH /api/v1/nurtures/{nurture_id}`
2987
+ - operationId: `update_nurture_nurtures__nurture_id__patch` (also callable as `g8.api.call("update_nurture_nurtures__nurture_id__patch", input)`)
2988
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2989
+ - API-key scope: `sequences:write`
2990
+
2991
+ Patch a nurture. Omitted fields are left alone.
2992
+
2993
+ `exclude_unset` rather than `exclude_none`: the app distinguishes "field
2994
+ absent" from "field explicitly set to null", and collapsing the two would
2995
+ make it impossible to clear an optional field such as `schedule_id`.
2996
+
2997
+ **Input**
2998
+
2999
+ | Field | Type | Required | Description |
3000
+ |---|---|---|---|
3001
+ | `path.nurture_id` | `string` | yes | Nurture id. |
3002
+ | `body` | `NurtureUpdateRequest` | yes | Request body; fields below. |
3003
+
3004
+ Body fields (`NurtureUpdateRequest`):
3005
+
3006
+ | Field | Type | Required | Description |
3007
+ |---|---|---|---|
3008
+ | `body.appointment_id` | `integer \| null` | no | |
3009
+ | `body.associated_list_id` | `integer \| null` | no | |
3010
+ | `body.description` | `string \| null` | no | |
3011
+ | `body.finish_on_reply` | `boolean \| null` | no | |
3012
+ | `body.include_unsubscribe_cta` | `boolean \| null` | no | |
3013
+ | `body.is_shared` | `boolean \| null` | no | Set true to promote the nurture to org scope. Admin/Owner only - this is the one field on this model that is permission-gated. |
3014
+ | `body.name` | `string \| null` | no | |
3015
+ | `body.schedule_id` | `string \| null` | no | |
3016
+ | `body.send_in_same_thread` | `boolean \| null` | no | |
3017
+ | `body.textual_agent_name` | `string \| null` | no | |
3018
+ | `body.voice_agent_name` | `string \| null` | no | |
3019
+ | `body.wait_for_new_contacts` | `boolean \| null` | no | |
3020
+
3021
+ **Returns** `ApiResponse_NurtureResponse_`: the envelope `{ data: NurtureResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3022
+
3023
+ Other envelope fields: `pagination` (PaginationMeta).
3024
+
3025
+ `NurtureResponse` fields:
3026
+
3027
+ | Field | Type | Required | Description |
3028
+ |---|---|---|---|
3029
+ | `created_at` | `string (date-time) \| null` | no | |
3030
+ | `id` | `string \| null` | no | |
3031
+ | `is_shared` | `boolean \| null` | no | True when visible org-wide. |
3032
+ | `name` | `string \| null` | no | |
3033
+ | `status` | `string \| null` | no | draft, live, paused, completed, terminated. |
3034
+ | `updated_at` | `string (date-time) \| null` | no | |
3035
+
3036
+ **Example**
3037
+
3038
+ ```ts
3039
+ const result = await g8.api.sequences.updateNurture({ path: { nurture_id: "id" }, body: {} });
3040
+ ```
3041
+
3042
+ ---
3043
+
3044
+ <a id="op-updateschedule"></a>
3045
+
3046
+ ### `g8.api.sequences.updateSchedule(input)`
3047
+
3048
+ **Update Schedule**
3049
+
3050
+ - HTTP: `PATCH /api/v1/schedules/{schedule_id}`
3051
+ - operationId: `update_schedule_schedules__schedule_id__patch` (also callable as `g8.api.call("update_schedule_schedules__schedule_id__patch", input)`)
3052
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
3053
+ - API-key scope: `campaigns:write`
3054
+
3055
+ Change a schedule's name, timezone or windows. Only what you send is written.
3056
+
3057
+ SHARED: this retimes EVERY sequence using the schedule, not one. `config`,
3058
+ when sent, replaces the whole week - a day omitted from it stops sending.
3059
+
3060
+ **Input**
3061
+
3062
+ | Field | Type | Required | Description |
3063
+ |---|---|---|---|
3064
+ | `path.schedule_id` | `string` | yes | Schedule id, from `GET /schedules`. |
3065
+ | `body` | `UpdateSendingScheduleRequest` | yes | Request body; fields below. |
3066
+
3067
+ Body fields (`UpdateSendingScheduleRequest`):
3068
+
3069
+ | Field | Type | Required | Description |
3070
+ |---|---|---|---|
3071
+ | `body.config` | `SendingWeek \| null` | no | |
3072
+ | `body.description` | `string \| null` | no | max length 1024 |
3073
+ | `body.name` | `string \| null` | no | max length 255 |
3074
+ | `body.timezone` | `string \| null` | no | max length 128 |
3075
+
3076
+ **Returns** `ApiResponse_SequencerPayload_`: the envelope `{ data: SequencerPayload, ... }`. `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
+ const result = await g8.api.sequences.updateSchedule({ path: { schedule_id: "id" }, body: {} });
3084
+ ```
3085
+
3086
+ ---
3087
+
3088
+ <a id="op-updatesequencetemplate"></a>
3089
+
3090
+ ### `g8.api.sequences.updateSequenceTemplate(input)`
3091
+
3092
+ **Update Sequence Template**
3093
+
3094
+ - HTTP: `PATCH /api/v1/sequencer/templates/sequences/{sequence_template_id}`
3095
+ - operationId: `update_sequence_template_sequencer_templates_sequences__sequence_template_id__patch` (also callable as `g8.api.call("update_sequence_template_sequencer_templates_sequences__sequence_template_id__patch", input)`)
3096
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
3097
+ - API-key scope: `sequences:write`
3098
+
3099
+ Change a sequence template. Only what you send is written; an unknown id is a 404.
3100
+
3101
+ **Input**
3102
+
3103
+ | Field | Type | Required | Description |
3104
+ |---|---|---|---|
3105
+ | `path.sequence_template_id` | `string` | yes | Sequence template id. |
3106
+ | `body` | `UpdateSequenceTemplateRequest` | yes | Request body; fields below. |
3107
+
3108
+ Body fields (`UpdateSequenceTemplateRequest`):
3109
+
3110
+ | Field | Type | Required | Description |
3111
+ |---|---|---|---|
3112
+ | `body.appointment_id` | `integer \| null` | no | |
3113
+ | `body.description` | `string \| null` | no | |
3114
+ | `body.name` | `string \| null` | no | |
3115
+ | `body.schedule_id` | `string \| null` | no | |
3116
+ | `body.steps` | `Array<SequenceTemplateStep> \| null` | no | |
3117
+ | `body.textual_agent_name` | `string \| null` | no | |
3118
+ | `body.voice_agent_name` | `string \| null` | no | |
3119
+
3120
+ **Returns** `ApiResponse_SequencerPayload_`: the envelope `{ data: SequencerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3121
+
3122
+ Other envelope fields: `pagination` (PaginationMeta).
3123
+
3124
+ **Example**
3125
+
3126
+ ```ts
3127
+ const result = await g8.api.sequences.updateSequenceTemplate({ path: { sequence_template_id: "id" }, body: {} });
3128
+ ```
3129
+
3130
+ ---
3131
+
3132
+ <a id="op-updatesteptemplate"></a>
3133
+
3134
+ ### `g8.api.sequences.updateStepTemplate(input)`
3135
+
3136
+ **Update Step Template**
3137
+
3138
+ - HTTP: `PATCH /api/v1/sequencer/templates/steps/{step_template_id}`
3139
+ - operationId: `update_step_template_sequencer_templates_steps__step_template_id__patch` (also callable as `g8.api.call("update_step_template_sequencer_templates_steps__step_template_id__patch", input)`)
3140
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
3141
+ - API-key scope: `sequences:write`
3142
+
3143
+ Change a step template. An unknown id is a 404.
3144
+
3145
+ **Input**
3146
+
3147
+ | Field | Type | Required | Description |
3148
+ |---|---|---|---|
3149
+ | `path.step_template_id` | `string` | yes | Step template id. |
3150
+ | `body` | `UpdateStepTemplateRequest` | yes | Request body; fields below. |
3151
+
3152
+ Body fields (`UpdateStepTemplateRequest`):
3153
+
3154
+ | Field | Type | Required | Description |
3155
+ |---|---|---|---|
3156
+ | `body.name` | `string \| null` | no | |
3157
+ | `body.step_data` | `Record<string, unknown> \| null` | no | |
3158
+ | `body.step_type` | `"PHONE" \| "EMAIL" \| "MANUAL_DIALER" \| "HEYREACH" \| "NETRION" \| "SMS" \| "WHATSAPP" \| null` | no | |
3159
+
3160
+ **Returns** `ApiResponse_SequencerPayload_`: the envelope `{ data: SequencerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3161
+
3162
+ Other envelope fields: `pagination` (PaginationMeta).
3163
+
3164
+ **Example**
3165
+
3166
+ ```ts
3167
+ const result = await g8.api.sequences.updateStepTemplate({ path: { step_template_id: "id" }, body: {} });
3168
+ ```
3169
+
3170
+ ---
3171
+
3172
+ ## Referenced types
3173
+
3174
+ Named types that appear in the tables above. Full TypeScript definitions: `G8Contract.<Name>` (`import type { G8Contract } from "@graph8/sdk"`).
3175
+
3176
+ <a id="type-addchannelitem"></a>
3177
+
3178
+ ### `AddChannelItem`
3179
+
3180
+ One sender to attach. Mirrors `AddChannelPayload` minus the client `id`.
3181
+
3182
+ | Field | Type | Required | Description |
3183
+ |---|---|---|---|
3184
+ | `channel_id` | `integer` | yes | The sender's INTEGER id - a mailbox, number or account. |
3185
+ | `channel_type` | `"SMTP" \| "GMAIL" \| "INBOXKIT" \| "PHONE" \| "LINKEDIN" \| "LINKEDIN_NETRION" \| "SMS" \| "WHATSAPP"` | yes | |
3186
+ | `channel_value` | `string` | yes | Its address: the email, phone number or profile. |
3187
+ | `channel_data` | `Record<string, unknown> \| null` | no | |
3188
+
3189
+ <a id="type-addstepitem"></a>
3190
+
3191
+ ### `AddStepItem`
3192
+
3193
+ One step to add. Mirrors `CreateStepPayload` minus the client `id`.
3194
+
3195
+ | Field | Type | Required | Description |
3196
+ |---|---|---|---|
3197
+ | `input_type` | `"ON_DEMAND" \| "AI_GENERATED_TEMPLATE" \| "MANUAL_TEMPLATE"` | yes | |
3198
+ | `step_data` | `Record<string, unknown>` | yes | The step's content, the same shape as `step_data` on `GET /sequences/{sequence_id}/steps`: `subject` / `body` for email, `message_body` for SMS and WhatsApp, the `linkedin_*` fields for LinkedIn, `instructions` for AI generation. |
3199
+ | `step_order` | `integer` | yes | Position in the sequence, 1-based. |
3200
+ | `step_type` | `"PHONE" \| "EMAIL" \| "MANUAL_DIALER" \| "HEYREACH" \| "NETRION" \| "SMS" \| "WHATSAPP"` | yes | |
3201
+ | `time_interval` | `integer \| null` | no | Seconds after the previous step. |
3202
+
3203
+ <a id="type-sendingweek"></a>
3204
+
3205
+ ### `SendingWeek`
3206
+
3207
+ The weekly window. A day left out is a day nothing is sent.
3208
+
3209
+ | Field | Type | Required | Description |
3210
+ |---|---|---|---|
3211
+ | `friday` | `SendingWindow \| null` | no | |
3212
+ | `monday` | `SendingWindow \| null` | no | |
3213
+ | `saturday` | `SendingWindow \| null` | no | |
3214
+ | `sunday` | `SendingWindow \| null` | no | |
3215
+ | `thursday` | `SendingWindow \| null` | no | |
3216
+ | `tuesday` | `SendingWindow \| null` | no | |
3217
+ | `wednesday` | `SendingWindow \| null` | no | |
3218
+
3219
+ <a id="type-sequencetemplatestep"></a>
3220
+
3221
+ ### `SequenceTemplateStep`
3222
+
3223
+ One step of a sequence template. Mirrors `SequenceTemplateStep`.
3224
+
3225
+ | Field | Type | Required | Description |
3226
+ |---|---|---|---|
3227
+ | `input_type` | `"ON_DEMAND" \| "AI_GENERATED_TEMPLATE" \| "MANUAL_TEMPLATE"` | yes | |
3228
+ | `name` | `string` | yes | |
3229
+ | `step_data` | `Record<string, unknown>` | yes | The step's content: `subject` / `body` for email, `message_body` for SMS and WhatsApp, the `linkedin_*` fields for LinkedIn, `instructions` for AI generation. The same shape as `step_data` on `GET /sequences/{sequence_id}/steps`. |
3230
+ | `step_order` | `integer` | yes | |
3231
+ | `step_type` | `"PHONE" \| "EMAIL" \| "MANUAL_DIALER" \| "HEYREACH" \| "NETRION" \| "SMS" \| "WHATSAPP"` | yes | |
3232
+ | `time_interval` | `integer \| null` | no | Seconds after the previous step. |