@epilot/customer-portal-client 0.48.0 → 0.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/openapi.json CHANGED
@@ -10025,6 +10025,86 @@
10025
10025
  }
10026
10026
  }
10027
10027
  },
10028
+ "/v3/portal/public/user/temporary-password/complete": {
10029
+ "post": {
10030
+ "operationId": "completeTemporaryPassword",
10031
+ "summary": "completeTemporaryPassword",
10032
+ "description": "Replaces a portal user's temporary password with the password they chose.",
10033
+ "tags": [
10034
+ "Public"
10035
+ ],
10036
+ "security": [],
10037
+ "requestBody": {
10038
+ "required": true,
10039
+ "content": {
10040
+ "application/json": {
10041
+ "schema": {
10042
+ "type": "object",
10043
+ "required": [
10044
+ "org_id",
10045
+ "portal_id",
10046
+ "email",
10047
+ "temporary_password",
10048
+ "new_password"
10049
+ ],
10050
+ "properties": {
10051
+ "org_id": {
10052
+ "type": "string",
10053
+ "description": "Organization ID",
10054
+ "example": "123"
10055
+ },
10056
+ "portal_id": {
10057
+ "type": "string",
10058
+ "description": "ID of the portal the user belongs to",
10059
+ "example": "7hj28akg-97fb-4f5c-b2a1-3e4fbc1d8c7a"
10060
+ },
10061
+ "email": {
10062
+ "type": "string",
10063
+ "description": "Email address of the portal user",
10064
+ "example": "user@example.com"
10065
+ },
10066
+ "temporary_password": {
10067
+ "type": "string",
10068
+ "description": "Temporary password from the email"
10069
+ },
10070
+ "new_password": {
10071
+ "type": "string",
10072
+ "description": "New password, must match the portal's password policy"
10073
+ }
10074
+ }
10075
+ }
10076
+ }
10077
+ }
10078
+ },
10079
+ "responses": {
10080
+ "200": {
10081
+ "description": "The new password was set.",
10082
+ "content": {
10083
+ "application/json": {
10084
+ "schema": {
10085
+ "type": "object",
10086
+ "properties": {
10087
+ "message": {
10088
+ "type": "string",
10089
+ "example": "Password set successfully."
10090
+ }
10091
+ }
10092
+ }
10093
+ }
10094
+ }
10095
+ },
10096
+ "400": {
10097
+ "$ref": "#/components/responses/InvalidRequest"
10098
+ },
10099
+ "429": {
10100
+ "$ref": "#/components/responses/TooManyRequests"
10101
+ },
10102
+ "500": {
10103
+ "$ref": "#/components/responses/InternalServerError"
10104
+ }
10105
+ }
10106
+ }
10107
+ },
10028
10108
  "/v2/portal/campaign/{campaign_id}/entity:status": {
10029
10109
  "put": {
10030
10110
  "operationId": "updateCampaignPortalBlockStatus",
@@ -10997,6 +11077,80 @@
10997
11077
  "$ref": "#/components/responses/InternalServerError"
10998
11078
  }
10999
11079
  }
