@graph8/sdk 0.251.0 → 0.262.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. package/README.md +9 -2
  2. package/dist/cli.js +216 -0
  3. package/dist/index.d.mts +105 -7
  4. package/dist/index.d.ts +105 -7
  5. package/dist/index.js +44 -3
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.mjs +44 -3
  8. package/dist/index.mjs.map +1 -1
  9. package/dist/react.d.mts +103 -7
  10. package/dist/react.d.ts +103 -7
  11. package/dist/react.js +62 -11
  12. package/dist/react.js.map +1 -1
  13. package/dist/react.mjs +53 -12
  14. package/dist/react.mjs.map +1 -1
  15. package/dist/types/README.md +7 -0
  16. package/dist/types/agency.d.ts +20 -0
  17. package/dist/types/agentSetup.d.ts +57 -0
  18. package/dist/types/api.d.ts +127 -0
  19. package/dist/types/appClient.d.ts +99 -0
  20. package/dist/types/appPlatform.d.ts +269 -0
  21. package/dist/types/appTokens.d.ts +125 -0
  22. package/dist/types/apps.d.ts +130 -0
  23. package/dist/types/audiences.d.ts +88 -0
  24. package/dist/types/calendar.d.ts +55 -0
  25. package/dist/types/campaigns.d.ts +61 -0
  26. package/dist/types/chat.d.ts +35 -0
  27. package/dist/types/cli.d.ts +14 -0
  28. package/dist/types/companies.d.ts +123 -0
  29. package/dist/types/contacts.d.ts +200 -0
  30. package/dist/types/copilot.d.ts +31 -0
  31. package/dist/types/core.d.ts +1052 -0
  32. package/dist/types/deals.d.ts +215 -0
  33. package/dist/types/enrich.d.ts +51 -0
  34. package/dist/types/fields.d.ts +84 -0
  35. package/dist/types/forms.d.ts +16 -0
  36. package/dist/types/http.d.ts +141 -0
  37. package/dist/types/inbox.d.ts +123 -0
  38. package/dist/types/index.d.ts +63 -0
  39. package/dist/types/intent.d.ts +196 -0
  40. package/dist/types/lists.d.ts +44 -0
  41. package/dist/types/mailboxes.d.ts +240 -0
  42. package/dist/types/marketplace.d.ts +62 -0
  43. package/dist/types/meetings.d.ts +70 -0
  44. package/dist/types/newsletter.d.ts +212 -0
  45. package/dist/types/notes.d.ts +57 -0
  46. package/dist/types/objects.d.ts +281 -0
  47. package/dist/types/pipelines.d.ts +135 -0
  48. package/dist/types/quotes.d.ts +143 -0
  49. package/dist/types/react.d.ts +978 -0
  50. package/dist/types/search.d.ts +99 -0
  51. package/dist/types/sequences.d.ts +255 -0
  52. package/dist/types/signals.d.ts +28 -0
  53. package/dist/types/skills.d.ts +176 -0
  54. package/dist/types/snippet.d.ts +24 -0
  55. package/dist/types/studio.d.ts +161 -0
  56. package/dist/types/tasks.d.ts +101 -0
  57. package/dist/types/types.d.ts +45 -0
  58. package/dist/types/utils.d.ts +21 -0
  59. package/dist/types/version.d.ts +10 -0
  60. package/dist/types/visitors.d.ts +29 -0
  61. package/dist/types/voice.d.ts +304 -0
  62. package/dist/types/webhooks.d.ts +71 -0
  63. package/dist/types/workflows.d.ts +229 -0
  64. package/docs/agents.md +748 -0
  65. package/docs/api/README.md +165 -0
  66. package/docs/api/accounts.d.ts +396 -0
  67. package/docs/api/accounts.md +644 -0
  68. package/docs/api/adCampaigns.d.ts +707 -0
  69. package/docs/api/adCampaigns.md +1091 -0
  70. package/docs/api/adCreatives.d.ts +996 -0
  71. package/docs/api/adCreatives.md +1708 -0
  72. package/docs/api/agency.d.ts +556 -0
  73. package/docs/api/agency.md +845 -0
  74. package/docs/api/agent.d.ts +330 -0
  75. package/docs/api/agent.md +514 -0
  76. package/docs/api/agents.d.ts +1622 -0
  77. package/docs/api/agents.md +2860 -0
  78. package/docs/api/aiInbox.d.ts +1984 -0
  79. package/docs/api/aiInbox.md +3490 -0
  80. package/docs/api/analytics.d.ts +1273 -0
  81. package/docs/api/analytics.md +2095 -0
  82. package/docs/api/apiKeys.d.ts +252 -0
  83. package/docs/api/apiKeys.md +318 -0
  84. package/docs/api/appDeployments.d.ts +236 -0
  85. package/docs/api/appDeployments.md +471 -0
  86. package/docs/api/appDomains.d.ts +171 -0
  87. package/docs/api/appDomains.md +281 -0
  88. package/docs/api/appLogs.d.ts +120 -0
  89. package/docs/api/appLogs.md +159 -0
  90. package/docs/api/appObjects.d.ts +415 -0
  91. package/docs/api/appObjects.md +568 -0
  92. package/docs/api/appPages.d.ts +557 -0
  93. package/docs/api/appPages.md +796 -0
  94. package/docs/api/appPlatformTokens.d.ts +123 -0
  95. package/docs/api/appPlatformTokens.md +172 -0
  96. package/docs/api/appointments.d.ts +2361 -0
  97. package/docs/api/appointments.md +3917 -0
  98. package/docs/api/apps.d.ts +822 -0
  99. package/docs/api/apps.md +1342 -0
  100. package/docs/api/assertUpsert.d.ts +286 -0
  101. package/docs/api/assertUpsert.md +370 -0
  102. package/docs/api/audienceSyncs.d.ts +259 -0
  103. package/docs/api/audienceSyncs.md +395 -0
  104. package/docs/api/brandKit.d.ts +686 -0
  105. package/docs/api/brandKit.md +1133 -0
  106. package/docs/api/bugReports.d.ts +181 -0
  107. package/docs/api/bugReports.md +268 -0
  108. package/docs/api/by-path.md +3260 -0
  109. package/docs/api/calendarInvites.d.ts +117 -0
  110. package/docs/api/calendarInvites.md +148 -0
  111. package/docs/api/campaignWorkflows.d.ts +152 -0
  112. package/docs/api/campaignWorkflows.md +200 -0
  113. package/docs/api/campaigns.d.ts +721 -0
  114. package/docs/api/campaigns.md +1236 -0
  115. package/docs/api/channels.d.ts +171 -0
  116. package/docs/api/channels.md +235 -0
  117. package/docs/api/cliCampaigns.d.ts +205 -0
  118. package/docs/api/cliCampaigns.md +256 -0
  119. package/docs/api/cliPipelines.d.ts +324 -0
  120. package/docs/api/cliPipelines.md +562 -0
  121. package/docs/api/clickHouse.d.ts +115 -0
  122. package/docs/api/clickHouse.md +138 -0
  123. package/docs/api/companies.d.ts +1636 -0
  124. package/docs/api/companies.md +2211 -0
  125. package/docs/api/companyIntelligence.d.ts +299 -0
  126. package/docs/api/companyIntelligence.md +488 -0
  127. package/docs/api/contacts.d.ts +2173 -0
  128. package/docs/api/contacts.md +3143 -0
  129. package/docs/api/content.d.ts +968 -0
  130. package/docs/api/content.md +1667 -0
  131. package/docs/api/contentGridSkills.d.ts +177 -0
  132. package/docs/api/contentGridSkills.md +271 -0
  133. package/docs/api/copilot.d.ts +1017 -0
  134. package/docs/api/copilot.md +1765 -0
  135. package/docs/api/crmSyncs.d.ts +215 -0
  136. package/docs/api/crmSyncs.md +301 -0
  137. package/docs/api/customerSuccess.d.ts +491 -0
  138. package/docs/api/customerSuccess.md +776 -0
  139. package/docs/api/deals.d.ts +1697 -0
  140. package/docs/api/deals.md +2436 -0
  141. package/docs/api/deliverability.d.ts +418 -0
  142. package/docs/api/deliverability.md +677 -0
  143. package/docs/api/desk.d.ts +1765 -0
  144. package/docs/api/desk.md +3007 -0
  145. package/docs/api/dialer.d.ts +1185 -0
  146. package/docs/api/dialer.md +2166 -0
  147. package/docs/api/dialerAnalytics.d.ts +187 -0
  148. package/docs/api/dialerAnalytics.md +257 -0
  149. package/docs/api/documents.d.ts +895 -0
  150. package/docs/api/documents.md +1440 -0
  151. package/docs/api/duplicates.d.ts +195 -0
  152. package/docs/api/duplicates.md +315 -0
  153. package/docs/api/eSign.d.ts +38 -0
  154. package/docs/api/eSign.md +54 -0
  155. package/docs/api/eSignature.d.ts +242 -0
  156. package/docs/api/eSignature.md +341 -0
  157. package/docs/api/enrichment.d.ts +3207 -0
  158. package/docs/api/enrichment.md +5225 -0
  159. package/docs/api/events.d.ts +115 -0
  160. package/docs/api/events.md +105 -0
  161. package/docs/api/fields.d.ts +482 -0
  162. package/docs/api/fields.md +566 -0
  163. package/docs/api/forms.d.ts +1012 -0
  164. package/docs/api/forms.md +1542 -0
  165. package/docs/api/gtmCampaigns.d.ts +662 -0
  166. package/docs/api/gtmCampaigns.md +1044 -0
  167. package/docs/api/gtmContext.d.ts +1187 -0
  168. package/docs/api/gtmContext.md +2112 -0
  169. package/docs/api/gtmDeliverability.d.ts +60 -0
  170. package/docs/api/gtmDeliverability.md +63 -0
  171. package/docs/api/gtmKnowledgeBase.d.ts +76 -0
  172. package/docs/api/gtmKnowledgeBase.md +91 -0
  173. package/docs/api/gtmLaunchHelpers.d.ts +123 -0
  174. package/docs/api/gtmLaunchHelpers.md +148 -0
  175. package/docs/api/gtmLibrary.d.ts +448 -0
  176. package/docs/api/gtmLibrary.md +780 -0
  177. package/docs/api/health.d.ts +39 -0
  178. package/docs/api/health.md +58 -0
  179. package/docs/api/imageLibrary.d.ts +341 -0
  180. package/docs/api/imageLibrary.md +569 -0
  181. package/docs/api/imports.d.ts +157 -0
  182. package/docs/api/imports.md +174 -0
  183. package/docs/api/inbox.d.ts +709 -0
  184. package/docs/api/inbox.md +1067 -0
  185. package/docs/api/install.d.ts +213 -0
  186. package/docs/api/install.md +317 -0
  187. package/docs/api/installedApps.d.ts +131 -0
  188. package/docs/api/installedApps.md +241 -0
  189. package/docs/api/integrationStatus.d.ts +142 -0
  190. package/docs/api/integrationStatus.md +205 -0
  191. package/docs/api/integrations.d.ts +2327 -0
  192. package/docs/api/integrations.md +3791 -0
  193. package/docs/api/intent.d.ts +482 -0
  194. package/docs/api/intent.md +858 -0
  195. package/docs/api/knowledge.d.ts +501 -0
  196. package/docs/api/knowledge.md +843 -0
  197. package/docs/api/knowledgeBase.d.ts +84 -0
  198. package/docs/api/knowledgeBase.md +96 -0
  199. package/docs/api/landingPages.d.ts +1411 -0
  200. package/docs/api/landingPages.md +2488 -0
  201. package/docs/api/leads.d.ts +133 -0
  202. package/docs/api/leads.md +180 -0
  203. package/docs/api/library.d.ts +217 -0
  204. package/docs/api/library.md +338 -0
  205. package/docs/api/linkedIn.d.ts +227 -0
  206. package/docs/api/linkedIn.md +289 -0
  207. package/docs/api/linkedInOutreach.d.ts +727 -0
  208. package/docs/api/linkedInOutreach.md +990 -0
  209. package/docs/api/lists.d.ts +1106 -0
  210. package/docs/api/lists.md +1609 -0
  211. package/docs/api/logs.d.ts +71 -0
  212. package/docs/api/logs.md +70 -0
  213. package/docs/api/mailboxes.d.ts +1050 -0
  214. package/docs/api/mailboxes.md +1690 -0
  215. package/docs/api/marketingIntelligence.d.ts +256 -0
  216. package/docs/api/marketingIntelligence.md +454 -0
  217. package/docs/api/marketplace.d.ts +3173 -0
  218. package/docs/api/marketplace.md +5953 -0
  219. package/docs/api/mcp.d.ts +69 -0
  220. package/docs/api/mcp.md +69 -0
  221. package/docs/api/me.d.ts +54 -0
  222. package/docs/api/me.md +56 -0
  223. package/docs/api/meetings.d.ts +539 -0
  224. package/docs/api/meetings.md +747 -0
  225. package/docs/api/newsletter.d.ts +1613 -0
  226. package/docs/api/newsletter.md +2746 -0
  227. package/docs/api/notes.d.ts +517 -0
  228. package/docs/api/notes.md +888 -0
  229. package/docs/api/notifications.d.ts +94 -0
  230. package/docs/api/notifications.md +105 -0
  231. package/docs/api/objects.d.ts +621 -0
  232. package/docs/api/objects.md +1098 -0
  233. package/docs/api/openSearch.d.ts +234 -0
  234. package/docs/api/openSearch.md +297 -0
  235. package/docs/api/ops.d.ts +299 -0
  236. package/docs/api/ops.md +339 -0
  237. package/docs/api/orgGovernance.d.ts +393 -0
  238. package/docs/api/orgGovernance.md +623 -0
  239. package/docs/api/orgVideos.d.ts +184 -0
  240. package/docs/api/orgVideos.md +252 -0
  241. package/docs/api/organizationSettings.d.ts +626 -0
  242. package/docs/api/organizationSettings.md +911 -0
  243. package/docs/api/phoneNumbers.d.ts +484 -0
  244. package/docs/api/phoneNumbers.md +777 -0
  245. package/docs/api/profile.d.ts +329 -0
  246. package/docs/api/profile.md +540 -0
  247. package/docs/api/programmaticPages.d.ts +400 -0
  248. package/docs/api/programmaticPages.md +626 -0
  249. package/docs/api/providerDomains.d.ts +866 -0
  250. package/docs/api/providerDomains.md +1446 -0
  251. package/docs/api/providerUsage.d.ts +129 -0
  252. package/docs/api/providerUsage.md +186 -0
  253. package/docs/api/public.d.ts +69 -0
  254. package/docs/api/public.md +78 -0
  255. package/docs/api/publicCopilot.d.ts +67 -0
  256. package/docs/api/publicCopilot.md +80 -0
  257. package/docs/api/publicSignals.d.ts +66 -0
  258. package/docs/api/publicSignals.md +71 -0
  259. package/docs/api/publicVisitors.d.ts +97 -0
  260. package/docs/api/publicVisitors.md +118 -0
  261. package/docs/api/quotes.d.ts +1564 -0
  262. package/docs/api/quotes.md +2553 -0
  263. package/docs/api/radar.d.ts +808 -0
  264. package/docs/api/radar.md +1431 -0
  265. package/docs/api/radarReports.d.ts +208 -0
  266. package/docs/api/radarReports.md +306 -0
  267. package/docs/api/recordRoles.d.ts +143 -0
  268. package/docs/api/recordRoles.md +175 -0
  269. package/docs/api/repos.d.ts +146 -0
  270. package/docs/api/repos.md +211 -0
  271. package/docs/api/research.d.ts +295 -0
  272. package/docs/api/research.md +534 -0
  273. package/docs/api/revenue.d.ts +402 -0
  274. package/docs/api/revenue.md +608 -0
  275. package/docs/api/revenueAnalytics.d.ts +147 -0
  276. package/docs/api/revenueAnalytics.md +212 -0
  277. package/docs/api/revenueLifecycle.d.ts +207 -0
  278. package/docs/api/revenueLifecycle.md +274 -0
  279. package/docs/api/revenueRecords.d.ts +372 -0
  280. package/docs/api/revenueRecords.md +563 -0
  281. package/docs/api/roles.d.ts +431 -0
  282. package/docs/api/roles.md +812 -0
  283. package/docs/api/salesCoach.d.ts +877 -0
  284. package/docs/api/salesCoach.md +1540 -0
  285. package/docs/api/sandbox.d.ts +210 -0
  286. package/docs/api/sandbox.md +380 -0
  287. package/docs/api/scans.d.ts +104 -0
  288. package/docs/api/scans.md +136 -0
  289. package/docs/api/scheduleBuy.d.ts +293 -0
  290. package/docs/api/scheduleBuy.md +431 -0
  291. package/docs/api/scraping.d.ts +266 -0
  292. package/docs/api/scraping.md +383 -0
  293. package/docs/api/sdrAnalytics.d.ts +138 -0
  294. package/docs/api/sdrAnalytics.md +246 -0
  295. package/docs/api/search.d.ts +598 -0
  296. package/docs/api/search.md +866 -0
  297. package/docs/api/seo.d.ts +447 -0
  298. package/docs/api/seo.md +660 -0
  299. package/docs/api/sequenceLifecycle.d.ts +439 -0
  300. package/docs/api/sequenceLifecycle.md +513 -0
  301. package/docs/api/sequences.d.ts +1936 -0
  302. package/docs/api/sequences.md +3232 -0
  303. package/docs/api/settings.d.ts +448 -0
  304. package/docs/api/settings.md +731 -0
  305. package/docs/api/signals.d.ts +1441 -0
  306. package/docs/api/signals.md +2526 -0
  307. package/docs/api/signatures.d.ts +719 -0
  308. package/docs/api/signatures.md +1247 -0
  309. package/docs/api/skills.d.ts +230 -0
  310. package/docs/api/skills.md +466 -0
  311. package/docs/api/snippet.d.ts +85 -0
  312. package/docs/api/snippet.md +106 -0
  313. package/docs/api/socialPublishing.d.ts +824 -0
  314. package/docs/api/socialPublishing.md +1245 -0
  315. package/docs/api/studioDocuments.d.ts +244 -0
  316. package/docs/api/studioDocuments.md +348 -0
  317. package/docs/api/support.d.ts +90 -0
  318. package/docs/api/support.md +76 -0
  319. package/docs/api/suppressions.d.ts +241 -0
  320. package/docs/api/suppressions.md +343 -0
  321. package/docs/api/surveys.d.ts +847 -0
  322. package/docs/api/surveys.md +1223 -0
  323. package/docs/api/tasks.d.ts +813 -0
  324. package/docs/api/tasks.md +1344 -0
  325. package/docs/api/teamMembers.d.ts +668 -0
  326. package/docs/api/teamMembers.md +1040 -0
  327. package/docs/api/teams.d.ts +784 -0
  328. package/docs/api/teams.md +1395 -0
  329. package/docs/api/usage.d.ts +277 -0
  330. package/docs/api/usage.md +389 -0
  331. package/docs/api/visitors.d.ts +690 -0
  332. package/docs/api/visitors.md +1075 -0
  333. package/docs/api/voice.d.ts +4661 -0
  334. package/docs/api/voice.md +7905 -0
  335. package/docs/api/webAnalytics.d.ts +964 -0
  336. package/docs/api/webAnalytics.md +1452 -0
  337. package/docs/api/webChat.d.ts +1704 -0
  338. package/docs/api/webChat.md +2048 -0
  339. package/docs/api/webhooks.d.ts +251 -0
  340. package/docs/api/webhooks.md +386 -0
  341. package/docs/api/websiteEditor.d.ts +324 -0
  342. package/docs/api/websiteEditor.md +517 -0
  343. package/docs/api/work.d.ts +2298 -0
  344. package/docs/api/work.md +3096 -0
  345. package/docs/api/workbench.d.ts +2962 -0
  346. package/docs/api/workbench.md +4884 -0
  347. package/docs/api/workflows.d.ts +1218 -0
  348. package/docs/api/workflows.md +2302 -0
  349. package/docs/sdk-clients.md +4339 -0
  350. package/package.json +10 -3
