@epilot/customer-portal-client 0.46.2 → 0.46.3

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@epilot/customer-portal-client",
3
- "version": "0.46.2",
3
+ "version": "0.46.3",
4
4
  "description": "API Client for epilot portal API",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -2717,6 +2717,12 @@
2717
2717
  "responses": {}
2718
2718
  }
2719
2719
  },
2720
+ "/v3/portal/configs/summaries": {
2721
+ "get": {
2722
+ "operationId": "listPortalConfigSummaries",
2723
+ "responses": {}
2724
+ }
2725
+ },
2720
2726
  "/v3/portal/config/swap": {
2721
2727
  "post": {
2722
2728
  "operationId": "swapPortalConfig",
package/src/openapi.json CHANGED
@@ -4036,7 +4036,7 @@
4036
4036
  "post": {
4037
4037
  "operationId": "identifyContact",
4038
4038
  "summary": "identifyContact",
4039
- "description": "Identify a contact by the portal's configured registration identifiers and, on a match,\nissue a short-lived bearer token that acts as that contact.\n\nResolution is identical to `checkContactExistsV3`. The token does not grant a portal\nsession; it is accepted only on the operations listed in `allowed_operations`, and\nexpires at `expires_at`. Requires `surface_id` to name a surface of the portal whose\n`authentication` is `registration_identifiers`; returns 403 otherwise. The token is\nconfined to that surface's data access. Requests may be rate limited (429).\n",
4039
+ "description": "Identify a contact by the surface's identifiers and, on a match, issue a short-lived\nbearer token that acts as that contact.\n\nThe identifiers checked are the surface's own `identifiers` when it configures any,\notherwise the portal's `registration_identifiers`. Their values are sent in the\n`registration_identifiers` request property. Resolution is otherwise identical to\n`checkContactExistsV3`: the same lookup, `registrationIdentifiersCheck` hook and\nTIMEOUT semantics, run on the surface's identifiers. The token does not grant a portal\nsession; it is accepted only on the operations listed in `allowed_operations`, and\nexpires at `expires_at`. Requires `surface_id` to name a surface of the portal whose\n`authentication` is `registration_identifiers`; returns 403 otherwise. The token is\nconfined to that surface's data access. Requests may be rate limited (429).\n\nNo portal session is expected, but the caller must present a public access token\n(`token_type: journey` or `token_type: portal`) as the bearer, minted for the same\n`org_id`; the request is rejected with 401 otherwise. It binds the call to the journey\nor portal it comes from — the token is public, so it proves origin, not identity.\n",
4040
4040
  "security": [],
4041
4041
  "tags": [
4042
4042
  "Public"
@@ -10747,7 +10747,7 @@
10747
10747
  "delete": {
10748
10748
  "operationId": "deletePortalConfig",
10749
10749
  "summary": "deletePortalConfig",
10750
- "description": "Deletes a specific portal configuration by ID.",
10750
+ "description": "Deletes a specific portal configuration by ID, together with everything the portal owns:\nits pages, revisions, email templates and widget configuration. The custom domain network\nsetup is torn down asynchronously afterwards.\n",
10751
10751
  "tags": [
10752
10752
  "ECP Admin"
10753
10753
  ],
@@ -11115,6 +11115,50 @@
11115
11115
  }
11116
11116
  }
11117
11117
  },
11118
+ "/v3/portal/configs/summaries": {
11119
+ "get": {
11120
+ "operationId": "listPortalConfigSummaries",
11121
+ "summary": "listPortalConfigSummaries",
11122
+ "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",
11123
+ "tags": [
11124
+ "ECP Admin"
11125
+ ],
11126
+ "security": [
11127
+ {
11128
+ "EpilotAuth": []
11129
+ }
11130
+ ],
11131
+ "responses": {
11132
+ "200": {
11133
+ "description": "Portal config summaries retrieved successfully.",
11134
+ "content": {
11135
+ "application/json": {
11136
+ "schema": {
11137
+ "type": "object",
11138
+ "properties": {
11139
+ "data": {
11140
+ "type": "array",
11141
+ "items": {
11142
+ "$ref": "#/components/schemas/PortalConfigSummaryV3"
11143
+ }
11144
+ }
11145
+ }
11146
+ }
11147
+ }
11148
+ }
11149
+ },
11150
+ "401": {
11151
+ "$ref": "#/components/responses/Unauthorized"
11152
+ },
11153
+ "403": {
11154
+ "$ref": "#/components/responses/Forbidden"
11155
+ },
11156
+ "500": {
11157
+ "$ref": "#/components/responses/InternalServerError"
11158
+ }
11159
+ }
11160
+ }
11161
+ },
11118
11162
  "/v3/portal/config/swap": {
11119
11163
  "post": {
11120
11164
  "operationId": "swapPortalConfig",
@@ -12477,6 +12521,42 @@
12477
12521
  }
12478
12522
  }
12479
12523
  },
12524
+ "NewDesignMigrationResult": {
12525
+ "type": "object",
12526
+ "properties": {
12527
+ "org_id": {
12528
+ "type": "string"
12529
+ },
12530
+ "portal_id": {
12531
+ "type": "string"
12532
+ },
12533
+ "origin": {
12534
+ "type": "string"
12535
+ },
12536
+ "name": {
12537
+ "type": "string"
12538
+ },
12539
+ "is_v3_item": {
12540
+ "type": "boolean"
12541
+ },
12542
+ "dry_run": {
12543
+ "type": "boolean"
12544
+ },
12545
+ "migrated": {
12546
+ "type": "boolean",
12547
+ "description": "True when the migration was written (false for dry_run)"
12548
+ },
12549
+ "summary": {
12550
+ "type": "object",
12551
+ "additionalProperties": true
12552
+ },
12553
+ "before": {
12554
+ "type": "object",
12555
+ "description": "Stored feature_settings and pages before the migration, for rollback",
12556
+ "additionalProperties": true
12557
+ }
12558
+ }
12559
+ },
12480
12560
  "OtaPortal": {
12481
12561
  "type": "object",
12482
12562
  "description": "A portal that has mobile OTA updates enabled.",
@@ -13069,37 +13149,7 @@
13069
13149
  "example": false
13070
13150
  },
13071
13151
  "feature_settings": {
13072
- "type": "object",
13073
- "description": "Feature settings for the portal",
13074
- "properties": {
13075
- "start_page": {
13076
- "type": "boolean",
13077
- "description": "Start page feature flag"
13078
- },
13079
- "billing": {
13080
- "type": "boolean",
13081
- "description": "Billing feature flag"
13082
- },
13083
- "change_due_date": {
13084
- "type": "boolean",
13085
- "description": "Change due date feature flag"
13086
- },
13087
- "new_design": {
13088
- "type": "boolean",
13089
- "description": "Enable or disable the new design for the portal"
13090
- },
13091
- "mcp_enabled": {
13092
- "type": "boolean",
13093
- "description": "Enable the MCP (AI agent) connector channel for this portal"
13094
- },
13095
- "mcp_grant_version": {
13096
- "type": "integer",
13097
- "minimum": 0,
13098
- "default": 0,
13099
- "readOnly": true,
13100
- "description": "Server-managed generation used to invalidate MCP grants after the connector is disabled or re-enabled"
13101
- }
13102
- }
13152
+ "$ref": "#/components/schemas/PortalFeatureSettings"
13103
13153
  },
13104
13154
  "accessToken": {
13105
13155
  "type": "string",
@@ -14104,7 +14154,7 @@
14104
14154
  }
14105
14155
  },
