@epilot/sdk 2.4.4 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/definitions/app.json +137 -58
  2. package/definitions/customer-portal-runtime.json +1 -1
  3. package/definitions/customer-portal.json +496 -24
  4. package/definitions/entity.json +185 -8
  5. package/definitions/webhooks-runtime.json +1 -1
  6. package/definitions/webhooks.json +134 -4
  7. package/dist/apis/access-token.cjs +6 -6
  8. package/dist/apis/access-token.js +1 -1
  9. package/dist/apis/address-suggestions.cjs +6 -6
  10. package/dist/apis/address-suggestions.js +1 -1
  11. package/dist/apis/address.cjs +6 -6
  12. package/dist/apis/address.js +1 -1
  13. package/dist/apis/ai-agents.cjs +6 -6
  14. package/dist/apis/ai-agents.js +1 -1
  15. package/dist/apis/app.cjs +8 -8
  16. package/dist/apis/app.d.cts +2 -2
  17. package/dist/apis/app.d.ts +2 -2
  18. package/dist/apis/app.js +2 -2
  19. package/dist/apis/audit-logs.cjs +6 -6
  20. package/dist/apis/audit-logs.js +1 -1
  21. package/dist/apis/automation.cjs +6 -6
  22. package/dist/apis/automation.js +1 -1
  23. package/dist/apis/billing.cjs +6 -6
  24. package/dist/apis/billing.js +1 -1
  25. package/dist/apis/blueprint-manifest.cjs +6 -6
  26. package/dist/apis/blueprint-manifest.js +1 -1
  27. package/dist/apis/calendar.cjs +6 -6
  28. package/dist/apis/calendar.js +1 -1
  29. package/dist/apis/configuration-hub.cjs +6 -6
  30. package/dist/apis/configuration-hub.js +1 -1
  31. package/dist/apis/consent.cjs +6 -6
  32. package/dist/apis/consent.js +1 -1
  33. package/dist/apis/customer-portal.cjs +8 -8
  34. package/dist/apis/customer-portal.d.cts +2 -2
  35. package/dist/apis/customer-portal.d.ts +2 -2
  36. package/dist/apis/customer-portal.js +2 -2
  37. package/dist/apis/dashboard.cjs +6 -6
  38. package/dist/apis/dashboard.js +1 -1
  39. package/dist/apis/data-governance.cjs +6 -6
  40. package/dist/apis/data-governance.js +1 -1
  41. package/dist/apis/deduplication.cjs +6 -6
  42. package/dist/apis/deduplication.js +1 -1
  43. package/dist/apis/design.cjs +6 -6
  44. package/dist/apis/design.js +1 -1
  45. package/dist/apis/document.cjs +6 -6
  46. package/dist/apis/document.js +1 -1
  47. package/dist/apis/email-settings.cjs +6 -6
  48. package/dist/apis/email-settings.js +1 -1
  49. package/dist/apis/email-template.cjs +6 -6
  50. package/dist/apis/email-template.js +1 -1
  51. package/dist/apis/entity-mapping.cjs +6 -6
  52. package/dist/apis/entity-mapping.js +1 -1
  53. package/dist/apis/entity.cjs +6 -6
  54. package/dist/apis/entity.d.cts +2 -2
  55. package/dist/apis/entity.d.ts +2 -2
  56. package/dist/apis/entity.js +1 -1
  57. package/dist/apis/environments.cjs +6 -6
  58. package/dist/apis/environments.js +1 -1
  59. package/dist/apis/event-catalog.cjs +6 -6
  60. package/dist/apis/event-catalog.js +1 -1
  61. package/dist/apis/file.cjs +6 -6
  62. package/dist/apis/file.js +1 -1
  63. package/dist/apis/iban.cjs +6 -6
  64. package/dist/apis/iban.js +1 -1
  65. package/dist/apis/integration-toolkit.cjs +6 -6
  66. package/dist/apis/integration-toolkit.js +1 -1
  67. package/dist/apis/journey.cjs +6 -6
  68. package/dist/apis/journey.js +1 -1
  69. package/dist/apis/kanban.cjs +6 -6
  70. package/dist/apis/kanban.js +1 -1
  71. package/dist/apis/message.cjs +6 -6
  72. package/dist/apis/message.js +1 -1
  73. package/dist/apis/metering.cjs +6 -6
  74. package/dist/apis/metering.js +1 -1
  75. package/dist/apis/notes.cjs +6 -6
  76. package/dist/apis/notes.d.cts +2 -2
  77. package/dist/apis/notes.d.ts +2 -2
  78. package/dist/apis/notes.js +1 -1
  79. package/dist/apis/notification.cjs +6 -6
  80. package/dist/apis/notification.js +1 -1
  81. package/dist/apis/organization.cjs +6 -6
  82. package/dist/apis/organization.js +1 -1
  83. package/dist/apis/partner-directory.cjs +6 -6
  84. package/dist/apis/partner-directory.js +1 -1
  85. package/dist/apis/permissions.cjs +6 -6
  86. package/dist/apis/permissions.js +1 -1
  87. package/dist/apis/pricing-tier.cjs +6 -6
  88. package/dist/apis/pricing-tier.js +1 -1
  89. package/dist/apis/pricing.cjs +6 -6
  90. package/dist/apis/pricing.js +1 -1
  91. package/dist/apis/purpose.cjs +6 -6
  92. package/dist/apis/purpose.js +1 -1
  93. package/dist/apis/query.cjs +6 -6
  94. package/dist/apis/query.js +1 -1
  95. package/dist/apis/sandbox.cjs +6 -6
  96. package/dist/apis/sandbox.js +1 -1
  97. package/dist/apis/sharing.cjs +6 -6
  98. package/dist/apis/sharing.js +1 -1
  99. package/dist/apis/submission.cjs +6 -6
  100. package/dist/apis/submission.js +1 -1
  101. package/dist/apis/target.cjs +6 -6
  102. package/dist/apis/target.js +1 -1
  103. package/dist/apis/targeting.cjs +6 -6
  104. package/dist/apis/targeting.js +1 -1
  105. package/dist/apis/template-variables.cjs +6 -6
  106. package/dist/apis/template-variables.js +1 -1
  107. package/dist/apis/user.cjs +6 -6
  108. package/dist/apis/user.js +1 -1
  109. package/dist/apis/validation-rules.cjs +6 -6
  110. package/dist/apis/validation-rules.js +1 -1
  111. package/dist/apis/webhooks.cjs +8 -8
  112. package/dist/apis/webhooks.d.cts +2 -2
  113. package/dist/apis/webhooks.d.ts +2 -2
  114. package/dist/apis/webhooks.js +2 -2
  115. package/dist/apis/workflow-definition.cjs +6 -6
  116. package/dist/apis/workflow-definition.js +1 -1
  117. package/dist/apis/workflow.cjs +6 -6
  118. package/dist/apis/workflow.js +1 -1
  119. package/dist/app-34OBBTA4.js +7 -0
  120. package/dist/app-SSF545U7.cjs +7 -0
  121. package/dist/app-runtime-AFNM67YN.cjs +5 -0
  122. package/dist/{app-runtime-U7RGV7KT.js → app-runtime-DBUXZL6E.js} +1 -1
  123. package/dist/{app.d-u7Dq42kU.d.cts → app.d--5n0FQQ4.d.cts} +377 -11
  124. package/dist/{app.d-u7Dq42kU.d.ts → app.d--5n0FQQ4.d.ts} +377 -11
  125. package/dist/bin/cli.js +1 -1
  126. package/dist/chunk-5OBMZHRL.cjs +14 -0
  127. package/dist/{chunk-CD4OX2U6.cjs → chunk-C7GDYBXX.cjs} +9 -9
  128. package/dist/{chunk-L66IX6GX.cjs → chunk-KMVJYNLB.cjs} +1 -1
  129. package/dist/chunk-KYCVV2XE.cjs +14 -0
  130. package/dist/chunk-RGO3LTAM.js +14 -0
  131. package/dist/{chunk-TSV242UN.js → chunk-WRD2XFHY.js} +9 -9
  132. package/dist/{chunk-LLZYRINH.js → chunk-Z4H2FZ2K.js} +1 -1
  133. package/dist/chunk-Z6HGUGXK.js +14 -0
  134. package/dist/customer-portal-5I7ZGQDU.cjs +7 -0
  135. package/dist/customer-portal-YL2YMPZL.js +7 -0
  136. package/dist/{customer-portal-runtime-PSM55KGU.js → customer-portal-runtime-N4NWQ67M.js} +1 -1
  137. package/dist/{customer-portal-runtime-DULJLR7F.cjs → customer-portal-runtime-OEXTSMSE.cjs} +2 -2
  138. package/dist/{customer-portal.d-DyZ2n2dW.d.cts → customer-portal.d-ChSEioI5.d.cts} +394 -9
  139. package/dist/{customer-portal.d-DyZ2n2dW.d.ts → customer-portal.d-ChSEioI5.d.ts} +394 -9
  140. package/dist/entity-SS36LQO6.cjs +7 -0
  141. package/dist/entity-Z4YWKDVG.js +7 -0
  142. package/dist/{entity.d-BHR9dEon.d.cts → entity.d-fospShiN.d.cts} +234 -169
  143. package/dist/{entity.d-BHR9dEon.d.ts → entity.d-fospShiN.d.ts} +234 -169
  144. package/dist/index.cjs +14 -14
  145. package/dist/index.d.cts +5 -5
  146. package/dist/index.d.ts +5 -5
  147. package/dist/index.js +4 -4
  148. package/dist/{js-yaml-UPZKYVRY.js → js-yaml-DLCVPJ7G.js} +17 -15
  149. package/dist/notes-K2IIFCX3.cjs +7 -0
  150. package/dist/notes-Q7JGS7O3.js +7 -0
  151. package/dist/{notes.d-BC-scR42.d.ts → notes.d-BcV_m5fe.d.cts} +33 -11
  152. package/dist/{notes.d-BC-scR42.d.cts → notes.d-BcV_m5fe.d.ts} +33 -11
  153. package/dist/{pricing-XAET4G7T.cjs → pricing-FODHQFCB.cjs} +1 -1
  154. package/dist/{pricing-G67CH3XH.js → pricing-XRIDVZFC.js} +1 -1
  155. package/dist/webhooks-NZ3TM3AY.cjs +7 -0
  156. package/dist/webhooks-XLBUXXCS.js +7 -0
  157. package/dist/{webhooks-runtime-EBM4M3SU.cjs → webhooks-runtime-QVAFNBDW.cjs} +2 -2
  158. package/dist/{webhooks-runtime-XCQYIGQK.js → webhooks-runtime-UYTPQQVG.js} +1 -1
  159. package/dist/{webhooks.d-pLHIL_io.d.cts → webhooks.d-D79qib9f.d.cts} +115 -5
  160. package/dist/{webhooks.d-pLHIL_io.d.ts → webhooks.d-D79qib9f.d.ts} +115 -5
  161. package/docs/app.md +244 -9
  162. package/docs/customer-portal.md +340 -113
  163. package/docs/entity.md +65 -0
  164. package/docs/notes.md +19 -12
  165. package/docs/pricing.md +3 -1
  166. package/docs/webhooks.md +49 -0
  167. package/package.json +1 -1
  168. package/dist/app-5KSVSKDU.js +0 -7
  169. package/dist/app-PL3IOROO.cjs +0 -7
  170. package/dist/app-runtime-SSNHSBR7.cjs +0 -5
  171. package/dist/chunk-2MMSXUOL.cjs +0 -14
  172. package/dist/chunk-A7AAVJGM.js +0 -14
  173. package/dist/chunk-GVNT76UU.js +0 -14
  174. package/dist/chunk-HHMXS5NC.cjs +0 -14
  175. package/dist/customer-portal-5LMHNBMD.cjs +0 -7
  176. package/dist/customer-portal-RZACUF4N.js +0 -7
  177. package/dist/entity-H6ESUH3Y.js +0 -7
  178. package/dist/entity-ZVDKWQSF.cjs +0 -7
  179. package/dist/notes-3AO5GXIT.js +0 -7
  180. package/dist/notes-MPWOQC5J.cjs +0 -7
  181. package/dist/webhooks-H3RT33BF.cjs +0 -7
  182. package/dist/webhooks-RTOU3MS5.js +0 -7
