@epilot/sdk 2.20.20 → 2.20.21

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 (128) hide show
  1. package/definitions/customer-portal-runtime.json +1 -1
  2. package/definitions/customer-portal.json +1102 -106
  3. package/dist/apis/access-token.cjs +6 -6
  4. package/dist/apis/access-token.js +1 -1
  5. package/dist/apis/address-suggestions.cjs +6 -6
  6. package/dist/apis/address-suggestions.js +1 -1
  7. package/dist/apis/address.cjs +6 -6
  8. package/dist/apis/address.js +1 -1
  9. package/dist/apis/ai-agents.cjs +6 -6
  10. package/dist/apis/ai-agents.js +1 -1
  11. package/dist/apis/app.cjs +6 -6
  12. package/dist/apis/app.js +1 -1
  13. package/dist/apis/audit-logs.cjs +6 -6
  14. package/dist/apis/audit-logs.js +1 -1
  15. package/dist/apis/automation.cjs +6 -6
  16. package/dist/apis/automation.js +1 -1
  17. package/dist/apis/billing.cjs +6 -6
  18. package/dist/apis/billing.js +1 -1
  19. package/dist/apis/blueprint-manifest.cjs +6 -6
  20. package/dist/apis/blueprint-manifest.js +1 -1
  21. package/dist/apis/calendar.cjs +6 -6
  22. package/dist/apis/calendar.js +1 -1
  23. package/dist/apis/configuration-hub.cjs +6 -6
  24. package/dist/apis/configuration-hub.js +1 -1
  25. package/dist/apis/consent.cjs +6 -6
  26. package/dist/apis/consent.js +1 -1
  27. package/dist/apis/customer-portal.cjs +8 -8
  28. package/dist/apis/customer-portal.d.cts +2 -2
  29. package/dist/apis/customer-portal.d.ts +2 -2
  30. package/dist/apis/customer-portal.js +2 -2
  31. package/dist/apis/dashboard.cjs +6 -6
  32. package/dist/apis/dashboard.js +1 -1
  33. package/dist/apis/data-governance.cjs +6 -6
  34. package/dist/apis/data-governance.js +1 -1
  35. package/dist/apis/deduplication.cjs +6 -6
  36. package/dist/apis/deduplication.js +1 -1
  37. package/dist/apis/design.cjs +6 -6
  38. package/dist/apis/design.js +1 -1
  39. package/dist/apis/document.cjs +6 -6
  40. package/dist/apis/document.js +1 -1
  41. package/dist/apis/email-settings.cjs +6 -6
  42. package/dist/apis/email-settings.js +1 -1
  43. package/dist/apis/email-template.cjs +6 -6
  44. package/dist/apis/email-template.js +1 -1
  45. package/dist/apis/entity-mapping.cjs +6 -6
  46. package/dist/apis/entity-mapping.js +1 -1
  47. package/dist/apis/entity.cjs +6 -6
  48. package/dist/apis/entity.js +1 -1
  49. package/dist/apis/environments.cjs +6 -6
  50. package/dist/apis/environments.js +1 -1
  51. package/dist/apis/event-catalog.cjs +6 -6
  52. package/dist/apis/event-catalog.js +1 -1
  53. package/dist/apis/file.cjs +6 -6
  54. package/dist/apis/file.js +1 -1
  55. package/dist/apis/iban.cjs +6 -6
  56. package/dist/apis/iban.js +1 -1
  57. package/dist/apis/integration-toolkit.cjs +6 -6
  58. package/dist/apis/integration-toolkit.js +1 -1
  59. package/dist/apis/journey.cjs +6 -6
  60. package/dist/apis/journey.js +1 -1
  61. package/dist/apis/kanban.cjs +6 -6
  62. package/dist/apis/kanban.js +1 -1
  63. package/dist/apis/message.cjs +6 -6
  64. package/dist/apis/message.js +1 -1
  65. package/dist/apis/metering.cjs +6 -6
  66. package/dist/apis/metering.js +1 -1
  67. package/dist/apis/notes.cjs +6 -6
  68. package/dist/apis/notes.js +1 -1
  69. package/dist/apis/notification.cjs +6 -6
  70. package/dist/apis/notification.js +1 -1
  71. package/dist/apis/organization.cjs +6 -6
  72. package/dist/apis/organization.js +1 -1
  73. package/dist/apis/partner-directory.cjs +6 -6
  74. package/dist/apis/partner-directory.js +1 -1
  75. package/dist/apis/permissions.cjs +6 -6
  76. package/dist/apis/permissions.js +1 -1
  77. package/dist/apis/pricing-tier.cjs +6 -6
  78. package/dist/apis/pricing-tier.js +1 -1
  79. package/dist/apis/pricing.cjs +6 -6
  80. package/dist/apis/pricing.js +1 -1
  81. package/dist/apis/purpose.cjs +6 -6
  82. package/dist/apis/purpose.js +1 -1
  83. package/dist/apis/query.cjs +6 -6
  84. package/dist/apis/query.js +1 -1
  85. package/dist/apis/sandbox.cjs +6 -6
  86. package/dist/apis/sandbox.js +1 -1
  87. package/dist/apis/sharing.cjs +6 -6
  88. package/dist/apis/sharing.js +1 -1
  89. package/dist/apis/snapshot.cjs +6 -6
  90. package/dist/apis/snapshot.js +1 -1
  91. package/dist/apis/submission.cjs +6 -6
  92. package/dist/apis/submission.js +1 -1
  93. package/dist/apis/target.cjs +6 -6
  94. package/dist/apis/target.js +1 -1
  95. package/dist/apis/targeting.cjs +6 -6
  96. package/dist/apis/targeting.js +1 -1
  97. package/dist/apis/template-variables.cjs +6 -6
  98. package/dist/apis/template-variables.js +1 -1
  99. package/dist/apis/user.cjs +6 -6
  100. package/dist/apis/user.js +1 -1
  101. package/dist/apis/validation-rules.cjs +6 -6
  102. package/dist/apis/validation-rules.js +1 -1
  103. package/dist/apis/webhooks.cjs +6 -6
  104. package/dist/apis/webhooks.js +1 -1
  105. package/dist/apis/workflow-definition.cjs +6 -6
  106. package/dist/apis/workflow-definition.js +1 -1
  107. package/dist/apis/workflow.cjs +6 -6
  108. package/dist/apis/workflow.js +1 -1
  109. package/dist/{chunk-N4SIVR5Y.js → chunk-6LUOXPO4.js} +2 -2
  110. package/dist/chunk-766NNARL.cjs +14 -0
  111. package/dist/{chunk-23SGQN24.cjs → chunk-CKLXVVGF.cjs} +2 -2
  112. package/dist/chunk-I67RRULD.js +14 -0
  113. package/dist/customer-portal-2K3FXGI4.cjs +7 -0
  114. package/dist/customer-portal-QU3C24B4.js +7 -0
  115. package/dist/{customer-portal-runtime-UVMYBCJL.cjs → customer-portal-runtime-5YBPM5TU.cjs} +2 -2
  116. package/dist/{customer-portal-runtime-PIBTR7QG.js → customer-portal-runtime-5Z5NO6FH.js} +1 -1
  117. package/dist/{customer-portal.d-gb6dOHv3.d.cts → customer-portal.d-DF4g7c3i.d.cts} +7812 -5245
  118. package/dist/{customer-portal.d-gb6dOHv3.d.ts → customer-portal.d-DF4g7c3i.d.ts} +7812 -5245
  119. package/dist/index.cjs +10 -10
  120. package/dist/index.d.cts +1 -1
  121. package/dist/index.d.ts +1 -1
  122. package/dist/index.js +2 -2
  123. package/docs/customer-portal.md +1443 -127
  124. package/package.json +1 -1
  125. package/dist/chunk-GB2OJK7Z.js +0 -14
  126. package/dist/chunk-Q35SXSWS.cjs +0 -14
  127. package/dist/customer-portal-FDB3TGS7.cjs +0 -7
  128. package/dist/customer-portal-NELL7GRO.js +0 -7
