@graph8/sdk 0.251.0 → 0.260.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. package/README.md +9 -2
  2. package/dist/cli.js +216 -0
  3. package/dist/index.d.mts +104 -7
  4. package/dist/index.d.ts +104 -7
  5. package/dist/index.js +44 -3
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.mjs +44 -3
  8. package/dist/index.mjs.map +1 -1
  9. package/dist/react.d.mts +102 -7
  10. package/dist/react.d.ts +102 -7
  11. package/dist/react.js +62 -11
  12. package/dist/react.js.map +1 -1
  13. package/dist/react.mjs +53 -12
  14. package/dist/react.mjs.map +1 -1
  15. package/dist/types/README.md +7 -0
  16. package/dist/types/agency.d.ts +20 -0
  17. package/dist/types/agentSetup.d.ts +57 -0
  18. package/dist/types/api.d.ts +127 -0
  19. package/dist/types/appClient.d.ts +99 -0
  20. package/dist/types/appPlatform.d.ts +269 -0
  21. package/dist/types/appTokens.d.ts +125 -0
  22. package/dist/types/apps.d.ts +130 -0
  23. package/dist/types/audiences.d.ts +88 -0
  24. package/dist/types/calendar.d.ts +55 -0
  25. package/dist/types/campaigns.d.ts +61 -0
  26. package/dist/types/chat.d.ts +35 -0
  27. package/dist/types/cli.d.ts +14 -0
  28. package/dist/types/companies.d.ts +123 -0
  29. package/dist/types/contacts.d.ts +200 -0
  30. package/dist/types/copilot.d.ts +31 -0
  31. package/dist/types/core.d.ts +1052 -0
  32. package/dist/types/deals.d.ts +215 -0
  33. package/dist/types/enrich.d.ts +51 -0
  34. package/dist/types/fields.d.ts +84 -0
  35. package/dist/types/forms.d.ts +16 -0
  36. package/dist/types/http.d.ts +141 -0
  37. package/dist/types/inbox.d.ts +123 -0
  38. package/dist/types/index.d.ts +63 -0
  39. package/dist/types/intent.d.ts +196 -0
  40. package/dist/types/lists.d.ts +44 -0
  41. package/dist/types/mailboxes.d.ts +240 -0
  42. package/dist/types/marketplace.d.ts +62 -0
  43. package/dist/types/meetings.d.ts +70 -0
  44. package/dist/types/newsletter.d.ts +212 -0
  45. package/dist/types/notes.d.ts +57 -0
  46. package/dist/types/objects.d.ts +281 -0
  47. package/dist/types/pipelines.d.ts +135 -0
  48. package/dist/types/quotes.d.ts +143 -0
  49. package/dist/types/react.d.ts +978 -0
  50. package/dist/types/search.d.ts +99 -0
  51. package/dist/types/sequences.d.ts +255 -0
  52. package/dist/types/signals.d.ts +28 -0
  53. package/dist/types/skills.d.ts +176 -0
  54. package/dist/types/snippet.d.ts +24 -0
  55. package/dist/types/studio.d.ts +161 -0
  56. package/dist/types/tasks.d.ts +101 -0
  57. package/dist/types/types.d.ts +45 -0
  58. package/dist/types/utils.d.ts +21 -0
  59. package/dist/types/version.d.ts +10 -0
  60. package/dist/types/visitors.d.ts +29 -0
  61. package/dist/types/voice.d.ts +304 -0
  62. package/dist/types/webhooks.d.ts +71 -0
  63. package/dist/types/workflows.d.ts +229 -0
  64. package/docs/agents.md +748 -0
  65. package/docs/api/README.md +165 -0
  66. package/docs/api/accounts.d.ts +396 -0
  67. package/docs/api/accounts.md +644 -0
  68. package/docs/api/adCampaigns.d.ts +707 -0
  69. package/docs/api/adCampaigns.md +1091 -0
  70. package/docs/api/adCreatives.d.ts +996 -0
  71. package/docs/api/adCreatives.md +1708 -0
  72. package/docs/api/agency.d.ts +556 -0
  73. package/docs/api/agency.md +845 -0
  74. package/docs/api/agent.d.ts +330 -0
  75. package/docs/api/agent.md +514 -0
  76. package/docs/api/agents.d.ts +1622 -0
  77. package/docs/api/agents.md +2860 -0
  78. package/docs/api/aiInbox.d.ts +1984 -0
  79. package/docs/api/aiInbox.md +3490 -0
  80. package/docs/api/analytics.d.ts +1273 -0
  81. package/docs/api/analytics.md +2095 -0
  82. package/docs/api/apiKeys.d.ts +252 -0
  83. package/docs/api/apiKeys.md +318 -0
  84. package/docs/api/appDeployments.d.ts +236 -0
  85. package/docs/api/appDeployments.md +471 -0
  86. package/docs/api/appDomains.d.ts +171 -0
  87. package/docs/api/appDomains.md +281 -0
  88. package/docs/api/appLogs.d.ts +120 -0
  89. package/docs/api/appLogs.md +159 -0
  90. package/docs/api/appObjects.d.ts +415 -0
  91. package/docs/api/appObjects.md +568 -0
  92. package/docs/api/appPages.d.ts +557 -0
  93. package/docs/api/appPages.md +796 -0
  94. package/docs/api/appPlatformTokens.d.ts +123 -0
  95. package/docs/api/appPlatformTokens.md +172 -0
  96. package/docs/api/appointments.d.ts +2361 -0
  97. package/docs/api/appointments.md +3917 -0
  98. package/docs/api/apps.d.ts +822 -0
  99. package/docs/api/apps.md +1342 -0
  100. package/docs/api/assertUpsert.d.ts +286 -0
  101. package/docs/api/assertUpsert.md +370 -0
  102. package/docs/api/audienceSyncs.d.ts +259 -0
  103. package/docs/api/audienceSyncs.md +395 -0
  104. package/docs/api/brandKit.d.ts +686 -0
  105. package/docs/api/brandKit.md +1133 -0
  106. package/docs/api/bugReports.d.ts +181 -0
  107. package/docs/api/bugReports.md +268 -0
  108. package/docs/api/by-path.md +3260 -0
  109. package/docs/api/calendarInvites.d.ts +117 -0
  110. package/docs/api/calendarInvites.md +148 -0
  111. package/docs/api/campaignWorkflows.d.ts +152 -0
  112. package/docs/api/campaignWorkflows.md +200 -0
  113. package/docs/api/campaigns.d.ts +721 -0
  114. package/docs/api/campaigns.md +1236 -0
  115. package/docs/api/channels.d.ts +171 -0
  116. package/docs/api/channels.md +235 -0
  117. package/docs/api/cliCampaigns.d.ts +205 -0
  118. package/docs/api/cliCampaigns.md +256 -0
  119. package/docs/api/cliPipelines.d.ts +324 -0
  120. package/docs/api/cliPipelines.md +562 -0
  121. package/docs/api/clickHouse.d.ts +115 -0
  122. package/docs/api/clickHouse.md +138 -0
  123. package/docs/api/companies.d.ts +1636 -0
  124. package/docs/api/companies.md +2211 -0
  125. package/docs/api/companyIntelligence.d.ts +299 -0
  126. package/docs/api/companyIntelligence.md +488 -0
  127. package/docs/api/contacts.d.ts +2173 -0
  128. package/docs/api/contacts.md +3143 -0
  129. package/docs/api/content.d.ts +968 -0
  130. package/docs/api/content.md +1667 -0
  131. package/docs/api/contentGridSkills.d.ts +177 -0
  132. package/docs/api/contentGridSkills.md +271 -0
  133. package/docs/api/copilot.d.ts +1017 -0
  134. package/docs/api/copilot.md +1765 -0
  135. package/docs/api/crmSyncs.d.ts +215 -0
  136. package/docs/api/crmSyncs.md +301 -0
  137. package/docs/api/customerSuccess.d.ts +491 -0
  138. package/docs/api/customerSuccess.md +776 -0
  139. package/docs/api/deals.d.ts +1696 -0
  140. package/docs/api/deals.md +2432 -0
  141. package/docs/api/deliverability.d.ts +418 -0
  142. package/docs/api/deliverability.md +677 -0
  143. package/docs/api/desk.d.ts +1765 -0
  144. package/docs/api/desk.md +3007 -0
  145. package/docs/api/dialer.d.ts +1185 -0
  146. package/docs/api/dialer.md +2166 -0
  147. package/docs/api/dialerAnalytics.d.ts +187 -0
  148. package/docs/api/dialerAnalytics.md +257 -0
  149. package/docs/api/documents.d.ts +895 -0
  150. package/docs/api/documents.md +1440 -0
  151. package/docs/api/duplicates.d.ts +195 -0
  152. package/docs/api/duplicates.md +315 -0
  153. package/docs/api/eSign.d.ts +38 -0
  154. package/docs/api/eSign.md +54 -0
  155. package/docs/api/eSignature.d.ts +242 -0
  156. package/docs/api/eSignature.md +341 -0
  157. package/docs/api/enrichment.d.ts +3207 -0
  158. package/docs/api/enrichment.md +5225 -0
  159. package/docs/api/events.d.ts +115 -0
  160. package/docs/api/events.md +105 -0
  161. package/docs/api/fields.d.ts +482 -0
  162. package/docs/api/fields.md +566 -0
  163. package/docs/api/forms.d.ts +1012 -0
  164. package/docs/api/forms.md +1542 -0
  165. package/docs/api/gtmCampaigns.d.ts +662 -0
  166. package/docs/api/gtmCampaigns.md +1044 -0
  167. package/docs/api/gtmContext.d.ts +1187 -0
  168. package/docs/api/gtmContext.md +2112 -0
  169. package/docs/api/gtmDeliverability.d.ts +60 -0
  170. package/docs/api/gtmDeliverability.md +63 -0
  171. package/docs/api/gtmKnowledgeBase.d.ts +76 -0
  172. package/docs/api/gtmKnowledgeBase.md +91 -0
  173. package/docs/api/gtmLaunchHelpers.d.ts +123 -0
  174. package/docs/api/gtmLaunchHelpers.md +148 -0
  175. package/docs/api/gtmLibrary.d.ts +448 -0
  176. package/docs/api/gtmLibrary.md +780 -0
  177. package/docs/api/health.d.ts +39 -0
  178. package/docs/api/health.md +58 -0
  179. package/docs/api/imageLibrary.d.ts +341 -0
  180. package/docs/api/imageLibrary.md +569 -0
  181. package/docs/api/imports.d.ts +157 -0
  182. package/docs/api/imports.md +174 -0
  183. package/docs/api/inbox.d.ts +709 -0
  184. package/docs/api/inbox.md +1067 -0
  185. package/docs/api/install.d.ts +213 -0
  186. package/docs/api/install.md +317 -0
  187. package/docs/api/installedApps.d.ts +131 -0
  188. package/docs/api/installedApps.md +241 -0
  189. package/docs/api/integrationStatus.d.ts +142 -0
  190. package/docs/api/integrationStatus.md +205 -0
  191. package/docs/api/integrations.d.ts +2327 -0
  192. package/docs/api/integrations.md +3791 -0
  193. package/docs/api/intent.d.ts +482 -0
  194. package/docs/api/intent.md +858 -0
  195. package/docs/api/knowledge.d.ts +501 -0
  196. package/docs/api/knowledge.md +843 -0
  197. package/docs/api/knowledgeBase.d.ts +84 -0
  198. package/docs/api/knowledgeBase.md +96 -0
  199. package/docs/api/landingPages.d.ts +1411 -0
  200. package/docs/api/landingPages.md +2488 -0
  201. package/docs/api/leads.d.ts +133 -0
  202. package/docs/api/leads.md +180 -0
  203. package/docs/api/library.d.ts +217 -0
  204. package/docs/api/library.md +338 -0
  205. package/docs/api/linkedIn.d.ts +227 -0
  206. package/docs/api/linkedIn.md +289 -0
  207. package/docs/api/linkedInOutreach.d.ts +727 -0
  208. package/docs/api/linkedInOutreach.md +990 -0
  209. package/docs/api/lists.d.ts +1106 -0
  210. package/docs/api/lists.md +1609 -0
  211. package/docs/api/logs.d.ts +71 -0
  212. package/docs/api/logs.md +70 -0
  213. package/docs/api/mailboxes.d.ts +1050 -0
  214. package/docs/api/mailboxes.md +1690 -0
  215. package/docs/api/marketingIntelligence.d.ts +256 -0
  216. package/docs/api/marketingIntelligence.md +454 -0
  217. package/docs/api/marketplace.d.ts +3173 -0
  218. package/docs/api/marketplace.md +5953 -0
  219. package/docs/api/mcp.d.ts +69 -0
  220. package/docs/api/mcp.md +69 -0
  221. package/docs/api/me.d.ts +54 -0
  222. package/docs/api/me.md +56 -0
  223. package/docs/api/meetings.d.ts +539 -0
  224. package/docs/api/meetings.md +747 -0
  225. package/docs/api/newsletter.d.ts +1613 -0
  226. package/docs/api/newsletter.md +2746 -0
  227. package/docs/api/notes.d.ts +517 -0
  228. package/docs/api/notes.md +888 -0
  229. package/docs/api/notifications.d.ts +94 -0
  230. package/docs/api/notifications.md +105 -0
  231. package/docs/api/objects.d.ts +621 -0
  232. package/docs/api/objects.md +1098 -0
  233. package/docs/api/openSearch.d.ts +234 -0
  234. package/docs/api/openSearch.md +297 -0
  235. package/docs/api/ops.d.ts +299 -0
  236. package/docs/api/ops.md +339 -0
  237. package/docs/api/orgGovernance.d.ts +393 -0
  238. package/docs/api/orgGovernance.md +623 -0
  239. package/docs/api/orgVideos.d.ts +184 -0
  240. package/docs/api/orgVideos.md +252 -0
  241. package/docs/api/organizationSettings.d.ts +626 -0
  242. package/docs/api/organizationSettings.md +911 -0
  243. package/docs/api/phoneNumbers.d.ts +484 -0
  244. package/docs/api/phoneNumbers.md +777 -0
  245. package/docs/api/profile.d.ts +329 -0
  246. package/docs/api/profile.md +540 -0
  247. package/docs/api/programmaticPages.d.ts +400 -0
  248. package/docs/api/programmaticPages.md +626 -0
  249. package/docs/api/providerDomains.d.ts +866 -0
  250. package/docs/api/providerDomains.md +1446 -0
  251. package/docs/api/providerUsage.d.ts +129 -0
  252. package/docs/api/providerUsage.md +186 -0
  253. package/docs/api/public.d.ts +69 -0
  254. package/docs/api/public.md +78 -0
  255. package/docs/api/publicCopilot.d.ts +67 -0
  256. package/docs/api/publicCopilot.md +80 -0
  257. package/docs/api/publicSignals.d.ts +66 -0
  258. package/docs/api/publicSignals.md +71 -0
  259. package/docs/api/publicVisitors.d.ts +97 -0
  260. package/docs/api/publicVisitors.md +118 -0
  261. package/docs/api/quotes.d.ts +1564 -0
  262. package/docs/api/quotes.md +2553 -0
  263. package/docs/api/radar.d.ts +808 -0
  264. package/docs/api/radar.md +1431 -0
  265. package/docs/api/radarReports.d.ts +208 -0
  266. package/docs/api/radarReports.md +306 -0
  267. package/docs/api/recordRoles.d.ts +143 -0
  268. package/docs/api/recordRoles.md +175 -0
  269. package/docs/api/repos.d.ts +146 -0
  270. package/docs/api/repos.md +211 -0
  271. package/docs/api/research.d.ts +295 -0
  272. package/docs/api/research.md +534 -0
  273. package/docs/api/revenue.d.ts +402 -0
  274. package/docs/api/revenue.md +608 -0
  275. package/docs/api/revenueAnalytics.d.ts +147 -0
  276. package/docs/api/revenueAnalytics.md +212 -0
  277. package/docs/api/revenueLifecycle.d.ts +207 -0
  278. package/docs/api/revenueLifecycle.md +274 -0
  279. package/docs/api/revenueRecords.d.ts +372 -0
  280. package/docs/api/revenueRecords.md +563 -0
  281. package/docs/api/roles.d.ts +431 -0
  282. package/docs/api/roles.md +812 -0
  283. package/docs/api/salesCoach.d.ts +877 -0
  284. package/docs/api/salesCoach.md +1540 -0
  285. package/docs/api/sandbox.d.ts +210 -0
  286. package/docs/api/sandbox.md +380 -0
  287. package/docs/api/scans.d.ts +104 -0
  288. package/docs/api/scans.md +136 -0
  289. package/docs/api/scheduleBuy.d.ts +293 -0
  290. package/docs/api/scheduleBuy.md +431 -0
  291. package/docs/api/scraping.d.ts +266 -0
  292. package/docs/api/scraping.md +383 -0
  293. package/docs/api/sdrAnalytics.d.ts +138 -0
  294. package/docs/api/sdrAnalytics.md +246 -0
  295. package/docs/api/search.d.ts +598 -0
  296. package/docs/api/search.md +866 -0
  297. package/docs/api/seo.d.ts +447 -0
  298. package/docs/api/seo.md +660 -0
  299. package/docs/api/sequenceLifecycle.d.ts +439 -0
  300. package/docs/api/sequenceLifecycle.md +513 -0
  301. package/docs/api/sequences.d.ts +1936 -0
  302. package/docs/api/sequences.md +3232 -0
  303. package/docs/api/settings.d.ts +448 -0
  304. package/docs/api/settings.md +731 -0
  305. package/docs/api/signals.d.ts +1441 -0
  306. package/docs/api/signals.md +2526 -0
  307. package/docs/api/signatures.d.ts +719 -0
  308. package/docs/api/signatures.md +1247 -0
  309. package/docs/api/skills.d.ts +230 -0
  310. package/docs/api/skills.md +466 -0
  311. package/docs/api/snippet.d.ts +85 -0
  312. package/docs/api/snippet.md +106 -0
  313. package/docs/api/socialPublishing.d.ts +824 -0
  314. package/docs/api/socialPublishing.md +1245 -0
  315. package/docs/api/studioDocuments.d.ts +244 -0
  316. package/docs/api/studioDocuments.md +348 -0
  317. package/docs/api/support.d.ts +90 -0
  318. package/docs/api/support.md +76 -0
  319. package/docs/api/suppressions.d.ts +241 -0
  320. package/docs/api/suppressions.md +343 -0
  321. package/docs/api/surveys.d.ts +847 -0
  322. package/docs/api/surveys.md +1223 -0
  323. package/docs/api/tasks.d.ts +813 -0
  324. package/docs/api/tasks.md +1344 -0
  325. package/docs/api/teamMembers.d.ts +668 -0
  326. package/docs/api/teamMembers.md +1040 -0
  327. package/docs/api/teams.d.ts +784 -0
  328. package/docs/api/teams.md +1395 -0
  329. package/docs/api/usage.d.ts +277 -0
  330. package/docs/api/usage.md +389 -0
  331. package/docs/api/visitors.d.ts +690 -0
  332. package/docs/api/visitors.md +1075 -0
  333. package/docs/api/voice.d.ts +4661 -0
  334. package/docs/api/voice.md +7905 -0
  335. package/docs/api/webAnalytics.d.ts +964 -0
  336. package/docs/api/webAnalytics.md +1452 -0
  337. package/docs/api/webChat.d.ts +1704 -0
  338. package/docs/api/webChat.md +2048 -0
  339. package/docs/api/webhooks.d.ts +251 -0
  340. package/docs/api/webhooks.md +386 -0
  341. package/docs/api/websiteEditor.d.ts +324 -0
  342. package/docs/api/websiteEditor.md +517 -0
  343. package/docs/api/work.d.ts +2298 -0
  344. package/docs/api/work.md +3096 -0
  345. package/docs/api/workbench.d.ts +2962 -0
  346. package/docs/api/workbench.md +4884 -0
  347. package/docs/api/workflows.d.ts +1218 -0
  348. package/docs/api/workflows.md +2302 -0
  349. package/docs/sdk-clients.md +4339 -0
  350. package/package.json +10 -3
