@epilot/sdk 2.18.34 → 2.19.1

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 (147) hide show
  1. package/definitions/app-runtime.json +1 -1
  2. package/definitions/app.json +135 -3
  3. package/definitions/entity.json +64 -2
  4. package/definitions/pricing.json +25 -7
  5. package/dist/apis/access-token.cjs +6 -6
  6. package/dist/apis/access-token.js +1 -1
  7. package/dist/apis/address-suggestions.cjs +6 -6
  8. package/dist/apis/address-suggestions.js +1 -1
  9. package/dist/apis/address.cjs +6 -6
  10. package/dist/apis/address.js +1 -1
  11. package/dist/apis/ai-agents.cjs +6 -6
  12. package/dist/apis/ai-agents.js +1 -1
  13. package/dist/apis/app.cjs +8 -8
  14. package/dist/apis/app.d.cts +2 -2
  15. package/dist/apis/app.d.ts +2 -2
  16. package/dist/apis/app.js +2 -2
  17. package/dist/apis/audit-logs.cjs +6 -6
  18. package/dist/apis/audit-logs.js +1 -1
  19. package/dist/apis/automation.cjs +6 -6
  20. package/dist/apis/automation.js +1 -1
  21. package/dist/apis/billing.cjs +6 -6
  22. package/dist/apis/billing.js +1 -1
  23. package/dist/apis/blueprint-manifest.cjs +6 -6
  24. package/dist/apis/blueprint-manifest.js +1 -1
  25. package/dist/apis/calendar.cjs +6 -6
  26. package/dist/apis/calendar.js +1 -1
  27. package/dist/apis/configuration-hub.cjs +6 -6
  28. package/dist/apis/configuration-hub.js +1 -1
  29. package/dist/apis/consent.cjs +6 -6
  30. package/dist/apis/consent.js +1 -1
  31. package/dist/apis/customer-portal.cjs +6 -6
  32. package/dist/apis/customer-portal.js +1 -1
  33. package/dist/apis/dashboard.cjs +6 -6
  34. package/dist/apis/dashboard.js +1 -1
  35. package/dist/apis/data-governance.cjs +6 -6
  36. package/dist/apis/data-governance.js +1 -1
  37. package/dist/apis/deduplication.cjs +6 -6
  38. package/dist/apis/deduplication.js +1 -1
  39. package/dist/apis/design.cjs +6 -6
  40. package/dist/apis/design.js +1 -1
  41. package/dist/apis/document.cjs +6 -6
  42. package/dist/apis/document.js +1 -1
  43. package/dist/apis/email-settings.cjs +6 -6
  44. package/dist/apis/email-settings.js +1 -1
  45. package/dist/apis/email-template.cjs +6 -6
  46. package/dist/apis/email-template.js +1 -1
  47. package/dist/apis/entity-mapping.cjs +6 -6
  48. package/dist/apis/entity-mapping.js +1 -1
  49. package/dist/apis/entity.cjs +6 -6
  50. package/dist/apis/entity.d.cts +2 -2
  51. package/dist/apis/entity.d.ts +2 -2
  52. package/dist/apis/entity.js +1 -1
  53. package/dist/apis/environments.cjs +6 -6
  54. package/dist/apis/environments.js +1 -1
  55. package/dist/apis/event-catalog.cjs +6 -6
  56. package/dist/apis/event-catalog.js +1 -1
  57. package/dist/apis/file.cjs +6 -6
  58. package/dist/apis/file.js +1 -1
  59. package/dist/apis/iban.cjs +6 -6
  60. package/dist/apis/iban.js +1 -1
  61. package/dist/apis/integration-toolkit.cjs +6 -6
  62. package/dist/apis/integration-toolkit.js +1 -1
  63. package/dist/apis/journey.cjs +6 -6
  64. package/dist/apis/journey.js +1 -1
  65. package/dist/apis/kanban.cjs +6 -6
  66. package/dist/apis/kanban.js +1 -1
  67. package/dist/apis/message.cjs +6 -6
  68. package/dist/apis/message.js +1 -1
  69. package/dist/apis/metering.cjs +6 -6
  70. package/dist/apis/metering.js +1 -1
  71. package/dist/apis/notes.cjs +6 -6
  72. package/dist/apis/notes.js +1 -1
  73. package/dist/apis/notification.cjs +6 -6
  74. package/dist/apis/notification.js +1 -1
  75. package/dist/apis/organization.cjs +6 -6
  76. package/dist/apis/organization.js +1 -1
  77. package/dist/apis/partner-directory.cjs +6 -6
  78. package/dist/apis/partner-directory.js +1 -1
  79. package/dist/apis/permissions.cjs +6 -6
  80. package/dist/apis/permissions.js +1 -1
  81. package/dist/apis/pricing-tier.cjs +6 -6
  82. package/dist/apis/pricing-tier.js +1 -1
  83. package/dist/apis/pricing.cjs +6 -6
  84. package/dist/apis/pricing.d.cts +2 -2
  85. package/dist/apis/pricing.d.ts +2 -2
  86. package/dist/apis/pricing.js +1 -1
  87. package/dist/apis/purpose.cjs +6 -6
  88. package/dist/apis/purpose.js +1 -1
  89. package/dist/apis/query.cjs +6 -6
  90. package/dist/apis/query.js +1 -1
  91. package/dist/apis/sandbox.cjs +6 -6
  92. package/dist/apis/sandbox.js +1 -1
  93. package/dist/apis/sharing.cjs +6 -6
  94. package/dist/apis/sharing.js +1 -1
  95. package/dist/apis/snapshot.cjs +6 -6
  96. package/dist/apis/snapshot.js +1 -1
  97. package/dist/apis/submission.cjs +6 -6
  98. package/dist/apis/submission.js +1 -1
  99. package/dist/apis/target.cjs +6 -6
  100. package/dist/apis/target.js +1 -1
  101. package/dist/apis/targeting.cjs +6 -6
  102. package/dist/apis/targeting.js +1 -1
  103. package/dist/apis/template-variables.cjs +6 -6
  104. package/dist/apis/template-variables.js +1 -1
  105. package/dist/apis/user.cjs +6 -6
  106. package/dist/apis/user.js +1 -1
  107. package/dist/apis/validation-rules.cjs +6 -6
  108. package/dist/apis/validation-rules.js +1 -1
  109. package/dist/apis/webhooks.cjs +6 -6
  110. package/dist/apis/webhooks.js +1 -1
  111. package/dist/apis/workflow-definition.cjs +6 -6
  112. package/dist/apis/workflow-definition.js +1 -1
  113. package/dist/apis/workflow.cjs +6 -6
  114. package/dist/apis/workflow.js +1 -1
  115. package/dist/app-RZ2JCNZ7.js +7 -0
  116. package/dist/app-U7UEBBWK.cjs +7 -0
  117. package/dist/app-runtime-2MEGUF3G.cjs +5 -0
  118. package/dist/{app-runtime-NBGFHFT2.js → app-runtime-T63JMR4T.js} +1 -1
  119. package/dist/{app.d-CZDjyxee.d.cts → app.d-CyI0Leab.d.cts} +137 -2
  120. package/dist/{app.d-CZDjyxee.d.ts → app.d-CyI0Leab.d.ts} +137 -2
  121. package/dist/{chunk-TNRT33VQ.js → chunk-4MILKZOO.js} +1 -1
  122. package/dist/{chunk-PYZPMZ7V.js → chunk-7REPAE5F.js} +4 -4
  123. package/dist/{chunk-XHVIF7AC.cjs → chunk-HPSTDQ62.cjs} +1 -1
  124. package/dist/{chunk-HA3PH5QM.cjs → chunk-XBUBHNFT.cjs} +4 -4
  125. package/dist/entity-5EFSNTP7.cjs +7 -0
  126. package/dist/entity-62ROADV5.js +7 -0
  127. package/dist/{entity.d-BOpXYCU2.d.cts → entity.d-CQXFlO3D.d.cts} +66 -3
  128. package/dist/{entity.d-BOpXYCU2.d.ts → entity.d-CQXFlO3D.d.ts} +66 -3
  129. package/dist/index.cjs +10 -10
  130. package/dist/index.d.cts +3 -3
  131. package/dist/index.d.ts +3 -3
  132. package/dist/index.js +2 -2
  133. package/dist/pricing-5EKKEZSL.js +7 -0
  134. package/dist/pricing-N4Z2CHGZ.cjs +7 -0
  135. package/dist/{pricing.d-D6HCZpbI.d.cts → pricing.d-Det6zqGv.d.cts} +29 -11
  136. package/dist/{pricing.d-D6HCZpbI.d.ts → pricing.d-Det6zqGv.d.ts} +29 -11
  137. package/docs/app.md +336 -173
  138. package/docs/entity.md +49 -2
  139. package/docs/pricing.md +13 -13
  140. package/package.json +1 -1
  141. package/dist/app-IXCUVIHD.js +0 -7
  142. package/dist/app-RKHOTF7Z.cjs +0 -7
  143. package/dist/app-runtime-AAQHTC7F.cjs +0 -5
  144. package/dist/entity-DBJ2R3UN.js +0 -7
  145. package/dist/entity-HO34WNFK.cjs +0 -7
  146. package/dist/pricing-HQ75T2TF.js +0 -7
  147. package/dist/pricing-HTU5XPZE.cjs +0 -7