@@ -72,6 +72,10 @@ const { data } = await customerPortalClient.upsertPortal(...)
72
72
  - [`getPortalConfigV3`](#getportalconfigv3)
73
73
  - [`putPortalConfig`](#putportalconfig)
74
74
  - [`deletePortalConfig`](#deleteportalconfig)
75
+ - [`createPortalRevision`](#createportalrevision)
76
+ - [`listPortalRevisions`](#listportalrevisions)
77
+ - [`getPortalRevision`](#getportalrevision)
78
+ - [`publishPortalRevision`](#publishportalrevision)
75
79
  - [`listAllPortalConfigs`](#listallportalconfigs)
76
80
  - [`swapPortalConfig`](#swapportalconfig)
77
81
  - [`clonePortalConfig`](#cloneportalconfig)
@@ -92,12 +96,14 @@ const { data } = await customerPortalClient.upsertPortal(...)
92
96
  - [`getOrganizationSettingsByDomain`](#getorganizationsettingsbydomain)
93
97
  - [`checkContactExists`](#checkcontactexists)
94
98
  - [`checkContactExistsV3`](#checkcontactexistsv3)
99
+ - [`identifyContact`](#identifycontact)
95
100
  - [`checkAccountExists`](#checkaccountexists)
96
101
  - [`confirmUser`](#confirmuser)
97
102
  - [`confirmUserWithUserId`](#confirmuserwithuserid)
98
103
  - [`userExists`](#userexists)
99
104
  - [`userExistsV3`](#userexistsv3)
100
105
  - [`getSSOProvider`](#getssoprovider)
106
+ - [`getPublicSSOProviderV3`](#getpublicssoproviderv3)
101
107
  - [`ssoRedirect`](#ssoredirect)
102
108
  - [`ssoCallback`](#ssocallback)
103
109
  - [`getPublicPages`](#getpublicpages)
@@ -221,6 +227,8 @@ const { data } = await customerPortalClient.upsertPortal(...)
221
227
  - [`PortalWidget`](#portalwidget)
222
228
  - [`ContactCountRequest`](#contactcountrequest)
223
229
  - [`ContactExistsRequest`](#contactexistsrequest)
230
+ - [`ContactIdentifyRequest`](#contactidentifyrequest)
231
+ - [`ContactIdentifyResponse`](#contactidentifyresponse)
224
232
  - [`AccountExistsRequest`](#accountexistsrequest)
225
233
  - [`UserRequest`](#userrequest)
226
234
  - [`CreateUserRequest`](#createuserrequest)
@@ -258,6 +266,9 @@ const { data } = await customerPortalClient.upsertPortal(...)
258
266
  - [`FilePreviewResult`](#filepreviewresult)
259
267
  - [`EntityFileCount`](#entityfilecount)
260
268
  - [`AdminUser`](#adminuser)
269
+ - [`PortalSurface`](#portalsurface)
270
+ - [`PortalSurfaceDataAccess`](#portalsurfacedataaccess)
271
+ - [`PortalSurfaceEntityAccess`](#portalsurfaceentityaccess)
261
272
  - [`Grant`](#grant)
262
273
  - [`ActionLabel`](#actionlabel)
263
274
  - [`Rule`](#rule)
@@ -267,6 +278,7 @@ const { data } = await customerPortalClient.upsertPortal(...)
267
278
  - [`WorkflowExecution`](#workflowexecution)
268
279
  - [`WorkflowStep`](#workflowstep)
269
280
  - [`PortalWorkflow`](#portalworkflow)
281
+ - [`PortalWorkflowStage`](#portalworkflowstage)
270
282
  - [`PortalWorkflowTask`](#portalworkflowtask)
271
283
  - [`EntityPortalWorkflows`](#entityportalworkflows)
272
284
  - [`PortalTaskConfig`](#portaltaskconfig)
@@ -331,6 +343,8 @@ const { data } = await customerPortalClient.upsertPortal(...)
331
343
  - [`ProviderDisplayName`](#providerdisplayname)
332
344
  - [`ProviderConfig`](#providerconfig)
333
345
  - [`ProviderPublicConfig`](#providerpublicconfig)
346
+ - [`ProviderPublicConfigV3`](#providerpublicconfigv3)
347
+ - [`PublicIdentityProvider`](#publicidentityprovider)
334
348
  - [`AttributeMappingConfig`](#attributemappingconfig)
335
349
  - [`EntityMatchingConfig`](#entitymatchingconfig)
336
350
  - [`OIDCProviderConfig`](#oidcproviderconfig)
@@ -352,6 +366,15 @@ const { data } = await customerPortalClient.upsertPortal(...)
352
366
  - [`UpsertPortalConfigV3`](#upsertportalconfigv3)
353
367
  - [`PortalConfigV3`](#portalconfigv3)
354
368
  - [`JuiceSettings`](#juicesettings)
369
+ - [`RevisionPageRequest`](#revisionpagerequest)
370
+ - [`PortalRevisionRequest`](#portalrevisionrequest)
371
+ - [`PublishRevisionRequest`](#publishrevisionrequest)
372
+ - [`PortalRevisionSummary`](#portalrevisionsummary)
373
+ - [`PortalRevisionList`](#portalrevisionlist)
374
+ - [`PortalRevisionCreated`](#portalrevisioncreated)
375
+ - [`RevisionPage`](#revisionpage)
376
+ - [`PortalRevision`](#portalrevision)
377
+ - [`PublishResult`](#publishresult)
355
378
  - [`SwappableConfig`](#swappableconfig)
356
379
  - [`PortalUserRegistrationStatus`](#portaluserregistrationstatus)
357
380
  - [`BusinessPartnerItem`](#businesspartneritem)
@@ -564,6 +587,16 @@ const { data } = await client.upsertPortal(
564
587
  schema: 'contract'
565
588
  }
566
589
  ],
590
+ surfaces: [
591
+ {
592
+ id: 'website-journeys',
593
+ name: 'Website journeys',
594
+ description: 'string',
595
+ authentication: 'login',
596
+ token_ttl_seconds: 300,
597
+ data_access: { /* ... */ }
598
+ }
599
+ ],
567
600
  contact_identifiers_for_account: [
568
601
  {
569
602
  name: 'first_name',
@@ -622,6 +655,7 @@ const { data } = await client.upsertPortal(
622
655
  inactive_contract_cutoff_years: 0,
623
656
  is_dummy: true,
624
657
  is_v3_item: true,
658
+ published_revision_id: '2026-08-25T14:03:11.482Z-a7f3c1d9',
625
659
  portal_id: '453ad7bf-86d5-46c8-8252-bcc868df5e3c',
626
660
  portal_sk_v3: 'PORTAL_CONFIG#453ad7bf-86d5-46c8-8252-bcc868df5e3c',
627
661
  origin: 'string',
@@ -802,6 +836,16 @@ const { data } = await client.upsertPortal(
802
836
  "schema": "contract"
803
837
  }
804
838
  ],
839
+ "surfaces": [
840
+ {
841
+ "id": "website-journeys",
842
+ "name": "Website journeys",
843
+ "description": "string",
844
+ "authentication": "login",
845
+ "token_ttl_seconds": 300,
846
+ "data_access": {}
847
+ }
848
+ ],
805
849
  "contact_identifiers_for_account": [
806
850
  {
807
851
  "name": "first_name",
@@ -860,6 +904,7 @@ const { data } = await client.upsertPortal(
860
904
  "inactive_contract_cutoff_years": 0,
861
905
  "is_dummy": true,
862
906
  "is_v3_item": true,
907
+ "published_revision_id": "2026-08-25T14:03:11.482Z-a7f3c1d9",
863
908
  "portal_id": "453ad7bf-86d5-46c8-8252-bcc868df5e3c",
864
909
  "portal_sk_v3": "PORTAL_CONFIG#453ad7bf-86d5-46c8-8252-bcc868df5e3c",
865
910
  "origin": "string",
@@ -1178,6 +1223,16 @@ const { data } = await client.getPortalConfigByDomain({
1178
1223
  "schema": "contract"
1179
1224
  }
1180
1225
  ],
1226
+ "surfaces": [
1227
+ {
1228
+ "id": "website-journeys",
1229
+ "name": "Website journeys",
1230
+ "description": "string",
1231
+ "authentication": "login",
1232
+ "token_ttl_seconds": 300,
1233
+ "data_access": {}
1234
+ }
1235
+ ],
1181
1236
  "contact_identifiers_for_account": [
1182
1237
  {
1183
1238
  "name": "first_name",
@@ -1236,6 +1291,7 @@ const { data } = await client.getPortalConfigByDomain({
1236
1291
  "inactive_contract_cutoff_years": 0,
1237
1292
  "is_dummy": true,
1238
1293
  "is_v3_item": true,
1294
+ "published_revision_id": "2026-08-25T14:03:11.482Z-a7f3c1d9",
1239
1295
  "portal_id": "453ad7bf-86d5-46c8-8252-bcc868df5e3c",
1240
1296
  "portal_sk_v3": "PORTAL_CONFIG#453ad7bf-86d5-46c8-8252-bcc868df5e3c",
1241
1297
  "origin": "string",
@@ -1457,6 +1513,16 @@ const { data } = await client.getPortalConfig({
1457
1513
  "schema": "contract"
1458
1514
  }
1459
1515
  ],
1516
+ "surfaces": [
1517
+ {
1518
+ "id": "website-journeys",
1519
+ "name": "Website journeys",
1520
+ "description": "string",
1521
+ "authentication": "login",
1522
+ "token_ttl_seconds": 300,
1523
+ "data_access": {}
1524
+ }
1525
+ ],
1460
1526
  "contact_identifiers_for_account": [
1461
1527
  {
1462
1528
  "name": "first_name",
@@ -1515,6 +1581,7 @@ const { data } = await client.getPortalConfig({
1515
1581
  "inactive_contract_cutoff_years": 0,
1516
1582
  "is_dummy": true,
1517
1583
  "is_v3_item": true,
1584
+ "published_revision_id": "2026-08-25T14:03:11.482Z-a7f3c1d9",
1518
1585
  "portal_id": "453ad7bf-86d5-46c8-8252-bcc868df5e3c",
1519
1586
  "portal_sk_v3": "PORTAL_CONFIG#453ad7bf-86d5-46c8-8252-bcc868df5e3c",
1520
1587
  "origin": "string",
@@ -2629,6 +2696,16 @@ const { data } = await client.getPublicPortalConfig({
2629
2696
  "schema": "contract"
2630
2697
  }
2631
2698
  ],
2699
+ "surfaces": [
2700
+ {
2701
+ "id": "website-journeys",
2702
+ "name": "Website journeys",
2703
+ "description": "string",
2704
+ "authentication": "login",
2705
+ "token_ttl_seconds": 300,
2706
+ "data_access": {}
2707
+ }
2708
+ ],
2632
2709
  "contact_identifiers_for_account": [
2633
2710
  {
2634
2711
  "name": "first_name",
@@ -2687,6 +2764,7 @@ const { data } = await client.getPublicPortalConfig({
2687
2764
  "inactive_contract_cutoff_years": 0,
2688
2765
  "is_dummy": true,
2689
2766
  "is_v3_item": true,
2767
+ "published_revision_id": "2026-08-25T14:03:11.482Z-a7f3c1d9",
2690
2768
  "portal_id": "453ad7bf-86d5-46c8-8252-bcc868df5e3c",
2691
2769
  "portal_sk_v3": "PORTAL_CONFIG#453ad7bf-86d5-46c8-8252-bcc868df5e3c",
2692
2770
  "origin": "string",
@@ -2908,6 +2986,16 @@ const { data } = await client.getOrgPortalConfig({
2908
2986
  "schema": "contract"
2909
2987
  }
2910
2988
  ],
2989
+ "surfaces": [
2990
+ {
2991
+ "id": "website-journeys",
2992
+ "name": "Website journeys",
2993
+ "description": "string",
2994
+ "authentication": "login",
2995
+ "token_ttl_seconds": 300,
2996
+ "data_access": {}
2997
+ }
2998
+ ],
2911
2999
  "contact_identifiers_for_account": [
2912
3000
  {
2913
3001
  "name": "first_name",
@@ -2966,6 +3054,7 @@ const { data } = await client.getOrgPortalConfig({
2966
3054
  "inactive_contract_cutoff_years": 0,
2967
3055
  "is_dummy": true,
2968
3056
  "is_v3_item": true,
3057
+ "published_revision_id": "2026-08-25T14:03:11.482Z-a7f3c1d9",
2969
3058
  "portal_id": "453ad7bf-86d5-46c8-8252-bcc868df5e3c",
2970
3059
  "portal_sk_v3": "PORTAL_CONFIG#453ad7bf-86d5-46c8-8252-bcc868df5e3c",
2971
3060
  "origin": "string",
@@ -3196,6 +3285,16 @@ const { data } = await client.getPublicPortalConfigV3({
3196
3285
  "schema": "contract"
3197
3286
  }
3198
3287
  ],
3288
+ "surfaces": [
3289
+ {
3290
+ "id": "website-journeys",
3291
+ "name": "Website journeys",
3292
+ "description": "string",
3293
+ "authentication": "login",
3294
+ "token_ttl_seconds": 300,
3295
+ "data_access": {}
3296
+ }
3297
+ ],
3199
3298
  "contact_identifiers_for_account": [
3200
3299
  {
3201
3300
  "name": "first_name",
@@ -3254,6 +3353,7 @@ const { data } = await client.getPublicPortalConfigV3({
3254
3353
  "inactive_contract_cutoff_years": 0,
3255
3354
  "is_dummy": true,
3256
3355
  "is_v3_item": true,
3356
+ "published_revision_id": "2026-08-25T14:03:11.482Z-a7f3c1d9",
3257
3357
  "portal_id": "453ad7bf-86d5-46c8-8252-bcc868df5e3c",
3258
3358
  "portal_sk_v3": "PORTAL_CONFIG#453ad7bf-86d5-46c8-8252-bcc868df5e3c",
3259
3359
  "origin": "string",
@@ -3475,6 +3575,16 @@ const { data } = await client.getOrgPortalConfigV3({
3475
3575
  "schema": "contract"
3476
3576
  }
3477
3577
  ],
3578
+ "surfaces": [
3579
+ {
3580
+ "id": "website-journeys",
3581
+ "name": "Website journeys",
3582
+ "description": "string",
3583
+ "authentication": "login",
3584
+ "token_ttl_seconds": 300,
3585
+ "data_access": {}
3586
+ }
3587
+ ],
3478
3588
  "contact_identifiers_for_account": [
3479
3589
  {
3480
3590
  "name": "first_name",
@@ -3533,6 +3643,7 @@ const { data } = await client.getOrgPortalConfigV3({
3533
3643
  "inactive_contract_cutoff_years": 0,
3534
3644
  "is_dummy": true,
3535
3645
  "is_v3_item": true,
3646
+ "published_revision_id": "2026-08-25T14:03:11.482Z-a7f3c1d9",
3536
3647
  "portal_id": "453ad7bf-86d5-46c8-8252-bcc868df5e3c",
3537
3648
  "portal_sk_v3": "PORTAL_CONFIG#453ad7bf-86d5-46c8-8252-bcc868df5e3c",
3538
3649
  "origin": "string",
@@ -3633,6 +3744,7 @@ const { data } = await client.getAllPortalConfigs()
3633
3744
  "contract_identifiers": [],
3634
3745
  "contract_selector_config": {},
3635
3746
  "registration_identifiers": [],
3747
+ "surfaces": [],
3636
3748
  "contact_identifiers_for_account": [],
3637
3749
  "additional_contact_attributes": [],
3638
3750
  "triggered_journeys": [],
@@ -3643,6 +3755,7 @@ const { data } = await client.getAllPortalConfigs()
3643
3755
  "inactive_contract_cutoff_years": 0,
3644
3756
  "is_dummy": true,
3645
3757
  "is_v3_item": true,
3758
+ "published_revision_id": "2026-08-25T14:03:11.482Z-a7f3c1d9",
3646
3759
  "portal_id": "453ad7bf-86d5-46c8-8252-bcc868df5e3c",
3647
3760
  "portal_sk_v3": "PORTAL_CONFIG#453ad7bf-86d5-46c8-8252-bcc868df5e3c",
3648
3761
  "origin": "string",
@@ -4768,6 +4881,55 @@ const { data } = await client.checkContactExistsV3(
4768
4881
 
4769
4882
  ---
4770
4883
 
4884
+ ### `identifyContact`
4885
+
4886
+ Identify a contact by the portal's configured registration identifiers and, on a match,
4887
+ issue a short-lived bearer token that acts as that contact.
4888
+
4889
+ `POST /v3/portal/public/contact/identify`
4890
+
4891
+ ```ts
4892
+ const { data } = await client.identifyContact(
4893
+ {
4894
+ portal_id: 'example',
4895
+ domain: 'example',
4896
+ },
4897
+ {
4898
+ org_id: 728,
4899
+ registration_identifiers: {
4900
+ contact: {
4901
+ email: 'john.doe@example.com'
4902
+ },
4903
+ contract: {
4904
+ contract_number: '123456'
4905
+ }
4906
+ },
4907
+ trigger_identifiers_check: true,
4908
+ surface_id: 'website-journeys'
4909
+ },
4910
+ )
4911
+ ```
4912
+
4913
+ <details>
4914
+ <summary>Response</summary>
4915
+
4916
+ ```json
4917
+ {
4918
+ "contact_id": "5da0a718-c822-403d-9f5d-20d4584e0528",
4919
+ "account_id": "5da0a718-c822-403d-9f5d-20d4584e0528",
4920
+ "token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
4921
+ "token_type": "contact_identification",
4922
+ "surface_id": "website-journeys",
4923
+ "expires_at": "2026-08-11T10:35:00.000Z",
4924
+ "allowed_operations": [],
4925
+ "reason": "TIMEOUT"
4926
+ }
4927
+ ```
4928
+
4929
+ </details>
4930
+
4931
+ ---
4932
+
4771
4933
  ### `checkAccountExists`
4772
4934
 
4773
4935
  True if account with given identifiers exists.
@@ -6722,9 +6884,19 @@ const { data } = await client.getEntityPortalWorkflows({
6722
6884
  "assigned_to": ["string"],
6723
6885
  "phase_id": "string",
6724
6886
  "phase_name": "string",
6887
+ "stage_id": "string",
6725
6888
  "completed_at": "string",
6726
6889
  "updated_at": "string"
6727
6890
  }
6891
+ ],
6892
+ "stages": [
6893
+ {
6894
+ "id": "string",
6895
+ "name": "string",
6896
+ "description": "string",
6897
+ "status": "COMPLETED",
6898
+ "completed_at": "string"
6899
+ }
6728
6900
  ]
6729
6901
  }
6730
6902
  ]
@@ -6823,9 +6995,19 @@ const { data } = await client.getEntityPortalWorkflowsBatch(
6823
6995
  "assigned_to": ["string"],
6824
6996
  "phase_id": "string",
6825
6997
  "phase_name": "string",
6998
+ "stage_id": "string",
6826
6999
  "completed_at": "string",
6827
7000
  "updated_at": "string"
6828
7001
  }
7002
+ ],
7003
+ "stages": [
7004
+ {
7005
+ "id": "string",
7006
+ "name": "string",
7007
+ "description": "string",
7008
+ "status": "COMPLETED",
7009
+ "completed_at": "string"
7010
+ }
6829
7011
  ]
6830
7012
  }
6831
7013
  ]
@@ -7079,6 +7261,57 @@ const { data } = await client.getSSOProvider({
7079
7261
 
7080
7262
  ---
7081
7263
 
7264
+ ### `getPublicSSOProviderV3`
7265
+
7266
+ Returns the public configuration of a single SSO identity provider with env var
7267
+ placeholders (incl. secrets) already resolved against the organization's environment.
7268
+
7269
+ `GET /v3/portal/public/sso/providers/{provider_slug}`
7270
+
7271
+ ```ts
7272
+ const { data } = await client.getPublicSSOProviderV3({
7273
+ provider_slug: 'example',
7274
+ org_id: 'example',
7275
+ portal_id: 'example',
7276
+ })
7277
+ ```
7278
+
7279
+ <details>
7280
+ <summary>Response</summary>
7281
+
7282
+ ```json
7283
+ {
7284
+ "slug": "office-365-login",
7285
+ "display_name": "Office 365 Login",
7286
+ "oidc_config": {
7287
+ "type": "implicit",
7288
+ "oidc_issuer": "https://login.microsoftonline.com/33d4f3e5-3df2-421e-b92e-a63cfa680a88/v2.0",
7289
+ "redirect_uri": "https://customer-portal.com/login",
7290
+ "client_id": "ab81daf8-8b1f-42d6-94ca-c51621054c75",
7291
+ "client_secret": "7BIUnn~6shh.7fNtXb..3k1Mp3s6k6WK3B",
7292
+ "has_client_secret": true,
7293
+ "scope": "openid email",
7294
+ "metadata": {
7295
+ "response_modes_supported": ["form_post"],
7296
+ "authorization_endpoint": "https://www.facebook.com/v12.0/dialog/oauth",
7297
+ "token_endpoint": "https://graph.facebook.com/v12.0/oauth/access_token",
7298
+ "userinfo_endpoint": "https://graph.facebook.com/me",
7299
+ "logout_uri": "https://login.microsoftonline.com/common/oauth2/v2.0/logout",
7300
+ "logout_redirect_uri": "https://customer-portal.com/login",
7301
+ "skip_login_as_logout": false,
7302
+ "mobile_redirect_uri": "msauth.io.epilot.ecp://auth",
7303
+ "test_auth_username": "test@epilot.io",
7304
+ "test_auth_password": "string"
7305
+ },
7306
+ "prompt": "login"
7307
+ }
7308
+ }
7309
+ ```
7310
+
7311
+ </details>
7312
+
7313
+ ---
7314
+
7082
7315
  ### `ssoLogin`
7083
7316
 
7084
7317
  Initiate login using external SSO identity.
@@ -7127,7 +7360,8 @@ const { data } = await client.ssoLoginV3(
7127
7360
  contact_id: 'example',
7128
7361
  },
7129
7362
  {
7130
- provider_slug: 'office-365-login'
7363
+ provider_slug: 'office-365-login',
7364
+ login_only: false
7131
7365
  },
7132
7366
  )
7133
7367
  ```
@@ -8416,6 +8650,16 @@ const { data } = await client.createPortalConfig(
8416
8650
  schema: 'contract'
8417
8651
  }
8418
8652
  ],
8653
+ surfaces: [
8654
+ {
8655
+ id: 'website-journeys',
8656
+ name: 'Website journeys',
8657
+ description: 'string',
8658
+ authentication: 'login',
8659
+ token_ttl_seconds: 300,
8660
+ data_access: { /* ... */ }
8661
+ }
8662
+ ],
8419
8663
  contact_identifiers_for_account: [
8420
8664
  {
8421
8665
  name: 'first_name',
@@ -8474,6 +8718,7 @@ const { data } = await client.createPortalConfig(
8474
8718
  inactive_contract_cutoff_years: 0,
8475
8719
  is_dummy: true,
8476
8720
  is_v3_item: true,
8721
+ published_revision_id: '2026-08-25T14:03:11.482Z-a7f3c1d9',
8477
8722
  portal_id: '453ad7bf-86d5-46c8-8252-bcc868df5e3c',
8478
8723
  portal_sk_v3: 'PORTAL_CONFIG#453ad7bf-86d5-46c8-8252-bcc868df5e3c',
8479
8724
  origin: 'string',
@@ -8696,6 +8941,16 @@ const { data } = await client.createPortalConfig(
8696
8941
  "schema": "contract"
8697
8942
  }
8698
8943
  ],
8944
+ "surfaces": [
8945
+ {
8946
+ "id": "website-journeys",
8947
+ "name": "Website journeys",
8948
+ "description": "string",
8949
+ "authentication": "login",
8950
+ "token_ttl_seconds": 300,
8951
+ "data_access": {}
8952
+ }
8953
+ ],
8699
8954
  "contact_identifiers_for_account": [
8700
8955
  {
8701
8956
  "name": "first_name",
@@ -8754,6 +9009,7 @@ const { data } = await client.createPortalConfig(
8754
9009
  "inactive_contract_cutoff_years": 0,
8755
9010
  "is_dummy": true,
8756
9011
  "is_v3_item": true,
9012
+ "published_revision_id": "2026-08-25T14:03:11.482Z-a7f3c1d9",
8757
9013
  "portal_id": "453ad7bf-86d5-46c8-8252-bcc868df5e3c",
8758
9014
  "portal_sk_v3": "PORTAL_CONFIG#453ad7bf-86d5-46c8-8252-bcc868df5e3c",
8759
9015
  "origin": "string",
@@ -9012,6 +9268,16 @@ const { data } = await client.getPortalConfigV3({
9012
9268
  "schema": "contract"
9013
9269
  }
9014
9270
  ],
9271
+ "surfaces": [
9272
+ {
9273
+ "id": "website-journeys",
9274
+ "name": "Website journeys",
9275
+ "description": "string",
9276
+ "authentication": "login",
9277
+ "token_ttl_seconds": 300,
9278
+ "data_access": {}
9279
+ }
9280
+ ],
9015
9281
  "contact_identifiers_for_account": [
9016
9282
  {
9017
9283
  "name": "first_name",
@@ -9070,6 +9336,7 @@ const { data } = await client.getPortalConfigV3({
9070
9336
  "inactive_contract_cutoff_years": 0,
9071
9337
  "is_dummy": true,
9072
9338
  "is_v3_item": true,
9339
+ "published_revision_id": "2026-08-25T14:03:11.482Z-a7f3c1d9",
9073
9340
  "portal_id": "453ad7bf-86d5-46c8-8252-bcc868df5e3c",
9074
9341
  "portal_sk_v3": "PORTAL_CONFIG#453ad7bf-86d5-46c8-8252-bcc868df5e3c",
9075
9342
  "origin": "string",
@@ -9325,6 +9592,16 @@ const { data } = await client.putPortalConfig(
9325
9592
  schema: 'contract'
9326
9593
  }
9327
9594
  ],
9595
+ surfaces: [
9596
+ {
9597
+ id: 'website-journeys',
9598
+ name: 'Website journeys',
9599
+ description: 'string',
9600
+ authentication: 'login',
9601
+ token_ttl_seconds: 300,
9602
+ data_access: { /* ... */ }
9603
+ }
9604
+ ],
9328
9605
  contact_identifiers_for_account: [
9329
9606
  {
9330
9607
  name: 'first_name',
@@ -9383,6 +9660,7 @@ const { data } = await client.putPortalConfig(
9383
9660
  inactive_contract_cutoff_years: 0,
9384
9661
  is_dummy: true,
9385
9662
  is_v3_item: true,
9663
+ published_revision_id: '2026-08-25T14:03:11.482Z-a7f3c1d9',
9386
9664
  portal_id: '453ad7bf-86d5-46c8-8252-bcc868df5e3c',
9387
9665
  portal_sk_v3: 'PORTAL_CONFIG#453ad7bf-86d5-46c8-8252-bcc868df5e3c',
9388
9666
  origin: 'string',
@@ -9626,6 +9904,16 @@ const { data } = await client.putPortalConfig(
9626
9904
  "schema": "contract"
9627
9905
  }
9628
9906
  ],
9907
+ "surfaces": [
9908
+ {
9909
+ "id": "website-journeys",
9910
+ "name": "Website journeys",
9911
+ "description": "string",
9912
+ "authentication": "login",
9913
+ "token_ttl_seconds": 300,
9914
+ "data_access": {}
9915
+ }
9916
+ ],
9629
9917
  "contact_identifiers_for_account": [
9630
9918
  {
9631
9919
  "name": "first_name",
@@ -9684,6 +9972,7 @@ const { data } = await client.putPortalConfig(
9684
9972
  "inactive_contract_cutoff_years": 0,
9685
9973
  "is_dummy": true,
9686
9974
  "is_v3_item": true,
9975
+ "published_revision_id": "2026-08-25T14:03:11.482Z-a7f3c1d9",
9687
9976
  "portal_id": "453ad7bf-86d5-46c8-8252-bcc868df5e3c",
9688
9977
  "portal_sk_v3": "PORTAL_CONFIG#453ad7bf-86d5-46c8-8252-bcc868df5e3c",
9689
9978
  "origin": "string",
@@ -9750,132 +10039,680 @@ const { data } = await client.deletePortalConfig({
9750
10039
 
9751
10040
  ---
9752
10041
 
9753
- ### `listAllPortalConfigs`
9754
-
9755
- Retrieves all portal configurations.
9756
-
9757
- `GET /v3/portal/configs`
9758
-
9759
- ```ts
9760
- const { data } = await client.listAllPortalConfigs()
9761
- ```
9762
-
9763
- <details>
9764
- <summary>Response</summary>
9765
-
9766
- ```json
9767
- {
9768
- "data": [
9769
- {
9770
- "entity_actions": [],
9771
- "extensions": [],
9772
- "extension_hooks": {},
9773
- "default_user_to_notify": {},
9774
- "identity_providers": [],
9775
- "mobile_config": {},
9776
- "enabled": true,
9777
- "name": "Installer Portal",
9778
- "domain": "abc.com",
9779
- "is_epilot_domain": true,
9780
- "epilot_domain": "example-portal-1.ecp.epilot.io",
9781
- "domain_settings": {},
9782
- "design_id": "5da0a718-c822-403d-9f5d-20d4584e0528",
9783
- "allowed_portal_entities": ["contact", "contract"],
9784
- "self_registration_setting": "ALLOW_WITH_CONTACT_CREATION",
9785
- "self_registration_account_setting": "ALLOW_WITH_CREATION",
9786
- "block_registration_if_portal_user_exists": true,
9787
- "self_registration_entity": "contact",
9788
- "user_account_self_management": false,
9789
- "feature_settings": {},
9790
- "accessToken": "string",
9791
- "advanced_mfa": {},
9792
- "auth_settings": {},
9793
- "cognito_details": {},
9794
- "config": "string",
9795
- "contact_identifiers": ["email", "last_name"],
9796
- "approval_state_attributes": {},
9797
- "email_templates": {},
9798
- "images": {},
9799
- "entity_identifiers": {},
9800
- "contract_identifiers": [],
9801
- "contract_selector_config": {},
9802
- "registration_identifiers": [],
9803
- "contact_identifiers_for_account": [],
9804
- "additional_contact_attributes": [],
9805
- "triggered_journeys": [],
9806
- "entity_edit_rules": [],
9807
- "allowed_file_extensions": {},
9808
- "prevent_search_engine_indexing": true,
9809
- "meter_reading_grace_period": 0,
9810
- "inactive_contract_cutoff_years": 0,
9811
- "is_dummy": true,
9812
- "is_v3_item": true,
9813
- "portal_id": "453ad7bf-86d5-46c8-8252-bcc868df5e3c",
9814
- "portal_sk_v3": "PORTAL_CONFIG#453ad7bf-86d5-46c8-8252-bcc868df5e3c",
9815
- "origin": "string",
9816
- "global_blocks": {},
9817
- "organization_id": 12345,
9818
- "org_settings": {},
9819
- "feature_flags": {},
9820
- "grants": [],
9821
- "pages": []
9822
- }
9823
- ]
9824
- }
9825
- ```
9826
-
9827
- </details>
9828
-
9829
- ---
9830
-
9831
- ### `swapPortalConfig`
10042
+ ### `createPortalRevision`
9832
10043
 
9833
- Swaps the portal configuration of two portals.
10044
+ Creates a new revision — a complete, immutable snapshot of the portal's configuration, pages and email templates. Nothing about the live portal changes; the snapshot only becomes live when it is publi
9834
10045
 
9835
- `POST /v3/portal/config/swap`
10046
+ `POST /v3/portal/config/{portal_id}/revisions`
9836
10047
 
9837
10048
  ```ts
9838
- const { data } = await client.swapPortalConfig(
9839
- null,
10049
+ const { data } = await client.createPortalRevision(
9840
10050
  {
9841
- source_portal_id: '453ad7bf-86d5-46c8-8252-bcc868df5e3c',
9842
- target_portal_id: '453ad7bf-86d5-46c8-8252-bcc868df5e3c',
9843
- items_to_swap: ['email_templates']
10051
+ portal_id: 'example',
9844
10052
  },
9845
- )
9846
- ```
9847
-
9848
- <details>
9849
- <summary>Response</summary>
9850
-
9851
- ```json
9852
- {
9853
- "message": "Domain and users swapped successfully."
9854
- }
9855
- ```
9856
-
9857
- </details>
9858
-
9859
- ---
9860
-
9861
- ### `clonePortalConfig`
9862
-
9863
- Creates a new portal by cloning configuration and pages from an existing portal. The new portal gets its own domain, users, email templates, and authentication settings.
9864
-
9865
- `POST /v3/portal/config/clone`
9866
-
9867
- ```ts
9868
- const { data } = await client.clonePortalConfig(
9869
- null,
9870
10053
  {
9871
- source_portal_id: '453ad7bf-86d5-46c8-8252-bcc868df5e3c',
9872
- name: 'string'
9873
- },
9874
- )
9875
- ```
9876
-
9877
- <details>
9878
- <summary>Response</summary>
10054
+ entity_actions: [
10055
+ {
10056
+ journey_id: '5da0a718-c822-403d-9f5d-20d4584e0528',
10057
+ slug: 'contact',
10058
+ action_Label: { /* ... */ }
10059
+ }
10060
+ ],
10061
+ extensions: [
10062
+ {
10063
+ id: 'string',
10064
+ status: 'installed',
10065
+ options: {}
10066
+ }
10067
+ ],
10068
+ extension_hooks: {},
10069
+ default_user_to_notify: {
10070
+ onPendingUser: [
10071
+ { /* ... */ }
10072
+ ]
10073
+ },
10074
+ identity_providers: [
10075
+ {
10076
+ slug: 'office-365-login',
10077
+ display_name: 'Office 365 Login',
10078
+ provider_type: 'OIDC',
10079
+ attribute_mappings: { /* ... */ },
10080
+ entity_matching: { /* ... */ },
10081
+ oidc_config: { /* ... */ },
10082
+ mobile_oidc_config: { /* ... */ },
10083
+ expose_client_secret: false
10084
+ }
10085
+ ],
10086
+ mobile_config: {
10087
+ portal_id: 'string',
10088
+ enabled: true,
10089
+ display_name: 'string',
10090
+ app_host: 'string',
10091
+ environment: 'prod',
10092
+ branding: {
10093
+ app_icon: 'string',
10094
+ splash: 'string',
10095
+ splash_dark: 'string',
10096
+ icon_background_color: 'string',
10097
+ splash_background_color: 'string',
10098
+ splash_background_color_dark: 'string'
10099
+ },
10100
+ ios: {
10101
+ bundle_id: 'string',
10102
+ team_id: 'string',
10103
+ credentials_status: 'not_configured',
10104
+ app_store_id: 'string',
10105
+ store_url: 'string',
10106
+ last_build: { /* ... */ }
10107
+ },
10108
+ android: {
10109
+ package_name: 'string',
10110
+ credentials_status: 'not_configured',
10111
+ upload_key_status: 'not_configured',
10112
+ store_url: 'string',
10113
+ last_build: { /* ... */ }
10114
+ },
10115
+ ota: {
10116
+ enabled: true,
10117
+ channel: 'canary',
10118
+ auto_update: true,
10119
+ update_strategy: 'next-launch',
10120
+ min_native_version: 'string'
10121
+ }
10122
+ },
10123
+ enabled: true,
10124
+ name: 'Installer Portal',
10125
+ domain: 'abc.com',
10126
+ is_epilot_domain: true,
10127
+ epilot_domain: 'example-portal-1.ecp.epilot.io',
10128
+ domain_settings: {
10129
+ is_custom_domain_enabled: true,
10130
+ is_epilot_domain_enabled: true,
10131
+ is_redirection_enabled: true
10132
+ },
10133
+ design_id: '5da0a718-c822-403d-9f5d-20d4584e0528',
10134
+ allowed_portal_entities: ['contact', 'contract'],
10135
+ self_registration_setting: 'ALLOW_WITH_CONTACT_CREATION',
10136
+ self_registration_account_setting: 'ALLOW_WITH_CREATION',
10137
+ block_registration_if_portal_user_exists: true,
10138
+ self_registration_entity: 'contact',
10139
+ user_account_self_management: false,
10140
+ feature_settings: {
10141
+ start_page: true,
10142
+ billing: true,
10143
+ change_due_date: true,
10144
+ new_design: true,
10145
+ mcp_enabled: true,
10146
+ mcp_grant_version: 0
10147
+ },
10148
+ accessToken: 'string',
10149
+ advanced_mfa: {
10150
+ enabled: true
10151
+ },
10152
+ auth_settings: {
10153
+ passwordless_login: {
10154
+ enabled: true
10155
+ },
10156
+ entry_point: 'PASSWORD',
10157
+ preferred_sso_providers: ['office-365-login'],
10158
+ auto_redirect_to_sso: true,
10159
+ prevent_user_enumeration: true
10160
+ },
10161
+ cognito_details: {
10162
+ cognito_user_pool_client_id: '6bsd0jkgoie74k2i8mrhc1vest',
10163
+ cognito_user_pool_arn: 'arn:aws:cognito-idp:us-east-1:123412341234:userpool/us-east-1_123412341',
10164
+ cognito_user_pool_id: 'eu-central-1_CUEQRNbUb',
10165
+ timeouts: {
10166
+ refresh_token: 300,
10167
+ access_token: 300,
10168
+ id_token: 300
10169
+ },
10170
+ advanced_authentication: {
10171
+ user_activity_logging: true,
10172
+ adaptive_authentication: true,
10173
+ compromised_credentials_detection: true
10174
+ },
10175
+ password_policy: {
10176
+ minimum_length: 8,
10177
+ maximum_length: 256,
10178
+ require_lowercase: true,
10179
+ require_uppercase: true,
10180
+ require_numbers: true,
10181
+ require_symbols: true,
10182
+ password_history_size: 3
10183
+ }
10184
+ },
10185
+ config: 'string',
10186
+ contact_identifiers: ['email', 'last_name'],
10187
+ approval_state_attributes: {
10188
+ contact: ['name', 'address'],
10189
+ contract: ['installment_amount']
10190
+ },
10191
+ email_templates: {
10192
+ confirmAccount: '5da0a718-c822-403d-9f5d-20d4584e0528',
10193
+ advancedAuth: '5da0a718-c822-403d-9f5d-20d4584e0528',
10194
+ advancedMFA: '5da0a718-c822-403d-9f5d-20d4584e0528',
10195
+ journeySignUp: '5da0a718-c822-403d-9f5d-20d4584e0528',
10196
+ journeySignInOneTimePassword: '5da0a718-c822-403d-9f5d-20d4584e0528',
10197
+ journeyLoginOTP: '5da0a718-c822-403d-9f5d-20d4584e0528',
10198
+ forgotPassword: '5da0a718-c822-403d-9f5d-20d4584e0528',
10199
+ invitation: '5da0a718-c822-403d-9f5d-20d4584e0528',
10200
+ partnerInvitation: '5da0a718-c822-403d-9f5d-20d4584e0528',
10201
+ onNewQuote: '5da0a718-c822-403d-9f5d-20d4584e0528',
10202
+ onMapAPendingUser: '5da0a718-c822-403d-9f5d-20d4584e0528',
10203
+ onDocUpload: '5da0a718-c822-403d-9f5d-20d4584e0528',
10204
+ onWorkflowStepAssigned: '5da0a718-c822-403d-9f5d-20d4584e0528',
10205
+ confirmEmailUpdate: '5da0a718-c822-403d-9f5d-20d4584e0528',
10206
+ verifyCodeToSetPassword: '5da0a718-c822-403d-9f5d-20d4584e0528'
10207
+ },
10208
+ images: {
10209
+ orderLeftTeaser: 'https://epilot-bucket.s3.eu-central-1.amazonaws.com/12344/6538fddb-f0e9-4f0f-af51-6e57891ff20a/order-left-teaser.jpeg',
10210
+ orderRightTeaser: 'https://epilot-bucket.s3.eu-central-1.amazonaws.com/12344/6538fddb-f0e9-4f0f-af51-6e57891ff20a/order-right-teaser.jpeg',
10211
+ welcomeBanner: 'https://epilot-bucket.s3.eu-central-1.amazonaws.com/12344/6538fddb-f0e9-4f0f-af51-6e57891ff20a/welcome-banner.jpeg'
10212
+ },
10213
+ entity_identifiers: {
10214
+ type: {
10215
+ isEnabled: true,
10216
+ attributes: ['contract_number']
10217
+ }
10218
+ },
10219
+ contract_identifiers: [
10220
+ {
10221
+ name: 'email',
10222
+ schema: 'contact'
10223
+ },
10224
+ {
10225
+ name: 'last_name',
10226
+ schema: 'contact'
10227
+ },
10228
+ /* ... 1 more */
10229
+ ],
10230
+ contract_selector_config: {
10231
+ show_inactive: true,
10232
+ title_path: 'string'
10233
+ },
10234
+ registration_identifiers: [
10235
+ {
10236
+ name: 'last_name',
10237
+ schema: 'contact'
10238
+ },
10239
+ {
10240
+ name: 'contract_number',
10241
+ schema: 'contract'
10242
+ }
10243
+ ],
10244
+ surfaces: [
10245
+ {
10246
+ id: 'website-journeys',
10247
+ name: 'Website journeys',
10248
+ description: 'string',
10249
+ authentication: 'login',
10250
+ token_ttl_seconds: 300,
10251
+ data_access: { /* ... */ }
10252
+ }
10253
+ ],
10254
+ contact_identifiers_for_account: [
10255
+ {
10256
+ name: 'first_name',
10257
+ schema: 'contact'
10258
+ },
10259
+ {
10260
+ name: 'last_name',
10261
+ schema: 'contact'
10262
+ }
10263
+ ],
10264
+ additional_contact_attributes: [
10265
+ {
10266
+ name: 'first_name',
10267
+ required: true
10268
+ },
10269
+ {
10270
+ name: 'last_name',
10271
+ required: true
10272
+ }
10273
+ ],
10274
+ triggered_journeys: [
10275
+ {
10276
+ trigger_name: 'FIRST_LOGIN',
10277
+ journey_id: '5da0a718-c822-403d-9f5d-20d4584e0528',
10278
+ context_params: [ /* ... */ ]
10279
+ }
10280
+ ],
10281
+ entity_edit_rules: [
10282
+ {
10283
+ slug: 'contact',
10284
+ attribute: 'first_name',
10285
+ rule_type: 'cadence',
10286
+ cadence_period_type: 'days',
10287
+ cadence_period: 1,
10288
+ changes_allowed: 1,
10289
+ grace_period: 1,
10290
+ allowed_increment: '10%',
10291
+ allowed_decrement: '10%',
10292
+ number_of_days_before_restriction: 10
10293
+ }
10294
+ ],
10295
+ allowed_file_extensions: {
10296
+ document: ['pdf'],
10297
+ image: ['jpg'],
10298
+ spreadsheet: ['xls'],
10299
+ presentation: ['ppt'],
10300
+ audioVideo: ['mp4'],
10301
+ email: ['eml'],
10302
+ archive: ['zip'],
10303
+ cad: ['cad'],
10304
+ calendar: ['ics'],
10305
+ other: ['txt']
10306
+ },
10307
+ prevent_search_engine_indexing: true,
10308
+ meter_reading_grace_period: 0,
10309
+ inactive_contract_cutoff_years: 0,
10310
+ is_dummy: true,
10311
+ is_v3_item: true,
10312
+ published_revision_id: '2026-08-25T14:03:11.482Z-a7f3c1d9',
10313
+ portal_id: '453ad7bf-86d5-46c8-8252-bcc868df5e3c',
10314
+ portal_sk_v3: 'PORTAL_CONFIG#453ad7bf-86d5-46c8-8252-bcc868df5e3c',
10315
+ origin: 'string',
10316
+ global_blocks: {},
10317
+ based_on_revision_id: 'string',
10318
+ pages: [
10319
+ {
10320
+ id: 'c495fef9-eeca-4019-a989-8390dcd9825b',
10321
+ slug: 'dashboard',
10322
+ order: 0,
10323
+ blocks: {}
10324
+ }
10325
+ ]
10326
+ },
10327
+ )
10328
+ ```
10329
+
10330
+ <details>
10331
+ <summary>Response</summary>
10332
+
10333
+ ```json
10334
+ {
10335
+ "revision_id": "2026-08-25T14:03:11.482Z-a7f3c1d9",
10336
+ "created_at": "1970-01-01T00:00:00.000Z",
10337
+ "created_by": "string",
10338
+ "name": "FAQ page launch",
10339
+ "description": "string",
10340
+ "page_count": 0,
10341
+ "published_at": "1970-01-01T00:00:00.000Z",
10342
+ "published_by": "string",
10343
+ "is_published": true,
10344
+ "identity_providers": [
10345
+ {
10346
+ "slug": "office-365-login",
10347
+ "display_name": "Office 365 Login",
10348
+ "provider_type": "OIDC",
10349
+ "attribute_mappings": {
10350
+ "contact": {
10351
+ "email": "email",
10352
+ "first_name": "first_name",
10353
+ "last_name": "last_name",
10354
+ "phone": "tel",
10355
+ "preferred_language": "language",
10356
+ "concession": "GPE",
10357
+ "installer_number": 123456
10358
+ },
10359
+ "account": {
10360
+ "name": "company_name",
10361
+ "street": "street_name",
10362
+ "house_number": "house_number",
10363
+ "postal_code": "postal_code",
10364
+ "city": "city"
10365
+ },
10366
+ "portal_user": {
10367
+ "access_status": "access_status",
10368
+ "expires_at": "expires_at"
10369
+ },
10370
+ "concession_attributes": {
10371
+ "water": "water",
10372
+ "energy": "energy",
10373
+ "gas": "gas"
10374
+ }
10375
+ },
10376
+ "entity_matching": {
10377
+ "portal_user": {
10378
+ "external_id": "sub"
10379
+ },
10380
+ "contact": {
10381
+ "customer_number": "customer_id",
10382
+ "external_id": "sub"
10383
+ },
10384
+ "auto_create_cognito_user": true
10385
+ },
10386
+ "oidc_config": {
10387
+ "type": "implicit",
10388
+ "oidc_issuer": "https://login.microsoftonline.com/33d4f3e5-3df2-421e-b92e-a63cfa680a88/v2.0",
10389
+ "redirect_uri": "https://customer-portal.com/login",
10390
+ "client_id": "ab81daf8-8b1f-42d6-94ca-c51621054c75",
10391
+ "client_secret": "7BIUnn~6shh.7fNtXb..3k1Mp3s6k6WK3B",
10392
+ "has_client_secret": true,
10393
+ "scope": "openid email",
10394
+ "metadata": {
10395
+ "response_modes_supported": ["form_post"],
10396
+ "authorization_endpoint": "https://www.facebook.com/v12.0/dialog/oauth",
10397
+ "token_endpoint": "https://graph.facebook.com/v12.0/oauth/access_token",
10398
+ "userinfo_endpoint": "https://graph.facebook.com/me",
10399
+ "logout_uri": "https://login.microsoftonline.com/common/oauth2/v2.0/logout",
10400
+ "logout_redirect_uri": "https://customer-portal.com/login",
10401
+ "skip_login_as_logout": false,
10402
+ "mobile_redirect_uri": "msauth.io.epilot.ecp://auth",
10403
+ "test_auth_username": "test@epilot.io",
10404
+ "test_auth_password": "string"
10405
+ },
10406
+ "prompt": "login"
10407
+ },
10408
+ "mobile_oidc_config": {
10409
+ "client_id": 123456,
10410
+ "client_secret": 123456
10411
+ },
10412
+ "expose_client_secret": false
10413
+ }
10414
+ ]
10415
+ }
10416
+ ```
10417
+
10418
+ </details>
10419
+
10420
+ ---
10421
+
10422
+ ### `listPortalRevisions`
10423
+
10424
+ Lists a portal's revision history, newest first. Metadata only — no config blob, no page bodies. `is_published` says whether that revision is the one currently live, which is a different question from
10425
+
10426
+ `GET /v3/portal/config/{portal_id}/revisions`
10427
+
10428
+ ```ts
10429
+ const { data } = await client.listPortalRevisions({
10430
+ portal_id: 'example',
10431
+ limit: 1,
10432
+ cursor: 'example',
10433
+ })
10434
+ ```
10435
+
10436
+ <details>
10437
+ <summary>Response</summary>
10438
+
10439
+ ```json
10440
+ {
10441
+ "results": [
10442
+ {
10443
+ "revision_id": "2026-08-25T14:03:11.482Z-a7f3c1d9",
10444
+ "created_at": "1970-01-01T00:00:00.000Z",
10445
+ "created_by": "string",
10446
+ "name": "FAQ page launch",
10447
+ "description": "string",
10448
+ "page_count": 0,
10449
+ "published_at": "1970-01-01T00:00:00.000Z",
10450
+ "published_by": "string",
10451
+ "is_published": true
10452
+ }
10453
+ ],
10454
+ "next_cursor": "string"
10455
+ }
10456
+ ```
10457
+
10458
+ </details>
10459
+
10460
+ ---
10461
+
10462
+ ### `getPortalRevision`
10463
+
10464
+ Returns the full content of one revision: the snapshotted config, its pages (in the live `Page` shape), email templates and identity providers with secrets redacted.
10465
+
10466
+ `GET /v3/portal/config/{portal_id}/revisions/{revision_id}`
10467
+
10468
+ ```ts
10469
+ const { data } = await client.getPortalRevision({
10470
+ portal_id: 'example',
10471
+ revision_id: 'example',
10472
+ })
10473
+ ```
10474
+
10475
+ <details>
10476
+ <summary>Response</summary>
10477
+
10478
+ ```json
10479
+ {
10480
+ "revision_id": "2026-08-25T14:03:11.482Z-a7f3c1d9",
10481
+ "created_at": "1970-01-01T00:00:00.000Z",
10482
+ "created_by": "string",
10483
+ "name": "FAQ page launch",
10484
+ "description": "string",
10485
+ "page_count": 0,
10486
+ "published_at": "1970-01-01T00:00:00.000Z",
10487
+ "published_by": "string",
10488
+ "is_published": true,
10489
+ "config": {},
10490
+ "pages": [
10491
+ {
10492
+ "slug": "dashboard",
10493
+ "path": "/dashboard",
10494
+ "schema": ["string"],
10495
+ "visibility": {},
10496
+ "content": {},
10497
+ "design": {},
10498
+ "blocks": {},
10499
+ "order": 1,
10500
+ "is_system": false,
10501
+ "is_detail": false,
10502
+ "detail_schema": "contact",
10503
+ "show_in_navigation": false,
10504
+ "is_public": true,
10505
+ "parentId": "c495fef9-eeca-4019-a989-8390dcd9825b",
10506
+ "is_entry_route": false,
10507
+ "is_deleted": false,
10508
+ "id": "c495fef9-eeca-4019-a989-8390dcd9825b",
10509
+ "last_modified_at": "2021-02-09T12:41:43.662Z",
10510
+ "portal_id": "453ad7bf-86d5-46c8-8252-bcc868df5e3c",
10511
+ "past_routes": ["old-dashboard", "home"],
10512
+ "org_id": "string"
10513
+ }
10514
+ ],
10515
+ "identity_providers": [
10516
+ {
10517
+ "slug": "office-365-login",
10518
+ "display_name": "Office 365 Login",
10519
+ "provider_type": "OIDC",
10520
+ "attribute_mappings": {},
10521
+ "entity_matching": {},
10522
+ "oidc_config": {},
10523
+ "mobile_oidc_config": {},
10524
+ "expose_client_secret": false
10525
+ }
10526
+ ],
10527
+ "email_templates": {
10528
+ "confirmAccount": "5da0a718-c822-403d-9f5d-20d4584e0528",
10529
+ "advancedAuth": "5da0a718-c822-403d-9f5d-20d4584e0528",
10530
+ "advancedMFA": "5da0a718-c822-403d-9f5d-20d4584e0528",
10531
+ "journeySignUp": "5da0a718-c822-403d-9f5d-20d4584e0528",
10532
+ "journeySignInOneTimePassword": "5da0a718-c822-403d-9f5d-20d4584e0528",
10533
+ "journeyLoginOTP": "5da0a718-c822-403d-9f5d-20d4584e0528",
10534
+ "forgotPassword": "5da0a718-c822-403d-9f5d-20d4584e0528",
10535
+ "invitation": "5da0a718-c822-403d-9f5d-20d4584e0528",
10536
+ "partnerInvitation": "5da0a718-c822-403d-9f5d-20d4584e0528",
10537
+ "onNewQuote": "5da0a718-c822-403d-9f5d-20d4584e0528",
10538
+ "onMapAPendingUser": "5da0a718-c822-403d-9f5d-20d4584e0528",
10539
+ "onDocUpload": "5da0a718-c822-403d-9f5d-20d4584e0528",
10540
+ "onWorkflowStepAssigned": "5da0a718-c822-403d-9f5d-20d4584e0528",
10541
+ "confirmEmailUpdate": "5da0a718-c822-403d-9f5d-20d4584e0528",
10542
+ "verifyCodeToSetPassword": "5da0a718-c822-403d-9f5d-20d4584e0528"
10543
+ },
10544
+ "email_template_settings": {}
10545
+ }
10546
+ ```
10547
+
10548
+ </details>
10549
+
10550
+ ---
10551
+
10552
+ ### `publishPortalRevision`
10553
+
10554
+ Makes one revision the portal's live configuration, atomically: either everything below takes effect or nothing does. Publish is a full-snapshot replace: it writes config, every page and email templat
10555
+
10556
+ `POST /v3/portal/config/{portal_id}/publish`
10557
+
10558
+ ```ts
10559
+ const { data } = await client.publishPortalRevision(
10560
+ {
10561
+ portal_id: 'example',
10562
+ },
10563
+ {
10564
+ revision_id: '2026-08-25T14:03:11.482Z-a7f3c1d9',
10565
+ name: 'FAQ page launch',
10566
+ description: 'string'
10567
+ },
10568
+ )
10569
+ ```
10570
+
10571
+ <details>
10572
+ <summary>Response</summary>
10573
+
10574
+ ```json
10575
+ {
10576
+ "revision_id": "string",
10577
+ "published_at": "1970-01-01T00:00:00.000Z",
10578
+ "published_by": "string",
10579
+ "name": "FAQ page launch",
10580
+ "post_publish_warnings": ["allowed_entities_change"]
10581
+ }
10582
+ ```
10583
+
10584
+ </details>
10585
+
10586
+ ---
10587
+
10588
+ ### `listAllPortalConfigs`
10589
+
10590
+ Retrieves all portal configurations.
10591
+
10592
+ `GET /v3/portal/configs`
10593
+
10594
+ ```ts
10595
+ const { data } = await client.listAllPortalConfigs()
10596
+ ```
10597
+
10598
+ <details>
10599
+ <summary>Response</summary>
10600
+
10601
+ ```json
10602
+ {
10603
+ "data": [
10604
+ {
10605
+ "entity_actions": [],
10606
+ "extensions": [],
10607
+ "extension_hooks": {},
10608
+ "default_user_to_notify": {},
10609
+ "identity_providers": [],
10610
+ "mobile_config": {},
10611
+ "enabled": true,
10612
+ "name": "Installer Portal",
10613
+ "domain": "abc.com",
10614
+ "is_epilot_domain": true,
10615
+ "epilot_domain": "example-portal-1.ecp.epilot.io",
10616
+ "domain_settings": {},
10617
+ "design_id": "5da0a718-c822-403d-9f5d-20d4584e0528",
10618
+ "allowed_portal_entities": ["contact", "contract"],
10619
+ "self_registration_setting": "ALLOW_WITH_CONTACT_CREATION",
10620
+ "self_registration_account_setting": "ALLOW_WITH_CREATION",
10621
+ "block_registration_if_portal_user_exists": true,
10622
+ "self_registration_entity": "contact",
10623
+ "user_account_self_management": false,
10624
+ "feature_settings": {},
10625
+ "accessToken": "string",
10626
+ "advanced_mfa": {},
10627
+ "auth_settings": {},
10628
+ "cognito_details": {},
10629
+ "config": "string",
10630
+ "contact_identifiers": ["email", "last_name"],
10631
+ "approval_state_attributes": {},
10632
+ "email_templates": {},
10633
+ "images": {},
10634
+ "entity_identifiers": {},
10635
+ "contract_identifiers": [],
10636
+ "contract_selector_config": {},
10637
+ "registration_identifiers": [],
10638
+ "surfaces": [],
10639
+ "contact_identifiers_for_account": [],
10640
+ "additional_contact_attributes": [],
10641
+ "triggered_journeys": [],
10642
+ "entity_edit_rules": [],
10643
+ "allowed_file_extensions": {},
10644
+ "prevent_search_engine_indexing": true,
10645
+ "meter_reading_grace_period": 0,
10646
+ "inactive_contract_cutoff_years": 0,
10647
+ "is_dummy": true,
10648
+ "is_v3_item": true,
10649
+ "published_revision_id": "2026-08-25T14:03:11.482Z-a7f3c1d9",
10650
+ "portal_id": "453ad7bf-86d5-46c8-8252-bcc868df5e3c",
10651
+ "portal_sk_v3": "PORTAL_CONFIG#453ad7bf-86d5-46c8-8252-bcc868df5e3c",
10652
+ "origin": "string",
10653
+ "global_blocks": {},
10654
+ "organization_id": 12345,
10655
+ "org_settings": {},
10656
+ "feature_flags": {},
10657
+ "grants": [],
10658
+ "pages": []
10659
+ }
10660
+ ]
10661
+ }
10662
+ ```
10663
+
10664
+ </details>
10665
+
10666
+ ---
10667
+
10668
+ ### `swapPortalConfig`
10669
+
10670
+ Swaps the portal configuration of two portals.
10671
+
10672
+ `POST /v3/portal/config/swap`
10673
+
10674
+ ```ts
10675
+ const { data } = await client.swapPortalConfig(
10676
+ null,
10677
+ {
10678
+ source_portal_id: '453ad7bf-86d5-46c8-8252-bcc868df5e3c',
10679
+ target_portal_id: '453ad7bf-86d5-46c8-8252-bcc868df5e3c',
10680
+ items_to_swap: ['email_templates']
10681
+ },
10682
+ )
10683
+ ```
10684
+
10685
+ <details>
10686
+ <summary>Response</summary>
10687
+
10688
+ ```json
10689
+ {
10690
+ "message": "Domain and users swapped successfully."
10691
+ }
10692
+ ```
10693
+
10694
+ </details>
10695
+
10696
+ ---
10697
+
10698
+ ### `clonePortalConfig`
10699
+
10700
+ Creates a new portal by cloning configuration and pages from an existing portal. The new portal gets its own domain, users, email templates, and authentication settings.
10701
+
10702
+ `POST /v3/portal/config/clone`
10703
+
10704
+ ```ts
10705
+ const { data } = await client.clonePortalConfig(
10706
+ null,
10707
+ {
10708
+ source_portal_id: '453ad7bf-86d5-46c8-8252-bcc868df5e3c',
10709
+ name: 'string'
10710
+ },
10711
+ )
10712
+ ```
10713
+
10714
+ <details>
10715
+ <summary>Response</summary>
9879
10716
 
9880
10717
  ```json
9881
10718
  {
@@ -10068,6 +10905,16 @@ const { data } = await client.clonePortalConfig(
10068
10905
  "schema": "contract"
10069
10906
  }
10070
10907
  ],
10908
+ "surfaces": [
10909
+ {
10910
+ "id": "website-journeys",
10911
+ "name": "Website journeys",
10912
+ "description": "string",
10913
+ "authentication": "login",
10914
+ "token_ttl_seconds": 300,
10915
+ "data_access": {}
10916
+ }
10917
+ ],
10071
10918
  "contact_identifiers_for_account": [
10072
10919
  {
10073
10920
  "name": "first_name",
@@ -10126,6 +10973,7 @@ const { data } = await client.clonePortalConfig(
10126
10973
  "inactive_contract_cutoff_years": 0,
10127
10974
  "is_dummy": true,
10128
10975
  "is_v3_item": true,
10976
+ "published_revision_id": "2026-08-25T14:03:11.482Z-a7f3c1d9",
10129
10977
  "portal_id": "453ad7bf-86d5-46c8-8252-bcc868df5e3c",
10130
10978
  "portal_sk_v3": "PORTAL_CONFIG#453ad7bf-86d5-46c8-8252-bcc868df5e3c",
10131
10979
  "origin": "string",
@@ -11766,6 +12614,35 @@ type ContactExistsRequest = {
11766
12614
  }
11767
12615
  ```
11768
12616
 
12617
+ ### `ContactIdentifyRequest`
12618
+
12619
+ ContactExistsRequest plus the surface the token is requested for.
12620
+
12621
+
12622
+ ```ts
12623
+ type ContactIdentifyRequest = {
12624
+ org_id: string
12625
+ registration_identifiers: Record<string, Record<string, string>>
12626
+ trigger_identifiers_check?: boolean
12627
+ surface_id: string
12628
+ }
12629
+ ```
12630
+
12631
+ ### `ContactIdentifyResponse`
12632
+
12633
+ ```ts
12634
+ type ContactIdentifyResponse = {
12635
+ contact_id?: string // uuid
12636
+ account_id?: string // uuid
12637
+ token?: string
12638
+ token_type?: "contact_identification"
12639
+ surface_id?: string
12640
+ expires_at?: string // date-time
12641
+ allowed_operations?: string[]
12642
+ reason?: "TIMEOUT" | "NOT_FOUND"
12643
+ }
12644
+ ```
12645
+
11769
12646
  ### `AccountExistsRequest`
11770
12647
 
11771
12648
  ```ts
@@ -12438,6 +13315,56 @@ type AdminUser = {
12438
13315
  }
12439
13316
  ```
12440
13317
 
13318
+ ### `PortalSurface`
13319
+
13320
+ One surface a portal's data is reached from (see `surfaces` on the portal config).
13321
+
13322
+ A surface names how callers authenticate on it and what they may reach once they
13323
+ have. Data access is always a subset of the portal's own: a schema not in
13324
+ `allowed_portal_entities` cannot be opened up by a surface, a
13325
+
13326
+ ```ts
13327
+ type PortalSurface = {
13328
+ id: string
13329
+ name: string
13330
+ description?: string
13331
+ authentication: "login" | "registration_identifiers"
13332
+ token_ttl_seconds?: number
13333
+ data_access?: {
13334
+ entities?: Array<{
13335
+ schema: { ... }
13336
+ target_ids?: { ... }
13337
+ }>
13338
+ role_id?: string
13339
+ }
13340
+ }
13341
+ ```
13342
+
13343
+ ### `PortalSurfaceDataAccess`
13344
+
13345
+ What a caller on a surface may reach. Every property is optional; omitting all of them is the portal's default scope.
13346
+
13347
+ ```ts
13348
+ type PortalSurfaceDataAccess = {
13349
+ entities?: Array<{
13350
+ schema: string
13351
+ target_ids?: string[]
13352
+ }>
13353
+ role_id?: string
13354
+ }
13355
+ ```
13356
+
13357
+ ### `PortalSurfaceEntityAccess`
13358
+
13359
+ One schema this surface reaches, with the targets that always apply to it.
13360
+
13361
+ ```ts
13362
+ type PortalSurfaceEntityAccess = {
13363
+ schema: string
13364
+ target_ids?: string[]
13365
+ }
13366
+ ```
13367
+
12441
13368
  ### `Grant`
12442
13369
 
12443
13370
  ```ts
@@ -12586,9 +13513,34 @@ type PortalWorkflow = {
12586
13513
  assigned_to?: string[]
12587
13514
  phase_id?: string
12588
13515
  phase_name?: string
13516
+ stage_id?: string
12589
13517
  completed_at?: string
12590
13518
  updated_at?: string
12591
13519
  }>
13520
+ stages?: Array<{
13521
+ id: string
13522
+ name: string
13523
+ description?: string
13524
+ status: "COMPLETED" | "IN_PROGRESS" | "UPCOMING"
13525
+ completed_at?: string
13526
+ }>
13527
+ }
13528
+ ```
13529
+
13530
+ ### `PortalWorkflowStage`
13531
+
13532
+ A customer-facing stage of a flow execution, with a progress status derived
13533
+ from the execution's tasks by the Workflows API. Stages form a strict total
13534
+ order; the array order is the stage order.
13535
+
13536
+
13537
+ ```ts
13538
+ type PortalWorkflowStage = {
13539
+ id: string
13540
+ name: string
13541
+ description?: string
13542
+ status: "COMPLETED" | "IN_PROGRESS" | "UPCOMING"
13543
+ completed_at?: string
12592
13544
  }
12593
13545
  ```
12594
13546
 
@@ -12634,6 +13586,7 @@ type PortalWorkflowTask = {
12634
13586
  assigned_to?: string[]
12635
13587
  phase_id?: string
12636
13588
  phase_name?: string
13589
+ stage_id?: string
12637
13590
  completed_at?: string
12638
13591
  updated_at?: string
12639
13592
  }
@@ -12675,9 +13628,17 @@ type EntityPortalWorkflows = {
12675
13628
  assigned_to?: { ... }
12676
13629
  phase_id?: { ... }
12677
13630
  phase_name?: { ... }
13631
+ stage_id?: { ... }
12678
13632
  completed_at?: { ... }
12679
13633
  updated_at?: { ... }
12680
13634
  }>
13635
+ stages?: Array<{
13636
+ id: { ... }
13637
+ name: { ... }
13638
+ description?: { ... }
13639
+ status: { ... }
13640
+ completed_at?: { ... }
13641
+ }>
12681
13642
  }>
12682
13643
  }
12683
13644
  ```
@@ -14016,14 +14977,55 @@ type ProviderConfig = {
14016
14977
  client_id?: string
14017
14978
  client_secret?: string
14018
14979
  }
14019
- expose_client_secret?: boolean
14980
+ expose_client_secret?: boolean
14981
+ }
14982
+ ```
14983
+
14984
+ ### `ProviderPublicConfig`
14985
+
14986
+ ```ts
14987
+ type ProviderPublicConfig = {
14988
+ slug: string
14989
+ display_name: string
14990
+ oidc_config?: {
14991
+ type?: "authorization_code" | "implicit"
14992
+ oidc_issuer: string
14993
+ redirect_uri?: string
14994
+ client_id: string
14995
+ client_secret?: string
14996
+ has_client_secret?: boolean
14997
+ scope: string
14998
+ metadata?: {
14999
+ response_modes_supported?: { ... }
15000
+ authorization_endpoint?: { ... }
15001
+ token_endpoint?: { ... }
15002
+ userinfo_endpoint?: { ... }
15003
+ logout_uri?: { ... }
15004
+ logout_redirect_uri?: { ... }
15005
+ skip_login_as_logout?: { ... }
15006
+ mobile_redirect_uri?: { ... }
15007
+ test_auth_username?: { ... }
15008
+ test_auth_password?: { ... }
15009
+ }
15010
+ prompt?: "login" | "select_account" | "consent" | "signup"
15011
+ }
15012
+ mobile_oidc_config?: {
15013
+ client_id?: string
15014
+ client_secret?: string
15015
+ }
14020
15016
  }
14021
15017
  ```
14022
15018
 
14023
- ### `ProviderPublicConfig`
15019
+ ### `ProviderPublicConfigV3`
15020
+
15021
+ Web-only public provider configuration served by `getPublicSSOProviderV3`.
15022
+ Unlike `ProviderPublicConfig` there is no `mobile_oidc_config`, and
15023
+ `oidc_config` never carries `client_secret` or the `metadata.test_auth_*`
15024
+ credentials — `oidc_config.has_client_secret` signals their presence so
15025
+ clients rou
14024
15026
 
14025
15027
  ```ts
14026
- type ProviderPublicConfig = {
15028
+ type ProviderPublicConfigV3 = {
14027
15029
  slug: string
14028
15030
  display_name: string
14029
15031
  oidc_config?: {
@@ -14048,10 +15050,17 @@ type ProviderPublicConfig = {
14048
15050
  }
14049
15051
  prompt?: "login" | "select_account" | "consent" | "signup"
14050
15052
  }
14051
- mobile_oidc_config?: {
14052
- client_id?: string
14053
- client_secret?: string
14054
- }
15053
+ }
15054
+ ```
15055
+
15056
+ ### `PublicIdentityProvider`
15057
+
15058
+ Minimal public identity provider info — enough to render a provider login button.
15059
+
15060
+ ```ts
15061
+ type PublicIdentityProvider = {
15062
+ slug: string
15063
+ display_name: string
14055
15064
  }
14056
15065
  ```
14057
15066
 
@@ -14735,6 +15744,313 @@ type JuiceSettings = {
14735
15744
  }
14736
15745
  ```
14737
15746
 
15747
+ ### `RevisionPageRequest`
15748
+
15749
+ A page inside a revision snapshot. `additionalProperties` is true on purpose — a page carries fields this schema does not name and they must survive into the snapshot and back onto the live page when it is published.
15750
+
15751
+
15752
+ ```ts
15753
+ type RevisionPageRequest = {
15754
+ id: string // uuid
15755
+ slug: string
15756
+ order: number
15757
+ blocks: Record<string, unknown>
15758
+ }
15759
+ ```
15760
+
15761
+ ### `PortalRevisionRequest`
15762
+
15763
+ ```ts
15764
+ type PortalRevisionRequest = {
15765
+ entity_actions?: Array<{
15766
+ journey_id?: string // uuid
15767
+ slug?: string
15768
+ action_Label?: {
15769
+ en?: { ... }
15770
+ de?: { ... }
15771
+ }
15772
+ }>
15773
+ extensions?: Array<{
15774
+ id: string
15775
+ status: "installed" | "enabled"
15776
+ options?: Record<string, string>
15777
+ }>
15778
+ extension_hooks?: Record<string, {
15779
+ app_id: string
15780
+ extension_id: string
15781
+ hook_id: string
15782
+ }>
15783
+ default_user_to_notify?: {
15784
+ onPendingUser?: Array<{
15785
+ type?: { ... }
15786
+ user_id?: { ... }
15787
+ display_name?: { ... }
15788
+ image_uri?: { ... }
15789
+ org_id?: { ... }
15790
+ email?: { ... }
15791
+ phone?: { ... }
15792
+ }>
15793
+ }
15794
+ identity_providers?: Array<{
15795
+ slug?: string
15796
+ display_name: string
15797
+ provider_type: "OIDC"
15798
+ attribute_mappings?: {
15799
+ contact: { ... }
15800
+ account?: { ... }
15801
+ portal_user?: { ... }
15802
+ concession_attributes?: { ... }
15803
+ }
15804
+ entity_matching?: {
15805
+ portal_user?: { ... }
15806
+ contact?: { ... }
15807
+ auto_create_cognito_user?: { ... }
15808
+ }
15809
+ oidc_config?: {
15810
+ type?: { ... }
15811
+ oidc_issuer: { ... }
15812
+ redirect_uri?: { ... }
15813
+ client_id: { ... }
15814
+ client_secret?: { ... }
15815
+ has_client_secret?: { ... }
15816
+ scope: { ... }
15817
+ metadata?: { ... }
15818
+ prompt?: { ... }
15819
+ }
15820
+ mobile_oidc_config?: {
15821
+ client_id?: { ... }
15822
+ client_secret?: { ... }
15823
+ }
15824
+ expose_client_secret?: boolean
15825
+ }>
15826
+ mobile_config?: {
15827
+ portal_id?: string
15828
+ enabled?: boolean
15829
+ display_name?: string
15830
+ app_host?: string
15831
+ environment?: "prod" | "staging" | "dev"
15832
+ branding?: {
15833
+ app_icon?: { ... }
15834
+ splash?: { ... }
15835
+ splash_dark?: { ... }
15836
+ icon_background_color?: { ... }
15837
+ splash_background_color?: { ... }
15838
+ splash_background_color_dark?: { ... }
15839
+ }
15840
+ ios?: {
15841
+ bundle_id?: { ... }
15842
+ team_id?: { ... }
15843
+ credentials_status?: { ... }
15844
+ app_store_id?: { ... }
15845
+ store_url?: { ... }
15846
+ last_build?: { ... }
15847
+ }
15848
+ android?: {
15849
+ package_name?: { ... }
15850
+ credentials_status?: { ... }
15851
+ upload_key_status?: { ... }
15852
+ store_url?: { ... }
15853
+ last_build?: { ... }
15854
+ }
15855
+ ota?: {
15856
+ enabled?: { ... }
15857
+ channel?: { ... }
15858
+ auto_update?: { ... }
15859
+ update_strategy?: { ... }
15860
+ min_native_version?: { ... }
15861
+ }
15862
+ }
15863
+ enabled?: boolean
15864
+ // ...
15865
+ }
15866
+ ```
15867
+
15868
+ ### `PublishRevisionRequest`
15869
+
15870
+ ```ts
15871
+ type PublishRevisionRequest = {
15872
+ revision_id: string
15873
+ name?: string
15874
+ description?: string
15875
+ }
15876
+ ```
15877
+
15878
+ ### `PortalRevisionSummary`
15879
+
15880
+ ```ts
15881
+ type PortalRevisionSummary = {
15882
+ revision_id: string
15883
+ created_at: string // date-time
15884
+ created_by?: string
15885
+ name?: string
15886
+ description?: string
15887
+ page_count: number
15888
+ published_at?: string // date-time
15889
+ published_by?: string
15890
+ is_published: boolean
15891
+ }
15892
+ ```
15893
+
15894
+ ### `PortalRevisionList`
15895
+
15896
+ ```ts
15897
+ type PortalRevisionList = {
15898
+ results: Array<{
15899
+ revision_id: string
15900
+ created_at: string // date-time
15901
+ created_by?: string
15902
+ name?: string
15903
+ description?: string
15904
+ page_count: number
15905
+ published_at?: string // date-time
15906
+ published_by?: string
15907
+ is_published: boolean
15908
+ }>
15909
+ next_cursor?: string
15910
+ }
15911
+ ```
15912
+
15913
+ ### `PortalRevisionCreated`
15914
+
15915
+ ```ts
15916
+ type PortalRevisionCreated = {
15917
+ revision_id: string
15918
+ created_at: string // date-time
15919
+ created_by?: string
15920
+ name?: string
15921
+ description?: string
15922
+ page_count: number
15923
+ published_at?: string // date-time
15924
+ published_by?: string
15925
+ is_published: boolean
15926
+ identity_providers?: Array<{
15927
+ slug?: string
15928
+ display_name: string
15929
+ provider_type: "OIDC"
15930
+ attribute_mappings?: {
15931
+ contact: { ... }
15932
+ account?: { ... }
15933
+ portal_user?: { ... }
15934
+ concession_attributes?: { ... }
15935
+ }
15936
+ entity_matching?: {
15937
+ portal_user?: { ... }
15938
+ contact?: { ... }
15939
+ auto_create_cognito_user?: { ... }
15940
+ }
15941
+ oidc_config?: {
15942
+ type?: { ... }
15943
+ oidc_issuer: { ... }
15944
+ redirect_uri?: { ... }
15945
+ client_id: { ... }
15946
+ client_secret?: { ... }
15947
+ has_client_secret?: { ... }
15948
+ scope: { ... }
15949
+ metadata?: { ... }
15950
+ prompt?: { ... }
15951
+ }
15952
+ mobile_oidc_config?: {
15953
+ client_id?: { ... }
15954
+ client_secret?: { ... }
15955
+ }
15956
+ expose_client_secret?: boolean
15957
+ }>
15958
+ }
15959
+ ```
15960
+
15961
+ ### `RevisionPage`
15962
+
15963
+ A page from a revision snapshot. Same shape as a live `Page`, without the server-managed fields (`past_routes`, `_created_at`, `_updated_at`, `is_deleted`), which publish re-derives from the live portal.
15964
+
15965
+
15966
+ ```ts
15967
+ type RevisionPage = {
15968
+ org_id?: string
15969
+ }
15970
+ ```
15971
+
15972
+ ### `PortalRevision`
15973
+
15974
+ ```ts
15975
+ type PortalRevision = {
15976
+ revision_id: string
15977
+ created_at: string // date-time
15978
+ created_by?: string
15979
+ name?: string
15980
+ description?: string
15981
+ page_count: number
15982
+ published_at?: string // date-time
15983
+ published_by?: string
15984
+ is_published: boolean
15985
+ config: Record<string, unknown>
15986
+ pages: Array<{
15987
+ org_id?: string
15988
+ }>
15989
+ identity_providers?: Array<{
15990
+ slug?: string
15991
+ display_name: string
15992
+ provider_type: "OIDC"
15993
+ attribute_mappings?: {
15994
+ contact: { ... }
15995
+ account?: { ... }
15996
+ portal_user?: { ... }
15997
+ concession_attributes?: { ... }
15998
+ }
15999
+ entity_matching?: {
16000
+ portal_user?: { ... }
16001
+ contact?: { ... }
16002
+ auto_create_cognito_user?: { ... }
16003
+ }
16004
+ oidc_config?: {
16005
+ type?: { ... }
16006
+ oidc_issuer: { ... }
16007
+ redirect_uri?: { ... }
16008
+ client_id: { ... }
16009
+ client_secret?: { ... }
16010
+ has_client_secret?: { ... }
16011
+ scope: { ... }
16012
+ metadata?: { ... }
16013
+ prompt?: { ... }
16014
+ }
16015
+ mobile_oidc_config?: {
16016
+ client_id?: { ... }
16017
+ client_secret?: { ... }
16018
+ }
16019
+ expose_client_secret?: boolean
16020
+ }>
16021
+ email_templates?: {
16022
+ confirmAccount?: string // uuid
16023
+ advancedAuth?: string // uuid
16024
+ advancedMFA?: string // uuid
16025
+ journeySignUp?: string // uuid
16026
+ journeySignInOneTimePassword?: string // uuid
16027
+ journeyLoginOTP?: string // uuid
16028
+ forgotPassword?: string // uuid
16029
+ invitation?: string // uuid
16030
+ partnerInvitation?: string // uuid
16031
+ onNewQuote?: string // uuid
16032
+ onMapAPendingUser?: string // uuid
16033
+ onDocUpload?: string // uuid
16034
+ onWorkflowStepAssigned?: string // uuid
16035
+ confirmEmailUpdate?: string // uuid
16036
+ verifyCodeToSetPassword?: string // uuid
16037
+ }
16038
+ email_template_settings?: Record<string, unknown>
16039
+ }
16040
+ ```
16041
+
16042
+ ### `PublishResult`
16043
+
16044
+ ```ts
16045
+ type PublishResult = {
16046
+ revision_id: string
16047
+ published_at: string // date-time
16048
+ published_by?: string
16049
+ name?: string
16050
+ post_publish_warnings: string[]
16051
+ }
16052
+ ```
16053
+
14738
16054
  ### `SwappableConfig`
14739
16055
 
14740
16056
  Optional configuration item that a portal swap can additionally include. The swap always transfers the pages and the functional experience config that keep the portal working. These items are opt-in on top of that and are OFF by default. Domain and access/security settings (domain, cognito_details,