14106
14156
  "ContactIdentifyRequest": {
14107
- "description": "ContactExistsRequest plus the surface the token is requested for.\n",
14157
+ "description": "ContactExistsRequest plus the surface the token is requested for. `registration_identifiers` carries the values of the surface's effective identifiers (keyed by schema, then attribute name): the surface's own `identifiers` when it configures any, otherwise the portal's `registration_identifiers`.\n",
14108
14158
  "allOf": [
14109
14159
  {
14110
14160
  "$ref": "#/components/schemas/ContactExistsRequest"
@@ -14558,6 +14608,14 @@
14558
14608
  "format": "uuid"
14559
14609
  }
14560
14610
  },
14611
+ "match_any_targets": {
14612
+ "type": "array",
14613
+ "description": "The entity must match at least one of these targets. Combined with `targets` (all of which must match) using AND.",
14614
+ "items": {
14615
+ "type": "string",
14616
+ "format": "uuid"
14617
+ }
14618
+ },
14561
14619
  "templates": {
14562
14620
  "type": "object",
14563
14621
  "deprecated": true,
@@ -15695,7 +15753,7 @@
15695
15753
  "login",
15696
15754
  "registration_identifiers"
15697
15755
  ],
15698
- "description": "How a caller on this surface proves who they are.\n\n- `login`: a logged-in portal user token (the portal's own authentication).\n- `registration_identifiers`: the caller supplies the portal's\n `registration_identifiers` to `identifyContact` and receives a short-lived\n contact identification token. Anyone who knows or guesses those values can\n use this surface, so its data access should be as narrow as the use case allows.\n\n`anonymous` (no proof of identity at all) is planned and not accepted yet.\n"
15756
+ "description": "How a caller on this surface proves who they are.\n\n- `login`: a logged-in portal user token (the portal's own authentication).\n- `registration_identifiers`: the caller supplies the values of the surface's\n identifiers (its own `identifiers`, or the portal's `registration_identifiers`\n when it sets none) to `identifyContact` and receives a short-lived contact\n identification token. Anyone who knows or guesses those values can use this\n surface, so its data access should be as narrow as the use case allows.\n\n`anonymous` (no proof of identity at all) is planned and not accepted yet.\n"
15699
15757
  },