11080
+ },
11081
+ "patch": {
11082
+ "operationId": "updatePortalRevision",
11083
+ "summary": "updatePortalRevision",
11084
+ "description": "Renames a revision without publishing it. Any revision can be renamed, published or not. Only the revision's `name` changes: its content, `published_at`, `published_by` and which revision is live stay as they are.\n\nThe server trims `name`. An empty name after trimming removes the revision's name, and clients fall back to a label derived from `published_at` / `created_at`. A later publish without a `name` keeps the renamed name.\n",
11085
+ "tags": [
11086
+ "ECP Admin"
11087
+ ],
11088
+ "parameters": [
11089
+ {
11090
+ "in": "path",
11091
+ "name": "portal_id",
11092
+ "required": true,
11093
+ "schema": {
11094
+ "type": "string",
11095
+ "format": "uuid",
11096
+ "example": "5da0a718-c822-403d-9f5d-20d4584e0528"
11097
+ },
11098
+ "description": "Portal ID (readonly UUID generated on portal creation)"
11099
+ },
11100
+ {
11101
+ "in": "path",
11102
+ "name": "revision_id",
11103
+ "required": true,
11104
+ "schema": {
11105
+ "type": "string",
11106
+ "example": "2026-08-25T14:03:11.482Z-a7f3c1d9"
11107
+ },
11108
+ "description": "Revision ID. Contains `:` characters, so percent-encode it."
11109
+ }
11110
+ ],
11111
+ "requestBody": {
11112
+ "description": "The new revision name",
11113
+ "required": true,
11114
+ "content": {
11115
+ "application/json": {
11116
+ "schema": {
11117
+ "$ref": "#/components/schemas/UpdatePortalRevisionRequest"
11118
+ }
11119
+ }
11120
+ }
11121
+ },
11122
+ "security": [
11123
+ {
11124
+ "EpilotAuth": []
11125
+ }
11126
+ ],
11127
+ "responses": {
11128
+ "200": {
11129
+ "description": "Revision renamed successfully.",
11130
+ "content": {
11131
+ "application/json": {
11132
+ "schema": {
11133
+ "$ref": "#/components/schemas/PortalRevisionSummary"
11134
+ }
11135
+ }
11136
+ }
11137
+ },
11138
+ "400": {
11139
+ "$ref": "#/components/responses/InvalidRequest"
11140
+ },
11141
+ "401": {
11142
+ "$ref": "#/components/responses/Unauthorized"
11143
+ },
11144
+ "403": {
11145
+ "$ref": "#/components/responses/Forbidden"
11146
+ },
11147
+ "404": {
11148
+ "$ref": "#/components/responses/NotFound"
11149
+ },
11150
+ "500": {
11151
+ "$ref": "#/components/responses/InternalServerError"
11152
+ }
11153
+ }
11000
11154
  }
11001
11155
  },
11002
11156
  "/v3/portal/config/{portal_id}/publish": {
@@ -11115,11 +11269,55 @@
11115
11269
  }
11116
11270
  }
11117
11271
  },
11272
+ "/v3/portal/configs/summaries": {
11273
+ "get": {
11274
+ "operationId": "listPortalConfigSummaries",
11275
+ "summary": "listPortalConfigSummaries",
11276
+ "description": "Lists the portals of the organization as lightweight summaries: the identifying,\ndisplay and registration fields of each portal config, without pages, email\ntemplates, grants, feature flags, identity providers or certificate details.\n\nUse it for portal overviews and pickers. Read a single portal with\n`getPortalConfigV3` when the full configuration is needed.\n",
11277
+ "tags": [
11278
+ "ECP Admin"
11279
+ ],
11280
+ "security": [
11281
+ {
11282
+ "EpilotAuth": []
11283
+ }
11284
+ ],
11285
+ "responses": {
11286
+ "200": {
11287
+ "description": "Portal config summaries retrieved successfully.",
11288
+ "content": {
11289
+ "application/json": {
11290
+ "schema": {
11291
+ "type": "object",
11292
+ "properties": {
11293
+ "data": {
11294
+ "type": "array",
11295
+ "items": {
11296
+ "$ref": "#/components/schemas/PortalConfigSummaryV3"
11297
+ }
11298
+ }
11299
+ }
11300
+ }
11301
+ }
11302
+ }
11303
+ },
11304
+ "401": {
11305
+ "$ref": "#/components/responses/Unauthorized"
11306
+ },
11307
+ "403": {
11308
+ "$ref": "#/components/responses/Forbidden"
11309
+ },
11310
+ "500": {
11311
+ "$ref": "#/components/responses/InternalServerError"
11312
+ }
11313
+ }
11314
+ }
11315
+ },
11118
11316
  "/v3/portal/config/swap": {
11119
11317
  "post": {
11120
11318
  "operationId": "swapPortalConfig",
11121
11319
  "summary": "swapPortalConfig",
11122
- "description": "Swaps the portal configuration of two portals.",
11320
+ "description": "Swaps the portal configuration of two portals. Without `mode` both portals exchange pages and experience config live, as before. With `mode: copy` (portal versioning only) nothing live changes: the source's setup is saved as an unpublished revision on the target to review and publish. Domain and access/security settings never move.",
11123
11321
  "tags": [
11124
11322
  "ECP Admin"
11125
11323
  ],
@@ -11151,7 +11349,14 @@
11151
11349
  "items": {
11152
11350
  "$ref": "#/components/schemas/SwappableConfig"
11153
11351
  },
11154
- "description": "Optional, opt-in configuration items to additionally swap on top of the always-swapped pages and functional config. Defaults to an empty list (nothing extra swapped). Domain and access/security settings can never be swapped."
11352
+ "description": "Optional, opt-in configuration items to additionally swap on top of the always-swapped pages and functional config. Defaults to an empty list (nothing extra swapped). Domain and access/security settings can never be swapped. With `mode` the listed items are included in the draft revisions."
11353
+ },
11354
+ "mode": {
11355
+ "type": "string",
11356
+ "enum": [
11357
+ "copy"
11358
+ ],
11359
+ "description": "Requires portal versioning (flag on, V3 target portal), otherwise 400. `copy` saves an unpublished revision on the target holding the source's setup; neither portal changes live and the source is untouched. Omit for the original live swap. Cannot be combined with the `portal_references` item, which only applies to a live swap."
11155
11360
  }
11156
11361
  }
