@graph8/sdk 0.245.0 → 0.260.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. package/README.md +19 -5
  2. package/dist/cli.js +216 -0
  3. package/dist/index.d.mts +283 -12
  4. package/dist/index.d.ts +283 -12
  5. package/dist/index.js +88 -2
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.mjs +88 -2
  8. package/dist/index.mjs.map +1 -1
  9. package/dist/react.d.mts +274 -12
  10. package/dist/react.d.ts +274 -12
  11. package/dist/react.js +106 -10
  12. package/dist/react.js.map +1 -1
  13. package/dist/react.mjs +97 -11
  14. package/dist/react.mjs.map +1 -1
  15. package/dist/types/README.md +7 -0
  16. package/dist/types/agency.d.ts +20 -0
  17. package/dist/types/agentSetup.d.ts +57 -0
  18. package/dist/types/api.d.ts +127 -0
  19. package/dist/types/appClient.d.ts +99 -0
  20. package/dist/types/appPlatform.d.ts +269 -0
  21. package/dist/types/appTokens.d.ts +125 -0
  22. package/dist/types/apps.d.ts +130 -0
  23. package/dist/types/audiences.d.ts +88 -0
  24. package/dist/types/calendar.d.ts +55 -0
  25. package/dist/types/campaigns.d.ts +61 -0
  26. package/dist/types/chat.d.ts +35 -0
  27. package/dist/types/cli.d.ts +14 -0
  28. package/dist/types/companies.d.ts +123 -0
  29. package/dist/types/contacts.d.ts +200 -0
  30. package/dist/types/copilot.d.ts +31 -0
  31. package/dist/types/core.d.ts +1052 -0
  32. package/dist/types/deals.d.ts +215 -0
  33. package/dist/types/enrich.d.ts +51 -0
  34. package/dist/types/fields.d.ts +84 -0
  35. package/dist/types/forms.d.ts +16 -0
  36. package/dist/types/http.d.ts +141 -0
  37. package/dist/types/inbox.d.ts +123 -0
  38. package/dist/types/index.d.ts +63 -0
  39. package/dist/types/intent.d.ts +196 -0
  40. package/dist/types/lists.d.ts +44 -0
  41. package/dist/types/mailboxes.d.ts +240 -0
  42. package/dist/types/marketplace.d.ts +62 -0
  43. package/dist/types/meetings.d.ts +70 -0
  44. package/dist/types/newsletter.d.ts +212 -0
  45. package/dist/types/notes.d.ts +57 -0
  46. package/dist/types/objects.d.ts +281 -0
  47. package/dist/types/pipelines.d.ts +135 -0
  48. package/dist/types/quotes.d.ts +143 -0
  49. package/dist/types/react.d.ts +978 -0
  50. package/dist/types/search.d.ts +99 -0
  51. package/dist/types/sequences.d.ts +255 -0
  52. package/dist/types/signals.d.ts +28 -0
  53. package/dist/types/skills.d.ts +176 -0
  54. package/dist/types/snippet.d.ts +24 -0
  55. package/dist/types/studio.d.ts +161 -0
  56. package/dist/types/tasks.d.ts +101 -0
  57. package/dist/types/types.d.ts +45 -0
  58. package/dist/types/utils.d.ts +21 -0
  59. package/dist/types/version.d.ts +10 -0
  60. package/dist/types/visitors.d.ts +29 -0
  61. package/dist/types/voice.d.ts +304 -0
  62. package/dist/types/webhooks.d.ts +71 -0
  63. package/dist/types/workflows.d.ts +229 -0
  64. package/docs/agents.md +748 -0
  65. package/docs/api/README.md +165 -0
  66. package/docs/api/accounts.d.ts +396 -0
  67. package/docs/api/accounts.md +644 -0
  68. package/docs/api/adCampaigns.d.ts +707 -0
  69. package/docs/api/adCampaigns.md +1091 -0
  70. package/docs/api/adCreatives.d.ts +996 -0
  71. package/docs/api/adCreatives.md +1708 -0
  72. package/docs/api/agency.d.ts +556 -0
  73. package/docs/api/agency.md +845 -0
  74. package/docs/api/agent.d.ts +330 -0
  75. package/docs/api/agent.md +514 -0
  76. package/docs/api/agents.d.ts +1622 -0
  77. package/docs/api/agents.md +2860 -0
  78. package/docs/api/aiInbox.d.ts +1984 -0
  79. package/docs/api/aiInbox.md +3490 -0
  80. package/docs/api/analytics.d.ts +1273 -0
  81. package/docs/api/analytics.md +2095 -0
  82. package/docs/api/apiKeys.d.ts +252 -0
  83. package/docs/api/apiKeys.md +318 -0
  84. package/docs/api/appDeployments.d.ts +236 -0
  85. package/docs/api/appDeployments.md +471 -0
  86. package/docs/api/appDomains.d.ts +171 -0
  87. package/docs/api/appDomains.md +281 -0
  88. package/docs/api/appLogs.d.ts +120 -0
  89. package/docs/api/appLogs.md +159 -0
  90. package/docs/api/appObjects.d.ts +415 -0
  91. package/docs/api/appObjects.md +568 -0
  92. package/docs/api/appPages.d.ts +557 -0
  93. package/docs/api/appPages.md +796 -0
  94. package/docs/api/appPlatformTokens.d.ts +123 -0
  95. package/docs/api/appPlatformTokens.md +172 -0
  96. package/docs/api/appointments.d.ts +2361 -0
  97. package/docs/api/appointments.md +3917 -0
  98. package/docs/api/apps.d.ts +822 -0
  99. package/docs/api/apps.md +1342 -0
  100. package/docs/api/assertUpsert.d.ts +286 -0
  101. package/docs/api/assertUpsert.md +370 -0
  102. package/docs/api/audienceSyncs.d.ts +259 -0
  103. package/docs/api/audienceSyncs.md +395 -0
  104. package/docs/api/brandKit.d.ts +686 -0
  105. package/docs/api/brandKit.md +1133 -0
  106. package/docs/api/bugReports.d.ts +181 -0
  107. package/docs/api/bugReports.md +268 -0
  108. package/docs/api/by-path.md +3260 -0
  109. package/docs/api/calendarInvites.d.ts +117 -0
  110. package/docs/api/calendarInvites.md +148 -0
  111. package/docs/api/campaignWorkflows.d.ts +152 -0
  112. package/docs/api/campaignWorkflows.md +200 -0
  113. package/docs/api/campaigns.d.ts +721 -0
  114. package/docs/api/campaigns.md +1236 -0
  115. package/docs/api/channels.d.ts +171 -0
  116. package/docs/api/channels.md +235 -0
  117. package/docs/api/cliCampaigns.d.ts +205 -0
  118. package/docs/api/cliCampaigns.md +256 -0
  119. package/docs/api/cliPipelines.d.ts +324 -0
  120. package/docs/api/cliPipelines.md +562 -0
  121. package/docs/api/clickHouse.d.ts +115 -0
  122. package/docs/api/clickHouse.md +138 -0
  123. package/docs/api/companies.d.ts +1636 -0
  124. package/docs/api/companies.md +2211 -0
  125. package/docs/api/companyIntelligence.d.ts +299 -0
  126. package/docs/api/companyIntelligence.md +488 -0
  127. package/docs/api/contacts.d.ts +2173 -0
  128. package/docs/api/contacts.md +3143 -0
  129. package/docs/api/content.d.ts +968 -0
  130. package/docs/api/content.md +1667 -0
  131. package/docs/api/contentGridSkills.d.ts +177 -0
  132. package/docs/api/contentGridSkills.md +271 -0
  133. package/docs/api/copilot.d.ts +1017 -0
  134. package/docs/api/copilot.md +1765 -0
  135. package/docs/api/crmSyncs.d.ts +215 -0
  136. package/docs/api/crmSyncs.md +301 -0
  137. package/docs/api/customerSuccess.d.ts +491 -0
  138. package/docs/api/customerSuccess.md +776 -0
  139. package/docs/api/deals.d.ts +1696 -0
  140. package/docs/api/deals.md +2432 -0
  141. package/docs/api/deliverability.d.ts +418 -0
  142. package/docs/api/deliverability.md +677 -0
  143. package/docs/api/desk.d.ts +1765 -0
  144. package/docs/api/desk.md +3007 -0
  145. package/docs/api/dialer.d.ts +1185 -0
  146. package/docs/api/dialer.md +2166 -0
  147. package/docs/api/dialerAnalytics.d.ts +187 -0
  148. package/docs/api/dialerAnalytics.md +257 -0
  149. package/docs/api/documents.d.ts +895 -0
  150. package/docs/api/documents.md +1440 -0
  151. package/docs/api/duplicates.d.ts +195 -0
  152. package/docs/api/duplicates.md +315 -0
  153. package/docs/api/eSign.d.ts +38 -0
  154. package/docs/api/eSign.md +54 -0
  155. package/docs/api/eSignature.d.ts +242 -0
  156. package/docs/api/eSignature.md +341 -0
  157. package/docs/api/enrichment.d.ts +3207 -0
  158. package/docs/api/enrichment.md +5225 -0
  159. package/docs/api/events.d.ts +115 -0
  160. package/docs/api/events.md +105 -0
  161. package/docs/api/fields.d.ts +482 -0
  162. package/docs/api/fields.md +566 -0
  163. package/docs/api/forms.d.ts +1012 -0
  164. package/docs/api/forms.md +1542 -0
  165. package/docs/api/gtmCampaigns.d.ts +662 -0
  166. package/docs/api/gtmCampaigns.md +1044 -0
  167. package/docs/api/gtmContext.d.ts +1187 -0
  168. package/docs/api/gtmContext.md +2112 -0
  169. package/docs/api/gtmDeliverability.d.ts +60 -0
  170. package/docs/api/gtmDeliverability.md +63 -0
  171. package/docs/api/gtmKnowledgeBase.d.ts +76 -0
  172. package/docs/api/gtmKnowledgeBase.md +91 -0
  173. package/docs/api/gtmLaunchHelpers.d.ts +123 -0
  174. package/docs/api/gtmLaunchHelpers.md +148 -0
  175. package/docs/api/gtmLibrary.d.ts +448 -0
  176. package/docs/api/gtmLibrary.md +780 -0
  177. package/docs/api/health.d.ts +39 -0
  178. package/docs/api/health.md +58 -0
  179. package/docs/api/imageLibrary.d.ts +341 -0
  180. package/docs/api/imageLibrary.md +569 -0
  181. package/docs/api/imports.d.ts +157 -0
  182. package/docs/api/imports.md +174 -0
  183. package/docs/api/inbox.d.ts +709 -0
  184. package/docs/api/inbox.md +1067 -0
  185. package/docs/api/install.d.ts +213 -0
  186. package/docs/api/install.md +317 -0
  187. package/docs/api/installedApps.d.ts +131 -0
  188. package/docs/api/installedApps.md +241 -0
  189. package/docs/api/integrationStatus.d.ts +142 -0
  190. package/docs/api/integrationStatus.md +205 -0
  191. package/docs/api/integrations.d.ts +2327 -0
  192. package/docs/api/integrations.md +3791 -0
  193. package/docs/api/intent.d.ts +482 -0
  194. package/docs/api/intent.md +858 -0
  195. package/docs/api/knowledge.d.ts +501 -0
  196. package/docs/api/knowledge.md +843 -0
  197. package/docs/api/knowledgeBase.d.ts +84 -0
  198. package/docs/api/knowledgeBase.md +96 -0
  199. package/docs/api/landingPages.d.ts +1411 -0
  200. package/docs/api/landingPages.md +2488 -0
  201. package/docs/api/leads.d.ts +133 -0
  202. package/docs/api/leads.md +180 -0
  203. package/docs/api/library.d.ts +217 -0
  204. package/docs/api/library.md +338 -0
  205. package/docs/api/linkedIn.d.ts +227 -0
  206. package/docs/api/linkedIn.md +289 -0
  207. package/docs/api/linkedInOutreach.d.ts +727 -0
  208. package/docs/api/linkedInOutreach.md +990 -0
  209. package/docs/api/lists.d.ts +1106 -0
  210. package/docs/api/lists.md +1609 -0
  211. package/docs/api/logs.d.ts +71 -0
  212. package/docs/api/logs.md +70 -0
  213. package/docs/api/mailboxes.d.ts +1050 -0
  214. package/docs/api/mailboxes.md +1690 -0
  215. package/docs/api/marketingIntelligence.d.ts +256 -0
  216. package/docs/api/marketingIntelligence.md +454 -0
  217. package/docs/api/marketplace.d.ts +3173 -0
  218. package/docs/api/marketplace.md +5953 -0
  219. package/docs/api/mcp.d.ts +69 -0
  220. package/docs/api/mcp.md +69 -0
  221. package/docs/api/me.d.ts +54 -0
  222. package/docs/api/me.md +56 -0
  223. package/docs/api/meetings.d.ts +539 -0
  224. package/docs/api/meetings.md +747 -0
  225. package/docs/api/newsletter.d.ts +1613 -0
  226. package/docs/api/newsletter.md +2746 -0
  227. package/docs/api/notes.d.ts +517 -0
  228. package/docs/api/notes.md +888 -0
  229. package/docs/api/notifications.d.ts +94 -0
  230. package/docs/api/notifications.md +105 -0
  231. package/docs/api/objects.d.ts +621 -0
  232. package/docs/api/objects.md +1098 -0
  233. package/docs/api/openSearch.d.ts +234 -0
  234. package/docs/api/openSearch.md +297 -0
  235. package/docs/api/ops.d.ts +299 -0
  236. package/docs/api/ops.md +339 -0
  237. package/docs/api/orgGovernance.d.ts +393 -0
  238. package/docs/api/orgGovernance.md +623 -0
  239. package/docs/api/orgVideos.d.ts +184 -0
  240. package/docs/api/orgVideos.md +252 -0
  241. package/docs/api/organizationSettings.d.ts +626 -0
  242. package/docs/api/organizationSettings.md +911 -0
  243. package/docs/api/phoneNumbers.d.ts +484 -0
  244. package/docs/api/phoneNumbers.md +777 -0
  245. package/docs/api/profile.d.ts +329 -0
  246. package/docs/api/profile.md +540 -0
  247. package/docs/api/programmaticPages.d.ts +400 -0
  248. package/docs/api/programmaticPages.md +626 -0
  249. package/docs/api/providerDomains.d.ts +866 -0
  250. package/docs/api/providerDomains.md +1446 -0
  251. package/docs/api/providerUsage.d.ts +129 -0
  252. package/docs/api/providerUsage.md +186 -0
  253. package/docs/api/public.d.ts +69 -0
  254. package/docs/api/public.md +78 -0
  255. package/docs/api/publicCopilot.d.ts +67 -0
  256. package/docs/api/publicCopilot.md +80 -0
  257. package/docs/api/publicSignals.d.ts +66 -0
  258. package/docs/api/publicSignals.md +71 -0
  259. package/docs/api/publicVisitors.d.ts +97 -0
  260. package/docs/api/publicVisitors.md +118 -0
  261. package/docs/api/quotes.d.ts +1564 -0
  262. package/docs/api/quotes.md +2553 -0
  263. package/docs/api/radar.d.ts +808 -0
  264. package/docs/api/radar.md +1431 -0
  265. package/docs/api/radarReports.d.ts +208 -0
  266. package/docs/api/radarReports.md +306 -0
  267. package/docs/api/recordRoles.d.ts +143 -0
  268. package/docs/api/recordRoles.md +175 -0
  269. package/docs/api/repos.d.ts +146 -0
  270. package/docs/api/repos.md +211 -0
  271. package/docs/api/research.d.ts +295 -0
  272. package/docs/api/research.md +534 -0
  273. package/docs/api/revenue.d.ts +402 -0
  274. package/docs/api/revenue.md +608 -0
  275. package/docs/api/revenueAnalytics.d.ts +147 -0
  276. package/docs/api/revenueAnalytics.md +212 -0
  277. package/docs/api/revenueLifecycle.d.ts +207 -0
  278. package/docs/api/revenueLifecycle.md +274 -0
  279. package/docs/api/revenueRecords.d.ts +372 -0
  280. package/docs/api/revenueRecords.md +563 -0
  281. package/docs/api/roles.d.ts +431 -0
  282. package/docs/api/roles.md +812 -0
  283. package/docs/api/salesCoach.d.ts +877 -0
  284. package/docs/api/salesCoach.md +1540 -0
  285. package/docs/api/sandbox.d.ts +210 -0
  286. package/docs/api/sandbox.md +380 -0
  287. package/docs/api/scans.d.ts +104 -0
  288. package/docs/api/scans.md +136 -0
  289. package/docs/api/scheduleBuy.d.ts +293 -0
  290. package/docs/api/scheduleBuy.md +431 -0
  291. package/docs/api/scraping.d.ts +266 -0
  292. package/docs/api/scraping.md +383 -0
  293. package/docs/api/sdrAnalytics.d.ts +138 -0
  294. package/docs/api/sdrAnalytics.md +246 -0
  295. package/docs/api/search.d.ts +598 -0
  296. package/docs/api/search.md +866 -0
  297. package/docs/api/seo.d.ts +447 -0
  298. package/docs/api/seo.md +660 -0
  299. package/docs/api/sequenceLifecycle.d.ts +439 -0
  300. package/docs/api/sequenceLifecycle.md +513 -0
  301. package/docs/api/sequences.d.ts +1936 -0
  302. package/docs/api/sequences.md +3232 -0
  303. package/docs/api/settings.d.ts +448 -0
  304. package/docs/api/settings.md +731 -0
  305. package/docs/api/signals.d.ts +1441 -0
  306. package/docs/api/signals.md +2526 -0
  307. package/docs/api/signatures.d.ts +719 -0
  308. package/docs/api/signatures.md +1247 -0
  309. package/docs/api/skills.d.ts +230 -0
  310. package/docs/api/skills.md +466 -0
  311. package/docs/api/snippet.d.ts +85 -0
  312. package/docs/api/snippet.md +106 -0
  313. package/docs/api/socialPublishing.d.ts +824 -0
  314. package/docs/api/socialPublishing.md +1245 -0
  315. package/docs/api/studioDocuments.d.ts +244 -0
  316. package/docs/api/studioDocuments.md +348 -0
  317. package/docs/api/support.d.ts +90 -0
  318. package/docs/api/support.md +76 -0
  319. package/docs/api/suppressions.d.ts +241 -0
  320. package/docs/api/suppressions.md +343 -0
  321. package/docs/api/surveys.d.ts +847 -0
  322. package/docs/api/surveys.md +1223 -0
  323. package/docs/api/tasks.d.ts +813 -0
  324. package/docs/api/tasks.md +1344 -0
  325. package/docs/api/teamMembers.d.ts +668 -0
  326. package/docs/api/teamMembers.md +1040 -0
  327. package/docs/api/teams.d.ts +784 -0
  328. package/docs/api/teams.md +1395 -0
  329. package/docs/api/usage.d.ts +277 -0
  330. package/docs/api/usage.md +389 -0
  331. package/docs/api/visitors.d.ts +690 -0
  332. package/docs/api/visitors.md +1075 -0
  333. package/docs/api/voice.d.ts +4661 -0
  334. package/docs/api/voice.md +7905 -0
  335. package/docs/api/webAnalytics.d.ts +964 -0
  336. package/docs/api/webAnalytics.md +1452 -0
  337. package/docs/api/webChat.d.ts +1704 -0
  338. package/docs/api/webChat.md +2048 -0
  339. package/docs/api/webhooks.d.ts +251 -0
  340. package/docs/api/webhooks.md +386 -0
  341. package/docs/api/websiteEditor.d.ts +324 -0
  342. package/docs/api/websiteEditor.md +517 -0
  343. package/docs/api/work.d.ts +2298 -0
  344. package/docs/api/work.md +3096 -0
  345. package/docs/api/workbench.d.ts +2962 -0
  346. package/docs/api/workbench.md +4884 -0
  347. package/docs/api/workflows.d.ts +1218 -0
  348. package/docs/api/workflows.md +2302 -0
  349. package/docs/sdk-clients.md +4339 -0
  350. package/package.json +10 -3