15700
15758
  "token_ttl_seconds": {
15701
15759
  "type": "integer",
@@ -15705,6 +15763,23 @@
15705
15763
  "maximum": 900,
15706
15764
  "description": "Lifetime of tokens minted for this surface. Only used with `registration_identifiers`."
15707
15765
  },
15766
+ "identifiers": {
15767
+ "type": "array",
15768
+ "description": "Identifier attributes a caller must supply on this surface to be identified. Only\nused with `authentication: registration_identifiers`.\n\nOmitted or empty means the surface uses the portal's `registration_identifiers`.\nWhen set, these replace the portal's `registration_identifiers` on this surface\nonly: `identifyContact` requires a value for each of them (400 listing the missing\nones otherwise), runs the contact lookup and the `registrationIdentifiersCheck`\nhook on them, and refuses to issue tokens (403) unless there are at least two.\nEntries without `name` or `schema` are ignored.\n",
15769
+ "items": {
15770
+ "$ref": "#/components/schemas/RegistrationIdentifier"
15771
+ },
15772
+ "example": [
15773
+ {
15774
+ "name": "customer_number",
15775
+ "schema": "contact"
15776
+ },
15777
+ {
15778
+ "name": "meter_number",
15779
+ "schema": "meter"
15780
+ }
15781
+ ]
15782
+ },
15708
15783
  "data_access": {
15709
15784
  "$ref": "#/components/schemas/PortalSurfaceDataAccess"
15710
15785
  }
@@ -15831,6 +15906,123 @@
15831
15906
  }
15832
15907
  }
15833
15908
  },