@@ -0,0 +1,1342 @@
1
+ <!-- Generated by sdk/js/scripts/generate-agent-docs.ts from developer-contract/openapi.json. Regenerated on every build. -->
2
+
3
+ # `g8.api.apps`: Apps
4
+
5
+ 22 operations (8 read, 9 write, 4 destructive, 1 billable).
6
+
7
+ 14 of these also have a hand-written method (`g8.appPlatform`, `g8.apps`), marked **★** below. Prefer the hand-written method when one exists: it unwraps the `data` envelope and takes friendlier arguments. See [../sdk-clients.md](../sdk-clients.md).
8
+
9
+ Every example below assumes this setup (server-side, API key):
10
+
11
+ ```ts
12
+ import { g8 } from "@graph8/sdk";
13
+
14
+ g8.init({ apiKey: process.env.G8_API_KEY! });
15
+ ```
16
+
17
+ Example values are placeholders that match each field's type. Only required fields are shown. Every example is type-checked against the SDK in CI.
18
+
19
+ Exact TypeScript types for every operation on this page, and every schema they use: [apps.d.ts](apps.d.ts).
20
+
21
+ ## Operations
22
+
23
+ | Call | HTTP | Tier | Scope | Summary |
24
+ |---|---|---|---|---|
25
+ | [`applyAppManifest`](#op-applyappmanifest) | `POST /api/v1/apps/{app_id}/manifest` | write | `apps:write` | Apply App Manifest |
26
+ | [`clearAppLimit`](#op-clearapplimit) | `DELETE /api/v1/apps/{app_id}/limit` | destructive | `apps:delete` | Clear App Limit |
27
+ | [`clearAppSource`](#op-clearappsource) ★ | `DELETE /api/v1/apps/{app_id}/source` | destructive | `apps:delete` | Clear App Source |
28
+ | [`createApp`](#op-createapp) ★ | `POST /api/v1/apps` | write | `apps:write` | Create App |
29
+ | [`createAppCredential`](#op-createappcredential) | `POST /api/v1/apps/{app_id}/credentials` | write | `apps:write` | Create App Credential |
30
+ | [`deleteAppSecret`](#op-deleteappsecret) ★ | `DELETE /api/v1/apps/{app_id}/secrets/{secret_key}` | destructive | `apps:delete` | Delete App Secret |
31
+ | [`getApp`](#op-getapp) ★ | `GET /api/v1/apps/{app_id}` | read | `apps:read` | Get App |
32
+ | [`getAppLimit`](#op-getapplimit) ★ | `GET /api/v1/apps/{app_id}/limit` | read | `apps:read` | Get App Limit |
33
+ | [`getAppRuntime`](#op-getappruntime) | `GET /api/v1/apps/{app_id}/runtime` | billable | `apps:run` | Get App Runtime |
34
+ | [`getAppUsage`](#op-getappusage) ★ | `GET /api/v1/apps/{app_id}/usage` | read | `apps:read` | Get App Usage |
35
+ | [`listAppCredentials`](#op-listappcredentials) | `GET /api/v1/apps/{app_id}/credentials` | read | `apps:read` | List App Credentials |
36
+ | [`listAppInstalls`](#op-listappinstalls) ★ | `GET /api/v1/apps/{app_id}/installs` | read | `apps:read` | List App Installs |
37
+ | [`listAppSchemaVersions`](#op-listappschemaversions) ★ | `GET /api/v1/apps/{app_id}/schema-versions` | read | `apps:read` | List App Schema Versions |
38
+ | [`listAppSecrets`](#op-listappsecrets) ★ | `GET /api/v1/apps/{app_id}/secrets` | read | `apps:read` | List App Secrets |
39
+ | [`listApps`](#op-listapps) ★ | `GET /api/v1/apps` | read | `apps:read` | List Apps |
40
+ | [`publishAppSchemaVersion`](#op-publishappschemaversion) ★ | `POST /api/v1/apps/{app_id}/schema-versions` | write | `apps:write` | Publish App Schema Version |
41
+ | [`putAppSecret`](#op-putappsecret) ★ | `PUT /api/v1/apps/{app_id}/secrets/{secret_key}` | write | `apps:write` | Put App Secret |
42
+ | [`revokeAppCredential`](#op-revokeappcredential) | `DELETE /api/v1/apps/{app_id}/credentials/{client_id}` | destructive | `apps:delete` | Revoke App Credential |
43
+ | [`setAppLimit`](#op-setapplimit) | `PUT /api/v1/apps/{app_id}/limit` | write | `apps:write` | Set App Limit |
44
+ | [`setAppSource`](#op-setappsource) ★ | `PUT /api/v1/apps/{app_id}/source` | write | `apps:write` | Set App Source |
45
+ | [`setAppStatus`](#op-setappstatus) ★ | `POST /api/v1/apps/{app_id}/status` | write | `apps:write` | Set App Status |
46
+ | [`validateAppManifest`](#op-validateappmanifest) | `POST /api/v1/apps/manifest/validate` | write | `apps:write` | Validate App Manifest |
47
+
48
+ ---
49
+
50
+ <a id="op-applyappmanifest"></a>
51
+
52
+ ### `g8.api.apps.applyAppManifest(input)`
53
+
54
+ **Apply App Manifest**
55
+
56
+ - HTTP: `POST /api/v1/apps/{app_id}/manifest`
57
+ - operationId: `apply_app_manifest_apps__app_id__manifest_post` (also callable as `g8.api.call("apply_app_manifest_apps__app_id__manifest_post", input)`)
58
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
59
+ - API-key scope: `apps:write`
60
+
61
+ Apply a `graph8.app.yaml` to this app.
62
+
63
+ Publishes the `objects:` block as a schema version through the same path
64
+ `POST /{app_id}/schema-versions` uses, including the digest idempotency and
65
+ the failure-isolated tenant fan-out, and stores `frontend:` / `backend:` as
66
+ the build config a later deploy reads.
67
+
68
+ Refuses when the manifest's `app.slug` names a DIFFERENT app than the one in
69
+ the path. Both halves of that mismatch are plausible mistakes -- a copied
70
+ file, a wrong id in a script -- and either one silently applied would
71
+ publish one app's schema into another app's tenants.
72
+
73
+ A manifest with no `objects:` publishes nothing. That is not an oversight:
74
+ an empty schema would archive every object the app has ever declared across
75
+ every consented tenant, so `schema_publish` refuses it, and a build-config
76
+ only manifest is a legitimate thing to apply.
77
+
78
+ **Input**
79
+
80
+ | Field | Type | Required | Description |
81
+ |---|---|---|---|
82
+ | `path.app_id` | `string` | yes | |
83
+ | `body` | `ManifestRequest` | yes | Request body; fields below. |
84
+ | `headers.X-Org-Id` | `string \| null` | no | |
85
+
86
+ Body fields (`ManifestRequest`):
87
+
88
+ | Field | Type | Required | Description |
89
+ |---|---|---|---|
90
+ | `body.manifest` | `string` | yes | The full graph8.app.yaml document as text. Sent verbatim, including newlines. Rejected above 256 KiB by the parser. |
91
+
92
+ **Returns** `ApiResponse_ApplyManifestResponse_`: the envelope `{ data: ApplyManifestResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
93
+
94
+ Other envelope fields: `pagination` (PaginationMeta).
95
+
96
+ `ApplyManifestResponse` fields:
97
+
98
+ | Field | Type | Required | Description |
99
+ |---|---|---|---|
100
+ | `app_id` | `string` | yes | |
101
+ | `summary` | `ManifestSummary` | yes | |
102
+ | `deploy_config_stored` | `boolean` | no | default `false` |
103
+ | `materialization` | `MaterializationSummary \| null` | no | |
104
+ | `schema_created` | `boolean` | no | False when an identical schema was already published. The version named above exists either way; this is what says nothing changed. default `false` |
105
+ | `schema_version` | `SchemaVersionResponse \| null` | no | |
106
+
107
+ **Example**
108
+
109
+ ```ts
110
+ const result = await g8.api.apps.applyAppManifest({ path: { app_id: "id" }, body: { manifest: "example" } });
111
+ ```
112
+
113
+ ---
114
+
115
+ <a id="op-clearapplimit"></a>
116
+
117
+ ### `g8.api.apps.clearAppLimit(input)`
118
+
119
+ **Clear App Limit**
120
+
121
+ - HTTP: `DELETE /api/v1/apps/{app_id}/limit`
122
+ - operationId: `clear_app_limit_apps__app_id__limit_delete` (also callable as `g8.api.call("clear_app_limit_apps__app_id__limit_delete", input)`)
123
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
124
+ - API-key scope: `apps:delete`
125
+ - Lifecycle: `preview` (may not be enabled for every org yet)
126
+
127
+ PREVIEW. This endpoint is deployed but gated: it returns 404 unless the hosted app platform is enabled for your organization. It is published here so the contract describes the whole surface, not so it can be called today.
128
+
129
+ Remove every window's cap for this app, returning it to uncapped.
130
+
131
+ A DELETE rather than `PUT {"credit_cap": 0}`, because absence of a row IS
132
+ "no cap" (`contracts.py:655`) and zero is a real cap meaning "allow nothing".
133
+ Collapsing the two would make an accidental zero indistinguishable from
134
+ uncapped, in the one place where guessing wrong costs money.
135
+
136
+ Idempotent: clearing an app that has no cap succeeds.
137
+
138
+ **Input**
139
+
140
+ | Field | Type | Required | Description |
141
+ |---|---|---|---|
142
+ | `path.app_id` | `string` | yes | |
143
+ | `headers.X-Org-Id` | `string \| null` | no | |
144
+
145
+ **Returns** `ApiResponse_NoneType_`: the envelope `{ data: null, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
146
+
147
+ Other envelope fields: `pagination` (PaginationMeta).
148
+
149
+ **Example**
150
+
151
+ ```ts
152
+ // destructive: deletes or archives data; confirm with a human before calling.
153
+ const result = await g8.api.apps.clearAppLimit({ path: { app_id: "id" } });
154
+ ```
155
+
156
+ ---
157
+
158
+ <a id="op-clearappsource"></a>
159
+
160
+ ### `g8.api.apps.clearAppSource(input)`
161
+
162
+ **Clear App Source**
163
+
164
+ - HTTP: `DELETE /api/v1/apps/{app_id}/source`
165
+ - operationId: `clear_app_source_apps__app_id__source_delete` (also callable as `g8.api.call("clear_app_source_apps__app_id__source_delete", input)`)
166
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
167
+ - API-key scope: `apps:delete`
168
+ - ★ Hand-written: [`g8.appPlatform.clearSource()`](../sdk-clients.md#g8-appplatform-clearsource)
169
+
170
+ Unbind this app's source.
171
+
172
+ Idempotent: unbinding an app that has no source is a 200 describing an app
173
+ with no source, not a 404. The caller asked for a state, and that state
174
+ already holds.
175
+
176
+ Clearing the binding does NOT touch deployments already built from it. A
177
+ deployment records what was built; rewriting history to match a since-removed
178
+ binding would make the audit trail lie about what is running.
179
+
180
+ **Input**
181
+
182
+ | Field | Type | Required | Description |
183
+ |---|---|---|---|
184
+ | `path.app_id` | `string` | yes | |
185
+ | `headers.X-Org-Id` | `string \| null` | no | |
186
+
187
+ **Returns** `ApiResponse_AppResponse_`: the envelope `{ data: AppResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
188
+
189
+ Other envelope fields: `pagination` (PaginationMeta).
190
+
191
+ `AppResponse` fields:
192
+
193
+ | Field | Type | Required | Description |
194
+ |---|---|---|---|
195
+ | `app_id` | `string` | yes | |
196
+ | `builder_org_id` | `string` | yes | |
197
+ | `name` | `string` | yes | |
198
+ | `slug` | `string` | yes | |
199
+ | `status` | `string` | yes | Lifecycle state: `draft`, `published`, `suspended` or `archived`. `active` is accepted on write as a legacy spelling of `published`. |
200
+ | `archived_at` | `string (date-time) \| null` | no | |
201
+ | `created_at` | `string (date-time) \| null` | no | |
202
+ | `default_hostname` | `string \| null` | no | |
203
+ | `registered_origins` | `Array<string>` | no | https-only origins a browser app token may be presented from. |
204
+ | `source_credential_ref` | `string \| null` | no | A POINTER to the credential (a secret-manager path), never the credential itself. |
205
+ | `source_default_branch` | `string \| null` | no | |
206
+ | `source_provider` | `string \| null` | no | |
207
+ | `source_repo_url` | `string \| null` | no | Where this app's code lives. Null until bound. |
208
+
209
+ **Example**
210
+
211
+ ```ts
212
+ // destructive: deletes or archives data; confirm with a human before calling.
213
+ const result = await g8.api.apps.clearAppSource({ path: { app_id: "id" } });
214
+ ```
215
+
216
+ ---
217
+
218
+ <a id="op-createapp"></a>
219
+
220
+ ### `g8.api.apps.createApp(input)`
221
+
222
+ **Create App**
223
+
224
+ - HTTP: `POST /api/v1/apps`
225
+ - operationId: `create_app_apps_post` (also callable as `g8.api.call("create_app_apps_post", input)`)
226
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
227
+ - API-key scope: `apps:write`
228
+ - Lifecycle: `preview` (may not be enabled for every org yet)
229
+ - ★ Hand-written: [`g8.apps.create()`](../sdk-clients.md#g8-apps-create)
230
+
231
+ PREVIEW. This endpoint is deployed but gated: it returns 404 unless the hosted app platform is enabled for your organization. It is published here so the contract describes the whole surface, not so it can be called today.
232
+
233
+ Create an app. It starts in `draft` and serves no traffic until published.
234
+
235
+ The slug is unique within your organization, not globally — two builders may
236
+ both ship a `crm`. A collision returns 409 naming `slug`.
237
+
238
+ **Input**
239
+
240
+ | Field | Type | Required | Description |
241
+ |---|---|---|---|
242
+ | `body` | `CreateAppRequest` | yes | Request body; fields below. |
243
+ | `headers.X-Org-Id` | `string \| null` | no | |
244
+
245
+ Body fields (`CreateAppRequest`):
246
+
247
+ | Field | Type | Required | Description |
248
+ |---|---|---|---|
249
+ | `body.name` | `string` | yes | min length 1, max length 200 |
250
+ | `body.slug` | `string` | yes | Stable identifier, unique within your organization. Lowercased on write, so `CRM` and `crm` are the same app. min length 1, max length 100, pattern `^[a-zA-Z0-9][a-zA-Z0-9_-]*$` |
251
+ | `body.registered_origins` | `Array<string>` | no | https-only origins a browser app token may be presented from. An http origin is rejected — a bearer token sent over http is a token disclosed to the network. max items 20 |
252
+
253
+ **Returns** `ApiResponse_AppResponse_`: the envelope `{ data: AppResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
254
+
255
+ Other envelope fields: `pagination` (PaginationMeta).
256
+
257
+ `AppResponse` fields:
258
+
259
+ | Field | Type | Required | Description |
260
+ |---|---|---|---|
261
+ | `app_id` | `string` | yes | |
262
+ | `builder_org_id` | `string` | yes | |
263
+ | `name` | `string` | yes | |
264
+ | `slug` | `string` | yes | |
265
+ | `status` | `string` | yes | Lifecycle state: `draft`, `published`, `suspended` or `archived`. `active` is accepted on write as a legacy spelling of `published`. |
266
+ | `archived_at` | `string (date-time) \| null` | no | |
267
+ | `created_at` | `string (date-time) \| null` | no | |
268
+ | `default_hostname` | `string \| null` | no | |
269
+ | `registered_origins` | `Array<string>` | no | https-only origins a browser app token may be presented from. |
270
+ | `source_credential_ref` | `string \| null` | no | A POINTER to the credential (a secret-manager path), never the credential itself. |
271
+ | `source_default_branch` | `string \| null` | no | |
272
+ | `source_provider` | `string \| null` | no | |
273
+ | `source_repo_url` | `string \| null` | no | Where this app's code lives. Null until bound. |
274
+
275
+ **Example**
276
+
277
+ ```ts
278
+ const result = await g8.api.apps.createApp({ body: { name: "Example", slug: "example" } });
279
+ ```
280
+
281
+ ---
282
+
283
+ <a id="op-createappcredential"></a>
284
+
285
+ ### `g8.api.apps.createAppCredential(input)`
286
+
287
+ **Create App Credential**
288
+
289
+ - HTTP: `POST /api/v1/apps/{app_id}/credentials`
290
+ - operationId: `create_app_credential_apps__app_id__credentials_post` (also callable as `g8.api.call("create_app_credential_apps__app_id__credentials_post", input)`)
291
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
292
+ - API-key scope: `apps:write`
293
+ - Lifecycle: `preview` (may not be enabled for every org yet)
294
+
295
+ PREVIEW. This endpoint is deployed but gated: it returns 404 unless the hosted app platform is enabled for your organization. It is published here so the contract describes the whole surface, not so it can be called today.
296
+
297
+ Create a service credential for one consented client organization.
298
+
299
+ **The secret is returned once and never again.** Only its SHA-256 is stored —
300
+ `developer_app_credentials` has no column that could hold a plaintext secret.
301
+ Rotate by creating a new credential and revoking the old one.
302
+
303
+ The target organization must already have a **consented** installation of
304
+ this app. A credential for a workspace that never consented would be a
305
+ standing key into a tenant that never agreed to it, and the M6-1d clamp would
306
+ refuse every request it minted anyway — failing here says why, instead of
307
+ leaving a credential that silently cannot work.
308
+
309
+ **Input**
310
+
311
+ | Field | Type | Required | Description |
312
+ |---|---|---|---|
313
+ | `path.app_id` | `string` | yes | |
314
+ | `body` | `CreateCredentialRequest` | yes | Request body; fields below. |
315
+ | `headers.X-Org-Id` | `string \| null` | no | |
316
+
317
+ Body fields (`CreateCredentialRequest`):
318
+
319
+ | Field | Type | Required | Description |
320
+ |---|---|---|---|
321
+ | `body.client_org_id` | `string` | yes | The client organization this credential acts for. It must already have a consented installation of the app — a credential is bound to one tenant and cannot be pointed at another later. |
322
+
323
+ **Returns** `ApiResponse_CreatedCredentialResponse_`: the envelope `{ data: CreatedCredentialResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
324
+
325
+ Other envelope fields: `pagination` (PaginationMeta).
326
+
327
+ `CreatedCredentialResponse` fields:
328
+
329
+ | Field | Type | Required | Description |
330
+ |---|---|---|---|
331
+ | `app_id` | `string` | yes | |
332
+ | `client_id` | `string` | yes | |
333
+ | `client_org_id` | `string` | yes | |
334
+ | `client_secret` | `string` | yes | Shown ONCE. Store it now — only its hash is kept, so it cannot be retrieved again. Rotate by creating a new credential and revoking this one. |
335
+ | `created_at` | `string (date-time) \| null` | no | |
336
+ | `revoked` | `boolean` | no | default `false` |
337
+
338
+ **Example**
339
+
340
+ ```ts
341
+ const result = await g8.api.apps.createAppCredential({ path: { app_id: "id" }, body: { client_org_id: "id" } });
342
+ ```
343
+
344
+ ---
345
+
346
+ <a id="op-deleteappsecret"></a>
347
+
348
+ ### `g8.api.apps.deleteAppSecret(input)`
349
+
350
+ **Delete App Secret**
351
+
352
+ - HTTP: `DELETE /api/v1/apps/{app_id}/secrets/{secret_key}`
353
+ - operationId: `delete_app_secret_apps__app_id__secrets__secret_key__delete` (also callable as `g8.api.call("delete_app_secret_apps__app_id__secrets__secret_key__delete", input)`)
354
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
355
+ - API-key scope: `apps:delete`
356
+ - ★ Hand-written: [`g8.appPlatform.deleteSecret()`](../sdk-clients.md#g8-appplatform-deletesecret)
357
+
358
+ Stop declaring a secret.
359
+
360
+ Removes the DECLARATION, not the value: the value lives in the secret manager
361
+ and this surface never had it to delete. A builder revoking a credential has
362
+ to do it there as well, which the description says so nobody assumes this call
363
+ was enough.
364
+
365
+ 404 when the app declares no such key, so a typo is not reported as a
366
+ successful removal of something else.
367
+
368
+ **Input**
369
+
370
+ | Field | Type | Required | Description |
371
+ |---|---|---|---|
372
+ | `path.app_id` | `string` | yes | |
373
+ | `path.secret_key` | `string` | yes | |
374
+ | `headers.X-Org-Id` | `string \| null` | no | |
375
+
376
+ **Returns** `ApiResponse_dict_`: the envelope `{ data: Record<string, unknown>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
377
+
378
+ Other envelope fields: `pagination` (PaginationMeta).
379
+
380
+ **Example**
381
+
382
+ ```ts
383
+ // destructive: deletes or archives data; confirm with a human before calling.
384
+ const result = await g8.api.apps.deleteAppSecret({ path: { app_id: "id", secret_key: "example" } });
385
+ ```
386
+
387
+ ---
388
+
389
+ <a id="op-getapp"></a>
390
+
391
+ ### `g8.api.apps.getApp(input)`
392
+
393
+ **Get App**
394
+
395
+ - HTTP: `GET /api/v1/apps/{app_id}`
396
+ - operationId: `get_app_apps__app_id__get` (also callable as `g8.api.call("get_app_apps__app_id__get", input)`)
397
+ - Tier: `read`: reads data; safe to call and to retry
398
+ - API-key scope: `apps:read`
399
+ - Lifecycle: `preview` (may not be enabled for every org yet)
400
+ - ★ Hand-written: [`g8.apps.get()`](../sdk-clients.md#g8-apps-get)
401
+
402
+ PREVIEW. This endpoint is deployed but gated: it returns 404 unless the hosted app platform is enabled for your organization. It is published here so the contract describes the whole surface, not so it can be called today.
403
+
404
+ Fetch one of your apps by id.
405
+
406
+ **Input**
407
+
408
+ | Field | Type | Required | Description |
409
+ |---|---|---|---|
410
+ | `path.app_id` | `string` | yes | |
411
+ | `headers.X-Org-Id` | `string \| null` | no | |
412
+
413
+ **Returns** `ApiResponse_AppResponse_`: the envelope `{ data: AppResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
414
+
415
+ Other envelope fields: `pagination` (PaginationMeta).
416
+
417
+ `AppResponse` fields:
418
+
419
+ | Field | Type | Required | Description |
420
+ |---|---|---|---|
421
+ | `app_id` | `string` | yes | |
422
+ | `builder_org_id` | `string` | yes | |
423
+ | `name` | `string` | yes | |
424
+ | `slug` | `string` | yes | |
425
+ | `status` | `string` | yes | Lifecycle state: `draft`, `published`, `suspended` or `archived`. `active` is accepted on write as a legacy spelling of `published`. |
426
+ | `archived_at` | `string (date-time) \| null` | no | |
427
+ | `created_at` | `string (date-time) \| null` | no | |
428
+ | `default_hostname` | `string \| null` | no | |
429
+ | `registered_origins` | `Array<string>` | no | https-only origins a browser app token may be presented from. |
430
+ | `source_credential_ref` | `string \| null` | no | A POINTER to the credential (a secret-manager path), never the credential itself. |
431
+ | `source_default_branch` | `string \| null` | no | |
432
+ | `source_provider` | `string \| null` | no | |
433
+ | `source_repo_url` | `string \| null` | no | Where this app's code lives. Null until bound. |
434
+
435
+ **Example**
436
+
437
+ ```ts
438
+ const result = await g8.api.apps.getApp({ path: { app_id: "id" } });
439
+ ```
440
+
441
+ ---
442
+
443
+ <a id="op-getapplimit"></a>
444
+
445
+ ### `g8.api.apps.getAppLimit(input)`
446
+
447
+ **Get App Limit**
448
+
449
+ - HTTP: `GET /api/v1/apps/{app_id}/limit`
450
+ - operationId: `get_app_limit_apps__app_id__limit_get` (also callable as `g8.api.call("get_app_limit_apps__app_id__limit_get", input)`)
451
+ - Tier: `read`: reads data; safe to call and to retry
452
+ - API-key scope: `apps:read`
453
+ - Lifecycle: `preview` (may not be enabled for every org yet)
454
+ - ★ Hand-written: [`g8.apps.getLimit()`](../sdk-clients.md#g8-apps-getlimit)
455
+
456
+ PREVIEW. This endpoint is deployed but gated: it returns 404 unless the hosted app platform is enabled for your organization. It is published here so the contract describes the whole surface, not so it can be called today.
457
+
458
+ This app's hard credit cap, or `null` when it is uncapped.
459
+
460
+ `null` is the real answer, not an empty object: absence of a limit row IS
461
+ "no cap", and there is no unlimited sentinel — so an accidental zero can
462
+ never read as no limit.
463
+
464
+ **Input**
465
+
466
+ | Field | Type | Required | Description |
467
+ |---|---|---|---|
468
+ | `path.app_id` | `string` | yes | |
469
+ | `headers.X-Org-Id` | `string \| null` | no | |
470
+
471
+ **Returns** `ApiResponse_Union_AppLimitResponse__NoneType__`: the envelope `{ data: AppLimitResponse | null, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
472
+
473
+ Other envelope fields: `pagination` (PaginationMeta).
474
+
475
+ `data` fields:
476
+
477
+ | Field | Type | Required | Description |
478
+ |---|---|---|---|
479
+ | `app_id` | `string` | yes | |
480
+ | `credit_cap` | `integer` | yes | |
481
+ | `window` | `string` | yes | Cap window. `calendar_month` today. |
482
+ | `created_at` | `string (date-time) \| null` | no | |
483
+
484
+ **Example**
485
+
486
+ ```ts
487
+ const result = await g8.api.apps.getAppLimit({ path: { app_id: "id" } });
488
+ ```
489
+
490
+ ---
491
+
492
+ <a id="op-getappruntime"></a>
493
+
494
+ ### `g8.api.apps.getAppRuntime(input)`
495
+
496
+ **Get App Runtime**
497
+
498
+ - HTTP: `GET /api/v1/apps/{app_id}/runtime`
499
+ - operationId: `get_app_runtime_apps__app_id__runtime_get` (also callable as `g8.api.call("get_app_runtime_apps__app_id__runtime_get", input)`)
500
+ - Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
501
+ - API-key scope: `apps:run`
502
+
503
+ Can this app be built and run yet, and if not, what is missing (M9 J9).
504
+
505
+ ANSWERS FROM THE CONTROL PLANE, AND SAYS SO. It reports what graph8 has
506
+ recorded: a bound source, an assigned hostname, declared secrets, the last
507
+ deployment's state. It does NOT claim the cluster side is ready, because the
508
+ namespace provisioner, the image registry and the runtime objects are
509
+ separate, unbuilt work. Reporting `ready: true` on that basis would be the
510
+ most expensive kind of wrong: a builder would push and wait for something
511
+ nothing can serve.
512
+
513
+ `blockers` is the field that matters. An agent driving a build needs to know
514
+ WHY it cannot proceed; a bare `ready: false` sends it guessing, and guessing
515
+ against a deploy pipeline is how you get retry loops.
516
+
517
+ Deliberately cheap: three reads the caller could make themselves across
518
+ `GET /apps/{id}`, `/secrets` and `/deployments`. It exists so the answer is
519
+ computed in one place, because "am I ready" is a judgement about which
520
+ prerequisites matter, and three clients would each get it slightly wrong.
521
+
522
+ **Input**
523
+
524
+ | Field | Type | Required | Description |
525
+ |---|---|---|---|
526
+ | `path.app_id` | `string` | yes | |
527
+ | `headers.X-Org-Id` | `string \| null` | no | |
528
+
529
+ **Returns** `ApiResponse_AppRuntimeResponse_`: the envelope `{ data: AppRuntimeResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
530
+
531
+ Other envelope fields: `pagination` (PaginationMeta).
532
+
533
+ `AppRuntimeResponse` fields:
534
+
535
+ | Field | Type | Required | Description |
536
+ |---|---|---|---|
537
+ | `app_id` | `string` | yes | |
538
+ | `hostname_assigned` | `boolean` | yes | |
539
+ | `ready` | `boolean` | yes | True only when nothing in `blockers` remains. False is the normal answer today. |
540
+ | `secrets_declared` | `integer` | yes | |
541
+ | `source_bound` | `boolean` | yes | |
542
+ | `blockers` | `Array<string>` | no | Each unmet prerequisite, named. Empty means ready. |
543
+ | `latest_deployment_status` | `string \| null` | no | |
544
+
545
+ **Example**
546
+
547
+ ```ts
548
+ // billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
549
+ const result = await g8.api.apps.getAppRuntime({ path: { app_id: "id" } });
550
+ ```
551
+
552
+ ---
553
+
554
+ <a id="op-getappusage"></a>
555
+
556
+ ### `g8.api.apps.getAppUsage(input)`
557
+
558
+ **Get App Usage**
559
+
560
+ - HTTP: `GET /api/v1/apps/{app_id}/usage`
561
+ - operationId: `get_app_usage_apps__app_id__usage_get` (also callable as `g8.api.call("get_app_usage_apps__app_id__usage_get", input)`)
562
+ - Tier: `read`: reads data; safe to call and to retry
563
+ - API-key scope: `apps:read`
564
+ - Lifecycle: `preview` (may not be enabled for every org yet)
565
+ - ★ Hand-written: [`g8.apps.usage()`](../sdk-clients.md#g8-apps-usage)
566
+
567
+ PREVIEW. This endpoint is deployed but gated: it returns 404 unless the hosted app platform is enabled for your organization. It is published here so the contract describes the whole surface, not so it can be called today.
568
+
569
+ Credits this app consumed in a calendar month, broken down per client org.
570
+
571
+ The breakdown keys on the client whose DATA was touched, not on who paid —
572
+ the builder pays for all of them. A month with no usage returns zeroes rather
573
+ than 404: "nothing happened" is an answer, and a 404 would read as "no such
574
+ app".
575
+
576
+ **Input**
577
+
578
+ | Field | Type | Required | Description |
579
+ |---|---|---|---|
580
+ | `path.app_id` | `string` | yes | |
581
+ | `query.period` | `string \| null` | no | Calendar month `YYYY-MM`. Defaults to the current month. |
582
+ | `headers.X-Org-Id` | `string \| null` | no | |
583
+
584
+ **Returns** `ApiResponse_UsageSummaryResponse_`: the envelope `{ data: UsageSummaryResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
585
+
586
+ Other envelope fields: `pagination` (PaginationMeta).
587
+
588
+ `UsageSummaryResponse` fields:
589
+
590
+ | Field | Type | Required | Description |
591
+ |---|---|---|---|
592
+ | `app_id` | `string` | yes | |
593
+ | `event_count` | `integer` | yes | |
594
+ | `period` | `string` | yes | Calendar month, `YYYY-MM`. |
595
+ | `total_credits` | `integer` | yes | |
596
+ | `discount_credits` | `integer` | no | Everything deducted from list: the builder discount AND any hard-cap clamp. One compound number, not 'the 25%'. default `0` |
597
+ | `gross_credits` | `integer` | no | Undiscounted list total for the period. `gross_credits - discount_credits == total_credits`. default `0` |
598
+ | `per_client_credits` | `Record<string, integer>` | no | Credits per CLIENT org — whose data was touched, not who paid. The builder pays for all of them. |
599
+ | `per_operation_credits` | `Record<string, integer>` | no | Net credits per operation id, so you can see which calls cost money. |
600
+ | `per_payer_credits` | `Record<string, integer>` | no | Net credits per BILLING org, who pays. The mirror of `per_client_credits`, which is whose data was touched. |
601
+
602
+ **Example**
603
+
604
+ ```ts
605
+ const result = await g8.api.apps.getAppUsage({ path: { app_id: "id" } });
606
+ ```
607
+
608
+ ---
609
+
610
+ <a id="op-listappcredentials"></a>
611
+
612
+ ### `g8.api.apps.listAppCredentials(input)`
613
+
614
+ **List App Credentials**
615
+
616
+ - HTTP: `GET /api/v1/apps/{app_id}/credentials`
617
+ - operationId: `list_app_credentials_apps__app_id__credentials_get` (also callable as `g8.api.call("list_app_credentials_apps__app_id__credentials_get", input)`)
618
+ - Tier: `read`: reads data; safe to call and to retry
619
+ - API-key scope: `apps:read`
620
+ - Lifecycle: `preview` (may not be enabled for every org yet)
621
+
622
+ PREVIEW. This endpoint is deployed but gated: it returns 404 unless the hosted app platform is enabled for your organization. It is published here so the contract describes the whole surface, not so it can be called today.
623
+
624
+ List this app's service credentials. Never returns a secret.
625
+
626
+ Includes revoked ones: a builder auditing which credentials exist needs to
627
+ see the one they turned off, and hiding it would make a rotation look like a
628
+ deletion.
629
+
630
+ **Input**
631
+
632
+ | Field | Type | Required | Description |
633
+ |---|---|---|---|
634
+ | `path.app_id` | `string` | yes | |
635
+ | `headers.X-Org-Id` | `string \| null` | no | |
636
+
637
+ **Returns** `ApiResponse_list_CredentialResponse__`: the envelope `{ data: Array<CredentialResponse>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
638
+
639
+ Other envelope fields: `pagination` (PaginationMeta).
640
+
641
+ `CredentialResponse` fields:
642
+
643
+ | Field | Type | Required | Description |
644
+ |---|---|---|---|
645
+ | `app_id` | `string` | yes | |
646
+ | `client_id` | `string` | yes | |
647
+ | `client_org_id` | `string` | yes | |
648
+ | `created_at` | `string (date-time) \| null` | no | |
649
+ | `revoked` | `boolean` | no | default `false` |
650
+
651
+ **Example**
652
+
653
+ ```ts
654
+ const result = await g8.api.apps.listAppCredentials({ path: { app_id: "id" } });
655
+ ```
656
+
657
+ ---
658
+
659
+ <a id="op-listappinstalls"></a>
660
+
661
+ ### `g8.api.apps.listAppInstalls(input)`
662
+
663
+ **List App Installs**
664
+
665
+ - HTTP: `GET /api/v1/apps/{app_id}/installs`
666
+ - operationId: `list_app_installs_apps__app_id__installs_get` (also callable as `g8.api.call("list_app_installs_apps__app_id__installs_get", input)`)
667
+ - Tier: `read`: reads data; safe to call and to retry
668
+ - API-key scope: `apps:read`
669
+ - Lifecycle: `preview` (may not be enabled for every org yet)
670
+ - ★ Hand-written: [`g8.apps.listInstalls()`](../sdk-clients.md#g8-apps-listinstalls)
671
+
672
+ PREVIEW. This endpoint is deployed but gated: it returns 404 unless the hosted app platform is enabled for your organization. It is published here so the contract describes the whole surface, not so it can be called today.
673
+
674
+ List the client organizations that installed this app, and their consent state.
675
+
676
+ Includes revoked and pending installs, not only consented ones — a builder
677
+ debugging "why can't my app reach this tenant" needs to see the revocation,
678
+ and hiding it turns a clear answer into a mystery.
679
+
680
+ **Input**
681
+
682
+ | Field | Type | Required | Description |
683
+ |---|---|---|---|
684
+ | `path.app_id` | `string` | yes | |
685
+ | `headers.X-Org-Id` | `string \| null` | no | |
686
+
687
+ **Returns** `ApiResponse_list_InstallationResponse__`: the envelope `{ data: Array<InstallationResponse>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
688
+
689
+ Other envelope fields: `pagination` (PaginationMeta).
690
+
691
+ `InstallationResponse` fields:
692
+
693
+ | Field | Type | Required | Description |
694
+ |---|---|---|---|
695
+ | `app_id` | `string` | yes | |
696
+ | `client_org_id` | `string` | yes | |
697
+ | `install_id` | `string` | yes | |
698
+ | `status` | `string` | yes | `pending`, `consented`, `revoked`, `suspended` or `expired`. |
699
+ | `consented_scopes` | `Array<string>` | no | |
700
+ | `created_at` | `string (date-time) \| null` | no | |
701
+ | `revoked_at` | `string (date-time) \| null` | no | |
702
+
703
+ **Example**
704
+
705
+ ```ts
706
+ const result = await g8.api.apps.listAppInstalls({ path: { app_id: "id" } });
707
+ ```
708
+
709
+ ---
710
+
711
+ <a id="op-listappschemaversions"></a>
712
+
713
+ ### `g8.api.apps.listAppSchemaVersions(input)`
714
+
715
+ **List App Schema Versions**
716
+
717
+ - HTTP: `GET /api/v1/apps/{app_id}/schema-versions`
718
+ - operationId: `list_app_schema_versions_apps__app_id__schema_versions_get` (also callable as `g8.api.call("list_app_schema_versions_apps__app_id__schema_versions_get", input)`)
719
+ - Tier: `read`: reads data; safe to call and to retry
720
+ - API-key scope: `apps:read`
721
+ - ★ Hand-written: [`g8.appPlatform.listSchemaVersions()`](../sdk-clients.md#g8-appplatform-listschemaversions)
722
+
723
+ Every schema version for this app, oldest ordinal first.
724
+
725
+ Includes drafts and deprecated versions. A builder asking "what did I ship
726
+ and when" needs the whole history, and a filtered list would make a
727
+ deprecated version look deleted.
728
+
729
+ **Input**
730
+
731
+ | Field | Type | Required | Description |
732
+ |---|---|---|---|
733
+ | `path.app_id` | `string` | yes | |
734
+ | `headers.X-Org-Id` | `string \| null` | no | |
735
+
736
+ **Returns** `ApiResponse_list_SchemaVersionResponse__`: the envelope `{ data: Array<SchemaVersionResponse>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
737
+
738
+ Other envelope fields: `pagination` (PaginationMeta).
739
+
740
+ `SchemaVersionResponse` fields:
741
+
742
+ | Field | Type | Required | Description |
743
+ |---|---|---|---|
744
+ | `app_id` | `string` | yes | |
745
+ | `digest` | `string` | yes | SHA-256 of the canonical schema. Re-publishing the same schema resolves here. |
746
+ | `schema_version_id` | `string` | yes | |
747
+ | `status` | `string` | yes | |
748
+ | `version` | `integer` | yes | Human-facing ordinal. Nothing keys on it; the digest is the identity. |
749
+ | `created_at` | `string (date-time) \| null` | no | |
750
+ | `deprecated_at` | `string (date-time) \| null` | no | |
751
+ | `manifest` | `Record<string, unknown>` | no | The stored canonical schema. Self-describing, so the version needs no other source. |
752
+ | `published_at` | `string (date-time) \| null` | no | |
753
+
754
+ **Example**
755
+
756
+ ```ts
757
+ const result = await g8.api.apps.listAppSchemaVersions({ path: { app_id: "id" } });
758
+ ```
759
+
760
+ ---
761
+
762
+ <a id="op-listappsecrets"></a>
763
+
764
+ ### `g8.api.apps.listAppSecrets(input)`
765
+
766
+ **List App Secrets**
767
+
768
+ - HTTP: `GET /api/v1/apps/{app_id}/secrets`
769
+ - operationId: `list_app_secrets_apps__app_id__secrets_get` (also callable as `g8.api.call("list_app_secrets_apps__app_id__secrets_get", input)`)
770
+ - Tier: `read`: reads data; safe to call and to retry
771
+ - API-key scope: `apps:read`
772
+ - ★ Hand-written: [`g8.appPlatform.listSecrets()`](../sdk-clients.md#g8-appplatform-listsecrets)
773
+
774
+ Which secrets this app declares, and where they live (M9 item J7).
775
+
776
+ POINTERS ONLY. There is no value in the response and no column that could
777
+ hold one: the platform stores which secrets an app declares so a build can be
778
+ rendered, without ever holding what the build will read.
779
+
780
+ A hosted app needs config -- its own API keys, a database URL, the graph8
781
+ credential it calls back with -- and there was no route, DTO or operation id
782
+ for any of it anywhere in the contract.
783
+
784
+ **Input**
785
+
786
+ | Field | Type | Required | Description |
787
+ |---|---|---|---|
788
+ | `path.app_id` | `string` | yes | |
789
+ | `headers.X-Org-Id` | `string \| null` | no | |
790
+
791
+ **Returns** `ApiResponse_list_AppSecretResponse__`: the envelope `{ data: Array<AppSecretResponse>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
792
+
793
+ Other envelope fields: `pagination` (PaginationMeta).
794
+
795
+ `AppSecretResponse` fields:
796
+
797
+ | Field | Type | Required | Description |
798
+ |---|---|---|---|
799
+ | `secret_key` | `string` | yes | |
800
+ | `created_at` | `string (date-time) \| null` | no | |
801
+ | `provider_ref` | `string \| null` | no | Where the value lives, e.g. a secret-manager path. Never the value. |
802
+ | `rotated_at` | `string (date-time) \| null` | no | Last time this declaration was rewritten. Moves on every write, including one that repeats the same pointer: the pointer is not the secret, so an unchanged path does not mean an unchanged value. |
803
+
804
+ **Example**
805
+
806
+ ```ts
807
+ const result = await g8.api.apps.listAppSecrets({ path: { app_id: "id" } });
808
+ ```
809
+
810
+ ---
811
+
812
+ <a id="op-listapps"></a>
813
+
814
+ ### `g8.api.apps.listApps(input?)`
815
+
816
+ **List Apps**
817
+
818
+ - HTTP: `GET /api/v1/apps`
819
+ - operationId: `list_apps_apps_get` (also callable as `g8.api.call("list_apps_apps_get", input)`)
820
+ - Tier: `read`: reads data; safe to call and to retry
821
+ - API-key scope: `apps:read`
822
+ - Lifecycle: `preview` (may not be enabled for every org yet)
823
+ - ★ Hand-written: [`g8.apps.list()`](../sdk-clients.md#g8-apps-list)
824
+
825
+ PREVIEW. This endpoint is deployed but gated: it returns 404 unless the hosted app platform is enabled for your organization. It is published here so the contract describes the whole surface, not so it can be called today.
826
+
827
+ List the apps your organization owns, newest first.
828
+
829
+ **Input**
830
+
831
+ | Field | Type | Required | Description |
832
+ |---|---|---|---|
833
+ | `headers.X-Org-Id` | `string \| null` | no | |
834
+
835
+ **Returns** `ApiResponse_list_AppResponse__`: the envelope `{ data: Array<AppResponse>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
836
+
837
+ Other envelope fields: `pagination` (PaginationMeta).
838
+
839
+ `AppResponse` fields:
840
+
841
+ | Field | Type | Required | Description |
842
+ |---|---|---|---|
843
+ | `app_id` | `string` | yes | |
844
+ | `builder_org_id` | `string` | yes | |
845
+ | `name` | `string` | yes | |
846
+ | `slug` | `string` | yes | |
847
+ | `status` | `string` | yes | Lifecycle state: `draft`, `published`, `suspended` or `archived`. `active` is accepted on write as a legacy spelling of `published`. |
848
+ | `archived_at` | `string (date-time) \| null` | no | |
849
+ | `created_at` | `string (date-time) \| null` | no | |
850
+ | `default_hostname` | `string \| null` | no | |
851
+ | `registered_origins` | `Array<string>` | no | https-only origins a browser app token may be presented from. |
852
+ | `source_credential_ref` | `string \| null` | no | A POINTER to the credential (a secret-manager path), never the credential itself. |
853
+ | `source_default_branch` | `string \| null` | no | |
854
+ | `source_provider` | `string \| null` | no | |
855
+ | `source_repo_url` | `string \| null` | no | Where this app's code lives. Null until bound. |
856
+
857
+ **Example**
858
+
859
+ ```ts
860
+ const result = await g8.api.apps.listApps();
861
+ ```
862
+
863
+ ---
864
+
865
+ <a id="op-publishappschemaversion"></a>
866
+
867
+ ### `g8.api.apps.publishAppSchemaVersion(input)`
868
+
869
+ **Publish App Schema Version**
870
+
871
+ - HTTP: `POST /api/v1/apps/{app_id}/schema-versions`
872
+ - operationId: `publish_app_schema_version_apps__app_id__schema_versions_post` (also callable as `g8.api.call("publish_app_schema_version_apps__app_id__schema_versions_post", input)`)
873
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
874
+ - API-key scope: `apps:write`
875
+ - ★ Hand-written: [`g8.appPlatform.publishSchemaVersion()`](../sdk-clients.md#g8-appplatform-publishschemaversion)
876
+
877
+ Publish a declared object schema and materialize it across consented tenants.
878
+
879
+ 422 with every validation problem at once, so a builder fixes their whole
880
+ schema in one round trip rather than one error per attempt.
881
+
882
+ A publish that resolves to an EXISTING version still returns 201 with
883
+ `created: false` -- the resource named by the response exists either way, and
884
+ the flag is what tells a caller nothing changed.
885
+
886
+ **Input**
887
+
888
+ | Field | Type | Required | Description |
889
+ |---|---|---|---|
890
+ | `path.app_id` | `string` | yes | |
891
+ | `body` | `PublishSchemaVersionRequest` | yes | Request body; fields below. |
892
+ | `headers.X-Org-Id` | `string \| null` | no | |
893
+
894
+ Body fields (`PublishSchemaVersionRequest`):
895
+
896
+ | Field | Type | Required | Description |
897
+ |---|---|---|---|
898
+ | `body.objects` | `Array<unknown>` | yes | Declared custom objects, in `graph8.app.yaml` `objects:` shape. |
899
+
900
+ **Returns** `ApiResponse_PublishSchemaVersionResponse_`: the envelope `{ data: PublishSchemaVersionResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
901
+
902
+ Other envelope fields: `pagination` (PaginationMeta).
903
+
904
+ `PublishSchemaVersionResponse` fields:
905
+
906
+ | Field | Type | Required | Description |
907
+ |---|---|---|---|
908
+ | `created` | `boolean` | yes | False when an identical schema was already published -- the retry no-op. |
909
+ | `materialization` | `MaterializationSummary` | yes | |
910
+ | `version` | `SchemaVersionResponse` | yes | |
911
+
912
+ **Example**
913
+
914
+ ```ts
915
+ const result = await g8.api.apps.publishAppSchemaVersion({ path: { app_id: "id" }, body: { objects: [{}] } });
916
+ ```
917
+
918
+ ---
919
+
920
+ <a id="op-putappsecret"></a>
921
+
922
+ ### `g8.api.apps.putAppSecret(input)`
923
+
924
+ **Put App Secret**
925
+
926
+ - HTTP: `PUT /api/v1/apps/{app_id}/secrets/{secret_key}`
927
+ - operationId: `put_app_secret_apps__app_id__secrets__secret_key__put` (also callable as `g8.api.call("put_app_secret_apps__app_id__secrets__secret_key__put", input)`)
928
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
929
+ - API-key scope: `apps:write`
930
+ - ★ Hand-written: [`g8.appPlatform.putSecret()`](../sdk-clients.md#g8-appplatform-putsecret)
931
+
932
+ Declare a secret, or rotate where an existing one lives.
933
+
934
+ UPSERT, not create. Re-declaring a key is a rotation rather than a 409: the
935
+ builder is saying the value moved, and refusing would make the common case an
936
+ error and push them towards delete-then-create, which loses `created_at` and
937
+ briefly leaves the app declaring nothing.
938
+
939
+ `provider_ref` is a POINTER. The DTO refuses the obvious credential shapes,
940
+ which is a guardrail against the honest mistake rather than a security
941
+ control: nothing can reliably tell a path from a secret, but someone pasting a
942
+ value because the field sits next to the key is the likely error, and this
943
+ turns a silent unrecoverable leak into a 422 they read.
944
+
945
+ **Input**
946
+
947
+ | Field | Type | Required | Description |
948
+ |---|---|---|---|
949
+ | `path.app_id` | `string` | yes | |
950
+ | `path.secret_key` | `string` | yes | |
951
+ | `body` | `PutAppSecretRequest` | yes | Request body; fields below. |
952
+ | `headers.X-Org-Id` | `string \| null` | no | |
953
+
954
+ Body fields (`PutAppSecretRequest`):
955
+
956
+ | Field | Type | Required | Description |
957
+ |---|---|---|---|
958
+ | `body.provider_ref` | `string \| null` | no | Secret-manager PATH for the value. Never the value itself. max length 500 |
959
+
960
+ **Returns** `ApiResponse_AppSecretResponse_`: the envelope `{ data: AppSecretResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
961
+
962
+ Other envelope fields: `pagination` (PaginationMeta).
963
+
964
+ `AppSecretResponse` fields:
965
+
966
+ | Field | Type | Required | Description |
967
+ |---|---|---|---|
968
+ | `secret_key` | `string` | yes | |
969
+ | `created_at` | `string (date-time) \| null` | no | |
970
+ | `provider_ref` | `string \| null` | no | Where the value lives, e.g. a secret-manager path. Never the value. |
971
+ | `rotated_at` | `string (date-time) \| null` | no | Last time this declaration was rewritten. Moves on every write, including one that repeats the same pointer: the pointer is not the secret, so an unchanged path does not mean an unchanged value. |
972
+
973
+ **Example**
974
+
975
+ ```ts
976
+ const result = await g8.api.apps.putAppSecret({ path: { app_id: "id", secret_key: "example" }, body: {} });
977
+ ```
978
+
979
+ ---
980
+
981
+ <a id="op-revokeappcredential"></a>
982
+
983
+ ### `g8.api.apps.revokeAppCredential(input)`
984
+
985
+ **Revoke App Credential**
986
+
987
+ - HTTP: `DELETE /api/v1/apps/{app_id}/credentials/{client_id}`
988
+ - operationId: `revoke_app_credential_apps__app_id__credentials__client_id__delete` (also callable as `g8.api.call("revoke_app_credential_apps__app_id__credentials__client_id__delete", input)`)
989
+ - Tier: `destructive`: deletes or archives data; confirm with a human before calling
990
+ - API-key scope: `apps:delete`
991
+ - Lifecycle: `preview` (may not be enabled for every org yet)
992
+
993
+ PREVIEW. This endpoint is deployed but gated: it returns 404 unless the hosted app platform is enabled for your organization. It is published here so the contract describes the whole surface, not so it can be called today.
994
+
995
+ Revoke a service credential. A status flip, never a delete.
996
+
997
+ Deleting would erase the evidence that the credential ever existed, which is
998
+ precisely what an incident review needs. Tokens already minted from it are
999
+ NOT retroactively invalid — they expire on their own short TTL — but no new
1000
+ one can be minted.
1001
+
1002
+ **Input**
1003
+
1004
+ | Field | Type | Required | Description |
1005
+ |---|---|---|---|
1006
+ | `path.app_id` | `string` | yes | |
1007
+ | `path.client_id` | `string` | yes | |
1008
+ | `headers.X-Org-Id` | `string \| null` | no | |
1009
+
1010
+ **Returns** `ApiResponse_CredentialResponse_`: the envelope `{ data: CredentialResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1011
+
1012
+ Other envelope fields: `pagination` (PaginationMeta).
1013
+
1014
+ `CredentialResponse` fields:
1015
+
1016
+ | Field | Type | Required | Description |
1017
+ |---|---|---|---|
1018
+ | `app_id` | `string` | yes | |
1019
+ | `client_id` | `string` | yes | |
1020
+ | `client_org_id` | `string` | yes | |
1021
+ | `created_at` | `string (date-time) \| null` | no | |
1022
+ | `revoked` | `boolean` | no | default `false` |
1023
+
1024
+ **Example**
1025
+
1026
+ ```ts
1027
+ // destructive: deletes or archives data; confirm with a human before calling.
1028
+ const result = await g8.api.apps.revokeAppCredential({ path: { app_id: "id", client_id: "id" } });
1029
+ ```
1030
+
1031
+ ---
1032
+
1033
+ <a id="op-setapplimit"></a>
1034
+
1035
+ ### `g8.api.apps.setAppLimit(input)`
1036
+
1037
+ **Set App Limit**
1038
+
1039
+ - HTTP: `PUT /api/v1/apps/{app_id}/limit`
1040
+ - operationId: `set_app_limit_apps__app_id__limit_put` (also callable as `g8.api.call("set_app_limit_apps__app_id__limit_put", input)`)
1041
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
1042
+ - API-key scope: `apps:write`
1043
+ - Lifecycle: `preview` (may not be enabled for every org yet)
1044
+
1045
+ PREVIEW. This endpoint is deployed but gated: it returns 404 unless the hosted app platform is enabled for your organization. It is published here so the contract describes the whole surface, not so it can be called today.
1046
+
1047
+ Set this app's hard credit cap for a window.
1048
+
1049
+ `set_limit` and `clear_limit` shipped with the repository layer
1050
+ (`repositories/usage.py:198,229`), with a Protocol (`contracts.py:957`) and
1051
+ tests, and NO route ever called them. So a builder could read their cap and
1052
+ could never set one, and the only way a limit row came into existence was by
1053
+ hand.
1054
+
1055
+ That matters more than a missing endpoint usually would: in a builder-pays
1056
+ model the cap is the entire spend-safety story. Enforcement was complete and
1057
+ unreachable.
1058
+
1059
+ Same shape as the #16816 bug, where `store_credential` and `revoke_credential`
1060
+ shipped without callers so no service token could ever be minted.
1061
+
1062
+ SINGULAR `/limit`, not `/limits`. The read half is singular and is frozen
1063
+ that way in `openapi_operation_ids.json` and the published bundle; adding a
1064
+ plural verb would put two spellings of one resource in the public contract
1065
+ forever.
1066
+
1067
+ **Input**
1068
+
1069
+ | Field | Type | Required | Description |
1070
+ |---|---|---|---|
1071
+ | `path.app_id` | `string` | yes | |
1072
+ | `body` | `SetAppLimitRequest` | yes | Request body; fields below. |
1073
+ | `headers.X-Org-Id` | `string \| null` | no | |
1074
+
1075
+ Body fields (`SetAppLimitRequest`):
1076
+
1077
+ | Field | Type | Required | Description |
1078
+ |---|---|---|---|
1079
+ | `body.credit_cap` | `integer` | yes | Hard cap in credits for the window. `0` means 'cap at zero', NOT 'uncapped' -- to remove a cap, DELETE the limit instead. min 0 |
1080
+ | `body.window` | `string` | no | Cap window. `calendar_month` is the only value today. default `"calendar_month"` |
1081
+
1082
+ **Returns** `ApiResponse_AppLimitResponse_`: the envelope `{ data: AppLimitResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1083
+
1084
+ Other envelope fields: `pagination` (PaginationMeta).
1085
+
1086
+ `AppLimitResponse` fields:
1087
+
1088
+ | Field | Type | Required | Description |
1089
+ |---|---|---|---|
1090
+ | `app_id` | `string` | yes | |
1091
+ | `credit_cap` | `integer` | yes | |
1092
+ | `window` | `string` | yes | Cap window. `calendar_month` today. |
1093
+ | `created_at` | `string (date-time) \| null` | no | |
1094
+
1095
+ **Example**
1096
+
1097
+ ```ts
1098
+ const result = await g8.api.apps.setAppLimit({ path: { app_id: "id" }, body: { credit_cap: 0 } });
1099
+ ```
1100
+
1101
+ ---
1102
+
1103
+ <a id="op-setappsource"></a>
1104
+
1105
+ ### `g8.api.apps.setAppSource(input)`
1106
+
1107
+ **Set App Source**
1108
+
1109
+ - HTTP: `PUT /api/v1/apps/{app_id}/source`
1110
+ - operationId: `set_app_source_apps__app_id__source_put` (also callable as `g8.api.call("set_app_source_apps__app_id__source_put", input)`)
1111
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
1112
+ - API-key scope: `apps:write`
1113
+ - ★ Hand-written: [`g8.appPlatform.setSource()`](../sdk-clients.md#g8-appplatform-setsource)
1114
+
1115
+ Bind this app to the repository a build should fetch (J1).
1116
+
1117
+ Idempotent, and a REPLACE rather than a merge: every field is written, so
1118
+ rebinding from one provider to another cannot leave the previous provider's
1119
+ credential pointer behind. A build fetching a new repo with a stale
1120
+ credential is the failure this shape exists to prevent.
1121
+
1122
+ There is no GET here on purpose. Source is 1:1 with the app and comes back on
1123
+ `GET /apps/{app_id}` through `AppResponse`, so a separate read would be a
1124
+ second thing to keep in step for no new information.
1125
+
1126
+ `credential_ref` is a POINTER to a secret, never a secret. The DTO says so and
1127
+ the column comment says so, because a token written here would also live in
1128
+ every backup of the control plane and in this route's own response.
1129
+
1130
+ **Input**
1131
+
1132
+ | Field | Type | Required | Description |
1133
+ |---|---|---|---|
1134
+ | `path.app_id` | `string` | yes | |
1135
+ | `body` | `AppSourceRequest` | yes | Request body; fields below. |
1136
+ | `headers.X-Org-Id` | `string \| null` | no | |
1137
+
1138
+ Body fields (`AppSourceRequest`):
1139
+
1140
+ | Field | Type | Required | Description |
1141
+ |---|---|---|---|
1142
+ | `body.provider` | `string` | yes | One of: github, gitlab, bitbucket. |
1143
+ | `body.repo_url` | `string` | yes | Clone URL. min length 1, max length 2000 |
1144
+ | `body.credential_ref` | `string \| null` | no | Secret-manager PATH for the fetch credential. Never the credential itself. max length 500 |
1145
+ | `body.default_branch` | `string \| null` | no | Defaults to the repository's own default when omitted. max length 255 |
1146
+
1147
+ **Returns** `ApiResponse_AppResponse_`: the envelope `{ data: AppResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1148
+
1149
+ Other envelope fields: `pagination` (PaginationMeta).
1150
+
1151
+ `AppResponse` fields:
1152
+
1153
+ | Field | Type | Required | Description |
1154
+ |---|---|---|---|
1155
+ | `app_id` | `string` | yes | |
1156
+ | `builder_org_id` | `string` | yes | |
1157
+ | `name` | `string` | yes | |
1158
+ | `slug` | `string` | yes | |
1159
+ | `status` | `string` | yes | Lifecycle state: `draft`, `published`, `suspended` or `archived`. `active` is accepted on write as a legacy spelling of `published`. |
1160
+ | `archived_at` | `string (date-time) \| null` | no | |
1161
+ | `created_at` | `string (date-time) \| null` | no | |
1162
+ | `default_hostname` | `string \| null` | no | |
1163
+ | `registered_origins` | `Array<string>` | no | https-only origins a browser app token may be presented from. |
1164
+ | `source_credential_ref` | `string \| null` | no | A POINTER to the credential (a secret-manager path), never the credential itself. |
1165
+ | `source_default_branch` | `string \| null` | no | |
1166
+ | `source_provider` | `string \| null` | no | |
1167
+ | `source_repo_url` | `string \| null` | no | Where this app's code lives. Null until bound. |
1168
+
1169
+ **Example**
1170
+
1171
+ ```ts
1172
+ const result = await g8.api.apps.setAppSource({
1173
+ path: { app_id: "id" },
1174
+ body: { provider: "example", repo_url: "https://example.com" },
1175
+ });
1176
+ ```
1177
+
1178
+ ---
1179
+
1180
+ <a id="op-setappstatus"></a>
1181
+
1182
+ ### `g8.api.apps.setAppStatus(input)`
1183
+
1184
+ **Set App Status**
1185
+
1186
+ - HTTP: `POST /api/v1/apps/{app_id}/status`
1187
+ - operationId: `set_app_status_apps__app_id__status_post` (also callable as `g8.api.call("set_app_status_apps__app_id__status_post", input)`)
1188
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
1189
+ - API-key scope: `apps:write`
1190
+ - Lifecycle: `preview` (may not be enabled for every org yet)
1191
+ - ★ Hand-written: [`g8.apps.setStatus()`](../sdk-clients.md#g8-apps-setstatus)
1192
+
1193
+ PREVIEW. This endpoint is deployed but gated: it returns 404 unless the hosted app platform is enabled for your organization. It is published here so the contract describes the whole surface, not so it can be called today.
1194
+
1195
+ Move an app through its lifecycle: `draft` → `published` → `archived`.
1196
+
1197
+ `suspended` is the platform's kill switch and is NOT settable here — a builder
1198
+ suspending and un-suspending their own app would defeat it entirely.
1199
+
1200
+ **Input**
1201
+
1202
+ | Field | Type | Required | Description |
1203
+ |---|---|---|---|
1204
+ | `path.app_id` | `string` | yes | |
1205
+ | `body` | `SetAppStatusRequest` | yes | Request body; fields below. |
1206
+ | `headers.X-Org-Id` | `string \| null` | no | |
1207
+
1208
+ Body fields (`SetAppStatusRequest`):
1209
+
1210
+ | Field | Type | Required | Description |
1211
+ |---|---|---|---|
1212
+ | `body.status` | `string` | yes | `draft`, `published`, `suspended` or `archived`. `active` is accepted as the legacy spelling of `published`. |
1213
+
1214
+ **Returns** `ApiResponse_AppResponse_`: the envelope `{ data: AppResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1215
+
1216
+ Other envelope fields: `pagination` (PaginationMeta).
1217
+
1218
+ `AppResponse` fields:
1219
+
1220
+ | Field | Type | Required | Description |
1221
+ |---|---|---|---|
1222
+ | `app_id` | `string` | yes | |
1223
+ | `builder_org_id` | `string` | yes | |
1224
+ | `name` | `string` | yes | |
1225
+ | `slug` | `string` | yes | |
1226
+ | `status` | `string` | yes | Lifecycle state: `draft`, `published`, `suspended` or `archived`. `active` is accepted on write as a legacy spelling of `published`. |
1227
+ | `archived_at` | `string (date-time) \| null` | no | |
1228
+ | `created_at` | `string (date-time) \| null` | no | |
1229
+ | `default_hostname` | `string \| null` | no | |
1230
+ | `registered_origins` | `Array<string>` | no | https-only origins a browser app token may be presented from. |
1231
+ | `source_credential_ref` | `string \| null` | no | A POINTER to the credential (a secret-manager path), never the credential itself. |
1232
+ | `source_default_branch` | `string \| null` | no | |
1233
+ | `source_provider` | `string \| null` | no | |
1234
+ | `source_repo_url` | `string \| null` | no | Where this app's code lives. Null until bound. |
1235
+
1236
+ **Example**
1237
+
1238
+ ```ts
1239
+ const result = await g8.api.apps.setAppStatus({ path: { app_id: "id" }, body: { status: "example" } });
1240
+ ```
1241
+
1242
+ ---
1243
+
1244
+ <a id="op-validateappmanifest"></a>
1245
+
1246
+ ### `g8.api.apps.validateAppManifest(input)`
1247
+
1248
+ **Validate App Manifest**
1249
+
1250
+ - HTTP: `POST /api/v1/apps/manifest/validate`
1251
+ - operationId: `validate_app_manifest_apps_manifest_validate_post` (also callable as `g8.api.call("validate_app_manifest_apps_manifest_validate_post", input)`)
1252
+ - Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
1253
+ - API-key scope: `apps:write`
1254
+
1255
+ Validate a `graph8.app.yaml` without applying it. No app id needed.
1256
+
1257
+ Answers 200 whether or not the manifest is valid: the question "is this
1258
+ valid" was served correctly even when the answer is no, and a 422 would make
1259
+ a builder's linter treat a working call as a transport failure. `valid` is
1260
+ the answer; `issues` carries every problem at once, each with a path pointer,
1261
+ so a whole file is fixed in one round trip.
1262
+
1263
+ Requires an allowlisted builder org but no app, because linting a manifest
1264
+ in CI should not require naming an app or holding a credential scoped to one.
1265
+
1266
+ **Input**
1267
+
1268
+ | Field | Type | Required | Description |
1269
+ |---|---|---|---|
1270
+ | `body` | `ManifestRequest` | yes | Request body; fields below. |
1271
+ | `headers.X-Org-Id` | `string \| null` | no | |
1272
+
1273
+ Body fields (`ManifestRequest`):
1274
+
1275
+ | Field | Type | Required | Description |
1276
+ |---|---|---|---|
1277
+ | `body.manifest` | `string` | yes | The full graph8.app.yaml document as text. Sent verbatim, including newlines. Rejected above 256 KiB by the parser. |
1278
+
1279
+ **Returns** `ApiResponse_ValidateManifestResponse_`: the envelope `{ data: ValidateManifestResponse, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1280
+
1281
+ Other envelope fields: `pagination` (PaginationMeta).
1282
+
1283
+ `ValidateManifestResponse` fields:
1284
+
1285
+ | Field | Type | Required | Description |
1286
+ |---|---|---|---|
1287
+ | `valid` | `boolean` | yes | |
1288
+ | `issues` | `Array<ManifestIssueResponse>` | no | |
1289
+ | `summary` | `ManifestSummary \| null` | no | |
1290
+
1291
+ **Example**
1292
+
1293
+ ```ts
1294
+ const result = await g8.api.apps.validateAppManifest({ body: { manifest: "example" } });
1295
+ ```
1296
+
1297
+ ---
1298
+
1299
+ ## Referenced types
1300
+
1301
+ Named types that appear in the tables above. Full TypeScript definitions: `G8Contract.<Name>` (`import type { G8Contract } from "@graph8/sdk"`).
1302
+
1303
+ <a id="type-manifestissueresponse"></a>
1304
+
1305
+ ### `ManifestIssueResponse`
1306
+
1307
+ One validation problem, addressed to a line a builder can fix.
1308
+
1309
+ | Field | Type | Required | Description |
1310
+ |---|---|---|---|
1311
+ | `code` | `string` | yes | Machine-readable cause. Stable; safe to branch on. |
1312
+ | `message` | `string` | yes | |
1313
+ | `path` | `string` | yes | Pointer into the document, e.g. objects[0].attributes[1].type |
1314
+
1315
+ <a id="type-manifestsummary"></a>
1316
+
1317
+ ### `ManifestSummary`
1318
+
1319
+ What a valid manifest declares. The echo of a successful parse. Deliberately a summary and not the parsed document: a builder who wants the document already has it, and echoing it back would make this response the second place the shape is defined.
1320
+
1321
+ | Field | Type | Required | Description |
1322
+ |---|---|---|---|
1323
+ | `version` | `integer` | yes | |
1324
+ | `app_name` | `string \| null` | no | |
1325
+ | `app_slug` | `string \| null` | no | |
1326
+ | `attribute_count` | `integer` | no | default `0` |
1327
+ | `has_backend` | `boolean` | no | default `false` |
1328
+ | `has_frontend` | `boolean` | no | default `false` |
1329
+ | `object_slugs` | `Array<string>` | no | |
1330
+
1331
+ <a id="type-materializationsummary"></a>
1332
+
1333
+ ### `MaterializationSummary`
1334
+
1335
+ How the fan-out went, as counts. Never tenant ids -- see module docstring.
1336
+
1337
+ | Field | Type | Required | Description |
1338
+ |---|---|---|---|
1339
+ | `failed` | `integer` | no | default `0` |
1340
+ | `ready` | `integer` | no | default `0` |
1341
+ | `skipped` | `integer` | no | Tenants already materialized on this exact digest. default `0` |
1342
+ | `total` | `integer` | no | default `0` |