11157
11362
  }
@@ -11169,6 +11374,24 @@
11169
11374
  "message": {
11170
11375
  "type": "string",
11171
11376
  "example": "Domain and users swapped successfully."
11377
+ },
11378
+ "portal_references": {
11379
+ "$ref": "#/components/schemas/SwapPortalReferencesResult"
11380
+ },
11381
+ "revisions": {
11382
+ "type": "array",
11383
+ "description": "Only with `mode`. The draft revision created on the target.",
11384
+ "items": {
11385
+ "type": "object",
11386
+ "properties": {
11387
+ "portal_id": {
11388
+ "$ref": "#/components/schemas/PortalId"
11389
+ },
11390
+ "revision_id": {
11391
+ "type": "string"
11392
+ }
11393
+ }
11394
+ }
11172
11395
  }
11173
11396
  }
11174
11397
  }
@@ -13105,37 +13328,7 @@
13105
13328
  "example": false
13106
13329
  },
13107
13330
  "feature_settings": {
13108
- "type": "object",
13109
- "description": "Feature settings for the portal",
13110
- "properties": {
13111
- "start_page": {
13112
- "type": "boolean",
13113
- "description": "Start page feature flag"
13114
- },
13115
- "billing": {
13116
- "type": "boolean",
13117
- "description": "Billing feature flag"
13118
- },
13119
- "change_due_date": {
13120
- "type": "boolean",
13121
- "description": "Change due date feature flag"
13122
- },
13123
- "new_design": {
13124
- "type": "boolean",
13125
- "description": "Enable or disable the new design for the portal"
13126
- },
13127
- "mcp_enabled": {
13128
- "type": "boolean",
13129
- "description": "Enable the MCP (AI agent) connector channel for this portal"
13130
- },
13131
- "mcp_grant_version": {
13132
- "type": "integer",
13133
- "minimum": 0,
13134
- "default": 0,
13135
- "readOnly": true,
13136
- "description": "Server-managed generation used to invalidate MCP grants after the connector is disabled or re-enabled"
13137
- }
13138
- }
13331
+ "$ref": "#/components/schemas/PortalFeatureSettings"
13139
13332
  },
13140
13333
  "accessToken": {
13141
13334
  "type": "string",
@@ -13398,6 +13591,15 @@
13398
13591
  }
13399
13592
  ]
13400
13593
  },