15909
+ "JourneyContextUsagesRequest": {
15910
+ "type": "object",
15911
+ "required": [
15912
+ "journey_id",
15913
+ "param_keys"
15914
+ ],
15915
+ "properties": {
15916
+ "journey_id": {
15917
+ "type": "string",
15918
+ "description": "Journey whose context parameters are being looked up"
15919
+ },
15920
+ "param_keys": {
15921
+ "type": "array",
15922
+ "description": "Context parameter names (the `paramKey` of each parameter)",
15923
+ "items": {
15924
+ "type": "string"
15925
+ }
15926
+ },
15927
+ "param_ids": {
15928
+ "type": "array",
15929
+ "description": "Accepted for a uniform adapter request shape; portals reference parameters by name only, so this is ignored.",
15930
+ "items": {
15931
+ "type": "string"
15932
+ }
15933
+ }
15934
+ }
15935
+ },
15936
+ "JourneyContextUsagesResponse": {
15937
+ "type": "object",
15938
+ "required": [
15939
+ "usages",
15940
+ "status",
15941
+ "scanned"
15942
+ ],
15943
+ "properties": {
15944
+ "status": {
15945
+ "type": "string",
15946
+ "enum": [
15947
+ "ok",
15948
+ "partial"
15949
+ ],
15950
+ "description": "partial when the row cap, the soft deadline or a failed portal truncated the result"
15951
+ },
15952
+ "scanned": {
15953
+ "type": "integer",
15954
+ "description": "Portals examined"
15955
+ },
15956
+ "usages": {
15957
+ "type": "array",
15958
+ "items": {
15959
+ "type": "object",
15960
+ "required": [
15961
+ "kind",
15962
+ "resource",
15963
+ "location",
15964
+ "matched_as"
15965
+ ],
15966
+ "properties": {
15967
+ "kind": {
15968
+ "type": "string",
15969
+ "enum": [
15970
+ "portal-config",
15971
+ "portal-block",
15972
+ "portal-widget"
15973
+ ]
15974
+ },
15975
+ "resource": {
15976
+ "type": "object",
15977
+ "required": [
15978
+ "type",
15979
+ "id"
15980
+ ],
15981
+ "properties": {
15982
+ "type": {
15983
+ "type": "string",
15984
+ "enum": [
15985
+ "portal"
15986
+ ]
15987
+ },
15988
+ "id": {
15989
+ "type": "string"
15990
+ },
15991
+ "name": {
15992
+ "type": "string"
15993
+ }
15994
+ }
15995
+ },
15996
+ "location": {
15997
+ "type": "object",
15998
+ "additionalProperties": true
15999
+ },
16000
+ "matched_as": {
16001
+ "type": "object",
16002
+ "required": [
16003
+ "dialect",
16004
+ "token"
16005
+ ],
16006
+ "properties": {
16007
+ "dialect": {
16008
+ "type": "string",
16009
+ "enum": [
16010
+ "name"
16011
+ ]
16012
+ },
16013
+ "token": {
16014
+ "type": "string"
16015
+ },
16016
+ "at": {
16017
+ "type": "string"
16018
+ }
16019
+ }
16020
+ }
16021
+ }
16022
+ }
16023
+ }
16024
+ }
16025
+ },
15834
16026
  "ExternalLink": {
15835
16027
  "type": "object",
15836
16028
  "properties": {
@@ -16122,6 +16314,9 @@
16122
16314
  "items": {
16123
16315
  "$ref": "#/components/schemas/PortalWorkflowStage"
16124
16316
  }
16317
+ },
16318
+ "portal_titles": {
16319
+ "$ref": "#/components/schemas/PortalNameOverrides"
16125
16320
  }
16126
16321
  },
16127
16322
  "required": [
@@ -16154,13 +16349,20 @@
16154
16349
  "enum": [
16155
16350
  "COMPLETED",
16156
16351
  "IN_PROGRESS",
16157
- "UPCOMING"
16352
+ "UPCOMING",
16353
+ "NOT_REACHED"
16158
16354
  ],
16159
- "description": "Derived progress status:\n- COMPLETED: every task of the stage is done, and the flow has moved past it\n- IN_PROGRESS: the flow's current work is inside this stage\n- UPCOMING: the flow has not reached this stage yet\n"
16355
+ "description": "Derived progress status:\n- COMPLETED: every task of the stage is done, and the flow has moved past it\n- IN_PROGRESS: the flow's current work is inside this stage\n- UPCOMING: the flow has not reached this stage yet\n- NOT_REACHED: the flow finished (DONE or CLOSED) before reaching this stage — a run may legitimately end at any stage\n"
16160
16356
  },
