@graph8/sdk 0.251.0 → 0.262.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. package/README.md +9 -2
  2. package/dist/cli.js +216 -0
  3. package/dist/index.d.mts +105 -7
  4. package/dist/index.d.ts +105 -7
  5. package/dist/index.js +44 -3
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.mjs +44 -3
  8. package/dist/index.mjs.map +1 -1
  9. package/dist/react.d.mts +103 -7
  10. package/dist/react.d.ts +103 -7
  11. package/dist/react.js +62 -11
  12. package/dist/react.js.map +1 -1
  13. package/dist/react.mjs +53 -12
  14. package/dist/react.mjs.map +1 -1
  15. package/dist/types/README.md +7 -0
  16. package/dist/types/agency.d.ts +20 -0
  17. package/dist/types/agentSetup.d.ts +57 -0
  18. package/dist/types/api.d.ts +127 -0
  19. package/dist/types/appClient.d.ts +99 -0
  20. package/dist/types/appPlatform.d.ts +269 -0
  21. package/dist/types/appTokens.d.ts +125 -0
  22. package/dist/types/apps.d.ts +130 -0
  23. package/dist/types/audiences.d.ts +88 -0
  24. package/dist/types/calendar.d.ts +55 -0
  25. package/dist/types/campaigns.d.ts +61 -0
  26. package/dist/types/chat.d.ts +35 -0
  27. package/dist/types/cli.d.ts +14 -0
  28. package/dist/types/companies.d.ts +123 -0
  29. package/dist/types/contacts.d.ts +200 -0
  30. package/dist/types/copilot.d.ts +31 -0
  31. package/dist/types/core.d.ts +1052 -0
  32. package/dist/types/deals.d.ts +215 -0
  33. package/dist/types/enrich.d.ts +51 -0
  34. package/dist/types/fields.d.ts +84 -0
  35. package/dist/types/forms.d.ts +16 -0
  36. package/dist/types/http.d.ts +141 -0
  37. package/dist/types/inbox.d.ts +123 -0
  38. package/dist/types/index.d.ts +63 -0
  39. package/dist/types/intent.d.ts +196 -0
  40. package/dist/types/lists.d.ts +44 -0
  41. package/dist/types/mailboxes.d.ts +240 -0
  42. package/dist/types/marketplace.d.ts +62 -0
  43. package/dist/types/meetings.d.ts +70 -0
  44. package/dist/types/newsletter.d.ts +212 -0
  45. package/dist/types/notes.d.ts +57 -0
  46. package/dist/types/objects.d.ts +281 -0
  47. package/dist/types/pipelines.d.ts +135 -0
  48. package/dist/types/quotes.d.ts +143 -0
  49. package/dist/types/react.d.ts +978 -0
  50. package/dist/types/search.d.ts +99 -0
  51. package/dist/types/sequences.d.ts +255 -0
  52. package/dist/types/signals.d.ts +28 -0
  53. package/dist/types/skills.d.ts +176 -0
  54. package/dist/types/snippet.d.ts +24 -0
  55. package/dist/types/studio.d.ts +161 -0
  56. package/dist/types/tasks.d.ts +101 -0
  57. package/dist/types/types.d.ts +45 -0
  58. package/dist/types/utils.d.ts +21 -0
  59. package/dist/types/version.d.ts +10 -0
  60. package/dist/types/visitors.d.ts +29 -0
  61. package/dist/types/voice.d.ts +304 -0
  62. package/dist/types/webhooks.d.ts +71 -0
  63. package/dist/types/workflows.d.ts +229 -0
  64. package/docs/agents.md +748 -0
  65. package/docs/api/README.md +165 -0
  66. package/docs/api/accounts.d.ts +396 -0
  67. package/docs/api/accounts.md +644 -0
  68. package/docs/api/adCampaigns.d.ts +707 -0
  69. package/docs/api/adCampaigns.md +1091 -0
  70. package/docs/api/adCreatives.d.ts +996 -0
  71. package/docs/api/adCreatives.md +1708 -0
  72. package/docs/api/agency.d.ts +556 -0
  73. package/docs/api/agency.md +845 -0
  74. package/docs/api/agent.d.ts +330 -0
  75. package/docs/api/agent.md +514 -0
  76. package/docs/api/agents.d.ts +1622 -0
  77. package/docs/api/agents.md +2860 -0
  78. package/docs/api/aiInbox.d.ts +1984 -0
  79. package/docs/api/aiInbox.md +3490 -0
  80. package/docs/api/analytics.d.ts +1273 -0
  81. package/docs/api/analytics.md +2095 -0
  82. package/docs/api/apiKeys.d.ts +252 -0
  83. package/docs/api/apiKeys.md +318 -0
  84. package/docs/api/appDeployments.d.ts +236 -0
  85. package/docs/api/appDeployments.md +471 -0
  86. package/docs/api/appDomains.d.ts +171 -0
  87. package/docs/api/appDomains.md +281 -0
  88. package/docs/api/appLogs.d.ts +120 -0
  89. package/docs/api/appLogs.md +159 -0
  90. package/docs/api/appObjects.d.ts +415 -0
  91. package/docs/api/appObjects.md +568 -0
  92. package/docs/api/appPages.d.ts +557 -0
  93. package/docs/api/appPages.md +796 -0
  94. package/docs/api/appPlatformTokens.d.ts +123 -0
  95. package/docs/api/appPlatformTokens.md +172 -0
  96. package/docs/api/appointments.d.ts +2361 -0
  97. package/docs/api/appointments.md +3917 -0
  98. package/docs/api/apps.d.ts +822 -0
  99. package/docs/api/apps.md +1342 -0
  100. package/docs/api/assertUpsert.d.ts +286 -0
  101. package/docs/api/assertUpsert.md +370 -0
  102. package/docs/api/audienceSyncs.d.ts +259 -0
  103. package/docs/api/audienceSyncs.md +395 -0
  104. package/docs/api/brandKit.d.ts +686 -0
  105. package/docs/api/brandKit.md +1133 -0
  106. package/docs/api/bugReports.d.ts +181 -0
  107. package/docs/api/bugReports.md +268 -0
  108. package/docs/api/by-path.md +3260 -0
  109. package/docs/api/calendarInvites.d.ts +117 -0
  110. package/docs/api/calendarInvites.md +148 -0
  111. package/docs/api/campaignWorkflows.d.ts +152 -0
  112. package/docs/api/campaignWorkflows.md +200 -0
  113. package/docs/api/campaigns.d.ts +721 -0
  114. package/docs/api/campaigns.md +1236 -0
  115. package/docs/api/channels.d.ts +171 -0
  116. package/docs/api/channels.md +235 -0
  117. package/docs/api/cliCampaigns.d.ts +205 -0
  118. package/docs/api/cliCampaigns.md +256 -0
  119. package/docs/api/cliPipelines.d.ts +324 -0
  120. package/docs/api/cliPipelines.md +562 -0
  121. package/docs/api/clickHouse.d.ts +115 -0
  122. package/docs/api/clickHouse.md +138 -0
  123. package/docs/api/companies.d.ts +1636 -0
  124. package/docs/api/companies.md +2211 -0
  125. package/docs/api/companyIntelligence.d.ts +299 -0
  126. package/docs/api/companyIntelligence.md +488 -0
  127. package/docs/api/contacts.d.ts +2173 -0
  128. package/docs/api/contacts.md +3143 -0
  129. package/docs/api/content.d.ts +968 -0
  130. package/docs/api/content.md +1667 -0
  131. package/docs/api/contentGridSkills.d.ts +177 -0
  132. package/docs/api/contentGridSkills.md +271 -0
  133. package/docs/api/copilot.d.ts +1017 -0
  134. package/docs/api/copilot.md +1765 -0
  135. package/docs/api/crmSyncs.d.ts +215 -0
  136. package/docs/api/crmSyncs.md +301 -0
  137. package/docs/api/customerSuccess.d.ts +491 -0
  138. package/docs/api/customerSuccess.md +776 -0
  139. package/docs/api/deals.d.ts +1697 -0
  140. package/docs/api/deals.md +2436 -0
  141. package/docs/api/deliverability.d.ts +418 -0
  142. package/docs/api/deliverability.md +677 -0
  143. package/docs/api/desk.d.ts +1765 -0
  144. package/docs/api/desk.md +3007 -0
  145. package/docs/api/dialer.d.ts +1185 -0
  146. package/docs/api/dialer.md +2166 -0
  147. package/docs/api/dialerAnalytics.d.ts +187 -0
  148. package/docs/api/dialerAnalytics.md +257 -0
  149. package/docs/api/documents.d.ts +895 -0
  150. package/docs/api/documents.md +1440 -0
  151. package/docs/api/duplicates.d.ts +195 -0
  152. package/docs/api/duplicates.md +315 -0
  153. package/docs/api/eSign.d.ts +38 -0
  154. package/docs/api/eSign.md +54 -0
  155. package/docs/api/eSignature.d.ts +242 -0
  156. package/docs/api/eSignature.md +341 -0
  157. package/docs/api/enrichment.d.ts +3207 -0
  158. package/docs/api/enrichment.md +5225 -0
  159. package/docs/api/events.d.ts +115 -0
  160. package/docs/api/events.md +105 -0
  161. package/docs/api/fields.d.ts +482 -0
  162. package/docs/api/fields.md +566 -0
  163. package/docs/api/forms.d.ts +1012 -0
  164. package/docs/api/forms.md +1542 -0
  165. package/docs/api/gtmCampaigns.d.ts +662 -0
  166. package/docs/api/gtmCampaigns.md +1044 -0
  167. package/docs/api/gtmContext.d.ts +1187 -0
  168. package/docs/api/gtmContext.md +2112 -0
  169. package/docs/api/gtmDeliverability.d.ts +60 -0
  170. package/docs/api/gtmDeliverability.md +63 -0
  171. package/docs/api/gtmKnowledgeBase.d.ts +76 -0
  172. package/docs/api/gtmKnowledgeBase.md +91 -0
  173. package/docs/api/gtmLaunchHelpers.d.ts +123 -0
  174. package/docs/api/gtmLaunchHelpers.md +148 -0
  175. package/docs/api/gtmLibrary.d.ts +448 -0
  176. package/docs/api/gtmLibrary.md +780 -0
  177. package/docs/api/health.d.ts +39 -0
  178. package/docs/api/health.md +58 -0
  179. package/docs/api/imageLibrary.d.ts +341 -0
  180. package/docs/api/imageLibrary.md +569 -0
  181. package/docs/api/imports.d.ts +157 -0
  182. package/docs/api/imports.md +174 -0
  183. package/docs/api/inbox.d.ts +709 -0
  184. package/docs/api/inbox.md +1067 -0
  185. package/docs/api/install.d.ts +213 -0
  186. package/docs/api/install.md +317 -0
  187. package/docs/api/installedApps.d.ts +131 -0
  188. package/docs/api/installedApps.md +241 -0
  189. package/docs/api/integrationStatus.d.ts +142 -0
  190. package/docs/api/integrationStatus.md +205 -0
  191. package/docs/api/integrations.d.ts +2327 -0
  192. package/docs/api/integrations.md +3791 -0
  193. package/docs/api/intent.d.ts +482 -0
  194. package/docs/api/intent.md +858 -0
  195. package/docs/api/knowledge.d.ts +501 -0
  196. package/docs/api/knowledge.md +843 -0
  197. package/docs/api/knowledgeBase.d.ts +84 -0
  198. package/docs/api/knowledgeBase.md +96 -0
  199. package/docs/api/landingPages.d.ts +1411 -0
  200. package/docs/api/landingPages.md +2488 -0
  201. package/docs/api/leads.d.ts +133 -0
  202. package/docs/api/leads.md +180 -0
  203. package/docs/api/library.d.ts +217 -0
  204. package/docs/api/library.md +338 -0
  205. package/docs/api/linkedIn.d.ts +227 -0
  206. package/docs/api/linkedIn.md +289 -0
  207. package/docs/api/linkedInOutreach.d.ts +727 -0
  208. package/docs/api/linkedInOutreach.md +990 -0
  209. package/docs/api/lists.d.ts +1106 -0
  210. package/docs/api/lists.md +1609 -0
  211. package/docs/api/logs.d.ts +71 -0
  212. package/docs/api/logs.md +70 -0
  213. package/docs/api/mailboxes.d.ts +1050 -0
  214. package/docs/api/mailboxes.md +1690 -0
  215. package/docs/api/marketingIntelligence.d.ts +256 -0
  216. package/docs/api/marketingIntelligence.md +454 -0
  217. package/docs/api/marketplace.d.ts +3173 -0
  218. package/docs/api/marketplace.md +5953 -0
  219. package/docs/api/mcp.d.ts +69 -0
  220. package/docs/api/mcp.md +69 -0
  221. package/docs/api/me.d.ts +54 -0
  222. package/docs/api/me.md +56 -0
  223. package/docs/api/meetings.d.ts +539 -0
  224. package/docs/api/meetings.md +747 -0
  225. package/docs/api/newsletter.d.ts +1613 -0
  226. package/docs/api/newsletter.md +2746 -0
  227. package/docs/api/notes.d.ts +517 -0
  228. package/docs/api/notes.md +888 -0
  229. package/docs/api/notifications.d.ts +94 -0
  230. package/docs/api/notifications.md +105 -0
  231. package/docs/api/objects.d.ts +621 -0
  232. package/docs/api/objects.md +1098 -0
  233. package/docs/api/openSearch.d.ts +234 -0
  234. package/docs/api/openSearch.md +297 -0
  235. package/docs/api/ops.d.ts +299 -0
  236. package/docs/api/ops.md +339 -0
  237. package/docs/api/orgGovernance.d.ts +393 -0
  238. package/docs/api/orgGovernance.md +623 -0
  239. package/docs/api/orgVideos.d.ts +184 -0
  240. package/docs/api/orgVideos.md +252 -0
  241. package/docs/api/organizationSettings.d.ts +626 -0
  242. package/docs/api/organizationSettings.md +911 -0
  243. package/docs/api/phoneNumbers.d.ts +484 -0
  244. package/docs/api/phoneNumbers.md +777 -0
  245. package/docs/api/profile.d.ts +329 -0
  246. package/docs/api/profile.md +540 -0
  247. package/docs/api/programmaticPages.d.ts +400 -0
  248. package/docs/api/programmaticPages.md +626 -0
  249. package/docs/api/providerDomains.d.ts +866 -0
  250. package/docs/api/providerDomains.md +1446 -0
  251. package/docs/api/providerUsage.d.ts +129 -0
  252. package/docs/api/providerUsage.md +186 -0
  253. package/docs/api/public.d.ts +69 -0
  254. package/docs/api/public.md +78 -0
  255. package/docs/api/publicCopilot.d.ts +67 -0
  256. package/docs/api/publicCopilot.md +80 -0
  257. package/docs/api/publicSignals.d.ts +66 -0
  258. package/docs/api/publicSignals.md +71 -0
  259. package/docs/api/publicVisitors.d.ts +97 -0
  260. package/docs/api/publicVisitors.md +118 -0
  261. package/docs/api/quotes.d.ts +1564 -0
  262. package/docs/api/quotes.md +2553 -0
  263. package/docs/api/radar.d.ts +808 -0
  264. package/docs/api/radar.md +1431 -0
  265. package/docs/api/radarReports.d.ts +208 -0
  266. package/docs/api/radarReports.md +306 -0
  267. package/docs/api/recordRoles.d.ts +143 -0
  268. package/docs/api/recordRoles.md +175 -0
  269. package/docs/api/repos.d.ts +146 -0
  270. package/docs/api/repos.md +211 -0
  271. package/docs/api/research.d.ts +295 -0
  272. package/docs/api/research.md +534 -0
  273. package/docs/api/revenue.d.ts +402 -0
  274. package/docs/api/revenue.md +608 -0
  275. package/docs/api/revenueAnalytics.d.ts +147 -0
  276. package/docs/api/revenueAnalytics.md +212 -0
  277. package/docs/api/revenueLifecycle.d.ts +207 -0
  278. package/docs/api/revenueLifecycle.md +274 -0
  279. package/docs/api/revenueRecords.d.ts +372 -0
  280. package/docs/api/revenueRecords.md +563 -0
  281. package/docs/api/roles.d.ts +431 -0
  282. package/docs/api/roles.md +812 -0
  283. package/docs/api/salesCoach.d.ts +877 -0
  284. package/docs/api/salesCoach.md +1540 -0
  285. package/docs/api/sandbox.d.ts +210 -0
  286. package/docs/api/sandbox.md +380 -0
  287. package/docs/api/scans.d.ts +104 -0
  288. package/docs/api/scans.md +136 -0
  289. package/docs/api/scheduleBuy.d.ts +293 -0
  290. package/docs/api/scheduleBuy.md +431 -0
  291. package/docs/api/scraping.d.ts +266 -0
  292. package/docs/api/scraping.md +383 -0
  293. package/docs/api/sdrAnalytics.d.ts +138 -0
  294. package/docs/api/sdrAnalytics.md +246 -0
  295. package/docs/api/search.d.ts +598 -0
  296. package/docs/api/search.md +866 -0
  297. package/docs/api/seo.d.ts +447 -0
  298. package/docs/api/seo.md +660 -0
  299. package/docs/api/sequenceLifecycle.d.ts +439 -0
  300. package/docs/api/sequenceLifecycle.md +513 -0
  301. package/docs/api/sequences.d.ts +1936 -0
  302. package/docs/api/sequences.md +3232 -0
  303. package/docs/api/settings.d.ts +448 -0
  304. package/docs/api/settings.md +731 -0
  305. package/docs/api/signals.d.ts +1441 -0
  306. package/docs/api/signals.md +2526 -0
  307. package/docs/api/signatures.d.ts +719 -0
  308. package/docs/api/signatures.md +1247 -0
  309. package/docs/api/skills.d.ts +230 -0
  310. package/docs/api/skills.md +466 -0
  311. package/docs/api/snippet.d.ts +85 -0
  312. package/docs/api/snippet.md +106 -0
  313. package/docs/api/socialPublishing.d.ts +824 -0
  314. package/docs/api/socialPublishing.md +1245 -0
  315. package/docs/api/studioDocuments.d.ts +244 -0
  316. package/docs/api/studioDocuments.md +348 -0
  317. package/docs/api/support.d.ts +90 -0
  318. package/docs/api/support.md +76 -0
  319. package/docs/api/suppressions.d.ts +241 -0
  320. package/docs/api/suppressions.md +343 -0
  321. package/docs/api/surveys.d.ts +847 -0
  322. package/docs/api/surveys.md +1223 -0
  323. package/docs/api/tasks.d.ts +813 -0
  324. package/docs/api/tasks.md +1344 -0
  325. package/docs/api/teamMembers.d.ts +668 -0
  326. package/docs/api/teamMembers.md +1040 -0
  327. package/docs/api/teams.d.ts +784 -0
  328. package/docs/api/teams.md +1395 -0
  329. package/docs/api/usage.d.ts +277 -0
  330. package/docs/api/usage.md +389 -0
  331. package/docs/api/visitors.d.ts +690 -0
  332. package/docs/api/visitors.md +1075 -0
  333. package/docs/api/voice.d.ts +4661 -0
  334. package/docs/api/voice.md +7905 -0
  335. package/docs/api/webAnalytics.d.ts +964 -0
  336. package/docs/api/webAnalytics.md +1452 -0
  337. package/docs/api/webChat.d.ts +1704 -0
  338. package/docs/api/webChat.md +2048 -0
  339. package/docs/api/webhooks.d.ts +251 -0
  340. package/docs/api/webhooks.md +386 -0
  341. package/docs/api/websiteEditor.d.ts +324 -0
  342. package/docs/api/websiteEditor.md +517 -0
  343. package/docs/api/work.d.ts +2298 -0
  344. package/docs/api/work.md +3096 -0
  345. package/docs/api/workbench.d.ts +2962 -0
  346. package/docs/api/workbench.md +4884 -0
  347. package/docs/api/workflows.d.ts +1218 -0
  348. package/docs/api/workflows.md +2302 -0
  349. package/docs/sdk-clients.md +4339 -0
  350. package/package.json +10 -3