13594
+ "self_assignment_mode": {
13595
+ "type": "string",
13596
+ "enum": [
13597
+ "contracts",
13598
+ "customer_to_portal_user"
13599
+ ],
13600
+ "default": "contracts",
13601
+ "description": "What the built-in self-assignment (without a contractIdentification hook) assigns once the `contract_identifiers` match a Contract:\n - `contracts`: the user's Contact is added as a customer of the Contract.\n - `customer_to_portal_user`: the Contract's customers (Contacts and Accounts) are added to the Portal User's `represents`. The Portal User sees all their data, including Contracts, transitively. Mirrors the `contact_to_portal_user` assignment mode of the contractIdentification hook.\n"
13602
+ },
13401
13603
  "contract_selector_config": {
13402
13604
  "type": "object",
13403
13605
  "description": "Configuration for contract selector in the portal",
@@ -14202,6 +14404,11 @@
14202
14404
  },
14203
14405
  "example": []
14204
14406
  },
14407
+ "has_portal_user": {
14408
+ "type": "boolean",
14409
+ "description": "Whether the identified contact already has a portal user on this portal, so the caller\ncan skip offering account creation. Present only on a match; omitted when it could not\nbe determined.\n",
14410
+ "example": false
14411
+ },
14205
14412
  "reason": {
14206
14413
  "type": "string",
14207
14414
  "enum": [
@@ -15954,8 +16161,7 @@
15954
16161
  "type": "string",
15955
16162
  "enum": [
15956
16163
  "portal-config",
15957
- "portal-block",
15958
- "portal-widget"
16164
+ "portal-block"
15959
16165
  ]
15960
16166
  },
15961
16167
  "resource": {
@@ -20221,37 +20427,7 @@
20221
20427
  "example": false
20222
20428
  },
20223
20429
  "feature_settings": {
20224
- "type": "object",
20225
- "description": "Feature settings for the portal",
20226
- "properties": {
20227
- "start_page": {
20228
- "type": "boolean",
20229
- "description": "Start page feature flag"
20230
- },
20231
- "billing": {
20232
- "type": "boolean",
20233
- "description": "Billing feature flag"
20234
- },
20235
- "change_due_date": {
20236
- "type": "boolean",
20237
- "description": "Change due date feature flag"
20238
- },
20239
- "new_design": {
20240
- "type": "boolean",
20241
- "description": "Enable or disable the new design for the portal"
20242
- },
20243
- "mcp_enabled": {
20244
- "type": "boolean",
20245
- "description": "Enable the MCP (AI agent) connector channel for this portal"
20246
- },
20247
- "mcp_grant_version": {
20248
- "type": "integer",
20249
- "minimum": 0,
20250
- "default": 0,
20251
- "readOnly": true,
20252
- "description": "Server-managed generation used to invalidate MCP grants after the connector is disabled or re-enabled"
20253
- }
20254
- }
20430
+ "$ref": "#/components/schemas/PortalFeatureSettings"
20255
20431
  },
20256
20432
  "accessToken": {
20257
20433
  "type": "string",
@@ -20514,6 +20690,15 @@
20514
20690
  }
20515
20691
  ]
20516
20692
  },
20693
+ "self_assignment_mode": {
20694
+ "type": "string",
20695
+ "enum": [
20696
+ "contracts",
20697
+ "customer_to_portal_user"
20698
+ ],
20699
+ "default": "contracts",
20700
+ "description": "What the built-in self-assignment (without a contractIdentification hook) assigns once the `contract_identifiers` match a Contract:\n - `contracts`: the user's Contact is added as a customer of the Contract.\n - `customer_to_portal_user`: the Contract's customers (Contacts and Accounts) are added to the Portal User's `represents`. The Portal User sees all their data, including Contracts, transitively. Mirrors the `contact_to_portal_user` assignment mode of the contractIdentification hook.\n"
20701
+ },
20517
20702
  "contract_selector_config": {
20518
20703
  "type": "object",
20519
20704
  "description": "Configuration for contract selector in the portal",
@@ -20910,6 +21095,231 @@
20910
21095
  }
20911
21096
  ]
20912
21097
  },