16161
16357
  "completed_at": {
16162
16358
  "type": "string",
16163
16359
  "description": "Latest completion timestamp among the stage's tasks; set only when the\nstage is COMPLETED and at least one of its tasks recorded one\n"
16360
+ },
16361
+ "portal_names": {
16362
+ "$ref": "#/components/schemas/PortalNameOverrides"
16363
+ },
16364
+ "portal_descriptions": {
16365
+ "$ref": "#/components/schemas/PortalDescriptionOverrides"
16164
16366
  }
16165
16367
  },
16166
16368
  "required": [
@@ -16169,6 +16371,34 @@
16169
16371
  "status"
16170
16372
  ]
16171
16373
  },
16374
+ "PortalNameOverrides": {
16375
+ "type": "object",
16376
+ "description": "Portal-facing overrides of a flow or stage title, configured per portal\naudience in the Flows Hub. Served unresolved because this endpoint asks\nthe Workflows API for audience `all` — one cached response feeds blocks\nof both audiences, so each block picks its own override and falls back\nto `name` when the key is absent.\n",
16377
+ "properties": {
16378
+ "ecp": {
16379
+ "type": "string",
16380
+ "description": "Title shown in the End Customer Portal"
16381
+ },
16382
+ "installer": {
16383
+ "type": "string",
16384
+ "description": "Title shown in the Installer Portal"
16385
+ }
16386
+ }
16387
+ },
16388
+ "PortalDescriptionOverrides": {
16389
+ "type": "object",
16390
+ "description": "Portal-facing overrides of a stage description, configured per portal\naudience in the Flows Hub. Served unresolved for the same reason as\n`PortalNameOverrides`; a block falls back to `description` when its\naudience's key is absent. The values are rich text, like `description`\nitself.\n",
16391
+ "properties": {
16392
+ "ecp": {
16393
+ "type": "string",
16394
+ "description": "Description shown in the End Customer Portal"
16395
+ },
16396
+ "installer": {
16397
+ "type": "string",
16398
+ "description": "Description shown in the Installer Portal"
16399
+ }
16400
+ }
16401
+ },
16172
16402
  "PortalWorkflowTask": {
16173
16403
  "type": "object",
16174
16404
  "description": "A single portal-visible task of a linearized workflow execution",
@@ -16218,6 +16448,10 @@
16218
16448
  "name": {
16219
16449
  "type": "string"
16220
16450
  },
16451
+ "portal_button_label": {
16452
+ "type": "string",
16453
+ "description": "Portal-facing label configured in the Flows Hub that replaces the portal's default \"Start now\" button for this journey. Blank or absent means the portal keeps its own translated default."
16454
+ },
16221
16455
  "complete_task_automatically": {
16222
16456
  "type": "boolean",
16223
16457
  "description": "If true, the task is auto completed when the journey is completed"
@@ -16304,6 +16538,10 @@
16304
16538
  "name": {
16305
16539
  "type": "string"
16306
16540
  },
16541
+ "portal_button_label": {
16542
+ "type": "string",
16543
+ "description": "Portal-facing label configured in the Flows Hub that replaces the portal's default \"Start now\" button for this journey."
16544
+ },
16307
16545
  "complete_task_automatically": {
16308
16546
  "type": "boolean"
16309
16547
  }
@@ -16874,6 +17112,18 @@
16874
17112
  "3ec28ab5-8598-41ef-9486-b57fca1d5e2a"
16875
17113
  ]
16876
17114
  },
17115
+ "match_any_targets": {
17116
+ "type": "array",
17117
+ "description": "The entity must match at least one of these targets. Combined with `targets` (all of which must match) using AND.",
17118
+ "items": {
17119
+ "type": "string",
17120
+ "format": "uuid"
17121
+ },
17122
+ "example": [
17123
+ "3ec28ab5-8598-41ef-9486-b57fca1d5e2a",
17124
+ "5f2c1e7a-6b0d-4a8e-9c3f-1d2e3f4a5b6c"
17125
+ ]
17126
+ },
16877
17127
  "include": {
16878
17128
  "type": "array",
16879
17129
  "description": "Optional enrichment data to side-load alongside results under the `includes` response key.",
@@ -19985,37 +20235,7 @@
19985
20235
  "example": false
19986
20236
  },