@@ -0,0 +1,3917 @@
1
+ <!-- Generated by sdk/js/scripts/generate-agent-docs.ts from developer-contract/openapi.json. Regenerated on every build. -->
2
+
3
+ # `g8.api.appointments`: Appointments
4
+
5
+ 92 operations (31 read, 27 write, 16 destructive, 18 external).
6
+
7
+ No hand-written client covers this area. Call it through `g8.api.appointments.*` 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: [appointments.d.ts](appointments.d.ts).
20
+
21
+ ## Operations
22
+
23
+ | Call | HTTP | Tier | Scope | Summary |
24
+ |---|---|---|---|---|
25
+ | [`addBookingGuests`](#op-addbookingguests) | `POST /api/v1/appointments/bookings/{booking_uid}/guests` | external | `meetings:run` | Add guest attendees to a booking |
26
+ | [`addBookingNote`](#op-addbookingnote) | `POST /api/v1/appointments/bookings/{booking_uid}/notes` | external | `meetings:run` | Add an internal note to a booking |
27
+ | [`addEventTypeHost`](#op-addeventtypehost) | `POST /api/v1/appointments/event-types/{event_type_id}/hosts` | write | `meetings:write` | Add Event Type Host |
28
+ | [`assignAllMembers`](#op-assignallmembers) | `POST /api/v1/appointments/event-types/{event_type_id}/members/all` | write | `meetings:write` | Assign All Members |
29
+ | [`assignManagedMember`](#op-assignmanagedmember) | `POST /api/v1/appointments/event-types/{event_type_id}/members` | write | `meetings:write` | Assign Managed Member |
30
+ | [`cancelBooking`](#op-cancelbooking) | `POST /api/v1/appointments/bookings/{booking_uid}/cancel` | destructive | `meetings:delete` | Cancel a booking and notify both parties |
31
+ | [`clearEventTypeDestinationCalendar`](#op-cleareventtypedestinationcalendar) | `DELETE /api/v1/appointments/event-types/{event_type_id}/destination-calendar` | destructive | `meetings:delete` | Clear Event Type Destination Calendar |
32
+ | [`confirmBooking`](#op-confirmbooking) | `POST /api/v1/appointments/bookings/{booking_uid}/confirm` | external | `meetings:run` | Confirm or reject a pending booking |
33
+ | [`connectConferencing`](#op-connectconferencing) | `POST /api/v1/appointments/conferencing/connect/{provider}` | external | `meetings:run` | Connect a conferencing provider (link-based / no-OAuth only) |
34
+ | [`createBooking`](#op-createbooking) | `POST /api/v1/appointments/bookings` | external | `meetings:run` | Create a booking (charges credits + sends notifications) |
35
+ | [`createEventType`](#op-createeventtype) | `POST /api/v1/appointments/event-types` | write | `meetings:write` | Create a bookable event type |
36
+ | [`createEventTypeHostGroup`](#op-createeventtypehostgroup) | `POST /api/v1/appointments/event-types/{event_type_id}/host-groups` | write | `meetings:write` | Create Event Type Host Group |
37
+ | [`createOoo`](#op-createooo) | `POST /api/v1/appointments/out-of-office` | write | `meetings:write` | Create an out-of-office entry |
38
+ | [`createRoutingForm`](#op-createroutingform) | `POST /api/v1/appointments/routing-forms` | write | `meetings:write` | Create a routing form |
39
+ | [`createSavedFilter`](#op-createsavedfilter) | `POST /api/v1/appointments/saved-filters` | write | `meetings:write` | Create Saved Filter |
40
+ | [`createSchedule`](#op-createschedule) | `POST /api/v1/appointments/schedules` | write | `meetings:write` | Create an availability schedule |
41
+ | [`createWorkflow`](#op-createworkflow) | `POST /api/v1/appointments/workflows` | external | `meetings:run` | Create a workflow |
42
+ | [`deleteEventType`](#op-deleteeventtype) | `DELETE /api/v1/appointments/event-types/{event_type_id}` | destructive | `meetings:delete` | Delete an event type |
43
+ | [`deleteEventTypeHostGroup`](#op-deleteeventtypehostgroup) | `DELETE /api/v1/appointments/event-types/{event_type_id}/host-groups/{group_id}` | destructive | `meetings:delete` | Delete Event Type Host Group |
44
+ | [`deleteOoo`](#op-deleteooo) | `DELETE /api/v1/appointments/out-of-office/{ooo_uuid}` | destructive | `meetings:delete` | Delete an out-of-office entry |
45
+ | [`deleteRoutingForm`](#op-deleteroutingform) | `DELETE /api/v1/appointments/routing-forms/{form_id}` | destructive | `meetings:delete` | Delete a routing form (cascades fields and routes) |
46
+ | [`deleteSavedFilter`](#op-deletesavedfilter) | `DELETE /api/v1/appointments/saved-filters/{filter_id}` | destructive | `meetings:delete` | Delete Saved Filter |
47
+ | [`deleteSchedule`](#op-deleteschedule) | `DELETE /api/v1/appointments/schedules/{schedule_id}` | destructive | `meetings:delete` | Delete a schedule |
48
+ | [`deleteWorkflow`](#op-deleteworkflow) | `DELETE /api/v1/appointments/workflows/{workflow_id}` | destructive | `meetings:delete` | Delete a workflow and cancel pending reminders |
49
+ | [`deselectCalendar`](#op-deselectcalendar) | `DELETE /api/v1/appointments/calendars/selected` | destructive | `meetings:delete` | Deselect a sub-calendar from conflict checking |
50
+ | [`disconnectCalendar`](#op-disconnectcalendar) | `DELETE /api/v1/appointments/calendars/{credential_id}` | destructive | `meetings:delete` | Disconnect a calendar account |
51
+ | [`disconnectConferencing`](#op-disconnectconferencing) | `DELETE /api/v1/appointments/conferencing/{provider}/disconnect` | destructive | `meetings:delete` | Disconnect a conferencing provider |
52
+ | [`duplicateEventType`](#op-duplicateeventtype) | `POST /api/v1/appointments/event-types/{event_type_id}/duplicate` | write | `meetings:write` | Duplicate an event type (with a '-copy' slug) |
53
+ | [`duplicateRoutingForm`](#op-duplicateroutingform) | `POST /api/v1/appointments/routing-forms/{form_id}/duplicate` | write | `meetings:write` | Duplicate a routing form (copy with all fields and routes) |
54
+ | [`exportBookingInsights`](#op-exportbookinginsights) | `GET /api/v1/appointments/bookings/insights/export` | read | `meetings:read` | Export Booking Insights |
55
+ | [`exportRoutingFormResponses`](#op-exportroutingformresponses) | `GET /api/v1/appointments/routing-forms/{form_id}/responses/export` | read | `meetings:read` | Export Routing Form Responses |
56
+ | [`getAvailability`](#op-getavailability) | `GET /api/v1/appointments/schedules/{schedule_id}/availability` | read | `meetings:read` | Get availability rules and overrides for a schedule |
57
+ | [`getAvailableSlots`](#op-getavailableslots) | `GET /api/v1/appointments/slots` | read | `meetings:read` | Get Available Slots |
58
+ | [`getBooking`](#op-getbooking) | `GET /api/v1/appointments/bookings/{booking_uid}` | read | `meetings:read` | Get a single booking by UID |
59
+ | [`getBookingInsights`](#op-getbookinginsights) | `GET /api/v1/appointments/bookings/insights` | read | `meetings:read` | Get aggregated booking insights |
60
+ | [`getDefaultConferencing`](#op-getdefaultconferencing) | `GET /api/v1/appointments/conferencing/default` | read | `meetings:read` | Get the current default conferencing provider |
61
+ | [`getDestinationCalendar`](#op-getdestinationcalendar) | `GET /api/v1/appointments/calendars/destination` | read | `meetings:read` | Get the destination calendar (with event-type fallback) |
62
+ | [`getEmbedConfig`](#op-getembedconfig) | `GET /api/v1/appointments/event-types/{event_type_id}/embed` | read | `meetings:read` | Get Embed Config |
63
+ | [`getEventType`](#op-geteventtype) | `GET /api/v1/appointments/event-types/{event_type_id}` | read | `meetings:read` | Get full detail for one bookable event type |
64
+ | [`getEventTypeDestinationCalendar`](#op-geteventtypedestinationcalendar) | `GET /api/v1/appointments/event-types/{event_type_id}/destination-calendar` | read | `meetings:read` | Get Event Type Destination Calendar |
65
+ | [`getEventTypeSelectedCalendars`](#op-geteventtypeselectedcalendars) | `GET /api/v1/appointments/event-types/{event_type_id}/selected-calendars` | read | `meetings:read` | Get Event Type Selected Calendars |
66
+ | [`getOrgSettings`](#op-getorgsettings) | `GET /api/v1/appointments/org-settings` | read | `meetings:read` | Get Org Settings |
67
+ | [`getRoutingForm`](#op-getroutingform) | `GET /api/v1/appointments/routing-forms/{form_id}` | read | `meetings:read` | Get a single routing form |
68
+ | [`getSchedule`](#op-getschedule) | `GET /api/v1/appointments/schedules/{schedule_id}` | read | `meetings:read` | Get a schedule with availability and linked event types |
69
+ | [`getScheduleProfile`](#op-getscheduleprofile) | `GET /api/v1/appointments/profile` | read | `meetings:read` | Get Schedule Profile |
70
+ | [`getWorkflow`](#op-getworkflow) | `GET /api/v1/appointments/workflows/{workflow_id}` | read | `meetings:read` | Get a single workflow |
71
+ | [`importMeeting`](#op-importmeeting) | `POST /api/v1/appointments/bookings/import` | external | `meetings:run` | Import Meeting |
72
+ | [`listBookings`](#op-listbookings) | `GET /api/v1/appointments/bookings` | read | `meetings:read` | List the caller's bookings (paginated) |
73
+ | [`listCalendarEvents`](#op-listcalendarevents) | `GET /api/v1/appointments/calendars/events` | read | `meetings:read` | List Calendar Events |
74
+ | [`listCalendars`](#op-listcalendars) | `GET /api/v1/appointments/calendars` | read | `meetings:read` | List connected calendar accounts |
75
+ | [`listConferencing`](#op-listconferencing) | `GET /api/v1/appointments/conferencing` | read | `meetings:read` | List connected conferencing providers |
76
+ | [`listEventTypeHostGroups`](#op-listeventtypehostgroups) | `GET /api/v1/appointments/event-types/{event_type_id}/host-groups` | read | `meetings:read` | List Event Type Host Groups |
77
+ | [`listMembership`](#op-listmembership) | `GET /api/v1/appointments/membership` | read | `meetings:read` | List Membership |
78
+ | [`listOoo`](#op-listooo) | `GET /api/v1/appointments/out-of-office` | read | `meetings:read` | List out-of-office entries for the calling user |
79
+ | [`listRoutingFormResponses`](#op-listroutingformresponses) | `GET /api/v1/appointments/routing-forms/{form_id}/responses` | read | `meetings:read` | List captured responses for a routing form (paginated) |
80
+ | [`listRoutingForms`](#op-listroutingforms) | `GET /api/v1/appointments/routing-forms` | read | `meetings:read` | List routing forms (includes response_count) |
81
+ | [`listSavedFilters`](#op-listsavedfilters) | `GET /api/v1/appointments/saved-filters` | read | `meetings:read` | List Saved Filters |
82
+ | [`listSchedules`](#op-listschedules) | `GET /api/v1/appointments/schedules` | read | `meetings:read` | List the caller's availability schedules |
83
+ | [`listSequencesForPicker`](#op-listsequencesforpicker) | `GET /api/v1/appointments/bookings/sequences-picker` | read | `meetings:read` | List Sequences For Picker |
84
+ | [`listTeamAvailability`](#op-listteamavailability) | `GET /api/v1/appointments/availability/team` | read | `meetings:read` | List Team Availability |
85
+ | [`listWorkflows`](#op-listworkflows) | `GET /api/v1/appointments/workflows` | read | `meetings:read` | List all workflows |
86
+ | [`markAbsent`](#op-markabsent) | `POST /api/v1/appointments/bookings/{booking_uid}/mark-absent` | external | `meetings:run` | Mark host or attendees as no-show |
87
+ | [`releaseSlot`](#op-releaseslot) | `DELETE /api/v1/appointments/slots/reserve/{slot_uid}` | destructive | `meetings:delete` | Release Slot |
88
+ | [`removeEventTypeHost`](#op-removeeventtypehost) | `DELETE /api/v1/appointments/event-types/{event_type_id}/hosts/{host_user_id}` | destructive | `meetings:delete` | Remove Event Type Host |
89
+ | [`requestBookingReschedule`](#op-requestbookingreschedule) | `POST /api/v1/appointments/bookings/{booking_uid}/request-reschedule` | external | `meetings:run` | Send a reschedule-request email to the attendee (host action) |
90
+ | [`rescheduleBooking`](#op-reschedulebooking) | `POST /api/v1/appointments/bookings/{booking_uid}/reschedule` | external | `meetings:run` | Reschedule a booking to a new start time |
91
+ | [`reserveSlot`](#op-reserveslot) | `POST /api/v1/appointments/slots/reserve` | write | `meetings:write` | Reserve Slot |
92
+ | [`selectCalendar`](#op-selectcalendar) | `POST /api/v1/appointments/calendars/selected` | external | `meetings:run` | Select a sub-calendar for conflict checking |
93
+ | [`setDefaultConferencing`](#op-setdefaultconferencing) | `POST /api/v1/appointments/conferencing/{provider}/default` | external | `meetings:run` | Set the default conferencing provider |
94
+ | [`setDefaultSchedule`](#op-setdefaultschedule) | `POST /api/v1/appointments/schedules/{schedule_id}/set-default` | write | `meetings:write` | Set a schedule as the caller's default |
95
+ | [`setDestinationCalendar`](#op-setdestinationcalendar) | `PUT /api/v1/appointments/calendars/destination` | external | `meetings:run` | Set the destination calendar for new booking events |
96
+ | [`setEventTypeDestinationCalendar`](#op-seteventtypedestinationcalendar) | `PUT /api/v1/appointments/event-types/{event_type_id}/destination-calendar` | write | `meetings:write` | Set Event Type Destination Calendar |
97
+ | [`setEventTypeSelectedCalendars`](#op-seteventtypeselectedcalendars) | `PUT /api/v1/appointments/event-types/{event_type_id}/selected-calendars` | write | `meetings:write` | Set Event Type Selected Calendars |
98
+ | [`setLockedFields`](#op-setlockedfields) | `PUT /api/v1/appointments/event-types/{event_type_id}/locked-fields` | write | `meetings:write` | Set Locked Fields |
99
+ | [`setProviderLink`](#op-setproviderlink) | `PUT /api/v1/appointments/conferencing/{provider}/link` | external | `meetings:run` | Set or update a link-based conferencing provider's meeting URL |
100
+ | [`toggleWorkflow`](#op-toggleworkflow) | `POST /api/v1/appointments/workflows/{workflow_id}/toggle` | external | `meetings:run` | Activate or deactivate a workflow |
101
+ | [`unassignManagedMember`](#op-unassignmanagedmember) | `DELETE /api/v1/appointments/event-types/{event_type_id}/members/{user_id}` | destructive | `meetings:delete` | Unassign Managed Member |
102
+ | [`updateAvailability`](#op-updateavailability) | `PATCH /api/v1/appointments/schedules/{schedule_id}/availability` | write | `meetings:write` | Replace availability rules and/or date overrides for a schedule |
103
+ | [`updateBookingLocation`](#op-updatebookinglocation) | `PATCH /api/v1/appointments/bookings/{booking_uid}/location` | external | `meetings:run` | Update the meeting location and notify both parties |
104
+ | [`updateBookingSequence`](#op-updatebookingsequence) | `PATCH /api/v1/appointments/bookings/{booking_uid}/sequence` | external | `meetings:run` | Associate a booking with a sequence (or detach) |
105
+ | [`updateEmbedConfig`](#op-updateembedconfig) | `PATCH /api/v1/appointments/event-types/{event_type_id}/embed` | write | `meetings:write` | Update Embed Config |
106
+ | [`updateEventType`](#op-updateeventtype) | `PATCH /api/v1/appointments/event-types/{event_type_id}` | write | `meetings:write` | Update an event type (partial) |
107
+ | [`updateEventTypeHost`](#op-updateeventtypehost) | `PATCH /api/v1/appointments/event-types/{event_type_id}/hosts/{host_user_id}` | write | `meetings:write` | Update Event Type Host |
108
+ | [`updateEventTypeHostGroup`](#op-updateeventtypehostgroup) | `PATCH /api/v1/appointments/event-types/{event_type_id}/host-groups/{group_id}` | write | `meetings:write` | Update Event Type Host Group |
109
+ | [`updateMemberRole`](#op-updatememberrole) | `PATCH /api/v1/appointments/membership/by-user/{user_id}/role` | destructive | `meetings:delete` | Update Member Role |
110
+ | [`updateOoo`](#op-updateooo) | `PATCH /api/v1/appointments/out-of-office/{ooo_uuid}` | write | `meetings:write` | Update an out-of-office entry |
111
+ | [`updateOrgSettings`](#op-updateorgsettings) | `PATCH /api/v1/appointments/org-settings` | write | `meetings:write` | Update Org Settings |
112
+ | [`updateRoutingForm`](#op-updateroutingform) | `PATCH /api/v1/appointments/routing-forms/{form_id}` | write | `meetings:write` | Update a routing form (partial) |
113
+ | [`updateSavedFilter`](#op-updatesavedfilter) | `PUT /api/v1/appointments/saved-filters/{filter_id}` | write | `meetings:write` | Update Saved Filter |
114
+ | [`updateSchedule`](#op-updateschedule) | `PATCH /api/v1/appointments/schedules/{schedule_id}` | write | `meetings:write` | Update a schedule (partial) |
115
+ | [`updateScheduleProfile`](#op-updatescheduleprofile) | `PATCH /api/v1/appointments/profile` | write | `meetings:write` | Update Schedule Profile |
116
+ | [`updateWorkflow`](#op-updateworkflow) | `PATCH /api/v1/appointments/workflows/{workflow_id}` | external | `meetings:run` | Update a workflow (partial) |
117
+
118
+ ---
119
+
120
+ <a id="op-addbookingguests"></a>
121
+
122
+ ### `g8.api.appointments.addBookingGuests(input)`
123
+
124
+ **Add guest attendees to a booking**
125
+
126
+ - HTTP: `POST /api/v1/appointments/bookings/{booking_uid}/guests`
127
+ - operationId: `add_booking_guests_appointments_bookings__booking_uid__guests_post` (also callable as `g8.api.call("add_booking_guests_appointments_bookings__booking_uid__guests_post", input)`)
128
+ - 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
129
+ - API-key scope: `meetings:run`
130
+
131
+ Invite additional guests (email addresses) to an existing booking.
132
+
133
+ Sends notification emails to each new guest and updates the booking's
134
+ attendee list. Backed by ``BookingsHandler.handle_add_guests``.
135
+ Raises 404 when the booking uid is not visible to the caller.
136
+
137
+ **Input**
138
+
139
+ | Field | Type | Required | Description |
140
+ |---|---|---|---|
141
+ | `path.booking_uid` | `string` | yes | Booking UID (uuid string). |
142
+ | `body` | `AddGuestsRequest` | yes | Request body; fields below. |
143
+
144
+ Body fields (`AddGuestsRequest`):
145
+
146
+ | Field | Type | Required | Description |
147
+ |---|---|---|---|
148
+ | `body.guests` | `Array<string>` | yes | |
149
+
150
+ **Returns** `Record<string, unknown>`.
151
+
152
+ **Example**
153
+
154
+ ```ts
155
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
156
+ const result = await g8.api.appointments.addBookingGuests({ path: { booking_uid: "example" }, body: { guests: ["example"] } });
157
+ ```
158
+
159
+ ---
160
+
161
+ <a id="op-addbookingnote"></a>
162
+
163
+ ### `g8.api.appointments.addBookingNote(input)`
164
+
165
+ **Add an internal note to a booking**
166
+
167
+ - HTTP: `POST /api/v1/appointments/bookings/{booking_uid}/notes`
168
+ - operationId: `add_booking_note_appointments_bookings__booking_uid__notes_post` (also callable as `g8.api.call("add_booking_note_appointments_bookings__booking_uid__notes_post", input)`)
169
+ - 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
170
+ - API-key scope: `meetings:run`
171
+
172
+ Append an internal (host-only) note to a booking.
173
+
174
+ Notes are not visible to attendees; they appear in the booking detail
175
+ view for org members. Backed by ``BookingsHandler.handle_add_note``.
176
+ Raises 404 when the booking uid is not visible to the caller.
177
+
178
+ **Input**
179
+
180
+ | Field | Type | Required | Description |
181
+ |---|---|---|---|
182
+ | `path.booking_uid` | `string` | yes | Booking UID (uuid string). |
183
+ | `body` | `AddNoteRequest` | yes | Request body; fields below. |
184
+
185
+ Body fields (`AddNoteRequest`):
186
+
187
+ | Field | Type | Required | Description |
188
+ |---|---|---|---|
189
+ | `body.text` | `string` | yes | |
190
+
191
+ **Returns** `Record<string, unknown>`.
192
+
193
+ **Example**
194
+
195
+ ```ts
196
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
197
+ const result = await g8.api.appointments.addBookingNote({ path: { booking_uid: "example" }, body: { text: "example" } });
198
+ ```
199
+
200
+ ---
201
+
202
+ <a id="op-addeventtypehost"></a>
203
+
204
+ ### `g8.api.appointments.addEventTypeHost(input)`
205
+
206
+ **Add Event Type Host**
207
+
208
+ - HTTP: `POST /api/v1/appointments/event-types/{event_type_id}/hosts`
209
+ - operationId: `add_event_type_host_appointments_event_types__event_type_id__hosts_post` (also callable as `g8.api.call("add_event_type_host_appointments_event_types__event_type_id__hosts_post", input)`)
210
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
211
+ - API-key scope: `meetings:write`
212
+
213
+ Add a host to an event type.
214
+
215
+ `is_fixed` is the round-robin distinction that matters: a FIXED host is on
216
+ every booking, a non-fixed host is one of the rotation. Getting it wrong
217
+ silently changes who gets booked, so it is declared rather than defaulted
218
+ into ambiguity.
219
+
220
+ **Input**
221
+
222
+ | Field | Type | Required | Description |
223
+ |---|---|---|---|
224
+ | `path.event_type_id` | `integer` | yes | Event type id. |
225
+ | `body` | `AppointmentHostCreateRequest` | yes | Request body; fields below. |
226
+
227
+ Body fields (`AppointmentHostCreateRequest`):
228
+
229
+ | Field | Type | Required | Description |
230
+ |---|---|---|---|
231
+ | `body.user_id` | `integer` | yes | User to add as a host. |
232
+ | `body.group_id` | `string \| null` | no | |
233
+ | `body.is_fixed` | `boolean` | no | True = on every booking; false = one of the round-robin rotation. default `false` |
234
+ | `body.priority` | `integer \| null` | no | |
235
+ | `body.schedule_id` | `integer \| null` | no | |
236
+ | `body.weight` | `integer \| null` | no | |
237
+
238
+ **Returns** `ApiResponse_AppointmentHost_`: the envelope `{ data: AppointmentHost, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
239
+
240
+ Other envelope fields: `pagination` (PaginationMeta).
241
+
242
+ `AppointmentHost` fields:
243
+
244
+ | Field | Type | Required | Description |
245
+ |---|---|---|---|
246
+ | `avatar_url` | `string \| null` | no | |
247
+ | `email` | `string \| null` | no | |
248
+ | `event_type_id` | `integer \| null` | no | |
249
+ | `group_id` | `string \| null` | no | Host group, if partitioned. |
250
+ | `is_fixed` | `boolean \| null` | no | True = on EVERY booking. False = one of the round-robin rotation. This is the setting that decides who actually gets booked. |
251
+ | `name` | `string \| null` | no | |
252
+ | `priority` | `integer \| null` | no | Rotation priority. |
253
+ | `schedule_id` | `integer \| null` | no | Availability schedule this host is booked against. |
254
+ | `user_id` | `integer \| null` | no | |
255
+ | `weight` | `integer \| null` | no | Relative share of the rotation. |
256
+
257
+ **Example**
258
+
259
+ ```ts
260
+ const result = await g8.api.appointments.addEventTypeHost({ path: { event_type_id: 123 }, body: { user_id: 123 } });
261
+ ```
262
+
263
+ ---
264
+
265
+ <a id="op-assignallmembers"></a>
266
+
267
+ ### `g8.api.appointments.assignAllMembers(input)`
268
+
269
+ **Assign All Members**
270
+
271
+ - HTTP: `POST /api/v1/appointments/event-types/{event_type_id}/members/all`
272
+ - operationId: `assign_all_members_appointments_event_types__event_type_id__members_all_post` (also callable as `g8.api.call("assign_all_members_appointments_event_types__event_type_id__members_all_post", input)`)
273
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
274
+ - API-key scope: `meetings:write`
275
+
276
+ Give EVERY active member their own bookable copy of a managed template.
277
+
278
+ Idempotent - members who already have a copy are skipped.
279
+ `include_future_joiners` is a standing rule: leave it true and someone who
280
+ joins next month gets a copy without anyone running this again.
281
+
282
+ **Input**
283
+
284
+ | Field | Type | Required | Description |
285
+ |---|---|---|---|
286
+ | `path.event_type_id` | `integer` | yes | Event type id. |
287
+ | `body` | `BulkAssignMembersRequest` | no | Request body; fields below. |
288
+
289
+ Body fields (`BulkAssignMembersRequest`):
290
+
291
+ | Field | Type | Required | Description |
292
+ |---|---|---|---|
293
+ | `body.include_future_joiners` | `boolean` | no | When true, members who join the organisation LATER also get a copy automatically. A standing rule, not a one-off action. default `false` |
294
+
295
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
296
+
297
+ Other envelope fields: `pagination` (PaginationMeta).
298
+
299
+ **Example**
300
+
301
+ ```ts
302
+ const result = await g8.api.appointments.assignAllMembers({ path: { event_type_id: 123 } });
303
+ ```
304
+
305
+ ---
306
+
307
+ <a id="op-assignmanagedmember"></a>
308
+
309
+ ### `g8.api.appointments.assignManagedMember(input)`
310
+
311
+ **Assign Managed Member**
312
+
313
+ - HTTP: `POST /api/v1/appointments/event-types/{event_type_id}/members`
314
+ - operationId: `assign_managed_member_appointments_event_types__event_type_id__members_post` (also callable as `g8.api.call("assign_managed_member_appointments_event_types__event_type_id__members_post", input)`)
315
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
316
+ - API-key scope: `meetings:write`
317
+
318
+ Give ONE member their own bookable copy of a managed template.
319
+
320
+ The template itself is not bookable - it distributes a child event type
321
+ per member, which is what that member's booking link points at.
322
+
323
+ **Input**
324
+
325
+ | Field | Type | Required | Description |
326
+ |---|---|---|---|
327
+ | `path.event_type_id` | `integer` | yes | Event type id. |
328
+ | `body` | `AssignManagedMemberRequest` | yes | Request body; fields below. |
329
+
330
+ Body fields (`AssignManagedMemberRequest`):
331
+
332
+ | Field | Type | Required | Description |
333
+ |---|---|---|---|
334
+ | `body.user_id` | `integer` | yes | The member's INTEGER scheduling user id - the `user_id` field of `GET /appointments/membership`. Not an email, not a PropelAuth id. min 1 |
335
+
336
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
337
+
338
+ Other envelope fields: `pagination` (PaginationMeta).
339
+
340
+ **Example**
341
+
342
+ ```ts
343
+ const result = await g8.api.appointments.assignManagedMember({ path: { event_type_id: 123 }, body: { user_id: 1 } });
344
+ ```
345
+
346
+ ---
347
+
348
+ <a id="op-cancelbooking"></a>
349
+
350
+ ### `g8.api.appointments.cancelBooking(input)`
351
+
352
+ **Cancel a booking and notify both parties**
353
+
354
+ - HTTP: `POST /api/v1/appointments/bookings/{booking_uid}/cancel`
355
+ - operationId: `cancel_booking_appointments_bookings__booking_uid__cancel_post` (also callable as `g8.api.call("cancel_booking_appointments_bookings__booking_uid__cancel_post", input)`)
356
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
357
+ - API-key scope: `meetings:delete`
358
+
359
+ Cancel a booking. Reuses ``BookingsHandler.handle_cancel`` (sends the
360
+ cancellation emails, releases the slot, emits the EDA event). Body is
361
+ optional — omit it to cancel with no reason.
362
+
363
+ **Input**
364
+
365
+ | Field | Type | Required | Description |
366
+ |---|---|---|---|
367
+ | `path.booking_uid` | `string` | yes | |
368
+ | `body` | `CancelBookingRequest \| null` | no | Request body; fields below. |
369
+
370
+ Body fields:
371
+
372
+ | Field | Type | Required | Description |
373
+ |---|---|---|---|
374
+ | `body.cancel_subsequent` | `boolean` | no | default `false` |
375
+ | `body.cancellation_reason` | `string \| null` | no | |
376
+
377
+ **Returns** `Record<string, unknown>`.
378
+
379
+ **Example**
380
+
381
+ ```ts
382
+ // destructive: deletes or archives data; confirm with a human before calling.
383
+ const result = await g8.api.appointments.cancelBooking({ path: { booking_uid: "example" } });
384
+ ```
385
+
386
+ ---
387
+
388
+ <a id="op-cleareventtypedestinationcalendar"></a>
389
+
390
+ ### `g8.api.appointments.clearEventTypeDestinationCalendar(input)`
391
+
392
+ **Clear Event Type Destination Calendar**
393
+
394
+ - HTTP: `DELETE /api/v1/appointments/event-types/{event_type_id}/destination-calendar`
395
+ - operationId: `clear_event_type_destination_calendar_appointments_event_types__event_type_id__destination_calendar_delete` (also callable as `g8.api.call("clear_event_type_destination_calendar_appointments_event_types__event_type_id__destination_calendar_delete", input)`)
396
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
397
+ - API-key scope: `meetings:delete`
398
+
399
+ Drop the per-event-type override. The ACCOUNT default is untouched, so
400
+ bookings fall back to it rather than stopping.
401
+
402
+ **Input**
403
+
404
+ | Field | Type | Required | Description |
405
+ |---|---|---|---|
406
+ | `path.event_type_id` | `integer` | yes | Event type id. |
407
+
408
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
409
+
410
+ Other envelope fields: `pagination` (PaginationMeta).
411
+
412
+ **Example**
413
+
414
+ ```ts
415
+ // destructive: deletes or archives data; confirm with a human before calling.
416
+ const result = await g8.api.appointments.clearEventTypeDestinationCalendar({ path: { event_type_id: 123 } });
417
+ ```
418
+
419
+ ---
420
+
421
+ <a id="op-confirmbooking"></a>
422
+
423
+ ### `g8.api.appointments.confirmBooking(input)`
424
+
425
+ **Confirm or reject a pending booking**
426
+
427
+ - HTTP: `POST /api/v1/appointments/bookings/{booking_uid}/confirm`
428
+ - operationId: `confirm_booking_appointments_bookings__booking_uid__confirm_post` (also callable as `g8.api.call("confirm_booking_appointments_bookings__booking_uid__confirm_post", input)`)
429
+ - 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
430
+ - API-key scope: `meetings:run`
431
+
432
+ Confirm or reject a booking that requires host approval.
433
+
434
+ When ``confirmed=True`` the booking moves from ``pending`` to
435
+ ``accepted`` and confirmation emails are sent. When ``confirmed=False``
436
+ the booking is rejected and the attendee is notified with the optional
437
+ ``reason``. Backed by ``BookingsHandler.handle_confirm``; raises 404
438
+ when the booking uid is not visible to the caller, 403 on permission.
439
+
440
+ **Input**
441
+
442
+ | Field | Type | Required | Description |
443
+ |---|---|---|---|
444
+ | `path.booking_uid` | `string` | yes | Booking UID (uuid string). |
445
+ | `body` | `ConfirmBookingRequest` | yes | Request body; fields below. |
446
+
447
+ Body fields (`ConfirmBookingRequest`):
448
+
449
+ | Field | Type | Required | Description |
450
+ |---|---|---|---|
451
+ | `body.confirmed` | `boolean` | yes | |
452
+ | `body.reason` | `string \| null` | no | |
453
+
454
+ **Returns** `Record<string, unknown>`.
455
+
456
+ **Example**
457
+
458
+ ```ts
459
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
460
+ const result = await g8.api.appointments.confirmBooking({ path: { booking_uid: "example" }, body: { confirmed: true } });
461
+ ```
462
+
463
+ ---
464
+
465
+ <a id="op-connectconferencing"></a>
466
+
467
+ ### `g8.api.appointments.connectConferencing(input)`
468
+
469
+ **Connect a conferencing provider (link-based / no-OAuth only)**
470
+
471
+ - HTTP: `POST /api/v1/appointments/conferencing/connect/{provider}`
472
+ - operationId: `connect_conferencing_appointments_conferencing_connect__provider__post` (also callable as `g8.api.call("connect_conferencing_appointments_conferencing_connect__provider__post", input)`)
473
+ - 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
474
+ - API-key scope: `meetings:run`
475
+
476
+ Connect a conferencing provider that does not require a browser OAuth
477
+ flow. Supported providers: google_meet, roam, roam_auto, whereby, jitsi.
478
+ Zoom and office365_video (Teams) are excluded - they require a browser
479
+ OAuth redirect that cannot be completed via an API key.
480
+
481
+ google_meet: clears the google_meet_suppressed flag (requires an existing
482
+ google_calendar credential - no credential row is created for Meet itself).
483
+
484
+ roam, whereby, jitsi: creates a credential row; optional ``link`` is the
485
+ meeting URL validated against the provider's URL pattern.
486
+
487
+ roam_auto: creates a stub credential row (no OAuth tokens - the Roam Auto
488
+ integration requires a prior OAuth flow to be completed in the web app).
489
+
490
+ **Input**
491
+
492
+ | Field | Type | Required | Description |
493
+ |---|---|---|---|
494
+ | `path.provider` | `string` | yes | Provider: google_meet \| roam \| roam_auto \| whereby \| jitsi |
495
+ | `body` | `Body_connect_conferencing_appointments_conferencing_connect__provider__post` | no | Request body; fields below. |
496
+
497
+ Body fields (`Body_connect_conferencing_appointments_conferencing_connect__provider__post`):
498
+
499
+ | Field | Type | Required | Description |
500
+ |---|---|---|---|
501
+ | `body.link` | `string \| null` | no | |
502
+
503
+ **Returns** `Record<string, unknown>`.
504
+
505
+ **Example**
506
+
507
+ ```ts
508
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
509
+ const result = await g8.api.appointments.connectConferencing({ path: { provider: "example" } });
510
+ ```
511
+
512
+ ---
513
+
514
+ <a id="op-createbooking"></a>
515
+
516
+ ### `g8.api.appointments.createBooking(input)`
517
+
518
+ **Create a booking (charges credits + sends notifications)**
519
+
520
+ - HTTP: `POST /api/v1/appointments/bookings`
521
+ - operationId: `create_booking_appointments_bookings_post` (also callable as `g8.api.call("create_booking_appointments_bookings_post", input)`)
522
+ - 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
523
+ - API-key scope: `meetings:run`
524
+
525
+ Create (book) an appointment on behalf of the API key's user.
526
+
527
+ Reuses ``BookingsHandler.handle_create`` verbatim — same host selection,
528
+ conflict checks, credit charge (~20 credits), calendar push, attendee
529
+ notifications, and EDA emit as an in-app booking. Surfaces the handler's
530
+ 402 (insufficient credits) / 409 (slot conflict) / 404 (event type)
531
+ untouched.
532
+
533
+ **Input**
534
+
535
+ | Field | Type | Required | Description |
536
+ |---|---|---|---|
537
+ | `body` | `CreateBookingRequest` | yes | Request body; fields below. |
538
+
539
+ Body fields (`CreateBookingRequest`):
540
+
541
+ | Field | Type | Required | Description |
542
+ |---|---|---|---|
543
+ | `body.attendees` | `Array<AttendeeInput>` | yes | |
544
+ | `body.event_type_id` | `integer` | yes | |
545
+ | `body.start_time` | `string` | yes | |
546
+ | `body.end_time` | `string \| null` | no | |
547
+ | `body.guests` | `Array<string> \| null` | no | |
548
+ | `body.language` | `string` | no | default `"en"` |
549
+ | `body.location` | `string \| null` | no | |
550
+ | `body.metadata` | `Record<string, unknown> \| null` | no | |
551
+ | `body.override_availability` | `boolean` | no | default `false` |
552
+ | `body.recurring_event_id` | `string \| null` | no | |
553
+ | `body.responses` | `Record<string, unknown> \| null` | no | |
554
+ | `body.selected_conferencing` | `LocationItem \| null` | no | |
555
+ | `body.selected_location` | `LocationItem \| null` | no | |
556
+ | `body.slot_uid` | `string \| null` | no | |
557
+
558
+ **Returns** `Record<string, unknown>`.
559
+
560
+ **Example**
561
+
562
+ ```ts
563
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
564
+ const result = await g8.api.appointments.createBooking({
565
+ body: {
566
+ attendees: [{ email: "jane@acme.com", name: "Example" }],
567
+ event_type_id: 123,
568
+ start_time: "example",
569
+ },
570
+ });
571
+ ```
572
+
573
+ ---
574
+
575
+ <a id="op-createeventtype"></a>
576
+
577
+ ### `g8.api.appointments.createEventType(input)`
578
+
579
+ **Create a bookable event type**
580
+
581
+ - HTTP: `POST /api/v1/appointments/event-types`
582
+ - operationId: `create_event_type_appointments_event_types_post` (also callable as `g8.api.call("create_event_type_appointments_event_types_post", input)`)
583
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
584
+ - API-key scope: `meetings:write`
585
+
586
+ Create a new event type. Reuses ``EventTypesHandler.handle_create``
587
+ verbatim (slug uniqueness, host wiring, schedule attach), so the result is
588
+ identical to creating one in the app. ``slug`` must be unique within the org
589
+ (409 on collision); ``length`` is the meeting duration in minutes.
590
+
591
+ **Input**
592
+
593
+ | Field | Type | Required | Description |
594
+ |---|---|---|---|
595
+ | `body` | `CreateEventTypeRequest` | yes | Request body; fields below. |
596
+
597
+ Body fields (`CreateEventTypeRequest`):
598
+
599
+ | Field | Type | Required | Description |
600
+ |---|---|---|---|
601
+ | `body.length` | `integer` | yes | |
602
+ | `body.slug` | `string` | yes | |
603
+ | `body.title` | `string` | yes | |
604
+ | `body.after_event_buffer` | `integer` | no | default `0` |
605
+ | `body.before_event_buffer` | `integer` | no | default `0` |
606
+ | `body.booking_fields` | `Array<Record<string, unknown>> \| null` | no | |
607
+ | `body.default_layout` | `string \| null` | no | |
608
+ | `body.description` | `string \| null` | no | |
609
+ | `body.disable_cancelling` | `boolean` | no | default `false` |
610
+ | `body.disable_guests` | `boolean` | no | default `false` |
611
+ | `body.disable_rescheduling` | `boolean` | no | default `false` |
612
+ | `body.event_color` | `string \| null` | no | |
613
+ | `body.event_name` | `string \| null` | no | |
614
+ | `body.hidden` | `boolean` | no | default `false` |
615
+ | `body.initial_hosts` | `Array<Record<string, unknown>> \| null` | no | |
616
+ | `body.layouts` | `Array<string> \| null` | no | |
617
+ | `body.locations` | `Array<Record<string, unknown>> \| null` | no | |
618
+ | `body.metadata` | `Record<string, unknown> \| null` | no | |
619
+ | `body.minimum_booking_notice` | `integer` | no | default `120` |
620
+ | `body.period_days` | `integer \| null` | no | |
621
+ | `body.period_end_date` | `string \| null` | no | |
622
+ | `body.period_start_date` | `string \| null` | no | |
623
+ | `body.period_type` | `string` | no | default `"unlimited"` |
624
+ | `body.recurring_event` | `Record<string, unknown> \| null` | no | |
625
+ | `body.requires_confirmation` | `boolean` | no | default `false` |
626
+ | `body.schedule_id` | `integer \| null` | no | |
627
+ | `body.scheduling_type` | `string \| null` | no | |
628
+ | `body.seats_per_time_slot` | `integer \| null` | no | |
629
+ | `body.slot_interval` | `integer \| null` | no | |
630
+ | `body.success_redirect_url` | `string \| null` | no | |
631
+ | `body.time_zone` | `string \| null` | no | |
632
+ | `body.use_common_schedule` | `boolean \| null` | no | |
633
+
634
+ **Returns** `Record<string, unknown>`.
635
+
636
+ **Example**
637
+
638
+ ```ts
639
+ const result = await g8.api.appointments.createEventType({ body: { length: 1, slug: "example", title: "Example" } });
640
+ ```
641
+
642
+ ---
643
+
644
+ <a id="op-createeventtypehostgroup"></a>
645
+
646
+ ### `g8.api.appointments.createEventTypeHostGroup(input)`
647
+
648
+ **Create Event Type Host Group**
649
+
650
+ - HTTP: `POST /api/v1/appointments/event-types/{event_type_id}/host-groups`
651
+ - operationId: `create_event_type_host_group_appointments_event_types__event_type_id__host_groups_post` (also callable as `g8.api.call("create_event_type_host_group_appointments_event_types__event_type_id__host_groups_post", input)`)
652
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
653
+ - API-key scope: `meetings:write`
654
+
655
+ Create a host group. Assign hosts to it via `group_id` on a host.
656
+
657
+ **Input**
658
+
659
+ | Field | Type | Required | Description |
660
+ |---|---|---|---|
661
+ | `path.event_type_id` | `integer` | yes | Event type id. |
662
+ | `body` | `AppointmentHostGroupWriteRequest` | yes | Request body; fields below. |
663
+
664
+ Body fields (`AppointmentHostGroupWriteRequest`):
665
+
666
+ | Field | Type | Required | Description |
667
+ |---|---|---|---|
668
+ | `body.name` | `string` | yes | Group name. min length 1 |
669
+
670
+ **Returns** `ApiResponse_AppointmentHostGroup_`: the envelope `{ data: AppointmentHostGroup, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
671
+
672
+ Other envelope fields: `pagination` (PaginationMeta).
673
+
674
+ `AppointmentHostGroup` fields:
675
+
676
+ | Field | Type | Required | Description |
677
+ |---|---|---|---|
678
+ | `created_at` | `string (date-time) \| null` | no | |
679
+ | `event_type_id` | `integer \| null` | no | |
680
+ | `id` | `string \| null` | no | |
681
+ | `name` | `string \| null` | no | |
682
+
683
+ **Example**
684
+
685
+ ```ts
686
+ const result = await g8.api.appointments.createEventTypeHostGroup({ path: { event_type_id: 123 }, body: { name: "Example" } });
687
+ ```
688
+
689
+ ---
690
+
691
+ <a id="op-createooo"></a>
692
+
693
+ ### `g8.api.appointments.createOoo(input)`
694
+
695
+ **Create an out-of-office entry**
696
+
697
+ - HTTP: `POST /api/v1/appointments/out-of-office`
698
+ - operationId: `create_ooo_appointments_out_of_office_post` (also callable as `g8.api.call("create_ooo_appointments_out_of_office_post", input)`)
699
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
700
+ - API-key scope: `meetings:write`
701
+
702
+ Create an out-of-office entry for the calling user. While active, the
703
+ user's slots are blocked for booking. ``start`` and ``end`` may be local
704
+ calendar dates paired with ``time_zone`` or legacy ISO-8601 datetimes.
705
+ Optional ``to_user_id`` exposes an alternative teammate booking path.
706
+
707
+ **Input**
708
+
709
+ | Field | Type | Required | Description |
710
+ |---|---|---|---|
711
+ | `body` | `CreateOutOfOfficeRequest` | yes | Request body; fields below. |
712
+
713
+ Body fields (`CreateOutOfOfficeRequest`):
714
+
715
+ | Field | Type | Required | Description |
716
+ |---|---|---|---|
717
+ | `body.end` | `string` | yes | |
718
+ | `body.start` | `string` | yes | |
719
+ | `body.notes` | `string \| null` | no | |
720
+ | `body.public_note` | `string \| null` | no | |
721
+ | `body.reason` | `string \| null` | no | |
722
+ | `body.time_zone` | `string \| null` | no | |
723
+ | `body.to_user_id` | `integer \| null` | no | |
724
+ | `body.user_id` | `integer \| null` | no | |
725
+
726
+ **Returns** `Record<string, unknown>`.
727
+
728
+ **Example**
729
+
730
+ ```ts
731
+ const result = await g8.api.appointments.createOoo({ body: { end: "example", start: "example" } });
732
+ ```
733
+
734
+ ---
735
+
736
+ <a id="op-createroutingform"></a>
737
+
738
+ ### `g8.api.appointments.createRoutingForm(input)`
739
+
740
+ **Create a routing form**
741
+
742
+ - HTTP: `POST /api/v1/appointments/routing-forms`
743
+ - operationId: `create_routing_form_appointments_routing_forms_post` (also callable as `g8.api.call("create_routing_form_appointments_routing_forms_post", input)`)
744
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
745
+ - API-key scope: `meetings:write`
746
+
747
+ Create a new routing form with optional fields and routes.
748
+
749
+ Returns the created form including its generated slug. ``is_admin`` is
750
+ forced False so the form is owned by the API-key user.
751
+
752
+ **Input**
753
+
754
+ | Field | Type | Required | Description |
755
+ |---|---|---|---|
756
+ | `body` | `CreateRoutingFormRequest` | yes | Request body; fields below. |
757
+
758
+ Body fields (`CreateRoutingFormRequest`):
759
+
760
+ | Field | Type | Required | Description |
761
+ |---|---|---|---|
762
+ | `body.name` | `string` | yes | min length 1, max length 255 |
763
+ | `body.description` | `string \| null` | no | |
764
+ | `body.disabled` | `boolean` | no | default `false` |
765
+ | `body.fields` | `Array<RoutingFormField>` | no | |
766
+ | `body.routes` | `Array<RoutingFormRouteInput>` | no | |
767
+
768
+ **Returns** `Record<string, unknown>`.
769
+
770
+ **Example**
771
+
772
+ ```ts
773
+ const result = await g8.api.appointments.createRoutingForm({ body: { name: "Example" } });
774
+ ```
775
+
776
+ ---
777
+
778
+ <a id="op-createsavedfilter"></a>
779
+
780
+ ### `g8.api.appointments.createSavedFilter(input)`
781
+
782
+ **Create Saved Filter**
783
+
784
+ - HTTP: `POST /api/v1/appointments/saved-filters`
785
+ - operationId: `create_saved_filter_appointments_saved_filters_post` (also callable as `g8.api.call("create_saved_filter_appointments_saved_filters_post", input)`)
786
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
787
+ - API-key scope: `meetings:write`
788
+
789
+ Save a view. A second view with the same title is a 409.
790
+
791
+ `state` is the filter itself and is round-tripped as-is.
792
+
793
+ **Input**
794
+
795
+ | Field | Type | Required | Description |
796
+ |---|---|---|---|
797
+ | `body` | `CreateSavedFilterRequest` | yes | Request body; fields below. |
798
+
799
+ Body fields (`CreateSavedFilterRequest`):
800
+
801
+ | Field | Type | Required | Description |
802
+ |---|---|---|---|
803
+ | `body.title` | `string` | yes | min length 1, max length 120 |
804
+ | `body.description` | `string \| null` | no | max length 2000 |
805
+ | `body.state` | `Record<string, unknown>` | no | The filter itself. Opaque to this contract and round-tripped as-is. |
806
+
807
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
808
+
809
+ Other envelope fields: `pagination` (PaginationMeta).
810
+
811
+ **Example**
812
+
813
+ ```ts
814
+ const result = await g8.api.appointments.createSavedFilter({ body: { title: "Example" } });
815
+ ```
816
+
817
+ ---
818
+
819
+ <a id="op-createschedule"></a>
820
+
821
+ ### `g8.api.appointments.createSchedule(input)`
822
+
823
+ **Create an availability schedule**
824
+
825
+ - HTTP: `POST /api/v1/appointments/schedules`
826
+ - operationId: `create_schedule_appointments_schedules_post` (also callable as `g8.api.call("create_schedule_appointments_schedules_post", input)`)
827
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
828
+ - API-key scope: `meetings:write`
829
+
830
+ Create a named availability schedule with weekly rules and optional date overrides.
831
+
832
+ Defaults to Mon-Fri 09:00-17:00 when ``availability`` is omitted.
833
+ Pass ``is_default=True`` to immediately set this as the caller's default
834
+ schedule (persisted via ``update_appointment_settings``).
835
+
836
+ **Input**
837
+
838
+ | Field | Type | Required | Description |
839
+ |---|---|---|---|
840
+ | `body` | `CreateScheduleRequest` | yes | Request body; fields below. |
841
+
842
+ Body fields (`CreateScheduleRequest`):
843
+
844
+ | Field | Type | Required | Description |
845
+ |---|---|---|---|
846
+ | `body.name` | `string` | yes | |
847
+ | `body.time_zone` | `string` | yes | |
848
+ | `body.availability` | `Array<AvailabilityInput> \| null` | no | |
849
+ | `body.is_default` | `boolean` | no | default `false` |
850
+ | `body.overrides` | `Array<OverrideInput> \| null` | no | |
851
+
852
+ **Returns** `Record<string, unknown>`.
853
+
854
+ **Example**
855
+
856
+ ```ts
857
+ const result = await g8.api.appointments.createSchedule({ body: { name: "Example", time_zone: "example" } });
858
+ ```
859
+
860
+ ---
861
+
862
+ <a id="op-createworkflow"></a>
863
+
864
+ ### `g8.api.appointments.createWorkflow(input)`
865
+
866
+ **Create a workflow**
867
+
868
+ - HTTP: `POST /api/v1/appointments/workflows`
869
+ - operationId: `create_workflow_appointments_workflows_post` (also callable as `g8.api.call("create_workflow_appointments_workflows_post", input)`)
870
+ - 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
871
+ - API-key scope: `meetings:run`
872
+
873
+ Create a new workflow. Steps define the actions to take; event_type_ids
874
+ attaches the workflow to specific event types (omit or set ``is_active_on_all``
875
+ to apply org-wide). ``trigger`` must be one of: new_booking, before_event,
876
+ after_event, booking_cancelled, booking_rescheduled. Time-based triggers
877
+ (before_event / after_event) require ``time`` and ``time_unit``.
878
+
879
+ **Input**
880
+
881
+ | Field | Type | Required | Description |
882
+ |---|---|---|---|
883
+ | `body` | `CreateWorkflowRequest` | yes | Request body; fields below. |
884
+
885
+ Body fields (`CreateWorkflowRequest`):
886
+
887
+ | Field | Type | Required | Description |
888
+ |---|---|---|---|
889
+ | `body.name` | `string` | yes | min length 1, max length 255 |
890
+ | `body.steps` | `Array<WorkflowStepInput>` | yes | min items 1, max items 20 |
891
+ | `body.trigger` | `"new_booking" \| "before_event" \| "after_event" \| "booking_cancelled" \| "booking_rescheduled"` | yes | |
892
+ | `body.event_type_ids` | `Array<integer> \| null` | no | |
893
+ | `body.is_active_on_all` | `boolean` | no | default `false` |
894
+ | `body.time` | `integer \| null` | no | min 1 |
895
+ | `body.time_unit` | `"minutes" \| "hours" \| "days" \| null` | no | |
896
+
897
+ **Returns** `Record<string, unknown>`.
898
+
899
+ **Example**
900
+
901
+ ```ts
902
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
903
+ const result = await g8.api.appointments.createWorkflow({
904
+ body: {
905
+ name: "Example",
906
+ steps: [{ action: "email_host" }],
907
+ trigger: "new_booking",
908
+ },
909
+ });
910
+ ```
911
+
912
+ ---
913
+
914
+ <a id="op-deleteeventtype"></a>
915
+
916
+ ### `g8.api.appointments.deleteEventType(input)`
917
+
918
+ **Delete an event type**
919
+
920
+ - HTTP: `DELETE /api/v1/appointments/event-types/{event_type_id}`
921
+ - operationId: `delete_event_type_appointments_event_types__event_type_id__delete` (also callable as `g8.api.call("delete_event_type_appointments_event_types__event_type_id__delete", input)`)
922
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
923
+ - API-key scope: `meetings:delete`
924
+
925
+ Delete an event type. Reuses ``EventTypesHandler.handle_delete``.
926
+
927
+ ``EventTypePolicy.can_delete()`` is ADMIN-ONLY (Cal.com "team event delete =
928
+ admin only"; hosts cannot delete). So this requires the API key's user to
929
+ hold Admin/Owner in the org - resolved via ``_is_org_admin``. Member/Viewer
930
+ keys and org-scoped machine keys get a 403 from the handler. Returns
931
+ ``{data: {deleted: true, event_type_id}}`` on success.
932
+
933
+ **Input**
934
+
935
+ | Field | Type | Required | Description |
936
+ |---|---|---|---|
937
+ | `path.event_type_id` | `integer` | yes | Event-type integer ID. |
938
+
939
+ **Returns** `Record<string, unknown>`.
940
+
941
+ **Example**
942
+
943
+ ```ts
944
+ // destructive: deletes or archives data; confirm with a human before calling.
945
+ const result = await g8.api.appointments.deleteEventType({ path: { event_type_id: 1 } });
946
+ ```
947
+
948
+ ---
949
+
950
+ <a id="op-deleteeventtypehostgroup"></a>
951
+
952
+ ### `g8.api.appointments.deleteEventTypeHostGroup(input)`
953
+
954
+ **Delete Event Type Host Group**
955
+
956
+ - HTTP: `DELETE /api/v1/appointments/event-types/{event_type_id}/host-groups/{group_id}`
957
+ - operationId: `delete_event_type_host_group_appointments_event_types__event_type_id__host_groups__group_id__delete` (also callable as `g8.api.call("delete_event_type_host_group_appointments_event_types__event_type_id__host_groups__group_id__delete", input)`)
958
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
959
+ - API-key scope: `meetings:delete`
960
+
961
+ Delete a host group. The hosts in it are NOT removed from the event
962
+ type - they become ungrouped.
963
+
964
+ **Input**
965
+
966
+ | Field | Type | Required | Description |
967
+ |---|---|---|---|
968
+ | `path.event_type_id` | `integer` | yes | Event type id. |
969
+ | `path.group_id` | `string` | yes | Host group id. |
970
+
971
+ **Returns**: no JSON body is declared for the success response.
972
+
973
+ **Example**
974
+
975
+ ```ts
976
+ // destructive: deletes or archives data; confirm with a human before calling.
977
+ const result = await g8.api.appointments.deleteEventTypeHostGroup({ path: { event_type_id: 123, group_id: "id" } });
978
+ ```
979
+
980
+ ---
981
+
982
+ <a id="op-deleteooo"></a>
983
+
984
+ ### `g8.api.appointments.deleteOoo(input)`
985
+
986
+ **Delete an out-of-office entry**
987
+
988
+ - HTTP: `DELETE /api/v1/appointments/out-of-office/{ooo_uuid}`
989
+ - operationId: `delete_ooo_appointments_out_of_office__ooo_uuid__delete` (also callable as `g8.api.call("delete_ooo_appointments_out_of_office__ooo_uuid__delete", input)`)
990
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
991
+ - API-key scope: `meetings:delete`
992
+
993
+ Delete an out-of-office entry. Only the owner may delete their own
994
+ entry (API keys force ``is_admin=False``). Returns
995
+ ``{data: {deleted: true, ooo_uuid}}`` on success.
996
+
997
+ **Input**
998
+
999
+ | Field | Type | Required | Description |
1000
+ |---|---|---|---|
1001
+ | `path.ooo_uuid` | `string` | yes | UUID of the out-of-office entry to delete. |
1002
+
1003
+ **Returns** `Record<string, unknown>`.
1004
+
1005
+ **Example**
1006
+
1007
+ ```ts
1008
+ // destructive: deletes or archives data; confirm with a human before calling.
1009
+ const result = await g8.api.appointments.deleteOoo({ path: { ooo_uuid: "00000000-0000-0000-0000-000000000000" } });
1010
+ ```
1011
+
1012
+ ---
1013
+
1014
+ <a id="op-deleteroutingform"></a>
1015
+
1016
+ ### `g8.api.appointments.deleteRoutingForm(input)`
1017
+
1018
+ **Delete a routing form (cascades fields and routes)**
1019
+
1020
+ - HTTP: `DELETE /api/v1/appointments/routing-forms/{form_id}`
1021
+ - operationId: `delete_routing_form_appointments_routing_forms__form_id__delete` (also callable as `g8.api.call("delete_routing_form_appointments_routing_forms__form_id__delete", input)`)
1022
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
1023
+ - API-key scope: `meetings:delete`
1024
+
1025
+ Delete a routing form permanently. Cascades to its fields and routes.
1026
+
1027
+ Returns 404 when the form does not exist or belongs to another user.
1028
+
1029
+ **Input**
1030
+
1031
+ | Field | Type | Required | Description |
1032
+ |---|---|---|---|
1033
+ | `path.form_id` | `integer` | yes | Routing form integer ID. |
1034
+
1035
+ **Returns** `Record<string, unknown>`.
1036
+
1037
+ **Example**
1038
+
1039
+ ```ts
1040
+ // destructive: deletes or archives data; confirm with a human before calling.
1041
+ const result = await g8.api.appointments.deleteRoutingForm({ path: { form_id: 1 } });
1042
+ ```
1043
+
1044
+ ---
1045
+
1046
+ <a id="op-deletesavedfilter"></a>
1047
+
1048
+ ### `g8.api.appointments.deleteSavedFilter(input)`
1049
+
1050
+ **Delete Saved Filter**
1051
+
1052
+ - HTTP: `DELETE /api/v1/appointments/saved-filters/{filter_id}`
1053
+ - operationId: `delete_saved_filter_appointments_saved_filters__filter_id__delete` (also callable as `g8.api.call("delete_saved_filter_appointments_saved_filters__filter_id__delete", input)`)
1054
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
1055
+ - API-key scope: `meetings:delete`
1056
+
1057
+ Delete a saved view. The bookings it selected are untouched.
1058
+
1059
+ Always a success, whether or not the id existed - the app does not
1060
+ disclose which filters exist, and this does not either.
1061
+
1062
+ **Input**
1063
+
1064
+ | Field | Type | Required | Description |
1065
+ |---|---|---|---|
1066
+ | `path.filter_id` | `string` | yes | Filter id (UUID). |
1067
+
1068
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1069
+
1070
+ Other envelope fields: `pagination` (PaginationMeta).
1071
+
1072
+ **Example**
1073
+
1074
+ ```ts
1075
+ // destructive: deletes or archives data; confirm with a human before calling.
1076
+ const result = await g8.api.appointments.deleteSavedFilter({ path: { filter_id: "id" } });
1077
+ ```
1078
+
1079
+ ---
1080
+
1081
+ <a id="op-deleteschedule"></a>
1082
+
1083
+ ### `g8.api.appointments.deleteSchedule(input)`
1084
+
1085
+ **Delete a schedule**
1086
+
1087
+ - HTTP: `DELETE /api/v1/appointments/schedules/{schedule_id}`
1088
+ - operationId: `delete_schedule_appointments_schedules__schedule_id__delete` (also callable as `g8.api.call("delete_schedule_appointments_schedules__schedule_id__delete", input)`)
1089
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
1090
+ - API-key scope: `meetings:delete`
1091
+
1092
+ Delete a schedule. Returns 409 when this is the caller's last schedule
1093
+ (mirroring the in-app guard - every user must retain at least one schedule).
1094
+ Returns 404 when the schedule does not exist or belongs to another user.
1095
+
1096
+ **Input**
1097
+
1098
+ | Field | Type | Required | Description |
1099
+ |---|---|---|---|
1100
+ | `path.schedule_id` | `integer` | yes | Schedule integer ID. |
1101
+
1102
+ **Returns** `Record<string, unknown>`.
1103
+
1104
+ **Example**
1105
+
1106
+ ```ts
1107
+ // destructive: deletes or archives data; confirm with a human before calling.
1108
+ const result = await g8.api.appointments.deleteSchedule({ path: { schedule_id: 1 } });
1109
+ ```
1110
+
1111
+ ---
1112
+
1113
+ <a id="op-deleteworkflow"></a>
1114
+
1115
+ ### `g8.api.appointments.deleteWorkflow(input)`
1116
+
1117
+ **Delete a workflow and cancel pending reminders**
1118
+
1119
+ - HTTP: `DELETE /api/v1/appointments/workflows/{workflow_id}`
1120
+ - operationId: `delete_workflow_appointments_workflows__workflow_id__delete` (also callable as `g8.api.call("delete_workflow_appointments_workflows__workflow_id__delete", input)`)
1121
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
1122
+ - API-key scope: `meetings:delete`
1123
+
1124
+ Delete a workflow and cancel any pending reminder rows created by it.
1125
+ Mirrors the in-app router: ``cancel_workflow_reminders`` is called BEFORE
1126
+ ``delete_workflow`` so reminder FK constraints are satisfied and scheduled
1127
+ worker jobs for this workflow never fire after deletion.
1128
+
1129
+ **Input**
1130
+
1131
+ | Field | Type | Required | Description |
1132
+ |---|---|---|---|
1133
+ | `path.workflow_id` | `integer` | yes | Workflow integer ID. |
1134
+
1135
+ **Returns**: no JSON body is declared for the success response.
1136
+
1137
+ **Example**
1138
+
1139
+ ```ts
1140
+ // destructive: deletes or archives data; confirm with a human before calling.
1141
+ const result = await g8.api.appointments.deleteWorkflow({ path: { workflow_id: 1 } });
1142
+ ```
1143
+
1144
+ ---
1145
+
1146
+ <a id="op-deselectcalendar"></a>
1147
+
1148
+ ### `g8.api.appointments.deselectCalendar(input)`
1149
+
1150
+ **Deselect a sub-calendar from conflict checking**
1151
+
1152
+ - HTTP: `DELETE /api/v1/appointments/calendars/selected`
1153
+ - operationId: `deselect_calendar_appointments_calendars_selected_delete` (also callable as `g8.api.call("deselect_calendar_appointments_calendars_selected_delete", input)`)
1154
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
1155
+ - API-key scope: `meetings:delete`
1156
+
1157
+ Remove a sub-calendar from the caller's conflict-checking set.
1158
+ Reuses the in-app deselect_calendar logic (delete_selected_calendar).
1159
+
1160
+ **Input**
1161
+
1162
+ | Field | Type | Required | Description |
1163
+ |---|---|---|---|
1164
+ | `query.credential_id` | `integer` | yes | |
1165
+ | `query.integration` | `string` | yes | |
1166
+ | `query.external_id` | `string` | yes | |
1167
+
1168
+ **Returns**: no JSON body is declared for the success response.
1169
+
1170
+ **Example**
1171
+
1172
+ ```ts
1173
+ // destructive: deletes or archives data; confirm with a human before calling.
1174
+ const result = await g8.api.appointments.deselectCalendar({
1175
+ query: { credential_id: 123, integration: "example", external_id: "id" },
1176
+ });
1177
+ ```
1178
+
1179
+ ---
1180
+
1181
+ <a id="op-disconnectcalendar"></a>
1182
+
1183
+ ### `g8.api.appointments.disconnectCalendar(input)`
1184
+
1185
+ **Disconnect a calendar account**
1186
+
1187
+ - HTTP: `DELETE /api/v1/appointments/calendars/{credential_id}`
1188
+ - operationId: `disconnect_calendar_appointments_calendars__credential_id__delete` (also callable as `g8.api.call("disconnect_calendar_appointments_calendars__credential_id__delete", input)`)
1189
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
1190
+ - API-key scope: `meetings:delete`
1191
+
1192
+ Disconnect a calendar account with best-effort token revocation.
1193
+ Reuses the in-app disconnect_calendar logic (revoke + delete credential +
1194
+ clean up destination calendar rows pointing at the removed credential).
1195
+ Raises 404 when not found; 403 when it belongs to a different user.
1196
+
1197
+ **Input**
1198
+
1199
+ | Field | Type | Required | Description |
1200
+ |---|---|---|---|
1201
+ | `path.credential_id` | `integer` | yes | |
1202
+
1203
+ **Returns**: no JSON body is declared for the success response.
1204
+
1205
+ **Example**
1206
+
1207
+ ```ts
1208
+ // destructive: deletes or archives data; confirm with a human before calling.
1209
+ const result = await g8.api.appointments.disconnectCalendar({ path: { credential_id: 123 } });
1210
+ ```
1211
+
1212
+ ---
1213
+
1214
+ <a id="op-disconnectconferencing"></a>
1215
+
1216
+ ### `g8.api.appointments.disconnectConferencing(input)`
1217
+
1218
+ **Disconnect a conferencing provider**
1219
+
1220
+ - HTTP: `DELETE /api/v1/appointments/conferencing/{provider}/disconnect`
1221
+ - operationId: `disconnect_conferencing_appointments_conferencing__provider__disconnect_delete` (also callable as `g8.api.call("disconnect_conferencing_appointments_conferencing__provider__disconnect_delete", input)`)
1222
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
1223
+ - API-key scope: `meetings:delete`
1224
+
1225
+ Disconnect a conferencing provider. For real-credential providers
1226
+ (zoom, roam, whereby, jitsi, office365_video, roam_auto) this deletes
1227
+ the matching credentials row. Google Meet is special: it is a synthetic
1228
+ provider - disconnect sets google_meet_suppressed and clears the default
1229
+ if it pointed at Meet. Reuses the in-app disconnect_conferencing logic.
1230
+
1231
+ **Input**
1232
+
1233
+ | Field | Type | Required | Description |
1234
+ |---|---|---|---|
1235
+ | `path.provider` | `string` | yes | |
1236
+
1237
+ **Returns**: no JSON body is declared for the success response.
1238
+
1239
+ **Example**
1240
+
1241
+ ```ts
1242
+ // destructive: deletes or archives data; confirm with a human before calling.
1243
+ const result = await g8.api.appointments.disconnectConferencing({ path: { provider: "example" } });
1244
+ ```
1245
+
1246
+ ---
1247
+
1248
+ <a id="op-duplicateeventtype"></a>
1249
+
1250
+ ### `g8.api.appointments.duplicateEventType(input)`
1251
+
1252
+ **Duplicate an event type (with a '-copy' slug)**
1253
+
1254
+ - HTTP: `POST /api/v1/appointments/event-types/{event_type_id}/duplicate`
1255
+ - operationId: `duplicate_event_type_appointments_event_types__event_type_id__duplicate_post` (also callable as `g8.api.call("duplicate_event_type_appointments_event_types__event_type_id__duplicate_post", input)`)
1256
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
1257
+ - API-key scope: `meetings:write`
1258
+
1259
+ Duplicate an event type, generating a unique ``{slug}-copy`` slug and
1260
+ copying its hosts. Mirrors the in-app duplicate path (repo-direct, no
1261
+ handler) using the shared appointments helpers; ``is_admin`` is forced False
1262
+ so a host (or the owner) can duplicate, matching ``EventTypePolicy``.
1263
+
1264
+ **Input**
1265
+
1266
+ | Field | Type | Required | Description |
1267
+ |---|---|---|---|
1268
+ | `path.event_type_id` | `integer` | yes | Source event-type integer ID. |
1269
+
1270
+ **Returns** `Record<string, unknown>`.
1271
+
1272
+ **Example**
1273
+
1274
+ ```ts
1275
+ const result = await g8.api.appointments.duplicateEventType({ path: { event_type_id: 1 } });
1276
+ ```
1277
+
1278
+ ---
1279
+
1280
+ <a id="op-duplicateroutingform"></a>
1281
+
1282
+ ### `g8.api.appointments.duplicateRoutingForm(input)`
1283
+
1284
+ **Duplicate a routing form (copy with all fields and routes)**
1285
+
1286
+ - HTTP: `POST /api/v1/appointments/routing-forms/{form_id}/duplicate`
1287
+ - operationId: `duplicate_routing_form_appointments_routing_forms__form_id__duplicate_post` (also callable as `g8.api.call("duplicate_routing_form_appointments_routing_forms__form_id__duplicate_post", input)`)
1288
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
1289
+ - API-key scope: `meetings:write`
1290
+
1291
+ Duplicate a routing form. Creates a copy named "{name} (copy)" with
1292
+ a unique slug, copying all fields and routes verbatim.
1293
+
1294
+ **Input**
1295
+
1296
+ | Field | Type | Required | Description |
1297
+ |---|---|---|---|
1298
+ | `path.form_id` | `integer` | yes | Source routing form integer ID. |
1299
+
1300
+ **Returns** `Record<string, unknown>`.
1301
+
1302
+ **Example**
1303
+
1304
+ ```ts
1305
+ const result = await g8.api.appointments.duplicateRoutingForm({ path: { form_id: 1 } });
1306
+ ```
1307
+
1308
+ ---
1309
+
1310
+ <a id="op-exportbookinginsights"></a>
1311
+
1312
+ ### `g8.api.appointments.exportBookingInsights(input?)`
1313
+
1314
+ **Export Booking Insights**
1315
+
1316
+ - HTTP: `GET /api/v1/appointments/bookings/insights/export`
1317
+ - operationId: `export_booking_insights_appointments_bookings_insights_export_get` (also callable as `g8.api.call("export_booking_insights_appointments_bookings_insights_export_get", input)`)
1318
+ - Tier: `read`: reads data; safe to call and to retry
1319
+ - API-key scope: `meetings:read`
1320
+
1321
+ The bookings behind `GET /appointments/bookings/insights`, one row each, as CSV.
1322
+
1323
+ An Admin key sees the team (or `member_user_id`'s); anyone else sees their
1324
+ own bookings only - the same split the insights read makes.
1325
+
1326
+ **Input**
1327
+
1328
+ | Field | Type | Required | Description |
1329
+ |---|---|---|---|
1330
+ | `query.date_from` | `string \| null` | no | ISO date. Omit for all time. |
1331
+ | `query.date_to` | `string \| null` | no | ISO date. Omit for all time. |
1332
+ | `query.event_type_ids` | `string \| null` | no | CSV of INTEGER event type ids. Checked here because the app splits and `int()`s it unguarded. |
1333
+ | `query.member_user_id` | `integer \| null` | no | One member's bookings. Honoured for Admin keys only. |
1334
+
1335
+ **Returns** `ApiResponse_CsvExportPayload_`: the envelope `{ data: CsvExportPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1336
+
1337
+ Other envelope fields: `pagination` (PaginationMeta).
1338
+
1339
+ `CsvExportPayload` fields:
1340
+
1341
+ | Field | Type | Required | Description |
1342
+ |---|---|---|---|
1343
+ | `csv` | `string` | yes | The full CSV document, header row first. |
1344
+ | `filename` | `string` | yes | |
1345
+ | `content_type` | `"text/csv"` | no | default `"text/csv"` |
1346
+
1347
+ **Example**
1348
+
1349
+ ```ts
1350
+ const result = await g8.api.appointments.exportBookingInsights();
1351
+ ```
1352
+
1353
+ ---
1354
+
1355
+ <a id="op-exportroutingformresponses"></a>
1356
+
1357
+ ### `g8.api.appointments.exportRoutingFormResponses(input)`
1358
+
1359
+ **Export Routing Form Responses**
1360
+
1361
+ - HTTP: `GET /api/v1/appointments/routing-forms/{form_id}/responses/export`
1362
+ - operationId: `export_routing_form_responses_appointments_routing_forms__form_id__responses_export_get` (also callable as `g8.api.call("export_routing_form_responses_appointments_routing_forms__form_id__responses_export_get", input)`)
1363
+ - Tier: `read`: reads data; safe to call and to retry
1364
+ - API-key scope: `meetings:read`
1365
+
1366
+ Every response to a routing form, as CSV - one column per field.
1367
+
1368
+ The paged JSON read is `GET /appointments/routing-forms/{id}/responses`.
1369
+ Capped at the app's 10,000 most recent responses. A form you cannot see
1370
+ is a 404, not a 403, so its existence is not disclosed.
1371
+
1372
+ **Input**
1373
+
1374
+ | Field | Type | Required | Description |
1375
+ |---|---|---|---|
1376
+ | `path.form_id` | `integer` | yes | Routing form id. |
1377
+
1378
+ **Returns** `ApiResponse_CsvExportPayload_`: the envelope `{ data: CsvExportPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1379
+
1380
+ Other envelope fields: `pagination` (PaginationMeta).
1381
+
1382
+ `CsvExportPayload` fields:
1383
+
1384
+ | Field | Type | Required | Description |
1385
+ |---|---|---|---|
1386
+ | `csv` | `string` | yes | The full CSV document, header row first. |
1387
+ | `filename` | `string` | yes | |
1388
+ | `content_type` | `"text/csv"` | no | default `"text/csv"` |
1389
+
1390
+ **Example**
1391
+
1392
+ ```ts
1393
+ const result = await g8.api.appointments.exportRoutingFormResponses({ path: { form_id: 123 } });
1394
+ ```
1395
+
1396
+ ---
1397
+
1398
+ <a id="op-getavailability"></a>
1399
+
1400
+ ### `g8.api.appointments.getAvailability(input)`
1401
+
1402
+ **Get availability rules and overrides for a schedule**
1403
+
1404
+ - HTTP: `GET /api/v1/appointments/schedules/{schedule_id}/availability`
1405
+ - operationId: `get_availability_appointments_schedules__schedule_id__availability_get` (also callable as `g8.api.call("get_availability_appointments_schedules__schedule_id__availability_get", input)`)
1406
+ - Tier: `read`: reads data; safe to call and to retry
1407
+ - API-key scope: `meetings:read`
1408
+
1409
+ Return the weekly recurring availability rules and date-specific overrides
1410
+ for the given schedule. Availability entries without a ``date`` are weekly
1411
+ rules; entries with a ``date`` are one-time overrides for that calendar day.
1412
+
1413
+ **Input**
1414
+
1415
+ | Field | Type | Required | Description |
1416
+ |---|---|---|---|
1417
+ | `path.schedule_id` | `integer` | yes | Schedule integer ID. |
1418
+
1419
+ **Returns** `Record<string, unknown>`.
1420
+
1421
+ **Example**
1422
+
1423
+ ```ts
1424
+ const result = await g8.api.appointments.getAvailability({ path: { schedule_id: 1 } });
1425
+ ```
1426
+
1427
+ ---
1428
+
1429
+ <a id="op-getavailableslots"></a>
1430
+
1431
+ ### `g8.api.appointments.getAvailableSlots(input)`
1432
+
1433
+ **Get Available Slots**
1434
+
1435
+ - HTTP: `GET /api/v1/appointments/slots`
1436
+ - operationId: `get_available_slots_appointments_slots_get` (also callable as `g8.api.call("get_available_slots_appointments_slots_get", input)`)
1437
+ - Tier: `read`: reads data; safe to call and to retry
1438
+ - API-key scope: `meetings:read`
1439
+
1440
+ The bookable times for an event type, grouped by date under `slots`.
1441
+
1442
+ The AUTHENTICATED slots read - the unauthenticated one a prospect's browser
1443
+ calls is deliberately not published (see the module docstring).
1444
+
1445
+ **Input**
1446
+
1447
+ | Field | Type | Required | Description |
1448
+ |---|---|---|---|
1449
+ | `query.event_type_id` | `integer` | yes | Event type to compute slots for. |
1450
+ | `query.start` | `string` | yes | Window start, ISO-8601. A bare date is read as UTC. |
1451
+ | `query.end` | `string` | yes | Window end, ISO-8601. At most 60 days after `start`. |
1452
+ | `query.time_zone` | `string \| null` | no | IANA timezone to express the slots in. |
1453
+ | `query.duration` | `integer \| null` | no | Minutes, for a multi-duration event type. Omit for its own length. |
1454
+
1455
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1456
+
1457
+ Other envelope fields: `pagination` (PaginationMeta).
1458
+
1459
+ **Example**
1460
+
1461
+ ```ts
1462
+ const result = await g8.api.appointments.getAvailableSlots({ query: { event_type_id: 123, start: "example", end: "example" } });
1463
+ ```
1464
+
1465
+ ---
1466
+
1467
+ <a id="op-getbooking"></a>
1468
+
1469
+ ### `g8.api.appointments.getBooking(input)`
1470
+
1471
+ **Get a single booking by UID**
1472
+
1473
+ - HTTP: `GET /api/v1/appointments/bookings/{booking_uid}`
1474
+ - operationId: `get_booking_appointments_bookings__booking_uid__get` (also callable as `g8.api.call("get_booking_appointments_bookings__booking_uid__get", input)`)
1475
+ - Tier: `read`: reads data; safe to call and to retry
1476
+ - API-key scope: `meetings:read`
1477
+
1478
+ Return the full booking detail (attendees, references, meeting_url,
1479
+ responses, internal notes). Backed by ``BookingsHandler.handle_get``;
1480
+ raises 404 when the UID isn't visible to the caller.
1481
+
1482
+ **Input**
1483
+
1484
+ | Field | Type | Required | Description |
1485
+ |---|---|---|---|
1486
+ | `path.booking_uid` | `string` | yes | Booking UID (uuid string). |
1487
+
1488
+ **Returns** `Record<string, unknown>`.
1489
+
1490
+ **Example**
1491
+
1492
+ ```ts
1493
+ const result = await g8.api.appointments.getBooking({ path: { booking_uid: "example" } });
1494
+ ```
1495
+
1496
+ ---
1497
+
1498
+ <a id="op-getbookinginsights"></a>
1499
+
1500
+ ### `g8.api.appointments.getBookingInsights(input?)`
1501
+
1502
+ **Get aggregated booking insights**
1503
+
1504
+ - HTTP: `GET /api/v1/appointments/bookings/insights`
1505
+ - operationId: `get_booking_insights_appointments_bookings_insights_get` (also callable as `g8.api.call("get_booking_insights_appointments_bookings_insights_get", input)`)
1506
+ - Tier: `read`: reads data; safe to call and to retry
1507
+ - API-key scope: `meetings:read`
1508
+
1509
+ Return aggregated booking insights for the caller's org.
1510
+
1511
+ Covers booking counts, show/no-show rates, and per-event-type breakdowns
1512
+ for the given date window. Backed by ``BookingsHandler.handle_insights``
1513
+ (same handler as the in-app insights view). ``is_admin`` is forced False
1514
+ so the caller sees only their own data. The in-app ``member_user_id`` filter
1515
+ is intentionally NOT exposed: it is an admin-only knob and an API key never
1516
+ holds admin, so the handler would ignore it anyway - omitting it from the
1517
+ route signature avoids the misleading "forwarded but ignored" surface.
1518
+
1519
+ **Input**
1520
+
1521
+ | Field | Type | Required | Description |
1522
+ |---|---|---|---|
1523
+ | `query.date_from` | `string \| null` | no | ISO date string for range start (e.g. '2026-01-01'). |
1524
+ | `query.date_to` | `string \| null` | no | ISO date string for range end (e.g. '2026-12-31'). |
1525
+ | `query.event_type_ids` | `string \| null` | no | Comma-separated event-type IDs to filter by. |
1526
+
1527
+ **Returns** `Record<string, unknown>`.
1528
+
1529
+ **Example**
1530
+
1531
+ ```ts
1532
+ const result = await g8.api.appointments.getBookingInsights();
1533
+ ```
1534
+
1535
+ ---
1536
+
1537
+ <a id="op-getdefaultconferencing"></a>
1538
+
1539
+ ### `g8.api.appointments.getDefaultConferencing(input?)`
1540
+
1541
+ **Get the current default conferencing provider**
1542
+
1543
+ - HTTP: `GET /api/v1/appointments/conferencing/default`
1544
+ - operationId: `get_default_conferencing_appointments_conferencing_default_get` (also callable as `g8.api.call("get_default_conferencing_appointments_conferencing_default_get", input)`)
1545
+ - Tier: `read`: reads data; safe to call and to retry
1546
+ - API-key scope: `meetings:read`
1547
+
1548
+ Get the default conferencing provider. Returns provider, credential_id,
1549
+ and link. Returns ``{data: {provider: null}}`` when none is configured.
1550
+ Reuses the in-app get_default_conferencing logic.
1551
+
1552
+ **Input**: none.
1553
+
1554
+ **Returns** `DefaultConferencingEnvelope`: the envelope `{ data: DefaultConferencingResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1555
+
1556
+ `DefaultConferencingResponse` fields:
1557
+
1558
+ | Field | Type | Required | Description |
1559
+ |---|---|---|---|
1560
+ | `credential_id` | `integer \| null` | no | |
1561
+ | `link` | `string \| null` | no | |
1562
+ | `provider` | `string \| null` | no | |
1563
+
1564
+ **Example**
1565
+
1566
+ ```ts
1567
+ const result = await g8.api.appointments.getDefaultConferencing();
1568
+ ```
1569
+
1570
+ ---
1571
+
1572
+ <a id="op-getdestinationcalendar"></a>
1573
+
1574
+ ### `g8.api.appointments.getDestinationCalendar(input?)`
1575
+
1576
+ **Get the destination calendar (with event-type fallback)**
1577
+
1578
+ - HTTP: `GET /api/v1/appointments/calendars/destination`
1579
+ - operationId: `get_destination_calendar_appointments_calendars_destination_get` (also callable as `g8.api.call("get_destination_calendar_appointments_calendars_destination_get", input)`)
1580
+ - Tier: `read`: reads data; safe to call and to retry
1581
+ - API-key scope: `meetings:read`
1582
+
1583
+ Get the destination calendar for the caller. When ``event_type_id`` is
1584
+ provided, returns the event-type-specific override if one exists, falling
1585
+ back to the user-level default. Returns ``{data: null}`` when none is set.
1586
+ Reuses the in-app get_destination_calendar logic.
1587
+
1588
+ **Input**
1589
+
1590
+ | Field | Type | Required | Description |
1591
+ |---|---|---|---|
1592
+ | `query.event_type_id` | `integer \| null` | no | |
1593
+
1594
+ **Returns** `DestinationCalendarEnvelope`: the envelope `{ data: DestinationCalendarResponse | null, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1595
+
1596
+ `data` fields:
1597
+
1598
+ | Field | Type | Required | Description |
1599
+ |---|---|---|---|
1600
+ | `external_id` | `string` | yes | |
1601
+ | `id` | `integer` | yes | |
1602
+ | `integration` | `string` | yes | |
1603
+ | `credential_id` | `integer \| null` | no | |
1604
+ | `event_type_id` | `integer \| null` | no | |
1605
+ | `primary_email` | `string \| null` | no | |
1606
+
1607
+ **Example**
1608
+
1609
+ ```ts
1610
+ const result = await g8.api.appointments.getDestinationCalendar();
1611
+ ```
1612
+
1613
+ ---
1614
+
1615
+ <a id="op-getembedconfig"></a>
1616
+
1617
+ ### `g8.api.appointments.getEmbedConfig(input)`
1618
+
1619
+ **Get Embed Config**
1620
+
1621
+ - HTTP: `GET /api/v1/appointments/event-types/{event_type_id}/embed`
1622
+ - operationId: `get_embed_config_appointments_event_types__event_type_id__embed_get` (also callable as `g8.api.call("get_embed_config_appointments_event_types__event_type_id__embed_get", input)`)
1623
+ - Tier: `read`: reads data; safe to call and to retry
1624
+ - API-key scope: `meetings:read`
1625
+
1626
+ How the embedded booking widget for this event type is styled.
1627
+
1628
+ Hosts of the event type and Admin keys only.
1629
+
1630
+ **Input**
1631
+
1632
+ | Field | Type | Required | Description |
1633
+ |---|---|---|---|
1634
+ | `path.event_type_id` | `integer` | yes | Event type id. |
1635
+
1636
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1637
+
1638
+ Other envelope fields: `pagination` (PaginationMeta).
1639
+
1640
+ **Example**
1641
+
1642
+ ```ts
1643
+ const result = await g8.api.appointments.getEmbedConfig({ path: { event_type_id: 123 } });
1644
+ ```
1645
+
1646
+ ---
1647
+
1648
+ <a id="op-geteventtype"></a>
1649
+
1650
+ ### `g8.api.appointments.getEventType(input)`
1651
+
1652
+ **Get full detail for one bookable event type**
1653
+
1654
+ - HTTP: `GET /api/v1/appointments/event-types/{event_type_id}`
1655
+ - operationId: `get_event_type_appointments_event_types__event_type_id__get` (also callable as `g8.api.call("get_event_type_appointments_event_types__event_type_id__get", input)`)
1656
+ - Tier: `read`: reads data; safe to call and to retry
1657
+ - API-key scope: `meetings:read`
1658
+
1659
+ Return the full event-type record (booking fields, locations, hosts,
1660
+ schedule, buffers, notice) — everything an agent needs before booking a
1661
+ slot. Backed by ``EventTypesHandler.handle_get`` (same handler as the
1662
+ in-app event-type detail view). Raises 404 when the id doesn't exist in
1663
+ this org.
1664
+
1665
+ **Input**
1666
+
1667
+ | Field | Type | Required | Description |
1668
+ |---|---|---|---|
1669
+ | `path.event_type_id` | `integer` | yes | Event-type integer ID. |
1670
+
1671
+ **Returns** `Record<string, unknown>`.
1672
+
1673
+ **Example**
1674
+
1675
+ ```ts
1676
+ const result = await g8.api.appointments.getEventType({ path: { event_type_id: 1 } });
1677
+ ```
1678
+
1679
+ ---
1680
+
1681
+ <a id="op-geteventtypedestinationcalendar"></a>
1682
+
1683
+ ### `g8.api.appointments.getEventTypeDestinationCalendar(input)`
1684
+
1685
+ **Get Event Type Destination Calendar**
1686
+
1687
+ - HTTP: `GET /api/v1/appointments/event-types/{event_type_id}/destination-calendar`
1688
+ - operationId: `get_event_type_destination_calendar_appointments_event_types__event_type_id__destination_calendar_get` (also callable as `g8.api.call("get_event_type_destination_calendar_appointments_event_types__event_type_id__destination_calendar_get", input)`)
1689
+ - Tier: `read`: reads data; safe to call and to retry
1690
+ - API-key scope: `meetings:read`
1691
+
1692
+ Where bookings for THIS event type are written.
1693
+
1694
+ The per-event-type OVERRIDE of `GET /appointments/calendars/destination`.
1695
+ Null fields mean no override is set and the account default applies.
1696
+
1697
+ **Input**
1698
+
1699
+ | Field | Type | Required | Description |
1700
+ |---|---|---|---|
1701
+ | `path.event_type_id` | `integer` | yes | Event type id. |
1702
+
1703
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1704
+
1705
+ Other envelope fields: `pagination` (PaginationMeta).
1706
+
1707
+ **Example**
1708
+
1709
+ ```ts
1710
+ const result = await g8.api.appointments.getEventTypeDestinationCalendar({ path: { event_type_id: 123 } });
1711
+ ```
1712
+
1713
+ ---
1714
+
1715
+ <a id="op-geteventtypeselectedcalendars"></a>
1716
+
1717
+ ### `g8.api.appointments.getEventTypeSelectedCalendars(input)`
1718
+
1719
+ **Get Event Type Selected Calendars**
1720
+
1721
+ - HTTP: `GET /api/v1/appointments/event-types/{event_type_id}/selected-calendars`
1722
+ - operationId: `get_event_type_selected_calendars_appointments_event_types__event_type_id__selected_calendars_get` (also callable as `g8.api.call("get_event_type_selected_calendars_appointments_event_types__event_type_id__selected_calendars_get", input)`)
1723
+ - Tier: `read`: reads data; safe to call and to retry
1724
+ - API-key scope: `meetings:read`
1725
+
1726
+ Which calendars are checked for conflicts on this event type.
1727
+
1728
+ The read to reach for when a slot was offered that should not have been:
1729
+ a calendar missing from here is a calendar nobody checked.
1730
+
1731
+ **Input**
1732
+
1733
+ | Field | Type | Required | Description |
1734
+ |---|---|---|---|
1735
+ | `path.event_type_id` | `integer` | yes | Event type id. |
1736
+
1737
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1738
+
1739
+ Other envelope fields: `pagination` (PaginationMeta).
1740
+
1741
+ **Example**
1742
+
1743
+ ```ts
1744
+ const result = await g8.api.appointments.getEventTypeSelectedCalendars({ path: { event_type_id: 123 } });
1745
+ ```
1746
+
1747
+ ---
1748
+
1749
+ <a id="op-getorgsettings"></a>
1750
+
1751
+ ### `g8.api.appointments.getOrgSettings(input?)`
1752
+
1753
+ **Get Org Settings**
1754
+
1755
+ - HTTP: `GET /api/v1/appointments/org-settings`
1756
+ - operationId: `get_org_settings_appointments_org_settings_get` (also callable as `g8.api.call("get_org_settings_appointments_org_settings_get", input)`)
1757
+ - Tier: `read`: reads data; safe to call and to retry
1758
+ - API-key scope: `meetings:read`
1759
+
1760
+ The branding the public booking page wears, defaults filled in.
1761
+
1762
+ **Input**: none.
1763
+
1764
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1765
+
1766
+ Other envelope fields: `pagination` (PaginationMeta).
1767
+
1768
+ **Example**
1769
+
1770
+ ```ts
1771
+ const result = await g8.api.appointments.getOrgSettings();
1772
+ ```
1773
+
1774
+ ---
1775
+
1776
+ <a id="op-getroutingform"></a>
1777
+
1778
+ ### `g8.api.appointments.getRoutingForm(input)`
1779
+
1780
+ **Get a single routing form**
1781
+
1782
+ - HTTP: `GET /api/v1/appointments/routing-forms/{form_id}`
1783
+ - operationId: `get_routing_form_appointments_routing_forms__form_id__get` (also callable as `g8.api.call("get_routing_form_appointments_routing_forms__form_id__get", input)`)
1784
+ - Tier: `read`: reads data; safe to call and to retry
1785
+ - API-key scope: `meetings:read`
1786
+
1787
+ Return a routing form with its fields, routes, and response_count.
1788
+
1789
+ Returns 404 when the form does not exist or belongs to another user.
1790
+
1791
+ **Input**
1792
+
1793
+ | Field | Type | Required | Description |
1794
+ |---|---|---|---|
1795
+ | `path.form_id` | `integer` | yes | Routing form integer ID. |
1796
+
1797
+ **Returns** `Record<string, unknown>`.
1798
+
1799
+ **Example**
1800
+
1801
+ ```ts
1802
+ const result = await g8.api.appointments.getRoutingForm({ path: { form_id: 1 } });
1803
+ ```
1804
+
1805
+ ---
1806
+
1807
+ <a id="op-getschedule"></a>
1808
+
1809
+ ### `g8.api.appointments.getSchedule(input)`
1810
+
1811
+ **Get a schedule with availability and linked event types**
1812
+
1813
+ - HTTP: `GET /api/v1/appointments/schedules/{schedule_id}`
1814
+ - operationId: `get_schedule_appointments_schedules__schedule_id__get` (also callable as `g8.api.call("get_schedule_appointments_schedules__schedule_id__get", input)`)
1815
+ - Tier: `read`: reads data; safe to call and to retry
1816
+ - API-key scope: `meetings:read`
1817
+
1818
+ Return a schedule's full detail: weekly availability rules, date overrides,
1819
+ owner info, and the list of event types currently linked to this schedule.
1820
+ Returns 404 when the schedule doesn't exist or belongs to another user.
1821
+
1822
+ **Input**
1823
+
1824
+ | Field | Type | Required | Description |
1825
+ |---|---|---|---|
1826
+ | `path.schedule_id` | `integer` | yes | Schedule integer ID. |
1827
+
1828
+ **Returns** `Record<string, unknown>`.
1829
+
1830
+ **Example**
1831
+
1832
+ ```ts
1833
+ const result = await g8.api.appointments.getSchedule({ path: { schedule_id: 1 } });
1834
+ ```
1835
+
1836
+ ---
1837
+
1838
+ <a id="op-getscheduleprofile"></a>
1839
+
1840
+ ### `g8.api.appointments.getScheduleProfile(input?)`
1841
+
1842
+ **Get Schedule Profile**
1843
+
1844
+ - HTTP: `GET /api/v1/appointments/profile`
1845
+ - operationId: `get_schedule_profile_appointments_profile_get` (also callable as `g8.api.call("get_schedule_profile_appointments_profile_get", input)`)
1846
+ - Tier: `read`: reads data; safe to call and to retry
1847
+ - API-key scope: `meetings:read`
1848
+
1849
+ The scheduling profile of the person who minted this key.
1850
+
1851
+ Published as `/profile` rather than the app's `/me`: an organisation key
1852
+ has no person behind it, so `/me` would promise something it cannot give.
1853
+ The first read seeds the profile with defaults if it does not exist yet.
1854
+
1855
+ **Input**: none.
1856
+
1857
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1858
+
1859
+ Other envelope fields: `pagination` (PaginationMeta).
1860
+
1861
+ **Example**
1862
+
1863
+ ```ts
1864
+ const result = await g8.api.appointments.getScheduleProfile();
1865
+ ```
1866
+
1867
+ ---
1868
+
1869
+ <a id="op-getworkflow"></a>
1870
+
1871
+ ### `g8.api.appointments.getWorkflow(input)`
1872
+
1873
+ **Get a single workflow**
1874
+
1875
+ - HTTP: `GET /api/v1/appointments/workflows/{workflow_id}`
1876
+ - operationId: `get_workflow_appointments_workflows__workflow_id__get` (also callable as `g8.api.call("get_workflow_appointments_workflows__workflow_id__get", input)`)
1877
+ - Tier: `read`: reads data; safe to call and to retry
1878
+ - API-key scope: `meetings:read`
1879
+
1880
+ Return the full workflow record (steps, linked event types, trigger config).
1881
+
1882
+ **Input**
1883
+
1884
+ | Field | Type | Required | Description |
1885
+ |---|---|---|---|
1886
+ | `path.workflow_id` | `integer` | yes | Workflow integer ID. |
1887
+
1888
+ **Returns** `Record<string, unknown>`.
1889
+
1890
+ **Example**
1891
+
1892
+ ```ts
1893
+ const result = await g8.api.appointments.getWorkflow({ path: { workflow_id: 1 } });
1894
+ ```
1895
+
1896
+ ---
1897
+
1898
+ <a id="op-importmeeting"></a>
1899
+
1900
+ ### `g8.api.appointments.importMeeting(input)`
1901
+
1902
+ **Import Meeting**
1903
+
1904
+ - HTTP: `POST /api/v1/appointments/bookings/import`
1905
+ - operationId: `import_meeting_appointments_bookings_import_post` (also callable as `g8.api.call("import_meeting_appointments_bookings_import_post", input)`)
1906
+ - 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
1907
+ - API-key scope: `meetings:run`
1908
+
1909
+ Pull a meeting booked OUTSIDE graph8 into the bookings list.
1910
+
1911
+ For the meeting somebody put straight into their calendar. The event must
1912
+ be on a calendar the key owner connected; its details are re-read from
1913
+ there. IDEMPOTENT: importing the same event twice returns the first
1914
+ booking rather than creating a second.
1915
+
1916
+ **Input**
1917
+
1918
+ | Field | Type | Required | Description |
1919
+ |---|---|---|---|
1920
+ | `body` | `ImportMeetingRequest` | yes | Request body; fields below. |
1921
+
1922
+ Body fields (`ImportMeetingRequest`):
1923
+
1924
+ | Field | Type | Required | Description |
1925
+ |---|---|---|---|
1926
+ | `body.calendar_id` | `string` | yes | |
1927
+ | `body.event_id` | `string` | yes | |
1928
+ | `body.event_type_id` | `integer` | yes | The graph8 event type to import it as. |
1929
+ | `body.provider` | `"google_calendar" \| "office365_calendar"` | yes | |
1930
+
1931
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1932
+
1933
+ Other envelope fields: `pagination` (PaginationMeta).
1934
+
1935
+ **Example**
1936
+
1937
+ ```ts
1938
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
1939
+ const result = await g8.api.appointments.importMeeting({
1940
+ body: {
1941
+ calendar_id: "id",
1942
+ event_id: "id",
1943
+ event_type_id: 123,
1944
+ provider: "google_calendar",
1945
+ },
1946
+ });
1947
+ ```
1948
+
1949
+ ---
1950
+
1951
+ <a id="op-listbookings"></a>
1952
+
1953
+ ### `g8.api.appointments.listBookings(input?)`
1954
+
1955
+ **List the caller's bookings (paginated)**
1956
+
1957
+ - HTTP: `GET /api/v1/appointments/bookings`
1958
+ - operationId: `list_bookings_appointments_bookings_get` (also callable as `g8.api.call("list_bookings_appointments_bookings_get", input)`)
1959
+ - Tier: `read`: reads data; safe to call and to retry
1960
+ - API-key scope: `meetings:read`
1961
+
1962
+ List bookings visible to the caller.
1963
+
1964
+ Personal keys retain the member-scoped path. An organization key that
1965
+ passed the existing explicit ``meetings:read`` gate uses the handler's
1966
+ org-wide read path and therefore never looks up the synthetic API identity.
1967
+
1968
+ **Input**
1969
+
1970
+ | Field | Type | Required | Description |
1971
+ |---|---|---|---|
1972
+ | `query.status` | `string \| null` | no | Filter by status: accepted \| pending \| cancelled \| rejected. |
1973
+ | `query.event_type_id` | `integer \| null` | no | Only bookings for this event type. |
1974
+ | `query.after_start` | `string \| null` | no | ISO-8601 lower bound on start_time. |
1975
+ | `query.before_end` | `string \| null` | no | ISO-8601 upper bound on end_time. |
1976
+ | `query.attendee_email` | `string \| null` | no | Filter by an attendee email. |
1977
+ | `query.sort_by` | `string` | no | start_time \| end_time \| created_at \| status. default `"start_time"` |
1978
+ | `query.sort_order` | `string` | no | default `"desc"` |
1979
+ | `query.skip` | `integer` | no | default `0` |
1980
+ | `query.take` | `integer` | no | default `20` |
1981
+
1982
+ **Returns** `Record<string, unknown>`.
1983
+
1984
+ **Example**
1985
+
1986
+ ```ts
1987
+ const result = await g8.api.appointments.listBookings();
1988
+ ```
1989
+
1990
+ ---
1991
+
1992
+ <a id="op-listcalendarevents"></a>
1993
+
1994
+ ### `g8.api.appointments.listCalendarEvents(input)`
1995
+
1996
+ **List Calendar Events**
1997
+
1998
+ - HTTP: `GET /api/v1/appointments/calendars/events`
1999
+ - operationId: `list_calendar_events_appointments_calendars_events_get` (also callable as `g8.api.call("list_calendar_events_appointments_calendars_events_get", input)`)
2000
+ - Tier: `read`: reads data; safe to call and to retry
2001
+ - API-key scope: `meetings:read`
2002
+
2003
+ What is already on the connected Google / Outlook calendars in a window.
2004
+
2005
+ This is what makes a slot unavailable, so it is the read to reach for when
2006
+ availability looks wrong. READ-ONLY and display-only: private events come
2007
+ back as "Busy" blocks, and a calendar that fails to load is reported in
2008
+ `errors` rather than failing the request.
2009
+
2010
+ **Input**
2011
+
2012
+ | Field | Type | Required | Description |
2013
+ |---|---|---|---|
2014
+ | `query.start` | `string (date-time)` | yes | Window start, ISO-8601. |
2015
+ | `query.end` | `string (date-time)` | yes | Window end, ISO-8601. |
2016
+ | `query.scope` | `"my" \| "org"` | no | `my` for the key owner alone, `org` for every member who has not opted out. An empty `org` result means nobody shares a calendar, not that nobody is busy. default `"my"` |
2017
+ | `query.host_emails` | `string \| null` | no | CSV. Narrows `org` scope to these members. |
2018
+
2019
+ **Returns** `ApiResponse_SchedulingListPayload_`: the envelope `{ data: SchedulingListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2020
+
2021
+ Other envelope fields: `pagination` (PaginationMeta).
2022
+
2023
+ `SchedulingListPayload` fields:
2024
+
2025
+ | Field | Type | Required | Description |
2026
+ |---|---|---|---|
2027
+ | `items` | `Array<unknown>` | no | |
2028
+
2029
+ **Example**
2030
+
2031
+ ```ts
2032
+ const result = await g8.api.appointments.listCalendarEvents({
2033
+ query: { start: "2026-01-01T09:00:00Z", end: "2026-01-01T09:00:00Z" },
2034
+ });
2035
+ ```
2036
+
2037
+ ---
2038
+
2039
+ <a id="op-listcalendars"></a>
2040
+
2041
+ ### `g8.api.appointments.listCalendars(input?)`
2042
+
2043
+ **List connected calendar accounts**
2044
+
2045
+ - HTTP: `GET /api/v1/appointments/calendars`
2046
+ - operationId: `list_calendars_appointments_calendars_get` (also callable as `g8.api.call("list_calendars_appointments_calendars_get", input)`)
2047
+ - Tier: `read`: reads data; safe to call and to retry
2048
+ - API-key scope: `meetings:read`
2049
+
2050
+ List calendar accounts (Google, Outlook) connected to the caller's
2051
+ appointments profile, each with its sub-calendars and selection state.
2052
+ Reuses the in-app list_calendars logic faithfully.
2053
+
2054
+ **Input**: none.
2055
+
2056
+ **Returns** `Array<ConnectedCalendarResponse>`.
2057
+
2058
+ **Example**
2059
+
2060
+ ```ts
2061
+ const result = await g8.api.appointments.listCalendars();
2062
+ ```
2063
+
2064
+ ---
2065
+
2066
+ <a id="op-listconferencing"></a>
2067
+
2068
+ ### `g8.api.appointments.listConferencing(input?)`
2069
+
2070
+ **List connected conferencing providers**
2071
+
2072
+ - HTTP: `GET /api/v1/appointments/conferencing`
2073
+ - operationId: `list_conferencing_appointments_conferencing_get` (also callable as `g8.api.call("list_conferencing_appointments_conferencing_get", input)`)
2074
+ - Tier: `read`: reads data; safe to call and to retry
2075
+ - API-key scope: `meetings:read`
2076
+
2077
+ List conferencing providers connected to the caller's appointments profile.
2078
+ Google Meet is synthesized from any google_calendar credential (it has no
2079
+ real credential row) and is suppressed when google_meet_suppressed is set.
2080
+ Reuses the in-app list_conferencing logic faithfully.
2081
+
2082
+ **Input**: none.
2083
+
2084
+ **Returns** `Array<ConnectedConferencingResponse>`.
2085
+
2086
+ **Example**
2087
+
2088
+ ```ts
2089
+ const result = await g8.api.appointments.listConferencing();
2090
+ ```
2091
+
2092
+ ---
2093
+
2094
+ <a id="op-listeventtypehostgroups"></a>
2095
+
2096
+ ### `g8.api.appointments.listEventTypeHostGroups(input)`
2097
+
2098
+ **List Event Type Host Groups**
2099
+
2100
+ - HTTP: `GET /api/v1/appointments/event-types/{event_type_id}/host-groups`
2101
+ - operationId: `list_event_type_host_groups_appointments_event_types__event_type_id__host_groups_get` (also callable as `g8.api.call("list_event_type_host_groups_appointments_event_types__event_type_id__host_groups_get", input)`)
2102
+ - Tier: `read`: reads data; safe to call and to retry
2103
+ - API-key scope: `meetings:read`
2104
+
2105
+ Groups that partition this event type's hosts for the rotation.
2106
+
2107
+ **Input**
2108
+
2109
+ | Field | Type | Required | Description |
2110
+ |---|---|---|---|
2111
+ | `path.event_type_id` | `integer` | yes | Event type id. |
2112
+
2113
+ **Returns** `ApiResponse_list_AppointmentHostGroup__`: the envelope `{ data: Array<AppointmentHostGroup>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2114
+
2115
+ Other envelope fields: `pagination` (PaginationMeta).
2116
+
2117
+ `AppointmentHostGroup` fields:
2118
+
2119
+ | Field | Type | Required | Description |
2120
+ |---|---|---|---|
2121
+ | `created_at` | `string (date-time) \| null` | no | |
2122
+ | `event_type_id` | `integer \| null` | no | |
2123
+ | `id` | `string \| null` | no | |
2124
+ | `name` | `string \| null` | no | |
2125
+
2126
+ **Example**
2127
+
2128
+ ```ts
2129
+ const result = await g8.api.appointments.listEventTypeHostGroups({ path: { event_type_id: 123 } });
2130
+ ```
2131
+
2132
+ ---
2133
+
2134
+ <a id="op-listmembership"></a>
2135
+
2136
+ ### `g8.api.appointments.listMembership(input?)`
2137
+
2138
+ **List Membership**
2139
+
2140
+ - HTTP: `GET /api/v1/appointments/membership`
2141
+ - operationId: `list_membership_appointments_membership_get` (also callable as `g8.api.call("list_membership_appointments_membership_get", input)`)
2142
+ - Tier: `read`: reads data; safe to call and to retry
2143
+ - API-key scope: `meetings:read`
2144
+
2145
+ Everyone in the organisation, as scheduling sees them.
2146
+
2147
+ The source of the integer `user_id` the member and role routes take.
2148
+
2149
+ **Input**: none.
2150
+
2151
+ **Returns** `ApiResponse_SchedulingListPayload_`: the envelope `{ data: SchedulingListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2152
+
2153
+ Other envelope fields: `pagination` (PaginationMeta).
2154
+
2155
+ `SchedulingListPayload` fields:
2156
+
2157
+ | Field | Type | Required | Description |
2158
+ |---|---|---|---|
2159
+ | `items` | `Array<unknown>` | no | |
2160
+
2161
+ **Example**
2162
+
2163
+ ```ts
2164
+ const result = await g8.api.appointments.listMembership();
2165
+ ```
2166
+
2167
+ ---
2168
+
2169
+ <a id="op-listooo"></a>
2170
+
2171
+ ### `g8.api.appointments.listOoo(input?)`
2172
+
2173
+ **List out-of-office entries for the calling user**
2174
+
2175
+ - HTTP: `GET /api/v1/appointments/out-of-office`
2176
+ - operationId: `list_ooo_appointments_out_of_office_get` (also callable as `g8.api.call("list_ooo_appointments_out_of_office_get", input)`)
2177
+ - Tier: `read`: reads data; safe to call and to retry
2178
+ - API-key scope: `meetings:read`
2179
+
2180
+ List all out-of-office entries belonging to the calling user. API keys
2181
+ never receive org-wide admin access, so this always returns only the
2182
+ caller's own entries (equivalent to the non-admin in-app path).
2183
+
2184
+ **Input**: none.
2185
+
2186
+ **Returns** `Record<string, unknown>`.
2187
+
2188
+ **Example**
2189
+
2190
+ ```ts
2191
+ const result = await g8.api.appointments.listOoo();
2192
+ ```
2193
+
2194
+ ---
2195
+
2196
+ <a id="op-listroutingformresponses"></a>
2197
+
2198
+ ### `g8.api.appointments.listRoutingFormResponses(input)`
2199
+
2200
+ **List captured responses for a routing form (paginated)**
2201
+
2202
+ - HTTP: `GET /api/v1/appointments/routing-forms/{form_id}/responses`
2203
+ - operationId: `list_routing_form_responses_appointments_routing_forms__form_id__responses_get` (also callable as `g8.api.call("list_routing_form_responses_appointments_routing_forms__form_id__responses_get", input)`)
2204
+ - Tier: `read`: reads data; safe to call and to retry
2205
+ - API-key scope: `meetings:read`
2206
+
2207
+ List captured form responses. Paginated via ``skip`` / ``take``.
2208
+
2209
+ Returns 404 when the form does not exist or belongs to another user.
2210
+ Response items include: ``id``, ``form_id``, ``responses`` (field answers),
2211
+ ``routed_to_event_type_id``, and ``created_at``.
2212
+
2213
+ **Input**
2214
+
2215
+ | Field | Type | Required | Description |
2216
+ |---|---|---|---|
2217
+ | `path.form_id` | `integer` | yes | Routing form integer ID. |
2218
+ | `query.skip` | `integer` | no | Number of responses to skip. default `0` |
2219
+ | `query.take` | `integer` | no | Maximum responses to return (max 500). default `50` |
2220
+
2221
+ **Returns** `Record<string, unknown>`.
2222
+
2223
+ **Example**
2224
+
2225
+ ```ts
2226
+ const result = await g8.api.appointments.listRoutingFormResponses({ path: { form_id: 1 } });
2227
+ ```
2228
+
2229
+ ---
2230
+
2231
+ <a id="op-listroutingforms"></a>
2232
+
2233
+ ### `g8.api.appointments.listRoutingForms(input?)`
2234
+
2235
+ **List routing forms (includes response_count)**
2236
+
2237
+ - HTTP: `GET /api/v1/appointments/routing-forms`
2238
+ - operationId: `list_routing_forms_appointments_routing_forms_get` (also callable as `g8.api.call("list_routing_forms_appointments_routing_forms_get", input)`)
2239
+ - Tier: `read`: reads data; safe to call and to retry
2240
+ - API-key scope: `meetings:read`
2241
+
2242
+ List all routing forms owned by the API-key user.
2243
+
2244
+ ``is_admin`` is forced False - returns only the caller's own forms.
2245
+ Each item includes ``response_count`` (total submissions captured).
2246
+
2247
+ **Input**: none.
2248
+
2249
+ **Returns** `Record<string, unknown>`.
2250
+
2251
+ **Example**
2252
+
2253
+ ```ts
2254
+ const result = await g8.api.appointments.listRoutingForms();
2255
+ ```
2256
+
2257
+ ---
2258
+
2259
+ <a id="op-listsavedfilters"></a>
2260
+
2261
+ ### `g8.api.appointments.listSavedFilters(input?)`
2262
+
2263
+ **List Saved Filters**
2264
+
2265
+ - HTTP: `GET /api/v1/appointments/saved-filters`
2266
+ - operationId: `list_saved_filters_appointments_saved_filters_get` (also callable as `g8.api.call("list_saved_filters_appointments_saved_filters_get", input)`)
2267
+ - Tier: `read`: reads data; safe to call and to retry
2268
+ - API-key scope: `meetings:read`
2269
+
2270
+ The caller's saved views over the bookings list.
2271
+
2272
+ **Input**: none.
2273
+
2274
+ **Returns** `ApiResponse_SchedulingListPayload_`: the envelope `{ data: SchedulingListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2275
+
2276
+ Other envelope fields: `pagination` (PaginationMeta).
2277
+
2278
+ `SchedulingListPayload` fields:
2279
+
2280
+ | Field | Type | Required | Description |
2281
+ |---|---|---|---|
2282
+ | `items` | `Array<unknown>` | no | |
2283
+
2284
+ **Example**
2285
+
2286
+ ```ts
2287
+ const result = await g8.api.appointments.listSavedFilters();
2288
+ ```
2289
+
2290
+ ---
2291
+
2292
+ <a id="op-listschedules"></a>
2293
+
2294
+ ### `g8.api.appointments.listSchedules(input?)`
2295
+
2296
+ **List the caller's availability schedules**
2297
+
2298
+ - HTTP: `GET /api/v1/appointments/schedules`
2299
+ - operationId: `list_schedules_appointments_schedules_get` (also callable as `g8.api.call("list_schedules_appointments_schedules_get", input)`)
2300
+ - Tier: `read`: reads data; safe to call and to retry
2301
+ - API-key scope: `meetings:read`
2302
+
2303
+ List the caller's appointment availability schedules (the "when am I
2304
+ free?" working-hours profiles used by event types). This is DISTINCT from
2305
+ the sequencer send-window schedules at ``GET /schedules`` - those drive
2306
+ email send timing, these drive bookability. Each schedule carries its weekly
2307
+ rules' owner + a ``is_default`` flag derived from the caller's settings.
2308
+
2309
+ **Input**: none.
2310
+
2311
+ **Returns** `Record<string, unknown>`.
2312
+
2313
+ **Example**
2314
+
2315
+ ```ts
2316
+ const result = await g8.api.appointments.listSchedules();
2317
+ ```
2318
+
2319
+ ---
2320
+
2321
+ <a id="op-listsequencesforpicker"></a>
2322
+
2323
+ ### `g8.api.appointments.listSequencesForPicker(input?)`
2324
+
2325
+ **List Sequences For Picker**
2326
+
2327
+ - HTTP: `GET /api/v1/appointments/bookings/sequences-picker`
2328
+ - operationId: `list_sequences_for_picker_appointments_bookings_sequences_picker_get` (also callable as `g8.api.call("list_sequences_for_picker_appointments_bookings_sequences_picker_get", input)`)
2329
+ - Tier: `read`: reads data; safe to call and to retry
2330
+ - API-key scope: `meetings:read`
2331
+
2332
+ Sequences a booking can be attributed to (`PATCH .../bookings/{uid}/sequence`).
2333
+
2334
+ SCOPED by the same sequence visibility the sequencer list uses, so two
2335
+ keys can legitimately get different lists. Archived and draft sequences
2336
+ are left out.
2337
+
2338
+ **Input**: none.
2339
+
2340
+ **Returns** `ApiResponse_SchedulingListPayload_`: the envelope `{ data: SchedulingListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2341
+
2342
+ Other envelope fields: `pagination` (PaginationMeta).
2343
+
2344
+ `SchedulingListPayload` fields:
2345
+
2346
+ | Field | Type | Required | Description |
2347
+ |---|---|---|---|
2348
+ | `items` | `Array<unknown>` | no | |
2349
+
2350
+ **Example**
2351
+
2352
+ ```ts
2353
+ const result = await g8.api.appointments.listSequencesForPicker();
2354
+ ```
2355
+
2356
+ ---
2357
+
2358
+ <a id="op-listteamavailability"></a>
2359
+
2360
+ ### `g8.api.appointments.listTeamAvailability(input)`
2361
+
2362
+ **List Team Availability**
2363
+
2364
+ - HTTP: `GET /api/v1/appointments/availability/team`
2365
+ - operationId: `list_team_availability_appointments_availability_team_get` (also callable as `g8.api.call("list_team_availability_appointments_availability_team_get", input)`)
2366
+ - Tier: `read`: reads data; safe to call and to retry
2367
+ - API-key scope: `meetings:read`
2368
+
2369
+ Every teammate's availability windows for one day.
2370
+
2371
+ Cursor-paged on user id rather than offset, so a team that changes between
2372
+ pages does not shift rows under you. An empty `date_ranges` means that
2373
+ person has not set up a schedule, not that they are fully booked.
2374
+
2375
+ **Input**
2376
+
2377
+ | Field | Type | Required | Description |
2378
+ |---|---|---|---|
2379
+ | `query.date` | `string` | yes | The day, `YYYY-MM-DD`. |
2380
+ | `query.viewer_tz` | `string` | no | IANA timezone. INFORMATIONAL - the windows come back in UTC and the caller renders them; this shifts nothing server-side. default `"UTC"` |
2381
+ | `query.limit` | `integer` | no | default `50` |
2382
+ | `query.cursor` | `integer \| null` | no | `next_cursor` from the previous page. |
2383
+ | `query.search` | `string \| null` | no | Name or email substring. |
2384
+ | `query.user_ids` | `Array<integer> \| null` | no | Only these teammates. REPEATABLE (`?user_ids=1&user_ids=2`), and it takes PRECEDENCE over `search` - sending both ignores the search. |
2385
+
2386
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2387
+
2388
+ Other envelope fields: `pagination` (PaginationMeta).
2389
+
2390
+ **Example**
2391
+
2392
+ ```ts
2393
+ const result = await g8.api.appointments.listTeamAvailability({ query: { date: "example" } });
2394
+ ```
2395
+
2396
+ ---
2397
+
2398
+ <a id="op-listworkflows"></a>
2399
+
2400
+ ### `g8.api.appointments.listWorkflows(input?)`
2401
+
2402
+ **List all workflows**
2403
+
2404
+ - HTTP: `GET /api/v1/appointments/workflows`
2405
+ - operationId: `list_workflows_appointments_workflows_get` (also callable as `g8.api.call("list_workflows_appointments_workflows_get", input)`)
2406
+ - Tier: `read`: reads data; safe to call and to retry
2407
+ - API-key scope: `meetings:read`
2408
+
2409
+ List all workflows for the organisation.
2410
+
2411
+ **Input**: none.
2412
+
2413
+ **Returns** `Record<string, unknown>`.
2414
+
2415
+ **Example**
2416
+
2417
+ ```ts
2418
+ const result = await g8.api.appointments.listWorkflows();
2419
+ ```
2420
+
2421
+ ---
2422
+
2423
+ <a id="op-markabsent"></a>
2424
+
2425
+ ### `g8.api.appointments.markAbsent(input)`
2426
+
2427
+ **Mark host or attendees as no-show**
2428
+
2429
+ - HTTP: `POST /api/v1/appointments/bookings/{booking_uid}/mark-absent`
2430
+ - operationId: `mark_absent_appointments_bookings__booking_uid__mark_absent_post` (also callable as `g8.api.call("mark_absent_appointments_bookings__booking_uid__mark_absent_post", input)`)
2431
+ - 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
2432
+ - API-key scope: `meetings:run`
2433
+
2434
+ Record a no-show for the host, one or more attendees, or both.
2435
+
2436
+ Pass ``host=true`` to flag the host as absent. Pass ``attendees`` as a
2437
+ list of attendee dicts (each containing at least ``email``) to flag
2438
+ specific attendees. Backed by ``BookingsHandler.handle_mark_absent``
2439
+ (updates ``no_show`` flags; sends no automatic notifications - this is
2440
+ an operator CRM action). Raises 404 when the booking uid is not visible
2441
+ to the caller.
2442
+
2443
+ **Input**
2444
+
2445
+ | Field | Type | Required | Description |
2446
+ |---|---|---|---|
2447
+ | `path.booking_uid` | `string` | yes | Booking UID (uuid string). |
2448
+ | `body` | `MarkAbsentRequest` | yes | Request body; fields below. |
2449
+
2450
+ Body fields (`MarkAbsentRequest`):
2451
+
2452
+ | Field | Type | Required | Description |
2453
+ |---|---|---|---|
2454
+ | `body.attendees` | `Array<Record<string, unknown>> \| null` | no | |
2455
+ | `body.host` | `boolean \| null` | no | |
2456
+
2457
+ **Returns** `Record<string, unknown>`.
2458
+
2459
+ **Example**
2460
+
2461
+ ```ts
2462
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
2463
+ const result = await g8.api.appointments.markAbsent({ path: { booking_uid: "example" }, body: {} });
2464
+ ```
2465
+
2466
+ ---
2467
+
2468
+ <a id="op-releaseslot"></a>
2469
+
2470
+ ### `g8.api.appointments.releaseSlot(input)`
2471
+
2472
+ **Release Slot**
2473
+
2474
+ - HTTP: `DELETE /api/v1/appointments/slots/reserve/{slot_uid}`
2475
+ - operationId: `release_slot_appointments_slots_reserve__slot_uid__delete` (also callable as `g8.api.call("release_slot_appointments_slots_reserve__slot_uid__delete", input)`)
2476
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
2477
+ - API-key scope: `meetings:delete`
2478
+
2479
+ Give a held slot back before its hold lapses. Only the holder can.
2480
+
2481
+ **Input**
2482
+
2483
+ | Field | Type | Required | Description |
2484
+ |---|---|---|---|
2485
+ | `path.slot_uid` | `string` | yes | The `uid` returned by `POST /appointments/slots/reserve`. |
2486
+
2487
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2488
+
2489
+ Other envelope fields: `pagination` (PaginationMeta).
2490
+
2491
+ **Example**
2492
+
2493
+ ```ts
2494
+ // destructive: deletes or archives data; confirm with a human before calling.
2495
+ const result = await g8.api.appointments.releaseSlot({ path: { slot_uid: "example" } });
2496
+ ```
2497
+
2498
+ ---
2499
+
2500
+ <a id="op-removeeventtypehost"></a>
2501
+
2502
+ ### `g8.api.appointments.removeEventTypeHost(input)`
2503
+
2504
+ **Remove Event Type Host**
2505
+
2506
+ - HTTP: `DELETE /api/v1/appointments/event-types/{event_type_id}/hosts/{host_user_id}`
2507
+ - operationId: `remove_event_type_host_appointments_event_types__event_type_id__hosts__host_user_id__delete` (also callable as `g8.api.call("remove_event_type_host_appointments_event_types__event_type_id__hosts__host_user_id__delete", input)`)
2508
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
2509
+ - API-key scope: `meetings:delete`
2510
+
2511
+ Remove a host. Existing bookings already assigned to them are NOT
2512
+ reassigned - this only changes who future bookings can land on.
2513
+
2514
+ **Input**
2515
+
2516
+ | Field | Type | Required | Description |
2517
+ |---|---|---|---|
2518
+ | `path.event_type_id` | `integer` | yes | Event type id. |
2519
+ | `path.host_user_id` | `integer` | yes | Host user id. |
2520
+
2521
+ **Returns**: no JSON body is declared for the success response.
2522
+
2523
+ **Example**
2524
+
2525
+ ```ts
2526
+ // destructive: deletes or archives data; confirm with a human before calling.
2527
+ const result = await g8.api.appointments.removeEventTypeHost({ path: { event_type_id: 123, host_user_id: 123 } });
2528
+ ```
2529
+
2530
+ ---
2531
+
2532
+ <a id="op-requestbookingreschedule"></a>
2533
+
2534
+ ### `g8.api.appointments.requestBookingReschedule(input)`
2535
+
2536
+ **Send a reschedule-request email to the attendee (host action)**
2537
+
2538
+ - HTTP: `POST /api/v1/appointments/bookings/{booking_uid}/request-reschedule`
2539
+ - operationId: `request_booking_reschedule_appointments_bookings__booking_uid__request_reschedule_post` (also callable as `g8.api.call("request_booking_reschedule_appointments_bookings__booking_uid__request_reschedule_post", input)`)
2540
+ - 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
2541
+ - API-key scope: `meetings:run`
2542
+
2543
+ Ask the attendee to pick a new time.
2544
+
2545
+ Sends a reschedule-request email with the optional host ``reason``
2546
+ message and a link to the public booking page. Does NOT move or cancel
2547
+ the original booking - the attendee reschedules by clicking the link.
2548
+ Backed by ``BookingsHandler.handle_request_reschedule``. Raises 404
2549
+ when the booking uid is not visible to the caller.
2550
+
2551
+ **Input**
2552
+
2553
+ | Field | Type | Required | Description |
2554
+ |---|---|---|---|
2555
+ | `path.booking_uid` | `string` | yes | Booking UID (uuid string). |
2556
+ | `body` | `RequestRescheduleRequest` | yes | Request body; fields below. |
2557
+
2558
+ Body fields (`RequestRescheduleRequest`):
2559
+
2560
+ | Field | Type | Required | Description |
2561
+ |---|---|---|---|
2562
+ | `body.reason` | `string \| null` | no | |
2563
+
2564
+ **Returns** `Record<string, unknown>`.
2565
+
2566
+ **Example**
2567
+
2568
+ ```ts
2569
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
2570
+ const result = await g8.api.appointments.requestBookingReschedule({ path: { booking_uid: "example" }, body: {} });
2571
+ ```
2572
+
2573
+ ---
2574
+
2575
+ <a id="op-reschedulebooking"></a>
2576
+
2577
+ ### `g8.api.appointments.rescheduleBooking(input)`
2578
+
2579
+ **Reschedule a booking to a new start time**
2580
+
2581
+ - HTTP: `POST /api/v1/appointments/bookings/{booking_uid}/reschedule`
2582
+ - operationId: `reschedule_booking_appointments_bookings__booking_uid__reschedule_post` (also callable as `g8.api.call("reschedule_booking_appointments_bookings__booking_uid__reschedule_post", input)`)
2583
+ - 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
2584
+ - API-key scope: `meetings:run`
2585
+
2586
+ Reschedule a booking to ``start_time``. Reuses
2587
+ ``BookingsHandler.handle_reschedule`` (no double credit charge — reschedules
2588
+ are free; re-renders the title, updates the calendar event, notifies
2589
+ attendees). Returns the NEW booking detail.
2590
+
2591
+ **Input**
2592
+
2593
+ | Field | Type | Required | Description |
2594
+ |---|---|---|---|
2595
+ | `path.booking_uid` | `string` | yes | |
2596
+ | `body` | `RescheduleBookingRequest` | yes | Request body; fields below. |
2597
+
2598
+ Body fields (`RescheduleBookingRequest`):
2599
+
2600
+ | Field | Type | Required | Description |
2601
+ |---|---|---|---|
2602
+ | `body.start_time` | `string` | yes | |
2603
+ | `body.rescheduling_reason` | `string \| null` | no | |
2604
+
2605
+ **Returns** `Record<string, unknown>`.
2606
+
2607
+ **Example**
2608
+
2609
+ ```ts
2610
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
2611
+ const result = await g8.api.appointments.rescheduleBooking({ path: { booking_uid: "example" }, body: { start_time: "example" } });
2612
+ ```
2613
+
2614
+ ---
2615
+
2616
+ <a id="op-reserveslot"></a>
2617
+
2618
+ ### `g8.api.appointments.reserveSlot(input)`
2619
+
2620
+ **Reserve Slot**
2621
+
2622
+ - HTTP: `POST /api/v1/appointments/slots/reserve`
2623
+ - operationId: `reserve_slot_appointments_slots_reserve_post` (also callable as `g8.api.call("reserve_slot_appointments_slots_reserve_post", input)`)
2624
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2625
+ - API-key scope: `meetings:write`
2626
+
2627
+ Hold a slot for ten minutes while a booker fills in the form.
2628
+
2629
+ NOT a booking: nothing is written to a calendar and nobody is notified.
2630
+ The hold lapses by itself at `release_at`; release it explicitly if you
2631
+ know the booker walked away. A slot already taken is a 409.
2632
+
2633
+ **Input**
2634
+
2635
+ | Field | Type | Required | Description |
2636
+ |---|---|---|---|
2637
+ | `body` | `ReserveSlotRequest` | yes | Request body; fields below. |
2638
+
2639
+ Body fields (`ReserveSlotRequest`):
2640
+
2641
+ | Field | Type | Required | Description |
2642
+ |---|---|---|---|
2643
+ | `body.event_type_id` | `integer` | yes | |
2644
+ | `body.slot_end` | `string` | yes | ISO-8601 end of the slot being held. |
2645
+ | `body.slot_start` | `string` | yes | ISO-8601 start of the slot being held. |
2646
+
2647
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2648
+
2649
+ Other envelope fields: `pagination` (PaginationMeta).
2650
+
2651
+ **Example**
2652
+
2653
+ ```ts
2654
+ const result = await g8.api.appointments.reserveSlot({
2655
+ body: { event_type_id: 123, slot_end: "example", slot_start: "example" },
2656
+ });
2657
+ ```
2658
+
2659
+ ---
2660
+
2661
+ <a id="op-selectcalendar"></a>
2662
+
2663
+ ### `g8.api.appointments.selectCalendar(input)`
2664
+
2665
+ **Select a sub-calendar for conflict checking**
2666
+
2667
+ - HTTP: `POST /api/v1/appointments/calendars/selected`
2668
+ - operationId: `select_calendar_appointments_calendars_selected_post` (also callable as `g8.api.call("select_calendar_appointments_calendars_selected_post", input)`)
2669
+ - 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
2670
+ - API-key scope: `meetings:run`
2671
+
2672
+ Add a sub-calendar to the caller's conflict-checking set.
2673
+ Reuses the in-app select_calendar logic (credential ownership check +
2674
+ create_selected_calendar). Raises 404 when the credential is not found
2675
+ or does not belong to the caller.
2676
+
2677
+ **Input**
2678
+
2679
+ | Field | Type | Required | Description |
2680
+ |---|---|---|---|
2681
+ | `body` | `SelectCalendarRequest` | yes | Request body; fields below. |
2682
+
2683
+ Body fields (`SelectCalendarRequest`):
2684
+
2685
+ | Field | Type | Required | Description |
2686
+ |---|---|---|---|
2687
+ | `body.credential_id` | `integer` | yes | |
2688
+ | `body.external_id` | `string` | yes | |
2689
+ | `body.integration` | `string` | yes | |
2690
+
2691
+ **Returns** `SelectedCalendarEnvelope`: the envelope `{ data: SelectedCalendarResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2692
+
2693
+ `SelectedCalendarResponse` fields:
2694
+
2695
+ | Field | Type | Required | Description |
2696
+ |---|---|---|---|
2697
+ | `external_id` | `string` | yes | |
2698
+ | `id` | `string` | yes | |
2699
+ | `integration` | `string` | yes | |
2700
+ | `credential_id` | `integer \| null` | no | |
2701
+
2702
+ **Example**
2703
+
2704
+ ```ts
2705
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
2706
+ const result = await g8.api.appointments.selectCalendar({
2707
+ body: { credential_id: 123, external_id: "id", integration: "example" },
2708
+ });
2709
+ ```
2710
+
2711
+ ---
2712
+
2713
+ <a id="op-setdefaultconferencing"></a>
2714
+
2715
+ ### `g8.api.appointments.setDefaultConferencing(input)`
2716
+
2717
+ **Set the default conferencing provider**
2718
+
2719
+ - HTTP: `POST /api/v1/appointments/conferencing/{provider}/default`
2720
+ - operationId: `set_default_conferencing_appointments_conferencing__provider__default_post` (also callable as `g8.api.call("set_default_conferencing_appointments_conferencing__provider__default_post", input)`)
2721
+ - 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
2722
+ - API-key scope: `meetings:run`
2723
+
2724
+ Set the default conferencing provider for new meetings. For link-based
2725
+ providers (roam, whereby, jitsi) a meeting URL is required (either in the
2726
+ request or previously stored on the credential). Reuses the in-app
2727
+ set_default_conferencing logic.
2728
+
2729
+ **Input**
2730
+
2731
+ | Field | Type | Required | Description |
2732
+ |---|---|---|---|
2733
+ | `path.provider` | `string` | yes | |
2734
+ | `body` | `SetDefaultConferencingRequest` | yes | Request body; fields below. |
2735
+
2736
+ Body fields (`SetDefaultConferencingRequest`):
2737
+
2738
+ | Field | Type | Required | Description |
2739
+ |---|---|---|---|
2740
+ | `body.credential_id` | `integer \| null` | no | |
2741
+ | `body.link` | `string \| null` | no | |
2742
+
2743
+ **Returns** `DefaultConferencingEnvelope`: the envelope `{ data: DefaultConferencingResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2744
+
2745
+ `DefaultConferencingResponse` fields:
2746
+
2747
+ | Field | Type | Required | Description |
2748
+ |---|---|---|---|
2749
+ | `credential_id` | `integer \| null` | no | |
2750
+ | `link` | `string \| null` | no | |
2751
+ | `provider` | `string \| null` | no | |
2752
+
2753
+ **Example**
2754
+
2755
+ ```ts
2756
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
2757
+ const result = await g8.api.appointments.setDefaultConferencing({ path: { provider: "example" }, body: {} });
2758
+ ```
2759
+
2760
+ ---
2761
+
2762
+ <a id="op-setdefaultschedule"></a>
2763
+
2764
+ ### `g8.api.appointments.setDefaultSchedule(input)`
2765
+
2766
+ **Set a schedule as the caller's default**
2767
+
2768
+ - HTTP: `POST /api/v1/appointments/schedules/{schedule_id}/set-default`
2769
+ - operationId: `set_default_schedule_appointments_schedules__schedule_id__set_default_post` (also callable as `g8.api.call("set_default_schedule_appointments_schedules__schedule_id__set_default_post", input)`)
2770
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2771
+ - API-key scope: `meetings:write`
2772
+
2773
+ Mark a schedule as the caller's default availability schedule.
2774
+
2775
+ Persists via ``repo.update_appointment_settings(default_schedule_id=...)``
2776
+ which is identical to the in-app ``PATCH /me`` (profile router) path that
2777
+ sets ``default_schedule_id``. The default schedule is used for slot
2778
+ generation when an event type has no schedule attached (Layer 3 resolution).
2779
+ Returns 404 when the schedule does not exist or belongs to another user.
2780
+
2781
+ **Input**
2782
+
2783
+ | Field | Type | Required | Description |
2784
+ |---|---|---|---|
2785
+ | `path.schedule_id` | `integer` | yes | Schedule integer ID. |
2786
+
2787
+ **Returns** `Record<string, unknown>`.
2788
+
2789
+ **Example**
2790
+
2791
+ ```ts
2792
+ const result = await g8.api.appointments.setDefaultSchedule({ path: { schedule_id: 1 } });
2793
+ ```
2794
+
2795
+ ---
2796
+
2797
+ <a id="op-setdestinationcalendar"></a>
2798
+
2799
+ ### `g8.api.appointments.setDestinationCalendar(input)`
2800
+
2801
+ **Set the destination calendar for new booking events**
2802
+
2803
+ - HTTP: `PUT /api/v1/appointments/calendars/destination`
2804
+ - operationId: `set_destination_calendar_appointments_calendars_destination_put` (also callable as `g8.api.call("set_destination_calendar_appointments_calendars_destination_put", input)`)
2805
+ - 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
2806
+ - API-key scope: `meetings:run`
2807
+
2808
+ Set (upsert) the destination calendar where booking events are pushed.
2809
+ Optionally scoped to a specific event type via ``event_type_id``. Reuses
2810
+ the in-app set_destination_calendar logic (upsert_destination_calendar).
2811
+
2812
+ **Input**
2813
+
2814
+ | Field | Type | Required | Description |
2815
+ |---|---|---|---|
2816
+ | `body` | `SetDestinationCalendarRequest` | yes | Request body; fields below. |
2817
+
2818
+ Body fields (`SetDestinationCalendarRequest`):
2819
+
2820
+ | Field | Type | Required | Description |
2821
+ |---|---|---|---|
2822
+ | `body.external_id` | `string` | yes | |
2823
+ | `body.integration` | `string` | yes | |
2824
+ | `body.credential_id` | `integer \| null` | no | |
2825
+ | `body.event_type_id` | `integer \| null` | no | |
2826
+
2827
+ **Returns** `DestinationCalendarEnvelope`: the envelope `{ data: DestinationCalendarResponse | null, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2828
+
2829
+ `data` fields:
2830
+
2831
+ | Field | Type | Required | Description |
2832
+ |---|---|---|---|
2833
+ | `external_id` | `string` | yes | |
2834
+ | `id` | `integer` | yes | |
2835
+ | `integration` | `string` | yes | |
2836
+ | `credential_id` | `integer \| null` | no | |
2837
+ | `event_type_id` | `integer \| null` | no | |
2838
+ | `primary_email` | `string \| null` | no | |
2839
+
2840
+ **Example**
2841
+
2842
+ ```ts
2843
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
2844
+ const result = await g8.api.appointments.setDestinationCalendar({ body: { external_id: "id", integration: "example" } });
2845
+ ```
2846
+
2847
+ ---
2848
+
2849
+ <a id="op-seteventtypedestinationcalendar"></a>
2850
+
2851
+ ### `g8.api.appointments.setEventTypeDestinationCalendar(input)`
2852
+
2853
+ **Set Event Type Destination Calendar**
2854
+
2855
+ - HTTP: `PUT /api/v1/appointments/event-types/{event_type_id}/destination-calendar`
2856
+ - operationId: `set_event_type_destination_calendar_appointments_event_types__event_type_id__destination_calendar_put` (also callable as `g8.api.call("set_event_type_destination_calendar_appointments_event_types__event_type_id__destination_calendar_put", input)`)
2857
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2858
+ - API-key scope: `meetings:write`
2859
+
2860
+ Point one event type at a specific calendar.
2861
+
2862
+ The credential must belong to the key owner - the app enforces that, which
2863
+ is why this cannot write bookings onto a colleague's calendar.
2864
+
2865
+ **Input**
2866
+
2867
+ | Field | Type | Required | Description |
2868
+ |---|---|---|---|
2869
+ | `path.event_type_id` | `integer` | yes | Event type id. |
2870
+ | `body` | `UpdateDestinationCalendarRequest` | yes | Request body; fields below. |
2871
+
2872
+ Body fields (`UpdateDestinationCalendarRequest`):
2873
+
2874
+ | Field | Type | Required | Description |
2875
+ |---|---|---|---|
2876
+ | `body.credential_id` | `integer` | yes | The connected-calendar credential to write through. |
2877
+ | `body.external_id` | `string` | yes | The calendar's id in the provider. |
2878
+ | `body.integration` | `string` | yes | Calendar integration key, e.g. `google_calendar`. |
2879
+ | `body.primary_email` | `string \| null` | no | |
2880
+ | `body.use_calendar_email` | `boolean` | no | Send invitations from the calendar's own address rather than the host's. default `false` |
2881
+
2882
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2883
+
2884
+ Other envelope fields: `pagination` (PaginationMeta).
2885
+
2886
+ **Example**
2887
+
2888
+ ```ts
2889
+ const result = await g8.api.appointments.setEventTypeDestinationCalendar({
2890
+ path: { event_type_id: 123 },
2891
+ body: { credential_id: 123, external_id: "id", integration: "example" },
2892
+ });
2893
+ ```
2894
+
2895
+ ---
2896
+
2897
+ <a id="op-seteventtypeselectedcalendars"></a>
2898
+
2899
+ ### `g8.api.appointments.setEventTypeSelectedCalendars(input)`
2900
+
2901
+ **Set Event Type Selected Calendars**
2902
+
2903
+ - HTTP: `PUT /api/v1/appointments/event-types/{event_type_id}/selected-calendars`
2904
+ - operationId: `set_event_type_selected_calendars_appointments_event_types__event_type_id__selected_calendars_put` (also callable as `g8.api.call("set_event_type_selected_calendars_appointments_event_types__event_type_id__selected_calendars_put", input)`)
2905
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2906
+ - API-key scope: `meetings:write`
2907
+
2908
+ Set the conflict-check scope for this event type.
2909
+
2910
+ `scope="account"` falls back to the key owner's account-wide selection
2911
+ and IGNORES `entries`. `scope="event_type"` REPLACES the per-event-type
2912
+ list with the entries sent (only `enabled` ones are kept) - so an empty
2913
+ list there means nothing is checked and every slot looks free.
2914
+
2915
+ **Input**
2916
+
2917
+ | Field | Type | Required | Description |
2918
+ |---|---|---|---|
2919
+ | `path.event_type_id` | `integer` | yes | Event type id. |
2920
+ | `body` | `UpdateSelectedCalendarsRequest` | yes | Request body; fields below. |
2921
+
2922
+ Body fields (`UpdateSelectedCalendarsRequest`):
2923
+
2924
+ | Field | Type | Required | Description |
2925
+ |---|---|---|---|
2926
+ | `body.scope` | `"account" \| "event_type"` | yes | |
2927
+ | `body.entries` | `Array<SelectedCalendarEntry>` | no | |
2928
+
2929
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2930
+
2931
+ Other envelope fields: `pagination` (PaginationMeta).
2932
+
2933
+ **Example**
2934
+
2935
+ ```ts
2936
+ const result = await g8.api.appointments.setEventTypeSelectedCalendars({ path: { event_type_id: 123 }, body: { scope: "account" } });
2937
+ ```
2938
+
2939
+ ---
2940
+
2941
+ <a id="op-setlockedfields"></a>
2942
+
2943
+ ### `g8.api.appointments.setLockedFields(input)`
2944
+
2945
+ **Set Locked Fields**
2946
+
2947
+ - HTTP: `PUT /api/v1/appointments/event-types/{event_type_id}/locked-fields`
2948
+ - operationId: `set_locked_fields_appointments_event_types__event_type_id__locked_fields_put` (also callable as `g8.api.call("set_locked_fields_appointments_event_types__event_type_id__locked_fields_put", input)`)
2949
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
2950
+ - API-key scope: `meetings:write`
2951
+
2952
+ Decide which fields a managed template owns for every child copy.
2953
+
2954
+ A locked field is read-only on the child AND is re-propagated from the
2955
+ template - so locking `length` after the fact OVERWRITES whatever each
2956
+ member had set. `propagation_notice` in the result counts the future
2957
+ bookings that touched. An empty list unlocks everything.
2958
+
2959
+ **Input**
2960
+
2961
+ | Field | Type | Required | Description |
2962
+ |---|---|---|---|
2963
+ | `path.event_type_id` | `integer` | yes | Event type id. |
2964
+ | `body` | `SetLockedFieldsRequest` | yes | Request body; fields below. |
2965
+
2966
+ Body fields (`SetLockedFieldsRequest`):
2967
+
2968
+ | Field | Type | Required | Description |
2969
+ |---|---|---|---|
2970
+ | `body.locked_fields` | `Array<"after_event_buffer" \| "before_event_buffer" \| "booking_fields" \| "description" \| "disable_cancelling" \| "disable_guests" \| "disable_rescheduling" \| "event_name" \| …>` | no | Fields locked on the managed template. An empty list unlocks everything. |
2971
+
2972
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
2973
+
2974
+ Other envelope fields: `pagination` (PaginationMeta).
2975
+
2976
+ **Example**
2977
+
2978
+ ```ts
2979
+ const result = await g8.api.appointments.setLockedFields({ path: { event_type_id: 123 }, body: {} });
2980
+ ```
2981
+
2982
+ ---
2983
+
2984
+ <a id="op-setproviderlink"></a>
2985
+
2986
+ ### `g8.api.appointments.setProviderLink(input)`
2987
+
2988
+ **Set or update a link-based conferencing provider's meeting URL**
2989
+
2990
+ - HTTP: `PUT /api/v1/appointments/conferencing/{provider}/link`
2991
+ - operationId: `set_provider_link_appointments_conferencing__provider__link_put` (also callable as `g8.api.call("set_provider_link_appointments_conferencing__provider__link_put", input)`)
2992
+ - 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
2993
+ - API-key scope: `meetings:run`
2994
+
2995
+ Set or update the meeting URL for a link-based conferencing provider
2996
+ (roam, whereby, jitsi). The provider must already be installed. Validates
2997
+ the URL against the provider's pattern. Reuses the in-app set_provider_link
2998
+ logic (validate + update_credential_key).
2999
+
3000
+ **Input**
3001
+
3002
+ | Field | Type | Required | Description |
3003
+ |---|---|---|---|
3004
+ | `path.provider` | `string` | yes | |
3005
+ | `body` | `Body_set_provider_link_appointments_conferencing__provider__link_put` | yes | Request body; fields below. |
3006
+
3007
+ Body fields (`Body_set_provider_link_appointments_conferencing__provider__link_put`):
3008
+
3009
+ | Field | Type | Required | Description |
3010
+ |---|---|---|---|
3011
+ | `body.link` | `string` | yes | |
3012
+
3013
+ **Returns** `Record<string, unknown>`.
3014
+
3015
+ **Example**
3016
+
3017
+ ```ts
3018
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
3019
+ const result = await g8.api.appointments.setProviderLink({ path: { provider: "example" }, body: { link: "example" } });
3020
+ ```
3021
+
3022
+ ---
3023
+
3024
+ <a id="op-toggleworkflow"></a>
3025
+
3026
+ ### `g8.api.appointments.toggleWorkflow(input)`
3027
+
3028
+ **Activate or deactivate a workflow**
3029
+
3030
+ - HTTP: `POST /api/v1/appointments/workflows/{workflow_id}/toggle`
3031
+ - operationId: `toggle_workflow_appointments_workflows__workflow_id__toggle_post` (also callable as `g8.api.call("toggle_workflow_appointments_workflows__workflow_id__toggle_post", input)`)
3032
+ - 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
3033
+ - API-key scope: `meetings:run`
3034
+
3035
+ Set the workflow's active state. When deactivating (``active: false``),
3036
+ all pending reminders are cancelled first (same behaviour as the in-app
3037
+ toggle) so the reminder worker never fires steps for a disabled workflow.
3038
+
3039
+ **Input**
3040
+
3041
+ | Field | Type | Required | Description |
3042
+ |---|---|---|---|
3043
+ | `path.workflow_id` | `integer` | yes | Workflow integer ID. |
3044
+ | `body` | `ToggleWorkflowRequest` | yes | Request body; fields below. |
3045
+
3046
+ Body fields (`ToggleWorkflowRequest`):
3047
+
3048
+ | Field | Type | Required | Description |
3049
+ |---|---|---|---|
3050
+ | `body.active` | `boolean` | yes | |
3051
+
3052
+ **Returns** `Record<string, unknown>`.
3053
+
3054
+ **Example**
3055
+
3056
+ ```ts
3057
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
3058
+ const result = await g8.api.appointments.toggleWorkflow({ path: { workflow_id: 1 }, body: { active: true } });
3059
+ ```
3060
+
3061
+ ---
3062
+
3063
+ <a id="op-unassignmanagedmember"></a>
3064
+
3065
+ ### `g8.api.appointments.unassignManagedMember(input)`
3066
+
3067
+ **Unassign Managed Member**
3068
+
3069
+ - HTTP: `DELETE /api/v1/appointments/event-types/{event_type_id}/members/{user_id}`
3070
+ - operationId: `unassign_managed_member_appointments_event_types__event_type_id__members__user_id__delete` (also callable as `g8.api.call("unassign_managed_member_appointments_event_types__event_type_id__members__user_id__delete", input)`)
3071
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
3072
+ - API-key scope: `meetings:delete`
3073
+
3074
+ Take a member off a managed template.
3075
+
3076
+ DESTRUCTIVE in a way the name understates: this HARD-DELETES that member's
3077
+ child event type, so their booking link for it stops resolving. Bookings
3078
+ already made survive, detached from any event type.
3079
+
3080
+ **Input**
3081
+
3082
+ | Field | Type | Required | Description |
3083
+ |---|---|---|---|
3084
+ | `path.event_type_id` | `integer` | yes | Event type id. |
3085
+ | `path.user_id` | `integer` | yes | The member's integer scheduling user id. |
3086
+
3087
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3088
+
3089
+ Other envelope fields: `pagination` (PaginationMeta).
3090
+
3091
+ **Example**
3092
+
3093
+ ```ts
3094
+ // destructive: deletes or archives data; confirm with a human before calling.
3095
+ const result = await g8.api.appointments.unassignManagedMember({ path: { event_type_id: 123, user_id: 1 } });
3096
+ ```
3097
+
3098
+ ---
3099
+
3100
+ <a id="op-updateavailability"></a>
3101
+
3102
+ ### `g8.api.appointments.updateAvailability(input)`
3103
+
3104
+ **Replace availability rules and/or date overrides for a schedule**
3105
+
3106
+ - HTTP: `PATCH /api/v1/appointments/schedules/{schedule_id}/availability`
3107
+ - operationId: `update_availability_appointments_schedules__schedule_id__availability_patch` (also callable as `g8.api.call("update_availability_appointments_schedules__schedule_id__availability_patch", input)`)
3108
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
3109
+ - API-key scope: `meetings:write`
3110
+
3111
+ Replace weekly availability rules and/or date overrides for a schedule.
3112
+
3113
+ Body: ``{"availability": [...], "overrides": [...]}``
3114
+
3115
+ - ``availability``: list of ``{days, start_time, end_time}`` - replaces ALL weekly rules.
3116
+ - ``overrides``: list of ``{date, start_time, end_time}`` - replaces ALL date overrides.
3117
+
3118
+ Omit a key to leave that set unchanged. At least one key is required.
3119
+ Mirrors the in-app ``PATCH /schedules/{id}/availability`` logic verbatim.
3120
+ Typed via ``UpdateAvailabilityRequest`` so malformed items fail at FastAPI
3121
+ validation (422) rather than as an opaque 500.
3122
+
3123
+ **Input**
3124
+
3125
+ | Field | Type | Required | Description |
3126
+ |---|---|---|---|
3127
+ | `path.schedule_id` | `integer` | yes | Schedule integer ID. |
3128
+ | `body` | `UpdateAvailabilityRequest` | yes | Request body; fields below. |
3129
+
3130
+ Body fields (`UpdateAvailabilityRequest`):
3131
+
3132
+ | Field | Type | Required | Description |
3133
+ |---|---|---|---|
3134
+ | `body.availability` | `Array<AvailabilityInput> \| null` | no | |
3135
+ | `body.overrides` | `Array<OverrideInput> \| null` | no | |
3136
+
3137
+ **Returns** `Record<string, unknown>`.
3138
+
3139
+ **Example**
3140
+
3141
+ ```ts
3142
+ const result = await g8.api.appointments.updateAvailability({ path: { schedule_id: 1 }, body: {} });
3143
+ ```
3144
+
3145
+ ---
3146
+
3147
+ <a id="op-updatebookinglocation"></a>
3148
+
3149
+ ### `g8.api.appointments.updateBookingLocation(input)`
3150
+
3151
+ **Update the meeting location and notify both parties**
3152
+
3153
+ - HTTP: `PATCH /api/v1/appointments/bookings/{booking_uid}/location`
3154
+ - operationId: `update_booking_location_appointments_bookings__booking_uid__location_patch` (also callable as `g8.api.call("update_booking_location_appointments_bookings__booking_uid__location_patch", input)`)
3155
+ - 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
3156
+ - API-key scope: `meetings:run`
3157
+
3158
+ Change the meeting location for a booking and re-notify both parties.
3159
+
3160
+ ``location`` is a location key such as ``"zoom"``, ``"google_meet"``,
3161
+ ``"in_person"``, or a custom URL. Backed by
3162
+ ``BookingsHandler.handle_update_location`` (updates the booking row,
3163
+ sends location-updated emails, emits an EDA event). Raises 404 when
3164
+ the booking uid is not visible to the caller.
3165
+
3166
+ **Input**
3167
+
3168
+ | Field | Type | Required | Description |
3169
+ |---|---|---|---|
3170
+ | `path.booking_uid` | `string` | yes | Booking UID (uuid string). |
3171
+ | `body` | `UpdateLocationRequest` | yes | Request body; fields below. |
3172
+
3173
+ Body fields (`UpdateLocationRequest`):
3174
+
3175
+ | Field | Type | Required | Description |
3176
+ |---|---|---|---|
3177
+ | `body.location` | `string` | yes | |
3178
+
3179
+ **Returns** `Record<string, unknown>`.
3180
+
3181
+ **Example**
3182
+
3183
+ ```ts
3184
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
3185
+ const result = await g8.api.appointments.updateBookingLocation({ path: { booking_uid: "example" }, body: { location: "example" } });
3186
+ ```
3187
+
3188
+ ---
3189
+
3190
+ <a id="op-updatebookingsequence"></a>
3191
+
3192
+ ### `g8.api.appointments.updateBookingSequence(input)`
3193
+
3194
+ **Associate a booking with a sequence (or detach)**
3195
+
3196
+ - HTTP: `PATCH /api/v1/appointments/bookings/{booking_uid}/sequence`
3197
+ - operationId: `update_booking_sequence_appointments_bookings__booking_uid__sequence_patch` (also callable as `g8.api.call("update_booking_sequence_appointments_bookings__booking_uid__sequence_patch", input)`)
3198
+ - 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
3199
+ - API-key scope: `meetings:run`
3200
+
3201
+ Link a booking to a sequencer sequence or remove the link.
3202
+
3203
+ ``sequence_id`` is the sequence UUID (``seqsequences.id``); pass
3204
+ ``null`` / omit to detach. Writes to
3205
+ ``booking.metadata_['campaignId']`` - the same field the public booking
3206
+ flow populates from ``?campaignId=`` at create time. No EDA event is
3207
+ emitted (CRM-only action). Backed by
3208
+ ``BookingsHandler.handle_update_sequence``. Raises 404 when the
3209
+ booking uid is not visible to the caller.
3210
+
3211
+ **Input**
3212
+
3213
+ | Field | Type | Required | Description |
3214
+ |---|---|---|---|
3215
+ | `path.booking_uid` | `string` | yes | Booking UID (uuid string). |
3216
+ | `body` | `appointments__domain__entities__UpdateSequenceRequest` | yes | Request body; fields below. |
3217
+
3218
+ Body fields (`appointments__domain__entities__UpdateSequenceRequest`):
3219
+
3220
+ | Field | Type | Required | Description |
3221
+ |---|---|---|---|
3222
+ | `body.sequence_id` | `string \| null` | no | |
3223
+
3224
+ **Returns** `Record<string, unknown>`.
3225
+
3226
+ **Example**
3227
+
3228
+ ```ts
3229
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
3230
+ const result = await g8.api.appointments.updateBookingSequence({ path: { booking_uid: "example" }, body: {} });
3231
+ ```
3232
+
3233
+ ---
3234
+
3235
+ <a id="op-updateembedconfig"></a>
3236
+
3237
+ ### `g8.api.appointments.updateEmbedConfig(input)`
3238
+
3239
+ **Update Embed Config**
3240
+
3241
+ - HTTP: `PATCH /api/v1/appointments/event-types/{event_type_id}/embed`
3242
+ - operationId: `update_embed_config_appointments_event_types__event_type_id__embed_patch` (also callable as `g8.api.call("update_embed_config_appointments_event_types__event_type_id__embed_patch", input)`)
3243
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
3244
+ - API-key scope: `meetings:write`
3245
+
3246
+ Restyle the embedded booking widget. Only what you send is written.
3247
+
3248
+ Like the org branding, this is visible to PROSPECTS rather than the team.
3249
+
3250
+ **Input**
3251
+
3252
+ | Field | Type | Required | Description |
3253
+ |---|---|---|---|
3254
+ | `path.event_type_id` | `integer` | yes | Event type id. |
3255
+ | `body` | `UpdateEmbedConfigRequest` | yes | Request body; fields below. |
3256
+
3257
+ Body fields (`UpdateEmbedConfigRequest`):
3258
+
3259
+ | Field | Type | Required | Description |
3260
+ |---|---|---|---|
3261
+ | `body.brand_color` | `string \| null` | no | |
3262
+ | `body.brand_color_dark` | `string \| null` | no | |
3263
+ | `body.button_position` | `string \| null` | no | |
3264
+ | `body.button_text` | `string \| null` | no | |
3265
+ | `body.button_text_color` | `string \| null` | no | |
3266
+ | `body.hide_event_type_details` | `boolean \| null` | no | |
3267
+ | `body.layout` | `string \| null` | no | |
3268
+ | `body.theme` | `string \| null` | no | |
3269
+
3270
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3271
+
3272
+ Other envelope fields: `pagination` (PaginationMeta).
3273
+
3274
+ **Example**
3275
+
3276
+ ```ts
3277
+ const result = await g8.api.appointments.updateEmbedConfig({ path: { event_type_id: 123 }, body: {} });
3278
+ ```
3279
+
3280
+ ---
3281
+
3282
+ <a id="op-updateeventtype"></a>
3283
+
3284
+ ### `g8.api.appointments.updateEventType(input)`
3285
+
3286
+ **Update an event type (partial)**
3287
+
3288
+ - HTTP: `PATCH /api/v1/appointments/event-types/{event_type_id}`
3289
+ - operationId: `update_event_type_appointments_event_types__event_type_id__patch` (also callable as `g8.api.call("update_event_type_appointments_event_types__event_type_id__patch", input)`)
3290
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
3291
+ - API-key scope: `meetings:write`
3292
+
3293
+ Partially update an event type. Only the fields you send are changed
3294
+ (``exclude_unset`` semantics) - omit a field to leave it untouched, including
3295
+ ``hidden`` (the active/visible toggle). Reuses
3296
+ ``EventTypesHandler.handle_update`` (schedule-ownership guard, host policy).
3297
+ ``is_admin`` is forced False.
3298
+
3299
+ **Input**
3300
+
3301
+ | Field | Type | Required | Description |
3302
+ |---|---|---|---|
3303
+ | `path.event_type_id` | `integer` | yes | Event-type integer ID. |
3304
+ | `body` | `UpdateEventTypeRequest` | yes | Request body; fields below. |
3305
+
3306
+ Body fields (`UpdateEventTypeRequest`):
3307
+
3308
+ | Field | Type | Required | Description |
3309
+ |---|---|---|---|
3310
+ | `body.after_event_buffer` | `integer \| null` | no | |
3311
+ | `body.before_event_buffer` | `integer \| null` | no | |
3312
+ | `body.booking_fields` | `Array<Record<string, unknown>> \| null` | no | |
3313
+ | `body.default_layout` | `string \| null` | no | |
3314
+ | `body.description` | `string \| null` | no | |
3315
+ | `body.disable_cancelling` | `boolean \| null` | no | |
3316
+ | `body.disable_guests` | `boolean \| null` | no | |
3317
+ | `body.disable_rescheduling` | `boolean \| null` | no | |
3318
+ | `body.event_color` | `string \| null` | no | |
3319
+ | `body.event_name` | `string \| null` | no | |
3320
+ | `body.hidden` | `boolean \| null` | no | |
3321
+ | `body.layouts` | `Array<string> \| null` | no | |
3322
+ | `body.length` | `integer \| null` | no | |
3323
+ | `body.locations` | `Array<Record<string, unknown>> \| null` | no | |
3324
+ | `body.metadata` | `Record<string, unknown> \| null` | no | |
3325
+ | `body.minimum_booking_notice` | `integer \| null` | no | |
3326
+ | `body.period_days` | `integer \| null` | no | |
3327
+ | `body.period_end_date` | `string \| null` | no | |
3328
+ | `body.period_start_date` | `string \| null` | no | |
3329
+ | `body.period_type` | `string \| null` | no | |
3330
+ | `body.recurring_event` | `Record<string, unknown> \| null` | no | |
3331
+ | `body.requires_confirmation` | `boolean \| null` | no | |
3332
+ | `body.schedule_id` | `integer \| null` | no | |
3333
+ | `body.scheduling_type` | `string \| null` | no | |
3334
+ | `body.seats_per_time_slot` | `integer \| null` | no | |
3335
+ | `body.slot_interval` | `integer \| null` | no | |
3336
+ | `body.slug` | `string \| null` | no | |
3337
+ | `body.success_redirect_url` | `string \| null` | no | |
3338
+ | `body.time_zone` | `string \| null` | no | |
3339
+ | `body.title` | `string \| null` | no | |
3340
+ | `body.use_common_schedule` | `boolean \| null` | no | |
3341
+
3342
+ **Returns** `Record<string, unknown>`.
3343
+
3344
+ **Example**
3345
+
3346
+ ```ts
3347
+ const result = await g8.api.appointments.updateEventType({ path: { event_type_id: 1 }, body: {} });
3348
+ ```
3349
+
3350
+ ---
3351
+
3352
+ <a id="op-updateeventtypehost"></a>
3353
+
3354
+ ### `g8.api.appointments.updateEventTypeHost(input)`
3355
+
3356
+ **Update Event Type Host**
3357
+
3358
+ - HTTP: `PATCH /api/v1/appointments/event-types/{event_type_id}/hosts/{host_user_id}`
3359
+ - operationId: `update_event_type_host_appointments_event_types__event_type_id__hosts__host_user_id__patch` (also callable as `g8.api.call("update_event_type_host_appointments_event_types__event_type_id__hosts__host_user_id__patch", input)`)
3360
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
3361
+ - API-key scope: `meetings:write`
3362
+
3363
+ Change a host's rotation settings. Omitted fields are left alone.
3364
+
3365
+ **Input**
3366
+
3367
+ | Field | Type | Required | Description |
3368
+ |---|---|---|---|
3369
+ | `path.event_type_id` | `integer` | yes | Event type id. |
3370
+ | `path.host_user_id` | `integer` | yes | Host user id. |
3371
+ | `body` | `AppointmentHostUpdateRequest` | yes | Request body; fields below. |
3372
+
3373
+ Body fields (`AppointmentHostUpdateRequest`):
3374
+
3375
+ | Field | Type | Required | Description |
3376
+ |---|---|---|---|
3377
+ | `body.group_id` | `string \| null` | no | |
3378
+ | `body.is_fixed` | `boolean \| null` | no | |
3379
+ | `body.priority` | `integer \| null` | no | |
3380
+ | `body.schedule_id` | `integer \| null` | no | |
3381
+ | `body.weight` | `integer \| null` | no | |
3382
+
3383
+ **Returns** `ApiResponse_AppointmentHost_`: the envelope `{ data: AppointmentHost, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3384
+
3385
+ Other envelope fields: `pagination` (PaginationMeta).
3386
+
3387
+ `AppointmentHost` fields:
3388
+
3389
+ | Field | Type | Required | Description |
3390
+ |---|---|---|---|
3391
+ | `avatar_url` | `string \| null` | no | |
3392
+ | `email` | `string \| null` | no | |
3393
+ | `event_type_id` | `integer \| null` | no | |
3394
+ | `group_id` | `string \| null` | no | Host group, if partitioned. |
3395
+ | `is_fixed` | `boolean \| null` | no | True = on EVERY booking. False = one of the round-robin rotation. This is the setting that decides who actually gets booked. |
3396
+ | `name` | `string \| null` | no | |
3397
+ | `priority` | `integer \| null` | no | Rotation priority. |
3398
+ | `schedule_id` | `integer \| null` | no | Availability schedule this host is booked against. |
3399
+ | `user_id` | `integer \| null` | no | |
3400
+ | `weight` | `integer \| null` | no | Relative share of the rotation. |
3401
+
3402
+ **Example**
3403
+
3404
+ ```ts
3405
+ const result = await g8.api.appointments.updateEventTypeHost({ path: { event_type_id: 123, host_user_id: 123 }, body: {} });
3406
+ ```
3407
+
3408
+ ---
3409
+
3410
+ <a id="op-updateeventtypehostgroup"></a>
3411
+
3412
+ ### `g8.api.appointments.updateEventTypeHostGroup(input)`
3413
+
3414
+ **Update Event Type Host Group**
3415
+
3416
+ - HTTP: `PATCH /api/v1/appointments/event-types/{event_type_id}/host-groups/{group_id}`
3417
+ - operationId: `update_event_type_host_group_appointments_event_types__event_type_id__host_groups__group_id__patch` (also callable as `g8.api.call("update_event_type_host_group_appointments_event_types__event_type_id__host_groups__group_id__patch", input)`)
3418
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
3419
+ - API-key scope: `meetings:write`
3420
+
3421
+ Rename a host group.
3422
+
3423
+ **Input**
3424
+
3425
+ | Field | Type | Required | Description |
3426
+ |---|---|---|---|
3427
+ | `path.event_type_id` | `integer` | yes | Event type id. |
3428
+ | `path.group_id` | `string` | yes | Host group id. |
3429
+ | `body` | `AppointmentHostGroupWriteRequest` | yes | Request body; fields below. |
3430
+
3431
+ Body fields (`AppointmentHostGroupWriteRequest`):
3432
+
3433
+ | Field | Type | Required | Description |
3434
+ |---|---|---|---|
3435
+ | `body.name` | `string` | yes | Group name. min length 1 |
3436
+
3437
+ **Returns** `ApiResponse_AppointmentHostGroup_`: the envelope `{ data: AppointmentHostGroup, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3438
+
3439
+ Other envelope fields: `pagination` (PaginationMeta).
3440
+
3441
+ `AppointmentHostGroup` fields:
3442
+
3443
+ | Field | Type | Required | Description |
3444
+ |---|---|---|---|
3445
+ | `created_at` | `string (date-time) \| null` | no | |
3446
+ | `event_type_id` | `integer \| null` | no | |
3447
+ | `id` | `string \| null` | no | |
3448
+ | `name` | `string \| null` | no | |
3449
+
3450
+ **Example**
3451
+
3452
+ ```ts
3453
+ const result = await g8.api.appointments.updateEventTypeHostGroup({
3454
+ path: { event_type_id: 123, group_id: "id" },
3455
+ body: { name: "Example" },
3456
+ });
3457
+ ```
3458
+
3459
+ ---
3460
+
3461
+ <a id="op-updatememberrole"></a>
3462
+
3463
+ ### `g8.api.appointments.updateMemberRole(input)`
3464
+
3465
+ **Update Member Role**
3466
+
3467
+ - HTTP: `PATCH /api/v1/appointments/membership/by-user/{user_id}/role`
3468
+ - operationId: `update_member_role_appointments_membership_by_user__user_id__role_patch` (also callable as `g8.api.call("update_member_role_appointments_membership_by_user__user_id__role_patch", input)`)
3469
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
3470
+ - API-key scope: `meetings:delete`
3471
+
3472
+ Change someone's SCHEDULING role. Admin keys only.
3473
+
3474
+ This decides what they can do in scheduling, not in graph8 generally -
3475
+ organisation roles live in Settings and are not reachable from here.
3476
+
3477
+ **Input**
3478
+
3479
+ | Field | Type | Required | Description |
3480
+ |---|---|---|---|
3481
+ | `path.user_id` | `integer` | yes | The member's INTEGER scheduling user id - `user_id` from `GET /appointments/membership`. Not a PropelAuth id or an email. |
3482
+ | `body` | `UpdateMemberRoleRequest` | yes | Request body; fields below. |
3483
+
3484
+ Body fields (`UpdateMemberRoleRequest`):
3485
+
3486
+ | Field | Type | Required | Description |
3487
+ |---|---|---|---|
3488
+ | `body.role` | `"ADMIN" \| "MEMBER"` | yes | |
3489
+
3490
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3491
+
3492
+ Other envelope fields: `pagination` (PaginationMeta).
3493
+
3494
+ **Example**
3495
+
3496
+ ```ts
3497
+ // destructive: deletes or archives data; confirm with a human before calling.
3498
+ const result = await g8.api.appointments.updateMemberRole({ path: { user_id: 123 }, body: { role: "ADMIN" } });
3499
+ ```
3500
+
3501
+ ---
3502
+
3503
+ <a id="op-updateooo"></a>
3504
+
3505
+ ### `g8.api.appointments.updateOoo(input)`
3506
+
3507
+ **Update an out-of-office entry**
3508
+
3509
+ - HTTP: `PATCH /api/v1/appointments/out-of-office/{ooo_uuid}`
3510
+ - operationId: `update_ooo_appointments_out_of_office__ooo_uuid__patch` (also callable as `g8.api.call("update_ooo_appointments_out_of_office__ooo_uuid__patch", input)`)
3511
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
3512
+ - API-key scope: `meetings:write`
3513
+
3514
+ Update an entry owned by the calling API user.
3515
+
3516
+ **Input**
3517
+
3518
+ | Field | Type | Required | Description |
3519
+ |---|---|---|---|
3520
+ | `path.ooo_uuid` | `string` | yes | UUID of the out-of-office entry to update. |
3521
+ | `body` | `UpdateOutOfOfficeRequest` | yes | Request body; fields below. |
3522
+
3523
+ Body fields (`UpdateOutOfOfficeRequest`):
3524
+
3525
+ | Field | Type | Required | Description |
3526
+ |---|---|---|---|
3527
+ | `body.end` | `string \| null` | no | |
3528
+ | `body.notes` | `string \| null` | no | |
3529
+ | `body.public_note` | `string \| null` | no | |
3530
+ | `body.reason` | `string \| null` | no | |
3531
+ | `body.start` | `string \| null` | no | |
3532
+ | `body.time_zone` | `string \| null` | no | |
3533
+ | `body.to_user_id` | `integer \| null` | no | |
3534
+
3535
+ **Returns** `Record<string, unknown>`.
3536
+
3537
+ **Example**
3538
+
3539
+ ```ts
3540
+ const result = await g8.api.appointments.updateOoo({
3541
+ path: { ooo_uuid: "00000000-0000-0000-0000-000000000000" },
3542
+ body: {},
3543
+ });
3544
+ ```
3545
+
3546
+ ---
3547
+
3548
+ <a id="op-updateorgsettings"></a>
3549
+
3550
+ ### `g8.api.appointments.updateOrgSettings(input)`
3551
+
3552
+ **Update Org Settings**
3553
+
3554
+ - HTTP: `PATCH /api/v1/appointments/org-settings`
3555
+ - operationId: `update_org_settings_appointments_org_settings_patch` (also callable as `g8.api.call("update_org_settings_appointments_org_settings_patch", input)`)
3556
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
3557
+ - API-key scope: `meetings:write`
3558
+
3559
+ Change the booking page's branding. Admin keys only.
3560
+
3561
+ Only what you send is written. This is what a PROSPECT sees, so a wrong
3562
+ value here is visible outside the organisation rather than inside it.
3563
+
3564
+ **Input**
3565
+
3566
+ | Field | Type | Required | Description |
3567
+ |---|---|---|---|
3568
+ | `body` | `UpdateOrgSettingsRequest` | yes | Request body; fields below. |
3569
+
3570
+ Body fields (`UpdateOrgSettingsRequest`):
3571
+
3572
+ | Field | Type | Required | Description |
3573
+ |---|---|---|---|
3574
+ | `body.booking_page_theme` | `"light" \| "dark" \| "auto" \| null` | no | |
3575
+ | `body.brand_color` | `string \| null` | no | Six-digit hex including the leading `#`, e.g. `#1a2b3c`. pattern `^#[0-9a-fA-F]{6}$` |
3576
+ | `body.hide_branding` | `boolean \| null` | no | Remove the graph8 mark from the booking page. |
3577
+ | `body.logo_url` | `string (uri) \| null` | no | min length 1, max length 2083 |
3578
+
3579
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3580
+
3581
+ Other envelope fields: `pagination` (PaginationMeta).
3582
+
3583
+ **Example**
3584
+
3585
+ ```ts
3586
+ const result = await g8.api.appointments.updateOrgSettings({ body: {} });
3587
+ ```
3588
+
3589
+ ---
3590
+
3591
+ <a id="op-updateroutingform"></a>
3592
+
3593
+ ### `g8.api.appointments.updateRoutingForm(input)`
3594
+
3595
+ **Update a routing form (partial)**
3596
+
3597
+ - HTTP: `PATCH /api/v1/appointments/routing-forms/{form_id}`
3598
+ - operationId: `update_routing_form_appointments_routing_forms__form_id__patch` (also callable as `g8.api.call("update_routing_form_appointments_routing_forms__form_id__patch", input)`)
3599
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
3600
+ - API-key scope: `meetings:write`
3601
+
3602
+ Partially update a routing form. Only sent fields are changed.
3603
+
3604
+ Omit a field to leave it untouched. Slug must be unique in the org (409 on
3605
+ collision). Fields/routes are replaced atomically when present in the body.
3606
+
3607
+ **Input**
3608
+
3609
+ | Field | Type | Required | Description |
3610
+ |---|---|---|---|
3611
+ | `path.form_id` | `integer` | yes | Routing form integer ID. |
3612
+ | `body` | `UpdateRoutingFormRequest` | yes | Request body; fields below. |
3613
+
3614
+ Body fields (`UpdateRoutingFormRequest`):
3615
+
3616
+ | Field | Type | Required | Description |
3617
+ |---|---|---|---|
3618
+ | `body.description` | `string \| null` | no | |
3619
+ | `body.disabled` | `boolean \| null` | no | |
3620
+ | `body.fields` | `Array<RoutingFormField> \| null` | no | |
3621
+ | `body.name` | `string \| null` | no | min length 1, max length 255 |
3622
+ | `body.routes` | `Array<RoutingFormRouteInput> \| null` | no | |
3623
+ | `body.slug` | `string \| null` | no | |
3624
+
3625
+ **Returns** `Record<string, unknown>`.
3626
+
3627
+ **Example**
3628
+
3629
+ ```ts
3630
+ const result = await g8.api.appointments.updateRoutingForm({ path: { form_id: 1 }, body: {} });
3631
+ ```
3632
+
3633
+ ---
3634
+
3635
+ <a id="op-updatesavedfilter"></a>
3636
+
3637
+ ### `g8.api.appointments.updateSavedFilter(input)`
3638
+
3639
+ **Update Saved Filter**
3640
+
3641
+ - HTTP: `PUT /api/v1/appointments/saved-filters/{filter_id}`
3642
+ - operationId: `update_saved_filter_appointments_saved_filters__filter_id__put` (also callable as `g8.api.call("update_saved_filter_appointments_saved_filters__filter_id__put", input)`)
3643
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
3644
+ - API-key scope: `meetings:write`
3645
+
3646
+ Change a saved view.
3647
+
3648
+ `null` LEAVES A FIELD ALONE, except `description`, where null is a real
3649
+ clear. That asymmetry is the app's and is mirrored rather than smoothed
3650
+ over, because smoothing it would make "remove the description" impossible.
3651
+
3652
+ **Input**
3653
+
3654
+ | Field | Type | Required | Description |
3655
+ |---|---|---|---|
3656
+ | `path.filter_id` | `string` | yes | Filter id (UUID). |
3657
+ | `body` | `UpdateSavedFilterRequest` | yes | Request body; fields below. |
3658
+
3659
+ Body fields (`UpdateSavedFilterRequest`):
3660
+
3661
+ | Field | Type | Required | Description |
3662
+ |---|---|---|---|
3663
+ | `body.description` | `string \| null` | no | Null CLEARS this one, unlike the others. max length 2000 |
3664
+ | `body.state` | `Record<string, unknown> \| null` | no | |
3665
+ | `body.title` | `string \| null` | no | min length 1, max length 120 |
3666
+
3667
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3668
+
3669
+ Other envelope fields: `pagination` (PaginationMeta).
3670
+
3671
+ **Example**
3672
+
3673
+ ```ts
3674
+ const result = await g8.api.appointments.updateSavedFilter({ path: { filter_id: "id" }, body: {} });
3675
+ ```
3676
+
3677
+ ---
3678
+
3679
+ <a id="op-updateschedule"></a>
3680
+
3681
+ ### `g8.api.appointments.updateSchedule(input)`
3682
+
3683
+ **Update a schedule (partial)**
3684
+
3685
+ - HTTP: `PATCH /api/v1/appointments/schedules/{schedule_id}`
3686
+ - operationId: `update_schedule_appointments_schedules__schedule_id__patch` (also callable as `g8.api.call("update_schedule_appointments_schedules__schedule_id__patch", input)`)
3687
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
3688
+ - API-key scope: `meetings:write`
3689
+
3690
+ Partially update a schedule. Pass only the fields to change.
3691
+
3692
+ - ``name`` / ``time_zone``: update schedule metadata.
3693
+ - ``availability``: replaces ALL weekly recurring rules (pass every active day).
3694
+ - ``overrides``: replaces ALL date-specific overrides.
3695
+ - ``is_default``: when True, sets this as the caller's default schedule.
3696
+
3697
+ **Input**
3698
+
3699
+ | Field | Type | Required | Description |
3700
+ |---|---|---|---|
3701
+ | `path.schedule_id` | `integer` | yes | Schedule integer ID. |
3702
+ | `body` | `UpdateScheduleRequest` | yes | Request body; fields below. |
3703
+
3704
+ Body fields (`UpdateScheduleRequest`):
3705
+
3706
+ | Field | Type | Required | Description |
3707
+ |---|---|---|---|
3708
+ | `body.availability` | `Array<AvailabilityInput> \| null` | no | |
3709
+ | `body.is_default` | `boolean \| null` | no | |
3710
+ | `body.name` | `string \| null` | no | |
3711
+ | `body.overrides` | `Array<OverrideInput> \| null` | no | |
3712
+ | `body.time_zone` | `string \| null` | no | |
3713
+
3714
+ **Returns** `Record<string, unknown>`.
3715
+
3716
+ **Example**
3717
+
3718
+ ```ts
3719
+ const result = await g8.api.appointments.updateSchedule({ path: { schedule_id: 1 }, body: {} });
3720
+ ```
3721
+
3722
+ ---
3723
+
3724
+ <a id="op-updatescheduleprofile"></a>
3725
+
3726
+ ### `g8.api.appointments.updateScheduleProfile(input)`
3727
+
3728
+ **Update Schedule Profile**
3729
+
3730
+ - HTTP: `PATCH /api/v1/appointments/profile`
3731
+ - operationId: `update_schedule_profile_appointments_profile_patch` (also callable as `g8.api.call("update_schedule_profile_appointments_profile_patch", input)`)
3732
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
3733
+ - API-key scope: `meetings:write`
3734
+
3735
+ Change the key owner's scheduling preferences. Only what you send is written.
3736
+
3737
+ `username` is the personal booking-URL slug and is GLOBALLY unique across
3738
+ graph8, claimed atomically - a rename can lose the race and come back as a
3739
+ conflict rather than succeeding quietly.
3740
+
3741
+ **Input**
3742
+
3743
+ | Field | Type | Required | Description |
3744
+ |---|---|---|---|
3745
+ | `body` | `UpdateScheduleProfileRequest` | yes | Request body; fields below. |
3746
+
3747
+ Body fields (`UpdateScheduleProfileRequest`):
3748
+
3749
+ | Field | Type | Required | Description |
3750
+ |---|---|---|---|
3751
+ | `body.buffer_time` | `integer \| null` | no | Minutes held either side of a booking. |
3752
+ | `body.default_schedule_id` | `integer \| null` | no | |
3753
+ | `body.hide_calendar_from_org` | `boolean \| null` | no | Hide the caller's external calendars from teammates' org-wide overlay. |
3754
+ | `body.time_format` | `integer \| null` | no | 12 or 24. |
3755
+ | `body.time_zone` | `string \| null` | no | IANA timezone, e.g. `Europe/London`. |
3756
+ | `body.username` | `string \| null` | no | Personal booking-URL slug. GLOBALLY unique across graph8 and claimed atomically, so a rename can lose the race and come back as a conflict. |
3757
+ | `body.week_start` | `string \| null` | no | |
3758
+
3759
+ **Returns** `ApiResponse_SchedulingPayload_`: the envelope `{ data: SchedulingPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
3760
+
3761
+ Other envelope fields: `pagination` (PaginationMeta).
3762
+
3763
+ **Example**
3764
+
3765
+ ```ts
3766
+ const result = await g8.api.appointments.updateScheduleProfile({ body: {} });
3767
+ ```
3768
+
3769
+ ---
3770
+
3771
+ <a id="op-updateworkflow"></a>
3772
+
3773
+ ### `g8.api.appointments.updateWorkflow(input)`
3774
+
3775
+ **Update a workflow (partial)**
3776
+
3777
+ - HTTP: `PATCH /api/v1/appointments/workflows/{workflow_id}`
3778
+ - operationId: `update_workflow_appointments_workflows__workflow_id__patch` (also callable as `g8.api.call("update_workflow_appointments_workflows__workflow_id__patch", input)`)
3779
+ - 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
3780
+ - API-key scope: `meetings:run`
3781
+
3782
+ Partially update a workflow. Only the fields you send are changed; omit a
3783
+ field to leave it as-is. Steps are replaced wholesale when provided.
3784
+
3785
+ **Input**
3786
+
3787
+ | Field | Type | Required | Description |
3788
+ |---|---|---|---|
3789
+ | `path.workflow_id` | `integer` | yes | Workflow integer ID. |
3790
+ | `body` | `UpdateWorkflowRequest` | yes | Request body; fields below. |
3791
+
3792
+ Body fields (`UpdateWorkflowRequest`):
3793
+
3794
+ | Field | Type | Required | Description |
3795
+ |---|---|---|---|
3796
+ | `body.event_type_ids` | `Array<integer> \| null` | no | |
3797
+ | `body.is_active_on_all` | `boolean \| null` | no | |
3798
+ | `body.name` | `string \| null` | no | min length 1, max length 255 |
3799
+ | `body.steps` | `Array<WorkflowStepInput> \| null` | no | min items 1, max items 20 |
3800
+ | `body.time` | `integer \| null` | no | min 1 |
3801
+ | `body.time_unit` | `"minutes" \| "hours" \| "days" \| null` | no | |
3802
+ | `body.trigger` | `"new_booking" \| "before_event" \| "after_event" \| "booking_cancelled" \| "booking_rescheduled" \| null` | no | |
3803
+
3804
+ **Returns** `Record<string, unknown>`.
3805
+
3806
+ **Example**
3807
+
3808
+ ```ts
3809
+ // external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
3810
+ const result = await g8.api.appointments.updateWorkflow({ path: { workflow_id: 1 }, body: {} });
3811
+ ```
3812
+
3813
+ ---
3814
+
3815
+ ## Referenced types
3816
+
3817
+ Named types that appear in the tables above. Full TypeScript definitions: `G8Contract.<Name>` (`import type { G8Contract } from "@graph8/sdk"`).
3818
+
3819
+ <a id="type-attendeeinput"></a>
3820
+
3821
+ ### `AttendeeInput`
3822
+
3823
+ | Field | Type | Required | Description |
3824
+ |---|---|---|---|
3825
+ | `email` | `string` | yes | |
3826
+ | `name` | `string` | yes | |
3827
+ | `phone_number` | `string \| null` | no | |
3828
+ | `time_zone` | `string \| null` | no | |
3829
+
3830
+ <a id="type-availabilityinput"></a>
3831
+
3832
+ ### `AvailabilityInput`
3833
+
3834
+ | Field | Type | Required | Description |
3835
+ |---|---|---|---|
3836
+ | `days` | `Array<integer>` | yes | |
3837
+ | `end_time` | `string` | yes | |
3838
+ | `start_time` | `string` | yes | |
3839
+
3840
+ <a id="type-locationitem"></a>
3841
+
3842
+ ### `LocationItem`
3843
+
3844
+ A single location option on an event type.
3845
+
3846
+ | Field | Type | Required | Description |
3847
+ |---|---|---|---|
3848
+ | `kind` | `LocationKind` | yes | |
3849
+ | `address` | `string \| null` | no | |
3850
+ | `display_label` | `string \| null` | no | |
3851
+ | `link` | `string \| null` | no | |
3852
+ | `phone` | `string \| null` | no | |
3853
+ | `provider` | `string \| null` | no | |
3854
+ | `public` | `boolean` | no | default `true` |
3855
+
3856
+ <a id="type-overrideinput"></a>
3857
+
3858
+ ### `OverrideInput`
3859
+
3860
+ | Field | Type | Required | Description |
3861
+ |---|---|---|---|
3862
+ | `date` | `string` | yes | |
3863
+ | `end_time` | `string` | yes | |
3864
+ | `start_time` | `string` | yes | |
3865
+
3866
+ <a id="type-routingformfield"></a>
3867
+
3868
+ ### `RoutingFormField`
3869
+
3870
+ | Field | Type | Required | Description |
3871
+ |---|---|---|---|
3872
+ | `label` | `string` | yes | min length 1, max length 500 |
3873
+ | `id` | `string \| null` | no | |
3874
+ | `identifier` | `string \| null` | no | |
3875
+ | `options` | `Array<RoutingFormFieldOption>` | no | |
3876
+ | `placeholder` | `string \| null` | no | |
3877
+ | `required` | `boolean` | no | default `true` |
3878
+ | `type` | `"text" \| "email" \| "phone" \| "number" \| "textarea" \| "select" \| "multiselect" \| "radio" \| …` | no | default `"select"` |
3879
+
3880
+ <a id="type-routingformrouteinput"></a>
3881
+
3882
+ ### `RoutingFormRouteInput`
3883
+
3884
+ | Field | Type | Required | Description |
3885
+ |---|---|---|---|
3886
+ | `action_type` | `"redirect_event_type" \| "redirect_url" \| "show_message"` | no | default `"redirect_event_type"` |
3887
+ | `action_value` | `string` | no | default `""` |
3888
+ | `conditions` | `Array<RoutingFormCondition>` | no | |
3889
+ | `is_fallback` | `boolean` | no | default `false` |
3890
+ | `position` | `integer` | no | default `0` |
3891
+
3892
+ <a id="type-selectedcalendarentry"></a>
3893
+
3894
+ ### `SelectedCalendarEntry`
3895
+
3896
+ One calendar to consult when checking for conflicts.
3897
+
3898
+ | Field | Type | Required | Description |
3899
+ |---|---|---|---|
3900
+ | `credential_id` | `integer` | yes | |
3901
+ | `external_id` | `string` | yes | |
3902
+ | `integration` | `string` | yes | |
3903
+ | `enabled` | `boolean` | no | default `true` |
3904
+
3905
+ <a id="type-workflowstepinput"></a>
3906
+
3907
+ ### `WorkflowStepInput`
3908
+
3909
+ | Field | Type | Required | Description |
3910
+ |---|---|---|---|
3911
+ | `action` | `"email_host" \| "email_attendee" \| "email_address"` | yes | |
3912
+ | `email_subject` | `string \| null` | no | max length 500 |
3913
+ | `include_calendar_event` | `boolean` | no | default `false` |
3914
+ | `reminder_body` | `string \| null` | no | max length 20000 |
3915
+ | `send_to` | `string (email) \| null` | no | |
3916
+ | `sender` | `string \| null` | no | max length 255 |
3917
+ | `template` | `"reminder" \| "custom" \| "cancelled" \| "rescheduled" \| "completed" \| "rating"` | no | default `"reminder"` |