21098
+ "PortalFeatureSettings": {
21099
+ "type": "object",
21100
+ "description": "Feature settings for the portal",
21101
+ "properties": {
21102
+ "start_page": {
21103
+ "type": "boolean",
21104
+ "deprecated": true,
21105
+ "description": "Retired, not read. A portal shows a start page by having a `dashboard` page."
21106
+ },
21107
+ "billing": {
21108
+ "type": "boolean",
21109
+ "deprecated": true,
21110
+ "description": "Retired, not read. Billing follows the organization's `commodity_billing` setting."
21111
+ },
21112
+ "commodity_billing": {
21113
+ "type": "boolean",
21114
+ "deprecated": true,
21115
+ "description": "Retired, not read. Billing pages and blocks follow the organization's `commodity_billing` setting."
21116
+ },
21117
+ "change_due_date": {
21118
+ "type": "boolean",
21119
+ "deprecated": true,
21120
+ "description": "Retired, not read."
21121
+ },
21122
+ "new_design": {
21123
+ "type": "boolean",
21124
+ "description": "Enable or disable the new design for the portal"
21125
+ },
21126
+ "mcp_enabled": {
21127
+ "type": "boolean",
21128
+ "description": "Enable the MCP (AI agent) connector channel for this portal"
21129
+ },
21130
+ "mcp_grant_version": {
21131
+ "type": "integer",
21132
+ "minimum": 0,
21133
+ "default": 0,
21134
+ "readOnly": true,
21135
+ "description": "Server-managed generation used to invalidate MCP grants after the connector is disabled or re-enabled"
21136
+ },
21137
+ "portal_copilot": {
21138
+ "type": "boolean",
21139
+ "default": false,
21140
+ "description": "Enable the portal copilot chat for this portal"
21141
+ },
21142
+ "portal_copilot_agent_id": {
21143
+ "type": "string",
21144
+ "description": "ID of the Agent Builder portal agent this portal's copilot chat runs, set by Agent Builder. When unset, or when the agent no longer exists in the portal's organization, the chat runs the default portal copilot."
21145
+ }
21146
+ }
21147
+ },
21148
+ "PortalUsingDesign": {
21149
+ "type": "object",
21150
+ "description": "A portal whose design_id is the design asked about.",
21151
+ "required": [
21152
+ "portal_id"
21153
+ ],
21154
+ "properties": {
21155
+ "portal_id": {
21156
+ "$ref": "#/components/schemas/PortalId"
21157
+ },
21158
+ "name": {
21159
+ "type": "string",
21160
+ "example": "Kundenportal"
21161
+ },
21162
+ "origin": {
21163
+ "$ref": "#/components/schemas/Origin"
21164
+ },
21165
+ "design_id": {
21166
+ "type": "string",
21167
+ "example": "9ba94f20-b872-11ed-b30a-b3e3bf2dc8ab"
21168
+ }
21169
+ }
21170
+ },
21171
+ "PortalConfigSummaryV3": {
21172
+ "type": "object",
21173
+ "description": "Lightweight view of a portal config for lists and pickers. Carries the identifying,\ndisplay and registration fields only. Pages, email templates, grants, feature flags,\nidentity providers and certificate details are left out; read them per portal with\n`getPortalConfigV3`.\n",
21174
+ "properties": {
21175
+ "portal_id": {
21176
+ "$ref": "#/components/schemas/PortalId"
21177
+ },
21178
+ "organization_id": {
21179
+ "type": "string",
21180
+ "example": 12345,
21181
+ "description": "ID of the organization"
21182
+ },
21183
+ "origin": {
21184
+ "$ref": "#/components/schemas/Origin"
21185
+ },
21186
+ "name": {
21187
+ "type": "string",
21188
+ "description": "Name of the portal"
21189
+ },
21190
+ "enabled": {
21191
+ "type": "boolean",
21192
+ "description": "Whether the portal is enabled"
21193
+ },
21194
+ "domain": {
21195
+ "type": "string",
21196
+ "description": "Custom domain of the portal"
21197
+ },
21198
+ "epilot_domain": {
21199
+ "type": "string",
21200
+ "description": "epilot-hosted domain of the portal"
21201
+ },
21202
+ "is_epilot_domain": {
21203
+ "type": "boolean"
21204
+ },
21205
+ "dnsStatus": {
21206
+ "type": "string",
21207
+ "description": "Status of the custom domain setup, when a custom domain is configured",
21208
+ "enum": [
21209
+ "CONFIGURING",
21210
+ "PENDING",
21211
+ "SUCCEED",
21212
+ "EXPIRED",
21213
+ "NEW_CERT_IN_PROGRESS"
21214
+ ]
21215
+ },
21216
+ "design_id": {
21217
+ "$ref": "#/components/schemas/EntityId"
21218
+ },
21219
+ "logo_image": {
21220
+ "type": "object",
21221
+ "description": "The logo to show for the portal in lists: the `logoImage` of the first page\nthat sets one. Absent when no page carries a logo; fall back to the design.\n",
21222
+ "properties": {
21223
+ "url": {
21224
+ "type": "string",
21225
+ "description": "Logo for the light theme",
21226
+ "example": "https://epilot-bucket.s3.eu-central-1.amazonaws.com/12344/logo.png"
21227
+ },
21228
+ "dark_url": {
21229
+ "type": "string",
21230
+ "description": "Logo for the dark theme"
21231
+ }
21232
+ }
21233
+ },
21234
+ "default_user_to_notify": {
21235
+ "type": "object",
21236
+ "description": "Default 360 user to notify upon an internal notification",
21237
+ "properties": {
21238
+ "onPendingUser": {
21239
+ "type": "array",
21240
+ "items": {
21241
+ "$ref": "#/components/schemas/AdminUser"
21242
+ },
21243
+ "description": "Default admin users for pending user notification to notify"
21244
+ }
21245
+ }
21246
+ },
21247
+ "feature_settings": {
21248
+ "$ref": "#/components/schemas/PortalFeatureSettings"
21249
+ },
21250
+ "self_registration_setting": {
21251
+ "type": "string",
21252
+ "enum": [
21253
+ "ALLOW_WITH_CONTACT_CREATION",
21254
+ "ALLOW_WITHOUT_CONTACT_CREATION",
21255
+ "DENY",
21256
+ "ALWAYS_CREATE_CONTACT",
21257
+ "DISALLOW_COMPLETELY",
21258
+ "BLOCK_IF_PORTAL_USER_EXISTS"
21259
+ ]
21260
+ },
21261
+ "self_registration_account_setting": {
21262
+ "type": "string",
21263
+ "enum": [
21264
+ "ALLOW_WITH_CREATION",
21265
+ "DENY",
21266
+ "ALWAYS_CREATE",
21267
+ "BLOCK_IF_PORTAL_USER_EXISTS",
21268
+ "DISALLOW_COMPLETELY"
21269
+ ]
21270
+ },
21271
+ "block_registration_if_portal_user_exists": {
21272
+ "type": "boolean"
21273
+ },
21274
+ "self_registration_entity": {
21275
+ "type": "string",
21276
+ "description": "Entity type used as the primary identifier for self-registration",
21277
+ "enum": [
21278
+ "contact",
21279
+ "account"
21280
+ ]
21281
+ },
21282
+ "user_account_self_management": {
21283
+ "type": "boolean",
21284
+ "description": "Enable or disable user account self management"
21285
+ },
21286
+ "registration_identifiers": {
21287
+ "type": "array",
21288
+ "description": "Identifiers to identify a contact of a portal user during the registration.",
21289
+ "items": {
21290
+ "$ref": "#/components/schemas/ContractIdentifier"
21291
+ }
21292
+ },
21293
+ "surfaces": {
21294
+ "type": "array",
21295
+ "description": "Surfaces this portal's data is reached from besides the portal UI itself.",
21296
+ "items": {
21297
+ "$ref": "#/components/schemas/PortalSurface"
21298
+ }
21299
+ },
21300
+ "is_dummy": {
21301
+ "type": "boolean"
21302
+ },
21303
+ "is_v3_item": {
21304
+ "type": "boolean"
21305
+ },
21306
+ "published_revision_id": {
21307
+ "type": "string",
21308
+ "readOnly": true,
21309
+ "description": "ID of the currently published revision, if the portal has been published"
21310
+ },
21311
+ "_created_at": {
21312
+ "type": "string",
21313
+ "format": "date-time",
21314
+ "readOnly": true
21315
+ },
21316
+ "_updated_at": {
21317
+ "type": "string",
21318
+ "format": "date-time",
21319
+ "readOnly": true
21320
+ }
21321
+ }
21322
+ },
20913
21323
  "JuiceSettings": {
20914
21324
  "type": "object",
20915
21325
  "properties": {
@@ -20929,6 +21339,30 @@
20929
21339
  "type": "string",
20930
21340
  "description": "The URL to redirect to",
20931
21341
  "example": "https://example.com"
21342
+ },
21343
+ "title": {
21344
+ "type": "string",
21345
+ "description": "Portal name, served as the document title before the app boots",
21346
+ "example": "Kundenportal"
21347
+ },
21348
+ "prevent_indexing": {
21349
+ "type": "boolean",
21350
+ "description": "Whether the served document should carry a `noindex, nofollow` robots meta tag"
21351
+ },
21352
+ "organization_id": {
21353
+ "type": "string",
21354
+ "description": "Organization of the portal, used to preload its design from the served document",
21355
+ "example": "123"
21356
+ },
21357
+ "design_id": {
21358
+ "type": "string",
21359
+ "description": "Design of the portal, used to preload it from the served document"
21360
+ },
21361
+ "design": {
21362
+ "type": "object",
21363
+ "additionalProperties": true,
21364
+ "nullable": true,
21365
+ "description": "The portal design as returned by design-builder parse (theme=NEW), for the served document; absent when the design could not be read"
20932
21366
  }
20933
21367
  }