19987
20237
  "feature_settings": {
19988
- "type": "object",
19989
- "description": "Feature settings for the portal",
19990
- "properties": {
19991
- "start_page": {
19992
- "type": "boolean",
19993
- "description": "Start page feature flag"
19994
- },
19995
- "billing": {
19996
- "type": "boolean",
19997
- "description": "Billing feature flag"
19998
- },
19999
- "change_due_date": {
20000
- "type": "boolean",
20001
- "description": "Change due date feature flag"
20002
- },
20003
- "new_design": {
20004
- "type": "boolean",
20005
- "description": "Enable or disable the new design for the portal"
20006
- },
20007
- "mcp_enabled": {
20008
- "type": "boolean",
20009
- "description": "Enable the MCP (AI agent) connector channel for this portal"
20010
- },
20011
- "mcp_grant_version": {
20012
- "type": "integer",
20013
- "minimum": 0,
20014
- "default": 0,
20015
- "readOnly": true,
20016
- "description": "Server-managed generation used to invalidate MCP grants after the connector is disabled or re-enabled"
20017
- }
20018
- }
20238
+ "$ref": "#/components/schemas/PortalFeatureSettings"
20019
20239
  },
20020
20240
  "accessToken": {
20021
20241
  "type": "string",
@@ -20674,6 +20894,176 @@
20674
20894
  }
20675
20895
  ]
20676
20896
  },