@@ -733,8 +733,8 @@
733
733
  "schema": {
734
734
  "type": "string"
735
735
  },
736
- "required": true,
737
- "description": "Hook ID for consumption data."
736
+ "required": false,
737
+ "description": "Optional Hook ID. If omitted, the only matching hook on the extension is used; if the extension has multiple hooks of the relevant type, this becomes required."
738
738
  },
739
739
  {
740
740
  "in": "query",
@@ -818,17 +818,6 @@
818
818
  "description": "Optional type of the consumption, such as 'nt' (night time) and 'ht' (high time) or 'feed-in' and 'feed-out'. Can be any string.",
819
819
  "example": "nt"
820
820
  },
821
- "aggregation_method": {
822
- "type": "string",
823
- "description": "The method used to aggregate the consumption data. Assumed default is 'sum'.",
824
- "enum": [
825
- "sum",
826
- "average",
827
- "max",
828
- "min"
829
- ],
830
- "example": "sum"
831
- },
832
821
  "unit": {
833
822
  "type": "string",
834
823
  "description": "Optional unit of the consumption value. Defaults to unit present on the relevant Meter Counter.",
@@ -861,6 +850,178 @@
861
850
  }
862
851
  }
863
852
  },
853
+ "/v2/portal/visualization:export": {
854
+ "post": {
855
+ "operationId": "prepareVisualizationExport",
856
+ "summary": "Prepare Visualization Export",
857
+ "description": "Asks an installed App to prepare a downloadable export of a visualization (consumption chart, dynamic tariff chart, etc.). The export is produced by the third-party App via a configured portal extension hook of type `dataExport` — this endpoint does not generate the file itself, it forwards the request to the configured hook and returns the descriptor the App provides (typically a `download_url`).\n",
858
+ "tags": [
859
+ "ECP"
860
+ ],
861
+ "security": [
862
+ {
863
+ "PortalAuth": []
864
+ }
865
+ ],
866
+ "requestBody": {
867
+ "required": true,
868
+ "content": {
869
+ "application/json": {
870
+ "schema": {
871
+ "type": "object",
872
+ "properties": {
873
+ "app_id": {
874
+ "type": "string",
875
+ "description": "App ID providing the dataExport hook."
876
+ },
877
+ "extension_id": {
878
+ "type": "string",
879
+ "description": "Extension ID providing the dataExport hook."
880
+ },
881
+ "hook_id": {
882
+ "type": "string",
883
+ "description": "Optional Hook ID. If omitted, the only `dataExport` hook on the extension is used; if the extension has multiple `dataExport` hooks, this becomes required."
884
+ },
885
+ "from": {
886
+ "type": "string",
887
+ "format": "date-time",
888
+ "description": "Optional start date for the export window (ISO 8601 format)."
889
+ },
890
+ "to": {
891
+ "type": "string",
892
+ "format": "date-time",
893
+ "description": "Optional end date for the export window (ISO 8601 format)."
894
+ },
895
+ "context_entities": {
896
+ "$ref": "#/components/schemas/ContextEntities"
897
+ }
898
+ },
899
+ "required": [
900
+ "app_id",
901
+ "extension_id"
902
+ ],
903
+ "additionalProperties": false
904
+ }
905
+ }
906
+ }
907
+ },
908
+ "responses": {
909
+ "200": {
910
+ "description": "Export descriptor returned by the App.",
911
+ "content": {
912
+ "application/json": {
913
+ "schema": {
914
+ "type": "object",
915
+ "properties": {
916
+ "download_url": {
917
+ "type": "string",
918
+ "description": "URL the client can use to download the exported file. May be a pre-signed or short-lived URL."
919
+ },
920
+ "filename": {
921
+ "type": "string",
922
+ "description": "Suggested filename for the exported file."
923
+ },
924
+ "content_type": {
925
+ "type": "string",
926
+ "description": "MIME type of the exported file.",
927
+ "example": "text/csv"
928
+ },
929
+ "expires_at": {
930
+ "type": "string",
931
+ "format": "date-time",
932
+ "description": "Optional expiration timestamp for the download URL."
933
+ }
934
+ },
935
+ "required": [
936
+ "download_url"
937
+ ]
938
+ }
939
+ }
940
+ }
941
+ },
942
+ "401": {
943
+ "$ref": "#/components/responses/Unauthorized"
944
+ },
945
+ "403": {
946
+ "$ref": "#/components/responses/Forbidden"
947
+ },
948
+ "404": {
949
+ "$ref": "#/components/responses/NotFound"
950
+ },
951
+ "500": {
952
+ "$ref": "#/components/responses/InternalServerError"
953
+ }
954
+ }
955
+ }
956
+ },
957
+ "/v2/portal/visualization/metadata": {
958
+ "get": {
959
+ "operationId": "getVisualizationMetadata",
960
+ "summary": "Get Visualization Metadata",
961
+ "description": "Returns runtime metadata describing how a visualization (consumption / price / cost chart) should be rendered for a given portal context (meter, contract, etc). Resolves the extension's `visualizationMetadata` hook implicitly from `app_id` + `extensionId` and invokes it. Supplies the response as a structured payload that the portal uses to configure type/aggregation options, supported intervals, and the available data range.\n",
962
+ "tags": [
963
+ "ECP"
964
+ ],
965
+ "security": [
966
+ {
967
+ "PortalAuth": []
968
+ }
969
+ ],
970
+ "parameters": [
971
+ {
972
+ "in": "query",
973
+ "name": "app_id",
974
+ "schema": {
975
+ "type": "string"
976
+ },
977
+ "required": true,
978
+ "description": "App ID providing the visualizationMetadata hook."
979
+ },
980
+ {
981
+ "in": "query",
982
+ "name": "extensionId",
983
+ "schema": {
984
+ "type": "string"
985
+ },
986
+ "required": true,
987
+ "description": "Extension ID providing the visualizationMetadata hook."
988
+ },
989
+ {
990
+ "in": "query",
991
+ "name": "context_entities",
992
+ "required": false,
993
+ "description": "Entities to include in the context for variable interpolation in the hook (typically the meter and any other entities that scope the visualization).",
994
+ "schema": {
995
+ "$ref": "#/components/schemas/ContextEntities"
996
+ }
997
+ }
998
+ ],
999
+ "responses": {
1000
+ "200": {
1001
+ "description": "Visualization metadata returned successfully.",
1002
+ "content": {
1003
+ "application/json": {
1004
+ "schema": {
1005
+ "$ref": "#/components/schemas/VisualizationMetadata"
1006
+ }
1007
+ }
1008
+ }
1009
+ },
1010
+ "401": {
1011
+ "$ref": "#/components/responses/Unauthorized"
1012
+ },
1013
+ "403": {
1014
+ "$ref": "#/components/responses/Forbidden"
1015
+ },
1016
+ "404": {
1017
+ "$ref": "#/components/responses/NotFound"
1018
+ },
1019
+ "500": {
1020
+ "$ref": "#/components/responses/InternalServerError"
1021
+ }
1022
+ }
1023
+ }
1024
+ },
864
1025
  "/v2/portal/costs": {
865
1026
  "get": {
866
1027
  "operationId": "getCosts",
@@ -899,8 +1060,8 @@
899
1060
  "schema": {
900
1061
  "type": "string"
901
1062
  },
902
- "required": true,
903
- "description": "Hook ID for cost data."
1063
+ "required": false,
1064
+ "description": "Optional Hook ID. If omitted, the only matching hook on the extension is used; if the extension has multiple hooks of the relevant type, this becomes required."
904
1065
  },
905
1066
  {
906
1067
  "in": "query",
@@ -1073,8 +1234,8 @@
1073
1234
  "schema": {
1074
1235
  "type": "string"
1075
1236
  },
1076
- "required": true,
1077
- "description": "Hook ID for price data."
1237
+ "required": false,
1238
+ "description": "Optional Hook ID. If omitted, the only matching hook on the extension is used; if the extension has multiple hooks of the relevant type, this becomes required."
1078
1239
  },
1079
1240
  {
1080
1241
  "in": "query",
@@ -13492,6 +13653,12 @@
13492
13653
  "$ref": "#/components/schemas/DataRetrievalItem"
13493
13654
  }
13494
13655
  },