20934
21368
  },
@@ -20991,6 +21425,9 @@
20991
21425
  "based_on_revision_id": {
20992
21426
  "type": "string"
20993
21427
  },
21428
+ "revision_source": {
21429
+ "$ref": "#/components/schemas/RevisionSource"
21430
+ },
20994
21431
  "pages": {
20995
21432
  "type": "array",
20996
21433
  "items": {
@@ -21024,6 +21461,40 @@
21024
21461
  }
21025
21462
  }
21026
21463
  },
21464
+ "UpdatePortalRevisionRequest": {
21465
+ "type": "object",
21466
+ "required": [
21467
+ "name"
21468
+ ],
21469
+ "properties": {
21470
+ "name": {
21471
+ "type": "string",
21472
+ "maxLength": 255,
21473
+ "description": "New label for the revision. Trimmed by the server; an empty name after trimming removes the revision's name.\n",
21474
+ "example": "FAQ page launch"
21475
+ }
21476
+ }
21477
+ },
21478
+ "RevisionSource": {
21479
+ "type": "object",
21480
+ "description": "Where a revision came from, when it was not saved in the builder. Not part of the portal config. The builder renders it in the viewer's language for an unnamed revision.\n",
21481
+ "additionalProperties": false,
21482
+ "required": [
21483
+ "type"
21484
+ ],
21485
+ "properties": {
21486
+ "type": {
21487
+ "type": "string",
21488
+ "enum": [
21489
+ "blueprint_sync"
21490
+ ]
21491
+ },
21492
+ "blueprint_title": {
21493
+ "type": "string",
21494
+ "maxLength": 200
21495
+ }
21496
+ }
21497
+ },
21027
21498
  "PortalRevisionSummary": {
21028
21499
  "type": "object",
21029
21500
  "required": [
@@ -21047,12 +21518,15 @@
21047
21518
  },
21048
21519
  "name": {
21049
21520
  "type": "string",
21050
- "description": "Set at publish time only, and only when the publish request carried one. A revision can have been published and still have no name; `published_at` is the signal that a revision was live at some point, not this field.\n",
21521
+ "description": "Set at publish time when the publish request carries one, or by renaming the revision with `updatePortalRevision`. A revision can have been published and still have no name; `published_at` is the signal that a revision was live at some point, not this field.\n",
21051
21522
  "example": "FAQ page launch"
21052
21523
  },
21053
21524
  "description": {
21054
21525
  "type": "string"
21055
21526
  },
21527
+ "source": {
21528
+ "$ref": "#/components/schemas/RevisionSource"
21529
+ },
21056
21530
  "page_count": {
21057
21531
  "type": "number"
21058
21532
  },
@@ -21207,9 +21681,82 @@
21207
21681
  },