@@ -0,0 +1,4884 @@
1
+ <!-- Generated by sdk/js/scripts/generate-agent-docs.ts from developer-contract/openapi.json. Regenerated on every build. -->
2
+
3
+ # `g8.api.workbench`: Workbench
4
+
5
+ 107 operations (41 read, 30 write, 12 destructive, 21 billable, 3 external).
6
+
7
+ No hand-written client covers this area. Call it through `g8.api.workbench.*` as shown below, or by operationId with `g8.api.call(operationId, input)`.
8
+
9
+ Every example below assumes this setup (server-side, API key):
10
+
11
+ ```ts
12
+ import { g8 } from "@graph8/sdk";
13
+
14
+ g8.init({ apiKey: process.env.G8_API_KEY! });
15
+ ```
16
+
17
+ Example values are placeholders that match each field's type. Only required fields are shown. Every example is type-checked against the SDK in CI.
18
+
19
+ Exact TypeScript types for every operation on this page, and every schema they use: [workbench.d.ts](workbench.d.ts).
20
+
21
+ ## Operations
22
+
23
+ | Call | HTTP | Tier | Scope | Summary |
24
+ |---|---|---|---|---|
25
+ | [`addWorkbenchColumn`](#op-addworkbenchcolumn) | `POST /api/v1/workbench/tables/{table_id}/columns` | write | `lists:write` | Add Workbench Column |
26
+ | [`addWorkbenchRow`](#op-addworkbenchrow) | `POST /api/v1/workbench/tables/{table_id}/rows` | write | `lists:write` | Add Workbench Row |
27
+ | [`bulkDeleteWorkbenchRows`](#op-bulkdeleteworkbenchrows) | `POST /api/v1/workbench/tables/{table_id}/rows/bulk-delete` | destructive | `lists:delete` | Bulk Delete Workbench Rows |
28
+ | [`bulkExtractWorkbenchColumns`](#op-bulkextractworkbenchcolumns) | `POST /api/v1/workbench/tables/{table_id}/columns/bulk-extract` | write | `lists:write` | Bulk Extract Workbench Columns |
29
+ | [`checkWorkbenchScraperToken`](#op-checkworkbenchscrapertoken) | `GET /api/v1/workbench/scraper/providers/{provider}/check-token` | read | `lists:read` | Check Workbench Scraper Token |
30
+ | [`computeWorkbenchFormula`](#op-computeworkbenchformula) | `POST /api/v1/workbench/tables/{table_id}/columns/{col_id}/compute` | write | `lists:write` | Compute Workbench Formula |
31
+ | [`configureWorkbenchAi`](#op-configureworkbenchai) | `POST /api/v1/workbench/tables/{table_id}/ai/configure` | write | `lists:write` | Configure Workbench Ai |
32
+ | [`configureWorkbenchColumnSource`](#op-configureworkbenchcolumnsource) | `POST /api/v1/workbench/tables/{table_id}/columns/{col_id}/sources` | write | `lists:write` | Configure Workbench Column Source |
33
+ | [`configureWorkbenchFindPeople`](#op-configureworkbenchfindpeople) | `POST /api/v1/workbench/tables/{table_id}/find-people/configure` | billable | `lists:run` | Configure Workbench Find People |
34
+ | [`createWorkbenchAiGroup`](#op-createworkbenchaigroup) | `POST /api/v1/workbench/tables/{table_id}/ai/groups/config` | write | `lists:write` | Create Workbench Ai Group |
35
+ | [`createWorkbenchBindings`](#op-createworkbenchbindings) | `POST /api/v1/workbench-bindings` | write | `lists:write` | Create Workbench Bindings |
36
+ | [`createWorkbenchConnection`](#op-createworkbenchconnection) | `POST /api/v1/workbench/tables/{table_id}/connections` | write | `lists:write` | Create Workbench Connection |
37
+ | [`createWorkbenchFormulaColumns`](#op-createworkbenchformulacolumns) | `POST /api/v1/workbench/tables/{table_id}/formula-columns` | write | `lists:write` | Create Workbench Formula Columns |
38
+ | [`createWorkbenchPipeline`](#op-createworkbenchpipeline) | `POST /api/v1/workbench/tables/{table_id}/pipelines` | billable | `lists:run` | Create Workbench Pipeline |
39
+ | [`createWorkbenchTable`](#op-createworkbenchtable) | `POST /api/v1/workbench/tables` | write | `lists:write` | Create Workbench Table |
40
+ | [`createWorkbenchTrigger`](#op-createworkbenchtrigger) | `POST /api/v1/workbench/tables/{table_id}/triggers` | billable | `lists:run` | Create Workbench Trigger |
41
+ | [`deleteScraperProviderConnection`](#op-deletescraperproviderconnection) | `DELETE /api/v1/workbench/scraper/providers/{provider}/connection` | destructive | `lists:delete` | Delete Scraper Provider Connection |
42
+ | [`deleteWorkbenchAiGroup`](#op-deleteworkbenchaigroup) | `DELETE /api/v1/workbench/tables/{table_id}/ai/groups/{group_id}` | destructive | `lists:delete` | Delete Workbench Ai Group |
43
+ | [`deleteWorkbenchBinding`](#op-deleteworkbenchbinding) | `DELETE /api/v1/workbench-bindings/{binding_id}` | destructive | `lists:delete` | Delete Workbench Binding |
44
+ | [`deleteWorkbenchColumn`](#op-deleteworkbenchcolumn) | `DELETE /api/v1/workbench/tables/{table_id}/columns/{column_id}` | destructive | `lists:delete` | Delete Workbench Column |
45
+ | [`deleteWorkbenchConnection`](#op-deleteworkbenchconnection) | `DELETE /api/v1/workbench/tables/{table_id}/connections/{connection_id}` | destructive | `lists:delete` | Delete Workbench Connection |
46
+ | [`deleteWorkbenchFindPeopleConfig`](#op-deleteworkbenchfindpeopleconfig) | `DELETE /api/v1/workbench/tables/{table_id}/find-people/{config_id}` | destructive | `lists:delete` | Delete Workbench Find People Config |
47
+ | [`deleteWorkbenchPipeline`](#op-deleteworkbenchpipeline) | `DELETE /api/v1/workbench/tables/{table_id}/pipelines/{pipeline_id}` | destructive | `lists:delete` | Delete Workbench Pipeline |
48
+ | [`deleteWorkbenchSchedule`](#op-deleteworkbenchschedule) | `DELETE /api/v1/workbench/tables/{table_id}/schedule` | destructive | `lists:delete` | Delete Workbench Schedule |
49
+ | [`deleteWorkbenchTable`](#op-deleteworkbenchtable) | `DELETE /api/v1/workbench/tables/{table_id}` | destructive | `lists:delete` | Delete Workbench Table |
50
+ | [`deleteWorkbenchTrigger`](#op-deleteworkbenchtrigger) | `DELETE /api/v1/workbench/tables/{table_id}/triggers/{trigger_id}` | destructive | `lists:delete` | Delete Workbench Trigger |
51
+ | [`discoverWorkbenchFields`](#op-discoverworkbenchfields) | `POST /api/v1/workbench/tables/{table_id}/discover-fields` | write | `lists:write` | Discover Workbench Fields |
52
+ | [`estimateWorkbenchProviderScraperCredits`](#op-estimateworkbenchproviderscrapercredits) | `GET /api/v1/workbench/scraper/providers/{provider}/credit-estimate` | read | `lists:read` | Estimate Workbench Provider Scraper Credits |
53
+ | [`estimateWorkbenchScraperCredits`](#op-estimateworkbenchscrapercredits) | `GET /api/v1/workbench/scraper/credit-estimate` | read | `lists:read` | Estimate Workbench Scraper Credits |
54
+ | [`expandWorkbenchArray`](#op-expandworkbencharray) | `POST /api/v1/workbench/tables/{table_id}/expand-array` | write | `lists:write` | Expand Workbench Array |
55
+ | [`exportWorkbenchAiFindPeople`](#op-exportworkbenchaifindpeople) | `POST /api/v1/workbench/tables/{table_id}/ai/groups/{group_id}/find-people/export` | write | `lists:write` | Export Workbench Ai Find People |
56
+ | [`exportWorkbenchTable`](#op-exportworkbenchtable) | `POST /api/v1/workbench/tables/{table_id}/export` | write | `lists:write` | Export Workbench Table |
57
+ | [`extractWorkbenchColumn`](#op-extractworkbenchcolumn) | `POST /api/v1/workbench/tables/{table_id}/columns/extract` | write | `lists:write` | Extract Workbench Column |
58
+ | [`generateWorkbenchPrompt`](#op-generateworkbenchprompt) | `POST /api/v1/workbench/tables/{table_id}/ai/generate-prompt` | billable | `lists:run` | Generate Workbench Prompt |
59
+ | [`getScraperProviderConnection`](#op-getscraperproviderconnection) | `GET /api/v1/workbench/scraper/providers/{provider}/connection` | read | `lists:read` | Get Scraper Provider Connection |
60
+ | [`getWorkbenchAiFindPeopleRow`](#op-getworkbenchaifindpeoplerow) | `GET /api/v1/workbench/tables/{table_id}/ai/groups/{group_id}/find-people/rows/{source_row_id}` | read | `lists:read` | Get Workbench Ai Find People Row |
61
+ | [`getWorkbenchAiGroup`](#op-getworkbenchaigroup) | `GET /api/v1/workbench/tables/{table_id}/ai/groups/{group_id}` | read | `lists:read` | Get Workbench Ai Group |
62
+ | [`getWorkbenchAnalytics`](#op-getworkbenchanalytics) | `GET /api/v1/workbench/tables/{table_id}/analytics` | read | `lists:read` | Get Workbench Analytics |
63
+ | [`getWorkbenchColumnAiConfig`](#op-getworkbenchcolumnaiconfig) | `GET /api/v1/workbench/tables/{table_id}/columns/{col_id}/ai-config` | read | `lists:read` | Get Workbench Column Ai Config |
64
+ | [`getWorkbenchHistory`](#op-getworkbenchhistory) | `GET /api/v1/workbench/tables/{table_id}/history` | read | `lists:read` | Get Workbench History |
65
+ | [`getWorkbenchLockedRowCount`](#op-getworkbenchlockedrowcount) | `GET /api/v1/workbench/tables/{table_id}/locked-row-count` | read | `lists:read` | Get Workbench Locked Row Count |
66
+ | [`getWorkbenchMappingSuggestion`](#op-getworkbenchmappingsuggestion) | `GET /api/v1/workbench/tables/{table_id}/suggest-mappings/{job_id}` | read | `lists:read` | Get Workbench Mapping Suggestion |
67
+ | [`getWorkbenchPipeline`](#op-getworkbenchpipeline) | `GET /api/v1/workbench/tables/{table_id}/pipelines/{pipeline_id}` | read | `lists:read` | Get Workbench Pipeline |
68
+ | [`getWorkbenchRow`](#op-getworkbenchrow) | `GET /api/v1/workbench/tables/{table_id}/rows/{row_id}` | read | `lists:read` | Get Workbench Row |
69
+ | [`getWorkbenchSchedule`](#op-getworkbenchschedule) | `GET /api/v1/workbench/tables/{table_id}/schedule` | read | `lists:read` | Get Workbench Schedule |
70
+ | [`getWorkbenchScraperRun`](#op-getworkbenchscraperrun) | `GET /api/v1/workbench/tables/{table_id}/scraper/runs/{run_id}` | read | `lists:read` | Get Workbench Scraper Run |
71
+ | [`getWorkbenchTable`](#op-getworkbenchtable) | `GET /api/v1/workbench/tables/{table_id}` | read | `lists:read` | Get Workbench Table |
72
+ | [`getWorkbenchWaterfall`](#op-getworkbenchwaterfall) | `GET /api/v1/workbench/tables/{table_id}/waterfall/configs/{column_id}` | read | `lists:read` | Get Workbench Waterfall |
73
+ | [`importWorkbenchDatafile`](#op-importworkbenchdatafile) | `POST /api/v1/workbench/tables/{table_id}/import/datafile` | write | `lists:write` | Import Workbench Datafile |
74
+ | [`importWorkbenchFromCrm`](#op-importworkbenchfromcrm) | `POST /api/v1/workbench/tables/{table_id}/import/crm` | external | `lists:run` | Import Workbench From Crm |
75
+ | [`importWorkbenchFromSearch`](#op-importworkbenchfromsearch) | `POST /api/v1/workbench/tables/{table_id}/import/search` | billable | `lists:run` | Import Workbench From Search |
76
+ | [`listWorkbenchAiPresets`](#op-listworkbenchaipresets) | `GET /api/v1/workbench/ai-presets` | read | `lists:read` | List Workbench Ai Presets |
77
+ | [`listWorkbenchBindings`](#op-listworkbenchbindings) | `GET /api/v1/workbench-bindings` | read | `lists:read` | List Workbench Bindings |
78
+ | [`listWorkbenchColumnSources`](#op-listworkbenchcolumnsources) | `GET /api/v1/workbench/tables/{table_id}/columns/{col_id}/sources` | read | `lists:read` | List Workbench Column Sources |
79
+ | [`listWorkbenchColumns`](#op-listworkbenchcolumns) | `GET /api/v1/workbench/tables/{table_id}/columns` | read | `lists:read` | List Workbench Columns |
80
+ | [`listWorkbenchConnections`](#op-listworkbenchconnections) | `GET /api/v1/workbench/tables/{table_id}/connections` | read | `lists:read` | List Workbench Connections |
81
+ | [`listWorkbenchEnrichmentConfigs`](#op-listworkbenchenrichmentconfigs) | `GET /api/v1/workbench/tables/{table_id}/enrichment-configs` | read | `lists:read` | List Workbench Enrichment Configs |
82
+ | [`listWorkbenchFindPeopleConfigs`](#op-listworkbenchfindpeopleconfigs) | `GET /api/v1/workbench/tables/{table_id}/find-people/configs` | read | `lists:read` | List Workbench Find People Configs |
83
+ | [`listWorkbenchFindPeopleContacts`](#op-listworkbenchfindpeoplecontacts) | `GET /api/v1/workbench/tables/{table_id}/find-people/{config_id}/contacts` | read | `lists:read` | List Workbench Find People Contacts |
84
+ | [`listWorkbenchPipelines`](#op-listworkbenchpipelines) | `GET /api/v1/workbench/tables/{table_id}/pipelines` | read | `lists:read` | List Workbench Pipelines |
85
+ | [`listWorkbenchRows`](#op-listworkbenchrows) | `GET /api/v1/workbench/tables/{table_id}/rows` | read | `lists:read` | List Workbench Rows |
86
+ | [`listWorkbenchScraperPresets`](#op-listworkbenchscraperpresets) | `GET /api/v1/workbench/scraper/presets` | read | `lists:read` | List Workbench Scraper Presets |
87
+ | [`listWorkbenchScraperRuns`](#op-listworkbenchscraperruns) | `GET /api/v1/workbench/tables/{table_id}/scraper/runs` | read | `lists:read` | List Workbench Scraper Runs |
88
+ | [`listWorkbenchSourceCredentials`](#op-listworkbenchsourcecredentials) | `GET /api/v1/workbench/source-credentials` | read | `lists:read` | List Workbench Source Credentials |
89
+ | [`listWorkbenchTableAiPresets`](#op-listworkbenchtableaipresets) | `GET /api/v1/workbench/tables/{table_id}/ai-presets` | read | `lists:read` | List Workbench Table Ai Presets |
90
+ | [`listWorkbenchTables`](#op-listworkbenchtables) | `GET /api/v1/workbench/tables` | read | `lists:read` | List Workbench Tables |
91
+ | [`listWorkbenchTargetFields`](#op-listworkbenchtargetfields) | `GET /api/v1/workbench/target-fields` | read | `lists:read` | List Workbench Target Fields |
92
+ | [`listWorkbenchTriggers`](#op-listworkbenchtriggers) | `GET /api/v1/workbench/tables/{table_id}/triggers` | read | `lists:read` | List Workbench Triggers |
93
+ | [`mapWorkbenchColumn`](#op-mapworkbenchcolumn) | `PUT /api/v1/workbench/tables/{table_id}/columns/{column_id}/mapping` | write | `lists:write` | Map Workbench Column |
94
+ | [`migrateWorkbenchLegacyAiConfig`](#op-migrateworkbenchlegacyaiconfig) | `POST /api/v1/workbench/tables/{table_id}/ai/migrate-legacy` | write | `lists:write` | Migrate Workbench Legacy Ai Config |
95
+ | [`pasteImportWorkbenchRows`](#op-pasteimportworkbenchrows) | `POST /api/v1/workbench/tables/{table_id}/import/paste` | write | `lists:write` | Paste Import Workbench Rows |
96
+ | [`previewWorkbenchAi`](#op-previewworkbenchai) | `POST /api/v1/workbench/tables/{table_id}/ai/preview` | billable | `lists:run` | Preview Workbench Ai |
97
+ | [`previewWorkbenchResearchImport`](#op-previewworkbenchresearchimport) | `POST /api/v1/workbench/tables/{table_id}/import/search/research/preview` | billable | `lists:run` | Preview Workbench Research Import |
98
+ | [`previewWorkbenchSearchImport`](#op-previewworkbenchsearchimport) | `POST /api/v1/workbench/tables/{table_id}/import/search/preview` | read | `lists:read` | Preview Workbench Search Import |
99
+ | [`queryWorkbenchRows`](#op-queryworkbenchrows) | `POST /api/v1/workbench/tables/{table_id}/rows/query` | read | `lists:read` | Query Workbench Rows |
100
+ | [`quoteWorkbenchAiRun`](#op-quoteworkbenchairun) | `POST /api/v1/workbench/tables/{table_id}/ai/validate-credits` | read | `lists:read` | Quote Workbench Ai Run |
101
+ | [`quoteWorkbenchFormulaGeneration`](#op-quoteworkbenchformulageneration) | `GET /api/v1/workbench/tables/{table_id}/formula-columns/generate-quote` | read | `lists:read` | Quote Workbench Formula Generation |
102
+ | [`quoteWorkbenchUnlock`](#op-quoteworkbenchunlock) | `POST /api/v1/workbench/tables/{table_id}/unlock-quote` | read | `lists:read` | Quote Workbench Unlock |
103
+ | [`quoteWorkbenchWaterfallRun`](#op-quoteworkbenchwaterfallrun) | `POST /api/v1/workbench/tables/{table_id}/waterfall/configs/{column_id}/validate-credits` | read | `lists:read` | Quote Workbench Waterfall Run |
104
+ | [`regenerateWorkbenchKey`](#op-regenerateworkbenchkey) | `POST /api/v1/workbench/tables/{table_id}/regenerate-key` | write | `lists:write` | Regenerate Workbench Key |
105
+ | [`reviewWorkbenchFindPeopleCandidates`](#op-reviewworkbenchfindpeoplecandidates) | `GET /api/v1/workbench/tables/{table_id}/ai/groups/{group_id}/find-people/review` | read | `lists:read` | Review Workbench Find People Candidates |
106
+ | [`revokeWorkbenchColumnSource`](#op-revokeworkbenchcolumnsource) | `DELETE /api/v1/workbench/tables/{table_id}/columns/{col_id}/sources/{source_type}` | destructive | `lists:delete` | Revoke Workbench Column Source |
107
+ | [`runWorkbenchAi`](#op-runworkbenchai) | `POST /api/v1/workbench/tables/{table_id}/ai/run-all` | billable | `lists:run` | Run Workbench Ai |
108
+ | [`runWorkbenchAiGroup`](#op-runworkbenchaigroup) | `POST /api/v1/workbench/tables/{table_id}/ai/groups/{group_id}/run` | billable | `lists:run` | Run Workbench Ai Group |
109
+ | [`runWorkbenchColumnAi`](#op-runworkbenchcolumnai) | `POST /api/v1/workbench/tables/{table_id}/columns/{col_id}/ai/run` | billable | `lists:run` | Run Workbench Column Ai |
110
+ | [`runWorkbenchDefaultAi`](#op-runworkbenchdefaultai) | `POST /api/v1/workbench/tables/{table_id}/ai/run` | billable | `lists:run` | Run Workbench Default Ai |
111
+ | [`runWorkbenchFindPeople`](#op-runworkbenchfindpeople) | `POST /api/v1/workbench/tables/{table_id}/find-people/{config_id}/run` | billable | `lists:run` | Run Workbench Find People |
112
+ | [`runWorkbenchProviderScraper`](#op-runworkbenchproviderscraper) | `POST /api/v1/workbench/tables/{table_id}/scraper/providers/{provider}/runs` | billable | `lists:run` | Run Workbench Provider Scraper |
113
+ | [`runWorkbenchScraper`](#op-runworkbenchscraper) | `POST /api/v1/workbench/tables/{table_id}/scraper/runs` | billable | `lists:run` | Run Workbench Scraper |
114
+ | [`runWorkbenchWaterfall`](#op-runworkbenchwaterfall) | `POST /api/v1/workbench/tables/{table_id}/waterfall/configs/{column_id}/run` | billable | `lists:run` | Run Workbench Waterfall |
115
+ | [`saveScraperProviderConnection`](#op-savescraperproviderconnection) | `PUT /api/v1/workbench/scraper/providers/{provider}/connection` | write | `lists:write` | Save Scraper Provider Connection |
116
+ | [`saveWorkbenchColumnAiConfig`](#op-saveworkbenchcolumnaiconfig) | `PUT /api/v1/workbench/tables/{table_id}/columns/{col_id}/ai-config` | write | `lists:write` | Save Workbench Column Ai Config |
117
+ | [`saveWorkbenchWaterfall`](#op-saveworkbenchwaterfall) | `POST /api/v1/workbench/tables/{table_id}/waterfall/configs` | write | `lists:write` | Save Workbench Waterfall |
118
+ | [`sendWorkbenchRowsToSequence`](#op-sendworkbenchrowstosequence) | `POST /api/v1/workbench/tables/{table_id}/send-to-sequence` | external | `lists:run` | Send Workbench Rows To Sequence |
119
+ | [`setWorkbenchAutoEnrich`](#op-setworkbenchautoenrich) | `PUT /api/v1/workbench/tables/{table_id}/auto-enrich` | billable | `lists:run` | Set Workbench Auto Enrich |
120
+ | [`setWorkbenchSchedule`](#op-setworkbenchschedule) | `PUT /api/v1/workbench/tables/{table_id}/schedule` | billable | `lists:run` | Set Workbench Schedule |
121
+ | [`skipWorkbenchFindPeopleCandidates`](#op-skipworkbenchfindpeoplecandidates) | `POST /api/v1/workbench/tables/{table_id}/ai/groups/{group_id}/find-people/skip` | write | `lists:write` | Skip Workbench Find People Candidates |
122
+ | [`suggestWorkbenchMappings`](#op-suggestworkbenchmappings) | `POST /api/v1/workbench/tables/{table_id}/suggest-mappings` | billable | `lists:run` | Suggest Workbench Mappings |
123
+ | [`syncWorkbenchConnection`](#op-syncworkbenchconnection) | `POST /api/v1/workbench/tables/{table_id}/connections/{connection_id}/sync` | write | `lists:write` | Sync Workbench Connection |
124
+ | [`testScraperProviderConnection`](#op-testscraperproviderconnection) | `POST /api/v1/workbench/scraper/providers/{provider}/connection/test` | external | `lists:run` | Test Scraper Provider Connection |
125
+ | [`unlockWorkbenchRows`](#op-unlockworkbenchrows) | `POST /api/v1/workbench/tables/{table_id}/unlock-rows` | billable | `lists:run` | Unlock Workbench Rows |
126
+ | [`updateWorkbenchAiGroup`](#op-updateworkbenchaigroup) | `PUT /api/v1/workbench/tables/{table_id}/ai/groups/{group_id}` | write | `lists:write` | Update Workbench Ai Group |
127
+ | [`updateWorkbenchPipeline`](#op-updateworkbenchpipeline) | `PUT /api/v1/workbench/tables/{table_id}/pipelines/{pipeline_id}` | billable | `lists:run` | Update Workbench Pipeline |
128
+ | [`updateWorkbenchRow`](#op-updateworkbenchrow) | `PATCH /api/v1/workbench/tables/{table_id}/rows/{row_id}` | write | `lists:write` | Update Workbench Row |
129
+ | [`updateWorkbenchTable`](#op-updateworkbenchtable) | `PUT /api/v1/workbench/tables/{table_id}` | write | `lists:write` | Update Workbench Table |
130
+ | [`updateWorkbenchTrigger`](#op-updateworkbenchtrigger) | `PUT /api/v1/workbench/tables/{table_id}/triggers/{trigger_id}` | billable | `lists:run` | Update Workbench Trigger |
131
+ | [`updateWorkbenchWaterfall`](#op-updateworkbenchwaterfall) | `PUT /api/v1/workbench/tables/{table_id}/waterfall/configs/{column_id}` | write | `lists:write` | Update Workbench Waterfall |
132
+
133
+ ---
134
+
135
+ <a id="op-addworkbenchcolumn"></a>
136
+
137
+ ### `g8.api.workbench.addWorkbenchColumn(input)`
138
+
139
+ **Add Workbench Column**
140
+
141
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/columns`
142
+ - operationId: `add_workbench_column_workbench_tables__table_id__columns_post` (also callable as `g8.api.call("add_workbench_column_workbench_tables__table_id__columns_post", input)`)
143
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
144
+ - API-key scope: `lists:write`
145
+
146
+ Add a column.
147
+
148
+ `name` is the machine name rows are keyed by and is constrained to
149
+ `^[a-z][a-z0-9_]*$`; `display_name` is free text. Getting those the wrong
150
+ way round produces a column nothing can address.
151
+
152
+ **Input**
153
+
154
+ | Field | Type | Required | Description |
155
+ |---|---|---|---|
156
+ | `path.table_id` | `string` | yes | Table id (UUID). |
157
+ | `body` | `WorkbenchColumnCreateRequest` | yes | Request body; fields below. |
158
+
159
+ Body fields (`WorkbenchColumnCreateRequest`):
160
+
161
+ | Field | Type | Required | Description |
162
+ |---|---|---|---|
163
+ | `body.display_name` | `string` | yes | min length 1, max length 255 |
164
+ | `body.name` | `string` | yes | Machine name: lowercase, starting with a letter. This is the key row data is addressed by, which is why it is constrained while `display_name` is not. min length 1, max length 255, pattern `^[a-z][a-z0-9_]*$` |
165
+ | `body.column_type` | `"data" \| "formula" \| "raw_json"` | no | default `"data"` |
166
+ | `body.data_type` | `"text" \| "number" \| "boolean" \| "json"` | no | default `"text"` |
167
+ | `body.field_path` | `string \| null` | no | Path into a raw_json source column. |
168
+ | `body.formula` | `string \| null` | no | Required for a formula column. |
169
+ | `body.source` | `string` | no | default `"manual"` |
170
+ | `body.source_column_id` | `integer \| null` | no | |
171
+
172
+ **Returns** `ApiResponse_dict_`: the envelope `{ data: Record<string, unknown>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
173
+
174
+ Other envelope fields: `pagination` (PaginationMeta).
175
+
176
+ **Example**
177
+
178
+ ```ts
179
+ const result = await g8.api.workbench.addWorkbenchColumn({
180
+ path: { table_id: "id" },
181
+ body: { display_name: "Example", name: "Example" },
182
+ });
183
+ ```
184
+
185
+ ---
186
+
187
+ <a id="op-addworkbenchrow"></a>
188
+
189
+ ### `g8.api.workbench.addWorkbenchRow(input)`
190
+
191
+ **Add Workbench Row**
192
+
193
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/rows`
194
+ - operationId: `add_workbench_row_workbench_tables__table_id__rows_post` (also callable as `g8.api.call("add_workbench_row_workbench_tables__table_id__rows_post", input)`)
195
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
196
+ - API-key scope: `lists:write`
197
+
198
+ Add one row. `data` is keyed by column MACHINE name, not display name.
199
+
200
+ **Input**
201
+
202
+ | Field | Type | Required | Description |
203
+ |---|---|---|---|
204
+ | `path.table_id` | `string` | yes | Table id (UUID). |
205
+ | `body` | `WorkbenchRowCreateRequest` | yes | Request body; fields below. |
206
+
207
+ Body fields (`WorkbenchRowCreateRequest`):
208
+
209
+ | Field | Type | Required | Description |
210
+ |---|---|---|---|
211
+ | `body.data` | `Record<string, unknown>` | no | Column machine name -> value. |
212
+ | `body.raw_source_column_id` | `integer \| null` | no | |
213
+
214
+ **Returns** `ApiResponse_dict_`: the envelope `{ data: Record<string, unknown>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
215
+
216
+ Other envelope fields: `pagination` (PaginationMeta).
217
+
218
+ **Example**
219
+
220
+ ```ts
221
+ const result = await g8.api.workbench.addWorkbenchRow({ path: { table_id: "id" }, body: {} });
222
+ ```
223
+
224
+ ---
225
+
226
+ <a id="op-bulkdeleteworkbenchrows"></a>
227
+
228
+ ### `g8.api.workbench.bulkDeleteWorkbenchRows(input)`
229
+
230
+ **Bulk Delete Workbench Rows**
231
+
232
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/rows/bulk-delete`
233
+ - operationId: `bulk_delete_workbench_rows_workbench_tables__table_id__rows_bulk_delete_post` (also callable as `g8.api.call("bulk_delete_workbench_rows_workbench_tables__table_id__rows_bulk_delete_post", input)`)
234
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
235
+ - API-key scope: `lists:delete`
236
+
237
+ Delete rows by id, or everything EXCEPT a set.
238
+
239
+ `select_all` must be sent explicitly to delete everything. An empty
240
+ selection is rejected rather than treated as a delete-all - the app's own
241
+ comment records why: "a client bug can never turn 'nothing selected' into
242
+ 'delete the whole table'".
243
+
244
+ **Input**
245
+
246
+ | Field | Type | Required | Description |
247
+ |---|---|---|---|
248
+ | `path.table_id` | `string` | yes | Table id (UUID). |
249
+ | `body` | `WorkbenchRowsDeleteRequest` | yes | Request body; fields below. |
250
+
251
+ Body fields (`WorkbenchRowsDeleteRequest`):
252
+
253
+ | Field | Type | Required | Description |
254
+ |---|---|---|---|
255
+ | `body.exclude_row_ids` | `Array<integer> \| null` | no | max items 100000 |
256
+ | `body.row_ids` | `Array<integer> \| null` | no | max items 100000 |
257
+ | `body.select_all` | `boolean` | no | default `false` |
258
+
259
+ **Returns** `ApiResponse_dict_`: the envelope `{ data: Record<string, unknown>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
260
+
261
+ Other envelope fields: `pagination` (PaginationMeta).
262
+
263
+ **Example**
264
+
265
+ ```ts
266
+ // destructive: deletes or archives data; confirm with a human before calling.
267
+ const result = await g8.api.workbench.bulkDeleteWorkbenchRows({ path: { table_id: "id" }, body: {} });
268
+ ```
269
+
270
+ ---
271
+
272
+ <a id="op-bulkextractworkbenchcolumns"></a>
273
+
274
+ ### `g8.api.workbench.bulkExtractWorkbenchColumns(input)`
275
+
276
+ **Bulk Extract Workbench Columns**
277
+
278
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/columns/bulk-extract`
279
+ - operationId: `bulk_extract_workbench_columns_workbench_tables__table_id__columns_bulk_extract_post` (also callable as `g8.api.call("bulk_extract_workbench_columns_workbench_tables__table_id__columns_bulk_extract_post", input)`)
280
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
281
+ - API-key scope: `lists:write`
282
+
283
+ Up to 50 extractions in one pass. FREE.
284
+
285
+ Read the per-extraction result rather than the HTTP status: one bad
286
+ `field_path` is reported, not fatal to the other 49.
287
+
288
+ **Input**
289
+
290
+ | Field | Type | Required | Description |
291
+ |---|---|---|---|
292
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
293
+ | `body` | `BulkExtractRequest` | yes | Request body; fields below. |
294
+
295
+ Body fields (`BulkExtractRequest`):
296
+
297
+ | Field | Type | Required | Description |
298
+ |---|---|---|---|
299
+ | `body.extractions` | `Array<ExtractColumnRequest>` | yes | min items 1, max items 50 |
300
+
301
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
302
+
303
+ Other envelope fields: `pagination` (PaginationMeta).
304
+
305
+ **Example**
306
+
307
+ ```ts
308
+ const result = await g8.api.workbench.bulkExtractWorkbenchColumns({
309
+ path: { table_id: "id" },
310
+ body: {
311
+ extractions: [
312
+ {
313
+ column_name: "Example",
314
+ display_name: "Example",
315
+ field_path: "example",
316
+ source_column_id: 123,
317
+ },
318
+ ],
319
+ },
320
+ });
321
+ ```
322
+
323
+ ---
324
+
325
+ <a id="op-checkworkbenchscrapertoken"></a>
326
+
327
+ ### `g8.api.workbench.checkWorkbenchScraperToken(input)`
328
+
329
+ **Check Workbench Scraper Token**
330
+
331
+ - HTTP: `GET /api/v1/workbench/scraper/providers/{provider}/check-token`
332
+ - operationId: `check_workbench_scraper_token_workbench_scraper_providers__provider__check_token_get` (also callable as `g8.api.call("check_workbench_scraper_token_workbench_scraper_providers__provider__check_token_get", input)`)
333
+ - Tier: `read`: reads data; safe to call and to retry
334
+ - API-key scope: `lists:read`
335
+
336
+ Is the organisation's scraper credential present and working? FREE.
337
+
338
+ A connectivity check against the provider, not a scrape. Call it before a
339
+ run so a missing credential fails here rather than halfway through.
340
+
341
+ `provider` is a path parameter rather than a literal segment, matching
342
+ `/crm-syncs/{provider}/status`. Today it resolves to the one connected
343
+ provider the app supports; the handler takes no provider argument, so the
344
+ value selects the route rather than being forwarded.
345
+
346
+ **Input**
347
+
348
+ | Field | Type | Required | Description |
349
+ |---|---|---|---|
350
+ | `path.provider` | `"apify"` | yes | Which connected scraper provider. |
351
+
352
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
353
+
354
+ Other envelope fields: `pagination` (PaginationMeta).
355
+
356
+ **Example**
357
+
358
+ ```ts
359
+ const result = await g8.api.workbench.checkWorkbenchScraperToken({ path: { provider: "apify" } });
360
+ ```
361
+
362
+ ---
363
+
364
+ <a id="op-computeworkbenchformula"></a>
365
+
366
+ ### `g8.api.workbench.computeWorkbenchFormula(input)`
367
+
368
+ **Compute Workbench Formula**
369
+
370
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/columns/{col_id}/compute`
371
+ - operationId: `compute_workbench_formula_workbench_tables__table_id__columns__col_id__compute_post` (also callable as `g8.api.call("compute_workbench_formula_workbench_tables__table_id__columns__col_id__compute_post", input)`)
372
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
373
+ - API-key scope: `lists:write`
374
+
375
+ Evaluate a formula column across every row. FREE.
376
+
377
+ The formula runs locally - no model, no provider, no credit - so this is
378
+ safe to re-run as often as the inputs change. Per-row failures come back in
379
+ `errors` rather than failing the call.
380
+
381
+ **Input**
382
+
383
+ | Field | Type | Required | Description |
384
+ |---|---|---|---|
385
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
386
+ | `path.col_id` | `integer` | yes | The formula column to evaluate. |
387
+
388
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
389
+
390
+ Other envelope fields: `pagination` (PaginationMeta).
391
+
392
+ **Example**
393
+
394
+ ```ts
395
+ const result = await g8.api.workbench.computeWorkbenchFormula({ path: { table_id: "id", col_id: 123 } });
396
+ ```
397
+
398
+ ---
399
+
400
+ <a id="op-configureworkbenchai"></a>
401
+
402
+ ### `g8.api.workbench.configureWorkbenchAi(input)`
403
+
404
+ **Configure Workbench Ai**
405
+
406
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/ai/configure`
407
+ - operationId: `configure_workbench_ai_workbench_tables__table_id__ai_configure_post` (also callable as `g8.api.call("configure_workbench_ai_workbench_tables__table_id__ai_configure_post", input)`)
408
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
409
+ - API-key scope: `lists:write`
410
+
411
+ Set the table-level AI pass. FREE - saving runs nothing.
412
+
413
+ `output_columns` decides which columns the pass writes into; they are
414
+ created if missing. `multi_row_output` lets one source row produce up to
415
+ `max_rows_per_source` rows, which multiplies what a later run costs.
416
+
417
+ **Input**
418
+
419
+ | Field | Type | Required | Description |
420
+ |---|---|---|---|
421
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
422
+ | `body` | `SaveStagingAIConfigRequest` | yes | Request body; fields below. |
423
+
424
+ Body fields (`SaveStagingAIConfigRequest`):
425
+
426
+ | Field | Type | Required | Description |
427
+ |---|---|---|---|
428
+ | `body.prompt` | `string` | yes | min length 1 |
429
+ | `body.entity_type` | `"contact" \| "company" \| null` | no | |
430
+ | `body.max_rows_per_source` | `integer` | no | default `50`, min 1, max 50 |
431
+ | `body.model` | `string` | no | default `"openai/gpt-4o"` |
432
+ | `body.multi_row_output` | `boolean` | no | default `false` |
433
+ | `body.output_columns` | `Array<OutputColumnDef>` | no | |
434
+ | `body.usecase` | `string` | no | default `"content_generation"` |
435
+
436
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
437
+
438
+ Other envelope fields: `pagination` (PaginationMeta).
439
+
440
+ **Example**
441
+
442
+ ```ts
443
+ const result = await g8.api.workbench.configureWorkbenchAi({ path: { table_id: "id" }, body: { prompt: "example" } });
444
+ ```
445
+
446
+ ---
447
+
448
+ <a id="op-configureworkbenchcolumnsource"></a>
449
+
450
+ ### `g8.api.workbench.configureWorkbenchColumnSource(input)`
451
+
452
+ **Configure Workbench Column Source**
453
+
454
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/columns/{col_id}/sources`
455
+ - operationId: `configure_workbench_column_source_workbench_tables__table_id__columns__col_id__sources_post` (also callable as `g8.api.call("configure_workbench_column_source_workbench_tables__table_id__columns__col_id__sources_post", input)`)
456
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
457
+ - API-key scope: `lists:write`
458
+
459
+ Point an ingest source at a column. Free.
460
+
461
+ The credential this mints is shown ONCE, in this response. There is no
462
+ second read - `GET /workbench/source-credentials` lists metadata only.
463
+
464
+ `rotate_existing` is an explicit acknowledgement rather than a default:
465
+ rotating invalidates the current credential IMMEDIATELY, so anything
466
+ already posting with it stops at that instant.
467
+
468
+ **Input**
469
+
470
+ | Field | Type | Required | Description |
471
+ |---|---|---|---|
472
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
473
+ | `path.col_id` | `integer` | yes | Column id. |
474
+ | `body` | `ConfigureRawSourceRequest` | yes | Request body; fields below. |
475
+
476
+ Body fields (`ConfigureRawSourceRequest`):
477
+
478
+ | Field | Type | Required | Description |
479
+ |---|---|---|---|
480
+ | `body.config` | `Record<string, unknown> \| null` | no | Source-specific settings. |
481
+ | `body.expires_in_days` | `integer` | no | Credential lifetime, applied when one is first generated. default `90`, min 1, max 365 |
482
+ | `body.label` | `string \| null` | no | max length 255 |
483
+ | `body.rotate_existing` | `boolean` | no | Explicitly acknowledge that an existing credential is invalidated IMMEDIATELY. Anything already posting with the old key stops. default `false` |
484
+ | `body.source_type` | `"webhook" \| "legacy_webhook" \| "scraper_bot"` | no | Which kind of source feeds this column. default `"webhook"` |
485
+
486
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
487
+
488
+ Other envelope fields: `pagination` (PaginationMeta).
489
+
490
+ **Example**
491
+
492
+ ```ts
493
+ const result = await g8.api.workbench.configureWorkbenchColumnSource({ path: { table_id: "id", col_id: 123 }, body: {} });
494
+ ```
495
+
496
+ ---
497
+
498
+ <a id="op-configureworkbenchfindpeople"></a>
499
+
500
+ ### `g8.api.workbench.configureWorkbenchFindPeople(input)`
501
+
502
+ **Configure Workbench Find People**
503
+
504
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/find-people/configure`
505
+ - operationId: `configure_workbench_find_people_workbench_tables__table_id__find_people_configure_post` (also callable as `g8.api.call("configure_workbench_find_people_workbench_tables__table_id__find_people_configure_post", input)`)
506
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
507
+ - API-key scope: `lists:run`
508
+
509
+ Search for contacts at each company row. SPENDS CREDITS.
510
+
511
+ This queries the licensed people corpus and writes the matches into a
512
+ contact table. The rows land LOCKED: the search is what this costs, and
513
+ revealing each contact's details then costs a further credit per row
514
+ through `unlock-rows`.
515
+
516
+ `max_total_people` is the real cost control - it is a hard ceiling across
517
+ every company row, not a per-company hint. `broad_search_acknowledged` must
518
+ be set to run with NO filters, because an unfiltered search returns the
519
+ widest and most expensive possible result.
520
+
521
+ **Input**
522
+
523
+ | Field | Type | Required | Description |
524
+ |---|---|---|---|
525
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
526
+ | `body` | `ConfigureStagingFindPeopleRequest` | yes | Request body; fields below. |
527
+
528
+ Body fields (`ConfigureStagingFindPeopleRequest`):
529
+
530
+ | Field | Type | Required | Description |
531
+ |---|---|---|---|
532
+ | `body.domain_column` | `string` | yes | Column holding company domains or LinkedIn URLs. min length 1 |
533
+ | `body.auto_create_columns` | `boolean` | no | default `true` |
534
+ | `body.broad_search_acknowledged` | `boolean` | no | Confirm an EMPTY filter set is intentional. An unfiltered search returns the widest - and most expensive - possible result. default `false` |
535
+ | `body.company_name_column` | `string \| null` | no | |
536
+ | `body.create_destination_table` | `boolean` | no | default `false` |
537
+ | `body.destination_table_id` | `string \| null` | no | |
538
+ | `body.destination_table_name` | `string \| null` | no | max length 255 |
539
+ | `body.lookup_field` | `"COMPANY_DOMAIN" \| "COMPANY_LINKEDIN_URL"` | no | default `"COMPANY_DOMAIN"` |
540
+ | `body.max_people_per_company` | `integer` | no | default `5`, min 1, max 100 |
541
+ | `body.max_total_people` | `integer` | no | Hard ceiling across every company row. default `250`, min 1, max 10000 |
542
+ | `body.name` | `string` | no | default `"Find People"`, min length 1, max length 255 |
543
+ | `body.search_filters` | `Array<FindPeopleSearchFilter>` | no | |
544
+ | `body.skip_existing` | `boolean` | no | default `true` |
545
+
546
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
547
+
548
+ Other envelope fields: `pagination` (PaginationMeta).
549
+
550
+ **Example**
551
+
552
+ ```ts
553
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
554
+ const result = await g8.api.workbench.configureWorkbenchFindPeople({ path: { table_id: "id" }, body: { domain_column: "acme.com" } });
555
+ ```
556
+
557
+ ---
558
+
559
+ <a id="op-createworkbenchaigroup"></a>
560
+
561
+ ### `g8.api.workbench.createWorkbenchAiGroup(input)`
562
+
563
+ **Create Workbench Ai Group**
564
+
565
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/ai/groups/config`
566
+ - operationId: `create_workbench_ai_group_workbench_tables__table_id__ai_groups_config_post` (also callable as `g8.api.call("create_workbench_ai_group_workbench_tables__table_id__ai_groups_config_post", input)`)
567
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
568
+ - API-key scope: `lists:write`
569
+
570
+ Create an AI group on this table. FREE - saving never runs.
571
+
572
+ `config.run_immediately` is pinned to false by the app, so this cannot
573
+ become a spend by accident. Run the group explicitly afterwards.
574
+
575
+ Two settings decide most of what a later run costs:
576
+ `config.skip_existing_values` (skip rows that already have a value) and
577
+ `config.skip_recently_enriched` (skip rows touched in the last 30 days).
578
+ Both default to true; turning either off re-buys data you already have.
579
+
580
+ The path is `/ai/groups/config` rather than a POST to `/ai/groups`, matching
581
+ the app exactly - a different spelling here would be a second way to say the
582
+ same thing.
583
+
584
+ **Input**
585
+
586
+ | Field | Type | Required | Description |
587
+ |---|---|---|---|
588
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
589
+ | `body` | `SaveAIConfigRequest` | yes | Request body; fields below. |
590
+
591
+ Body fields (`SaveAIConfigRequest`):
592
+
593
+ | Field | Type | Required | Description |
594
+ |---|---|---|---|
595
+ | `body.config` | `AIEnrichmentConfigDto` | yes | |
596
+ | `body.run_immediately` | `false` | no | Always false. Saving never runs - the app refuses immediate execution so a save can never become an unpriced spend. default `false` |
597
+ | `body.target_records` | `Array<string (uuid)> \| null` | no | |
598
+
599
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
600
+
601
+ Other envelope fields: `pagination` (PaginationMeta).
602
+
603
+ **Example**
604
+
605
+ ```ts
606
+ const result = await g8.api.workbench.createWorkbenchAiGroup({
607
+ path: { table_id: "id" },
608
+ body: {
609
+ config: {
610
+ config: {},
611
+ input_mapping: ["example"],
612
+ model: "example",
613
+ outputs: [{ name: "Example", type: "example" }],
614
+ prompt: "example",
615
+ usecase: "example",
616
+ },
617
+ },
618
+ });
619
+ ```
620
+
621
+ ---
622
+
623
+ <a id="op-createworkbenchbindings"></a>
624
+
625
+ ### `g8.api.workbench.createWorkbenchBindings(input)`
626
+
627
+ **Create Workbench Bindings**
628
+
629
+ - HTTP: `POST /api/v1/workbench-bindings`
630
+ - operationId: `create_workbench_bindings_workbench_bindings_post` (also callable as `g8.api.call("create_workbench_bindings_workbench_bindings_post", input)`)
631
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
632
+ - API-key scope: `lists:write`
633
+
634
+ Show a workflow's outputs as columns on a list. FREE.
635
+
636
+ Requires WRITE access to the list. The columns appear on the list's next
637
+ column fetch; their values fill in when the workflow runs.
638
+
639
+ **Input**
640
+
641
+ | Field | Type | Required | Description |
642
+ |---|---|---|---|
643
+ | `body` | `CreateWorkbenchBindingsRequest` | yes | Request body; fields below. |
644
+
645
+ Body fields (`CreateWorkbenchBindingsRequest`):
646
+
647
+ | Field | Type | Required | Description |
648
+ |---|---|---|---|
649
+ | `body.bindings` | `Array<WorkbenchBindingItem>` | yes | At least one. The app refuses an empty set; so does this. min items 1 |
650
+ | `body.list_id` | `integer` | yes | The list whose grid gains the columns. |
651
+ | `body.workflow_id` | `string` | yes | The workflow producing the values. |
652
+
653
+ **Returns** `ApiResponse_EnrichmentListPayload_`: the envelope `{ data: EnrichmentListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
654
+
655
+ Other envelope fields: `pagination` (PaginationMeta).
656
+
657
+ `EnrichmentListPayload` fields:
658
+
659
+ | Field | Type | Required | Description |
660
+ |---|---|---|---|
661
+ | `items` | `Array<unknown>` | no | The collection, always present. |
662
+
663
+ **Example**
664
+
665
+ ```ts
666
+ const result = await g8.api.workbench.createWorkbenchBindings({
667
+ body: {
668
+ bindings: [
669
+ {
670
+ column_name: "Example",
671
+ column_type: "computed",
672
+ node_id: "id",
673
+ output_path: "example",
674
+ },
675
+ ],
676
+ list_id: 123,
677
+ workflow_id: "id",
678
+ },
679
+ });
680
+ ```
681
+
682
+ ---
683
+
684
+ <a id="op-createworkbenchconnection"></a>
685
+
686
+ ### `g8.api.workbench.createWorkbenchConnection(input)`
687
+
688
+ **Create Workbench Connection**
689
+
690
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/connections`
691
+ - operationId: `create_workbench_connection_workbench_tables__table_id__connections_post` (also callable as `g8.api.call("create_workbench_connection_workbench_tables__table_id__connections_post", input)`)
692
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
693
+ - API-key scope: `lists:write`
694
+
695
+ Connect this table to another table in your organisation, so rows are
696
+ copied across. Free.
697
+
698
+ **Input**
699
+
700
+ | Field | Type | Required | Description |
701
+ |---|---|---|---|
702
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
703
+ | `body` | `TableConnectionRequest` | yes | Request body; fields below. |
704
+
705
+ Body fields (`TableConnectionRequest`):
706
+
707
+ | Field | Type | Required | Description |
708
+ |---|---|---|---|
709
+ | `body.destination_table_id` | `string (uuid)` | yes | |
710
+ | `body.field_mapping` | `Record<string, string> \| null` | no | Source column -> destination. |
711
+ | `body.filter_conditions` | `Record<string, unknown> \| null` | no | |
712
+ | `body.sync_mode` | `"append"` | no | default `"append"` |
713
+
714
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
715
+
716
+ Other envelope fields: `pagination` (PaginationMeta).
717
+
718
+ **Example**
719
+
720
+ ```ts
721
+ const result = await g8.api.workbench.createWorkbenchConnection({
722
+ path: { table_id: "id" },
723
+ body: { destination_table_id: "00000000-0000-0000-0000-000000000000" },
724
+ });
725
+ ```
726
+
727
+ ---
728
+
729
+ <a id="op-createworkbenchformulacolumns"></a>
730
+
731
+ ### `g8.api.workbench.createWorkbenchFormulaColumns(input)`
732
+
733
+ **Create Workbench Formula Columns**
734
+
735
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/formula-columns`
736
+ - operationId: `create_workbench_formula_columns_workbench_tables__table_id__formula_columns_post` (also callable as `g8.api.call("create_workbench_formula_columns_workbench_tables__table_id__formula_columns_post", input)`)
737
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
738
+ - API-key scope: `lists:write`
739
+
740
+ Create a formula column with one child column per output. FREE.
741
+
742
+ You supply the formula, so nothing authors it and nothing is charged. The
743
+ AI-authoring path is the one that costs, and
744
+ `formula-columns/generate-quote` prices it.
745
+
746
+ **Input**
747
+
748
+ | Field | Type | Required | Description |
749
+ |---|---|---|---|
750
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
751
+ | `body` | `CreateFormulaColumnsRequest` | yes | Request body; fields below. |
752
+
753
+ Body fields (`CreateFormulaColumnsRequest`):
754
+
755
+ | Field | Type | Required | Description |
756
+ |---|---|---|---|
757
+ | `body.formula` | `string` | yes | The G8X formula expression. min length 1 |
758
+ | `body.output_columns` | `Array<FormulaOutputColumnDef>` | yes | min items 1, max items 20 |
759
+ | `body.description` | `string \| null` | no | max length 4000 |
760
+
761
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
762
+
763
+ Other envelope fields: `pagination` (PaginationMeta).
764
+
765
+ **Example**
766
+
767
+ ```ts
768
+ const result = await g8.api.workbench.createWorkbenchFormulaColumns({
769
+ path: { table_id: "id" },
770
+ body: {
771
+ formula: "example",
772
+ output_columns: [{ display_name: "Example", name: "Example" }],
773
+ },
774
+ });
775
+ ```
776
+
777
+ ---
778
+
779
+ <a id="op-createworkbenchpipeline"></a>
780
+
781
+ ### `g8.api.workbench.createWorkbenchPipeline(input)`
782
+
783
+ **Create Workbench Pipeline**
784
+
785
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/pipelines`
786
+ - operationId: `create_workbench_pipeline_workbench_tables__table_id__pipelines_post` (also callable as `g8.api.call("create_workbench_pipeline_workbench_tables__table_id__pipelines_post", input)`)
787
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
788
+ - API-key scope: `lists:run`
789
+
790
+ Create a pipeline that processes new rows step by step. CAN ARM SPEND.
791
+
792
+ `enabled` defaults to false. Enabled, it runs its AI and waterfall steps -
793
+ each charged per row - on every row that arrives.
794
+
795
+ **Input**
796
+
797
+ | Field | Type | Required | Description |
798
+ |---|---|---|---|
799
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
800
+ | `body` | `CreateWorkbenchPipelineRequest` | yes | Request body; fields below. |
801
+
802
+ Body fields (`CreateWorkbenchPipelineRequest`):
803
+
804
+ | Field | Type | Required | Description |
805
+ |---|---|---|---|
806
+ | `body.name` | `string` | yes | |
807
+ | `body.start` | `PipelineStartConfig` | yes | |
808
+ | `body.enabled` | `boolean` | no | default `false` |
809
+ | `body.steps` | `Array<WorkbenchPipelineStep>` | no | |
810
+
811
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
812
+
813
+ Other envelope fields: `pagination` (PaginationMeta).
814
+
815
+ **Example**
816
+
817
+ ```ts
818
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
819
+ const result = await g8.api.workbench.createWorkbenchPipeline({
820
+ path: { table_id: "id" },
821
+ body: { name: "Example", start: { type: "email_pdf" } },
822
+ });
823
+ ```
824
+
825
+ ---
826
+
827
+ <a id="op-createworkbenchtable"></a>
828
+
829
+ ### `g8.api.workbench.createWorkbenchTable(input)`
830
+
831
+ **Create Workbench Table**
832
+
833
+ - HTTP: `POST /api/v1/workbench/tables`
834
+ - operationId: `create_workbench_table_workbench_tables_post` (also callable as `g8.api.call("create_workbench_table_workbench_tables_post", input)`)
835
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
836
+ - API-key scope: `lists:write`
837
+
838
+ Create an empty table.
839
+
840
+ `entity_type` decides what the rows become on export and is settable here,
841
+ at creation - which is why the update model does not offer it.
842
+
843
+ **Input**
844
+
845
+ | Field | Type | Required | Description |
846
+ |---|---|---|---|
847
+ | `body` | `WorkbenchTableCreateRequest` | yes | Request body; fields below. |
848
+
849
+ Body fields (`WorkbenchTableCreateRequest`):
850
+
851
+ | Field | Type | Required | Description |
852
+ |---|---|---|---|
853
+ | `body.name` | `string` | yes | Table name. min length 1 |
854
+ | `body.description` | `string \| null` | no | |
855
+ | `body.entity_type` | `"contact" \| "company" \| null` | no | What the rows will become on export. Settable once, at creation. |
856
+
857
+ **Returns** `ApiResponse_WorkbenchTable_`: the envelope `{ data: WorkbenchTable, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
858
+
859
+ Other envelope fields: `pagination` (PaginationMeta).
860
+
861
+ `WorkbenchTable` fields:
862
+
863
+ | Field | Type | Required | Description |
864
+ |---|---|---|---|
865
+ | `created_at` | `string (date-time) \| null` | no | |
866
+ | `description` | `string \| null` | no | |
867
+ | `entity_type` | `string \| null` | no | contact or company. |
868
+ | `id` | `string \| null` | no | |
869
+ | `name` | `string \| null` | no | |
870
+ | `row_count` | `integer \| null` | no | |
871
+ | `updated_at` | `string (date-time) \| null` | no | |
872
+
873
+ **Example**
874
+
875
+ ```ts
876
+ const result = await g8.api.workbench.createWorkbenchTable({ body: { name: "Example" } });
877
+ ```
878
+
879
+ ---
880
+
881
+ <a id="op-createworkbenchtrigger"></a>
882
+
883
+ ### `g8.api.workbench.createWorkbenchTrigger(input)`
884
+
885
+ **Create Workbench Trigger**
886
+
887
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/triggers`
888
+ - operationId: `create_workbench_trigger_workbench_tables__table_id__triggers_post` (also callable as `g8.api.call("create_workbench_trigger_workbench_tables__table_id__triggers_post", input)`)
889
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
890
+ - API-key scope: `lists:run`
891
+
892
+ React to rows as they arrive or change. CAN ARM ONGOING SPEND.
893
+
894
+ `enabled` DEFAULTS TO TRUE. With `action_type: run_ai`, every matching row
895
+ is enriched, and charged, as it arrives. `webhook_notify` URLs are checked
896
+ and unsafe targets refused.
897
+
898
+ **Input**
899
+
900
+ | Field | Type | Required | Description |
901
+ |---|---|---|---|
902
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
903
+ | `body` | `CreateTriggerRequest` | yes | Request body; fields below. |
904
+
905
+ Body fields (`CreateTriggerRequest`):
906
+
907
+ | Field | Type | Required | Description |
908
+ |---|---|---|---|
909
+ | `body.action_type` | `"run_ai" \| "run_formula" \| "export" \| "webhook_notify"` | yes | |
910
+ | `body.event_type` | `"ingest" \| "ai_complete" \| "status_change"` | yes | |
911
+ | `body.name` | `string` | yes | min length 1, max length 255 |
912
+ | `body.action_config` | `Record<string, unknown>` | no | |
913
+ | `body.conditions` | `Record<string, unknown> \| null` | no | |
914
+ | `body.enabled` | `boolean` | no | default `true` |
915
+
916
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
917
+
918
+ Other envelope fields: `pagination` (PaginationMeta).
919
+
920
+ **Example**
921
+
922
+ ```ts
923
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
924
+ const result = await g8.api.workbench.createWorkbenchTrigger({
925
+ path: { table_id: "id" },
926
+ body: { action_type: "run_ai", event_type: "ingest", name: "Example" },
927
+ });
928
+ ```
929
+
930
+ ---
931
+
932
+ <a id="op-deletescraperproviderconnection"></a>
933
+
934
+ ### `g8.api.workbench.deleteScraperProviderConnection(input)`
935
+
936
+ **Delete Scraper Provider Connection**
937
+
938
+ - HTTP: `DELETE /api/v1/workbench/scraper/providers/{provider}/connection`
939
+ - operationId: `delete_scraper_provider_connection_workbench_scraper_providers__provider__connection_delete` (also callable as `g8.api.call("delete_scraper_provider_connection_workbench_scraper_providers__provider__connection_delete", input)`)
940
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
941
+ - API-key scope: `lists:delete`
942
+
943
+ Disconnect your provider account. Provider scraper runs stop working.
944
+
945
+ **Input**
946
+
947
+ | Field | Type | Required | Description |
948
+ |---|---|---|---|
949
+ | `path.provider` | `"apify"` | yes | Which scraper provider. |
950
+
951
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
952
+
953
+ Other envelope fields: `pagination` (PaginationMeta).
954
+
955
+ **Example**
956
+
957
+ ```ts
958
+ // destructive: deletes or archives data; confirm with a human before calling.
959
+ const result = await g8.api.workbench.deleteScraperProviderConnection({ path: { provider: "apify" } });
960
+ ```
961
+
962
+ ---
963
+
964
+ <a id="op-deleteworkbenchaigroup"></a>
965
+
966
+ ### `g8.api.workbench.deleteWorkbenchAiGroup(input)`
967
+
968
+ **Delete Workbench Ai Group**
969
+
970
+ - HTTP: `DELETE /api/v1/workbench/tables/{table_id}/ai/groups/{group_id}`
971
+ - operationId: `delete_workbench_ai_group_workbench_tables__table_id__ai_groups__group_id__delete` (also callable as `g8.api.call("delete_workbench_ai_group_workbench_tables__table_id__ai_groups__group_id__delete", input)`)
972
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
973
+ - API-key scope: `lists:delete`
974
+
975
+ Remove an AI group. Free.
976
+
977
+ Values the group already wrote into columns stay - you are deleting the
978
+ instruction, not the data you paid for.
979
+
980
+ **Input**
981
+
982
+ | Field | Type | Required | Description |
983
+ |---|---|---|---|
984
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
985
+ | `path.group_id` | `string` | yes | AI group id (starts with `ai_enrich`). |
986
+
987
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
988
+
989
+ Other envelope fields: `pagination` (PaginationMeta).
990
+
991
+ **Example**
992
+
993
+ ```ts
994
+ // destructive: deletes or archives data; confirm with a human before calling.
995
+ const result = await g8.api.workbench.deleteWorkbenchAiGroup({ path: { table_id: "id", group_id: "id" } });
996
+ ```
997
+
998
+ ---
999
+
1000
+ <a id="op-deleteworkbenchbinding"></a>
1001
+
1002
+ ### `g8.api.workbench.deleteWorkbenchBinding(input)`
1003
+
1004
+ **Delete Workbench Binding**
1005
+
1006
+ - HTTP: `DELETE /api/v1/workbench-bindings/{binding_id}`
1007
+ - operationId: `delete_workbench_binding_workbench_bindings__binding_id__delete` (also callable as `g8.api.call("delete_workbench_binding_workbench_bindings__binding_id__delete", input)`)
1008
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
1009
+ - API-key scope: `lists:delete`
1010
+
1011
+ Remove one binding. FREE.
1012
+
1013
+ The column leaves the grid on the next column fetch. Requires WRITE access
1014
+ to the list the binding sits on; the app resolves that list from the
1015
+ binding itself, so a binding on a list the key cannot write is refused.
1016
+
1017
+ **Input**
1018
+
1019
+ | Field | Type | Required | Description |
1020
+ |---|---|---|---|
1021
+ | `path.binding_id` | `string` | yes | The binding to remove. |
1022
+
1023
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1024
+
1025
+ Other envelope fields: `pagination` (PaginationMeta).
1026
+
1027
+ **Example**
1028
+
1029
+ ```ts
1030
+ // destructive: deletes or archives data; confirm with a human before calling.
1031
+ const result = await g8.api.workbench.deleteWorkbenchBinding({ path: { binding_id: "id" } });
1032
+ ```
1033
+
1034
+ ---
1035
+
1036
+ <a id="op-deleteworkbenchcolumn"></a>
1037
+
1038
+ ### `g8.api.workbench.deleteWorkbenchColumn(input)`
1039
+
1040
+ **Delete Workbench Column**
1041
+
1042
+ - HTTP: `DELETE /api/v1/workbench/tables/{table_id}/columns/{column_id}`
1043
+ - operationId: `delete_workbench_column_workbench_tables__table_id__columns__column_id__delete` (also callable as `g8.api.call("delete_workbench_column_workbench_tables__table_id__columns__column_id__delete", input)`)
1044
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
1045
+ - API-key scope: `lists:delete`
1046
+
1047
+ Delete a column and the values in it, on every row.
1048
+
1049
+ **Input**
1050
+
1051
+ | Field | Type | Required | Description |
1052
+ |---|---|---|---|
1053
+ | `path.table_id` | `string` | yes | Table id (UUID). |
1054
+ | `path.column_id` | `integer` | yes | Column id. |
1055
+
1056
+ **Returns** `ApiResponse_dict_`: the envelope `{ data: Record<string, unknown>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1057
+
1058
+ Other envelope fields: `pagination` (PaginationMeta).
1059
+
1060
+ **Example**
1061
+
1062
+ ```ts
1063
+ // destructive: deletes or archives data; confirm with a human before calling.
1064
+ const result = await g8.api.workbench.deleteWorkbenchColumn({ path: { table_id: "id", column_id: 123 } });
1065
+ ```
1066
+
1067
+ ---
1068
+
1069
+ <a id="op-deleteworkbenchconnection"></a>
1070
+
1071
+ ### `g8.api.workbench.deleteWorkbenchConnection(input)`
1072
+
1073
+ **Delete Workbench Connection**
1074
+
1075
+ - HTTP: `DELETE /api/v1/workbench/tables/{table_id}/connections/{connection_id}`
1076
+ - operationId: `delete_workbench_connection_workbench_tables__table_id__connections__connection_id__delete` (also callable as `g8.api.call("delete_workbench_connection_workbench_tables__table_id__connections__connection_id__delete", input)`)
1077
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
1078
+ - API-key scope: `lists:delete`
1079
+
1080
+ Remove a connection. Rows already copied stay where they are.
1081
+
1082
+ **Input**
1083
+
1084
+ | Field | Type | Required | Description |
1085
+ |---|---|---|---|
1086
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
1087
+ | `path.connection_id` | `integer` | yes | Connection id. |
1088
+
1089
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1090
+
1091
+ Other envelope fields: `pagination` (PaginationMeta).
1092
+
1093
+ **Example**
1094
+
1095
+ ```ts
1096
+ // destructive: deletes or archives data; confirm with a human before calling.
1097
+ const result = await g8.api.workbench.deleteWorkbenchConnection({ path: { table_id: "id", connection_id: 123 } });
1098
+ ```
1099
+
1100
+ ---
1101
+
1102
+ <a id="op-deleteworkbenchfindpeopleconfig"></a>
1103
+
1104
+ ### `g8.api.workbench.deleteWorkbenchFindPeopleConfig(input)`
1105
+
1106
+ **Delete Workbench Find People Config**
1107
+
1108
+ - HTTP: `DELETE /api/v1/workbench/tables/{table_id}/find-people/{config_id}`
1109
+ - operationId: `delete_workbench_find_people_config_workbench_tables__table_id__find_people__config_id__delete` (also callable as `g8.api.call("delete_workbench_find_people_config_workbench_tables__table_id__find_people__config_id__delete", input)`)
1110
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
1111
+ - API-key scope: `lists:delete`
1112
+
1113
+ Remove a find-people configuration. Free. Contacts already found stay.
1114
+
1115
+ **Input**
1116
+
1117
+ | Field | Type | Required | Description |
1118
+ |---|---|---|---|
1119
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
1120
+ | `path.config_id` | `string` | yes | Find-people configuration id (UUID). |
1121
+
1122
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1123
+
1124
+ Other envelope fields: `pagination` (PaginationMeta).
1125
+
1126
+ **Example**
1127
+
1128
+ ```ts
1129
+ // destructive: deletes or archives data; confirm with a human before calling.
1130
+ const result = await g8.api.workbench.deleteWorkbenchFindPeopleConfig({ path: { table_id: "id", config_id: "id" } });
1131
+ ```
1132
+
1133
+ ---
1134
+
1135
+ <a id="op-deleteworkbenchpipeline"></a>
1136
+
1137
+ ### `g8.api.workbench.deleteWorkbenchPipeline(input)`
1138
+
1139
+ **Delete Workbench Pipeline**
1140
+
1141
+ - HTTP: `DELETE /api/v1/workbench/tables/{table_id}/pipelines/{pipeline_id}`
1142
+ - operationId: `delete_workbench_pipeline_workbench_tables__table_id__pipelines__pipeline_id__delete` (also callable as `g8.api.call("delete_workbench_pipeline_workbench_tables__table_id__pipelines__pipeline_id__delete", input)`)
1143
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
1144
+ - API-key scope: `lists:delete`
1145
+
1146
+ Delete a pipeline.
1147
+
1148
+ **Input**
1149
+
1150
+ | Field | Type | Required | Description |
1151
+ |---|---|---|---|
1152
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
1153
+ | `path.pipeline_id` | `string` | yes | Pipeline id (UUID). |
1154
+
1155
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1156
+
1157
+ Other envelope fields: `pagination` (PaginationMeta).
1158
+
1159
+ **Example**
1160
+
1161
+ ```ts
1162
+ // destructive: deletes or archives data; confirm with a human before calling.
1163
+ const result = await g8.api.workbench.deleteWorkbenchPipeline({ path: { table_id: "id", pipeline_id: "id" } });
1164
+ ```
1165
+
1166
+ ---
1167
+
1168
+ <a id="op-deleteworkbenchschedule"></a>
1169
+
1170
+ ### `g8.api.workbench.deleteWorkbenchSchedule(input)`
1171
+
1172
+ **Delete Workbench Schedule**
1173
+
1174
+ - HTTP: `DELETE /api/v1/workbench/tables/{table_id}/schedule`
1175
+ - operationId: `delete_workbench_schedule_workbench_tables__table_id__schedule_delete` (also callable as `g8.api.call("delete_workbench_schedule_workbench_tables__table_id__schedule_delete", input)`)
1176
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
1177
+ - API-key scope: `lists:delete`
1178
+
1179
+ Remove the schedule. Free, and the fastest way to stop recurring spend.
1180
+
1181
+ **Input**
1182
+
1183
+ | Field | Type | Required | Description |
1184
+ |---|---|---|---|
1185
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
1186
+
1187
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1188
+
1189
+ Other envelope fields: `pagination` (PaginationMeta).
1190
+
1191
+ **Example**
1192
+
1193
+ ```ts
1194
+ // destructive: deletes or archives data; confirm with a human before calling.
1195
+ const result = await g8.api.workbench.deleteWorkbenchSchedule({ path: { table_id: "id" } });
1196
+ ```
1197
+
1198
+ ---
1199
+
1200
+ <a id="op-deleteworkbenchtable"></a>
1201
+
1202
+ ### `g8.api.workbench.deleteWorkbenchTable(input)`
1203
+
1204
+ **Delete Workbench Table**
1205
+
1206
+ - HTTP: `DELETE /api/v1/workbench/tables/{table_id}`
1207
+ - operationId: `delete_workbench_table_workbench_tables__table_id__delete` (also callable as `g8.api.call("delete_workbench_table_workbench_tables__table_id__delete", input)`)
1208
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
1209
+ - API-key scope: `lists:delete`
1210
+
1211
+ Delete the table AND every row in it. Not recoverable through this API.
1212
+
1213
+ **Input**
1214
+
1215
+ | Field | Type | Required | Description |
1216
+ |---|---|---|---|
1217
+ | `path.table_id` | `string` | yes | Table id (UUID). |
1218
+
1219
+ **Returns** `ApiResponse_dict_`: the envelope `{ data: Record<string, unknown>, ... }`. `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
+ // destructive: deletes or archives data; confirm with a human before calling.
1227
+ const result = await g8.api.workbench.deleteWorkbenchTable({ path: { table_id: "id" } });
1228
+ ```
1229
+
1230
+ ---
1231
+
1232
+ <a id="op-deleteworkbenchtrigger"></a>
1233
+
1234
+ ### `g8.api.workbench.deleteWorkbenchTrigger(input)`
1235
+
1236
+ **Delete Workbench Trigger**
1237
+
1238
+ - HTTP: `DELETE /api/v1/workbench/tables/{table_id}/triggers/{trigger_id}`
1239
+ - operationId: `delete_workbench_trigger_workbench_tables__table_id__triggers__trigger_id__delete` (also callable as `g8.api.call("delete_workbench_trigger_workbench_tables__table_id__triggers__trigger_id__delete", input)`)
1240
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
1241
+ - API-key scope: `lists:delete`
1242
+
1243
+ Delete a trigger. Stops whatever spend it armed.
1244
+
1245
+ **Input**
1246
+
1247
+ | Field | Type | Required | Description |
1248
+ |---|---|---|---|
1249
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
1250
+ | `path.trigger_id` | `integer` | yes | Trigger id. |
1251
+
1252
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1253
+
1254
+ Other envelope fields: `pagination` (PaginationMeta).
1255
+
1256
+ **Example**
1257
+
1258
+ ```ts
1259
+ // destructive: deletes or archives data; confirm with a human before calling.
1260
+ const result = await g8.api.workbench.deleteWorkbenchTrigger({ path: { table_id: "id", trigger_id: 123 } });
1261
+ ```
1262
+
1263
+ ---
1264
+
1265
+ <a id="op-discoverworkbenchfields"></a>
1266
+
1267
+ ### `g8.api.workbench.discoverWorkbenchFields(input)`
1268
+
1269
+ **Discover Workbench Fields**
1270
+
1271
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/discover-fields`
1272
+ - operationId: `discover_workbench_fields_workbench_tables__table_id__discover_fields_post` (also callable as `g8.api.call("discover_workbench_fields_workbench_tables__table_id__discover_fields_post", input)`)
1273
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
1274
+ - API-key scope: `lists:write`
1275
+
1276
+ List the JSON paths present inside a raw column. FREE.
1277
+
1278
+ Despite the name this calls no provider and spends nothing - it samples
1279
+ rows the customer already imported and reports the shapes it found. Call it
1280
+ before `columns/extract` to learn what `field_path` values exist.
1281
+
1282
+ **Input**
1283
+
1284
+ | Field | Type | Required | Description |
1285
+ |---|---|---|---|
1286
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
1287
+ | `body` | `DiscoverFieldsRequest` | yes | Request body; fields below. |
1288
+
1289
+ Body fields (`DiscoverFieldsRequest`):
1290
+
1291
+ | Field | Type | Required | Description |
1292
+ |---|---|---|---|
1293
+ | `body.source_column_id` | `integer` | yes | The raw JSON column to scan. |
1294
+ | `body.sample_size` | `integer` | no | Rows to sample. default `100`, min 1, max 1000 |
1295
+
1296
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1297
+
1298
+ Other envelope fields: `pagination` (PaginationMeta).
1299
+
1300
+ **Example**
1301
+
1302
+ ```ts
1303
+ const result = await g8.api.workbench.discoverWorkbenchFields({ path: { table_id: "id" }, body: { source_column_id: 123 } });
1304
+ ```
1305
+
1306
+ ---
1307
+
1308
+ <a id="op-estimateworkbenchproviderscrapercredits"></a>
1309
+
1310
+ ### `g8.api.workbench.estimateWorkbenchProviderScraperCredits(input)`
1311
+
1312
+ **Estimate Workbench Provider Scraper Credits**
1313
+
1314
+ - HTTP: `GET /api/v1/workbench/scraper/providers/{provider}/credit-estimate`
1315
+ - operationId: `estimate_workbench_provider_scraper_credits_workbench_scraper_providers__provider__credit_estimate_get` (also callable as `g8.api.call("estimate_workbench_provider_scraper_credits_workbench_scraper_providers__provider__credit_estimate_get", input)`)
1316
+ - Tier: `read`: reads data; safe to call and to retry
1317
+ - API-key scope: `lists:read`
1318
+
1319
+ Price a run on a connected scraper provider. CHARGES NOTHING.
1320
+
1321
+ Every component broken out: the scraper credits, the per-result rate, the
1322
+ post-scrape enrichment, the live balance and what would be left. Nothing is
1323
+ scraped.
1324
+
1325
+ **Input**
1326
+
1327
+ | Field | Type | Required | Description |
1328
+ |---|---|---|---|
1329
+ | `path.provider` | `"apify"` | yes | Which connected scraper provider. |
1330
+ | `query.table_id` | `string` | yes | The table the results would land in. |
1331
+ | `query.max_results` | `integer` | yes | Ceiling on results the run would return. |
1332
+ | `query.preset_id` | `string \| null` | no | Preset to price against. Omit for the provider's default rate. |
1333
+ | `query.auto_enrich` | `boolean` | no | Price the post-scrape enrichment too. default `false` |
1334
+
1335
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1336
+
1337
+ Other envelope fields: `pagination` (PaginationMeta).
1338
+
1339
+ **Example**
1340
+
1341
+ ```ts
1342
+ const result = await g8.api.workbench.estimateWorkbenchProviderScraperCredits({
1343
+ path: { provider: "apify" },
1344
+ query: { table_id: "id", max_results: 1 },
1345
+ });
1346
+ ```
1347
+
1348
+ ---
1349
+
1350
+ <a id="op-estimateworkbenchscrapercredits"></a>
1351
+
1352
+ ### `g8.api.workbench.estimateWorkbenchScraperCredits(input)`
1353
+
1354
+ **Estimate Workbench Scraper Credits**
1355
+
1356
+ - HTTP: `GET /api/v1/workbench/scraper/credit-estimate`
1357
+ - operationId: `estimate_workbench_scraper_credits_workbench_scraper_credit_estimate_get` (also callable as `g8.api.call("estimate_workbench_scraper_credits_workbench_scraper_credit_estimate_get", input)`)
1358
+ - Tier: `read`: reads data; safe to call and to retry
1359
+ - API-key scope: `lists:read`
1360
+
1361
+ Price a built-in scraper run. CHARGES NOTHING.
1362
+
1363
+ A worst-case quote: what `max_results` rows would cost, plus the
1364
+ post-scrape enrichment when `auto_enrich` is set, against the live balance.
1365
+ Nothing is scraped and no credit moves.
1366
+
1367
+ The estimate and the run share one costing function on purpose, so the
1368
+ number quoted here is the number the run's own credit gate enforces.
1369
+
1370
+ **Input**
1371
+
1372
+ | Field | Type | Required | Description |
1373
+ |---|---|---|---|
1374
+ | `query.table_id` | `string` | yes | The table the results would land in. |
1375
+ | `query.max_results` | `integer` | yes | Ceiling on results the run would return. |
1376
+ | `query.auto_enrich` | `boolean` | no | Price the post-scrape enrichment too. Leave false and the quote covers the scrape ALONE - which is the number people misread. default `false` |
1377
+
1378
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1379
+
1380
+ Other envelope fields: `pagination` (PaginationMeta).
1381
+
1382
+ **Example**
1383
+
1384
+ ```ts
1385
+ const result = await g8.api.workbench.estimateWorkbenchScraperCredits({ query: { table_id: "id", max_results: 1 } });
1386
+ ```
1387
+
1388
+ ---
1389
+
1390
+ <a id="op-expandworkbencharray"></a>
1391
+
1392
+ ### `g8.api.workbench.expandWorkbenchArray(input)`
1393
+
1394
+ **Expand Workbench Array**
1395
+
1396
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/expand-array`
1397
+ - operationId: `expand_workbench_array_workbench_tables__table_id__expand_array_post` (also callable as `g8.api.call("expand_workbench_array_workbench_tables__table_id__expand_array_post", input)`)
1398
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
1399
+ - API-key scope: `lists:write`
1400
+
1401
+ Fan an array field out into one row per element. FREE.
1402
+
1403
+ This MULTIPLIES the row count: a table of 1,000 rows whose array averages
1404
+ ten elements becomes 10,000 rows. Nothing is charged for the expansion
1405
+ itself, but every later per-row operation is then ten times the size.
1406
+
1407
+ **Input**
1408
+
1409
+ | Field | Type | Required | Description |
1410
+ |---|---|---|---|
1411
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
1412
+ | `body` | `ExpandArrayRequest` | yes | Request body; fields below. |
1413
+
1414
+ Body fields (`ExpandArrayRequest`):
1415
+
1416
+ | Field | Type | Required | Description |
1417
+ |---|---|---|---|
1418
+ | `body.array_field_path` | `string` | yes | min length 1 |
1419
+ | `body.keep_parent_fields` | `boolean` | no | Copy the parent row's other fields onto each new row. default `true` |
1420
+ | `body.source_column_id` | `integer \| null` | no | |
1421
+
1422
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1423
+
1424
+ Other envelope fields: `pagination` (PaginationMeta).
1425
+
1426
+ **Example**
1427
+
1428
+ ```ts
1429
+ const result = await g8.api.workbench.expandWorkbenchArray({ path: { table_id: "id" }, body: { array_field_path: "example" } });
1430
+ ```
1431
+
1432
+ ---
1433
+
1434
+ <a id="op-exportworkbenchaifindpeople"></a>
1435
+
1436
+ ### `g8.api.workbench.exportWorkbenchAiFindPeople(input)`
1437
+
1438
+ **Export Workbench Ai Find People**
1439
+
1440
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/ai/groups/{group_id}/find-people/export`
1441
+ - operationId: `export_workbench_ai_find_people_workbench_tables__table_id__ai_groups__group_id__find_people_export_post` (also callable as `g8.api.call("export_workbench_ai_find_people_workbench_tables__table_id__ai_groups__group_id__find_people_export_post", input)`)
1442
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
1443
+ - API-key scope: `lists:write`
1444
+
1445
+ Copy chosen candidates into the group's people table. Free.
1446
+
1447
+ **Input**
1448
+
1449
+ | Field | Type | Required | Description |
1450
+ |---|---|---|---|
1451
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
1452
+ | `path.group_id` | `string` | yes | The AI group id. |
1453
+ | `body` | `UpdateStagingAIFindPeopleCandidatesRequest` | yes | Request body; fields below. |
1454
+
1455
+ Body fields (`UpdateStagingAIFindPeopleCandidatesRequest`):
1456
+
1457
+ | Field | Type | Required | Description |
1458
+ |---|---|---|---|
1459
+ | `body.candidate_ids` | `Array<string>` | no | min items 1 |
1460
+
1461
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1462
+
1463
+ Other envelope fields: `pagination` (PaginationMeta).
1464
+
1465
+ **Example**
1466
+
1467
+ ```ts
1468
+ const result = await g8.api.workbench.exportWorkbenchAiFindPeople({ path: { table_id: "id", group_id: "id" }, body: {} });
1469
+ ```
1470
+
1471
+ ---
1472
+
1473
+ <a id="op-exportworkbenchtable"></a>
1474
+
1475
+ ### `g8.api.workbench.exportWorkbenchTable(input)`
1476
+
1477
+ **Export Workbench Table**
1478
+
1479
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/export`
1480
+ - operationId: `export_workbench_table_workbench_tables__table_id__export_post` (also callable as `g8.api.call("export_workbench_table_workbench_tables__table_id__export_post", input)`)
1481
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
1482
+ - API-key scope: `lists:write`
1483
+
1484
+ Export rows into an audience list. THIS CREATES REAL CRM RECORDS.
1485
+
1486
+ A destination is REQUIRED - either `list_id`, or `create_new_list` with a
1487
+ `new_list_name`. The app would otherwise accept a body naming neither and
1488
+ decide for itself where a customer's data lands.
1489
+
1490
+ `enrich_after_export` and its enrichment configs are deliberately not
1491
+ accepted here: they spend credits, and a spend should not be a side effect
1492
+ of an export call.
1493
+
1494
+ **Input**
1495
+
1496
+ | Field | Type | Required | Description |
1497
+ |---|---|---|---|
1498
+ | `path.table_id` | `string` | yes | Table id (UUID). |
1499
+ | `body` | `WorkbenchExportRequest` | yes | Request body; fields below. |
1500
+
1501
+ Body fields (`WorkbenchExportRequest`):
1502
+
1503
+ | Field | Type | Required | Description |
1504
+ |---|---|---|---|
1505
+ | `body.create_new_list` | `boolean` | no | default `false` |
1506
+ | `body.entity_type` | `"contact" \| "company"` | no | default `"contact"` |
1507
+ | `body.exclude_row_ids` | `Array<integer> \| null` | no | max items 100000 |
1508
+ | `body.export_filter` | `Record<string, unknown> \| null` | no | |
1509
+ | `body.export_verified_only` | `boolean` | no | Only rows whose email passed verification. default `false` |
1510
+ | `body.list_id` | `integer \| null` | no | Existing list to export into. |
1511
+ | `body.new_list_name` | `string \| null` | no | |
1512
+ | `body.row_ids` | `Array<integer> \| null` | no | max items 100000 |
1513
+
1514
+ **Returns** `ApiResponse_dict_`: the envelope `{ data: Record<string, unknown>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1515
+
1516
+ Other envelope fields: `pagination` (PaginationMeta).
1517
+
1518
+ **Example**
1519
+
1520
+ ```ts
1521
+ const result = await g8.api.workbench.exportWorkbenchTable({ path: { table_id: "id" }, body: {} });
1522
+ ```
1523
+
1524
+ ---
1525
+
1526
+ <a id="op-extractworkbenchcolumn"></a>
1527
+
1528
+ ### `g8.api.workbench.extractWorkbenchColumn(input)`
1529
+
1530
+ **Extract Workbench Column**
1531
+
1532
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/columns/extract`
1533
+ - operationId: `extract_workbench_column_workbench_tables__table_id__columns_extract_post` (also callable as `g8.api.call("extract_workbench_column_workbench_tables__table_id__columns_extract_post", input)`)
1534
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
1535
+ - API-key scope: `lists:write`
1536
+
1537
+ Create a column from one JSON path, filled across every row. FREE.
1538
+
1539
+ `field_path` comes from `discover-fields`. Pure local extraction: no
1540
+ provider, no model, no credit.
1541
+
1542
+ **Input**
1543
+
1544
+ | Field | Type | Required | Description |
1545
+ |---|---|---|---|
1546
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
1547
+ | `body` | `ExtractColumnRequest` | yes | Request body; fields below. |
1548
+
1549
+ Body fields (`ExtractColumnRequest`):
1550
+
1551
+ | Field | Type | Required | Description |
1552
+ |---|---|---|---|
1553
+ | `body.column_name` | `string` | yes | min length 1, max length 255, pattern `^[a-z][a-z0-9_]*$` |
1554
+ | `body.display_name` | `string` | yes | min length 1, max length 255 |
1555
+ | `body.field_path` | `string` | yes | Dot path inside the raw JSON. min length 1 |
1556
+ | `body.source_column_id` | `integer` | yes | |
1557
+ | `body.data_type` | `"text" \| "number" \| "boolean" \| "json"` | no | default `"text"` |
1558
+
1559
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1560
+
1561
+ Other envelope fields: `pagination` (PaginationMeta).
1562
+
1563
+ **Example**
1564
+
1565
+ ```ts
1566
+ const result = await g8.api.workbench.extractWorkbenchColumn({
1567
+ path: { table_id: "id" },
1568
+ body: {
1569
+ column_name: "Example",
1570
+ display_name: "Example",
1571
+ field_path: "example",
1572
+ source_column_id: 123,
1573
+ },
1574
+ });
1575
+ ```
1576
+
1577
+ ---
1578
+
1579
+ <a id="op-generateworkbenchprompt"></a>
1580
+
1581
+ ### `g8.api.workbench.generateWorkbenchPrompt(input)`
1582
+
1583
+ **Generate Workbench Prompt**
1584
+
1585
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/ai/generate-prompt`
1586
+ - operationId: `generate_workbench_prompt_workbench_tables__table_id__ai_generate_prompt_post` (also callable as `g8.api.call("generate_workbench_prompt_workbench_tables__table_id__ai_generate_prompt_post", input)`)
1587
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
1588
+ - API-key scope: `lists:run`
1589
+
1590
+ Draft an AI prompt from this table's columns. COSTS AN AI CALL.
1591
+
1592
+ A model reads the column names and five sample rows and writes a prompt for
1593
+ you. It does not debit the credit balance, but it is a real model call, so
1594
+ it is not free to run in a loop.
1595
+
1596
+ The returned prompt is a draft: nothing is configured and nothing is
1597
+ enriched until you save it.
1598
+
1599
+ **Input**
1600
+
1601
+ | Field | Type | Required | Description |
1602
+ |---|---|---|---|
1603
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
1604
+ | `body` | `StagingPromptGeneratorRequest` | yes | Request body; fields below. |
1605
+
1606
+ Body fields (`StagingPromptGeneratorRequest`):
1607
+
1608
+ | Field | Type | Required | Description |
1609
+ |---|---|---|---|
1610
+ | `body.task_description` | `string` | yes | What the AI pass should do, in plain words. min length 1 |
1611
+
1612
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1613
+
1614
+ Other envelope fields: `pagination` (PaginationMeta).
1615
+
1616
+ **Example**
1617
+
1618
+ ```ts
1619
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
1620
+ const result = await g8.api.workbench.generateWorkbenchPrompt({ path: { table_id: "id" }, body: { task_description: "example" } });
1621
+ ```
1622
+
1623
+ ---
1624
+
1625
+ <a id="op-getscraperproviderconnection"></a>
1626
+
1627
+ ### `g8.api.workbench.getScraperProviderConnection(input)`
1628
+
1629
+ **Get Scraper Provider Connection**
1630
+
1631
+ - HTTP: `GET /api/v1/workbench/scraper/providers/{provider}/connection`
1632
+ - operationId: `get_scraper_provider_connection_workbench_scraper_providers__provider__connection_get` (also callable as `g8.api.call("get_scraper_provider_connection_workbench_scraper_providers__provider__connection_get", input)`)
1633
+ - Tier: `read`: reads data; safe to call and to retry
1634
+ - API-key scope: `lists:read`
1635
+
1636
+ Whether your provider account is connected. Free. The token is never returned.
1637
+
1638
+ **Input**
1639
+
1640
+ | Field | Type | Required | Description |
1641
+ |---|---|---|---|
1642
+ | `path.provider` | `"apify"` | yes | Which scraper provider. |
1643
+
1644
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1645
+
1646
+ Other envelope fields: `pagination` (PaginationMeta).
1647
+
1648
+ **Example**
1649
+
1650
+ ```ts
1651
+ const result = await g8.api.workbench.getScraperProviderConnection({ path: { provider: "apify" } });
1652
+ ```
1653
+
1654
+ ---
1655
+
1656
+ <a id="op-getworkbenchaifindpeoplerow"></a>
1657
+
1658
+ ### `g8.api.workbench.getWorkbenchAiFindPeopleRow(input)`
1659
+
1660
+ **Get Workbench Ai Find People Row**
1661
+
1662
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/ai/groups/{group_id}/find-people/rows/{source_row_id}`
1663
+ - operationId: `get_workbench_ai_find_people_row_workbench_tables__table_id__ai_groups__group_id__find_people_rows__source_row_id__get` (also callable as `g8.api.call("get_workbench_ai_find_people_row_workbench_tables__table_id__ai_groups__group_id__find_people_rows__source_row_id__get", input)`)
1664
+ - Tier: `read`: reads data; safe to call and to retry
1665
+ - API-key scope: `lists:read`
1666
+
1667
+ The people an AI find-people group found for one row. Free.
1668
+
1669
+ **Input**
1670
+
1671
+ | Field | Type | Required | Description |
1672
+ |---|---|---|---|
1673
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
1674
+ | `path.group_id` | `string` | yes | The AI group id. |
1675
+ | `path.source_row_id` | `integer` | yes | The company row the candidates were found for. |
1676
+
1677
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1678
+
1679
+ Other envelope fields: `pagination` (PaginationMeta).
1680
+
1681
+ **Example**
1682
+
1683
+ ```ts
1684
+ const result = await g8.api.workbench.getWorkbenchAiFindPeopleRow({ path: { table_id: "id", group_id: "id", source_row_id: 123 } });
1685
+ ```
1686
+
1687
+ ---
1688
+
1689
+ <a id="op-getworkbenchaigroup"></a>
1690
+
1691
+ ### `g8.api.workbench.getWorkbenchAiGroup(input)`
1692
+
1693
+ **Get Workbench Ai Group**
1694
+
1695
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/ai/groups/{group_id}`
1696
+ - operationId: `get_workbench_ai_group_workbench_tables__table_id__ai_groups__group_id__get` (also callable as `g8.api.call("get_workbench_ai_group_workbench_tables__table_id__ai_groups__group_id__get", input)`)
1697
+ - Tier: `read`: reads data; safe to call and to retry
1698
+ - API-key scope: `lists:read`
1699
+
1700
+ Read one AI group's configuration. Free.
1701
+
1702
+ **Input**
1703
+
1704
+ | Field | Type | Required | Description |
1705
+ |---|---|---|---|
1706
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
1707
+ | `path.group_id` | `string` | yes | The AI group id. |
1708
+
1709
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1710
+
1711
+ Other envelope fields: `pagination` (PaginationMeta).
1712
+
1713
+ **Example**
1714
+
1715
+ ```ts
1716
+ const result = await g8.api.workbench.getWorkbenchAiGroup({ path: { table_id: "id", group_id: "id" } });
1717
+ ```
1718
+
1719
+ ---
1720
+
1721
+ <a id="op-getworkbenchanalytics"></a>
1722
+
1723
+ ### `g8.api.workbench.getWorkbenchAnalytics(input)`
1724
+
1725
+ **Get Workbench Analytics**
1726
+
1727
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/analytics`
1728
+ - operationId: `get_workbench_analytics_workbench_tables__table_id__analytics_get` (also callable as `g8.api.call("get_workbench_analytics_workbench_tables__table_id__analytics_get", input)`)
1729
+ - Tier: `read`: reads data; safe to call and to retry
1730
+ - API-key scope: `lists:read`
1731
+
1732
+ Row status distribution, row counts and column fill rates. Free.
1733
+
1734
+ **Input**
1735
+
1736
+ | Field | Type | Required | Description |
1737
+ |---|---|---|---|
1738
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
1739
+
1740
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1741
+
1742
+ Other envelope fields: `pagination` (PaginationMeta).
1743
+
1744
+ **Example**
1745
+
1746
+ ```ts
1747
+ const result = await g8.api.workbench.getWorkbenchAnalytics({ path: { table_id: "id" } });
1748
+ ```
1749
+
1750
+ ---
1751
+
1752
+ <a id="op-getworkbenchcolumnaiconfig"></a>
1753
+
1754
+ ### `g8.api.workbench.getWorkbenchColumnAiConfig(input)`
1755
+
1756
+ **Get Workbench Column Ai Config**
1757
+
1758
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/columns/{col_id}/ai-config`
1759
+ - operationId: `get_workbench_column_ai_config_workbench_tables__table_id__columns__col_id__ai_config_get` (also callable as `g8.api.call("get_workbench_column_ai_config_workbench_tables__table_id__columns__col_id__ai_config_get", input)`)
1760
+ - Tier: `read`: reads data; safe to call and to retry
1761
+ - API-key scope: `lists:read`
1762
+
1763
+ Read one column's AI pass. FREE.
1764
+
1765
+ **Input**
1766
+
1767
+ | Field | Type | Required | Description |
1768
+ |---|---|---|---|
1769
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
1770
+ | `path.col_id` | `integer` | yes | Column id. |
1771
+
1772
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1773
+
1774
+ Other envelope fields: `pagination` (PaginationMeta).
1775
+
1776
+ **Example**
1777
+
1778
+ ```ts
1779
+ const result = await g8.api.workbench.getWorkbenchColumnAiConfig({ path: { table_id: "id", col_id: 123 } });
1780
+ ```
1781
+
1782
+ ---
1783
+
1784
+ <a id="op-getworkbenchhistory"></a>
1785
+
1786
+ ### `g8.api.workbench.getWorkbenchHistory(input)`
1787
+
1788
+ **Get Workbench History**
1789
+
1790
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/history`
1791
+ - operationId: `get_workbench_history_workbench_tables__table_id__history_get` (also callable as `g8.api.call("get_workbench_history_workbench_tables__table_id__history_get", input)`)
1792
+ - Tier: `read`: reads data; safe to call and to retry
1793
+ - API-key scope: `lists:read`
1794
+
1795
+ What has run on this table - imports, AI passes, exports - newest first.
1796
+ Free. Redacted: no credentials and no row data.
1797
+
1798
+ **Input**
1799
+
1800
+ | Field | Type | Required | Description |
1801
+ |---|---|---|---|
1802
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
1803
+ | `query.limit` | `integer` | no | default `25` |
1804
+ | `query.offset` | `integer` | no | default `0` |
1805
+
1806
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1807
+
1808
+ Other envelope fields: `pagination` (PaginationMeta).
1809
+
1810
+ **Example**
1811
+
1812
+ ```ts
1813
+ const result = await g8.api.workbench.getWorkbenchHistory({ path: { table_id: "id" } });
1814
+ ```
1815
+
1816
+ ---
1817
+
1818
+ <a id="op-getworkbenchlockedrowcount"></a>
1819
+
1820
+ ### `g8.api.workbench.getWorkbenchLockedRowCount(input)`
1821
+
1822
+ **Get Workbench Locked Row Count**
1823
+
1824
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/locked-row-count`
1825
+ - operationId: `get_workbench_locked_row_count_workbench_tables__table_id__locked_row_count_get` (also callable as `g8.api.call("get_workbench_locked_row_count_workbench_tables__table_id__locked_row_count_get", input)`)
1826
+ - Tier: `read`: reads data; safe to call and to retry
1827
+ - API-key scope: `lists:read`
1828
+
1829
+ How many rows are still locked. FREE.
1830
+
1831
+ At one credit per row this number IS the price of unlocking everything.
1832
+
1833
+ **Input**
1834
+
1835
+ | Field | Type | Required | Description |
1836
+ |---|---|---|---|
1837
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
1838
+
1839
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1840
+
1841
+ Other envelope fields: `pagination` (PaginationMeta).
1842
+
1843
+ **Example**
1844
+
1845
+ ```ts
1846
+ const result = await g8.api.workbench.getWorkbenchLockedRowCount({ path: { table_id: "id" } });
1847
+ ```
1848
+
1849
+ ---
1850
+
1851
+ <a id="op-getworkbenchmappingsuggestion"></a>
1852
+
1853
+ ### `g8.api.workbench.getWorkbenchMappingSuggestion(input)`
1854
+
1855
+ **Get Workbench Mapping Suggestion**
1856
+
1857
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/suggest-mappings/{job_id}`
1858
+ - operationId: `get_workbench_mapping_suggestion_workbench_tables__table_id__suggest_mappings__job_id__get` (also callable as `g8.api.call("get_workbench_mapping_suggestion_workbench_tables__table_id__suggest_mappings__job_id__get", input)`)
1859
+ - Tier: `read`: reads data; safe to call and to retry
1860
+ - API-key scope: `lists:read`
1861
+
1862
+ Collect a mapping suggestion. FREE - polling costs nothing.
1863
+
1864
+ **Input**
1865
+
1866
+ | Field | Type | Required | Description |
1867
+ |---|---|---|---|
1868
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
1869
+ | `path.job_id` | `string` | yes | Job id returned by `suggest-mappings`. |
1870
+
1871
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1872
+
1873
+ Other envelope fields: `pagination` (PaginationMeta).
1874
+
1875
+ **Example**
1876
+
1877
+ ```ts
1878
+ const result = await g8.api.workbench.getWorkbenchMappingSuggestion({ path: { table_id: "id", job_id: "id" } });
1879
+ ```
1880
+
1881
+ ---
1882
+
1883
+ <a id="op-getworkbenchpipeline"></a>
1884
+
1885
+ ### `g8.api.workbench.getWorkbenchPipeline(input)`
1886
+
1887
+ **Get Workbench Pipeline**
1888
+
1889
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/pipelines/{pipeline_id}`
1890
+ - operationId: `get_workbench_pipeline_workbench_tables__table_id__pipelines__pipeline_id__get` (also callable as `g8.api.call("get_workbench_pipeline_workbench_tables__table_id__pipelines__pipeline_id__get", input)`)
1891
+ - Tier: `read`: reads data; safe to call and to retry
1892
+ - API-key scope: `lists:read`
1893
+
1894
+ Read one pipeline. Free.
1895
+
1896
+ **Input**
1897
+
1898
+ | Field | Type | Required | Description |
1899
+ |---|---|---|---|
1900
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
1901
+ | `path.pipeline_id` | `string` | yes | Pipeline id (UUID). |
1902
+
1903
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1904
+
1905
+ Other envelope fields: `pagination` (PaginationMeta).
1906
+
1907
+ **Example**
1908
+
1909
+ ```ts
1910
+ const result = await g8.api.workbench.getWorkbenchPipeline({ path: { table_id: "id", pipeline_id: "id" } });
1911
+ ```
1912
+
1913
+ ---
1914
+
1915
+ <a id="op-getworkbenchrow"></a>
1916
+
1917
+ ### `g8.api.workbench.getWorkbenchRow(input)`
1918
+
1919
+ **Get Workbench Row**
1920
+
1921
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/rows/{row_id}`
1922
+ - operationId: `get_workbench_row_workbench_tables__table_id__rows__row_id__get` (also callable as `g8.api.call("get_workbench_row_workbench_tables__table_id__rows__row_id__get", input)`)
1923
+ - Tier: `read`: reads data; safe to call and to retry
1924
+ - API-key scope: `lists:read`
1925
+
1926
+ Read one row. Free.
1927
+
1928
+ **Input**
1929
+
1930
+ | Field | Type | Required | Description |
1931
+ |---|---|---|---|
1932
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
1933
+ | `path.row_id` | `integer` | yes | Row id. |
1934
+
1935
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1936
+
1937
+ Other envelope fields: `pagination` (PaginationMeta).
1938
+
1939
+ **Example**
1940
+
1941
+ ```ts
1942
+ const result = await g8.api.workbench.getWorkbenchRow({ path: { table_id: "id", row_id: 123 } });
1943
+ ```
1944
+
1945
+ ---
1946
+
1947
+ <a id="op-getworkbenchschedule"></a>
1948
+
1949
+ ### `g8.api.workbench.getWorkbenchSchedule(input)`
1950
+
1951
+ **Get Workbench Schedule**
1952
+
1953
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/schedule`
1954
+ - operationId: `get_workbench_schedule_workbench_tables__table_id__schedule_get` (also callable as `g8.api.call("get_workbench_schedule_workbench_tables__table_id__schedule_get", input)`)
1955
+ - Tier: `read`: reads data; safe to call and to retry
1956
+ - API-key scope: `lists:read`
1957
+
1958
+ Read the table's schedule. FREE.
1959
+
1960
+ Worth reading before an audit of where credit is going: a schedule is the
1961
+ one spend on this surface that nobody triggers by hand.
1962
+
1963
+ **Input**
1964
+
1965
+ | Field | Type | Required | Description |
1966
+ |---|---|---|---|
1967
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
1968
+
1969
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1970
+
1971
+ Other envelope fields: `pagination` (PaginationMeta).
1972
+
1973
+ **Example**
1974
+
1975
+ ```ts
1976
+ const result = await g8.api.workbench.getWorkbenchSchedule({ path: { table_id: "id" } });
1977
+ ```
1978
+
1979
+ ---
1980
+
1981
+ <a id="op-getworkbenchscraperrun"></a>
1982
+
1983
+ ### `g8.api.workbench.getWorkbenchScraperRun(input)`
1984
+
1985
+ **Get Workbench Scraper Run**
1986
+
1987
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/scraper/runs/{run_id}`
1988
+ - operationId: `get_workbench_scraper_run_workbench_tables__table_id__scraper_runs__run_id__get` (also callable as `g8.api.call("get_workbench_scraper_run_workbench_tables__table_id__scraper_runs__run_id__get", input)`)
1989
+ - Tier: `read`: reads data; safe to call and to retry
1990
+ - API-key scope: `lists:read`
1991
+
1992
+ One scraper run, with live progress while it is running. Free.
1993
+
1994
+ **Input**
1995
+
1996
+ | Field | Type | Required | Description |
1997
+ |---|---|---|---|
1998
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
1999
+ | `path.run_id` | `string` | yes | Scraper run id (UUID). |
2000
+
2001
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2002
+
2003
+ Other envelope fields: `pagination` (PaginationMeta).
2004
+
2005
+ **Example**
2006
+
2007
+ ```ts
2008
+ const result = await g8.api.workbench.getWorkbenchScraperRun({ path: { table_id: "id", run_id: "id" } });
2009
+ ```
2010
+
2011
+ ---
2012
+
2013
+ <a id="op-getworkbenchtable"></a>
2014
+
2015
+ ### `g8.api.workbench.getWorkbenchTable(input)`
2016
+
2017
+ **Get Workbench Table**
2018
+
2019
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}`
2020
+ - operationId: `get_workbench_table_workbench_tables__table_id__get` (also callable as `g8.api.call("get_workbench_table_workbench_tables__table_id__get", input)`)
2021
+ - Tier: `read`: reads data; safe to call and to retry
2022
+ - API-key scope: `lists:read`
2023
+
2024
+ One table's definition. Ungated, matching the app.
2025
+
2026
+ **Input**
2027
+
2028
+ | Field | Type | Required | Description |
2029
+ |---|---|---|---|
2030
+ | `path.table_id` | `string` | yes | Table id (UUID). |
2031
+
2032
+ **Returns** `ApiResponse_WorkbenchTable_`: the envelope `{ data: WorkbenchTable, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2033
+
2034
+ Other envelope fields: `pagination` (PaginationMeta).
2035
+
2036
+ `WorkbenchTable` fields:
2037
+
2038
+ | Field | Type | Required | Description |
2039
+ |---|---|---|---|
2040
+ | `created_at` | `string (date-time) \| null` | no | |
2041
+ | `description` | `string \| null` | no | |
2042
+ | `entity_type` | `string \| null` | no | contact or company. |
2043
+ | `id` | `string \| null` | no | |
2044
+ | `name` | `string \| null` | no | |
2045
+ | `row_count` | `integer \| null` | no | |
2046
+ | `updated_at` | `string (date-time) \| null` | no | |
2047
+
2048
+ **Example**
2049
+
2050
+ ```ts
2051
+ const result = await g8.api.workbench.getWorkbenchTable({ path: { table_id: "id" } });
2052
+ ```
2053
+
2054
+ ---
2055
+
2056
+ <a id="op-getworkbenchwaterfall"></a>
2057
+
2058
+ ### `g8.api.workbench.getWorkbenchWaterfall(input)`
2059
+
2060
+ **Get Workbench Waterfall**
2061
+
2062
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/waterfall/configs/{column_id}`
2063
+ - operationId: `get_workbench_waterfall_workbench_tables__table_id__waterfall_configs__column_id__get` (also callable as `g8.api.call("get_workbench_waterfall_workbench_tables__table_id__waterfall_configs__column_id__get", input)`)
2064
+ - Tier: `read`: reads data; safe to call and to retry
2065
+ - API-key scope: `lists:read`
2066
+
2067
+ Read a waterfall column's steps and settings. Free.
2068
+
2069
+ **Input**
2070
+
2071
+ | Field | Type | Required | Description |
2072
+ |---|---|---|---|
2073
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
2074
+ | `path.column_id` | `integer` | yes | The waterfall column id. |
2075
+
2076
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2077
+
2078
+ Other envelope fields: `pagination` (PaginationMeta).
2079
+
2080
+ **Example**
2081
+
2082
+ ```ts
2083
+ const result = await g8.api.workbench.getWorkbenchWaterfall({ path: { table_id: "id", column_id: 123 } });
2084
+ ```
2085
+
2086
+ ---
2087
+
2088
+ <a id="op-importworkbenchdatafile"></a>
2089
+
2090
+ ### `g8.api.workbench.importWorkbenchDatafile(input)`
2091
+
2092
+ **Import Workbench Datafile**
2093
+
2094
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/import/datafile`
2095
+ - operationId: `import_workbench_datafile_workbench_tables__table_id__import_datafile_post` (also callable as `g8.api.call("import_workbench_datafile_workbench_tables__table_id__import_datafile_post", input)`)
2096
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2097
+ - API-key scope: `lists:write`
2098
+
2099
+ Import rows from an ALREADY-UPLOADED datafile. FREE.
2100
+
2101
+ This takes a `datafile_id`, never file content, which is why it fits a JSON
2102
+ envelope. The upload that produces that id is a multipart operation and is
2103
+ not part of this contract.
2104
+
2105
+ Same auto-enrichment caveat as the paste import: the rows land free, and an
2106
+ auto-enriching table then spends on them.
2107
+
2108
+ **Input**
2109
+
2110
+ | Field | Type | Required | Description |
2111
+ |---|---|---|---|
2112
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
2113
+ | `body` | `DatafileImportRequest` | yes | Request body; fields below. |
2114
+
2115
+ Body fields (`DatafileImportRequest`):
2116
+
2117
+ | Field | Type | Required | Description |
2118
+ |---|---|---|---|
2119
+ | `body.datafile_id` | `string` | yes | Id of a previously uploaded datafile. min length 1 |
2120
+ | `body.column_mapping` | `Record<string, string> \| null` | no | Source header -> column name. |
2121
+ | `body.limit` | `integer \| null` | no | min 1, max 100000 |
2122
+ | `body.raw_source_column_id` | `integer \| null` | no | |
2123
+ | `body.skip_duplicates` | `boolean` | no | default `true` |
2124
+
2125
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2126
+
2127
+ Other envelope fields: `pagination` (PaginationMeta).
2128
+
2129
+ **Example**
2130
+
2131
+ ```ts
2132
+ const result = await g8.api.workbench.importWorkbenchDatafile({ path: { table_id: "id" }, body: { datafile_id: "id" } });
2133
+ ```
2134
+
2135
+ ---
2136
+
2137
+ <a id="op-importworkbenchfromcrm"></a>
2138
+
2139
+ ### `g8.api.workbench.importWorkbenchFromCrm(input)`
2140
+
2141
+ **Import Workbench From Crm**
2142
+
2143
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/import/crm`
2144
+ - operationId: `import_workbench_from_crm_workbench_tables__table_id__import_crm_post` (also callable as `g8.api.call("import_workbench_from_crm_workbench_tables__table_id__import_crm_post", input)`)
2145
+ - 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
2146
+ - API-key scope: `lists:run`
2147
+
2148
+ Pull records out of a connected CRM into this table. READS THEIR SYSTEM.
2149
+
2150
+ No credit is charged for the import itself, but it reaches into the
2151
+ customer's own CRM, which is why it needs the same grant as the other
2152
+ operations that do - a customer can hand out "read my workbench" without
2153
+ handing out "read my Salesforce".
2154
+
2155
+ `limit` caps what lands, and it matters twice: once for the CRM's own API
2156
+ quota, and again if this table auto-enriches, because every imported row is
2157
+ then a row that spends.
2158
+
2159
+ `crm_provider` and `object_type` are the app's legacy aliases for
2160
+ `provider_type` and `entity_type`. They are mirrored because the app still
2161
+ accepts them, not because new code should send them.
2162
+
2163
+ **Input**
2164
+
2165
+ | Field | Type | Required | Description |
2166
+ |---|---|---|---|
2167
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
2168
+ | `body` | `CRMImportRequest` | yes | Request body; fields below. |
2169
+
2170
+ Body fields (`CRMImportRequest`):
2171
+
2172
+ | Field | Type | Required | Description |
2173
+ |---|---|---|---|
2174
+ | `body.connection_id` | `string \| null` | no | Which CRM connection to read. |
2175
+ | `body.crm_provider` | `string \| null` | no | Legacy alias of `provider_type`. |
2176
+ | `body.entity_type` | `"contact" \| "company" \| null` | no | |
2177
+ | `body.filters` | `Record<string, unknown> \| null` | no | |
2178
+ | `body.limit` | `integer` | no | default `1000`, min 1, max 10000 |
2179
+ | `body.object_type` | `string \| null` | no | Legacy alias of `entity_type` (plural form). |
2180
+ | `body.provider_type` | `string \| null` | no | CRM provider key, e.g. 'hubspot'. |
2181
+ | `body.raw_source_column_id` | `integer \| null` | no | |
2182
+
2183
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2184
+
2185
+ Other envelope fields: `pagination` (PaginationMeta).
2186
+
2187
+ **Example**
2188
+
2189
+ ```ts
2190
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
2191
+ const result = await g8.api.workbench.importWorkbenchFromCrm({ path: { table_id: "id" }, body: {} });
2192
+ ```
2193
+
2194
+ ---
2195
+
2196
+ <a id="op-importworkbenchfromsearch"></a>
2197
+
2198
+ ### `g8.api.workbench.importWorkbenchFromSearch(input)`
2199
+
2200
+ **Import Workbench From Search**
2201
+
2202
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/import/search`
2203
+ - operationId: `import_workbench_from_search_workbench_tables__table_id__import_search_post` (also callable as `g8.api.call("import_workbench_from_search_workbench_tables__table_id__import_search_post", input)`)
2204
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
2205
+ - API-key scope: `lists:run`
2206
+
2207
+ Import people from a search into the table. CHARGES when revealed.
2208
+
2209
+ Up to `limit` rows land LOCKED: each costs a credit to unlock with
2210
+ `POST .../unlock-rows`. Sample it first with `.../import/search/preview`.
2211
+
2212
+ **Input**
2213
+
2214
+ | Field | Type | Required | Description |
2215
+ |---|---|---|---|
2216
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
2217
+ | `body` | `WorkbenchSearchImportRequest` | yes | Request body; fields below. |
2218
+
2219
+ Body fields (`WorkbenchSearchImportRequest`):
2220
+
2221
+ | Field | Type | Required | Description |
2222
+ |---|---|---|---|
2223
+ | `body.filters` | `Array<Record<string, unknown>>` | yes | min items 1 |
2224
+ | `body.limit` | `integer` | no | default `500`, min 1, max 50000 |
2225
+ | `body.max_employees_per_company` | `integer \| null` | no | min 1, max 1000 |
2226
+ | `body.max_result` | `integer \| null` | no | min 1, max 50000 |
2227
+ | `body.raw_source_column_id` | `integer \| null` | no | |
2228
+ | `body.return_inserted_ids` | `boolean` | no | default `false` |
2229
+ | `body.skip_duplicates` | `boolean` | no | default `true` |
2230
+
2231
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2232
+
2233
+ Other envelope fields: `pagination` (PaginationMeta).
2234
+
2235
+ **Example**
2236
+
2237
+ ```ts
2238
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
2239
+ const result = await g8.api.workbench.importWorkbenchFromSearch({ path: { table_id: "id" }, body: { filters: [{}] } });
2240
+ ```
2241
+
2242
+ ---
2243
+
2244
+ <a id="op-listworkbenchaipresets"></a>
2245
+
2246
+ ### `g8.api.workbench.listWorkbenchAiPresets(input?)`
2247
+
2248
+ **List Workbench Ai Presets**
2249
+
2250
+ - HTTP: `GET /api/v1/workbench/ai-presets`
2251
+ - operationId: `list_workbench_ai_presets_workbench_ai_presets_get` (also callable as `g8.api.call("list_workbench_ai_presets_workbench_ai_presets_get", input)`)
2252
+ - Tier: `read`: reads data; safe to call and to retry
2253
+ - API-key scope: `lists:read`
2254
+
2255
+ Every AI preset available to the organisation. FREE.
2256
+
2257
+ The catalogue of ready-made passes. `GET /workbench/tables/{id}/ai-presets`
2258
+ narrows the same catalogue to the ones that fit a particular table's
2259
+ columns.
2260
+
2261
+ **Input**: none.
2262
+
2263
+ **Returns** `ApiResponse_EnrichmentListPayload_`: the envelope `{ data: EnrichmentListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2264
+
2265
+ Other envelope fields: `pagination` (PaginationMeta).
2266
+
2267
+ `EnrichmentListPayload` fields:
2268
+
2269
+ | Field | Type | Required | Description |
2270
+ |---|---|---|---|
2271
+ | `items` | `Array<unknown>` | no | The collection, always present. |
2272
+
2273
+ **Example**
2274
+
2275
+ ```ts
2276
+ const result = await g8.api.workbench.listWorkbenchAiPresets();
2277
+ ```
2278
+
2279
+ ---
2280
+
2281
+ <a id="op-listworkbenchbindings"></a>
2282
+
2283
+ ### `g8.api.workbench.listWorkbenchBindings(input)`
2284
+
2285
+ **List Workbench Bindings**
2286
+
2287
+ - HTTP: `GET /api/v1/workbench-bindings`
2288
+ - operationId: `list_workbench_bindings_workbench_bindings_get` (also callable as `g8.api.call("list_workbench_bindings_workbench_bindings_get", input)`)
2289
+ - Tier: `read`: reads data; safe to call and to retry
2290
+ - API-key scope: `lists:read`
2291
+
2292
+ The workflow bindings on one list. FREE. Requires read access to it.
2293
+
2294
+ **Input**
2295
+
2296
+ | Field | Type | Required | Description |
2297
+ |---|---|---|---|
2298
+ | `query.list_id` | `integer` | yes | The list whose bindings to read. |
2299
+ | `query.workflow_id` | `string \| null` | no | Only this workflow's bindings. |
2300
+
2301
+ **Returns** `ApiResponse_EnrichmentListPayload_`: the envelope `{ data: EnrichmentListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2302
+
2303
+ Other envelope fields: `pagination` (PaginationMeta).
2304
+
2305
+ `EnrichmentListPayload` fields:
2306
+
2307
+ | Field | Type | Required | Description |
2308
+ |---|---|---|---|
2309
+ | `items` | `Array<unknown>` | no | The collection, always present. |
2310
+
2311
+ **Example**
2312
+
2313
+ ```ts
2314
+ const result = await g8.api.workbench.listWorkbenchBindings({ query: { list_id: 123 } });
2315
+ ```
2316
+
2317
+ ---
2318
+
2319
+ <a id="op-listworkbenchcolumnsources"></a>
2320
+
2321
+ ### `g8.api.workbench.listWorkbenchColumnSources(input)`
2322
+
2323
+ **List Workbench Column Sources**
2324
+
2325
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/columns/{col_id}/sources`
2326
+ - operationId: `list_workbench_column_sources_workbench_tables__table_id__columns__col_id__sources_get` (also callable as `g8.api.call("list_workbench_column_sources_workbench_tables__table_id__columns__col_id__sources_get", input)`)
2327
+ - Tier: `read`: reads data; safe to call and to retry
2328
+ - API-key scope: `lists:read`
2329
+
2330
+ The ingest sources bound to a raw JSON column, with their webhook paths.
2331
+ Free. Credentials are never returned.
2332
+
2333
+ **Input**
2334
+
2335
+ | Field | Type | Required | Description |
2336
+ |---|---|---|---|
2337
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
2338
+ | `path.col_id` | `integer` | yes | Column id. |
2339
+
2340
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2341
+
2342
+ Other envelope fields: `pagination` (PaginationMeta).
2343
+
2344
+ **Example**
2345
+
2346
+ ```ts
2347
+ const result = await g8.api.workbench.listWorkbenchColumnSources({ path: { table_id: "id", col_id: 123 } });
2348
+ ```
2349
+
2350
+ ---
2351
+
2352
+ <a id="op-listworkbenchcolumns"></a>
2353
+
2354
+ ### `g8.api.workbench.listWorkbenchColumns(input)`
2355
+
2356
+ **List Workbench Columns**
2357
+
2358
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/columns`
2359
+ - operationId: `list_workbench_columns_workbench_tables__table_id__columns_get` (also callable as `g8.api.call("list_workbench_columns_workbench_tables__table_id__columns_get", input)`)
2360
+ - Tier: `read`: reads data; safe to call and to retry
2361
+ - API-key scope: `lists:read`
2362
+
2363
+ The table's columns. Read this before writing rows - `data` keys are
2364
+ column MACHINE names.
2365
+
2366
+ **Input**
2367
+
2368
+ | Field | Type | Required | Description |
2369
+ |---|---|---|---|
2370
+ | `path.table_id` | `string` | yes | Table id (UUID). |
2371
+
2372
+ **Returns** `ApiResponse_WorkbenchPage_`: the envelope `{ data: WorkbenchPage, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2373
+
2374
+ Other envelope fields: `pagination` (PaginationMeta).
2375
+
2376
+ `WorkbenchPage` fields:
2377
+
2378
+ | Field | Type | Required | Description |
2379
+ |---|---|---|---|
2380
+ | `items` | `Array<Record<string, unknown>>` | no | |
2381
+ | `total` | `integer` | no | default `0` |
2382
+
2383
+ **Example**
2384
+
2385
+ ```ts
2386
+ const result = await g8.api.workbench.listWorkbenchColumns({ path: { table_id: "id" } });
2387
+ ```
2388
+
2389
+ ---
2390
+
2391
+ <a id="op-listworkbenchconnections"></a>
2392
+
2393
+ ### `g8.api.workbench.listWorkbenchConnections(input)`
2394
+
2395
+ **List Workbench Connections**
2396
+
2397
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/connections`
2398
+ - operationId: `list_workbench_connections_workbench_tables__table_id__connections_get` (also callable as `g8.api.call("list_workbench_connections_workbench_tables__table_id__connections_get", input)`)
2399
+ - Tier: `read`: reads data; safe to call and to retry
2400
+ - API-key scope: `lists:read`
2401
+
2402
+ Connections where this table is the source or the destination. Free.
2403
+
2404
+ **Input**
2405
+
2406
+ | Field | Type | Required | Description |
2407
+ |---|---|---|---|
2408
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
2409
+
2410
+ **Returns** `ApiResponse_EnrichmentListPayload_`: the envelope `{ data: EnrichmentListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2411
+
2412
+ Other envelope fields: `pagination` (PaginationMeta).
2413
+
2414
+ `EnrichmentListPayload` fields:
2415
+
2416
+ | Field | Type | Required | Description |
2417
+ |---|---|---|---|
2418
+ | `items` | `Array<unknown>` | no | The collection, always present. |
2419
+
2420
+ **Example**
2421
+
2422
+ ```ts
2423
+ const result = await g8.api.workbench.listWorkbenchConnections({ path: { table_id: "id" } });
2424
+ ```
2425
+
2426
+ ---
2427
+
2428
+ <a id="op-listworkbenchenrichmentconfigs"></a>
2429
+
2430
+ ### `g8.api.workbench.listWorkbenchEnrichmentConfigs(input)`
2431
+
2432
+ **List Workbench Enrichment Configs**
2433
+
2434
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/enrichment-configs`
2435
+ - operationId: `list_workbench_enrichment_configs_workbench_tables__table_id__enrichment_configs_get` (also callable as `g8.api.call("list_workbench_enrichment_configs_workbench_tables__table_id__enrichment_configs_get", input)`)
2436
+ - Tier: `read`: reads data; safe to call and to retry
2437
+ - API-key scope: `lists:read`
2438
+
2439
+ Every enrichment configuration attached to this table. FREE.
2440
+
2441
+ The inventory of what WOULD spend if run - read it before enabling
2442
+ auto-enrichment, which runs all of them.
2443
+
2444
+ **Input**
2445
+
2446
+ | Field | Type | Required | Description |
2447
+ |---|---|---|---|
2448
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
2449
+ | `query.type` | `string \| null` | no | Narrow to one config kind. Omit for all of them. |
2450
+
2451
+ **Returns** `ApiResponse_EnrichmentListPayload_`: the envelope `{ data: EnrichmentListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2452
+
2453
+ Other envelope fields: `pagination` (PaginationMeta).
2454
+
2455
+ `EnrichmentListPayload` fields:
2456
+
2457
+ | Field | Type | Required | Description |
2458
+ |---|---|---|---|
2459
+ | `items` | `Array<unknown>` | no | The collection, always present. |
2460
+
2461
+ **Example**
2462
+
2463
+ ```ts
2464
+ const result = await g8.api.workbench.listWorkbenchEnrichmentConfigs({ path: { table_id: "id" } });
2465
+ ```
2466
+
2467
+ ---
2468
+
2469
+ <a id="op-listworkbenchfindpeopleconfigs"></a>
2470
+
2471
+ ### `g8.api.workbench.listWorkbenchFindPeopleConfigs(input)`
2472
+
2473
+ **List Workbench Find People Configs**
2474
+
2475
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/find-people/configs`
2476
+ - operationId: `list_workbench_find_people_configs_workbench_tables__table_id__find_people_configs_get` (also callable as `g8.api.call("list_workbench_find_people_configs_workbench_tables__table_id__find_people_configs_get", input)`)
2477
+ - Tier: `read`: reads data; safe to call and to retry
2478
+ - API-key scope: `lists:read`
2479
+
2480
+ The table's find-people configurations. Free.
2481
+
2482
+ **Input**
2483
+
2484
+ | Field | Type | Required | Description |
2485
+ |---|---|---|---|
2486
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
2487
+
2488
+ **Returns** `ApiResponse_EnrichmentListPayload_`: the envelope `{ data: EnrichmentListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2489
+
2490
+ Other envelope fields: `pagination` (PaginationMeta).
2491
+
2492
+ `EnrichmentListPayload` fields:
2493
+
2494
+ | Field | Type | Required | Description |
2495
+ |---|---|---|---|
2496
+ | `items` | `Array<unknown>` | no | The collection, always present. |
2497
+
2498
+ **Example**
2499
+
2500
+ ```ts
2501
+ const result = await g8.api.workbench.listWorkbenchFindPeopleConfigs({ path: { table_id: "id" } });
2502
+ ```
2503
+
2504
+ ---
2505
+
2506
+ <a id="op-listworkbenchfindpeoplecontacts"></a>
2507
+
2508
+ ### `g8.api.workbench.listWorkbenchFindPeopleContacts(input)`
2509
+
2510
+ **List Workbench Find People Contacts**
2511
+
2512
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/find-people/{config_id}/contacts`
2513
+ - operationId: `list_workbench_find_people_contacts_workbench_tables__table_id__find_people__config_id__contacts_get` (also callable as `g8.api.call("list_workbench_find_people_contacts_workbench_tables__table_id__find_people__config_id__contacts_get", input)`)
2514
+ - Tier: `read`: reads data; safe to call and to retry
2515
+ - API-key scope: `lists:read`
2516
+
2517
+ The people a find-people run found for one company row. Free.
2518
+
2519
+ **Input**
2520
+
2521
+ | Field | Type | Required | Description |
2522
+ |---|---|---|---|
2523
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
2524
+ | `path.config_id` | `string` | yes | Find-people configuration id (UUID). |
2525
+ | `query.source_row_id` | `integer` | yes | The company row. |
2526
+ | `query.limit` | `integer` | no | default `100` |
2527
+
2528
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2529
+
2530
+ Other envelope fields: `pagination` (PaginationMeta).
2531
+
2532
+ **Example**
2533
+
2534
+ ```ts
2535
+ const result = await g8.api.workbench.listWorkbenchFindPeopleContacts({
2536
+ path: { table_id: "id", config_id: "id" },
2537
+ query: { source_row_id: 123 },
2538
+ });
2539
+ ```
2540
+
2541
+ ---
2542
+
2543
+ <a id="op-listworkbenchpipelines"></a>
2544
+
2545
+ ### `g8.api.workbench.listWorkbenchPipelines(input)`
2546
+
2547
+ **List Workbench Pipelines**
2548
+
2549
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/pipelines`
2550
+ - operationId: `list_workbench_pipelines_workbench_tables__table_id__pipelines_get` (also callable as `g8.api.call("list_workbench_pipelines_workbench_tables__table_id__pipelines_get", input)`)
2551
+ - Tier: `read`: reads data; safe to call and to retry
2552
+ - API-key scope: `lists:read`
2553
+
2554
+ The table's pipelines. Free.
2555
+
2556
+ **Input**
2557
+
2558
+ | Field | Type | Required | Description |
2559
+ |---|---|---|---|
2560
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
2561
+
2562
+ **Returns** `ApiResponse_EnrichmentListPayload_`: the envelope `{ data: EnrichmentListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2563
+
2564
+ Other envelope fields: `pagination` (PaginationMeta).
2565
+
2566
+ `EnrichmentListPayload` fields:
2567
+
2568
+ | Field | Type | Required | Description |
2569
+ |---|---|---|---|
2570
+ | `items` | `Array<unknown>` | no | The collection, always present. |
2571
+
2572
+ **Example**
2573
+
2574
+ ```ts
2575
+ const result = await g8.api.workbench.listWorkbenchPipelines({ path: { table_id: "id" } });
2576
+ ```
2577
+
2578
+ ---
2579
+
2580
+ <a id="op-listworkbenchrows"></a>
2581
+
2582
+ ### `g8.api.workbench.listWorkbenchRows(input)`
2583
+
2584
+ **List Workbench Rows**
2585
+
2586
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/rows`
2587
+ - operationId: `list_workbench_rows_workbench_tables__table_id__rows_get` (also callable as `g8.api.call("list_workbench_rows_workbench_tables__table_id__rows_get", input)`)
2588
+ - Tier: `read`: reads data; safe to call and to retry
2589
+ - API-key scope: `lists:read`
2590
+
2591
+ A window of rows.
2592
+
2593
+ Paged by `start_row`/`end_row`, not page/limit - this is a grid viewport,
2594
+ and translating it into pages would lose the ability to fetch an arbitrary
2595
+ window as a user scrolls.
2596
+
2597
+ **Input**
2598
+
2599
+ | Field | Type | Required | Description |
2600
+ |---|---|---|---|
2601
+ | `path.table_id` | `string` | yes | Table id (UUID). |
2602
+ | `query.start_row` | `integer` | no | default `0` |
2603
+ | `query.end_row` | `integer` | no | default `100` |
2604
+
2605
+ **Returns** `ApiResponse_WorkbenchPage_`: the envelope `{ data: WorkbenchPage, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2606
+
2607
+ Other envelope fields: `pagination` (PaginationMeta).
2608
+
2609
+ `WorkbenchPage` fields:
2610
+
2611
+ | Field | Type | Required | Description |
2612
+ |---|---|---|---|
2613
+ | `items` | `Array<Record<string, unknown>>` | no | |
2614
+ | `total` | `integer` | no | default `0` |
2615
+
2616
+ **Example**
2617
+
2618
+ ```ts
2619
+ const result = await g8.api.workbench.listWorkbenchRows({ path: { table_id: "id" } });
2620
+ ```
2621
+
2622
+ ---
2623
+
2624
+ <a id="op-listworkbenchscraperpresets"></a>
2625
+
2626
+ ### `g8.api.workbench.listWorkbenchScraperPresets(input?)`
2627
+
2628
+ **List Workbench Scraper Presets**
2629
+
2630
+ - HTTP: `GET /api/v1/workbench/scraper/presets`
2631
+ - operationId: `list_workbench_scraper_presets_workbench_scraper_presets_get` (also callable as `g8.api.call("list_workbench_scraper_presets_workbench_scraper_presets_get", input)`)
2632
+ - Tier: `read`: reads data; safe to call and to retry
2633
+ - API-key scope: `lists:read`
2634
+
2635
+ The scraper presets available, with their per-result rates. FREE.
2636
+
2637
+ Read the rate here, then price a specific run with `credit-estimate`.
2638
+
2639
+ **Input**: none.
2640
+
2641
+ **Returns** `ApiResponse_EnrichmentListPayload_`: the envelope `{ data: EnrichmentListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2642
+
2643
+ Other envelope fields: `pagination` (PaginationMeta).
2644
+
2645
+ `EnrichmentListPayload` fields:
2646
+
2647
+ | Field | Type | Required | Description |
2648
+ |---|---|---|---|
2649
+ | `items` | `Array<unknown>` | no | The collection, always present. |
2650
+
2651
+ **Example**
2652
+
2653
+ ```ts
2654
+ const result = await g8.api.workbench.listWorkbenchScraperPresets();
2655
+ ```
2656
+
2657
+ ---
2658
+
2659
+ <a id="op-listworkbenchscraperruns"></a>
2660
+
2661
+ ### `g8.api.workbench.listWorkbenchScraperRuns(input)`
2662
+
2663
+ **List Workbench Scraper Runs**
2664
+
2665
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/scraper/runs`
2666
+ - operationId: `list_workbench_scraper_runs_workbench_tables__table_id__scraper_runs_get` (also callable as `g8.api.call("list_workbench_scraper_runs_workbench_tables__table_id__scraper_runs_get", input)`)
2667
+ - Tier: `read`: reads data; safe to call and to retry
2668
+ - API-key scope: `lists:read`
2669
+
2670
+ The table's scraper runs, newest first, with a total. Free.
2671
+
2672
+ **Input**
2673
+
2674
+ | Field | Type | Required | Description |
2675
+ |---|---|---|---|
2676
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
2677
+ | `query.limit` | `integer` | no | default `20` |
2678
+ | `query.offset` | `integer` | no | default `0` |
2679
+
2680
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2681
+
2682
+ Other envelope fields: `pagination` (PaginationMeta).
2683
+
2684
+ **Example**
2685
+
2686
+ ```ts
2687
+ const result = await g8.api.workbench.listWorkbenchScraperRuns({ path: { table_id: "id" } });
2688
+ ```
2689
+
2690
+ ---
2691
+
2692
+ <a id="op-listworkbenchsourcecredentials"></a>
2693
+
2694
+ ### `g8.api.workbench.listWorkbenchSourceCredentials(input?)`
2695
+
2696
+ **List Workbench Source Credentials**
2697
+
2698
+ - HTTP: `GET /api/v1/workbench/source-credentials`
2699
+ - operationId: `list_workbench_source_credentials_workbench_source_credentials_get` (also callable as `g8.api.call("list_workbench_source_credentials_workbench_source_credentials_get", input)`)
2700
+ - Tier: `read`: reads data; safe to call and to retry
2701
+ - API-key scope: `lists:read`
2702
+
2703
+ Every ingest credential in the organisation - owner, scope, expiry. Free.
2704
+
2705
+ Hashes and full secrets are NEVER returned; a credential's value is
2706
+ readable only once, at the moment it is minted.
2707
+
2708
+ Gated on Workbench WRITE even though it reads, matching the app: the
2709
+ org-wide inventory names which person owns each credential, so it is a
2710
+ governance view rather than ordinary table data.
2711
+
2712
+ **Input**: none.
2713
+
2714
+ **Returns** `ApiResponse_EnrichmentListPayload_`: the envelope `{ data: EnrichmentListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2715
+
2716
+ Other envelope fields: `pagination` (PaginationMeta).
2717
+
2718
+ `EnrichmentListPayload` fields:
2719
+
2720
+ | Field | Type | Required | Description |
2721
+ |---|---|---|---|
2722
+ | `items` | `Array<unknown>` | no | The collection, always present. |
2723
+
2724
+ **Example**
2725
+
2726
+ ```ts
2727
+ const result = await g8.api.workbench.listWorkbenchSourceCredentials();
2728
+ ```
2729
+
2730
+ ---
2731
+
2732
+ <a id="op-listworkbenchtableaipresets"></a>
2733
+
2734
+ ### `g8.api.workbench.listWorkbenchTableAiPresets(input)`
2735
+
2736
+ **List Workbench Table Ai Presets**
2737
+
2738
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/ai-presets`
2739
+ - operationId: `list_workbench_table_ai_presets_workbench_tables__table_id__ai_presets_get` (also callable as `g8.api.call("list_workbench_table_ai_presets_workbench_tables__table_id__ai_presets_get", input)`)
2740
+ - Tier: `read`: reads data; safe to call and to retry
2741
+ - API-key scope: `lists:read`
2742
+
2743
+ The presets that can actually run on THIS table. FREE.
2744
+
2745
+ Filtered by the columns the table has, so a preset listed here has its
2746
+ inputs satisfied. Selecting one still costs nothing until it is run.
2747
+
2748
+ **Input**
2749
+
2750
+ | Field | Type | Required | Description |
2751
+ |---|---|---|---|
2752
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
2753
+
2754
+ **Returns** `ApiResponse_EnrichmentListPayload_`: the envelope `{ data: EnrichmentListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2755
+
2756
+ Other envelope fields: `pagination` (PaginationMeta).
2757
+
2758
+ `EnrichmentListPayload` fields:
2759
+
2760
+ | Field | Type | Required | Description |
2761
+ |---|---|---|---|
2762
+ | `items` | `Array<unknown>` | no | The collection, always present. |
2763
+
2764
+ **Example**
2765
+
2766
+ ```ts
2767
+ const result = await g8.api.workbench.listWorkbenchTableAiPresets({ path: { table_id: "id" } });
2768
+ ```
2769
+
2770
+ ---
2771
+
2772
+ <a id="op-listworkbenchtables"></a>
2773
+
2774
+ ### `g8.api.workbench.listWorkbenchTables(input?)`
2775
+
2776
+ **List Workbench Tables**
2777
+
2778
+ - HTTP: `GET /api/v1/workbench/tables`
2779
+ - operationId: `list_workbench_tables_workbench_tables_get` (also callable as `g8.api.call("list_workbench_tables_workbench_tables_get", input)`)
2780
+ - Tier: `read`: reads data; safe to call and to retry
2781
+ - API-key scope: `lists:read`
2782
+
2783
+ This org's tables.
2784
+
2785
+ **Input**
2786
+
2787
+ | Field | Type | Required | Description |
2788
+ |---|---|---|---|
2789
+ | `query.page` | `integer` | no | default `1` |
2790
+ | `query.limit` | `integer` | no | default `20` |
2791
+ | `query.sort_field` | `string` | no | default `"created_at"` |
2792
+ | `query.sort_order` | `string` | no | default `"desc"` |
2793
+ | `query.filter_name` | `string \| null` | no | Substring match on the table name. |
2794
+
2795
+ **Returns** `ApiResponse_WorkbenchTableList_`: the envelope `{ data: WorkbenchTableList, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2796
+
2797
+ Other envelope fields: `pagination` (PaginationMeta).
2798
+
2799
+ `WorkbenchTableList` fields:
2800
+
2801
+ | Field | Type | Required | Description |
2802
+ |---|---|---|---|
2803
+ | `tables` | `Array<WorkbenchTable>` | no | |
2804
+ | `total` | `integer` | no | default `0` |
2805
+
2806
+ **Example**
2807
+
2808
+ ```ts
2809
+ const result = await g8.api.workbench.listWorkbenchTables();
2810
+ ```
2811
+
2812
+ ---
2813
+
2814
+ <a id="op-listworkbenchtargetfields"></a>
2815
+
2816
+ ### `g8.api.workbench.listWorkbenchTargetFields(input?)`
2817
+
2818
+ **List Workbench Target Fields**
2819
+
2820
+ - HTTP: `GET /api/v1/workbench/target-fields`
2821
+ - operationId: `list_workbench_target_fields_workbench_target_fields_get` (also callable as `g8.api.call("list_workbench_target_fields_workbench_target_fields_get", input)`)
2822
+ - Tier: `read`: reads data; safe to call and to retry
2823
+ - API-key scope: `lists:read`
2824
+
2825
+ The canonical fields a workbench column can be mapped onto. Free.
2826
+
2827
+ Closed to `contact` / `company` because the handler indexes a dict with
2828
+ this value directly - a free string would raise a KeyError inside and
2829
+ escape as a 500 instead of a 422 naming the two kinds.
2830
+
2831
+ **Input**
2832
+
2833
+ | Field | Type | Required | Description |
2834
+ |---|---|---|---|
2835
+ | `query.entity_type` | `"contact" \| "company"` | no | Which record kind the fields are for. default `"contact"` |
2836
+
2837
+ **Returns** `ApiResponse_EnrichmentListPayload_`: the envelope `{ data: EnrichmentListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2838
+
2839
+ Other envelope fields: `pagination` (PaginationMeta).
2840
+
2841
+ `EnrichmentListPayload` fields:
2842
+
2843
+ | Field | Type | Required | Description |
2844
+ |---|---|---|---|
2845
+ | `items` | `Array<unknown>` | no | The collection, always present. |
2846
+
2847
+ **Example**
2848
+
2849
+ ```ts
2850
+ const result = await g8.api.workbench.listWorkbenchTargetFields();
2851
+ ```
2852
+
2853
+ ---
2854
+
2855
+ <a id="op-listworkbenchtriggers"></a>
2856
+
2857
+ ### `g8.api.workbench.listWorkbenchTriggers(input)`
2858
+
2859
+ **List Workbench Triggers**
2860
+
2861
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/triggers`
2862
+ - operationId: `list_workbench_triggers_workbench_tables__table_id__triggers_get` (also callable as `g8.api.call("list_workbench_triggers_workbench_tables__table_id__triggers_get", input)`)
2863
+ - Tier: `read`: reads data; safe to call and to retry
2864
+ - API-key scope: `lists:read`
2865
+
2866
+ The table's triggers. Free.
2867
+
2868
+ **Input**
2869
+
2870
+ | Field | Type | Required | Description |
2871
+ |---|---|---|---|
2872
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
2873
+
2874
+ **Returns** `ApiResponse_EnrichmentListPayload_`: the envelope `{ data: EnrichmentListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2875
+
2876
+ Other envelope fields: `pagination` (PaginationMeta).
2877
+
2878
+ `EnrichmentListPayload` fields:
2879
+
2880
+ | Field | Type | Required | Description |
2881
+ |---|---|---|---|
2882
+ | `items` | `Array<unknown>` | no | The collection, always present. |
2883
+
2884
+ **Example**
2885
+
2886
+ ```ts
2887
+ const result = await g8.api.workbench.listWorkbenchTriggers({ path: { table_id: "id" } });
2888
+ ```
2889
+
2890
+ ---
2891
+
2892
+ <a id="op-mapworkbenchcolumn"></a>
2893
+
2894
+ ### `g8.api.workbench.mapWorkbenchColumn(input)`
2895
+
2896
+ **Map Workbench Column**
2897
+
2898
+ - HTTP: `PUT /api/v1/workbench/tables/{table_id}/columns/{column_id}/mapping`
2899
+ - operationId: `map_workbench_column_workbench_tables__table_id__columns__column_id__mapping_put` (also callable as `g8.api.call("map_workbench_column_workbench_tables__table_id__columns__column_id__mapping_put", input)`)
2900
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2901
+ - API-key scope: `lists:write`
2902
+
2903
+ Point a column at a CRM field so export knows where its values go.
2904
+
2905
+ Send `mapping_target: null` to clear it - an unmapped column is a real
2906
+ state, not a missing argument.
2907
+
2908
+ **Input**
2909
+
2910
+ | Field | Type | Required | Description |
2911
+ |---|---|---|---|
2912
+ | `path.table_id` | `string` | yes | Table id (UUID). |
2913
+ | `path.column_id` | `integer` | yes | Column id. |
2914
+ | `body` | `WorkbenchColumnMappingRequest` | yes | Request body; fields below. |
2915
+
2916
+ Body fields (`WorkbenchColumnMappingRequest`):
2917
+
2918
+ | Field | Type | Required | Description |
2919
+ |---|---|---|---|
2920
+ | `body.mapping_target` | `string \| null` | no | |
2921
+
2922
+ **Returns** `ApiResponse_dict_`: the envelope `{ data: Record<string, unknown>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2923
+
2924
+ Other envelope fields: `pagination` (PaginationMeta).
2925
+
2926
+ **Example**
2927
+
2928
+ ```ts
2929
+ const result = await g8.api.workbench.mapWorkbenchColumn({ path: { table_id: "id", column_id: 123 }, body: {} });
2930
+ ```
2931
+
2932
+ ---
2933
+
2934
+ <a id="op-migrateworkbenchlegacyaiconfig"></a>
2935
+
2936
+ ### `g8.api.workbench.migrateWorkbenchLegacyAiConfig(input)`
2937
+
2938
+ **Migrate Workbench Legacy Ai Config**
2939
+
2940
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/ai/migrate-legacy`
2941
+ - operationId: `migrate_workbench_legacy_ai_config_workbench_tables__table_id__ai_migrate_legacy_post` (also callable as `g8.api.call("migrate_workbench_legacy_ai_config_workbench_tables__table_id__ai_migrate_legacy_post", input)`)
2942
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2943
+ - API-key scope: `lists:write`
2944
+
2945
+ Move an old single-prompt config onto the group model. FREE.
2946
+
2947
+ A one-off data migration for tables configured before AI groups existed.
2948
+ It reshapes stored configuration and runs nothing.
2949
+
2950
+ **Input**
2951
+
2952
+ | Field | Type | Required | Description |
2953
+ |---|---|---|---|
2954
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
2955
+
2956
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2957
+
2958
+ Other envelope fields: `pagination` (PaginationMeta).
2959
+
2960
+ **Example**
2961
+
2962
+ ```ts
2963
+ const result = await g8.api.workbench.migrateWorkbenchLegacyAiConfig({ path: { table_id: "id" } });
2964
+ ```
2965
+
2966
+ ---
2967
+
2968
+ <a id="op-pasteimportworkbenchrows"></a>
2969
+
2970
+ ### `g8.api.workbench.pasteImportWorkbenchRows(input)`
2971
+
2972
+ **Paste Import Workbench Rows**
2973
+
2974
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/import/paste`
2975
+ - operationId: `paste_import_workbench_rows_workbench_tables__table_id__import_paste_post` (also callable as `g8.api.call("paste_import_workbench_rows_workbench_tables__table_id__import_paste_post", input)`)
2976
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2977
+ - API-key scope: `lists:write`
2978
+
2979
+ Import a rectangle of values directly. FREE.
2980
+
2981
+ Up to 50,000 rows and 100 columns in one call. Missing columns are created
2982
+ from `headers`.
2983
+
2984
+ If the table has auto-enrichment ON, the rows this adds are enriched
2985
+ automatically afterwards, and THAT spends credits. The import itself does
2986
+ not.
2987
+
2988
+ **Input**
2989
+
2990
+ | Field | Type | Required | Description |
2991
+ |---|---|---|---|
2992
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
2993
+ | `body` | `PasteImportRequest` | yes | Request body; fields below. |
2994
+
2995
+ Body fields (`PasteImportRequest`):
2996
+
2997
+ | Field | Type | Required | Description |
2998
+ |---|---|---|---|
2999
+ | `body.headers` | `Array<string>` | yes | min items 1, max items 100 |
3000
+ | `body.rows` | `Array<Array<unknown>>` | yes | min items 1, max items 50000 |
3001
+ | `body.raw_source_column_id` | `integer \| null` | no | |
3002
+
3003
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3004
+
3005
+ Other envelope fields: `pagination` (PaginationMeta).
3006
+
3007
+ **Example**
3008
+
3009
+ ```ts
3010
+ const result = await g8.api.workbench.pasteImportWorkbenchRows({
3011
+ path: { table_id: "id" },
3012
+ body: { headers: ["example"], rows: [[{}]] },
3013
+ });
3014
+ ```
3015
+
3016
+ ---
3017
+
3018
+ <a id="op-previewworkbenchai"></a>
3019
+
3020
+ ### `g8.api.workbench.previewWorkbenchAi(input)`
3021
+
3022
+ **Preview Workbench Ai**
3023
+
3024
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/ai/preview`
3025
+ - operationId: `preview_workbench_ai_workbench_tables__table_id__ai_preview_post` (also callable as `g8.api.call("preview_workbench_ai_workbench_tables__table_id__ai_preview_post", input)`)
3026
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
3027
+ - API-key scope: `lists:run`
3028
+
3029
+ Run the default AI pass on the first three pending rows. CHARGES.
3030
+
3031
+ A preview in scope, not in price: it is the real pass and bills those rows.
3032
+ Only `approved_max_credits` and `quote_expires_at` are read from the body.
3033
+
3034
+ **Input**
3035
+
3036
+ | Field | Type | Required | Description |
3037
+ |---|---|---|---|
3038
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
3039
+ | `body` | `RunStagingAIRequest \| null` | no | Request body; fields below. |
3040
+
3041
+ Body fields:
3042
+
3043
+ | Field | Type | Required | Description |
3044
+ |---|---|---|---|
3045
+ | `body.approved_max_credits` | `integer \| null` | no | Ceiling the caller approves. The run refuses to exceed it. min 0 |
3046
+ | `body.conditions` | `Array<Record<string, string>> \| null` | no | |
3047
+ | `body.exclude_row_ids` | `Array<integer> \| null` | no | max items 100000 |
3048
+ | `body.max_rows_per_source` | `integer \| null` | no | min 1, max 50 |
3049
+ | `body.model` | `string \| null` | no | Override the configured model. |
3050
+ | `body.multi_row_output` | `boolean \| null` | no | |
3051
+ | `body.prompt` | `string \| null` | no | Override the configured prompt. |
3052
+ | `body.qualification_mode` | `boolean` | no | default `false` |
3053
+ | `body.quote_expires_at` | `string (date-time) \| null` | no | |
3054
+ | `body.quote_id` | `string (uuid) \| null` | no | |
3055
+ | `body.row_ids` | `Array<integer> \| null` | no | Rows to run. OMIT to run EVERY row in the table. |
3056
+ | `body.status_filter` | `string \| null` | no | |
3057
+
3058
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3059
+
3060
+ Other envelope fields: `pagination` (PaginationMeta).
3061
+
3062
+ **Example**
3063
+
3064
+ ```ts
3065
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
3066
+ const result = await g8.api.workbench.previewWorkbenchAi({ path: { table_id: "id" } });
3067
+ ```
3068
+
3069
+ ---
3070
+
3071
+ <a id="op-previewworkbenchresearchimport"></a>
3072
+
3073
+ ### `g8.api.workbench.previewWorkbenchResearchImport(input)`
3074
+
3075
+ **Preview Workbench Research Import**
3076
+
3077
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/import/search/research/preview`
3078
+ - operationId: `preview_workbench_research_import_workbench_tables__table_id__import_search_research_preview_post` (also callable as `g8.api.call("preview_workbench_research_import_workbench_tables__table_id__import_search_research_preview_post", input)`)
3079
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
3080
+ - API-key scope: `lists:run`
3081
+
3082
+ Describe your leads in words; a model writes the search and returns a
3083
+ sample. CHARGES for the model call. Nothing is imported.
3084
+
3085
+ **Input**
3086
+
3087
+ | Field | Type | Required | Description |
3088
+ |---|---|---|---|
3089
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
3090
+ | `body` | `SearchResearchPreviewRequest` | yes | Request body; fields below. |
3091
+
3092
+ Body fields (`SearchResearchPreviewRequest`):
3093
+
3094
+ | Field | Type | Required | Description |
3095
+ |---|---|---|---|
3096
+ | `body.lead_prompt` | `string` | yes | min length 1 |
3097
+ | `body.max_employees_per_company` | `integer \| null` | no | min 1, max 1000 |
3098
+ | `body.max_result` | `integer \| null` | no | min 1, max 50000 |
3099
+ | `body.sample_size` | `integer` | no | default `50`, min 1, max 1000 |
3100
+
3101
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3102
+
3103
+ Other envelope fields: `pagination` (PaginationMeta).
3104
+
3105
+ **Example**
3106
+
3107
+ ```ts
3108
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
3109
+ const result = await g8.api.workbench.previewWorkbenchResearchImport({ path: { table_id: "id" }, body: { lead_prompt: "example" } });
3110
+ ```
3111
+
3112
+ ---
3113
+
3114
+ <a id="op-previewworkbenchsearchimport"></a>
3115
+
3116
+ ### `g8.api.workbench.previewWorkbenchSearchImport(input)`
3117
+
3118
+ **Preview Workbench Search Import**
3119
+
3120
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/import/search/preview`
3121
+ - operationId: `preview_workbench_search_import_workbench_tables__table_id__import_search_preview_post` (also callable as `g8.api.call("preview_workbench_search_import_workbench_tables__table_id__import_search_preview_post", input)`)
3122
+ - Tier: `read`: reads data; safe to call and to retry
3123
+ - API-key scope: `lists:read`
3124
+
3125
+ Sample what a people search would import, and how many it matches. Free.
3126
+
3127
+ Contact details stay masked; nothing is imported.
3128
+
3129
+ **Input**
3130
+
3131
+ | Field | Type | Required | Description |
3132
+ |---|---|---|---|
3133
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
3134
+ | `body` | `SearchImportPreviewRequest` | yes | Request body; fields below. |
3135
+
3136
+ Body fields (`SearchImportPreviewRequest`):
3137
+
3138
+ | Field | Type | Required | Description |
3139
+ |---|---|---|---|
3140
+ | `body.filters` | `Array<Record<string, unknown>>` | yes | min items 1 |
3141
+ | `body.max_employees_per_company` | `integer \| null` | no | min 1, max 1000 |
3142
+ | `body.max_result` | `integer \| null` | no | min 1, max 50000 |
3143
+ | `body.sample_size` | `integer` | no | default `50`, min 1, max 1000 |
3144
+
3145
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3146
+
3147
+ Other envelope fields: `pagination` (PaginationMeta).
3148
+
3149
+ **Example**
3150
+
3151
+ ```ts
3152
+ const result = await g8.api.workbench.previewWorkbenchSearchImport({ path: { table_id: "id" }, body: { filters: [{}] } });
3153
+ ```
3154
+
3155
+ ---
3156
+
3157
+ <a id="op-queryworkbenchrows"></a>
3158
+
3159
+ ### `g8.api.workbench.queryWorkbenchRows(input)`
3160
+
3161
+ **Query Workbench Rows**
3162
+
3163
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/rows/query`
3164
+ - operationId: `query_workbench_rows_workbench_tables__table_id__rows_query_post` (also callable as `g8.api.call("query_workbench_rows_workbench_tables__table_id__rows_query_post", input)`)
3165
+ - Tier: `read`: reads data; safe to call and to retry
3166
+ - API-key scope: `lists:read`
3167
+
3168
+ Read a window of rows with a filter and a sort. FREE - a read.
3169
+
3170
+ POST only because the filter is a structured body; nothing is written,
3171
+ enqueued or charged. `GET /workbench/tables/{id}/rows` is the simple form.
3172
+
3173
+ **Input**
3174
+
3175
+ | Field | Type | Required | Description |
3176
+ |---|---|---|---|
3177
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
3178
+ | `body` | `StagingRowsQueryRequest` | no | Request body; fields below. |
3179
+
3180
+ Body fields (`StagingRowsQueryRequest`):
3181
+
3182
+ | Field | Type | Required | Description |
3183
+ |---|---|---|---|
3184
+ | `body.end_row` | `integer` | no | default `100`, min 1, max 100000 |
3185
+ | `body.filter_model` | `Record<string, unknown> \| null` | no | |
3186
+ | `body.sort_model` | `Array<Record<string, unknown>> \| null` | no | |
3187
+ | `body.start_row` | `integer` | no | default `0`, min 0, max 100000 |
3188
+
3189
+ **Returns** `ApiResponse_EnrichmentListPayload_`: the envelope `{ data: EnrichmentListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3190
+
3191
+ Other envelope fields: `pagination` (PaginationMeta).
3192
+
3193
+ `EnrichmentListPayload` fields:
3194
+
3195
+ | Field | Type | Required | Description |
3196
+ |---|---|---|---|
3197
+ | `items` | `Array<unknown>` | no | The collection, always present. |
3198
+
3199
+ **Example**
3200
+
3201
+ ```ts
3202
+ const result = await g8.api.workbench.queryWorkbenchRows({ path: { table_id: "id" } });
3203
+ ```
3204
+
3205
+ ---
3206
+
3207
+ <a id="op-quoteworkbenchairun"></a>
3208
+
3209
+ ### `g8.api.workbench.quoteWorkbenchAiRun(input)`
3210
+
3211
+ **Quote Workbench Ai Run**
3212
+
3213
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/ai/validate-credits`
3214
+ - operationId: `quote_workbench_ai_run_workbench_tables__table_id__ai_validate_credits_post` (also callable as `g8.api.call("quote_workbench_ai_run_workbench_tables__table_id__ai_validate_credits_post", input)`)
3215
+ - Tier: `read`: reads data; safe to call and to retry
3216
+ - API-key scope: `lists:read`
3217
+
3218
+ Price an AI run before starting it. FREE.
3219
+
3220
+ Name the run you are about to start: `group_id`, `column_id`, or
3221
+ `all_columns`; none prices the table's default AI pass. Pass the answer's
3222
+ `required_credits` to the run as `approved_max_credits`.
3223
+
3224
+ **Input**
3225
+
3226
+ | Field | Type | Required | Description |
3227
+ |---|---|---|---|
3228
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
3229
+ | `body` | `WorkbenchCreditValidationRequest \| null` | no | Request body; fields below. |
3230
+
3231
+ Body fields:
3232
+
3233
+ | Field | Type | Required | Description |
3234
+ |---|---|---|---|
3235
+ | `body.all_columns` | `boolean` | no | default `false` |
3236
+ | `body.column_id` | `integer \| null` | no | |
3237
+ | `body.exclude_row_ids` | `Array<integer> \| null` | no | |
3238
+ | `body.group_id` | `string \| null` | no | min length 1, max length 255 |
3239
+ | `body.row_ids` | `Array<integer> \| null` | no | OMIT to price EVERY row. |
3240
+ | `body.status_filter` | `string \| null` | no | |
3241
+
3242
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3243
+
3244
+ Other envelope fields: `pagination` (PaginationMeta).
3245
+
3246
+ **Example**
3247
+
3248
+ ```ts
3249
+ const result = await g8.api.workbench.quoteWorkbenchAiRun({ path: { table_id: "id" } });
3250
+ ```
3251
+
3252
+ ---
3253
+
3254
+ <a id="op-quoteworkbenchformulageneration"></a>
3255
+
3256
+ ### `g8.api.workbench.quoteWorkbenchFormulaGeneration(input)`
3257
+
3258
+ **Quote Workbench Formula Generation**
3259
+
3260
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/formula-columns/generate-quote`
3261
+ - operationId: `quote_workbench_formula_generation_workbench_tables__table_id__formula_columns_generate_quote_get` (also callable as `g8.api.call("quote_workbench_formula_generation_workbench_tables__table_id__formula_columns_generate_quote_get", input)`)
3262
+ - Tier: `read`: reads data; safe to call and to retry
3263
+ - API-key scope: `lists:read`
3264
+
3265
+ Price AI formula authoring against the live balance. CHARGES NOTHING.
3266
+
3267
+ Despite `generate` in the path this generates no formula and spends no
3268
+ credit - it reports the fixed authoring charge, the organisation's balance,
3269
+ and whether the balance covers it.
3270
+
3271
+ **Input**
3272
+
3273
+ | Field | Type | Required | Description |
3274
+ |---|---|---|---|
3275
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
3276
+
3277
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3278
+
3279
+ Other envelope fields: `pagination` (PaginationMeta).
3280
+
3281
+ **Example**
3282
+
3283
+ ```ts
3284
+ const result = await g8.api.workbench.quoteWorkbenchFormulaGeneration({ path: { table_id: "id" } });
3285
+ ```
3286
+
3287
+ ---
3288
+
3289
+ <a id="op-quoteworkbenchunlock"></a>
3290
+
3291
+ ### `g8.api.workbench.quoteWorkbenchUnlock(input)`
3292
+
3293
+ **Quote Workbench Unlock**
3294
+
3295
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/unlock-quote`
3296
+ - operationId: `quote_workbench_unlock_workbench_tables__table_id__unlock_quote_post` (also callable as `g8.api.call("quote_workbench_unlock_workbench_tables__table_id__unlock_quote_post", input)`)
3297
+ - Tier: `read`: reads data; safe to call and to retry
3298
+ - API-key scope: `lists:read`
3299
+
3300
+ Price an unlock. CHARGES NOTHING, and unlocks nothing.
3301
+
3302
+ Returns the exact locked-row count for the scope, the organisation's live
3303
+ balance, and the shortfall if there is one. It also returns the
3304
+ `operation_id` that `unlock-rows` REQUIRES - so this call is not optional
3305
+ advice, it is step one of the handshake.
3306
+
3307
+ Send this exact body to `unlock-rows` afterwards: the quote prices the
3308
+ scope the unlock will charge for, and a different body is a different
3309
+ price.
3310
+
3311
+ **Input**
3312
+
3313
+ | Field | Type | Required | Description |
3314
+ |---|---|---|---|
3315
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
3316
+ | `body` | `UnlockStagingRowsRequest` | no | Request body; fields below. |
3317
+
3318
+ Body fields (`UnlockStagingRowsRequest`):
3319
+
3320
+ | Field | Type | Required | Description |
3321
+ |---|---|---|---|
3322
+ | `body.approved_max_credits` | `integer \| null` | no | Ceiling the caller approves. The run refuses to exceed it. min 0 |
3323
+ | `body.exclude_row_ids` | `Array<integer> \| null` | no | Rows to leave locked. max items 100000 |
3324
+ | `body.operation_id` | `string (uuid) \| null` | no | The quote's operation id. REQUIRED by the unlock - it is what ties the charge to a price the caller was shown, and it makes a retried unlock idempotent instead of charging twice. |
3325
+ | `body.quote_expires_at` | `string (date-time) \| null` | no | Expiry of the quote being approved. |
3326
+ | `body.row_ids` | `Array<integer> \| null` | no | Rows to act on. OMIT to mean EVERY locked row in the table. max items 100000 |
3327
+
3328
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3329
+
3330
+ Other envelope fields: `pagination` (PaginationMeta).
3331
+
3332
+ **Example**
3333
+
3334
+ ```ts
3335
+ const result = await g8.api.workbench.quoteWorkbenchUnlock({ path: { table_id: "id" } });
3336
+ ```
3337
+
3338
+ ---
3339
+
3340
+ <a id="op-quoteworkbenchwaterfallrun"></a>
3341
+
3342
+ ### `g8.api.workbench.quoteWorkbenchWaterfallRun(input)`
3343
+
3344
+ **Quote Workbench Waterfall Run**
3345
+
3346
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/waterfall/configs/{column_id}/validate-credits`
3347
+ - operationId: `quote_workbench_waterfall_run_workbench_tables__table_id__waterfall_configs__column_id__validate_credits_post` (also callable as `g8.api.call("quote_workbench_waterfall_run_workbench_tables__table_id__waterfall_configs__column_id__validate_credits_post", input)`)
3348
+ - Tier: `read`: reads data; safe to call and to retry
3349
+ - API-key scope: `lists:read`
3350
+
3351
+ Price a waterfall run. FREE. OMITTING `row_ids` prices EVERY row.
3352
+
3353
+ **Input**
3354
+
3355
+ | Field | Type | Required | Description |
3356
+ |---|---|---|---|
3357
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
3358
+ | `path.column_id` | `integer` | yes | The waterfall column id. |
3359
+ | `body` | `WorkbenchCreditValidationRequest \| null` | no | Request body; fields below. |
3360
+
3361
+ Body fields:
3362
+
3363
+ | Field | Type | Required | Description |
3364
+ |---|---|---|---|
3365
+ | `body.all_columns` | `boolean` | no | default `false` |
3366
+ | `body.column_id` | `integer \| null` | no | |
3367
+ | `body.exclude_row_ids` | `Array<integer> \| null` | no | |
3368
+ | `body.group_id` | `string \| null` | no | min length 1, max length 255 |
3369
+ | `body.row_ids` | `Array<integer> \| null` | no | OMIT to price EVERY row. |
3370
+ | `body.status_filter` | `string \| null` | no | |
3371
+
3372
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3373
+
3374
+ Other envelope fields: `pagination` (PaginationMeta).
3375
+
3376
+ **Example**
3377
+
3378
+ ```ts
3379
+ const result = await g8.api.workbench.quoteWorkbenchWaterfallRun({ path: { table_id: "id", column_id: 123 } });
3380
+ ```
3381
+
3382
+ ---
3383
+
3384
+ <a id="op-regenerateworkbenchkey"></a>
3385
+
3386
+ ### `g8.api.workbench.regenerateWorkbenchKey(input)`
3387
+
3388
+ **Regenerate Workbench Key**
3389
+
3390
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/regenerate-key`
3391
+ - operationId: `regenerate_workbench_key_workbench_tables__table_id__regenerate_key_post` (also callable as `g8.api.call("regenerate_workbench_key_workbench_tables__table_id__regenerate_key_post", input)`)
3392
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
3393
+ - API-key scope: `lists:write`
3394
+
3395
+ Mint the table's ingest credential. Free.
3396
+
3397
+ THE ONLY TIME THE KEY IS READABLE. It is returned here and never again -
3398
+ store it on receipt. This is the credential the app's `X-Webhook-Key`
3399
+ ingest path expects, which is why that path is not published here and does
3400
+ not need to be.
3401
+
3402
+ `rotate_existing` false mints only when there is none; true replaces the
3403
+ current one and breaks anything still using it, immediately.
3404
+
3405
+ **Input**
3406
+
3407
+ | Field | Type | Required | Description |
3408
+ |---|---|---|---|
3409
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
3410
+ | `body` | `RegenerateKeyRequest` | no | Request body; fields below. |
3411
+
3412
+ Body fields (`RegenerateKeyRequest`):
3413
+
3414
+ | Field | Type | Required | Description |
3415
+ |---|---|---|---|
3416
+ | `body.rotate_existing` | `boolean` | no | Acknowledge that the existing credential stops working IMMEDIATELY. Leave false to mint only when there is none. default `false` |
3417
+
3418
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3419
+
3420
+ Other envelope fields: `pagination` (PaginationMeta).
3421
+
3422
+ **Example**
3423
+
3424
+ ```ts
3425
+ const result = await g8.api.workbench.regenerateWorkbenchKey({ path: { table_id: "id" } });
3426
+ ```
3427
+
3428
+ ---
3429
+
3430
+ <a id="op-reviewworkbenchfindpeoplecandidates"></a>
3431
+
3432
+ ### `g8.api.workbench.reviewWorkbenchFindPeopleCandidates(input)`
3433
+
3434
+ **Review Workbench Find People Candidates**
3435
+
3436
+ - HTTP: `GET /api/v1/workbench/tables/{table_id}/ai/groups/{group_id}/find-people/review`
3437
+ - operationId: `review_workbench_find_people_candidates_workbench_tables__table_id__ai_groups__group_id__find_people_review_get` (also callable as `g8.api.call("review_workbench_find_people_candidates_workbench_tables__table_id__ai_groups__group_id__find_people_review_get", input)`)
3438
+ - Tier: `read`: reads data; safe to call and to retry
3439
+ - API-key scope: `lists:read`
3440
+
3441
+ Contacts a find-people group turned up and is holding for review. FREE.
3442
+
3443
+ Only populated when the group's `export_mode` is `review`. Under `auto`
3444
+ there is nothing to review because the contacts were already exported.
3445
+
3446
+ **Input**
3447
+
3448
+ | Field | Type | Required | Description |
3449
+ |---|---|---|---|
3450
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
3451
+ | `path.group_id` | `string` | yes | AI group id (starts with `ai_enrich`). |
3452
+
3453
+ **Returns** `ApiResponse_EnrichmentListPayload_`: the envelope `{ data: EnrichmentListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3454
+
3455
+ Other envelope fields: `pagination` (PaginationMeta).
3456
+
3457
+ `EnrichmentListPayload` fields:
3458
+
3459
+ | Field | Type | Required | Description |
3460
+ |---|---|---|---|
3461
+ | `items` | `Array<unknown>` | no | The collection, always present. |
3462
+
3463
+ **Example**
3464
+
3465
+ ```ts
3466
+ const result = await g8.api.workbench.reviewWorkbenchFindPeopleCandidates({ path: { table_id: "id", group_id: "id" } });
3467
+ ```
3468
+
3469
+ ---
3470
+
3471
+ <a id="op-revokeworkbenchcolumnsource"></a>
3472
+
3473
+ ### `g8.api.workbench.revokeWorkbenchColumnSource(input)`
3474
+
3475
+ **Revoke Workbench Column Source**
3476
+
3477
+ - HTTP: `DELETE /api/v1/workbench/tables/{table_id}/columns/{col_id}/sources/{source_type}`
3478
+ - operationId: `revoke_workbench_column_source_workbench_tables__table_id__columns__col_id__sources__source_type__delete` (also callable as `g8.api.call("revoke_workbench_column_source_workbench_tables__table_id__columns__col_id__sources__source_type__delete", input)`)
3479
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
3480
+ - API-key scope: `lists:delete`
3481
+
3482
+ Revoke a column's ingest source. Free.
3483
+
3484
+ Anything still posting with that credential starts failing immediately.
3485
+ Rows already ingested are untouched.
3486
+
3487
+ **Input**
3488
+
3489
+ | Field | Type | Required | Description |
3490
+ |---|---|---|---|
3491
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
3492
+ | `path.col_id` | `integer` | yes | Column id. |
3493
+ | `path.source_type` | `string` | yes | Which source binding to revoke. |
3494
+
3495
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3496
+
3497
+ Other envelope fields: `pagination` (PaginationMeta).
3498
+
3499
+ **Example**
3500
+
3501
+ ```ts
3502
+ // destructive: deletes or archives data; confirm with a human before calling.
3503
+ const result = await g8.api.workbench.revokeWorkbenchColumnSource({ path: { table_id: "id", col_id: 123, source_type: "example" } });
3504
+ ```
3505
+
3506
+ ---
3507
+
3508
+ <a id="op-runworkbenchai"></a>
3509
+
3510
+ ### `g8.api.workbench.runWorkbenchAi(input)`
3511
+
3512
+ **Run Workbench Ai**
3513
+
3514
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/ai/run-all`
3515
+ - operationId: `run_workbench_ai_workbench_tables__table_id__ai_run_all_post` (also callable as `g8.api.call("run_workbench_ai_workbench_tables__table_id__ai_run_all_post", input)`)
3516
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
3517
+ - API-key scope: `lists:run`
3518
+
3519
+ Run every configured AI pass over the table. SPENDS CREDITS.
3520
+
3521
+ OMITTING `row_ids` RUNS EVERY ROW, and the body is optional - so a bare
3522
+ `POST` with no body at all is "enrich this entire table". On a 10,000-row
3523
+ table with three configured columns that is 30,000 model calls.
3524
+
3525
+ Set `approved_max_credits`. The run refuses to exceed it, and a credit
3526
+ preflight happens before any work starts, so an over-budget request costs
3527
+ nothing rather than costing until the balance runs out.
3528
+
3529
+ Returns 202 and a handle: the work happens in the background. The group's
3530
+ `skip_existing_values` and `skip_recently_enriched` settings still apply,
3531
+ so re-running is usually far cheaper than the first pass.
3532
+
3533
+ **Input**
3534
+
3535
+ | Field | Type | Required | Description |
3536
+ |---|---|---|---|
3537
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
3538
+ | `body` | `RunStagingAIRequest` | no | Request body; fields below. |
3539
+
3540
+ Body fields (`RunStagingAIRequest`):
3541
+
3542
+ | Field | Type | Required | Description |
3543
+ |---|---|---|---|
3544
+ | `body.approved_max_credits` | `integer \| null` | no | Ceiling the caller approves. The run refuses to exceed it. min 0 |
3545
+ | `body.conditions` | `Array<Record<string, string>> \| null` | no | |
3546
+ | `body.exclude_row_ids` | `Array<integer> \| null` | no | max items 100000 |
3547
+ | `body.max_rows_per_source` | `integer \| null` | no | min 1, max 50 |
3548
+ | `body.model` | `string \| null` | no | Override the configured model. |
3549
+ | `body.multi_row_output` | `boolean \| null` | no | |
3550
+ | `body.prompt` | `string \| null` | no | Override the configured prompt. |
3551
+ | `body.qualification_mode` | `boolean` | no | default `false` |
3552
+ | `body.quote_expires_at` | `string (date-time) \| null` | no | |
3553
+ | `body.quote_id` | `string (uuid) \| null` | no | |
3554
+ | `body.row_ids` | `Array<integer> \| null` | no | Rows to run. OMIT to run EVERY row in the table. |
3555
+ | `body.status_filter` | `string \| null` | no | |
3556
+
3557
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3558
+
3559
+ Other envelope fields: `pagination` (PaginationMeta).
3560
+
3561
+ **Example**
3562
+
3563
+ ```ts
3564
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
3565
+ const result = await g8.api.workbench.runWorkbenchAi({ path: { table_id: "id" } });
3566
+ ```
3567
+
3568
+ ---
3569
+
3570
+ <a id="op-runworkbenchaigroup"></a>
3571
+
3572
+ ### `g8.api.workbench.runWorkbenchAiGroup(input)`
3573
+
3574
+ **Run Workbench Ai Group**
3575
+
3576
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/ai/groups/{group_id}/run`
3577
+ - operationId: `run_workbench_ai_group_workbench_tables__table_id__ai_groups__group_id__run_post` (also callable as `g8.api.call("run_workbench_ai_group_workbench_tables__table_id__ai_groups__group_id__run_post", input)`)
3578
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
3579
+ - API-key scope: `lists:run`
3580
+
3581
+ Run one saved AI group. CHARGES per row.
3582
+
3583
+ OMITTING `row_ids` RUNS EVERY PENDING ROW. Quote it with
3584
+ `POST .../ai/validate-credits` and `group_id`.
3585
+
3586
+ **Input**
3587
+
3588
+ | Field | Type | Required | Description |
3589
+ |---|---|---|---|
3590
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
3591
+ | `path.group_id` | `string` | yes | The AI group id. |
3592
+ | `body` | `RunStagingAIRequest \| null` | no | Request body; fields below. |
3593
+
3594
+ Body fields:
3595
+
3596
+ | Field | Type | Required | Description |
3597
+ |---|---|---|---|
3598
+ | `body.approved_max_credits` | `integer \| null` | no | Ceiling the caller approves. The run refuses to exceed it. min 0 |
3599
+ | `body.conditions` | `Array<Record<string, string>> \| null` | no | |
3600
+ | `body.exclude_row_ids` | `Array<integer> \| null` | no | max items 100000 |
3601
+ | `body.max_rows_per_source` | `integer \| null` | no | min 1, max 50 |
3602
+ | `body.model` | `string \| null` | no | Override the configured model. |
3603
+ | `body.multi_row_output` | `boolean \| null` | no | |
3604
+ | `body.prompt` | `string \| null` | no | Override the configured prompt. |
3605
+ | `body.qualification_mode` | `boolean` | no | default `false` |
3606
+ | `body.quote_expires_at` | `string (date-time) \| null` | no | |
3607
+ | `body.quote_id` | `string (uuid) \| null` | no | |
3608
+ | `body.row_ids` | `Array<integer> \| null` | no | Rows to run. OMIT to run EVERY row in the table. |
3609
+ | `body.status_filter` | `string \| null` | no | |
3610
+
3611
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3612
+
3613
+ Other envelope fields: `pagination` (PaginationMeta).
3614
+
3615
+ **Example**
3616
+
3617
+ ```ts
3618
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
3619
+ const result = await g8.api.workbench.runWorkbenchAiGroup({ path: { table_id: "id", group_id: "id" } });
3620
+ ```
3621
+
3622
+ ---
3623
+
3624
+ <a id="op-runworkbenchcolumnai"></a>
3625
+
3626
+ ### `g8.api.workbench.runWorkbenchColumnAi(input)`
3627
+
3628
+ **Run Workbench Column Ai**
3629
+
3630
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/columns/{col_id}/ai/run`
3631
+ - operationId: `run_workbench_column_ai_workbench_tables__table_id__columns__col_id__ai_run_post` (also callable as `g8.api.call("run_workbench_column_ai_workbench_tables__table_id__columns__col_id__ai_run_post", input)`)
3632
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
3633
+ - API-key scope: `lists:run`
3634
+
3635
+ Run one column's AI. CHARGES per row.
3636
+
3637
+ OMITTING `row_ids` RUNS EVERY ROW. Quote it with
3638
+ `POST .../ai/validate-credits` and `column_id`.
3639
+
3640
+ **Input**
3641
+
3642
+ | Field | Type | Required | Description |
3643
+ |---|---|---|---|
3644
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
3645
+ | `path.col_id` | `integer` | yes | Column id. |
3646
+ | `body` | `RunStagingAIRequest \| null` | no | Request body; fields below. |
3647
+
3648
+ Body fields:
3649
+
3650
+ | Field | Type | Required | Description |
3651
+ |---|---|---|---|
3652
+ | `body.approved_max_credits` | `integer \| null` | no | Ceiling the caller approves. The run refuses to exceed it. min 0 |
3653
+ | `body.conditions` | `Array<Record<string, string>> \| null` | no | |
3654
+ | `body.exclude_row_ids` | `Array<integer> \| null` | no | max items 100000 |
3655
+ | `body.max_rows_per_source` | `integer \| null` | no | min 1, max 50 |
3656
+ | `body.model` | `string \| null` | no | Override the configured model. |
3657
+ | `body.multi_row_output` | `boolean \| null` | no | |
3658
+ | `body.prompt` | `string \| null` | no | Override the configured prompt. |
3659
+ | `body.qualification_mode` | `boolean` | no | default `false` |
3660
+ | `body.quote_expires_at` | `string (date-time) \| null` | no | |
3661
+ | `body.quote_id` | `string (uuid) \| null` | no | |
3662
+ | `body.row_ids` | `Array<integer> \| null` | no | Rows to run. OMIT to run EVERY row in the table. |
3663
+ | `body.status_filter` | `string \| null` | no | |
3664
+
3665
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3666
+
3667
+ Other envelope fields: `pagination` (PaginationMeta).
3668
+
3669
+ **Example**
3670
+
3671
+ ```ts
3672
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
3673
+ const result = await g8.api.workbench.runWorkbenchColumnAi({ path: { table_id: "id", col_id: 123 } });
3674
+ ```
3675
+
3676
+ ---
3677
+
3678
+ <a id="op-runworkbenchdefaultai"></a>
3679
+
3680
+ ### `g8.api.workbench.runWorkbenchDefaultAi(input)`
3681
+
3682
+ **Run Workbench Default Ai**
3683
+
3684
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/ai/run`
3685
+ - operationId: `run_workbench_default_ai_workbench_tables__table_id__ai_run_post` (also callable as `g8.api.call("run_workbench_default_ai_workbench_tables__table_id__ai_run_post", input)`)
3686
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
3687
+ - API-key scope: `lists:run`
3688
+
3689
+ Run the table's default AI pass. CHARGES per row.
3690
+
3691
+ OMITTING `row_ids` RUNS EVERY PENDING ROW. Quote it first with
3692
+ `POST .../ai/validate-credits`.
3693
+
3694
+ **Input**
3695
+
3696
+ | Field | Type | Required | Description |
3697
+ |---|---|---|---|
3698
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
3699
+ | `body` | `RunStagingAIRequest \| null` | no | Request body; fields below. |
3700
+
3701
+ Body fields:
3702
+
3703
+ | Field | Type | Required | Description |
3704
+ |---|---|---|---|
3705
+ | `body.approved_max_credits` | `integer \| null` | no | Ceiling the caller approves. The run refuses to exceed it. min 0 |
3706
+ | `body.conditions` | `Array<Record<string, string>> \| null` | no | |
3707
+ | `body.exclude_row_ids` | `Array<integer> \| null` | no | max items 100000 |
3708
+ | `body.max_rows_per_source` | `integer \| null` | no | min 1, max 50 |
3709
+ | `body.model` | `string \| null` | no | Override the configured model. |
3710
+ | `body.multi_row_output` | `boolean \| null` | no | |
3711
+ | `body.prompt` | `string \| null` | no | Override the configured prompt. |
3712
+ | `body.qualification_mode` | `boolean` | no | default `false` |
3713
+ | `body.quote_expires_at` | `string (date-time) \| null` | no | |
3714
+ | `body.quote_id` | `string (uuid) \| null` | no | |
3715
+ | `body.row_ids` | `Array<integer> \| null` | no | Rows to run. OMIT to run EVERY row in the table. |
3716
+ | `body.status_filter` | `string \| null` | no | |
3717
+
3718
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3719
+
3720
+ Other envelope fields: `pagination` (PaginationMeta).
3721
+
3722
+ **Example**
3723
+
3724
+ ```ts
3725
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
3726
+ const result = await g8.api.workbench.runWorkbenchDefaultAi({ path: { table_id: "id" } });
3727
+ ```
3728
+
3729
+ ---
3730
+
3731
+ <a id="op-runworkbenchfindpeople"></a>
3732
+
3733
+ ### `g8.api.workbench.runWorkbenchFindPeople(input)`
3734
+
3735
+ **Run Workbench Find People**
3736
+
3737
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/find-people/{config_id}/run`
3738
+ - operationId: `run_workbench_find_people_workbench_tables__table_id__find_people__config_id__run_post` (also callable as `g8.api.call("run_workbench_find_people_workbench_tables__table_id__find_people__config_id__run_post", input)`)
3739
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
3740
+ - API-key scope: `lists:run`
3741
+
3742
+ Find people at the table's companies. CHARGES per company searched.
3743
+
3744
+ `all_rows` (the default) searches EVERY company row; `first_10` is a cheap
3745
+ trial; `selected` needs `row_ids` or `exclude_row_ids`.
3746
+
3747
+ **Input**
3748
+
3749
+ | Field | Type | Required | Description |
3750
+ |---|---|---|---|
3751
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
3752
+ | `path.config_id` | `string` | yes | Find-people configuration id (UUID). |
3753
+ | `body` | `RunWorkbenchFindPeopleRequest` | yes | Request body; fields below. |
3754
+
3755
+ Body fields (`RunWorkbenchFindPeopleRequest`):
3756
+
3757
+ | Field | Type | Required | Description |
3758
+ |---|---|---|---|
3759
+ | `body.enrichment_mode` | `"first_10" \| "all_rows" \| "selected"` | no | default `"all_rows"` |
3760
+ | `body.exclude_row_ids` | `Array<integer> \| null` | no | max items 100000 |
3761
+ | `body.row_ids` | `Array<integer> \| null` | no | |
3762
+
3763
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3764
+
3765
+ Other envelope fields: `pagination` (PaginationMeta).
3766
+
3767
+ **Example**
3768
+
3769
+ ```ts
3770
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
3771
+ const result = await g8.api.workbench.runWorkbenchFindPeople({ path: { table_id: "id", config_id: "id" }, body: {} });
3772
+ ```
3773
+
3774
+ ---
3775
+
3776
+ <a id="op-runworkbenchproviderscraper"></a>
3777
+
3778
+ ### `g8.api.workbench.runWorkbenchProviderScraper(input)`
3779
+
3780
+ **Run Workbench Provider Scraper**
3781
+
3782
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/scraper/providers/{provider}/runs`
3783
+ - operationId: `run_workbench_provider_scraper_workbench_tables__table_id__scraper_providers__provider__runs_post` (also callable as `g8.api.call("run_workbench_provider_scraper_workbench_tables__table_id__scraper_providers__provider__runs_post", input)`)
3784
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
3785
+ - API-key scope: `lists:run`
3786
+
3787
+ Run a scraper on your connected provider account. CHARGES per result.
3788
+
3789
+ `auto_enrich` DEFAULTS TO TRUE: every result is also enriched and charged
3790
+ unless you turn it off. Quote it with
3791
+ `GET /workbench/scraper/providers/{provider}/credit-estimate`.
3792
+
3793
+ **Input**
3794
+
3795
+ | Field | Type | Required | Description |
3796
+ |---|---|---|---|
3797
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
3798
+ | `path.provider` | `"apify"` | yes | Which scraper provider. |
3799
+ | `body` | `RunProviderScraperRequest` | yes | Request body; fields below. |
3800
+
3801
+ Body fields (`RunProviderScraperRequest`):
3802
+
3803
+ | Field | Type | Required | Description |
3804
+ |---|---|---|---|
3805
+ | `body.approved_max_credits` | `integer \| null` | no | min 0 |
3806
+ | `body.auto_enrich` | `boolean` | no | default `true` |
3807
+ | `body.custom_actor_id` | `string \| null` | no | |
3808
+ | `body.input_config` | `Record<string, unknown>` | no | |
3809
+ | `body.max_results` | `integer` | no | default `1000`, min 1, max 50000 |
3810
+ | `body.preset_id` | `string \| null` | no | |
3811
+ | `body.quote_expires_at` | `string (date-time) \| null` | no | |
3812
+
3813
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3814
+
3815
+ Other envelope fields: `pagination` (PaginationMeta).
3816
+
3817
+ **Example**
3818
+
3819
+ ```ts
3820
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
3821
+ const result = await g8.api.workbench.runWorkbenchProviderScraper({ path: { table_id: "id", provider: "apify" }, body: {} });
3822
+ ```
3823
+
3824
+ ---
3825
+
3826
+ <a id="op-runworkbenchscraper"></a>
3827
+
3828
+ ### `g8.api.workbench.runWorkbenchScraper(input)`
3829
+
3830
+ **Run Workbench Scraper**
3831
+
3832
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/scraper/runs`
3833
+ - operationId: `run_workbench_scraper_workbench_tables__table_id__scraper_runs_post` (also callable as `g8.api.call("run_workbench_scraper_workbench_tables__table_id__scraper_runs_post", input)`)
3834
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
3835
+ - API-key scope: `lists:run`
3836
+
3837
+ Describe what to collect and the scraper fills the table. CHARGES per
3838
+ result, plus enrichment of each when `auto_enrich` is true.
3839
+
3840
+ Quote it first with `GET /workbench/scraper/credit-estimate` and pass the
3841
+ approved amount as `approved_max_credits` with `quote_expires_at`.
3842
+
3843
+ **Input**
3844
+
3845
+ | Field | Type | Required | Description |
3846
+ |---|---|---|---|
3847
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
3848
+ | `body` | `RunBuiltinScraperRequest` | yes | Request body; fields below. |
3849
+
3850
+ Body fields (`RunBuiltinScraperRequest`):
3851
+
3852
+ | Field | Type | Required | Description |
3853
+ |---|---|---|---|
3854
+ | `body.prompt` | `string` | yes | min length 10, max length 5000 |
3855
+ | `body.approved_max_credits` | `integer \| null` | no | min 0 |
3856
+ | `body.auto_enrich` | `boolean` | no | Also enrich each scraped row. Charged on top. default `false` |
3857
+ | `body.max_results` | `integer` | no | default `200`, min 10, max 2000 |
3858
+ | `body.model` | `string \| null` | no | |
3859
+ | `body.quote_expires_at` | `string (date-time) \| null` | no | |
3860
+
3861
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3862
+
3863
+ Other envelope fields: `pagination` (PaginationMeta).
3864
+
3865
+ **Example**
3866
+
3867
+ ```ts
3868
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
3869
+ const result = await g8.api.workbench.runWorkbenchScraper({ path: { table_id: "id" }, body: { prompt: "xxxxxxxxxx" } });
3870
+ ```
3871
+
3872
+ ---
3873
+
3874
+ <a id="op-runworkbenchwaterfall"></a>
3875
+
3876
+ ### `g8.api.workbench.runWorkbenchWaterfall(input)`
3877
+
3878
+ **Run Workbench Waterfall**
3879
+
3880
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/waterfall/configs/{column_id}/run`
3881
+ - operationId: `run_workbench_waterfall_workbench_tables__table_id__waterfall_configs__column_id__run_post` (also callable as `g8.api.call("run_workbench_waterfall_workbench_tables__table_id__waterfall_configs__column_id__run_post", input)`)
3882
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
3883
+ - API-key scope: `lists:run`
3884
+
3885
+ Run a waterfall column. CHARGES per provider call.
3886
+
3887
+ OMITTING `row_ids` RUNS EVERY ELIGIBLE ROW. Refused (402) without enough
3888
+ credit; quote it first with `.../validate-credits`.
3889
+
3890
+ **Input**
3891
+
3892
+ | Field | Type | Required | Description |
3893
+ |---|---|---|---|
3894
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
3895
+ | `path.column_id` | `integer` | yes | The waterfall column id. |
3896
+ | `body` | `RunStagingAIRequest \| null` | no | Request body; fields below. |
3897
+
3898
+ Body fields:
3899
+
3900
+ | Field | Type | Required | Description |
3901
+ |---|---|---|---|
3902
+ | `body.approved_max_credits` | `integer \| null` | no | Ceiling the caller approves. The run refuses to exceed it. min 0 |
3903
+ | `body.conditions` | `Array<Record<string, string>> \| null` | no | |
3904
+ | `body.exclude_row_ids` | `Array<integer> \| null` | no | max items 100000 |
3905
+ | `body.max_rows_per_source` | `integer \| null` | no | min 1, max 50 |
3906
+ | `body.model` | `string \| null` | no | Override the configured model. |
3907
+ | `body.multi_row_output` | `boolean \| null` | no | |
3908
+ | `body.prompt` | `string \| null` | no | Override the configured prompt. |
3909
+ | `body.qualification_mode` | `boolean` | no | default `false` |
3910
+ | `body.quote_expires_at` | `string (date-time) \| null` | no | |
3911
+ | `body.quote_id` | `string (uuid) \| null` | no | |
3912
+ | `body.row_ids` | `Array<integer> \| null` | no | Rows to run. OMIT to run EVERY row in the table. |
3913
+ | `body.status_filter` | `string \| null` | no | |
3914
+
3915
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3916
+
3917
+ Other envelope fields: `pagination` (PaginationMeta).
3918
+
3919
+ **Example**
3920
+
3921
+ ```ts
3922
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
3923
+ const result = await g8.api.workbench.runWorkbenchWaterfall({ path: { table_id: "id", column_id: 123 } });
3924
+ ```
3925
+
3926
+ ---
3927
+
3928
+ <a id="op-savescraperproviderconnection"></a>
3929
+
3930
+ ### `g8.api.workbench.saveScraperProviderConnection(input)`
3931
+
3932
+ **Save Scraper Provider Connection**
3933
+
3934
+ - HTTP: `PUT /api/v1/workbench/scraper/providers/{provider}/connection`
3935
+ - operationId: `save_scraper_provider_connection_workbench_scraper_providers__provider__connection_put` (also callable as `g8.api.call("save_scraper_provider_connection_workbench_scraper_providers__provider__connection_put", input)`)
3936
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
3937
+ - API-key scope: `lists:write`
3938
+
3939
+ Connect, or replace, your provider account token. Free.
3940
+
3941
+ The token is sealed at rest and never returned. Check it first with
3942
+ `POST .../connection/test`; saving does not.
3943
+
3944
+ **Input**
3945
+
3946
+ | Field | Type | Required | Description |
3947
+ |---|---|---|---|
3948
+ | `path.provider` | `"apify"` | yes | Which scraper provider. |
3949
+ | `body` | `ScraperConnectionRequest` | yes | Request body; fields below. |
3950
+
3951
+ Body fields (`ScraperConnectionRequest`):
3952
+
3953
+ | Field | Type | Required | Description |
3954
+ |---|---|---|---|
3955
+ | `body.api_key` | `string` | yes | Your provider API token. Never returned. min length 1 |
3956
+ | `body.configuration` | `Record<string, unknown>` | no | |
3957
+
3958
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3959
+
3960
+ Other envelope fields: `pagination` (PaginationMeta).
3961
+
3962
+ **Example**
3963
+
3964
+ ```ts
3965
+ const result = await g8.api.workbench.saveScraperProviderConnection({ path: { provider: "apify" }, body: { api_key: "example" } });
3966
+ ```
3967
+
3968
+ ---
3969
+
3970
+ <a id="op-saveworkbenchcolumnaiconfig"></a>
3971
+
3972
+ ### `g8.api.workbench.saveWorkbenchColumnAiConfig(input)`
3973
+
3974
+ **Save Workbench Column Ai Config**
3975
+
3976
+ - HTTP: `PUT /api/v1/workbench/tables/{table_id}/columns/{col_id}/ai-config`
3977
+ - operationId: `save_workbench_column_ai_config_workbench_tables__table_id__columns__col_id__ai_config_put` (also callable as `g8.api.call("save_workbench_column_ai_config_workbench_tables__table_id__columns__col_id__ai_config_put", input)`)
3978
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
3979
+ - API-key scope: `lists:write`
3980
+
3981
+ Set ONE column's AI pass. FREE - saving runs nothing.
3982
+
3983
+ `conditions` is the per-row gate: rows that do not match are skipped by a
3984
+ later run and cost nothing, which is the cheapest way to narrow a pass.
3985
+
3986
+ `usecase` is closed to the two the app accepts, because the value reaches a
3987
+ pattern check and a pricing table inside - an invented usecase would either
3988
+ 422 opaquely or price against the wrong tariff.
3989
+
3990
+ **Input**
3991
+
3992
+ | Field | Type | Required | Description |
3993
+ |---|---|---|---|
3994
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
3995
+ | `path.col_id` | `integer` | yes | Column id. |
3996
+ | `body` | `SaveColumnAIConfigRequest` | yes | Request body; fields below. |
3997
+
3998
+ Body fields (`SaveColumnAIConfigRequest`):
3999
+
4000
+ | Field | Type | Required | Description |
4001
+ |---|---|---|---|
4002
+ | `body.prompt` | `string` | yes | min length 1 |
4003
+ | `body.conditions` | `Record<string, unknown> \| null` | no | Only run the pass on rows matching these conditions. |
4004
+ | `body.model` | `string` | no | default `"openai/gpt-4o"` |
4005
+ | `body.usecase` | `"content_generation" \| "web-research"` | no | default `"content_generation"` |
4006
+
4007
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
4008
+
4009
+ Other envelope fields: `pagination` (PaginationMeta).
4010
+
4011
+ **Example**
4012
+
4013
+ ```ts
4014
+ const result = await g8.api.workbench.saveWorkbenchColumnAiConfig({ path: { table_id: "id", col_id: 123 }, body: { prompt: "example" } });
4015
+ ```
4016
+
4017
+ ---
4018
+
4019
+ <a id="op-saveworkbenchwaterfall"></a>
4020
+
4021
+ ### `g8.api.workbench.saveWorkbenchWaterfall(input)`
4022
+
4023
+ **Save Workbench Waterfall**
4024
+
4025
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/waterfall/configs`
4026
+ - operationId: `save_workbench_waterfall_workbench_tables__table_id__waterfall_configs_post` (also callable as `g8.api.call("save_workbench_waterfall_workbench_tables__table_id__waterfall_configs_post", input)`)
4027
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
4028
+ - API-key scope: `lists:write`
4029
+
4030
+ Create a waterfall column, or overwrite one when `config.column_id` names
4031
+ an existing column. Free: saving never runs it.
4032
+
4033
+ **Input**
4034
+
4035
+ | Field | Type | Required | Description |
4036
+ |---|---|---|---|
4037
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
4038
+ | `body` | `SaveWaterfallRequest` | yes | Request body; fields below. |
4039
+
4040
+ Body fields (`SaveWaterfallRequest`):
4041
+
4042
+ | Field | Type | Required | Description |
4043
+ |---|---|---|---|
4044
+ | `body.config` | `WaterfallConfig` | yes | |
4045
+ | `body.run_immediately` | `boolean` | no | Ignored on a workbench table. default `false` |
4046
+ | `body.target_records` | `Array<string (uuid)> \| null` | no | Ignored on a workbench table. |
4047
+
4048
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
4049
+
4050
+ Other envelope fields: `pagination` (PaginationMeta).
4051
+
4052
+ **Example**
4053
+
4054
+ ```ts
4055
+ const result = await g8.api.workbench.saveWorkbenchWaterfall({
4056
+ path: { table_id: "id" },
4057
+ body: {
4058
+ config: {
4059
+ column_id: "id",
4060
+ field_to_enrich: "example",
4061
+ name: "Example",
4062
+ steps: [
4063
+ {
4064
+ action: "example",
4065
+ action_display_name: "Example",
4066
+ id: "id",
4067
+ order: 1,
4068
+ provider: "example",
4069
+ },
4070
+ ],
4071
+ },
4072
+ },
4073
+ });
4074
+ ```
4075
+
4076
+ ---
4077
+
4078
+ <a id="op-sendworkbenchrowstosequence"></a>
4079
+
4080
+ ### `g8.api.workbench.sendWorkbenchRowsToSequence(input)`
4081
+
4082
+ **Send Workbench Rows To Sequence**
4083
+
4084
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/send-to-sequence`
4085
+ - operationId: `send_workbench_rows_to_sequence_workbench_tables__table_id__send_to_sequence_post` (also callable as `g8.api.call("send_workbench_rows_to_sequence_workbench_tables__table_id__send_to_sequence_post", input)`)
4086
+ - 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
4087
+ - API-key scope: `lists:run`
4088
+
4089
+ Enrol workbench rows into a sequence. THIS EMAILS REAL PEOPLE.
4090
+
4091
+ The rows stop being scratch data at this point: a sequence sends on its own
4092
+ schedule, to the addresses in these rows, from the organisation's mailboxes.
4093
+ There is no preview step here, and nothing to undo once a message is out.
4094
+
4095
+ OMITTING `row_ids` SENDS EVERY ROW IN THE TABLE, including rows that are
4096
+ still locked or half-enriched. Name the rows.
4097
+
4098
+ **Input**
4099
+
4100
+ | Field | Type | Required | Description |
4101
+ |---|---|---|---|
4102
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
4103
+ | `body` | `SendToSequenceRequest` | yes | Request body; fields below. |
4104
+
4105
+ Body fields (`SendToSequenceRequest`):
4106
+
4107
+ | Field | Type | Required | Description |
4108
+ |---|---|---|---|
4109
+ | `body.sequence_id` | `integer` | yes | |
4110
+ | `body.create_new_list` | `boolean` | no | default `false` |
4111
+ | `body.list_id` | `integer \| null` | no | |
4112
+ | `body.new_list_name` | `string \| null` | no | |
4113
+ | `body.row_ids` | `Array<integer> \| null` | no | Rows to send. OMIT to send EVERY row in the table. |
4114
+
4115
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
4116
+
4117
+ Other envelope fields: `pagination` (PaginationMeta).
4118
+
4119
+ **Example**
4120
+
4121
+ ```ts
4122
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
4123
+ const result = await g8.api.workbench.sendWorkbenchRowsToSequence({ path: { table_id: "id" }, body: { sequence_id: 123 } });
4124
+ ```
4125
+
4126
+ ---
4127
+
4128
+ <a id="op-setworkbenchautoenrich"></a>
4129
+
4130
+ ### `g8.api.workbench.setWorkbenchAutoEnrich(input)`
4131
+
4132
+ **Set Workbench Auto Enrich**
4133
+
4134
+ - HTTP: `PUT /api/v1/workbench/tables/{table_id}/auto-enrich`
4135
+ - operationId: `set_workbench_auto_enrich_workbench_tables__table_id__auto_enrich_put` (also callable as `g8.api.call("set_workbench_auto_enrich_workbench_tables__table_id__auto_enrich_put", input)`)
4136
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
4137
+ - API-key scope: `lists:run`
4138
+
4139
+ Enrich every row that arrives, automatically. STARTS ONGOING SPEND.
4140
+
4141
+ The PUT itself charges nothing. What it does is remove the human from the
4142
+ loop: from the moment this is on, every row that lands in the table - from
4143
+ an import, a webhook, a scraper or a routing rule - is enriched by the
4144
+ configured AI passes WITHOUT a further API call, and each one costs.
4145
+
4146
+ That is why this is graded as a spend rather than an ordinary setting. It
4147
+ is the single switch on this surface most likely to produce a bill nobody
4148
+ asked for, so `enabled` is explicit rather than a toggle: a retried request
4149
+ cannot silently turn it back on.
4150
+
4151
+ Read `GET /workbench/tables/{id}/enrichment-configs` first - that is the
4152
+ list of passes this will start running.
4153
+
4154
+ **Input**
4155
+
4156
+ | Field | Type | Required | Description |
4157
+ |---|---|---|---|
4158
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
4159
+ | `body` | `ToggleAutoEnrichRequest` | yes | Request body; fields below. |
4160
+
4161
+ Body fields (`ToggleAutoEnrichRequest`):
4162
+
4163
+ | Field | Type | Required | Description |
4164
+ |---|---|---|---|
4165
+ | `body.enabled` | `boolean` | yes | |
4166
+ | `body.batch_size` | `integer` | no | Rows per automatic batch. default `10`, min 1, max 1000 |
4167
+
4168
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
4169
+
4170
+ Other envelope fields: `pagination` (PaginationMeta).
4171
+
4172
+ **Example**
4173
+
4174
+ ```ts
4175
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
4176
+ const result = await g8.api.workbench.setWorkbenchAutoEnrich({ path: { table_id: "id" }, body: { enabled: true } });
4177
+ ```
4178
+
4179
+ ---
4180
+
4181
+ <a id="op-setworkbenchschedule"></a>
4182
+
4183
+ ### `g8.api.workbench.setWorkbenchSchedule(input)`
4184
+
4185
+ **Set Workbench Schedule**
4186
+
4187
+ - HTTP: `PUT /api/v1/workbench/tables/{table_id}/schedule`
4188
+ - operationId: `set_workbench_schedule_workbench_tables__table_id__schedule_put` (also callable as `g8.api.call("set_workbench_schedule_workbench_tables__table_id__schedule_put", input)`)
4189
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
4190
+ - API-key scope: `lists:run`
4191
+
4192
+ Run something on this table on a schedule. CAN ARM ONGOING SPEND.
4193
+
4194
+ `action_type: run_ai` means every firing runs the table's AI passes and
4195
+ charges for them - nightly, forever, with nobody in the loop. `run_formula`
4196
+ is local and free; `crm_import` reaches the customer's CRM.
4197
+
4198
+ `enabled` defaults to FALSE, so writing a schedule and starting it are two
4199
+ separate acts. That is deliberate: it lets a caller define the cadence,
4200
+ read it back, and only then turn it on.
4201
+
4202
+ **Input**
4203
+
4204
+ | Field | Type | Required | Description |
4205
+ |---|---|---|---|
4206
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
4207
+ | `body` | `ScheduleConfigRequest` | yes | Request body; fields below. |
4208
+
4209
+ Body fields (`ScheduleConfigRequest`):
4210
+
4211
+ | Field | Type | Required | Description |
4212
+ |---|---|---|---|
4213
+ | `body.action_type` | `"run_ai" \| "run_formula" \| "crm_import"` | yes | |
4214
+ | `body.action_config` | `Record<string, unknown> \| null` | no | |
4215
+ | `body.cron_expression` | `string \| null` | no | min length 5, max length 100 |
4216
+ | `body.enabled` | `boolean` | no | default `false` |
4217
+ | `body.frequency` | `"hourly" \| "daily" \| "weekly" \| null` | no | |
4218
+
4219
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
4220
+
4221
+ Other envelope fields: `pagination` (PaginationMeta).
4222
+
4223
+ **Example**
4224
+
4225
+ ```ts
4226
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
4227
+ const result = await g8.api.workbench.setWorkbenchSchedule({ path: { table_id: "id" }, body: { action_type: "run_ai" } });
4228
+ ```
4229
+
4230
+ ---
4231
+
4232
+ <a id="op-skipworkbenchfindpeoplecandidates"></a>
4233
+
4234
+ ### `g8.api.workbench.skipWorkbenchFindPeopleCandidates(input)`
4235
+
4236
+ **Skip Workbench Find People Candidates**
4237
+
4238
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/ai/groups/{group_id}/find-people/skip`
4239
+ - operationId: `skip_workbench_find_people_candidates_workbench_tables__table_id__ai_groups__group_id__find_people_skip_post` (also callable as `g8.api.call("skip_workbench_find_people_candidates_workbench_tables__table_id__ai_groups__group_id__find_people_skip_post", input)`)
4240
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
4241
+ - API-key scope: `lists:write`
4242
+
4243
+ Reject candidates from the review queue. FREE.
4244
+
4245
+ Marks them skipped so they are not exported. The search that found them has
4246
+ already been paid for; skipping does not refund it, it just stops them
4247
+ reaching a list.
4248
+
4249
+ **Input**
4250
+
4251
+ | Field | Type | Required | Description |
4252
+ |---|---|---|---|
4253
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
4254
+ | `path.group_id` | `string` | yes | AI group id (starts with `ai_enrich`). |
4255
+ | `body` | `UpdateStagingAIFindPeopleCandidatesRequest` | yes | Request body; fields below. |
4256
+
4257
+ Body fields (`UpdateStagingAIFindPeopleCandidatesRequest`):
4258
+
4259
+ | Field | Type | Required | Description |
4260
+ |---|---|---|---|
4261
+ | `body.candidate_ids` | `Array<string>` | no | min items 1 |
4262
+
4263
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
4264
+
4265
+ Other envelope fields: `pagination` (PaginationMeta).
4266
+
4267
+ **Example**
4268
+
4269
+ ```ts
4270
+ const result = await g8.api.workbench.skipWorkbenchFindPeopleCandidates({ path: { table_id: "id", group_id: "id" }, body: {} });
4271
+ ```
4272
+
4273
+ ---
4274
+
4275
+ <a id="op-suggestworkbenchmappings"></a>
4276
+
4277
+ ### `g8.api.workbench.suggestWorkbenchMappings(input)`
4278
+
4279
+ **Suggest Workbench Mappings**
4280
+
4281
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/suggest-mappings`
4282
+ - operationId: `suggest_workbench_mappings_workbench_tables__table_id__suggest_mappings_post` (also callable as `g8.api.call("suggest_workbench_mappings_workbench_tables__table_id__suggest_mappings_post", input)`)
4283
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
4284
+ - API-key scope: `lists:run`
4285
+
4286
+ Ask the model which source column maps to which target field. COSTS AN AI CALL.
4287
+
4288
+ Returns a `job_id` immediately - the model call happens in the background.
4289
+ Poll `GET /workbench/tables/{id}/suggest-mappings/{job_id}` for the answer.
4290
+
4291
+ The suggestion is advisory: nothing is mapped until you write the mapping
4292
+ yourself.
4293
+
4294
+ **Input**
4295
+
4296
+ | Field | Type | Required | Description |
4297
+ |---|---|---|---|
4298
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
4299
+ | `body` | `SuggestMappingsRequest` | yes | Request body; fields below. |
4300
+
4301
+ Body fields (`SuggestMappingsRequest`):
4302
+
4303
+ | Field | Type | Required | Description |
4304
+ |---|---|---|---|
4305
+ | `body.source_columns` | `Array<string>` | yes | min items 1, max items 100 |
4306
+ | `body.target_fields` | `Array<string>` | yes | min items 1, max items 100 |
4307
+
4308
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
4309
+
4310
+ Other envelope fields: `pagination` (PaginationMeta).
4311
+
4312
+ **Example**
4313
+
4314
+ ```ts
4315
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
4316
+ const result = await g8.api.workbench.suggestWorkbenchMappings({
4317
+ path: { table_id: "id" },
4318
+ body: { source_columns: ["example"], target_fields: ["example"] },
4319
+ });
4320
+ ```
4321
+
4322
+ ---
4323
+
4324
+ <a id="op-syncworkbenchconnection"></a>
4325
+
4326
+ ### `g8.api.workbench.syncWorkbenchConnection(input)`
4327
+
4328
+ **Sync Workbench Connection**
4329
+
4330
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/connections/{connection_id}/sync`
4331
+ - operationId: `sync_workbench_connection_workbench_tables__table_id__connections__connection_id__sync_post` (also callable as `g8.api.call("sync_workbench_connection_workbench_tables__table_id__connections__connection_id__sync_post", input)`)
4332
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
4333
+ - API-key scope: `lists:write`
4334
+
4335
+ Copy rows across a connection now. Free; stays inside your organisation.
4336
+
4337
+ **Input**
4338
+
4339
+ | Field | Type | Required | Description |
4340
+ |---|---|---|---|
4341
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
4342
+ | `path.connection_id` | `integer` | yes | Connection id. |
4343
+
4344
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
4345
+
4346
+ Other envelope fields: `pagination` (PaginationMeta).
4347
+
4348
+ **Example**
4349
+
4350
+ ```ts
4351
+ const result = await g8.api.workbench.syncWorkbenchConnection({ path: { table_id: "id", connection_id: 123 } });
4352
+ ```
4353
+
4354
+ ---
4355
+
4356
+ <a id="op-testscraperproviderconnection"></a>
4357
+
4358
+ ### `g8.api.workbench.testScraperProviderConnection(input)`
4359
+
4360
+ **Test Scraper Provider Connection**
4361
+
4362
+ - HTTP: `POST /api/v1/workbench/scraper/providers/{provider}/connection/test`
4363
+ - operationId: `test_scraper_provider_connection_workbench_scraper_providers__provider__connection_test_post` (also callable as `g8.api.call("test_scraper_provider_connection_workbench_scraper_providers__provider__connection_test_post", input)`)
4364
+ - 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
4365
+ - API-key scope: `lists:run`
4366
+
4367
+ Check a token against the provider without saving it. Contacts the
4368
+ provider; free. Answers `success: false` with a reason rather than an error.
4369
+
4370
+ **Input**
4371
+
4372
+ | Field | Type | Required | Description |
4373
+ |---|---|---|---|
4374
+ | `path.provider` | `"apify"` | yes | Which scraper provider. |
4375
+ | `body` | `ScraperConnectionTestRequest` | yes | Request body; fields below. |
4376
+
4377
+ Body fields (`ScraperConnectionTestRequest`):
4378
+
4379
+ | Field | Type | Required | Description |
4380
+ |---|---|---|---|
4381
+ | `body.api_key` | `string` | yes | min length 1 |
4382
+
4383
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
4384
+
4385
+ Other envelope fields: `pagination` (PaginationMeta).
4386
+
4387
+ **Example**
4388
+
4389
+ ```ts
4390
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
4391
+ const result = await g8.api.workbench.testScraperProviderConnection({ path: { provider: "apify" }, body: { api_key: "example" } });
4392
+ ```
4393
+
4394
+ ---
4395
+
4396
+ <a id="op-unlockworkbenchrows"></a>
4397
+
4398
+ ### `g8.api.workbench.unlockWorkbenchRows(input)`
4399
+
4400
+ **Unlock Workbench Rows**
4401
+
4402
+ - HTTP: `POST /api/v1/workbench/tables/{table_id}/unlock-rows`
4403
+ - operationId: `unlock_workbench_rows_workbench_tables__table_id__unlock_rows_post` (also callable as `g8.api.call("unlock_workbench_rows_workbench_tables__table_id__unlock_rows_post", input)`)
4404
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
4405
+ - API-key scope: `lists:run`
4406
+
4407
+ Reveal masked contact details. SPENDS ONE CREDIT PER ROW.
4408
+
4409
+ This is the most expensive operation on the Workbench and the one a script
4410
+ is most likely to run by accident, because OMITTING `row_ids` UNLOCKS EVERY
4411
+ LOCKED ROW IN THE TABLE. A 10,000-row table costs 10,000 credits.
4412
+
4413
+ `operation_id` is REQUIRED and comes from `unlock-quote`. It is what binds
4414
+ the charge to a price the caller was shown, and it makes a retried unlock
4415
+ idempotent rather than charging twice for the same rows. Without it the
4416
+ request is refused.
4417
+
4418
+ Set `approved_max_credits` as well: the run refuses to exceed it, which is
4419
+ the difference between a bug costing you one request and costing you a
4420
+ balance.
4421
+
4422
+ **Input**
4423
+
4424
+ | Field | Type | Required | Description |
4425
+ |---|---|---|---|
4426
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
4427
+ | `body` | `UnlockStagingRowsRequest` | yes | Request body; fields below. |
4428
+
4429
+ Body fields (`UnlockStagingRowsRequest`):
4430
+
4431
+ | Field | Type | Required | Description |
4432
+ |---|---|---|---|
4433
+ | `body.approved_max_credits` | `integer \| null` | no | Ceiling the caller approves. The run refuses to exceed it. min 0 |
4434
+ | `body.exclude_row_ids` | `Array<integer> \| null` | no | Rows to leave locked. max items 100000 |
4435
+ | `body.operation_id` | `string (uuid) \| null` | no | The quote's operation id. REQUIRED by the unlock - it is what ties the charge to a price the caller was shown, and it makes a retried unlock idempotent instead of charging twice. |
4436
+ | `body.quote_expires_at` | `string (date-time) \| null` | no | Expiry of the quote being approved. |
4437
+ | `body.row_ids` | `Array<integer> \| null` | no | Rows to act on. OMIT to mean EVERY locked row in the table. max items 100000 |
4438
+
4439
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
4440
+
4441
+ Other envelope fields: `pagination` (PaginationMeta).
4442
+
4443
+ **Example**
4444
+
4445
+ ```ts
4446
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
4447
+ const result = await g8.api.workbench.unlockWorkbenchRows({ path: { table_id: "id" }, body: {} });
4448
+ ```
4449
+
4450
+ ---
4451
+
4452
+ <a id="op-updateworkbenchaigroup"></a>
4453
+
4454
+ ### `g8.api.workbench.updateWorkbenchAiGroup(input)`
4455
+
4456
+ **Update Workbench Ai Group**
4457
+
4458
+ - HTTP: `PUT /api/v1/workbench/tables/{table_id}/ai/groups/{group_id}`
4459
+ - operationId: `update_workbench_ai_group_workbench_tables__table_id__ai_groups__group_id__put` (also callable as `g8.api.call("update_workbench_ai_group_workbench_tables__table_id__ai_groups__group_id__put", input)`)
4460
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
4461
+ - API-key scope: `lists:write`
4462
+
4463
+ Replace a group's definition. FREE - editing runs nothing.
4464
+
4465
+ A full replacement, not a patch: `config` is written as given, so read the
4466
+ group first and send it back changed rather than sending only the field you
4467
+ meant to move.
4468
+
4469
+ **Input**
4470
+
4471
+ | Field | Type | Required | Description |
4472
+ |---|---|---|---|
4473
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
4474
+ | `path.group_id` | `string` | yes | AI group id (starts with `ai_enrich`). |
4475
+ | `body` | `UpdateAIConfigRequest` | yes | Request body; fields below. |
4476
+
4477
+ Body fields (`UpdateAIConfigRequest`):
4478
+
4479
+ | Field | Type | Required | Description |
4480
+ |---|---|---|---|
4481
+ | `body.config` | `AIEnrichmentConfigDto` | yes | |
4482
+
4483
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
4484
+
4485
+ Other envelope fields: `pagination` (PaginationMeta).
4486
+
4487
+ **Example**
4488
+
4489
+ ```ts
4490
+ const result = await g8.api.workbench.updateWorkbenchAiGroup({
4491
+ path: { table_id: "id", group_id: "id" },
4492
+ body: {
4493
+ config: {
4494
+ config: {},
4495
+ input_mapping: ["example"],
4496
+ model: "example",
4497
+ outputs: [{ name: "Example", type: "example" }],
4498
+ prompt: "example",
4499
+ usecase: "example",
4500
+ },
4501
+ },
4502
+ });
4503
+ ```
4504
+
4505
+ ---
4506
+
4507
+ <a id="op-updateworkbenchpipeline"></a>
4508
+
4509
+ ### `g8.api.workbench.updateWorkbenchPipeline(input)`
4510
+
4511
+ **Update Workbench Pipeline**
4512
+
4513
+ - HTTP: `PUT /api/v1/workbench/tables/{table_id}/pipelines/{pipeline_id}`
4514
+ - operationId: `update_workbench_pipeline_workbench_tables__table_id__pipelines__pipeline_id__put` (also callable as `g8.api.call("update_workbench_pipeline_workbench_tables__table_id__pipelines__pipeline_id__put", input)`)
4515
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
4516
+ - API-key scope: `lists:run`
4517
+
4518
+ Edit a pipeline; omitted fields are left alone. CAN ARM SPEND when
4519
+ `enabled` is true.
4520
+
4521
+ **Input**
4522
+
4523
+ | Field | Type | Required | Description |
4524
+ |---|---|---|---|
4525
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
4526
+ | `path.pipeline_id` | `string` | yes | Pipeline id (UUID). |
4527
+ | `body` | `UpdateWorkbenchPipelineRequest` | yes | Request body; fields below. |
4528
+
4529
+ Body fields (`UpdateWorkbenchPipelineRequest`):
4530
+
4531
+ | Field | Type | Required | Description |
4532
+ |---|---|---|---|
4533
+ | `body.enabled` | `boolean \| null` | no | |
4534
+ | `body.name` | `string \| null` | no | |
4535
+ | `body.start` | `PipelineStartConfig \| null` | no | |
4536
+ | `body.steps` | `Array<WorkbenchPipelineStep> \| null` | no | |
4537
+
4538
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
4539
+
4540
+ Other envelope fields: `pagination` (PaginationMeta).
4541
+
4542
+ **Example**
4543
+
4544
+ ```ts
4545
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
4546
+ const result = await g8.api.workbench.updateWorkbenchPipeline({ path: { table_id: "id", pipeline_id: "id" }, body: {} });
4547
+ ```
4548
+
4549
+ ---
4550
+
4551
+ <a id="op-updateworkbenchrow"></a>
4552
+
4553
+ ### `g8.api.workbench.updateWorkbenchRow(input)`
4554
+
4555
+ **Update Workbench Row**
4556
+
4557
+ - HTTP: `PATCH /api/v1/workbench/tables/{table_id}/rows/{row_id}`
4558
+ - operationId: `update_workbench_row_workbench_tables__table_id__rows__row_id__patch` (also callable as `g8.api.call("update_workbench_row_workbench_tables__table_id__rows__row_id__patch", input)`)
4559
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
4560
+ - API-key scope: `lists:write`
4561
+
4562
+ Set ONE field on one row - the grid's cell edit.
4563
+
4564
+ One field per call, matching the app. A whole-row PUT would make a
4565
+ concurrent edit to a different cell silently lose.
4566
+
4567
+ **Input**
4568
+
4569
+ | Field | Type | Required | Description |
4570
+ |---|---|---|---|
4571
+ | `path.table_id` | `string` | yes | Table id (UUID). |
4572
+ | `path.row_id` | `integer` | yes | Row id. |
4573
+ | `body` | `WorkbenchRowUpdateRequest` | yes | Request body; fields below. |
4574
+
4575
+ Body fields (`WorkbenchRowUpdateRequest`):
4576
+
4577
+ | Field | Type | Required | Description |
4578
+ |---|---|---|---|
4579
+ | `body.field` | `string` | yes | min length 1, max length 255 |
4580
+ | `body.value` | `unknown` | yes | |
4581
+
4582
+ **Returns** `ApiResponse_dict_`: the envelope `{ data: Record<string, unknown>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
4583
+
4584
+ Other envelope fields: `pagination` (PaginationMeta).
4585
+
4586
+ **Example**
4587
+
4588
+ ```ts
4589
+ const result = await g8.api.workbench.updateWorkbenchRow({
4590
+ path: { table_id: "id", row_id: 123 },
4591
+ body: { field: "example", value: {} },
4592
+ });
4593
+ ```
4594
+
4595
+ ---
4596
+
4597
+ <a id="op-updateworkbenchtable"></a>
4598
+
4599
+ ### `g8.api.workbench.updateWorkbenchTable(input)`
4600
+
4601
+ **Update Workbench Table**
4602
+
4603
+ - HTTP: `PUT /api/v1/workbench/tables/{table_id}`
4604
+ - operationId: `update_workbench_table_workbench_tables__table_id__put` (also callable as `g8.api.call("update_workbench_table_workbench_tables__table_id__put", input)`)
4605
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
4606
+ - API-key scope: `lists:write`
4607
+
4608
+ Rename or re-describe. `entity_type` is fixed at creation.
4609
+
4610
+ **Input**
4611
+
4612
+ | Field | Type | Required | Description |
4613
+ |---|---|---|---|
4614
+ | `path.table_id` | `string` | yes | Table id (UUID). |
4615
+ | `body` | `WorkbenchTableUpdateRequest` | yes | Request body; fields below. |
4616
+
4617
+ Body fields (`WorkbenchTableUpdateRequest`):
4618
+
4619
+ | Field | Type | Required | Description |
4620
+ |---|---|---|---|
4621
+ | `body.description` | `string \| null` | no | |
4622
+ | `body.name` | `string \| null` | no | |
4623
+
4624
+ **Returns** `ApiResponse_dict_`: the envelope `{ data: Record<string, unknown>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
4625
+
4626
+ Other envelope fields: `pagination` (PaginationMeta).
4627
+
4628
+ **Example**
4629
+
4630
+ ```ts
4631
+ const result = await g8.api.workbench.updateWorkbenchTable({ path: { table_id: "id" }, body: {} });
4632
+ ```
4633
+
4634
+ ---
4635
+
4636
+ <a id="op-updateworkbenchtrigger"></a>
4637
+
4638
+ ### `g8.api.workbench.updateWorkbenchTrigger(input)`
4639
+
4640
+ **Update Workbench Trigger**
4641
+
4642
+ - HTTP: `PUT /api/v1/workbench/tables/{table_id}/triggers/{trigger_id}`
4643
+ - operationId: `update_workbench_trigger_workbench_tables__table_id__triggers__trigger_id__put` (also callable as `g8.api.call("update_workbench_trigger_workbench_tables__table_id__triggers__trigger_id__put", input)`)
4644
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
4645
+ - API-key scope: `lists:run`
4646
+
4647
+ Edit an automation trigger. CAN ARM ONGOING SPEND.
4648
+
4649
+ A PATCH in spirit: omitted fields are left alone. `enabled` true on a
4650
+ trigger whose action is an AI pass means each matching row is enriched -
4651
+ and charged - as it arrives.
4652
+
4653
+ **Input**
4654
+
4655
+ | Field | Type | Required | Description |
4656
+ |---|---|---|---|
4657
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
4658
+ | `path.trigger_id` | `integer` | yes | Trigger id. |
4659
+ | `body` | `UpdateTriggerRequest` | yes | Request body; fields below. |
4660
+
4661
+ Body fields (`UpdateTriggerRequest`):
4662
+
4663
+ | Field | Type | Required | Description |
4664
+ |---|---|---|---|
4665
+ | `body.action_config` | `Record<string, unknown> \| null` | no | |
4666
+ | `body.conditions` | `Record<string, unknown> \| null` | no | |
4667
+ | `body.enabled` | `boolean \| null` | no | |
4668
+ | `body.name` | `string \| null` | no | |
4669
+
4670
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
4671
+
4672
+ Other envelope fields: `pagination` (PaginationMeta).
4673
+
4674
+ **Example**
4675
+
4676
+ ```ts
4677
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
4678
+ const result = await g8.api.workbench.updateWorkbenchTrigger({ path: { table_id: "id", trigger_id: 123 }, body: {} });
4679
+ ```
4680
+
4681
+ ---
4682
+
4683
+ <a id="op-updateworkbenchwaterfall"></a>
4684
+
4685
+ ### `g8.api.workbench.updateWorkbenchWaterfall(input)`
4686
+
4687
+ **Update Workbench Waterfall**
4688
+
4689
+ - HTTP: `PUT /api/v1/workbench/tables/{table_id}/waterfall/configs/{column_id}`
4690
+ - operationId: `update_workbench_waterfall_workbench_tables__table_id__waterfall_configs__column_id__put` (also callable as `g8.api.call("update_workbench_waterfall_workbench_tables__table_id__waterfall_configs__column_id__put", input)`)
4691
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
4692
+ - API-key scope: `lists:write`
4693
+
4694
+ Replace a waterfall column's steps and settings. Free: editing runs nothing.
4695
+
4696
+ **Input**
4697
+
4698
+ | Field | Type | Required | Description |
4699
+ |---|---|---|---|
4700
+ | `path.table_id` | `string` | yes | Workbench table id (UUID). |
4701
+ | `path.column_id` | `integer` | yes | The waterfall column id. |
4702
+ | `body` | `UpdateWaterfallConfigRequest` | yes | Request body; fields below. |
4703
+
4704
+ Body fields (`UpdateWaterfallConfigRequest`):
4705
+
4706
+ | Field | Type | Required | Description |
4707
+ |---|---|---|---|
4708
+ | `body.config` | `WaterfallConfig` | yes | |
4709
+
4710
+ **Returns** `ApiResponse_EnrichmentPayload_`: the envelope `{ data: EnrichmentPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
4711
+
4712
+ Other envelope fields: `pagination` (PaginationMeta).
4713
+
4714
+ **Example**
4715
+
4716
+ ```ts
4717
+ const result = await g8.api.workbench.updateWorkbenchWaterfall({
4718
+ path: { table_id: "id", column_id: 123 },
4719
+ body: {
4720
+ config: {
4721
+ column_id: "id",
4722
+ field_to_enrich: "example",
4723
+ name: "Example",
4724
+ steps: [
4725
+ {
4726
+ action: "example",
4727
+ action_display_name: "Example",
4728
+ id: "id",
4729
+ order: 1,
4730
+ provider: "example",
4731
+ },
4732
+ ],
4733
+ },
4734
+ },
4735
+ });
4736
+ ```
4737
+
4738
+ ---
4739
+
4740
+ ## Referenced types
4741
+
4742
+ Named types that appear in the tables above. Full TypeScript definitions: `G8Contract.<Name>` (`import type { G8Contract } from "@graph8/sdk"`).
4743
+
4744
+ <a id="type-aienrichmentconfigdto"></a>
4745
+
4746
+ ### `AIEnrichmentConfigDto`
4747
+
4748
+ A full AI enrichment group definition.
4749
+
4750
+ | Field | Type | Required | Description |
4751
+ |---|---|---|---|
4752
+ | `config` | `AIConfigDto` | yes | |
4753
+ | `input_mapping` | `Array<string>` | yes | min items 1, max items 100 |
4754
+ | `model` | `string` | yes | |
4755
+ | `outputs` | `Array<AIOutputFieldDto>` | yes | min items 1, max items 50 |
4756
+ | `prompt` | `string` | yes | min length 1, max length 20000 |
4757
+ | `usecase` | `string` | yes | |
4758
+ | `column_mappings` | `Array<AIColumnMappingDto>` | no | |
4759
+ | `created_at` | `string \| null` | no | |
4760
+ | `created_by` | `string \| null` | no | |
4761
+ | `description` | `string \| null` | no | |
4762
+ | `group_id` | `string \| null` | no | |
4763
+ | `id` | `string (uuid) \| null` | no | |
4764
+ | `is_global` | `boolean` | no | default `true` |
4765
+ | `json_schema` | `Record<string, "string" \| "number" \| "boolean"> \| null` | no | |
4766
+ | `list_id` | `integer \| null` | no | |
4767
+ | `name` | `string \| null` | no | |
4768
+ | `org_id` | `string \| null` | no | |
4769
+ | `output_format` | `string` | no | default `"fields"` |
4770
+ | `updated_at` | `string \| null` | no | |
4771
+
4772
+ <a id="type-findpeoplesearchfilter"></a>
4773
+
4774
+ ### `FindPeopleSearchFilter`
4775
+
4776
+ One condition narrowing the people search.
4777
+
4778
+ | Field | Type | Required | Description |
4779
+ |---|---|---|---|
4780
+ | `field` | `string` | yes | min length 1, max length 255 |
4781
+ | `operator` | `"any_of" \| "any_of_with_simular" \| "any_off" \| "any_off_with_simular" \| "all_of" \| "none_of" \| "empty" \| "not_empty" \| …` | yes | |
4782
+ | `value` | `Array<string>` | no | |
4783
+
4784
+ <a id="type-formulaoutputcolumndef"></a>
4785
+
4786
+ ### `FormulaOutputColumnDef`
4787
+
4788
+ One output of a multi-output formula.
4789
+
4790
+ | Field | Type | Required | Description |
4791
+ |---|---|---|---|
4792
+ | `display_name` | `string` | yes | min length 1, max length 255 |
4793
+ | `name` | `string` | yes | min length 1, max length 255, pattern `^[a-z][a-z0-9_]*$` |
4794
+
4795
+ <a id="type-outputcolumndef"></a>
4796
+
4797
+ ### `OutputColumnDef`
4798
+
4799
+ One column an AI pass writes into.
4800
+
4801
+ | Field | Type | Required | Description |
4802
+ |---|---|---|---|
4803
+ | `name` | `string` | yes | min length 1, max length 255 |
4804
+ | `display_name` | `string \| null` | no | |
4805
+ | `mapping_target` | `string \| null` | no | |
4806
+ | `type` | `string` | no | default `"text"` |
4807
+
4808
+ <a id="type-pipelinestartconfig"></a>
4809
+
4810
+ ### `PipelineStartConfig`
4811
+
4812
+ What starts the pipeline.
4813
+
4814
+ | Field | Type | Required | Description |
4815
+ |---|---|---|---|
4816
+ | `type` | `"email_pdf" \| "webhook" \| "scraper_bot" \| "ingest"` | yes | |
4817
+ | `expected_fields` | `Array<PipelineExpectedField>` | no | |
4818
+ | `source_types` | `Array<string>` | no | |
4819
+
4820
+ <a id="type-waterfallconfig"></a>
4821
+
4822
+ ### `WaterfallConfig`
4823
+
4824
+ A complete waterfall definition. `org_id` and `created_by` are accepted for shape parity with the app and IGNORED: the organisation always comes from the API key.
4825
+
4826
+ | Field | Type | Required | Description |
4827
+ |---|---|---|---|
4828
+ | `column_id` | `string` | yes | |
4829
+ | `field_to_enrich` | `string` | yes | |
4830
+ | `name` | `string` | yes | |
4831
+ | `steps` | `Array<WaterfallStep>` | yes | |
4832
+ | `auto_update` | `boolean` | no | default `true` |
4833
+ | `created_by` | `string \| null` | no | Ignored. |
4834
+ | `data_type` | `string` | no | default `"text"` |
4835
+ | `email_verification` | `EmailVerificationConfig \| null` | no | |
4836
+ | `hide_provider_columns` | `boolean` | no | default `true` |
4837
+ | `id` | `string (uuid) \| null` | no | |
4838
+ | `is_existing_column` | `boolean` | no | default `false` |
4839
+ | `is_global` | `boolean` | no | default `true` |
4840
+ | `list_id` | `integer \| null` | no | |
4841
+ | `list_routing` | `WaterfallListRouting \| null` | no | |
4842
+ | `only_run_if` | `string \| null` | no | Run condition formula. |
4843
+ | `org_id` | `string \| null` | no | Ignored: the key's organisation is used. |
4844
+ | `output_successful_provider` | `boolean` | no | default `false` |
4845
+ | `skip_existing_values` | `boolean` | no | default `true` |
4846
+ | `skip_recently_enriched` | `boolean` | no | default `true` |
4847
+ | `target_column_name` | `string \| null` | no | |
4848
+ | `validate_emails` | `boolean` | no | Deprecated: use `email_verification`. default `false` |
4849
+
4850
+ <a id="type-workbenchbindingitem"></a>
4851
+
4852
+ ### `WorkbenchBindingItem`
4853
+
4854
+ One workflow output rendered as one grid column.
4855
+
4856
+ | Field | Type | Required | Description |
4857
+ |---|---|---|---|
4858
+ | `column_name` | `string` | yes | Display name of the column. |
4859
+ | `column_type` | `"computed" \| "ai" \| "enrichment" \| "state" \| "action" \| "review"` | yes | How the grid treats the column. |
4860
+ | `node_id` | `string` | yes | The workflow node whose output feeds the column. |
4861
+ | `output_path` | `string` | yes | Dot path into that node's output. |
4862
+ | `config` | `Record<string, unknown> \| null` | no | Column-type settings. |
4863
+ | `display_mode` | `string` | no | How the cell renders. default `"text"` |
4864
+ | `sort_order` | `integer` | no | Position among the bound columns. default `0` |
4865
+
4866
+ <a id="type-workbenchpipelinestep"></a>
4867
+
4868
+ ### `WorkbenchPipelineStep`
4869
+
4870
+ One step. A `branch` step runs `if_steps` or `else_steps`.
4871
+
4872
+ | Field | Type | Required | Description |
4873
+ |---|---|---|---|
4874
+ | `id` | `string` | yes | min length 1, max length 255 |
4875
+ | `name` | `string` | yes | min length 1, max length 255 |
4876
+ | `type` | `"ai_group" \| "waterfall" \| "formula" \| "branch" \| "export_to_list"` | yes | |
4877
+ | `column_id` | `integer \| null` | no | |
4878
+ | `conditions` | `Array<Record<string, unknown>> \| null` | no | |
4879
+ | `else_steps` | `Array<WorkbenchPipelineBranchStep>` | no | |
4880
+ | `enabled` | `boolean` | no | default `true` |
4881
+ | `group_id` | `string \| null` | no | |
4882
+ | `if_steps` | `Array<WorkbenchPipelineBranchStep>` | no | |
4883
+ | `inline_config` | `Record<string, unknown> \| null` | no | |
4884
+ | `template` | `string \| null` | no | |