13656
+ "dataExport": {
13657
+ "type": "array",
13658
+ "items": {
13659
+ "$ref": "#/components/schemas/DataRetrievalItem"
13660
+ }
13661
+ },
13495
13662
  "priceDataRetrieval": {
13496
13663
  "type": "array",
13497
13664
  "items": {
@@ -13531,6 +13698,9 @@
13531
13698
  "DataRetrievalItem": {
13532
13699
  "type": "object",
13533
13700
  "properties": {
13701
+ "app": {
13702
+ "$ref": "#/components/schemas/PublicAppDetails"
13703
+ },
13534
13704
  "extension": {
13535
13705
  "$ref": "#/components/schemas/PublicExtensionDetails"
13536
13706
  },
@@ -13539,6 +13709,31 @@
13539
13709
  }
13540
13710
  }
13541
13711
  },
13712
+ "PublicAppDetails": {
13713
+ "type": "object",
13714
+ "properties": {
13715
+ "app_id": {
13716
+ "type": "string",
13717
+ "description": "Identifier of the app."
13718
+ },
13719
+ "name": {
13720
+ "type": "object",
13721
+ "properties": {
13722
+ "en": {
13723
+ "type": "string",
13724
+ "description": "Name of the app in English."
13725
+ }
13726
+ },
13727
+ "additionalProperties": {
13728
+ "type": "string",
13729
+ "description": "Name of the app in some other language denoted by ISO 3166-1 alpha-2 code."
13730
+ },
13731
+ "required": [
13732
+ "en"
13733
+ ]
13734
+ }
13735
+ }
13736
+ },
13542
13737
  "PublicExtensionDetails": {
13543
13738
  "type": "object",
13544
13739
  "properties": {
@@ -13589,10 +13784,121 @@
13589
13784
  },
13590
13785
  "intervals": {
13591
13786
  "type": "array",
13787
+ "deprecated": true,
13592
13788
  "items": {
13593
13789
  "type": "string"
13594
13790
  },
13595
- "description": "The intervals associated with the hook."
13791
+ "description": "Deprecated. Prefer fetching `intervals` from the `visualizationMetadata` endpoint\n(`GET /v2/portal/visualization/metadata`) so the supported intervals can vary per\nmeter/contract. Still emitted as a fallback for clients that have not migrated yet.\n"
13792
+ },
13793
+ "block_types": {
13794
+ "type": "array",
13795
+ "items": {
13796
+ "type": "string"
13797
+ },
13798
+ "description": "Optional list of portal block types the hook supports. Empty/missing means the hook is usable on any export-capable block."
13799
+ }
13800
+ }
13801
+ },
13802
+ "VisualizationMetadata": {
13803
+ "type": "object",
13804
+ "description": "Runtime metadata describing how a visualization should be rendered for a given portal context. Returned by `GET /v2/portal/visualization/metadata`.\n",
13805
+ "properties": {
13806
+ "type_options": {
13807
+ "type": "array",
13808
+ "description": "Types advertised for the current context (e.g. `ht`/`nt`, `feed-in`/`feed-out`). The `id` matches the `type` field returned by the data hook.\n",
13809
+ "items": {
13810
+ "$ref": "#/components/schemas/VisualizationTypeOption"
13811
+ }
13812
+ },
13813
+ "intervals": {
13814
+ "type": "array",
13815
+ "description": "Intervals supported for the current context. If omitted, all intervals are assumed supported.",
13816
+ "items": {
13817
+ "type": "string",
13818
+ "enum": [
13819
+ "PT15M",
13820
+ "PT1H",
13821
+ "P1D",
13822
+ "P1M"
13823
+ ]
13824
+ }
13825
+ },
13826
+ "data_range": {
13827
+ "$ref": "#/components/schemas/VisualizationDataRange"
13828
+ }
13829
+ }
13830
+ },
13831
+ "VisualizationTypeOption": {
13832
+ "type": "object",
13833
+ "properties": {
13834
+ "id": {
13835
+ "type": "string",
13836
+ "description": "Identifier of the type. Matches the `type` field on the data hook response."
13837
+ },
13838
+ "label": {
13839
+ "type": "object",
13840
+ "additionalProperties": {
13841
+ "type": "string"
13842
+ },
13843
+ "description": "Localized label for the type, keyed by ISO 3166-1 alpha-2 language code."
13844
+ },
13845
+ "aggregation_group": {
13846
+ "type": "string",
13847
+ "description": "Optional grouping key. Types in the same `aggregation_group` are visually combined; types in different groups (or without a group) render separately. How they combine depends on each type's `statistical_method`:\n - bar chart (`sum`): same-group types are stacked into a single bar (e.g. ht/nt\n summed into total consumption); different-group types render side-by-side.\n - line chart (`min` / `average` / `max`): same-group types are rendered as an\n area chart; different-group types render as separate lines.\n"
13848
+ },
13849
+ "statistical_method": {
13850
+ "type": "string",
13851
+ "enum": [
13852
+ "sum",
13853
+ "average",
13854
+ "min",
13855
+ "max"
13856
+ ],
13857
+ "description": "Statistical method already applied to this type's data. Determines the chart shape used to render the type's values: `sum` is shown as a bar chart; `min`, `average`, and `max` are shown as a line chart. Each type advertises its own method, so a single visualization can mix bar-shaped types with line-shaped types. Defaults to `sum` when omitted.\n"
13858
+ },
13859
+ "unit": {
13860
+ "type": "string",
13861
+ "description": "Unit shared by all values of this type (e.g. \"kWh\")."
13862
+ },
13863
+ "color": {
13864
+ "type": "string",
13865
+ "enum": [
13866
+ "primary",
13867
+ "slate",
13868
+ "mauve",
13869
+ "orange",
13870
+ "red",
13871
+ "tomato",
13872
+ "amber",
13873
+ "green",
13874
+ "blue"
13875
+ ],
13876
+ "description": "Optional Spark color token used to render this type in the visualization. Maps onto the portal's Spark palette (`primary` is the org's primary brand color). When omitted the consumer falls back to its own per-type default.\n"
13877
+ },
13878
+ "precision": {
13879
+ "type": "integer",
13880
+ "minimum": 0,
13881
+ "maximum": 10,
13882
+ "description": "Optional number of decimal places to show when rendering values of this type in the visualization (axis labels, tooltips, summaries). When omitted the consumer falls back to its own default precision.\n"
13883
+ }
13884
+ },
13885
+ "required": [
13886
+ "id"
13887
+ ]
13888
+ },
13889
+ "VisualizationDataRange": {
13890
+ "type": "object",
13891
+ "description": "Earliest / latest timestamps for which data is available in the current context.",
13892
+ "properties": {
13893
+ "from": {
13894
+ "type": "string",
13895
+ "format": "date-time",
13896
+ "description": "ISO 8601 timestamp of the earliest available data point."
13897
+ },
13898
+ "to": {
13899
+ "type": "string",
13900
+ "format": "date-time",
13901
+ "description": "ISO 8601 timestamp of the latest available data point."
13596
13902
  }
13597
13903
  }
13598
13904
  },
