@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.
- package/README.md +9 -2
- package/dist/cli.js +216 -0
- package/dist/index.d.mts +105 -7
- package/dist/index.d.ts +105 -7
- package/dist/index.js +44 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +44 -3
- package/dist/index.mjs.map +1 -1
- package/dist/react.d.mts +103 -7
- package/dist/react.d.ts +103 -7
- package/dist/react.js +62 -11
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +53 -12
- package/dist/react.mjs.map +1 -1
- package/dist/types/README.md +7 -0
- package/dist/types/agency.d.ts +20 -0
- package/dist/types/agentSetup.d.ts +57 -0
- package/dist/types/api.d.ts +127 -0
- package/dist/types/appClient.d.ts +99 -0
- package/dist/types/appPlatform.d.ts +269 -0
- package/dist/types/appTokens.d.ts +125 -0
- package/dist/types/apps.d.ts +130 -0
- package/dist/types/audiences.d.ts +88 -0
- package/dist/types/calendar.d.ts +55 -0
- package/dist/types/campaigns.d.ts +61 -0
- package/dist/types/chat.d.ts +35 -0
- package/dist/types/cli.d.ts +14 -0
- package/dist/types/companies.d.ts +123 -0
- package/dist/types/contacts.d.ts +200 -0
- package/dist/types/copilot.d.ts +31 -0
- package/dist/types/core.d.ts +1052 -0
- package/dist/types/deals.d.ts +215 -0
- package/dist/types/enrich.d.ts +51 -0
- package/dist/types/fields.d.ts +84 -0
- package/dist/types/forms.d.ts +16 -0
- package/dist/types/http.d.ts +141 -0
- package/dist/types/inbox.d.ts +123 -0
- package/dist/types/index.d.ts +63 -0
- package/dist/types/intent.d.ts +196 -0
- package/dist/types/lists.d.ts +44 -0
- package/dist/types/mailboxes.d.ts +240 -0
- package/dist/types/marketplace.d.ts +62 -0
- package/dist/types/meetings.d.ts +70 -0
- package/dist/types/newsletter.d.ts +212 -0
- package/dist/types/notes.d.ts +57 -0
- package/dist/types/objects.d.ts +281 -0
- package/dist/types/pipelines.d.ts +135 -0
- package/dist/types/quotes.d.ts +143 -0
- package/dist/types/react.d.ts +978 -0
- package/dist/types/search.d.ts +99 -0
- package/dist/types/sequences.d.ts +255 -0
- package/dist/types/signals.d.ts +28 -0
- package/dist/types/skills.d.ts +176 -0
- package/dist/types/snippet.d.ts +24 -0
- package/dist/types/studio.d.ts +161 -0
- package/dist/types/tasks.d.ts +101 -0
- package/dist/types/types.d.ts +45 -0
- package/dist/types/utils.d.ts +21 -0
- package/dist/types/version.d.ts +10 -0
- package/dist/types/visitors.d.ts +29 -0
- package/dist/types/voice.d.ts +304 -0
- package/dist/types/webhooks.d.ts +71 -0
- package/dist/types/workflows.d.ts +229 -0
- package/docs/agents.md +748 -0
- package/docs/api/README.md +165 -0
- package/docs/api/accounts.d.ts +396 -0
- package/docs/api/accounts.md +644 -0
- package/docs/api/adCampaigns.d.ts +707 -0
- package/docs/api/adCampaigns.md +1091 -0
- package/docs/api/adCreatives.d.ts +996 -0
- package/docs/api/adCreatives.md +1708 -0
- package/docs/api/agency.d.ts +556 -0
- package/docs/api/agency.md +845 -0
- package/docs/api/agent.d.ts +330 -0
- package/docs/api/agent.md +514 -0
- package/docs/api/agents.d.ts +1622 -0
- package/docs/api/agents.md +2860 -0
- package/docs/api/aiInbox.d.ts +1984 -0
- package/docs/api/aiInbox.md +3490 -0
- package/docs/api/analytics.d.ts +1273 -0
- package/docs/api/analytics.md +2095 -0
- package/docs/api/apiKeys.d.ts +252 -0
- package/docs/api/apiKeys.md +318 -0
- package/docs/api/appDeployments.d.ts +236 -0
- package/docs/api/appDeployments.md +471 -0
- package/docs/api/appDomains.d.ts +171 -0
- package/docs/api/appDomains.md +281 -0
- package/docs/api/appLogs.d.ts +120 -0
- package/docs/api/appLogs.md +159 -0
- package/docs/api/appObjects.d.ts +415 -0
- package/docs/api/appObjects.md +568 -0
- package/docs/api/appPages.d.ts +557 -0
- package/docs/api/appPages.md +796 -0
- package/docs/api/appPlatformTokens.d.ts +123 -0
- package/docs/api/appPlatformTokens.md +172 -0
- package/docs/api/appointments.d.ts +2361 -0
- package/docs/api/appointments.md +3917 -0
- package/docs/api/apps.d.ts +822 -0
- package/docs/api/apps.md +1342 -0
- package/docs/api/assertUpsert.d.ts +286 -0
- package/docs/api/assertUpsert.md +370 -0
- package/docs/api/audienceSyncs.d.ts +259 -0
- package/docs/api/audienceSyncs.md +395 -0
- package/docs/api/brandKit.d.ts +686 -0
- package/docs/api/brandKit.md +1133 -0
- package/docs/api/bugReports.d.ts +181 -0
- package/docs/api/bugReports.md +268 -0
- package/docs/api/by-path.md +3260 -0
- package/docs/api/calendarInvites.d.ts +117 -0
- package/docs/api/calendarInvites.md +148 -0
- package/docs/api/campaignWorkflows.d.ts +152 -0
- package/docs/api/campaignWorkflows.md +200 -0
- package/docs/api/campaigns.d.ts +721 -0
- package/docs/api/campaigns.md +1236 -0
- package/docs/api/channels.d.ts +171 -0
- package/docs/api/channels.md +235 -0
- package/docs/api/cliCampaigns.d.ts +205 -0
- package/docs/api/cliCampaigns.md +256 -0
- package/docs/api/cliPipelines.d.ts +324 -0
- package/docs/api/cliPipelines.md +562 -0
- package/docs/api/clickHouse.d.ts +115 -0
- package/docs/api/clickHouse.md +138 -0
- package/docs/api/companies.d.ts +1636 -0
- package/docs/api/companies.md +2211 -0
- package/docs/api/companyIntelligence.d.ts +299 -0
- package/docs/api/companyIntelligence.md +488 -0
- package/docs/api/contacts.d.ts +2173 -0
- package/docs/api/contacts.md +3143 -0
- package/docs/api/content.d.ts +968 -0
- package/docs/api/content.md +1667 -0
- package/docs/api/contentGridSkills.d.ts +177 -0
- package/docs/api/contentGridSkills.md +271 -0
- package/docs/api/copilot.d.ts +1017 -0
- package/docs/api/copilot.md +1765 -0
- package/docs/api/crmSyncs.d.ts +215 -0
- package/docs/api/crmSyncs.md +301 -0
- package/docs/api/customerSuccess.d.ts +491 -0
- package/docs/api/customerSuccess.md +776 -0
- package/docs/api/deals.d.ts +1697 -0
- package/docs/api/deals.md +2436 -0
- package/docs/api/deliverability.d.ts +418 -0
- package/docs/api/deliverability.md +677 -0
- package/docs/api/desk.d.ts +1765 -0
- package/docs/api/desk.md +3007 -0
- package/docs/api/dialer.d.ts +1185 -0
- package/docs/api/dialer.md +2166 -0
- package/docs/api/dialerAnalytics.d.ts +187 -0
- package/docs/api/dialerAnalytics.md +257 -0
- package/docs/api/documents.d.ts +895 -0
- package/docs/api/documents.md +1440 -0
- package/docs/api/duplicates.d.ts +195 -0
- package/docs/api/duplicates.md +315 -0
- package/docs/api/eSign.d.ts +38 -0
- package/docs/api/eSign.md +54 -0
- package/docs/api/eSignature.d.ts +242 -0
- package/docs/api/eSignature.md +341 -0
- package/docs/api/enrichment.d.ts +3207 -0
- package/docs/api/enrichment.md +5225 -0
- package/docs/api/events.d.ts +115 -0
- package/docs/api/events.md +105 -0
- package/docs/api/fields.d.ts +482 -0
- package/docs/api/fields.md +566 -0
- package/docs/api/forms.d.ts +1012 -0
- package/docs/api/forms.md +1542 -0
- package/docs/api/gtmCampaigns.d.ts +662 -0
- package/docs/api/gtmCampaigns.md +1044 -0
- package/docs/api/gtmContext.d.ts +1187 -0
- package/docs/api/gtmContext.md +2112 -0
- package/docs/api/gtmDeliverability.d.ts +60 -0
- package/docs/api/gtmDeliverability.md +63 -0
- package/docs/api/gtmKnowledgeBase.d.ts +76 -0
- package/docs/api/gtmKnowledgeBase.md +91 -0
- package/docs/api/gtmLaunchHelpers.d.ts +123 -0
- package/docs/api/gtmLaunchHelpers.md +148 -0
- package/docs/api/gtmLibrary.d.ts +448 -0
- package/docs/api/gtmLibrary.md +780 -0
- package/docs/api/health.d.ts +39 -0
- package/docs/api/health.md +58 -0
- package/docs/api/imageLibrary.d.ts +341 -0
- package/docs/api/imageLibrary.md +569 -0
- package/docs/api/imports.d.ts +157 -0
- package/docs/api/imports.md +174 -0
- package/docs/api/inbox.d.ts +709 -0
- package/docs/api/inbox.md +1067 -0
- package/docs/api/install.d.ts +213 -0
- package/docs/api/install.md +317 -0
- package/docs/api/installedApps.d.ts +131 -0
- package/docs/api/installedApps.md +241 -0
- package/docs/api/integrationStatus.d.ts +142 -0
- package/docs/api/integrationStatus.md +205 -0
- package/docs/api/integrations.d.ts +2327 -0
- package/docs/api/integrations.md +3791 -0
- package/docs/api/intent.d.ts +482 -0
- package/docs/api/intent.md +858 -0
- package/docs/api/knowledge.d.ts +501 -0
- package/docs/api/knowledge.md +843 -0
- package/docs/api/knowledgeBase.d.ts +84 -0
- package/docs/api/knowledgeBase.md +96 -0
- package/docs/api/landingPages.d.ts +1411 -0
- package/docs/api/landingPages.md +2488 -0
- package/docs/api/leads.d.ts +133 -0
- package/docs/api/leads.md +180 -0
- package/docs/api/library.d.ts +217 -0
- package/docs/api/library.md +338 -0
- package/docs/api/linkedIn.d.ts +227 -0
- package/docs/api/linkedIn.md +289 -0
- package/docs/api/linkedInOutreach.d.ts +727 -0
- package/docs/api/linkedInOutreach.md +990 -0
- package/docs/api/lists.d.ts +1106 -0
- package/docs/api/lists.md +1609 -0
- package/docs/api/logs.d.ts +71 -0
- package/docs/api/logs.md +70 -0
- package/docs/api/mailboxes.d.ts +1050 -0
- package/docs/api/mailboxes.md +1690 -0
- package/docs/api/marketingIntelligence.d.ts +256 -0
- package/docs/api/marketingIntelligence.md +454 -0
- package/docs/api/marketplace.d.ts +3173 -0
- package/docs/api/marketplace.md +5953 -0
- package/docs/api/mcp.d.ts +69 -0
- package/docs/api/mcp.md +69 -0
- package/docs/api/me.d.ts +54 -0
- package/docs/api/me.md +56 -0
- package/docs/api/meetings.d.ts +539 -0
- package/docs/api/meetings.md +747 -0
- package/docs/api/newsletter.d.ts +1613 -0
- package/docs/api/newsletter.md +2746 -0
- package/docs/api/notes.d.ts +517 -0
- package/docs/api/notes.md +888 -0
- package/docs/api/notifications.d.ts +94 -0
- package/docs/api/notifications.md +105 -0
- package/docs/api/objects.d.ts +621 -0
- package/docs/api/objects.md +1098 -0
- package/docs/api/openSearch.d.ts +234 -0
- package/docs/api/openSearch.md +297 -0
- package/docs/api/ops.d.ts +299 -0
- package/docs/api/ops.md +339 -0
- package/docs/api/orgGovernance.d.ts +393 -0
- package/docs/api/orgGovernance.md +623 -0
- package/docs/api/orgVideos.d.ts +184 -0
- package/docs/api/orgVideos.md +252 -0
- package/docs/api/organizationSettings.d.ts +626 -0
- package/docs/api/organizationSettings.md +911 -0
- package/docs/api/phoneNumbers.d.ts +484 -0
- package/docs/api/phoneNumbers.md +777 -0
- package/docs/api/profile.d.ts +329 -0
- package/docs/api/profile.md +540 -0
- package/docs/api/programmaticPages.d.ts +400 -0
- package/docs/api/programmaticPages.md +626 -0
- package/docs/api/providerDomains.d.ts +866 -0
- package/docs/api/providerDomains.md +1446 -0
- package/docs/api/providerUsage.d.ts +129 -0
- package/docs/api/providerUsage.md +186 -0
- package/docs/api/public.d.ts +69 -0
- package/docs/api/public.md +78 -0
- package/docs/api/publicCopilot.d.ts +67 -0
- package/docs/api/publicCopilot.md +80 -0
- package/docs/api/publicSignals.d.ts +66 -0
- package/docs/api/publicSignals.md +71 -0
- package/docs/api/publicVisitors.d.ts +97 -0
- package/docs/api/publicVisitors.md +118 -0
- package/docs/api/quotes.d.ts +1564 -0
- package/docs/api/quotes.md +2553 -0
- package/docs/api/radar.d.ts +808 -0
- package/docs/api/radar.md +1431 -0
- package/docs/api/radarReports.d.ts +208 -0
- package/docs/api/radarReports.md +306 -0
- package/docs/api/recordRoles.d.ts +143 -0
- package/docs/api/recordRoles.md +175 -0
- package/docs/api/repos.d.ts +146 -0
- package/docs/api/repos.md +211 -0
- package/docs/api/research.d.ts +295 -0
- package/docs/api/research.md +534 -0
- package/docs/api/revenue.d.ts +402 -0
- package/docs/api/revenue.md +608 -0
- package/docs/api/revenueAnalytics.d.ts +147 -0
- package/docs/api/revenueAnalytics.md +212 -0
- package/docs/api/revenueLifecycle.d.ts +207 -0
- package/docs/api/revenueLifecycle.md +274 -0
- package/docs/api/revenueRecords.d.ts +372 -0
- package/docs/api/revenueRecords.md +563 -0
- package/docs/api/roles.d.ts +431 -0
- package/docs/api/roles.md +812 -0
- package/docs/api/salesCoach.d.ts +877 -0
- package/docs/api/salesCoach.md +1540 -0
- package/docs/api/sandbox.d.ts +210 -0
- package/docs/api/sandbox.md +380 -0
- package/docs/api/scans.d.ts +104 -0
- package/docs/api/scans.md +136 -0
- package/docs/api/scheduleBuy.d.ts +293 -0
- package/docs/api/scheduleBuy.md +431 -0
- package/docs/api/scraping.d.ts +266 -0
- package/docs/api/scraping.md +383 -0
- package/docs/api/sdrAnalytics.d.ts +138 -0
- package/docs/api/sdrAnalytics.md +246 -0
- package/docs/api/search.d.ts +598 -0
- package/docs/api/search.md +866 -0
- package/docs/api/seo.d.ts +447 -0
- package/docs/api/seo.md +660 -0
- package/docs/api/sequenceLifecycle.d.ts +439 -0
- package/docs/api/sequenceLifecycle.md +513 -0
- package/docs/api/sequences.d.ts +1936 -0
- package/docs/api/sequences.md +3232 -0
- package/docs/api/settings.d.ts +448 -0
- package/docs/api/settings.md +731 -0
- package/docs/api/signals.d.ts +1441 -0
- package/docs/api/signals.md +2526 -0
- package/docs/api/signatures.d.ts +719 -0
- package/docs/api/signatures.md +1247 -0
- package/docs/api/skills.d.ts +230 -0
- package/docs/api/skills.md +466 -0
- package/docs/api/snippet.d.ts +85 -0
- package/docs/api/snippet.md +106 -0
- package/docs/api/socialPublishing.d.ts +824 -0
- package/docs/api/socialPublishing.md +1245 -0
- package/docs/api/studioDocuments.d.ts +244 -0
- package/docs/api/studioDocuments.md +348 -0
- package/docs/api/support.d.ts +90 -0
- package/docs/api/support.md +76 -0
- package/docs/api/suppressions.d.ts +241 -0
- package/docs/api/suppressions.md +343 -0
- package/docs/api/surveys.d.ts +847 -0
- package/docs/api/surveys.md +1223 -0
- package/docs/api/tasks.d.ts +813 -0
- package/docs/api/tasks.md +1344 -0
- package/docs/api/teamMembers.d.ts +668 -0
- package/docs/api/teamMembers.md +1040 -0
- package/docs/api/teams.d.ts +784 -0
- package/docs/api/teams.md +1395 -0
- package/docs/api/usage.d.ts +277 -0
- package/docs/api/usage.md +389 -0
- package/docs/api/visitors.d.ts +690 -0
- package/docs/api/visitors.md +1075 -0
- package/docs/api/voice.d.ts +4661 -0
- package/docs/api/voice.md +7905 -0
- package/docs/api/webAnalytics.d.ts +964 -0
- package/docs/api/webAnalytics.md +1452 -0
- package/docs/api/webChat.d.ts +1704 -0
- package/docs/api/webChat.md +2048 -0
- package/docs/api/webhooks.d.ts +251 -0
- package/docs/api/webhooks.md +386 -0
- package/docs/api/websiteEditor.d.ts +324 -0
- package/docs/api/websiteEditor.md +517 -0
- package/docs/api/work.d.ts +2298 -0
- package/docs/api/work.md +3096 -0
- package/docs/api/workbench.d.ts +2962 -0
- package/docs/api/workbench.md +4884 -0
- package/docs/api/workflows.d.ts +1218 -0
- package/docs/api/workflows.md +2302 -0
- package/docs/sdk-clients.md +4339 -0
- package/package.json +10 -3
package/docs/api/apps.md
ADDED
|
@@ -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` |
|