20897
+ "PortalFeatureSettings": {
20898
+ "type": "object",
20899
+ "description": "Feature settings for the portal",
20900
+ "properties": {
20901
+ "start_page": {
20902
+ "type": "boolean",
20903
+ "description": "Start page feature flag"
20904
+ },
20905
+ "billing": {
20906
+ "type": "boolean",
20907
+ "description": "Billing feature flag"
20908
+ },
20909
+ "change_due_date": {
20910
+ "type": "boolean",
20911
+ "description": "Change due date feature flag"
20912
+ },
20913
+ "new_design": {
20914
+ "type": "boolean",
20915
+ "description": "Enable or disable the new design for the portal"
20916
+ },
20917
+ "mcp_enabled": {
20918
+ "type": "boolean",
20919
+ "description": "Enable the MCP (AI agent) connector channel for this portal"
20920
+ },
20921
+ "mcp_grant_version": {
20922
+ "type": "integer",
20923
+ "minimum": 0,
20924
+ "default": 0,
20925
+ "readOnly": true,
20926
+ "description": "Server-managed generation used to invalidate MCP grants after the connector is disabled or re-enabled"
20927
+ }
20928
+ }
20929
+ },
20930
+ "PortalConfigSummaryV3": {
20931
+ "type": "object",
20932
+ "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",
20933
+ "properties": {
20934
+ "portal_id": {
20935
+ "$ref": "#/components/schemas/PortalId"
20936
+ },
20937
+ "organization_id": {
20938
+ "type": "string",
20939
+ "example": 12345,
20940
+ "description": "ID of the organization"
20941
+ },
20942
+ "origin": {
20943
+ "$ref": "#/components/schemas/Origin"
20944
+ },
20945
+ "name": {
20946
+ "type": "string",
20947
+ "description": "Name of the portal"
20948
+ },
20949
+ "enabled": {
20950
+ "type": "boolean",
20951
+ "description": "Whether the portal is enabled"
20952
+ },
20953
+ "domain": {
20954
+ "type": "string",
20955
+ "description": "Custom domain of the portal"
20956
+ },
20957
+ "epilot_domain": {
20958
+ "type": "string",
20959
+ "description": "epilot-hosted domain of the portal"
20960
+ },
20961
+ "is_epilot_domain": {
20962
+ "type": "boolean"
20963
+ },
20964
+ "dnsStatus": {
20965
+ "type": "string",
20966
+ "description": "Status of the custom domain setup, when a custom domain is configured",
20967
+ "enum": [
20968
+ "CONFIGURING",
20969
+ "PENDING",
20970
+ "SUCCEED",
20971
+ "EXPIRED",
20972
+ "NEW_CERT_IN_PROGRESS"
20973
+ ]
20974
+ },
20975
+ "design_id": {
20976
+ "$ref": "#/components/schemas/EntityId"
20977
+ },
20978
+ "default_user_to_notify": {
20979
+ "type": "object",
20980
+ "description": "Default 360 user to notify upon an internal notification",
20981
+ "properties": {
20982
+ "onPendingUser": {
20983
+ "type": "array",
20984
+ "items": {
20985
+ "$ref": "#/components/schemas/AdminUser"
20986
+ },
20987
+ "description": "Default admin users for pending user notification to notify"
20988
+ }
20989
+ }
20990
+ },
20991
+ "feature_settings": {
20992
+ "$ref": "#/components/schemas/PortalFeatureSettings"
20993
+ },
20994
+ "self_registration_setting": {
20995
+ "type": "string",
20996
+ "enum": [
20997
+ "ALLOW_WITH_CONTACT_CREATION",
20998
+ "ALLOW_WITHOUT_CONTACT_CREATION",
20999
+ "DENY",
21000
+ "ALWAYS_CREATE_CONTACT",
21001
+ "DISALLOW_COMPLETELY",
21002
+ "BLOCK_IF_PORTAL_USER_EXISTS"
21003
+ ]
21004
+ },
21005
+ "self_registration_account_setting": {
21006
+ "type": "string",
21007
+ "enum": [
21008
+ "ALLOW_WITH_CREATION",
21009
+ "DENY",
21010
+ "ALWAYS_CREATE",
21011
+ "BLOCK_IF_PORTAL_USER_EXISTS",
21012
+ "DISALLOW_COMPLETELY"
21013
+ ]
21014
+ },
21015
+ "block_registration_if_portal_user_exists": {
21016
+ "type": "boolean"
21017
+ },
21018
+ "self_registration_entity": {
21019
+ "type": "string",
21020
+ "description": "Entity type used as the primary identifier for self-registration",
21021
+ "enum": [
21022
+ "contact",
21023
+ "account"
21024
+ ]
21025
+ },
21026
+ "user_account_self_management": {
21027
+ "type": "boolean",
21028
+ "description": "Enable or disable user account self management"
21029
+ },
21030
+ "registration_identifiers": {
21031
+ "type": "array",
21032
+ "description": "Identifiers to identify a contact of a portal user during the registration.",
21033
+ "items": {
21034
+ "$ref": "#/components/schemas/ContractIdentifier"
21035
+ }
21036
+ },
21037
+ "surfaces": {
21038
+ "type": "array",
21039
+ "description": "Surfaces this portal's data is reached from besides the portal UI itself.",
21040
+ "items": {
21041
+ "$ref": "#/components/schemas/PortalSurface"
21042
+ }
21043
+ },
21044
+ "is_dummy": {
21045
+ "type": "boolean"
21046
+ },
21047
+ "is_v3_item": {
21048
+ "type": "boolean"
21049
+ },
21050
+ "published_revision_id": {
21051
+ "type": "string",
21052
+ "readOnly": true,
21053
+ "description": "ID of the currently published revision, if the portal has been published"
21054
+ },
21055
+ "_created_at": {
21056
+ "type": "string",
21057
+ "format": "date-time",
21058
+ "readOnly": true
21059
+ },
21060
+ "_updated_at": {
21061
+ "type": "string",
21062
+ "format": "date-time",
21063
+ "readOnly": true
21064
+ }
21065
+ }
21066
+ },
20677
21067
  "JuiceSettings": {
20678
21068
  "type": "object",
20679
21069
  "properties": {