@@ -13787,11 +14093,17 @@
13787
14093
  {
13788
14094
  "$ref": "#/components/schemas/ExtensionHookConsumptionDataRetrieval"
13789
14095
  },
14096
+ {
14097
+ "$ref": "#/components/schemas/ExtensionHookDataExport"
14098
+ },
13790
14099
  {
13791
14100
  "$ref": "#/components/schemas/ExtensionHookCostDataRetrieval"
13792
14101
  },
13793
14102
  {
13794
14103
  "$ref": "#/components/schemas/ExtensionHookMeterReadingPlausibilityCheck"
14104
+ },
14105
+ {
14106
+ "$ref": "#/components/schemas/ExtensionHookVisualizationMetadata"
13795
14107
  }
13796
14108
  ]
13797
14109
  }
@@ -13950,7 +14262,8 @@
13950
14262
  },
13951
14263
  "use_static_ips": {
13952
14264
  "type": "boolean",
13953
- "description": "If true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.",
14265
+ "deprecated": true,
14266
+ "description": "Deprecated. Prefer `secure_proxy` instead.\nIf true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.\n",
13954
14267
  "default": false
13955
14268
  },
13956
14269
  "secure_proxy": {
@@ -14052,7 +14365,8 @@
14052
14365
  },
14053
14366
  "use_static_ips": {
14054
14367
  "type": "boolean",
14055
- "description": "If true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.",
14368
+ "deprecated": true,
14369
+ "description": "Deprecated. Prefer `secure_proxy` instead.\nIf true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.\n",
14056
14370
  "default": false
14057
14371
  },