21208
21682
  "SwappableConfig": {
21209
21683
  "type": "string",
21210
- "description": "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, auth_settings) can never be swapped and are therefore not part of this enum.",
21684
+ "description": "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, auth_settings) can never be swapped and are therefore not part of this enum.\n- `email_templates`: swap the email templates of the two portals.\n- `portal_references`: after the swap, re-point configuration in other services from the source portal to the target portal: the portal on journey login (AuthControl) blocks and in file upload portal access, and the portal of automation flow portal triggers. One-directional: references to the target portal are left unchanged, because the target keeps its domain and users. System flows are not changed. Uses the caller's permissions; the outcome is returned in `portal_references`.",
21211
21685
  "enum": [
21212
- "email_templates"
21686
+ "email_templates",
21687
+ "portal_references"
21688
+ ]
21689
+ },
21690
+ "SwapPortalReferencesResult": {
21691
+ "type": "object",
21692
+ "description": "Outcome of the `portal_references` swap option. Only present when that option was requested. The swap itself has already succeeded when this is returned, so failures here do not undo it.",
21693
+ "properties": {
21694
+ "journeys": {
21695
+ "$ref": "#/components/schemas/SwapPortalReferenceGroup"
21696
+ },
21697
+ "automation_flows": {
21698
+ "$ref": "#/components/schemas/SwapPortalReferenceGroup"
21699
+ }
21700
+ },
21701
+ "required": [
21702
+ "journeys",
21703
+ "automation_flows"
21704
+ ]
21705
+ },
21706
+ "SwapPortalReferenceGroup": {
21707
+ "type": "object",
21708
+ "properties": {
21709
+ "updated": {
21710
+ "type": "array",
21711
+ "description": "Items whose references now point at the target portal.",
21712
+ "items": {
21713
+ "$ref": "#/components/schemas/SwapPortalReferenceItem"
21714
+ }
21715
+ },
21716
+ "failed": {
21717
+ "type": "array",
21718
+ "description": "Items that reference the source portal but could not be updated.",
21719
+ "items": {
21720
+ "$ref": "#/components/schemas/SwapPortalReferenceItem"
21721
+ }
21722
+ },
21723
+ "list_error": {
21724
+ "type": "string",
21725
+ "description": "Set when the items could not be listed, so none of them were checked."
21726
+ }
21727
+ },
21728
+ "required": [
21729
+ "updated",
21730
+ "failed"
21731
+ ]
21732
+ },
21733
+ "SwapPortalReferenceItem": {
21734
+ "type": "object",
21735
+ "properties": {
21736
+ "id": {
21737
+ "type": "string",
21738
+ "description": "Journey id or automation flow id."
21739
+ },
21740
+ "name": {
21741
+ "type": "string"
21742
+ },
21743
+ "paths": {
21744
+ "type": "array",
21745
+ "description": "Where the reference sat in the item.",
21746
+ "items": {
21747
+ "type": "string"
21748
+ },
21749
+ "example": [
21750
+ "steps[0].uischema.elements[2].options.portalId"
21751
+ ]
21752
+ },
21753
+ "error": {
21754
+ "type": "string",
21755
+ "description": "Why the update failed. Only set on failed items."
21756
+ }
21757
+ },
21758
+ "required": [
21759
+ "id"
21213
21760
  ]
21214
21761
  },
21215
21762
  "PortalUserRegistrationStatus": {