package/dist/react.mjs CHANGED
@@ -1,7 +1,8 @@
1
1
  "use client";
2
2
 
3
3
  // src/react.tsx
4
- import { createContext, useContext, useEffect } from "react";
4
+ import * as React from "react";
5
+ import { createContext, useContext } from "react";
5
6
 
6
7
  // src/core.ts
7
8
  import { jitsuAnalytics } from "@jitsu/js";
@@ -435,6 +436,7 @@ var BILLABLE_ROUTES = {
435
436
  "/enrichment/lists/{list_id}/pipelines/{pipeline_id}/runs",
436
437
  "/enrichment/lookup/company",
437
438
  "/enrichment/lookup/person",
439
+ "/enrichment/person",
438
440
  "/enrichment/record-sync/{entity_type}/run",
439
441
  "/enrichment/verify-email",
440
442
  "/enrichment/waterfall/configs",
@@ -943,6 +945,10 @@ var EXTERNAL_ROUTES = {
943
945
  ]
944
946
  };
945
947
 
948
+ // src/version.ts
949
+ var SDK_VERSION = "0.260.0";
950
+ var SDK_CLIENT_ID = `js-sdk/${SDK_VERSION}`;
951
+
946
952
  // src/http.ts
947
953
  var G8Error = class _G8Error extends Error {
948
954
  constructor(args) {
@@ -1125,6 +1131,7 @@ async function request(baseUrl, path, apiKey, opts = {}) {
1125
1131
  const finalHeaders = {
1126
1132
  "Content-Type": "application/json",
1127
1133
  Authorization: `Bearer ${apiKey}`,
1134
+ ...clientIdentityHeaders(headers),
1128
1135
  ...headers
1129
1136
  };
1130
1137
  warnIfTargetOrgIgnored(apiKey, headers);
@@ -1170,6 +1177,23 @@ async function request(baseUrl, path, apiKey, opts = {}) {
1170
1177
  throw await toG8Error(resp, billable ? statusRetryable : isRetryableStatus(resp.status));
1171
1178
  }
1172
1179
  }
1180
+ function isServerRuntime() {
1181
+ const g = globalThis;
1182
+ if (typeof g.window !== "undefined") return false;
1183
+ return typeof g.process?.versions?.node === "string";
1184
+ }
1185
+ function runtimeUserAgent() {
1186
+ const g = globalThis;
1187
+ const node = typeof g.process?.version === "string" ? ` node/${g.process.version.replace(/^v/, "")}` : "";
1188
+ return `graph8-sdk-js/${SDK_VERSION}${node}`;
1189
+ }
1190
+ function clientIdentityHeaders(callerHeaders = {}) {
1191
+ const taken = new Set(Object.keys(callerHeaders).map((h) => h.toLowerCase()));
1192
+ const out = {};
1193
+ if (!taken.has("x-g8-client")) out["X-G8-Client"] = SDK_CLIENT_ID;
1194
+ if (!taken.has("user-agent") && isServerRuntime()) out["User-Agent"] = runtimeUserAgent();
1195
+ return out;
1196
+ }
1173
1197
  async function* paginate(fetchPage) {
1174
1198
  let cursor = void 0;
1175
1199
  for (; ; ) {
@@ -1779,8 +1803,21 @@ var createWebhooksClient = (_apiKey, apiUrl) => {
1779
1803
 
1780
1804
  // src/contacts.ts
1781
1805
  var DEFAULT_API12 = "https://be.graph8.com";
1806
+ var CONTACT_BULK_GET_MAX = 100;
1782
1807
  var createContactsClient = (apiKey, apiUrl) => {
1783
1808
  const baseUrl = apiUrl || DEFAULT_API12;
1809
+ async function getMany(contactIds, options = {}) {
1810
+ const ids = [...new Set(contactIds)];
1811
+ const out = [];
1812
+ for (let i = 0; i < ids.length; i += CONTACT_BULK_GET_MAX) {
1813
+ const resp = await request(baseUrl, "/api/v1/contacts/bulk-get", apiKey, {
1814
+ method: "POST",
1815
+ body: { contact_ids: ids.slice(i, i + CONTACT_BULK_GET_MAX), include_custom_fields: options.includeCustomFields ?? false }
1816
+ });
1817
+ out.push(...resp.data.items);
1818
+ }
1819
+ return out;
1820
+ }
1784
1821
  return {
1785
1822
  /** List contacts with optional filters. */
1786
1823
  async list(params = {}) {
@@ -1788,6 +1825,31 @@ var createContactsClient = (apiKey, apiUrl) => {
1788
1825
  query: params
1789
1826
  });
1790
1827
  },
1828
+ /**
1829
+ * Full records for many contacts (`POST /api/v1/contacts/bulk-get`), in input
1830
+ * order. Any number of ids: they are sent 100 per request, so 1,000 ids cost
1831
+ * 10 requests instead of 1,000 `get()` calls. Missing or out-of-scope ids come
1832
+ * back `found: false` rather than throwing. Duplicate ids are read once.
1833
+ */
1834
+ getMany: (contactIds, options = {}) => getMany(contactIds, options),
1835
+ /**
1836
+ * One page of `list()`, with every contact's FULL record (`created_at`,
1837
+ * `updated_at`, `full_name`, `personal_emails`, `company`, ...). `list()`
1838
+ * returns a leaner shape. Costs one `list()` request plus one `getMany()`
1839
+ * request per 100 contacts on the page. `missing` holds ids that were listed
1840
+ * but could not be read (for example deleted in between).
1841
+ */
1842
+ async listDetailed(params = {}, options = {}) {
1843
+ const page = await request(baseUrl, "/api/v1/contacts", apiKey, {
1844
+ query: params
1845
+ });
1846
+ const items = await getMany(page.data.map((c) => c.id), options);
1847
+ return {
1848
+ data: items.filter((it) => it.found && it.contact).map((it) => it.contact),
1849
+ total: page.total,
1850
+ missing: items.filter((it) => !it.found).map((it) => it.contact_id)
1851
+ };
1852
+ },
1791
1853
  /** Get a single contact by ID. */
1792
1854
  async get(contactId) {
1793
1855
  const resp = await request(baseUrl, `/api/v1/contacts/${contactId}`, apiKey);
@@ -1796,6 +1858,10 @@ var createContactsClient = (apiKey, apiUrl) => {
1796
1858
  /**
1797
1859
  * Create a new contact. Pass `idempotencyKey` to make a retry safe — the
1798
1860
  * same key returns the first result instead of creating a duplicate (A6).
1861
+ *
1862
+ * Create-only: if a contact with the same work_email / linkedin_url exists,
1863
+ * this throws a 409 `G8Error` whose `detail.hint` / `detail.upsert` name the
1864
+ * create-or-update route. When the contact may already exist, use `upsert()`.
1799
1865
  */
1800
1866
  async create(contact, idempotencyKey) {
1801
1867
  const resp = await request(baseUrl, "/api/v1/contacts", apiKey, {
@@ -1805,6 +1871,20 @@ var createContactsClient = (apiKey, apiUrl) => {
1805
1871
  });
1806
1872
  return resp.data ?? resp;
1807
1873
  },
1874
+ /**
1875
+ * Create or update a contact in one idempotent call (`PUT /contacts/assert`).
1876
+ * Matches by `work_email`, then `linkedin_url`. Prefer this over `create()`
1877
+ * when the contact may already exist: `create()` returns a 409 for a
1878
+ * duplicate, while `upsert()` updates it. Safe to retry. The server answers
1879
+ * 400 (a `G8Error`) when neither `work_email` nor `linkedin_url` is given.
1880
+ */
1881
+ async upsert(contact) {
1882
+ const resp = await request(baseUrl, "/api/v1/contacts/assert", apiKey, {
1883
+ method: "PUT",
1884
+ body: contact
1885
+ });
1886
+ return resp.data ?? resp;
1887
+ },
1808
1888
  /** Update a contact (partial). */
1809
1889
  async update(contactId, fields) {
1810
1890
  return request(baseUrl, `/api/v1/contacts/${contactId}`, apiKey, {
@@ -2118,6 +2198,7 @@ var API_OPERATIONS = {
2118
2198
  analyze_website_intelligence_analyze_post: ["POST", "/intelligence/analyze", "companyIntelligence", "analyzeWebsite", "billable", "knowledge:run"],
2119
2199
  annotate_my_invoice_marketplace_me_invoices__invoice_id__put: ["PUT", "/marketplace/me/invoices/{invoice_id}", "marketplace", "annotateMyInvoice", "billable", "marketplace:run"],
2120
2200
  answer_agent_discovery_agent_onboarding_discovery_answer_post: ["POST", "/agent/onboarding/discovery/answer", "agents", "answerAgentDiscovery", "write", "workflows:write"],
2201
+ api_health_health_get: ["GET", "/health", "health", "apiHealth", "read", null],
2121
2202
  app_token_jwks_app_platform__well_known_jwks_json_get: ["GET", "/app-platform/.well-known/jwks.json", "appPlatformTokens", "appTokenJwks", "read", null],
2122
2203
  append_copilot_memory_document_copilot_memory_documents_append_post: ["POST", "/copilot/memory/documents/append", "copilot", "appendCopilotMemoryDocument", "write", "knowledge:write"],
2123
2204
  apply_account_plan_desk_accounts__account_id__plan_apply_post: ["POST", "/desk/accounts/{account_id}/plan/apply", "desk", "applyAccountPlan", "write", "deals:write"],
@@ -2198,6 +2279,7 @@ var API_OPERATIONS = {
2198
2279
  backfill_content_pages_content_pages_backfill_post: ["POST", "/content/pages/backfill", "content", "backfillContentPages", "write", "campaigns:write"],
2199
2280
  backfill_grading_dialer_parallel_calls_grading_backfill_post: ["POST", "/dialer/parallel-calls/grading/backfill", "dialer", "backfillGrading", "billable", "voice:run"],
2200
2281
  backfill_library_case_studies_library_case_studies_backfill_post: ["POST", "/library/case-studies/backfill", "library", "backfillLibraryCaseStudies", "billable", "knowledge:run"],
2282
+ batch_contact_related_contacts_related_post: ["POST", "/contacts/related", "contacts", "batchContactRelated", "read", "contacts:read"],
2201
2283
  batch_create_crm_contacts_integrations_crm_connections__connection_id__batch_contacts_post: ["POST", "/integrations/crm/connections/{connection_id}/batch/contacts", "integrations", "batchCreateCrmContacts", "external", "integrations:run"],
2202
2284
  batch_email_agent_voice_email_agent_batch_post: ["POST", "/voice/email-agent/batch", "voice", "batchEmailAgent", "billable", "voice:run"],
2203
2285
  batch_quote_action_quotes_batch_post: ["POST", "/quotes/batch", "quotes", "batchQuoteAction", "external", "quotes:run"],
@@ -2218,6 +2300,7 @@ var API_OPERATIONS = {
2218
2300
  bulk_enrich_company_people_companies_enrich_people_bulk_post: ["POST", "/companies/enrich/people/bulk", "companies", "bulkEnrichCompanyPeople", "billable", "enrichment:run"],
2219
2301
  bulk_enrich_company_stakeholders_companies_enrich_stakeholders_bulk_post: ["POST", "/companies/enrich/stakeholders/bulk", "companies", "bulkEnrichCompanyStakeholders", "billable", "enrichment:run"],
2220
2302
  bulk_extract_workbench_columns_workbench_tables__table_id__columns_bulk_extract_post: ["POST", "/workbench/tables/{table_id}/columns/bulk-extract", "workbench", "bulkExtractWorkbenchColumns", "write", "lists:write"],
2303
+ bulk_get_contacts_contacts_bulk_get_post: ["POST", "/contacts/bulk-get", "contacts", "bulkGetContacts", "read", "contacts:read"],
2221
2304
  bulk_import_mailboxes_mailboxes_bulk_import_post: ["POST", "/mailboxes/bulk-import", "mailboxes", "bulkImportMailboxes", "write", "campaigns:write"],
2222
2305
  bulk_restart_executions_workflows_executions_bulk_restart_post: ["POST", "/workflows/executions/bulk-restart", "workflows", "bulkRestartExecutions", "external", "workflows:run"],
2223
2306
  bulk_update_contacts_contacts_bulk_update_post: ["POST", "/contacts/bulk-update", "contacts", "bulkUpdateContacts", "write", "contacts:write"],
@@ -4272,6 +4355,7 @@ var API_OPERATIONS = {
4272
4355
  load_copilot_intent_context_copilot_context_load_post: ["POST", "/copilot/context/load", "agents", "loadCopilotIntentContext", "write", "workflows:write"],
4273
4356
  lookup_company_enrichment_lookup_company_post: ["POST", "/enrichment/lookup/company", "enrichment", "lookupCompany", "billable", "enrichment:run"],
4274
4357
  lookup_crm_contacts_by_email_integrations_crm_connections__connection_id__batch_contacts_lookup_by_email_post: ["POST", "/integrations/crm/connections/{connection_id}/batch/contacts/lookup-by-email", "integrations", "lookupCrmContactsByEmail", "read", "integrations:read"],
4358
+ lookup_person_alias_enrichment_person_post: ["POST", "/enrichment/person", "enrichment", "lookupPersonAlias", "billable", "enrichment:run"],
4275
4359
  lookup_person_enrichment_lookup_person_post: ["POST", "/enrichment/lookup/person", "enrichment", "lookupPerson", "billable", "enrichment:run"],
4276
4360
  lookup_session_calls_dialer_parallel_calls_sessions__session_id__calls_post: ["POST", "/dialer/parallel-calls/sessions/{session_id}/calls", "voice", "lookupSessionCalls", "read", "voice:read"],
4277
4361
  manual_dial_dialer_parallel_calls_manual_dial_post: ["POST", "/dialer/parallel-calls/manual-dial", "dialer", "manualDial", "external", "voice:run"],
@@ -5117,6 +5201,7 @@ var API_OPERATIONS = {
5117
5201
  update_inbox_mailbox_settings_inbox_mailboxes__mailbox__settings_patch: ["PATCH", "/inbox/mailboxes/{mailbox}/settings", "aiInbox", "updateInboxMailboxSettings", "external", "inbox:run"],
5118
5202
  update_inbox_tag_inbox_tags__tag_id__put: ["PUT", "/inbox/tags/{tag_id}", "aiInbox", "updateInboxTag", "write", "inbox:write"],
5119
5203
  update_infrastructure_profile_org_infrastructure_put: ["PUT", "/org/infrastructure", "orgGovernance", "updateInfrastructureProfile", "write", "account:write"],
5204
+ update_ip_allowlist_api_keys__api_key_id__ip_allowlist_put: ["PUT", "/api-keys/{api_key_id}/ip-allowlist", "apiKeys", "updateIpAllowlist", "write", "account:write"],
5120
5205
  update_issue_newsletters__newsletter_id__issues__issue_id__put: ["PUT", "/newsletters/{newsletter_id}/issues/{issue_id}", "newsletter", "updateIssue", "external", "newsletter:run"],
5121
5206
  update_landing_page_html_landing_pages__landing_page_id__update_html_post: ["POST", "/landing-pages/{landing_page_id}/update-html", "landingPages", "updateLandingPageHtml", "write", "campaigns:write"],
5122
5207
  update_landing_page_landing_pages__landing_page_id__patch: ["PATCH", "/landing-pages/{landing_page_id}", "landingPages", "updateLandingPage", "write", "campaigns:write"],
@@ -7349,10 +7434,11 @@ var G8 = class {
7349
7434
  if (!this.config.apiKey) throw new Error(`g8.${module} requires an API key. Use g8.init({ apiKey: '...' })`);
7350
7435
  }
7351
7436
  };
7352
- var g8 = new G8();
7437
+ var G8_SINGLETON = /* @__PURE__ */ Symbol.for("@graph8/sdk/singleton");
7438
+ var _global = globalThis;
7439
+ var g8 = _global[G8_SINGLETON] ?? (_global[G8_SINGLETON] = new G8());
7353
7440
 
7354
7441
  // src/react.tsx
7355
- import { jsx } from "react/jsx-runtime";
7356
7442
  var G8Context = createContext(g8);
7357
7443
  var G8Provider = ({
7358
7444
  writeKey,
@@ -7360,12 +7446,10 @@ var G8Provider = ({
7360
7446
  config,
7361
7447
  children
7362
7448
  }) => {
7363
- useEffect(() => {
7364
- if (!g8.initialized) {
7365
- g8.init({ writeKey, host, ...config });
7366
- }
7367
- }, [writeKey, host, config]);
7368
- return /* @__PURE__ */ jsx(G8Context.Provider, { value: g8, children });
7449
+ if (!g8.initialized) {
7450
+ g8.init({ writeKey, host, ...config });
7451
+ }
7452
+ return /* @__PURE__ */ React.createElement(G8Context.Provider, { value: g8 }, children);
7369
7453
  };
7370
7454
  var useG8 = () => {
7371
7455
  const client = useContext(G8Context);
@@ -7378,8 +7462,10 @@ var useG8 = () => {
7378
7462
  page: client.page.bind(client),
7379
7463
  /** Clear user identity */
7380
7464
  reset: client.reset.bind(client),
7381
- /** Progressive form helpers */
7382
- forms: client.forms,
7465
+ /** Progressive form helpers (read lazily, so useG8() never throws on its own) */
7466
+ get forms() {
7467
+ return client.forms;
7468
+ },
7383
7469
  /** Raw g8 client instance */
7384
7470
  g8: client
7385
7471
  };