14058
14372
  "secure_proxy": {
@@ -14162,7 +14476,8 @@
14162
14476
  },
14163
14477
  "use_static_ips": {
14164
14478
  "type": "boolean",
14165
- "description": "If true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.",
14479
+ "deprecated": true,
14480
+ "description": "Deprecated. Prefer `secure_proxy` instead.\nIf true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.\n",
14166
14481
  "default": false
14167
14482
  },
14168
14483
  "secure_proxy": {
@@ -14240,7 +14555,8 @@
14240
14555
  },
14241
14556
  "use_static_ips": {
14242
14557
  "type": "boolean",
14243
- "description": "If true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.",
14558
+ "deprecated": true,
14559
+ "description": "Deprecated. Prefer `secure_proxy` instead.\nIf true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.\n",
14244
14560
  "default": false
14245
14561
  },
14246
14562
  "secure_proxy": {
@@ -14317,7 +14633,162 @@
14317
14633
  },
14318
14634
  "use_static_ips": {
14319
14635
  "type": "boolean",
14320
- "description": "If true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.",
14636
+ "deprecated": true,
14637
+ "description": "Deprecated. Prefer `secure_proxy` instead.\nIf true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.\n",
14638
+ "default": false
14639
+ },
14640
+ "secure_proxy": {
14641
+ "$ref": "#/components/schemas/SecureProxyConfig"
14642
+ }
14643
+ },
14644
+ "required": [
14645
+ "type",
14646
+ "call"
14647
+ ]
14648
+ },
14649
+ "ExtensionHookDataExport": {
14650
+ "description": "Generic data export hook. When configured on a visualization block, 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 — consumption charts, dynamic tariff charts, etc. The expected response to the call is:\n - 200 with a JSON body describing the exported file (download_url, optional filename, content_type, expires_at)\n",
14651
+ "type": "object",
14652
+ "properties": {
14653
+ "type": {
14654
+ "type": "string",
14655
+ "enum": [
14656
+ "dataExport"
14657
+ ]
14658
+ },
14659
+ "block_types": {
14660
+ "type": "array",
14661
+ "description": "Optional list of portal block types this hook supports. If omitted,\nthe hook is usable on any export-capable block. Allowed values match\nthe block type identifiers used by the portal builder\n(e.g. `consumption_visualization`, `dynamic_tariff`).\n",
14662
+ "items": {
14663
+ "type": "string"
14664
+ }
14665
+ },
14666
+ "auth": {
14667
+ "$ref": "#/components/schemas/ExtensionAuthBlock"
14668
+ },
14669
+ "call": {
14670
+ "type": "object",
14671
+ "properties": {
14672
+ "method": {
14673
+ "type": "string",
14674
+ "description": "HTTP method to use for the call",
14675
+ "default": "GET"
14676
+ },
14677
+ "url": {
14678
+ "type": "string",
14679
+ "description": "URL to call. Supports variable interpolation."
14680
+ },
14681
+ "params": {
14682
+ "type": "object",
14683
+ "description": "Parameters to append to the URL. Supports variable interpolation.",
14684
+ "additionalProperties": {
14685
+ "type": "string"
14686
+ },
14687
+ "default": {}
14688
+ },
14689
+ "headers": {
14690
+ "type": "object",
14691
+ "description": "Headers to use. Supports variable interpolation.",
14692
+ "additionalProperties": {
14693
+ "type": "string"
14694
+ },
14695
+ "default": {}
14696
+ },
14697
+ "body": {
14698
+ "type": "object",
14699
+ "description": "Request body to send. Supports variable interpolation. Content format is determined by Content-Type header.",
14700
+ "additionalProperties": {
14701
+ "type": "string"
14702
+ },
14703
+ "default": {}
14704
+ }
14705
+ },
14706
+ "required": [
14707
+ "url"
14708
+ ]
14709
+ },
14710
+ "use_static_ips": {
14711
+ "type": "boolean",
14712
+ "deprecated": true,
14713
+ "description": "Deprecated. Prefer `secure_proxy` instead.\nIf true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.\n",
14714
+ "default": false
14715
+ },
14716
+ "secure_proxy": {
14717
+ "$ref": "#/components/schemas/SecureProxyConfig"
14718
+ }
14719
+ },
14720
+ "required": [
14721
+ "type",
14722
+ "call"
14723
+ ]
14724
+ },
14725
+ "ExtensionHookVisualizationMetadata": {
14726
+ "description": "Hook that returns runtime metadata describing how a visualization should be rendered for a given portal context. Invoked by the portal before fetching data, with the same context the data hook receives.\n",
14727
+ "type": "object",
14728
+ "properties": {
14729
+ "type": {
14730
+ "type": "string",
14731
+ "enum": [
14732
+ "visualizationMetadata"
14733
+ ]
14734
+ },
14735
+ "auth": {
14736
+ "$ref": "#/components/schemas/ExtensionAuthBlock"
14737
+ },
14738
+ "call": {
14739
+ "type": "object",
14740
+ "properties": {
14741
+ "method": {
14742
+ "type": "string",
14743
+ "description": "HTTP method to use for the call",
14744
+ "default": "GET"
14745
+ },
14746
+ "url": {
14747
+ "type": "string",
14748
+ "description": "URL to call. Supports variable interpolation."
14749
+ },
14750
+ "params": {
14751
+ "type": "object",
14752
+ "description": "Parameters to append to the URL. Supports variable interpolation.",
14753
+ "additionalProperties": {
14754
+ "type": "string"
14755
+ },
14756
+ "default": {}
14757
+ },
14758
+ "headers": {
14759
+ "type": "object",
14760
+ "description": "Headers to use. Supports variable interpolation.",
14761
+ "additionalProperties": {
14762
+ "type": "string"
14763
+ },
14764
+ "default": {}
14765
+ },
14766
+ "body": {
14767
+ "type": "object",
14768
+ "description": "Request body to send. Supports variable interpolation. Content format is determined by Content-Type header.",
14769
+ "additionalProperties": {
14770
+ "type": "string"
14771
+ },
14772
+ "default": {}
14773
+ }
14774
+ },
14775
+ "required": [
14776
+ "url"
14777
+ ]
14778
+ },
14779
+ "resolved": {
14780
+ "type": "object",
14781
+ "properties": {
14782
+ "dataPath": {
14783
+ "type": "string",
14784
+ "description": "Optional path to the metadata object in the response. If omitted, the metadata is assumed to be on the top level."
14785
+ }
14786
+ }
14787
+ },
14788
+ "use_static_ips": {
14789
+ "type": "boolean",
14790
+ "deprecated": true,
14791
+ "description": "Deprecated. Prefer `secure_proxy` instead.\nIf true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.\n",
14321
14792
  "default": false
14322
14793
  },
14323
14794
  "secure_proxy": {
@@ -14394,7 +14865,8 @@
14394
14865
  },
14395
14866
  "use_static_ips": {
14396
14867
  "type": "boolean",
14397
- "description": "If true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.",
14868
+ "deprecated": true,
14869
+ "description": "Deprecated. Prefer `secure_proxy` instead.\nIf true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.\n",
14398
14870
  "default": false
14399
14871
  },
14400
14872
  "secure_proxy": {