package/docs/entity.md CHANGED
@@ -232,6 +232,7 @@ const { data } = await entityClient.listSchemas(...)
232
232
  - [`GraphSeed`](#graphseed)
233
233
  - [`GraphDefinition`](#graphdefinition)
234
234
  - [`GraphNode`](#graphnode)
235
+ - [`GraphNodeFilter`](#graphnodefilter)
235
236
  - [`GraphEdge`](#graphedge)
236
237
  - [`GraphQueryResponse`](#graphqueryresponse)
237
238
  - [`EntitySearchResults`](#entitysearchresults)
@@ -491,6 +492,10 @@ const { data } = await client.getSchema({
491
492
  "widget_visibility": {
492
493
  "next_best_action": true,
493
494
  "address_map": false
495
+ },
496
+ "widget_widths": {
497
+ "address_map": "full_width",
498
+ "recent_communications": "one_third_width"
494
499
  }
495
500
  },
496
501
  "capabilities": [
@@ -649,6 +654,10 @@ const { data } = await client.putSchema(
649
654
  widget_visibility: {
650
655
  next_best_action: true,
651
656
  address_map: false
657
+ },
658
+ widget_widths: {
659
+ address_map: 'full_width',
660
+ recent_communications: 'one_third_width'
652
661
  }
653
662
  },
654
663
  capabilities: [
@@ -807,6 +816,10 @@ const { data } = await client.putSchema(
807
816
  "widget_visibility": {
808
817
  "next_best_action": true,
809
818
  "address_map": false
819
+ },
820
+ "widget_widths": {
821
+ "address_map": "full_width",
822
+ "recent_communications": "one_third_width"
810
823
  }
811
824
  },
812
825
  "capabilities": [
@@ -1257,6 +1270,10 @@ const { data } = await client.freezeSchema(
1257
1270
  "widget_visibility": {
1258
1271
  "next_best_action": true,
1259
1272
  "address_map": false
1273
+ },
1274
+ "widget_widths": {
1275
+ "address_map": "full_width",
1276
+ "recent_communications": "one_third_width"
1260
1277
  }
1261
1278
  },
1262
1279
  "capabilities": [
@@ -1429,6 +1446,10 @@ const { data } = await client.unfreezeSchema({
1429
1446
  "widget_visibility": {
1430
1447
  "next_best_action": true,
1431
1448
  "address_map": false
1449
+ },
1450
+ "widget_widths": {
1451
+ "address_map": "full_width",
1452
+ "recent_communications": "one_third_width"
1432
1453
  }
1433
1454
  },
1434
1455
  "capabilities": [
@@ -5215,6 +5236,7 @@ const { data } = await client.createSchemaCapability(
5215
5236
  header: true,
5216
5237
  requiredPermission: { /* ... */ },
5217
5238
  default_visible: false,
5239
+ default_width: 'half_width',
5218
5240
  pricing_tier_setting: 'entity_address_maps'
5219
5241
  }
5220
5242
  ],
@@ -5350,6 +5372,7 @@ const { data } = await client.createSchemaCapability(
5350
5372
  "header": true,
5351
5373
  "requiredPermission": {},
5352
5374
  "default_visible": false,
5375
+ "default_width": "half_width",
5353
5376
  "pricing_tier_setting": "entity_address_maps"
5354
5377
  }
5355
5378
  ],
@@ -5500,6 +5523,7 @@ const { data } = await client.getSchemaCapability({
5500
5523
  "header": true,
5501
5524
  "requiredPermission": {},
5502
5525
  "default_visible": false,
5526
+ "default_width": "half_width",
5503
5527
  "pricing_tier_setting": "entity_address_maps"
5504
5528
  }
5505
5529
  ],
@@ -5646,6 +5670,7 @@ const { data } = await client.putSchemaCapability(
5646
5670
  header: true,
5647
5671
  requiredPermission: { /* ... */ },
5648
5672
  default_visible: false,
5673
+ default_width: 'half_width',
5649
5674
  pricing_tier_setting: 'entity_address_maps'
5650
5675
  }
5651
5676
  ],
@@ -5781,6 +5806,7 @@ const { data } = await client.putSchemaCapability(
5781
5806
  "header": true,
5782
5807
  "requiredPermission": {},
5783
5808
  "default_visible": false,
5809
+ "default_width": "half_width",
5784
5810
  "pricing_tier_setting": "entity_address_maps"
5785
5811
  }
5786
5812
  ],
@@ -5931,6 +5957,7 @@ const { data } = await client.deleteSchemaCapability({
5931
5957
  "header": true,
5932
5958
  "requiredPermission": {},
5933
5959
  "default_visible": false,
5960
+ "default_width": "half_width",
5934
5961
  "pricing_tier_setting": "entity_address_maps"
5935
5962
  }
5936
5963
  ],
@@ -6468,6 +6495,7 @@ type EntitySchema = {
6468
6495
  }
6469
6496
  widget_order?: string[]
6470
6497
  widget_visibility?: Record<string, boolean>
6498
+ widget_widths?: Record<string, "one_third_width" | "half_width" | "two_third_width" | "full_width">
6471
6499
  }
6472
6500
  capabilities: Array<{
6473
6501
  id?: string
@@ -6495,7 +6523,6 @@ type EntitySchema = {
6495
6523
  data_classification?: { ... }
6496
6524
  _purpose?: { ... }
6497
6525
  _manifest?: { ... }
6498
- constraints?: { ... }
6499
6526
  // ...
6500
6527
  }
6501
6528
  ```
@@ -6586,6 +6613,7 @@ type EntitySchemaItem = {
6586
6613
  }
6587
6614
  widget_order?: string[]
6588
6615
  widget_visibility?: Record<string, boolean>
6616
+ widget_widths?: Record<string, "one_third_width" | "half_width" | "two_third_width" | "full_width">
6589
6617
  }
6590
6618
  capabilities: Array<{
6591
6619
  id?: string
@@ -6602,7 +6630,6 @@ type EntitySchemaItem = {
6602
6630
  required?: { ... }
6603
6631
  readonly?: { ... }
6604
6632
  deprecated?: { ... }
6605
- variant_overridable?: { ... }
6606
6633
  // ...
6607
6634
  }
6608
6635
  ```
@@ -10636,6 +10663,7 @@ type GraphQueryRequest = {
10636
10663
  schema: { ... }
10637
10664
  cardinality?: { ... }
10638
10665
  fields?: { ... }
10666
+ filter?: { ... }
10639
10667
  }>
10640
10668
  edges: Array<{
10641
10669
  from: { ... }
@@ -10665,6 +10693,10 @@ type GraphDefinition = {
10665
10693
  schema: string
10666
10694
  cardinality?: "one" | "many"
10667
10695
  fields?: object
10696
+ filter?: Array<{
10697
+ attribute: { ... }
10698
+ value: { ... }
10699
+ }>
10668
10700
  }>
10669
10701
  edges: Array<{
10670
10702
  from: string
@@ -10681,6 +10713,21 @@ type GraphNode = {
10681
10713
  schema: string
10682
10714
  cardinality?: "one" | "many"
10683
10715
  fields?: object
10716
+ filter?: Array<{
10717
+ attribute: string
10718
+ value: object
10719
+ }>
10720
+ }
10721
+ ```
10722
+
10723
+ ### `GraphNodeFilter`
10724
+
10725
+ Entities are included in this node's result only if `attribute` exactly equals the literal `value`.
10726
+
10727
+ ```ts
10728
+ type GraphNodeFilter = {
10729
+ attribute: string
10730
+ value: object
10684
10731
  }
10685
10732
  ```
10686
10733
 
package/docs/pricing.md CHANGED
@@ -2673,14 +2673,14 @@ type CreatedVariant = {
2673
2673
  }
2674
2674
  valid_from: string
2675
2675
  values: Record<string, unknown>
2676
- _created_at?: string
2677
- _updated_at?: string
2678
- _revision?: number
2676
+ _created_at: string
2677
+ _updated_at: string
2678
+ _revision: number
2679
2679
  warnings: Array<{
2680
2680
  code: "VARIANT_COUNT_APPROACHING_CAP"
2681
2681
  message: string
2682
- variant_count?: number
2683
- cap?: number
2682
+ variant_count: number
2683
+ cap: number
2684
2684
  }>
2685
2685
  }
2686
2686
  ```
@@ -2691,8 +2691,8 @@ type CreatedVariant = {
2691
2691
  type VariantWriteWarning = {
2692
2692
  code: "VARIANT_COUNT_APPROACHING_CAP"
2693
2693
  message: string
2694
- variant_count?: number
2695
- cap?: number
2694
+ variant_count: number
2695
+ cap: number
2696
2696
  }
2697
2697
  ```
2698
2698
 
@@ -2726,9 +2726,9 @@ type VariantVersion = {
2726
2726
  }
2727
2727
  valid_from: string
2728
2728
  values: Record<string, unknown>
2729
- _created_at?: string
2730
- _updated_at?: string
2731
- _revision?: number
2729
+ _created_at: string
2730
+ _updated_at: string
2731
+ _revision: number
2732
2732
  }
2733
2733
  ```
2734
2734
 
@@ -2747,9 +2747,9 @@ type WrittenVariantVersion = {
2747
2747
  }
2748
2748
  valid_from: string
2749
2749
  values: Record<string, unknown>
2750
- _created_at?: string
2751
- _updated_at?: string
2752
- _revision?: number
2750
+ _created_at: string
2751
+ _updated_at: string
2752
+ _revision: number
2753
2753
  warnings: Array<{
2754
2754
  code: "ACTIVE_VERSION_REPLACED" | "SUPERSEDED_VERSION_WRITTEN"
2755
2755
  message: string
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@epilot/sdk",
3
- "version": "2.18.34",
3
+ "version": "2.19.1",
4
4
  "description": "JavaScript/TypeScript SDK for epilot APIs",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -1,7 +0,0 @@
1
- import "./chunk-YPSWSI3M.js";
2
-
3
- // src/docs/app.json
4
- var app_default = '# App API\n\n- **Base URL:** `https://app.sls.epilot.io`\n- **Full API Docs:** [https://docs.epilot.io/api/app](https://docs.epilot.io/api/app)\n\n## Usage\n\n```ts\nimport { epilot } from \'@epilot/sdk\'\n\nepilot.authorize(() => \'<token>\')\nconst { data } = await epilot.app.getPublicFacingComponent(...)\n```\n\n### Tree-shakeable import\n\n```ts\nimport { getClient, authorize } from \'@epilot/sdk/app\'\n\nconst appClient = getClient()\nauthorize(appClient, () => \'<token>\')\nconst { data } = await appClient.getPublicFacingComponent(...)\n```\n\n## Operations\n\n**App Installation**\n- [`getPublicFacingComponent`](#getpublicfacingcomponent)\n- [`listInstallations`](#listinstallations)\n- [`getInstallation`](#getinstallation)\n- [`install`](#install)\n- [`patchInstallation`](#patchinstallation)\n- [`uninstall`](#uninstall)\n- [`promoteVersion`](#promoteversion)\n\n**App Configuration**\n- [`listConfigurations`](#listconfigurations)\n- [`createConfiguration`](#createconfiguration)\n- [`listPublicConfigurations`](#listpublicconfigurations)\n- [`getPublicConfiguration`](#getpublicconfiguration)\n- [`getConfiguration`](#getconfiguration)\n- [`patchMetadata`](#patchmetadata)\n- [`deleteConfiguration`](#deleteconfiguration)\n- [`createBundleUploadUrl`](#createbundleuploadurl)\n- [`createZipUploadUrl`](#createzipuploadurl)\n- [`createLogoUploadUrl`](#createlogouploadurl)\n- [`deleteLogo`](#deletelogo)\n- [`listVersions`](#listversions)\n- [`getVersion`](#getversion)\n- [`deleteVersion`](#deleteversion)\n- [`patchVersion`](#patchversion)\n- [`getReview`](#getreview)\n- [`createReview`](#createreview)\n- [`createComponent`](#createcomponent)\n- [`patchComponent`](#patchcomponent)\n- [`deleteComponent`](#deletecomponent)\n- [`cloneVersion`](#cloneversion)\n\n**App Analytics**\n- [`queryEvents`](#queryevents)\n- [`ingestEvent`](#ingestevent)\n\n**App Proxy**\n- [`publicProxyGet`](#publicproxyget)\n- [`publicProxyPost`](#publicproxypost)\n- [`publicProxyPut`](#publicproxyput)\n- [`publicProxyPatch`](#publicproxypatch)\n- [`publicProxyDelete`](#publicproxydelete)\n\n**Schemas**\n- [`Role`](#role)\n- [`Options`](#options)\n- [`ObjectField`](#objectfield)\n- [`Option`](#option)\n- [`OptionsRef`](#optionsref)\n- [`S3Reference`](#s3reference)\n- [`ComponentType`](#componenttype)\n- [`FunctionDefinition`](#functiondefinition)\n- [`Author`](#author)\n- [`NotificationConfig`](#notificationconfig)\n- [`NotificationEvent`](#notificationevent)\n- [`BaseComponentCommon`](#basecomponentcommon)\n- [`BaseComponent`](#basecomponent)\n- [`ApiProxyComponent`](#apiproxycomponent)\n- [`CustomCapabilityComponent`](#customcapabilitycomponent)\n- [`CustomPageComponent`](#custompagecomponent)\n- [`CustomPageConfig`](#custompageconfig)\n- [`JourneyBlockComponent`](#journeyblockcomponent)\n- [`PortalBlockComponent`](#portalblockcomponent)\n- [`ErpInformToolkitComponent`](#erpinformtoolkitcomponent)\n- [`CustomFlowActionComponent`](#customflowactioncomponent)\n- [`BaseCustomActionConfig`](#basecustomactionconfig)\n- [`ExternalIntegrationCustomActionConfig`](#externalintegrationcustomactionconfig)\n- [`FunctionRefCustomActionConfig`](#functionrefcustomactionconfig)\n- [`CustomFlowConfig`](#customflowconfig)\n- [`ExternalProductCatalogComponent`](#externalproductcatalogcomponent)\n- [`ExternalProductCatalogConfig`](#externalproductcatalogconfig)\n- [`ExternalProductCatalogHookProducts`](#externalproductcataloghookproducts)\n- [`ExternalProductCatalogHookProductRecommendations`](#externalproductcataloghookproductrecommendations)\n- [`PortalExtensionComponent`](#portalextensioncomponent)\n- [`PortalExtensionConfig`](#portalextensionconfig)\n- [`PortalExtensionHookRegistrationIdentifiersCheck`](#portalextensionhookregistrationidentifierscheck)\n- [`PortalExtensionHookContractIdentification`](#portalextensionhookcontractidentification)\n- [`PortalExtensionHookMeterReadingPlausibilityCheck`](#portalextensionhookmeterreadingplausibilitycheck)\n- [`PortalExtensionHookPriceDataRetrieval`](#portalextensionhookpricedataretrieval)\n- [`PortalExtensionHookConsumptionDataRetrieval`](#portalextensionhookconsumptiondataretrieval)\n- [`PortalExtensionHookDataExport`](#portalextensionhookdataexport)\n- [`PortalExtensionHookVisualizationMetadata`](#portalextensionhookvisualizationmetadata)\n- [`PortalExtensionHookCostDataRetrieval`](#portalextensionhookcostdataretrieval)\n- [`PortalExtensionHookChangeEmail`](#portalextensionhookchangeemail)\n- [`PortalExtensionHookChangePassword`](#portalextensionhookchangepassword)\n- [`PortalExtensionHookDeleteAccount`](#portalextensionhookdeleteaccount)\n- [`PortalExtensionSeamlessLink`](#portalextensionseamlesslink)\n- [`PortalExtensionAuthBlock`](#portalextensionauthblock)\n- [`PortalExtensionSecureProxy`](#portalextensionsecureproxy)\n- [`ExternalProductCatalogAuthBlock`](#externalproductcatalogauthblock)\n- [`OverrideDevMode`](#overridedevmode)\n- [`JourneyBlockConfig`](#journeyblockconfig)\n- [`PortalBlockConfig`](#portalblockconfig)\n- [`AppBridgeSurfaceConfig`](#appbridgesurfaceconfig)\n- [`PortalBlockSurfaceConfig`](#portalblocksurfaceconfig)\n- [`JourneyBlockComponentArgs`](#journeyblockcomponentargs)\n- [`TextArg`](#textarg)\n- [`BooleanArg`](#booleanarg)\n- [`BlockReferenceArg`](#blockreferencearg)\n- [`EnumArg`](#enumarg)\n- [`BillingFrequency`](#billingfrequency)\n- [`Pricing`](#pricing)\n- [`Audit`](#audit)\n- [`Review`](#review)\n- [`InternalReview`](#internalreview)\n- [`ConfigurationMetadata`](#configurationmetadata)\n- [`ConfigurationVersion`](#configurationversion)\n- [`ApiProxyConfig`](#apiproxyconfig)\n- [`Grants`](#grants)\n- [`BlueprintRef`](#blueprintref)\n- [`Installation`](#installation)\n- [`PublicConfiguration`](#publicconfiguration)\n- [`Configuration`](#configuration)\n- [`TranslatedString`](#translatedstring)\n- [`CallerIdentity`](#calleridentity)\n- [`BatchEventRequest`](#batcheventrequest)\n- [`Actor`](#actor)\n- [`AppEventData`](#appeventdata)\n- [`EventsQuery`](#eventsquery)\n- [`EventsQueryResponse`](#eventsqueryresponse)\n- [`RawEvents`](#rawevents)\n- [`AggregatedEvents`](#aggregatedevents)\n\n### `getPublicFacingComponent`\n\nRetrieve public facing components for an installed app\n\n`GET /v1/public/app/{appId}/components/{componentId}`\n\n```ts\nconst { data } = await client.getPublicFacingComponent({\n appId: \'example\',\n componentId: \'example\',\n})\n```\n\n<details>\n<summary>Response</summary>\n\n```json\n{\n "component": {\n "component_type": "CUSTOM_JOURNEY_BLOCK",\n "configuration": {\n "override_dev_mode": {\n "override_url": "http://localhost:3000"\n },\n "component_url": "https://cdn.apps.com/123/v1.0.0/bundle.js",\n "component_tag": "string",\n "component_args": [\n {\n "type": "text"\n }\n ],\n "component_size": 0,\n "component_mapping": {}\n }\n }\n}\n```\n\n</details>\n\n---\n\n### `listConfigurations`\n\nList all app configuration metadata owned by an organization. To get full app configuration details, use the /v1/app-configurations/{appId} endpoint.\n\n`GET /v1/app-configurations`\n\n```ts\nconst { data } = await client.listConfigurations({\n page: 1,\n pageSize: 1,\n})\n```\n\n<details>\n<summary>Response</summary>\n\n```json\n{\n "configurations": [\n {\n "app_id": "string",\n "name": "string",\n "author": {\n "name": "string",\n "company": "string",\n "email": "string"\n },\n "dev_mode": true,\n "versions": ["string"],\n "public_versions": ["string"],\n "support_email": "string",\n "latest_version": "string",\n "category": "string",\n "icon_url": "string",\n "documentation_url": "string",\n "description": {\n "en": "string",\n "de": "string"\n },\n "notifications": {\n "email": "developer@example.com",\n "events": ["app.installed"]\n },\n "owner_org_id": "string",\n "internal": false,\n "pricing": {\n "pricing_type": "FREE",\n "billing_frequency": "MONTHLY"\n },\n "configuration_audit": {\n "created_at": "string",\n "created_by": "string",\n "updated_at": "string",\n "updated_by": "string"\n }\n }\n ],\n "pagination": {\n "total": 0,\n "page": 0,\n "pageSize": 0\n }\n}\n```\n\n</details>\n\n---\n\n### `createConfiguration`\n\nCreate a new private app configuration. To make it public a verification process needs to be triggered\n\n`POST /v1/app-configurations`\n\n```ts\nconst { data } = await client.createConfiguration(\n null,\n {\n name: \'string\',\n description: {\n en: \'string\',\n de: \'string\'\n },\n category: \'string\',\n logo_url_key: \'string\'\n },\n)\n```\n\n<details>\n<summary>Response</summary>\n\n```json\n{\n "app_id": "string"\n}\n```\n\n</details>\n\n---\n\n### `listPublicConfigurations`\n\nList all publicly available app configurations that can be installed. This endpoint returns apps that have at least one public version.\n\n`GET /v1/app-configurations/public`\n\n```ts\nconst { data } = await client.listPublicConfigurations({\n page: 1,\n pageSize: 1,\n})\n```\n\n<details>\n<summary>Response</summary>\n\n```json\n{\n "configurations": [\n {\n "app_id": "string",\n "name": "string",\n "author": {\n "name": "string",\n "company": "string",\n "email": "string"\n },\n "dev_mode": true,\n "versions": ["string"],\n "public_versions": ["string"],\n "support_email": "string",\n "latest_version": "string",\n "category": "string",\n "icon_url": "string",\n "documentation_url": "string",\n "description": {\n "en": "string",\n "de": "string"\n },\n "notifications": {\n "email": "developer@example.com",\n "events": ["app.installed"]\n },\n "owner_org_id": "string",\n "internal": false,\n "pricing": {\n "pricing_type": "FREE",\n "billing_frequency": "MONTHLY"\n },\n "configuration_audit": {\n "created_at": "string",\n "created_by": "string",\n "updated_at": "string",\n "updated_by": "string"\n }\n }\n ],\n "pagination": {\n "total": 0,\n "page": 0,\n "pageSize": 0\n }\n}\n```\n\n</details>\n\n---\n\n### `getPublicConfiguration`\n\nRetrieve the public configuration of an app to install in your tenant\n\n`GET /v1/app-configurations/public/{appId}`\n\n```ts\nconst { data } = await client.getPublicConfiguration({\n appId: \'example\',\n version: \'example\',\n})\n```\n\n<details>\n<summary>Response</summary>\n\n```json\n{\n "app_id": "string",\n "support_email": "string",\n "owner_org_id": "string",\n "name": "string",\n "author": {\n "name": "string",\n "company": "string",\n "email": "string"\n },\n "dev_mode": true,\n "category": "string",\n "icon_url": "string",\n "documentation_url": "string",\n "description": {\n "en": "string",\n "de": "string"\n },\n "pricing": {\n "pricing_type": "FREE",\n "billing_frequency": "MONTHLY"\n },\n "components": [\n {\n "component_type": "CUSTOM_JOURNEY_BLOCK",\n "configuration": {}\n }\n ],\n "functions": [\n {\n "name": "string",\n "type": "workflow",\n "label": {},\n "description": {},\n "code": "string",\n "schedule": "rate(30 minutes)",\n "schedule_timezone": "Europe/Berlin",\n "schedule_overlap": "skip",\n "secrets": ["string"]\n }\n ],\n "is_beta": true,\n "deprecated_at": "string",\n "version": "string",\n "role": {\n "id": "string",\n "grants": [\n {}\n ]\n },\n "blueprint_ref": {\n "manifest_id": "string",\n "job_id": "string",\n "source_blueprint_file": "string"\n },\n "latest_version": "string",\n "public": true,\n "versions": [\n {\n "app_id": "string",\n "owner_org_id": "string",\n "components": [],\n "functions": [],\n "visibility": "private",\n "public": false,\n "pending": false,\n "version": "string",\n "is_beta": true,\n "deprecated_at": "string",\n "changelog": "string",\n "review_status": "approved",\n "role": {},\n "blueprint_ref": {},\n "version_audit": {}\n }\n ]\n}\n```\n\n</details>\n\n---\n\n### `getConfiguration`\n\nRetrieve a specific app configuration\n\n`GET /v1/app-configurations/{appId}`\n\n```ts\nconst { data } = await client.getConfiguration({\n appId: \'example\',\n version: \'example\',\n})\n```\n\n<details>\n<summary>Response</summary>\n\n```json\n{\n "app_id": "string",\n "name": "string",\n "author": {\n "name": "string",\n "company": "string",\n "email": "string"\n },\n "dev_mode": true,\n "versions": ["string"],\n "public_versions": ["string"],\n "support_email": "string",\n "latest_version": "string",\n "category": "string",\n "icon_url": "string",\n "documentation_url": "string",\n "description": {\n "en": "string",\n "de": "string"\n },\n "notifications": {\n "email": "developer@example.com",\n "events": ["app.installed"]\n },\n "owner_org_id": "string",\n "internal": false,\n "pricing": {\n "pricing_type": "FREE",\n "billing_frequency": "MONTHLY"\n },\n "configuration_audit": {\n "created_at": "string",\n "created_by": "string",\n "updated_at": "string",\n "updated_by": "string"\n },\n "components": [\n {\n "component_type": "CUSTOM_JOURNEY_BLOCK",\n "configuration": {}\n }\n ],\n "functions": [\n {\n "name": "string",\n "type": "workflow",\n "label": {},\n "description": {},\n "code": "string",\n "schedule": "rate(30 minutes)",\n "schedule_timezone": "Europe/Berlin",\n "schedule_overlap": "skip",\n "secrets": ["string"]\n }\n ],\n "visibility": "private",\n "public": false,\n "pending": false,\n "version": "string",\n "is_beta": true,\n "deprecated_at": "string",\n "changelog": "string",\n "review_status": "approved",\n "role": {\n "id": "string",\n "grants": [\n {}\n ]\n },\n "blueprint_ref": {\n "manifest_id": "string",\n "job_id": "string",\n "source_blueprint_file": "string"\n },\n "version_audit": {\n "created_at": "string",\n "created_by": "string",\n "updated_at": "string",\n "updated_by": "string",\n "versioned_at": "string",\n "versioned_by": "string"\n }\n}\n```\n\n</details>\n\n---\n\n### `patchMetadata`\n\nPatch non-versioned configuration metadata of a given app configuration.\n\n`PATCH /v1/app-configurations/{appId}`\n\n```ts\nconst { data } = await client.patchMetadata(\n {\n appId: \'example\',\n },\n {\n name: \'string\',\n description: {\n en: \'string\',\n de: \'string\'\n },\n category: \'string\',\n documentation_url: \'string\',\n notifications: {\n email: \'developer@example.com\',\n events: [\'app.installed\']\n },\n pricing: {\n pricing_type: \'FREE\',\n billing_frequency: \'MONTHLY\'\n },\n logo_url_key: \'string\',\n support_email: \'string\',\n dev_mode: true\n },\n)\n```\n\n---\n\n### `deleteConfiguration`\n\nDelete app configuration\n\n`DELETE /v1/app-configurations/{appId}`\n\n```ts\nconst { data } = await client.deleteConfiguration({\n appId: \'example\',\n})\n```\n\n---\n\n### `queryEvents`\n\nQuery analytics events for a specific app with flexible filtering\n\n`POST /v1/app-configurations/{appId}/events`\n\n```ts\nconst { data } = await client.queryEvents(\n {\n appId: \'example\',\n },\n {\n time_range: {\n start: \'1970-01-01T00:00:00.000Z\',\n end: \'1970-01-01T00:00:00.000Z\',\n preset: \'1h\'\n },\n filters: {\n source: [\'CUSTOM_JOURNEY_BLOCK\'],\n component_id: [\'string\'],\n event_type: [\'ERROR\'],\n correlation_id: \'string\'\n },\n aggregation: {\n group_by: [\'source\'],\n metrics: [\'count\']\n },\n pagination: {\n page: 1,\n page_size: 100\n },\n sort: {\n field: \'timestamp\',\n order: \'desc\'\n }\n },\n)\n```\n\n<details>\n<summary>Response</summary>\n\n```json\n{\n "query": {\n "time_range": {\n "start": "1970-01-01T00:00:00.000Z",\n "end": "1970-01-01T00:00:00.000Z",\n "preset": "1h"\n },\n "filters": {\n "source": ["CUSTOM_JOURNEY_BLOCK"],\n "component_id": ["string"],\n "event_type": ["ERROR"],\n "correlation_id": "string"\n },\n "aggregation": {\n "group_by": ["source"],\n "metrics": ["count"]\n },\n "pagination": {\n "page": 1,\n "page_size": 100\n },\n "sort": {\n "field": "timestamp",\n "order": "desc"\n }\n },\n "results": {\n "type": "raw",\n "events": [\n {\n "app_id": "string",\n "version": "string",\n "event_id": "string",\n "component_id": "string",\n "timestamp": "string",\n "correlation_id": "string",\n "event_type": "ERROR",\n "source": "CUSTOM_JOURNEY_BLOCK",\n "actor": {\n "org_id": "string",\n "user_id": "string",\n "type": "user"\n },\n "details": {}\n }\n ]\n },\n "pagination": {\n "page": 0,\n "page_size": 0,\n "total_items": 0,\n "has_next": true\n }\n}\n```\n\n</details>\n\n---\n\n### `createBundleUploadUrl`\n\nGenerate a presigned URL for uploading app bundle to /``<app-id>``/bundle.js path\n\n`POST /v1/app-configurations/{appId}/bundle`\n\n```ts\nconst { data } = await client.createBundleUploadUrl(\n {\n appId: \'example\',\n },\n {\n version: \'string\',\n component_id: \'string\'\n },\n)\n```\n\n<details>\n<summary>Response</summary>\n\n```json\n{\n "component_id": "string",\n "component_url": "string",\n "upload_url": "string",\n "s3ref": {\n "bucket": "my-bucket",\n "key": "manifest.json"\n },\n "expires_at": "1970-01-01T00:00:00.000Z"\n}\n```\n\n</details>\n\n---\n\n### `createZipUploadUrl`\n\nGenerate a presigned URL to upload a zip file with artifacts that will be unpacked in a new directory under the /``<app-id>``/ path\n\n`POST /v1/app-configurations/{appId}/zip`\n\n```ts\nconst { data } = await client.createZipUploadUrl(\n {\n appId: \'example\',\n },\n {\n version: \'1.0.0\',\n component_id: \'string\',\n filename: \'dist.zip\'\n },\n)\n```\n\n<details>\n<summary>Response</summary>\n\n```json\n{\n "component_id": "string",\n "upload_url": "string",\n "artifact_url": "string",\n "s3ref": {\n "bucket": "my-bucket",\n "key": "manifest.json"\n },\n "expires_at": "1970-01-01T00:00:00.000Z"\n}\n```\n\n</details>\n\n---\n\n### `createLogoUploadUrl`\n\nGenerate a presigned URL for uploading app logo to /``<app-id>``/logo.png path\n\n`POST /v1/app-configurations/{appId}/logo`\n\n```ts\nconst { data } = await client.createLogoUploadUrl(\n {\n appId: \'example\',\n },\n {\n filename: \'company-logo.png\',\n mime_type: \'image/png\'\n },\n)\n```\n\n<details>\n<summary>Response</summary>\n\n```json\n{\n "upload_url": "string",\n "s3ref": {\n "bucket": "my-bucket",\n "key": "manifest.json"\n },\n "expires_at": "1970-01-01T00:00:00.000Z"\n}\n```\n\n</details>\n\n---\n\n### `deleteLogo`\n\nDelete the app logo from /``<app-id>``/logo.png path\n\n`DELETE /v1/app-configurations/{appId}/logo`\n\n```ts\nconst { data } = await client.deleteLogo({\n appId: \'example\',\n})\n```\n\n---\n\n### `listVersions`\n\nRetrieve a list of versions for an app configuration\n\n`GET /v1/app-configurations/{appId}/versions`\n\n```ts\nconst { data } = await client.listVersions({\n appId: \'example\',\n page: 1,\n pageSize: 1,\n})\n```\n\n<details>\n<summary>Response</summary>\n\n```json\n{\n "versions": [\n {\n "app_id": "string",\n "owner_org_id": "string",\n "components": [\n {\n "component_type": "CUSTOM_JOURNEY_BLOCK",\n "configuration": {\n "override_dev_mode": {\n "override_url": "http://localhost:3000"\n },\n "component_url": "https://cdn.apps.com/123/v1.0.0/bundle.js",\n "component_tag": "string",\n "component_args": [\n {\n "type": "text"\n }\n ],\n "component_size": 0,\n "component_mapping": {}\n }\n }\n ],\n "functions": [\n {\n "name": "string",\n "type": "workflow",\n "label": {\n "en": "string",\n "de": "string"\n },\n "description": {\n "en": "string",\n "de": "string"\n },\n "code": "string",\n "schedule": "rate(30 minutes)",\n "schedule_timezone": "Europe/Berlin",\n "schedule_overlap": "skip",\n "secrets": ["string"]\n }\n ],\n "visibility": "private",\n "public": false,\n "pending": false,\n "version": "string",\n "is_beta": true,\n "deprecated_at": "string",\n "changelog": "string",\n "review_status": "approved",\n "role": {\n "id": "string",\n "grants": [\n {\n "action": "string",\n "resource": "string"\n }\n ]\n },\n "blueprint_ref": {\n "manifest_id": "string",\n "job_id": "string",\n "source_blueprint_file": "string"\n },\n "version_audit": {\n "created_at": "string",\n "created_by": "string",\n "updated_at": "string",\n "updated_by": "string",\n "versioned_at": "string",\n "versioned_by": "string"\n }\n }\n ],\n "pagination": {\n "total": 0,\n "page": 0,\n "pageSize": 0\n }\n}\n```\n\n</details>\n\n---\n\n### `getVersion`\n\nRetrieve a specific version of an app configuration\n\n`GET /v1/app-configurations/{appId}/versions/{version}`\n\n```ts\nconst { data } = await client.getVersion({\n appId: \'example\',\n version: \'example\',\n})\n```\n\n<details>\n<summary>Response</summary>\n\n```json\n{\n "app_id": "string",\n "name": "string",\n "author": {\n "name": "string",\n "company": "string",\n "email": "string"\n },\n "dev_mode": true,\n "versions": ["string"],\n "public_versions": ["string"],\n "support_email": "string",\n "latest_version": "string",\n "category": "string",\n "icon_url": "string",\n "documentation_url": "string",\n "description": {\n "en": "string",\n "de": "string"\n },\n "notifications": {\n "email": "developer@example.com",\n "events": ["app.installed"]\n },\n "owner_org_id": "string",\n "internal": false,\n "pricing": {\n "pricing_type": "FREE",\n "billing_frequency": "MONTHLY"\n },\n "configuration_audit": {\n "created_at": "string",\n "created_by": "string",\n "updated_at": "string",\n "updated_by": "string"\n },\n "components": [\n {\n "component_type": "CUSTOM_JOURNEY_BLOCK",\n "configuration": {}\n }\n ],\n "functions": [\n {\n "name": "string",\n "type": "workflow",\n "label": {},\n "description": {},\n "code": "string",\n "schedule": "rate(30 minutes)",\n "schedule_timezone": "Europe/Berlin",\n "schedule_overlap": "skip",\n "secrets": ["string"]\n }\n ],\n "visibility": "private",\n "public": false,\n "pending": false,\n "version": "string",\n "is_beta": true,\n "deprecated_at": "string",\n "changelog": "string",\n "review_status": "approved",\n "role": {\n "id": "string",\n "grants": [\n {}\n ]\n },\n "blueprint_ref": {\n "manifest_id": "string",\n "job_id": "string",\n "source_blueprint_file": "string"\n },\n "version_audit": {\n "created_at": "string",\n "created_by": "string",\n "updated_at": "string",\n "updated_by": "string",\n "versioned_at": "string",\n "versioned_by": "string"\n }\n}\n```\n\n</details>\n\n---\n\n### `deleteVersion`\n\nDelete a specific version of an app configuration\n\n`DELETE /v1/app-configurations/{appId}/versions/{version}`\n\n```ts\nconst { data } = await client.deleteVersion({\n appId: \'example\',\n version: \'example\',\n})\n```\n\n---\n\n### `patchVersion`\n\nPatch an existing app version\n\n`PATCH /v1/app-configurations/{appId}/versions/{version}`\n\n```ts\nconst { data } = await client.patchVersion(\n {\n appId: \'example\',\n version: \'example\',\n },\n {\n manifest_id: \'string\',\n role_id: \'string\',\n grants: [\n {\n action: \'string\',\n resource: \'string\'\n }\n ],\n functions: [\n {\n name: \'string\',\n type: \'workflow\',\n label: {\n en: \'string\',\n de: \'string\'\n },\n description: {\n en: \'string\',\n de: \'string\'\n },\n code: \'string\',\n schedule: \'rate(30 minutes)\',\n schedule_timezone: \'Europe/Berlin\',\n schedule_overlap: \'skip\',\n secrets: [\'string\']\n }\n ]\n },\n)\n```\n\n---\n\n### `getReview`\n\nRetrieve the review status of a specific app version\n\n`GET /v1/app-configurations/{appId}/versions/{version}/review`\n\n```ts\nconst { data } = await client.getReview({\n appId: \'example\',\n version: \'example\',\n})\n```\n\n<details>\n<summary>Response</summary>\n\n```json\n{\n "review": {\n "version": "string",\n "review_status": "approved",\n "requested_at": "string",\n "requested_by": "string",\n "technical_contact": "string",\n "marketing_contact": "string",\n "demo_url": "string"\n }\n}\n```\n\n</details>\n\n---\n\n### `createReview`\n\nSubmit an app version for review to make it public\n\n`POST /v1/app-configurations/{appId}/versions/{version}/review`\n\n```ts\nconst { data } = await client.createReview(\n {\n appId: \'example\',\n version: \'example\',\n },\n {\n technical_contact: \'string\',\n marketing_contact: \'string\',\n demo_url: \'string\'\n },\n)\n```\n\n<details>\n<summary>Response</summary>\n\n```json\n{\n "review": {\n "version": "string",\n "review_status": "approved",\n "requested_at": "string",\n "requested_by": "string",\n "technical_contact": "string",\n "marketing_contact": "string",\n "demo_url": "string"\n }\n}\n```\n\n</details>\n\n---\n\n### `createComponent`\n\nPatch an existing app version to create/add a component\n\n`POST /v1/app-configurations/{appId}/versions/{version}/components`\n\n```ts\nconst { data } = await client.createComponent(\n {\n appId: \'example\',\n version: \'example\',\n },\n {\n component_type: \'CUSTOM_JOURNEY_BLOCK\',\n configuration: {\n override_dev_mode: {\n override_url: \'http://localhost:3000\'\n },\n component_url: \'https://cdn.apps.com/123/v1.0.0/bundle.js\',\n component_tag: \'string\',\n component_args: [\n {\n type: \'text\'\n }\n ],\n component_size: 0,\n component_mapping: {}\n }\n },\n)\n```\n\n<details>\n<summary>Response</summary>\n\n```json\n{\n "component": {\n "component_type": "CUSTOM_JOURNEY_BLOCK",\n "configuration": {\n "override_dev_mode": {\n "override_url": "http://localhost:3000"\n },\n "component_url": "https://cdn.apps.com/123/v1.0.0/bundle.js",\n "component_tag": "string",\n "component_args": [\n {\n "type": "text"\n }\n ],\n "component_size": 0,\n "component_mapping": {}\n }\n }\n}\n```\n\n</details>\n\n---\n\n### `patchComponent`\n\nPatch an existing app version to update its components\n\n`PATCH /v1/app-configurations/{appId}/versions/{version}/components/{componentId}`\n\n```ts\nconst { data } = await client.patchComponent(\n {\n appId: \'example\',\n version: \'example\',\n componentId: \'example\',\n },\n {\n component_type: \'CUSTOM_JOURNEY_BLOCK\',\n configuration: {\n override_dev_mode: {\n override_url: \'http://localhost:3000\'\n },\n component_url: \'https://cdn.apps.com/123/v1.0.0/bundle.js\',\n component_tag: \'string\',\n component_args: [\n {\n type: \'text\'\n }\n ],\n component_size: 0,\n component_mapping: {}\n }\n },\n)\n```\n\n---\n\n### `deleteComponent`\n\nDelete a specific component from an app version\n\n`DELETE /v1/app-configurations/{appId}/versions/{version}/components/{componentId}`\n\n```ts\nconst { data } = await client.deleteComponent({\n appId: \'example\',\n version: \'example\',\n componentId: \'example\',\n})\n```\n\n---\n\n### `cloneVersion`\n\nClone an existing app version to create a new version\n\n`POST /v1/app-configurations/{appId}/versions/{sourceVersion}/clone-to/{targetVersion}`\n\n```ts\nconst { data } = await client.cloneVersion({\n appId: \'example\',\n sourceVersion: \'example\',\n targetVersion: \'example\',\n})\n```\n\n<details>\n<summary>Response</summary>\n\n```json\n{\n "app_id": "string",\n "version": "string",\n "status": "pending"\n}\n```\n\n</details>\n\n---\n\n### `listInstallations`\n\nRetrieve a list of installed apps for the organization.\n\n`GET /v1/app`\n\n```ts\nconst { data } = await client.listInstallations({\n componentType: \'example\',\n enabled: true,\n page: 1,\n pageSize: 1,\n})\n```\n\n<details>\n<summary>Response</summary>\n\n```json\n{\n "apps": [\n {\n "app_id": "string",\n "installer_org_id": "string",\n "owner_org_id": "string",\n "enabled": true,\n "name": "string",\n "icon_url": "string",\n "option_values": [\n {\n "component_id": "string",\n "options": [\n {\n "key": "string",\n "value": {}\n }\n ]\n }\n ],\n "components": [\n {\n "component_type": "CUSTOM_JOURNEY_BLOCK",\n "configuration": {\n "override_dev_mode": {\n "override_url": "http://localhost:3000"\n },\n "component_url": "https://cdn.apps.com/123/v1.0.0/bundle.js",\n "component_tag": "string",\n "component_args": [\n {\n "type": "text"\n }\n ],\n "component_size": 0,\n "component_mapping": {}\n }\n }\n ],\n "functions": [\n {\n "name": "string",\n "type": "workflow",\n "label": {\n "en": "string",\n "de": "string"\n },\n "description": {\n "en": "string",\n "de": "string"\n },\n "code": "string",\n "schedule": "rate(30 minutes)",\n "schedule_timezone": "Europe/Berlin",\n "schedule_overlap": "skip",\n "secrets": ["string"]\n }\n ],\n "installed_version": "string",\n "role": "string",\n "blueprint_ref": {\n "manifest_id": "string",\n "job_id": "string",\n "source_blueprint_file": "string"\n },\n "installation_audit": {\n "created_at": "string",\n "created_by": "string",\n "updated_at": "string",\n "updated_by": "string"\n },\n "_manifest": ["123e4567-e89b-12d3-a456-426614174000"]\n }\n ],\n "pagination": {\n "total": 0,\n "page": 0,\n "pageSize": 0\n }\n}\n```\n\n</details>\n\n---\n\n### `getInstallation`\n\nRetrieve details of an installed app by its ID.\n\n`GET /v1/app/{appId}`\n\n```ts\nconst { data } = await client.getInstallation({\n appId: \'example\',\n})\n```\n\n<details>\n<summary>Response</summary>\n\n```json\n{\n "app_id": "string",\n "installer_org_id": "string",\n "owner_org_id": "string",\n "enabled": true,\n "name": "string",\n "icon_url": "string",\n "option_values": [\n {\n "component_id": "string",\n "options": [\n {\n "key": "string",\n "value": {}\n }\n ]\n }\n ],\n "components": [\n {\n "component_type": "CUSTOM_JOURNEY_BLOCK",\n "configuration": {\n "override_dev_mode": {\n "override_url": "http://localhost:3000"\n },\n "component_url": "https://cdn.apps.com/123/v1.0.0/bundle.js",\n "component_tag": "string",\n "component_args": [\n {\n "type": "text"\n }\n ],\n "component_size": 0,\n "component_mapping": {}\n }\n }\n ],\n "functions": [\n {\n "name": "string",\n "type": "workflow",\n "label": {\n "en": "string",\n "de": "string"\n },\n "description": {\n "en": "string",\n "de": "string"\n },\n "code": "string",\n "schedule": "rate(30 minutes)",\n "schedule_timezone": "Europe/Berlin",\n "schedule_overlap": "skip",\n "secrets": ["string"]\n }\n ],\n "installed_version": "string",\n "role": "string",\n "blueprint_ref": {\n "manifest_id": "string",\n "job_id": "string",\n "source_blueprint_file": "string"\n },\n "installation_audit": {\n "created_at": "string",\n "created_by": "string",\n "updated_at": "string",\n "updated_by": "string"\n },\n "_manifest": ["123e4567-e89b-12d3-a456-426614174000"]\n}\n```\n\n</details>\n\n---\n\n### `install`\n\nUpsert app installation by its ID.\n\n`POST /v1/app/{appId}`\n\n```ts\nconst { data } = await client.install(\n {\n appId: \'example\',\n },\n {\n version: \'string\',\n option_values: [\n {\n component_id: \'string\',\n options: [\n {\n key: \'string\',\n value: {}\n }\n ]\n }\n ],\n _manifest: [\'123e4567-e89b-12d3-a456-426614174000\']\n },\n)\n```\n\n<details>\n<summary>Response</summary>\n\n```json\n{\n "app_id": "string",\n "installer_org_id": "string",\n "owner_org_id": "string",\n "enabled": true,\n "name": "string",\n "icon_url": "string",\n "option_values": [\n {\n "component_id": "string",\n "options": [\n {\n "key": "string",\n "value": {}\n }\n ]\n }\n ],\n "components": [\n {\n "component_type": "CUSTOM_JOURNEY_BLOCK",\n "configuration": {\n "override_dev_mode": {\n "override_url": "http://localhost:3000"\n },\n "component_url": "https://cdn.apps.com/123/v1.0.0/bundle.js",\n "component_tag": "string",\n "component_args": [\n {\n "type": "text"\n }\n ],\n "component_size": 0,\n "component_mapping": {}\n }\n }\n ],\n "functions": [\n {\n "name": "string",\n "type": "workflow",\n "label": {\n "en": "string",\n "de": "string"\n },\n "description": {\n "en": "string",\n "de": "string"\n },\n "code": "string",\n "schedule": "rate(30 minutes)",\n "schedule_timezone": "Europe/Berlin",\n "schedule_overlap": "skip",\n "secrets": ["string"]\n }\n ],\n "installed_version": "string",\n "role": "string",\n "blueprint_ref": {\n "manifest_id": "string",\n "job_id": "string",\n "source_blueprint_file": "string"\n },\n "installation_audit": {\n "created_at": "string",\n "created_by": "string",\n "updated_at": "string",\n "updated_by": "string"\n },\n "_manifest": ["123e4567-e89b-12d3-a456-426614174000"]\n}\n```\n\n</details>\n\n---\n\n### `patchInstallation`\n\nPatch an installed app by its ID.\n\n`PATCH /v1/app/{appId}`\n\n```ts\nconst { data } = await client.patchInstallation(\n {\n appId: \'example\',\n },\n {\n version: \'string\',\n option_values: [\n {\n component_id: \'string\',\n options: [\n {\n key: \'string\',\n value: {}\n }\n ]\n }\n ],\n _manifest: [\'123e4567-e89b-12d3-a456-426614174000\']\n },\n)\n```\n\n---\n\n### `uninstall`\n\nUninstall an app by its ID.\n\n`DELETE /v1/app/{appId}`\n\n```ts\nconst { data } = await client.uninstall({\n appId: \'example\',\n})\n```\n\n---\n\n### `promoteVersion`\n\nUpdate an installed app to a new version\n\n`POST /v1/app/{appId}/promote-to/{version}`\n\n```ts\nconst { data } = await client.promoteVersion({\n appId: \'example\',\n version: \'example\',\n})\n```\n\n<details>\n<summary>Response</summary>\n\n```json\n{\n "app_id": "string",\n "installer_org_id": "string",\n "owner_org_id": "string",\n "enabled": true,\n "name": "string",\n "icon_url": "string",\n "option_values": [\n {\n "component_id": "string",\n "options": [\n {\n "key": "string",\n "value": {}\n }\n ]\n }\n ],\n "components": [\n {\n "component_type": "CUSTOM_JOURNEY_BLOCK",\n "configuration": {\n "override_dev_mode": {\n "override_url": "http://localhost:3000"\n },\n "component_url": "https://cdn.apps.com/123/v1.0.0/bundle.js",\n "component_tag": "string",\n "component_args": [\n {\n "type": "text"\n }\n ],\n "component_size": 0,\n "component_mapping": {}\n }\n }\n ],\n "functions": [\n {\n "name": "string",\n "type": "workflow",\n "label": {\n "en": "string",\n "de": "string"\n },\n "description": {\n "en": "string",\n "de": "string"\n },\n "code": "string",\n "schedule": "rate(30 minutes)",\n "schedule_timezone": "Europe/Berlin",\n "schedule_overlap": "skip",\n "secrets": ["string"]\n }\n ],\n "installed_version": "string",\n "role": "string",\n "blueprint_ref": {\n "manifest_id": "string",\n "job_id": "string",\n "source_blueprint_file": "string"\n },\n "installation_audit": {\n "created_at": "string",\n "created_by": "string",\n "updated_at": "string",\n "updated_by": "string"\n },\n "_manifest": ["123e4567-e89b-12d3-a456-426614174000"]\n}\n```\n\n</details>\n\n---\n\n### `ingestEvent`\n\nInternal endpoint for services to submit app events for analytic purposes\n\n`POST /v1/app-events`\n\n```ts\nconst { data } = await client.ingestEvent(\n null,\n {\n app_id: \'string\',\n version: \'string\',\n event_id: \'string\',\n component_id: \'string\',\n timestamp: \'string\',\n correlation_id: \'string\',\n event_type: \'ERROR\',\n source: \'CUSTOM_JOURNEY_BLOCK\',\n actor: {\n org_id: \'string\',\n user_id: \'string\',\n type: \'user\'\n },\n details: {}\n },\n)\n```\n\n---\n\n### `publicProxyGet`\n\nForward a GET request to a registered proxy target from a public-facing component (e.g. journey blocks)\n\n`GET /v1/public/app/{appId}/proxy/{proxyName}/{path}`\n\n```ts\nconst { data } = await client.publicProxyGet({\n appId: \'example\',\n proxyName: \'example\',\n path: \'example\',\n query: \'example\',\n})\n```\n\n---\n\n### `publicProxyPost`\n\nForward a POST request to a registered proxy target from a public-facing component (e.g. journey blocks)\n\n`POST /v1/public/app/{appId}/proxy/{proxyName}/{path}`\n\n```ts\nconst { data } = await client.publicProxyPost(\n {\n appId: \'example\',\n proxyName: \'example\',\n path: \'example\',\n query: \'example\',\n },\n {},\n)\n```\n\n---\n\n### `publicProxyPut`\n\nForward a PUT request to a registered proxy target from a public-facing component\n\n`PUT /v1/public/app/{appId}/proxy/{proxyName}/{path}`\n\n```ts\nconst { data } = await client.publicProxyPut(\n {\n appId: \'example\',\n proxyName: \'example\',\n path: \'example\',\n query: \'example\',\n },\n {},\n)\n```\n\n---\n\n### `publicProxyPatch`\n\nForward a PATCH request to a registered proxy target from a public-facing component\n\n`PATCH /v1/public/app/{appId}/proxy/{proxyName}/{path}`\n\n```ts\nconst { data } = await client.publicProxyPatch(\n {\n appId: \'example\',\n proxyName: \'example\',\n path: \'example\',\n query: \'example\',\n },\n {},\n)\n```\n\n---\n\n### `publicProxyDelete`\n\nForward a DELETE request to a registered proxy target from a public-facing component\n\n`DELETE /v1/public/app/{appId}/proxy/{proxyName}/{path}`\n\n```ts\nconst { data } = await client.publicProxyDelete({\n appId: \'example\',\n proxyName: \'example\',\n path: \'example\',\n query: \'example\',\n})\n```\n\n---\n\n## Schemas\n\n### `Role`\n\n```ts\ntype Role = {\n id?: string\n grants?: Array<{\n action: string\n resource?: string\n }>\n}\n```\n\n### `Options`\n\nOptions for the component configuration\n\n```ts\ntype Options = {\n key: string\n label?: string\n required?: boolean\n description?: string\n repeatable?: boolean\n fields?: Array<{\n key: string\n label?: string\n description?: string\n required?: boolean\n type: "text" | "number" | "boolean" | "secret"\n }>\n value?: unknown\n type: "text" | "number" | "boolean" | "secret" | "object"\n}\n```\n\n### `ObjectField`\n\nOne declared field inside a `type: object` option. Fields are primitives \u2014 object nesting\nis not supported.\n\n\n```ts\ntype ObjectField = {\n key: string\n label?: string\n description?: string\n required?: boolean\n type: "text" | "number" | "boolean" | "secret"\n}\n```\n\n### `Option`\n\n```ts\ntype Option = {\n key: string\n value: unknown\n}\n```\n\n### `OptionsRef`\n\n```ts\ntype OptionsRef = {\n component_id: string\n options: Array<{\n key: string\n value: unknown\n }>\n}\n```\n\n### `S3Reference`\n\n```ts\ntype S3Reference = {\n bucket: string\n key: string\n}\n```\n\n### `ComponentType`\n\nType of app component\n\n```ts\ntype ComponentType = "CUSTOM_JOURNEY_BLOCK" | "CUSTOM_PORTAL_BLOCK" | "PORTAL_EXTENSION" | "CUSTOM_FLOW_ACTION" | "ERP_INFORM_TOOLKIT" | "CUSTOM_CAPABILITY" | "EXTERNAL_PRODUCT_CATALOG" | "CUSTOM_PAGE" | "API_PROXY" | "APP_FUNCTION"\n```\n\n### `FunctionDefinition`\n\nA named server-side function belonging to the app. Runs in the epilot code-execution sandbox with an installation-scoped app token. Functions with a schedule are executed automatically once per installation.\n\n\n```ts\ntype FunctionDefinition = {\n name: string\n type: "workflow" | "scheduled"\n label?: {\n en?: string\n de: string\n }\n description?: {\n en?: string\n de: string\n }\n code: string\n schedule?: string\n schedule_timezone?: string\n schedule_overlap?: "skip"\n secrets?: string[]\n}\n```\n\n### `Author`\n\n```ts\ntype Author = {\n name?: string\n company: string\n email?: string\n}\n```\n\n### `NotificationConfig`\n\n```ts\ntype NotificationConfig = {\n email?: string // email\n events?: "app.installed" | "app.uninstalled"[]\n}\n```\n\n### `NotificationEvent`\n\n```ts\ntype NotificationEvent = "app.installed" | "app.uninstalled"\n```\n\n### `BaseComponentCommon`\n\n```ts\ntype BaseComponentCommon = {\n id: string\n name?: {\n en?: string\n de: string\n }\n description?: {\n en?: string\n de: string\n }\n options?: Array<{\n key: string\n label?: string\n required?: boolean\n description?: string\n repeatable?: boolean\n fields?: Array<{\n key: { ... }\n label?: { ... }\n description?: { ... }\n required?: { ... }\n type: { ... }\n }>\n value?: unknown\n type: "text" | "number" | "boolean" | "secret" | "object"\n }>\n surfaces?: object\n}\n```\n\n### `BaseComponent`\n\n```ts\ntype BaseComponent = {\n id: string\n name?: {\n en?: string\n de: string\n }\n description?: {\n en?: string\n de: string\n }\n options?: Array<{\n key: string\n label?: string\n required?: boolean\n description?: string\n repeatable?: boolean\n fields?: Array<{\n key: { ... }\n label?: { ... }\n description?: { ... }\n required?: { ... }\n type: { ... }\n }>\n value?: unknown\n type: "text" | "number" | "boolean" | "secret" | "object"\n }>\n surfaces?: object\n}\n```\n\n### `ApiProxyComponent`\n\n```ts\ntype ApiProxyComponent = {\n component_type: "API_PROXY"\n configuration: {\n name: string\n target: string\n auth_type: "header" | "bearer" | "basic" | "oauth2" | "none"\n auth_header?: string\n token_url?: string // uri\n headers?: Record<string, string>\n }\n}\n```\n\n### `CustomCapabilityComponent`\n\n```ts\ntype CustomCapabilityComponent = {\n component_type: "CUSTOM_CAPABILITY"\n configuration: {\n type?: "tab" | "group" | "widget"\n allowed_schemas?: string[]\n }\n surfaces?: {\n capability_config?: {\n app_url?: { ... }\n zip_url?: { ... }\n override_url?: { ... }\n }\n }\n}\n```\n\n### `CustomPageComponent`\n\n```ts\ntype CustomPageComponent = {\n component_type: "CUSTOM_PAGE"\n configuration: {\n slug: string\n nav_label?: string\n nav_icon?: string\n nav_description?: string\n }\n surfaces?: {\n page?: {\n app_url?: { ... }\n zip_url?: { ... }\n override_url?: { ... }\n }\n }\n}\n```\n\n### `CustomPageConfig`\n\n```ts\ntype CustomPageConfig = {\n slug: string\n nav_label?: string\n nav_icon?: string\n nav_description?: string\n}\n```\n\n### `JourneyBlockComponent`\n\n```ts\ntype JourneyBlockComponent = {\n component_type: "CUSTOM_JOURNEY_BLOCK"\n configuration: {\n override_dev_mode?: {\n override_url?: { ... }\n }\n component_url: string\n component_tag: string\n component_args?: Array<{\n key: { ... }\n type: { ... }\n required?: { ... }\n description?: { ... }\n label: { ... }\n }>\n component_size?: number\n component_mapping?: Record<string, "string" | "boolean" | "date" | "datetime" | "link" | "number">\n }\n}\n```\n\n### `PortalBlockComponent`\n\n```ts\ntype PortalBlockComponent = {\n component_type: "CUSTOM_PORTAL_BLOCK"\n configuration: object\n surfaces?: {\n portal_block?: {\n app_url?: { ... }\n zip_url?: { ... }\n override_url?: { ... }\n supported_surfaces?: { ... }\n }\n }\n}\n```\n\n### `ErpInformToolkitComponent`\n\n```ts\ntype ErpInformToolkitComponent = {\n component_type: "ERP_INFORM_TOOLKIT"\n configuration: {\n type: "inbound" | "outbound"\n }\n}\n```\n\n### `CustomFlowActionComponent`\n\n```ts\ntype CustomFlowActionComponent = {\n component_type: "CUSTOM_FLOW_ACTION"\n configuration: {\n name?: string\n description?: string\n wait_for_callback?: boolean\n type: "external_integration"\n external_integration_settings?: {\n url?: { ... }\n headers?: { ... }\n }\n } | {\n name?: string\n description?: string\n wait_for_callback?: boolean\n type: "function"\n function_name: string\n }\n surfaces?: {\n flow_action_config?: {\n app_url?: { ... }\n zip_url?: { ... }\n override_url?: { ... }\n }\n }\n}\n```\n\n### `BaseCustomActionConfig`\n\n```ts\ntype BaseCustomActionConfig = {\n name?: string\n description?: string\n wait_for_callback?: boolean\n}\n```\n\n### `ExternalIntegrationCustomActionConfig`\n\n```ts\ntype ExternalIntegrationCustomActionConfig = {\n name?: string\n description?: string\n wait_for_callback?: boolean\n type: "external_integration"\n external_integration_settings?: {\n url?: string\n headers?: Record<string, unknown>\n }\n}\n```\n\n### `FunctionRefCustomActionConfig`\n\n```ts\ntype FunctionRefCustomActionConfig = {\n name?: string\n description?: string\n wait_for_callback?: boolean\n type: "function"\n function_name: string\n}\n```\n\n### `CustomFlowConfig`\n\nConfiguration of a flow action component. `external_integration` calls an external HTTP endpoint; `function` runs a workflow-type app function in the epilot sandbox.\n\n\n```ts\ntype CustomFlowConfig = {\n name?: string\n description?: string\n wait_for_callback?: boolean\n type: "external_integration"\n external_integration_settings?: {\n url?: string\n headers?: Record<string, unknown>\n }\n} | {\n name?: string\n description?: string\n wait_for_callback?: boolean\n type: "function"\n function_name: string\n}\n```\n\n### `ExternalProductCatalogComponent`\n\n```ts\ntype ExternalProductCatalogComponent = {\n component_type: "EXTERNAL_PRODUCT_CATALOG"\n configuration: {\n hooks?: Array<{\n id: { ... }\n name?: { ... }\n type: { ... }\n auth?: { ... }\n call: { ... }\n } | {\n id: { ... }\n name?: { ... }\n type: { ... }\n auth?: { ... }\n call: { ... }\n }>\n }\n}\n```\n\n### `ExternalProductCatalogConfig`\n\n```ts\ntype ExternalProductCatalogConfig = {\n hooks?: Array<{\n id: string\n name?: {\n en?: { ... }\n de: { ... }\n }\n type: "products"\n auth?: {\n method?: { ... }\n url: { ... }\n params?: { ... }\n headers?: { ... }\n body?: { ... }\n }\n call: {\n method?: { ... }\n url: { ... }\n params?: { ... }\n headers?: { ... }\n body?: { ... }\n }\n } | {\n id: string\n name?: {\n en?: { ... }\n de: { ... }\n }\n type: "product-recommendations"\n auth?: {\n method?: { ... }\n url: { ... }\n params?: { ... }\n headers?: { ... }\n body?: { ... }\n }\n call: {\n method?: { ... }\n url: { ... }\n params?: { ... }\n headers?: { ... }\n body?: { ... }\n }\n }>\n}\n```\n\n### `ExternalProductCatalogHookProducts`\n\nHook for getting products from an external catalog. This hook makes a call to retrieve product data from an external source. Check the docs or the response API call contract https://docs.api.epilot.io/pricing-api-external-catalog for more details.\n\n\n```ts\ntype ExternalProductCatalogHookProducts = {\n id: string\n name?: {\n en?: string\n de: string\n }\n type: "products"\n auth?: {\n method?: string\n url: string\n params?: Record<string, string>\n headers?: Record<string, string>\n body?: Record<string, unknown>\n }\n call: {\n method?: string\n url: string\n params?: Record<string, string>\n headers?: Record<string, string>\n body?: Record<string, unknown>\n }\n}\n```\n\n### `ExternalProductCatalogHookProductRecommendations`\n\nHook for getting product recommendations from an external catalog. This hook makes a call to retrieve product recommendations from an external source. Check the docs or the response API call contract https://docs.api.epilot.io/pricing-api-external-catalog for more details.\n\n\n```ts\ntype ExternalProductCatalogHookProductRecommendations = {\n id: string\n name?: {\n en?: string\n de: string\n }\n type: "product-recommendations"\n auth?: {\n method?: string\n url: string\n params?: Record<string, string>\n headers?: Record<string, string>\n body?: Record<string, unknown>\n }\n call: {\n method?: string\n url: string\n params?: Record<string, string>\n headers?: Record<string, string>\n body?: Record<string, unknown>\n }\n}\n```\n\n### `PortalExtensionComponent`\n\n```ts\ntype PortalExtensionComponent = {\n component_type: "PORTAL_EXTENSION"\n configuration: {\n hooks?: Array<{\n id: { ... }\n name?: { ... }\n type: { ... }\n auth?: { ... }\n call: { ... }\n resolved?: { ... }\n use_static_ips?: { ... }\n secure_proxy?: { ... }\n } | {\n id: { ... }\n name?: { ... }\n type: { ... }\n auth?: { ... }\n call: { ... }\n resolved?: { ... }\n assignment_mode?: { ... }\n contact_relation_attribute?: { ... }\n explanation?: { ... }\n use_static_ips?: { ... }\n secure_proxy?: { ... }\n } | {\n id: { ... }\n name?: { ... }\n type: { ... }\n intervals?: { ... }\n auth?: { ... }\n call: { ... }\n resolved?: { ... }\n use_static_ips?: { ... }\n secure_proxy?: { ... }\n } | {\n id: { ... }\n name?: { ... }\n type: { ... }\n intervals?: { ... }\n auth?: { ... }\n call: { ... }\n resolved?: { ... }\n use_static_ips?: { ... }\n secure_proxy?: { ... }\n } | {\n id: { ... }\n name?: { ... }\n type: { ... }\n block_types?: { ... }\n auth?: { ... }\n call: { ... }\n resolved?: { ... }\n use_static_ips?: { ... }\n secure_proxy?: { ... }\n } | {\n id: { ... }\n name?: { ... }\n type: { ... }\n intervals?: { ... }\n auth?: { ... }\n call: { ... }\n resolved?: { ... }\n use_static_ips?: { ... }\n secure_proxy?: { ... }\n } | {\n id: { ... }\n name?: { ... }\n type: { ... }\n plausibility_mode?: { ... }\n auth?: { ... }\n call: { ... }\n resolved: { ... }\n use_static_ips?: { ... }\n secure_proxy?: { ... }\n } | {\n id: { ... }\n name?: { ... }\n type: { ... }\n auth?: { ... }\n call: { ... }\n resolved?: { ... }\n use_static_ips?: { ... }\n secure_proxy?: { ... }\n } | {\n id: { ... }\n name?: { ... }\n type: { ... }\n change_mode?: { ... }\n require_password_confirmation?: { ... }\n explanation?: { ... }\n auth?: { ... }\n call: { ... }\n resolved?: { ... }\n secure_proxy?: { ... }\n } | {\n id: { ... }\n name?: { ... }\n type: { ... }\n require_new_password?: { ... }\n explanation?: { ... }\n // ...\n}\n```\n\n### `PortalExtensionConfig`\n\n```ts\ntype PortalExtensionConfig = {\n hooks?: Array<{\n id: string\n name?: {\n en?: { ... }\n de: { ... }\n }\n type: "registrationIdentifiersCheck"\n auth?: {\n method?: { ... }\n url: { ... }\n params?: { ... }\n headers?: { ... }\n body?: { ... }\n cache?: { ... }\n }\n call: {\n method?: { ... }\n url: { ... }\n params?: { ... }\n headers: { ... }\n body?: { ... }\n result: { ... }\n }\n resolved?: {\n result?: { ... }\n error_message_path?: { ... }\n }\n use_static_ips?: boolean\n secure_proxy?: {\n integration_id: { ... }\n use_case_slug: { ... }\n }\n } | {\n id: string\n name?: {\n en?: { ... }\n de: { ... }\n }\n type: "contractIdentification"\n auth?: {\n method?: { ... }\n url: { ... }\n params?: { ... }\n headers?: { ... }\n body?: { ... }\n cache?: { ... }\n }\n call: {\n method?: { ... }\n url: { ... }\n params?: { ... }\n headers: { ... }\n body?: { ... }\n result?: { ... }\n }\n resolved?: {\n result?: { ... }\n error_message_path?: { ... }\n }\n assignment_mode?: "contracts" | "contact_to_contracts" | "contact_to_portal_user"\n contact_relation_attribute?: string\n explanation?: {\n en: { ... }\n }\n use_static_ips?: boolean\n secure_proxy?: {\n integration_id: { ... }\n use_case_slug: { ... }\n }\n } | {\n id: string\n name?: {\n en?: { ... }\n de: { ... }\n }\n type: "priceDataRetrieval"\n intervals?: "PT15M" | "PT1H" | "P1D" | "P1M"[]\n auth?: {\n method?: { ... }\n url: { ... }\n params?: { ... }\n headers?: { ... }\n body?: { ... }\n cache?: { ... }\n }\n call: {\n method?: { ... }\n url: { ... }\n params?: { ... }\n headers?: { ... }\n body?: { ... }\n }\n resolved?: {\n data_path?: { ... }\n dataPath?: { ... }\n error_message_path?: { ... }\n }\n use_static_ips?: boolean\n secure_proxy?: {\n // ...\n}\n```\n\n### `PortalExtensionHookRegistrationIdentifiersCheck`\n\nHook that replaces the built-in registration identifiers check. This hook makes a POST call whenever a user is trying to register to find the corresponding contact. The expected response to the call is:\n - 200 with contact id if exactly one contact is found\n - 404 if no contact is found or more th\n\n```ts\ntype PortalExtensionHookRegistrationIdentifiersCheck = {\n id: string\n name?: {\n en?: string\n de: string\n }\n type: "registrationIdentifiersCheck"\n auth?: {\n method?: string\n url: string\n params?: Record<string, string>\n headers?: Record<string, string>\n body?: Record<string, unknown>\n cache?: {\n key: { ... }\n ttl: { ... }\n }\n }\n call: {\n method?: string\n url: string\n params?: Record<string, string>\n headers: Record<string, string>\n body?: object\n result: string\n }\n resolved?: {\n result?: string\n error_message_path?: string\n }\n use_static_ips?: boolean\n secure_proxy?: {\n integration_id: string // uuid\n use_case_slug: string\n }\n}\n```\n\n### `PortalExtensionHookContractIdentification`\n\nHook that replaces the built-in Contract identification for self-assignment. This hook involves an HTTP request whenever a user is trying to self-assign Contract(s).\nThe expected response http status code to the call is:\n - 200 if found\n - 404 if not found\n\nThe following assignment modes are suppo\n\n```ts\ntype PortalExtensionHookContractIdentification = {\n id: string\n name?: {\n en?: string\n de: string\n }\n type: "contractIdentification"\n auth?: {\n method?: string\n url: string\n params?: Record<string, string>\n headers?: Record<string, string>\n body?: Record<string, unknown>\n cache?: {\n key: { ... }\n ttl: { ... }\n }\n }\n call: {\n method?: string\n url: string\n params?: Record<string, string>\n headers: Record<string, string>\n body?: object\n result?: string\n }\n resolved?: {\n result?: string\n error_message_path?: string\n }\n assignment_mode?: "contracts" | "contact_to_contracts" | "contact_to_portal_user"\n contact_relation_attribute?: string\n explanation?: {\n en: string\n }\n use_static_ips?: boolean\n secure_proxy?: {\n integration_id: string // uuid\n use_case_slug: string\n }\n}\n```\n\n### `PortalExtensionHookMeterReadingPlausibilityCheck`\n\nHook that checks the plausibility of meter readings before they are saved. This hook makes a POST call whenever a user is trying to save a meter reading. The expected response to the call is:\n - 200:\n If meter reading is plausible, the response should contain:\n - valid: true\n If meter re\n\n```ts\ntype PortalExtensionHookMeterReadingPlausibilityCheck = {\n id: string\n name?: {\n en?: string\n de: string\n }\n type: "meterReadingPlausibilityCheck"\n plausibility_mode?: "check" | "range"\n auth?: {\n method?: string\n url: string\n params?: Record<string, string>\n headers?: Record<string, string>\n body?: Record<string, unknown>\n cache?: {\n key: { ... }\n ttl: { ... }\n }\n }\n call: {\n url: string\n body: Record<string, unknown>\n headers: Record<string, string>\n }\n resolved: {\n data_path?: string\n dataPath?: string\n counter_identifiers?: Record<string, string>\n valid?: string\n upper_limit?: string\n lower_limit?: string\n error_message_path?: string\n }\n use_static_ips?: boolean\n secure_proxy?: {\n integration_id: string // uuid\n use_case_slug: string\n }\n}\n```\n\n### `PortalExtensionHookPriceDataRetrieval`\n\nHook that will allow using the specified source as data for price visualizations. This hook is triggered to fetch the data. Format of the request and response has to follow the following specification: TBD. The expected response to the call is:\n - 200 with the time series data\n\n\n```ts\ntype PortalExtensionHookPriceDataRetrieval = {\n id: string\n name?: {\n en?: string\n de: string\n }\n type: "priceDataRetrieval"\n intervals?: "PT15M" | "PT1H" | "P1D" | "P1M"[]\n auth?: {\n method?: string\n url: string\n params?: Record<string, string>\n headers?: Record<string, string>\n body?: Record<string, unknown>\n cache?: {\n key: { ... }\n ttl: { ... }\n }\n }\n call: {\n method?: string\n url: string\n params?: Record<string, string>\n headers?: Record<string, string>\n body?: Record<string, unknown>\n }\n resolved?: {\n data_path?: string\n dataPath?: string\n error_message_path?: string\n }\n use_static_ips?: boolean\n secure_proxy?: {\n integration_id: string // uuid\n use_case_slug: string\n }\n}\n```\n\n### `PortalExtensionHookConsumptionDataRetrieval`\n\nHook that will allow using the specified source as data for consumption visualizations. This hook is triggered to fetch the data. Format of the request and response has to follow the following specification: TBD. The expected response to the call is:\n - 200 with the time series data\n\n\n```ts\ntype PortalExtensionHookConsumptionDataRetrieval = {\n id: string\n name?: {\n en?: string\n de: string\n }\n type: "consumptionDataRetrieval"\n intervals?: "PT15M" | "PT1H" | "P1D" | "P1M"[]\n auth?: {\n method?: string\n url: string\n params?: Record<string, string>\n headers?: Record<string, string>\n body?: Record<string, unknown>\n cache?: {\n key: { ... }\n ttl: { ... }\n }\n }\n call: {\n method?: string\n url: string\n params?: Record<string, string>\n headers?: Record<string, string>\n body?: Record<string, unknown>\n }\n resolved?: {\n data_path?: string\n dataPath?: string\n error_message_path?: string\n }\n use_static_ips?: boolean\n secure_proxy?: {\n integration_id: string // uuid\n use_case_slug: string\n }\n}\n```\n\n### `PortalExtensionHookDataExport`\n\nGeneric data export hook. When configured on blocks that support it, the portal delegates the export action (e.g. CSV/Excel/PDF download) to the configured external source instead of generating the file itself. Can be used by any block that supports export \u2014 consumption charts, dynamic tariff charts\n\n```ts\ntype PortalExtensionHookDataExport = {\n id: string\n name?: {\n en?: string\n de: string\n }\n type: "dataExport"\n block_types?: string[]\n auth?: {\n method?: string\n url: string\n params?: Record<string, string>\n headers?: Record<string, string>\n body?: Record<string, unknown>\n cache?: {\n key: { ... }\n ttl: { ... }\n }\n }\n call: {\n method?: string\n url: string\n params?: Record<string, string>\n headers?: Record<string, string>\n body?: Record<string, unknown>\n }\n resolved?: {\n error_message_path?: string\n }\n use_static_ips?: boolean\n secure_proxy?: {\n integration_id: string // uuid\n use_case_slug: string\n }\n}\n```\n\n### `PortalExtensionHookVisualizationMetadata`\n\nHook that returns runtime metadata describing how a visualization (consumption / price / cost chart) should be rendered for a given portal context (meter, contract, etc). It is invoked by the portal before fetching data, with the same context the data hook would receive, so that the discovery shape \n\n```ts\ntype PortalExtensionHookVisualizationMetadata = {\n id: string\n name?: {\n en?: string\n de: string\n }\n type: "visualizationMetadata"\n auth?: {\n method?: string\n url: string\n params?: Record<string, string>\n headers?: Record<string, string>\n body?: Record<string, unknown>\n cache?: {\n key: { ... }\n ttl: { ... }\n }\n }\n call: {\n method?: string\n url: string\n params?: Record<string, string>\n headers?: Record<string, string>\n body?: Record<string, unknown>\n }\n resolved?: {\n data_path?: string\n dataPath?: string\n error_message_path?: string\n }\n use_static_ips?: boolean\n secure_proxy?: {\n integration_id: string // uuid\n use_case_slug: string\n }\n}\n```\n\n### `PortalExtensionHookCostDataRetrieval`\n\nHook that will allow using the specified source as data for consumption visualizations. This hook is triggered to fetch the data. Format of the request and response has to follow the following specification: TBD. The expected response to the call is:\n - 200 with the time series data\n\n\n```ts\ntype PortalExtensionHookCostDataRetrieval = {\n id: string\n name?: {\n en?: string\n de: string\n }\n type: "costDataRetrieval"\n intervals?: "PT15M" | "PT1H" | "P1D" | "P1M"[]\n auth?: {\n method?: string\n url: string\n params?: Record<string, string>\n headers?: Record<string, string>\n body?: Record<string, unknown>\n cache?: {\n key: { ... }\n ttl: { ... }\n }\n }\n call: {\n method?: string\n url: string\n params?: Record<string, string>\n headers?: Record<string, string>\n body?: Record<string, unknown>\n }\n resolved?: {\n data_path?: string\n dataPath?: string\n error_message_path?: string\n }\n use_static_ips?: boolean\n secure_proxy?: {\n integration_id: string // uuid\n use_case_slug: string\n }\n}\n```\n\n### `PortalExtensionHookChangeEmail`\n\nHook that replaces the built-in change email functionality for portal users. When configured, the portal does not run its own change email flow. Instead, this hook makes an HTTP call to the third-party system, which is expected to handle the email change.\nThe `change_mode` controls what the portal d\n\n```ts\ntype PortalExtensionHookChangeEmail = {\n id: string\n name?: {\n en?: string\n de: string\n }\n type: "changeEmail"\n change_mode?: "synchronous" | "asynchronous"\n require_password_confirmation?: boolean\n explanation?: {\n en: string\n }\n auth?: {\n method?: string\n url: string\n params?: Record<string, string>\n headers?: Record<string, string>\n body?: Record<string, unknown>\n cache?: {\n key: { ... }\n ttl: { ... }\n }\n }\n call: {\n method?: string\n url: string\n params?: Record<string, string>\n headers: Record<string, string>\n body?: object\n }\n resolved?: {\n error_message_path?: string\n }\n secure_proxy?: {\n integration_id: string // uuid\n use_case_slug: string\n }\n}\n```\n\n### `PortalExtensionHookChangePassword`\n\nHook that replaces the built-in change password functionality for portal users. When configured, the portal does not change the user\'s password itself. Instead, this hook makes an HTTP call to the third-party system, which is expected to handle the password change (most likely by sending the user in\n\n```ts\ntype PortalExtensionHookChangePassword = {\n id: string\n name?: {\n en?: string\n de: string\n }\n type: "changePassword"\n require_new_password?: boolean\n explanation?: {\n en: string\n }\n auth?: {\n method?: string\n url: string\n params?: Record<string, string>\n headers?: Record<string, string>\n body?: Record<string, unknown>\n cache?: {\n key: { ... }\n ttl: { ... }\n }\n }\n call: {\n method?: string\n url: string\n params?: Record<string, string>\n headers: Record<string, string>\n body?: object\n }\n resolved?: {\n error_message_path?: string\n }\n secure_proxy?: {\n integration_id: string // uuid\n use_case_slug: string\n }\n}\n```\n\n### `PortalExtensionHookDeleteAccount`\n\nHook that replaces the built-in delete account functionality for portal users. When configured, the portal does not delete the user itself. Instead, this hook makes an HTTP call to the third-party system, which is expected to handle the deletion.\nThe `deletion_mode` controls what the portal does aft\n\n```ts\ntype PortalExtensionHookDeleteAccount = {\n id: string\n name?: {\n en?: string\n de: string\n }\n type: "deleteAccount"\n deletion_mode?: "synchronous" | "asynchronous"\n delete_contact?: "none" | "soft" | "hard"\n explanation?: {\n en: string\n }\n auth?: {\n method?: string\n url: string\n params?: Record<string, string>\n headers?: Record<string, string>\n body?: Record<string, unknown>\n cache?: {\n key: { ... }\n ttl: { ... }\n }\n }\n call: {\n method?: string\n url: string\n params?: Record<string, string>\n headers: Record<string, string>\n body?: object\n }\n resolved?: {\n error_message_path?: string\n }\n secure_proxy?: {\n integration_id: string // uuid\n use_case_slug: string\n }\n}\n```\n\n### `PortalExtensionSeamlessLink`\n\n```ts\ntype PortalExtensionSeamlessLink = {\n id: string\n name: {\n en?: string\n de: string\n }\n description?: {\n en?: string\n de: string\n }\n type: "seamless"\n condition?: string\n auth?: {\n method?: string\n url: string\n params?: Record<string, string>\n headers?: Record<string, string>\n body?: Record<string, unknown>\n cache?: {\n key: { ... }\n ttl: { ... }\n }\n }\n redirect: {\n url?: string\n params?: Record<string, string>\n }\n}\n```\n\n### `PortalExtensionAuthBlock`\n\n```ts\ntype PortalExtensionAuthBlock = {\n method?: string\n url: string\n params?: Record<string, string>\n headers?: Record<string, string>\n body?: Record<string, unknown>\n cache?: {\n key: string\n ttl: string\n }\n}\n```\n\n### `PortalExtensionSecureProxy`\n\nIf set, requests are routed through the ERP Integration secure proxy. Mutually exclusive with use_static_ips.\n\n```ts\ntype PortalExtensionSecureProxy = {\n integration_id: string // uuid\n use_case_slug: string\n}\n```\n\n### `ExternalProductCatalogAuthBlock`\n\n```ts\ntype ExternalProductCatalogAuthBlock = {\n method?: string\n url: string\n params?: Record<string, string>\n headers?: Record<string, string>\n body?: Record<string, unknown>\n}\n```\n\n### `OverrideDevMode`\n\nOverride URL when app is in dev mode\n\n```ts\ntype OverrideDevMode = {\n override_url?: string\n}\n```\n\n### `JourneyBlockConfig`\n\n```ts\ntype JourneyBlockConfig = {\n override_dev_mode?: {\n override_url?: string\n }\n component_url: string\n component_tag: string\n component_args?: Array<{\n key: string\n type: "text" | "boolean" | "enum" | "block_reference"\n required?: boolean\n description?: {\n en?: { ... }\n de: { ... }\n }\n label: {\n en?: { ... }\n de: { ... }\n }\n }>\n component_size?: number\n component_mapping?: Record<string, "string" | "boolean" | "date" | "datetime" | "link" | "number">\n}\n```\n\n### `PortalBlockConfig`\n\n```ts\ntype PortalBlockConfig = object\n```\n\n### `AppBridgeSurfaceConfig`\n\n```ts\ntype AppBridgeSurfaceConfig = {\n app_url?: string\n zip_url?: string\n override_url?: string\n}\n```\n\n### `PortalBlockSurfaceConfig`\n\n```ts\ntype PortalBlockSurfaceConfig = {\n app_url?: string\n zip_url?: string\n override_url?: string\n supported_surfaces?: "main" | "footer_inline" | "footer_left_absolute" | "footer_right_absolute"[]\n}\n```\n\n### `JourneyBlockComponentArgs`\n\n```ts\ntype JourneyBlockComponentArgs = {\n key: string\n type: "text" | "boolean" | "enum" | "block_reference"\n required?: boolean\n description?: {\n en?: string\n de: string\n }\n label: {\n en?: string\n de: string\n }\n}\n```\n\n### `TextArg`\n\n```ts\ntype TextArg = {\n type?: "text"\n}\n```\n\n### `BooleanArg`\n\n```ts\ntype BooleanArg = {\n type?: "boolean"\n}\n```\n\n### `BlockReferenceArg`\n\nReferences another journey block by its ID. The configuring user picks\na block from the journey via a dropdown in the journey-builder; the\nchosen block\'s ID is stored as the arg value (a string). The bundle can\nthen call `subscribe(blockId, cb)` / `getValue(blockId)` against that ID.\n\n\n```ts\ntype BlockReferenceArg = {\n type?: "block_reference"\n allowed_types?: string[]\n}\n```\n\n### `EnumArg`\n\n```ts\ntype EnumArg = {\n type?: "enum"\n isMulti?: boolean\n options: Array<{\n id: string\n label: {\n en?: { ... }\n de: { ... }\n }\n }>\n}\n```\n\n### `BillingFrequency`\n\nHow often the subscription is billed\n\n```ts\ntype BillingFrequency = "MONTHLY" | "QUARTERLY" | "YEARLY" | "CUSTOM"\n```\n\n### `Pricing`\n\n```ts\ntype Pricing = {\n pricing_type?: "FREE" | "SUBSCRIPTION" | "USAGE_BASED" | "ONE_TIME" | "CUSTOM" | "UNKNOWN"\n billing_frequency?: "MONTHLY" | "QUARTERLY" | "YEARLY" | "CUSTOM"\n}\n```\n\n### `Audit`\n\n```ts\ntype Audit = {\n created_at?: string\n created_by?: string\n updated_at?: string\n updated_by?: string\n}\n```\n\n### `Review`\n\n```ts\ntype Review = {\n version?: string\n review_status?: "approved" | "rejected" | "pending"\n requested_at?: string\n requested_by?: string\n technical_contact?: string\n marketing_contact?: string\n demo_url?: string\n}\n```\n\n### `InternalReview`\n\nReview entry including app ownership info, used by internal admin endpoints\n\n```ts\ntype InternalReview = {\n version?: string\n review_status?: "approved" | "rejected" | "pending"\n requested_at?: string\n requested_by?: string\n technical_contact?: string\n marketing_contact?: string\n demo_url?: string\n app_id?: string\n org_id?: string\n reviewed_by?: string\n reviewed_at?: string\n}\n```\n\n### `ConfigurationMetadata`\n\nBasic metadata about your app configuration which does not get versioned\n\n```ts\ntype ConfigurationMetadata = {\n app_id: string\n name: string\n author?: {\n name?: string\n company: string\n email?: string\n }\n dev_mode?: boolean\n versions: string[]\n public_versions?: string[]\n support_email?: string\n latest_version: string\n category?: string\n icon_url?: string\n documentation_url?: string\n description: {\n en?: string\n de: string\n }\n notifications?: {\n email?: string // email\n events?: "app.installed" | "app.uninstalled"[]\n }\n owner_org_id: string\n internal?: boolean\n pricing?: {\n pricing_type?: "FREE" | "SUBSCRIPTION" | "USAGE_BASED" | "ONE_TIME" | "CUSTOM" | "UNKNOWN"\n billing_frequency?: "MONTHLY" | "QUARTERLY" | "YEARLY" | "CUSTOM"\n }\n configuration_audit?: {\n created_at?: string\n created_by?: string\n updated_at?: string\n updated_by?: string\n }\n}\n```\n\n### `ConfigurationVersion`\n\nConfiguration data about your app which is versionable\n\n```ts\ntype ConfigurationVersion = {\n app_id: string\n owner_org_id: string\n components: Array<{\n id: string\n name?: {\n en?: { ... }\n de: { ... }\n }\n description?: {\n en?: { ... }\n de: { ... }\n }\n options?: Array<{\n key: { ... }\n label?: { ... }\n required?: { ... }\n description?: { ... }\n repeatable?: { ... }\n fields?: { ... }\n value?: { ... }\n type: { ... }\n }>\n surfaces?: object\n }>\n functions?: Array<{\n name: string\n type: "workflow" | "scheduled"\n label?: {\n en?: { ... }\n de: { ... }\n }\n description?: {\n en?: { ... }\n de: { ... }\n }\n code: string\n schedule?: string\n schedule_timezone?: string\n schedule_overlap?: "skip"\n secrets?: string[]\n }>\n visibility?: "public" | "private"\n public?: boolean\n pending?: boolean\n version: string\n is_beta?: boolean\n deprecated_at?: string\n changelog?: string\n review_status?: "approved" | "rejected" | "pending"\n role?: {\n id?: string\n grants?: Array<{\n action: { ... }\n resource?: { ... }\n }>\n }\n blueprint_ref?: {\n manifest_id?: string\n job_id?: string\n source_blueprint_file?: string\n }\n version_audit: {\n created_at?: string\n created_by?: string\n updated_at?: string\n updated_by?: string\n versioned_at?: string\n versioned_by?: string\n }\n}\n```\n\n### `ApiProxyConfig`\n\nConfiguration for an API proxy component\n\n```ts\ntype ApiProxyConfig = {\n name: string\n target: string\n auth_type: "header" | "bearer" | "basic" | "oauth2" | "none"\n auth_header?: string\n token_url?: string // uri\n headers?: Record<string, string>\n}\n```\n\n### `Grants`\n\nRequired grants for the app in order to call APIs for the installing tenant\n\n```ts\ntype Grants = Array<{\n action: string\n resource?: string\n}>\n```\n\n### `BlueprintRef`\n\n```ts\ntype BlueprintRef = {\n manifest_id?: string\n job_id?: string\n source_blueprint_file?: string\n}\n```\n\n### `Installation`\n\nInformation about the installed app. Has configuration data of the installed version\n\n```ts\ntype Installation = {\n app_id: string\n installer_org_id: string\n owner_org_id?: string\n enabled: boolean\n name: string\n icon_url?: string\n option_values?: Array<{\n component_id: string\n options: Array<{\n key: { ... }\n value: { ... }\n }>\n }>\n components: Array<{\n id: string\n name?: {\n en?: { ... }\n de: { ... }\n }\n description?: {\n en?: { ... }\n de: { ... }\n }\n options?: Array<{\n key: { ... }\n label?: { ... }\n required?: { ... }\n description?: { ... }\n repeatable?: { ... }\n fields?: { ... }\n value?: { ... }\n type: { ... }\n }>\n surfaces?: object\n }>\n functions?: Array<{\n name: string\n type: "workflow" | "scheduled"\n label?: {\n en?: { ... }\n de: { ... }\n }\n description?: {\n en?: { ... }\n de: { ... }\n }\n code: string\n schedule?: string\n schedule_timezone?: string\n schedule_overlap?: "skip"\n secrets?: string[]\n }>\n installed_version: string\n role?: string\n blueprint_ref?: {\n manifest_id?: string\n job_id?: string\n source_blueprint_file?: string\n }\n installation_audit?: {\n created_at?: string\n created_by?: string\n updated_at?: string\n updated_by?: string\n }\n _manifest?: string // uuid[]\n}\n```\n\n### `PublicConfiguration`\n\nPublic configuration of the published app\n\n```ts\ntype PublicConfiguration = {\n app_id: string\n support_email?: string\n owner_org_id: string\n name: string\n author?: {\n name?: string\n company: string\n email?: string\n }\n dev_mode?: boolean\n category?: string\n icon_url?: string\n documentation_url?: string\n description?: {\n en?: string\n de: string\n }\n pricing?: {\n pricing_type?: "FREE" | "SUBSCRIPTION" | "USAGE_BASED" | "ONE_TIME" | "CUSTOM" | "UNKNOWN"\n billing_frequency?: "MONTHLY" | "QUARTERLY" | "YEARLY" | "CUSTOM"\n }\n components: Array<{\n id: string\n name?: {\n en?: { ... }\n de: { ... }\n }\n description?: {\n en?: { ... }\n de: { ... }\n }\n options?: Array<{\n key: { ... }\n label?: { ... }\n required?: { ... }\n description?: { ... }\n repeatable?: { ... }\n fields?: { ... }\n value?: { ... }\n type: { ... }\n }>\n surfaces?: object\n }>\n functions?: Array<{\n name: string\n type: "workflow" | "scheduled"\n label?: {\n en?: { ... }\n de: { ... }\n }\n description?: {\n en?: { ... }\n de: { ... }\n }\n code: string\n schedule?: string\n schedule_timezone?: string\n schedule_overlap?: "skip"\n secrets?: string[]\n }>\n is_beta?: boolean\n deprecated_at?: string\n version: string\n role?: {\n id?: string\n grants?: Array<{\n action: { ... }\n resource?: { ... }\n }>\n }\n blueprint_ref?: {\n manifest_id?: string\n job_id?: string\n source_blueprint_file?: string\n }\n latest_version?: string\n public?: boolean\n versions?: Array<{\n app_id: string\n owner_org_id: string\n components: Array<{\n id: { ... }\n name?: { ... }\n description?: { ... }\n options?: { ... }\n surfaces?: { ... }\n }>\n functions?: Array<{\n name: { ... }\n type: { ... }\n label?: { ... }\n description?: { ... }\n code: { ... }\n schedule?: { ... }\n schedule_timezone?: { ... }\n schedule_overlap?: { ... }\n secrets?: { ... }\n }>\n visibility?: "public" | "private"\n // ...\n}\n```\n\n### `Configuration`\n\nConfiguration of the published app\n\n```ts\ntype Configuration = {\n app_id: string\n name: string\n author?: {\n name?: string\n company: string\n email?: string\n }\n dev_mode?: boolean\n versions: string[]\n public_versions?: string[]\n support_email?: string\n latest_version: string\n category?: string\n icon_url?: string\n documentation_url?: string\n description: {\n en?: string\n de: string\n }\n notifications?: {\n email?: string // email\n events?: "app.installed" | "app.uninstalled"[]\n }\n owner_org_id: string\n internal?: boolean\n pricing?: {\n pricing_type?: "FREE" | "SUBSCRIPTION" | "USAGE_BASED" | "ONE_TIME" | "CUSTOM" | "UNKNOWN"\n billing_frequency?: "MONTHLY" | "QUARTERLY" | "YEARLY" | "CUSTOM"\n }\n configuration_audit?: {\n created_at?: string\n created_by?: string\n updated_at?: string\n updated_by?: string\n }\n components: Array<{\n id: string\n name?: {\n en?: { ... }\n de: { ... }\n }\n description?: {\n en?: { ... }\n de: { ... }\n }\n options?: Array<{\n key: { ... }\n label?: { ... }\n required?: { ... }\n description?: { ... }\n repeatable?: { ... }\n fields?: { ... }\n value?: { ... }\n type: { ... }\n }>\n surfaces?: object\n }>\n functions?: Array<{\n name: string\n type: "workflow" | "scheduled"\n label?: {\n en?: { ... }\n de: { ... }\n }\n description?: {\n en?: { ... }\n de: { ... }\n }\n code: string\n schedule?: string\n schedule_timezone?: string\n schedule_overlap?: "skip"\n secrets?: string[]\n }>\n visibility?: "public" | "private"\n public?: boolean\n pending?: boolean\n version: string\n is_beta?: boolean\n deprecated_at?: string\n changelog?: string\n review_status?: "approved" | "rejected" | "pending"\n role?: {\n id?: string\n grants?: Array<{\n action: { ... }\n resource?: { ... }\n }>\n }\n blueprint_ref?: {\n manifest_id?: string\n job_id?: string\n source_blueprint_file?: string\n }\n version_audit: {\n created_at?: string\n created_by?: string\n updated_at?: string\n updated_by?: string\n // ...\n}\n```\n\n### `TranslatedString`\n\n```ts\ntype TranslatedString = {\n en?: string\n de: string\n}\n```\n\n### `CallerIdentity`\n\n```ts\ntype CallerIdentity = {\n name?: unknown\n org_id: string\n user_id?: string\n token_id?: string\n}\n```\n\n### `BatchEventRequest`\n\n```ts\ntype BatchEventRequest = {\n events: Array<{\n app_id: string\n version: string\n event_id?: string\n component_id: string\n timestamp?: string\n correlation_id?: string\n event_type: "ERROR" | "WARNING" | "INFO"\n source: "CUSTOM_JOURNEY_BLOCK" | "CUSTOM_PORTAL_BLOCK" | "PORTAL_EXTENSION" | "CUSTOM_FLOW_ACTION" | "ERP_INFORM_TOOLKIT" | "CUSTOM_CAPABILITY" | "EXTERNAL_PRODUCT_CATALOG" | "CUSTOM_PAGE" | "API_PROXY" | "APP_FUNCTION"\n actor: {\n org_id?: { ... }\n user_id?: { ... }\n type: { ... }\n }\n details?: Record<string, unknown>\n }>\n}\n```\n\n### `Actor`\n\n```ts\ntype Actor = {\n org_id?: string\n user_id?: string\n type: "user" | "system"\n}\n```\n\n### `AppEventData`\n\n```ts\ntype AppEventData = {\n app_id: string\n version: string\n event_id?: string\n component_id: string\n timestamp?: string\n correlation_id?: string\n event_type: "ERROR" | "WARNING" | "INFO"\n source: "CUSTOM_JOURNEY_BLOCK" | "CUSTOM_PORTAL_BLOCK" | "PORTAL_EXTENSION" | "CUSTOM_FLOW_ACTION" | "ERP_INFORM_TOOLKIT" | "CUSTOM_CAPABILITY" | "EXTERNAL_PRODUCT_CATALOG" | "CUSTOM_PAGE" | "API_PROXY" | "APP_FUNCTION"\n actor: {\n org_id?: string\n user_id?: string\n type: "user" | "system"\n }\n details?: Record<string, unknown>\n}\n```\n\n### `EventsQuery`\n\n```ts\ntype EventsQuery = {\n time_range?: {\n start?: string // date-time\n end?: string // date-time\n preset?: "1h" | "6h" | "24h" | "7d" | "30d"\n }\n filters?: {\n source?: "CUSTOM_JOURNEY_BLOCK" | "CUSTOM_PORTAL_BLOCK" | "PORTAL_EXTENSION" | "CUSTOM_FLOW_ACTION" | "ERP_INFORM_TOOLKIT" | "CUSTOM_CAPABILITY" | "EXTERNAL_PRODUCT_CATALOG" | "CUSTOM_PAGE" | "API_PROXY" | "APP_FUNCTION"[]\n component_id?: string[]\n event_type?: "ERROR" | "WARNING" | "INFO"[]\n correlation_id?: string\n }\n aggregation?: {\n group_by?: "source" | "component_id" | "event_type" | "hour" | "day"[]\n metrics?: "count" | "error_rate" | "unique_users"[]\n }\n pagination?: {\n page?: number\n page_size?: number\n }\n sort?: {\n field?: "timestamp" | "event_type" | "component_id"\n order?: "asc" | "desc"\n }\n}\n```\n\n### `EventsQueryResponse`\n\n```ts\ntype EventsQueryResponse = {\n query?: {\n time_range?: {\n start?: { ... }\n end?: { ... }\n preset?: { ... }\n }\n filters?: {\n source?: { ... }\n component_id?: { ... }\n event_type?: { ... }\n correlation_id?: { ... }\n }\n aggregation?: {\n group_by?: { ... }\n metrics?: { ... }\n }\n pagination?: {\n page?: { ... }\n page_size?: { ... }\n }\n sort?: {\n field?: { ... }\n order?: { ... }\n }\n }\n results?: {\n type?: "raw"\n events?: Array<{\n app_id: { ... }\n version: { ... }\n event_id?: { ... }\n component_id: { ... }\n timestamp?: { ... }\n correlation_id?: { ... }\n event_type: { ... }\n source: { ... }\n actor: { ... }\n details?: { ... }\n }>\n } | {\n type?: "aggregated"\n groups?: Array<{\n dimensions?: { ... }\n metrics?: { ... }\n }>\n }\n pagination?: {\n page?: number\n page_size?: number\n total_items?: number\n has_next?: boolean\n }\n}\n```\n\n### `RawEvents`\n\n```ts\ntype RawEvents = {\n type?: "raw"\n events?: Array<{\n app_id: string\n version: string\n event_id?: string\n component_id: string\n timestamp?: string\n correlation_id?: string\n event_type: "ERROR" | "WARNING" | "INFO"\n source: "CUSTOM_JOURNEY_BLOCK" | "CUSTOM_PORTAL_BLOCK" | "PORTAL_EXTENSION" | "CUSTOM_FLOW_ACTION" | "ERP_INFORM_TOOLKIT" | "CUSTOM_CAPABILITY" | "EXTERNAL_PRODUCT_CATALOG" | "CUSTOM_PAGE" | "API_PROXY" | "APP_FUNCTION"\n actor: {\n org_id?: { ... }\n user_id?: { ... }\n type: { ... }\n }\n details?: Record<string, unknown>\n }>\n}\n```\n\n### `AggregatedEvents`\n\n```ts\ntype AggregatedEvents = {\n type?: "aggregated"\n groups?: Array<{\n dimensions?: Record<string, unknown>\n metrics?: {\n count?: { ... }\n error_rate?: { ... }\n }\n }>\n}\n```\n';
5
- export {
6
- app_default as default
7
- };