@epilot/customer-portal-client 0.50.0 → 0.51.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/dist/openapi.d.ts CHANGED
@@ -20,72 +20,15 @@ declare namespace Components {
20
20
  reason: "invalid_token";
21
21
  }
22
22
  export type Conflict = Schemas.ErrorResp;
23
- export interface ContactAmbiguousMatch {
24
- /**
25
- * The HTTP status code, repeated in the body.
26
- * example:
27
- * 409
28
- */
29
- status: number;
30
- /**
31
- * Human-readable error message. For support, not for display to end customers.
32
- */
33
- error: string;
34
- reason: "AMBIGUOUS_MATCH";
35
- /**
36
- * Correlation id of the ERP sync that was waited on.
37
- */
38
- correlation_id?: string; // ^[A-Za-z0-9_-]+$
39
- }
40
23
  export interface ContractAssignmentConflict {
41
24
  /**
42
25
  * Error message
43
26
  */
44
27
  message?: string;
45
28
  /**
46
- * Reason why the contract is not assignable.
47
- * - `DRAFT`: the contract is still a draft.
48
- * - `MULTIPLE`: multiple contracts were found and the business logic does not allow it.
49
- * - `SELF_ASSIGNMENT_DISABLED`: the contract already has a contact assigned and
50
- * self-assignment is disabled.
51
- * - `AMBIGUOUS_MATCH`: the portal waited on the Integration Toolkit and the ERP
52
- * delivered entities it cannot tell apart (several matching the selector, or
53
- * contracts naming different customers). Nothing was assigned, and retrying
54
- * will not help.
55
- *
56
- */
57
- reason: "DRAFT" | "MULTIPLE" | "SELF_ASSIGNMENT_DISABLED" | "AMBIGUOUS_MATCH";
58
- /**
59
- * The HTTP status code, repeated in the body.
60
- * example:
61
- * 409
62
- */
63
- status?: number;
64
- /**
65
- * Human-readable error message. For support, not for display to end customers.
66
- */
67
- error?: string;
68
- /**
69
- * Correlation id of the ERP sync that was waited on. Present only with `AMBIGUOUS_MATCH`.
70
- */
71
- correlation_id?: string; // ^[A-Za-z0-9_-]+$
72
- }
73
- export interface ContractAssignmentNotFound {
74
- /**
75
- * The HTTP status code, repeated in the body.
76
- * example:
77
- * 404
78
- */
79
- status: number;
80
- /**
81
- * Human-readable error message. For support, not for display to end customers.
29
+ * Reason why the contract is not assignable. If the reason is "MULTIPLE", the contract is not assignable because multiple contracts were found and the business logic does not allow it.
82
30
  */
83
- error: string;
84
- reason?: "TIMEOUT" | "INCOMPLETE";
85
- /**
86
- * Correlation id of the ERP sync that was waited on. Present with `TIMEOUT` and `INCOMPLETE`.
87
- */
88
- correlation_id?: string; // ^[A-Za-z0-9_-]+$
31
+ reason: "DRAFT" | "MULTIPLE";
89
32
  }
90
33
  export type Forbidden = Schemas.ErrorResp;
91
34
  export type ForbiddenByRule = Schemas.ErrorResp | Schemas.FailedRuleErrorResp;
@@ -831,6 +774,20 @@ declare namespace Components {
831
774
  * c495fef9-eeca-4019-a989-8390dcd9825b
832
775
  */
833
776
  id?: string; // uuid
777
+ /**
778
+ * Blueprint instance ids managing this block. Non-empty means the block is blueprint-managed and read-only for users until it is detached. Server-managed: ignored (stripped) on every write from a user.
779
+ *
780
+ */
781
+ _manifest?: string[];
782
+ /**
783
+ * Stable id of this block in the blueprint source. Server-managed.
784
+ */
785
+ _lineage_id?: string;
786
+ /**
787
+ * Reserved for author-defined block levels (e.g. `dummy`, `strict`). Not interpreted yet. Server-managed: ignored (stripped) on every write from a user.
788
+ *
789
+ */
790
+ _level?: string;
834
791
  }
835
792
  /**
836
793
  * The id of the block
@@ -1145,6 +1102,16 @@ declare namespace Components {
1145
1102
  */
1146
1103
  enabled?: boolean;
1147
1104
  };
1105
+ /**
1106
+ * Opt-in, set by the configuring user. When enabled, a second factor is enforced after the password and portal users can add passkeys (fingerprint, face or device PIN) as one variant of it, next to the email code of advanced_mfa. Users with a passkey use it by default; with advanced_mfa off, the passkey is the only second factor once a user has added one. On passwordless portals a passkey can replace the email code. Passkeys are bound to the domain they were added on. Default off; turning it off again restores the previous behaviour and keeps registered passkeys.
1107
+ *
1108
+ */
1109
+ passkeys?: {
1110
+ /**
1111
+ * Enforce a second factor and allow passkeys as one variant of it
1112
+ */
1113
+ enabled?: boolean;
1114
+ };
1148
1115
  entry_point?: "PASSWORD" | "SSO";
1149
1116
  preferred_sso_providers?: /**
1150
1117
  * URL-friendly slug to use as organization-unique identifier for Provider
@@ -1172,6 +1139,12 @@ declare namespace Components {
1172
1139
  * 6bsd0jkgoie74k2i8mrhc1vest
1173
1140
  */
1174
1141
  cognito_user_pool_client_id?: string;
1142
+ /**
1143
+ * Cognito user pool client ID used by the native portal apps (longer refresh token validity)
1144
+ * example:
1145
+ * 3k9fj2l1m0n8b7v6c5x4z3a2s1
1146
+ */
1147
+ cognito_mobile_client_id?: string;
1175
1148
  /**
1176
1149
  * Cognito user pool ARN
1177
1150
  * example:
@@ -1364,6 +1337,13 @@ declare namespace Components {
1364
1337
  * ]
1365
1338
  */
1366
1339
  contract_identifiers?: ContractIdentifier[];
1340
+ /**
1341
+ * What the built-in self-assignment (without a contractIdentification hook) assigns once the `contract_identifiers` match a Contract:
1342
+ * - `contracts`: the user's Contact is added as a customer of the Contract.
1343
+ * - `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.
1344
+ *
1345
+ */
1346
+ self_assignment_mode?: "contracts" | "customer_to_portal_user";
1367
1347
  /**
1368
1348
  * Configuration for contract selector in the portal
1369
1349
  */
@@ -1547,7 +1527,7 @@ declare namespace Components {
1547
1527
  */
1548
1528
  is_dummy?: boolean;
1549
1529
  /**
1550
- * Whether this is a v3 portal configuration
1530
+ * Always true. Legacy v2 storage was migrated; field kept for compatibility and will be removed.
1551
1531
  */
1552
1532
  is_v3_item?: boolean;
1553
1533
  /**
@@ -1586,6 +1566,7 @@ declare namespace Components {
1586
1566
  * Master toggle for the portal's engagement center (in-app notifications including the notification triggers above). Off when absent — portal users only see the engagement center and receive trigger notifications after an admin enables it.
1587
1567
  */
1588
1568
  engagement_center_enabled?: boolean;
1569
+ engagement_center_task_templates?: /* Handlebars templates rendering each outstanding task (to-do) row in the portal's engagement center. Resolved server-side per task against the task's entity (same variable syntax as page block templates, e.g. `{{order.order_number}}`, custom and environment variables) plus `task.*` (the workflow step, e.g. `{{task.name}}`), `workflow.*` (the execution, e.g. `{{workflow.name}}`) and `entity.*` (the task's entity regardless of its schema, e.g. `{{entity._title}}`). A template that is absent or blank keeps the portal's default rendering for that line. Admin/builder-only — never exposed via the public portal config. */ EngagementCenterTaskTemplates;
1589
1570
  }
1590
1571
  export interface CommonConfigAttributesV3 {
1591
1572
  /**
@@ -1685,6 +1666,16 @@ declare namespace Components {
1685
1666
  */
1686
1667
  enabled?: boolean;
1687
1668
  };
1669
+ /**
1670
+ * Opt-in, set by the configuring user. When enabled, a second factor is enforced after the password and portal users can add passkeys (fingerprint, face or device PIN) as one variant of it, next to the email code of advanced_mfa. Users with a passkey use it by default; with advanced_mfa off, the passkey is the only second factor once a user has added one. On passwordless portals a passkey can replace the email code. Passkeys are bound to the domain they were added on. Default off; turning it off again restores the previous behaviour and keeps registered passkeys.
1671
+ *
1672
+ */
1673
+ passkeys?: {
1674
+ /**
1675
+ * Enforce a second factor and allow passkeys as one variant of it
1676
+ */
1677
+ enabled?: boolean;
1678
+ };
1688
1679
  entry_point?: "PASSWORD" | "SSO";
1689
1680
  preferred_sso_providers?: /**
1690
1681
  * URL-friendly slug to use as organization-unique identifier for Provider
@@ -1712,6 +1703,12 @@ declare namespace Components {
1712
1703
  * 6bsd0jkgoie74k2i8mrhc1vest
1713
1704
  */
1714
1705
  cognito_user_pool_client_id?: string;
1706
+ /**
1707
+ * Cognito user pool client ID used by the native portal apps (longer refresh token validity)
1708
+ * example:
1709
+ * 3k9fj2l1m0n8b7v6c5x4z3a2s1
1710
+ */
1711
+ cognito_mobile_client_id?: string;
1715
1712
  /**
1716
1713
  * Cognito user pool ARN
1717
1714
  * example:
@@ -1904,6 +1901,13 @@ declare namespace Components {
1904
1901
  * ]
1905
1902
  */
1906
1903
  contract_identifiers?: ContractIdentifier[];
1904
+ /**
1905
+ * What the built-in self-assignment (without a contractIdentification hook) assigns once the `contract_identifiers` match a Contract:
1906
+ * - `contracts`: the user's Contact is added as a customer of the Contract.
1907
+ * - `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.
1908
+ *
1909
+ */
1910
+ self_assignment_mode?: "contracts" | "customer_to_portal_user";
1907
1911
  /**
1908
1912
  * Configuration for contract selector in the portal
1909
1913
  */
@@ -2087,7 +2091,7 @@ declare namespace Components {
2087
2091
  */
2088
2092
  is_dummy?: boolean;
2089
2093
  /**
2090
- * Whether this is a v3 portal configuration
2094
+ * Always true. Legacy v2 storage was migrated; field kept for compatibility and will be removed.
2091
2095
  */
2092
2096
  is_v3_item?: boolean;
2093
2097
  /**
@@ -2230,19 +2234,6 @@ declare namespace Components {
2230
2234
  *
2231
2235
  */
2232
2236
  trigger_identifiers_check?: boolean;
2233
- /**
2234
- * Correlation id of an already triggered ERP sync, as returned by a previous call that
2235
- * answered `reason: TIMEOUT`. Sent together with `trigger_identifiers_check: false` on a
2236
- * retry so the portal keeps waiting on the same correlation instead of starting over.
2237
- * Only used by portals configured with
2238
- * `extension_hooks.registrationIdentifiersCheck.wait_for_toolkit`; ignored otherwise.
2239
- * At most 255 letters, digits, hyphens and underscores: the toolkit's bound for a
2240
- * correlation id and the charset it enforces on its identifiers.
2241
- *
2242
- * example:
2243
- * 0199c0d5-6f1c-7a3b-9e21-9a9ce1d1b2c3
2244
- */
2245
- correlation_id?: string; // ^[A-Za-z0-9_-]+$
2246
2237
  }
2247
2238
  /**
2248
2239
  * 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`.
@@ -2281,19 +2272,6 @@ declare namespace Components {
2281
2272
  *
2282
2273
  */
2283
2274
  trigger_identifiers_check?: boolean;
2284
- /**
2285
- * Correlation id of an already triggered ERP sync, as returned by a previous call that
2286
- * answered `reason: TIMEOUT`. Sent together with `trigger_identifiers_check: false` on a
2287
- * retry so the portal keeps waiting on the same correlation instead of starting over.
2288
- * Only used by portals configured with
2289
- * `extension_hooks.registrationIdentifiersCheck.wait_for_toolkit`; ignored otherwise.
2290
- * At most 255 letters, digits, hyphens and underscores: the toolkit's bound for a
2291
- * correlation id and the charset it enforces on its identifiers.
2292
- *
2293
- * example:
2294
- * 0199c0d5-6f1c-7a3b-9e21-9a9ce1d1b2c3
2295
- */
2296
- correlation_id?: string; // ^[A-Za-z0-9_-]+$
2297
2275
  /**
2298
2276
  * Id of the portal surface (see `surfaces` on the portal config) this token is
2299
2277
  * for. The surface must exist and use `authentication: registration_identifiers`;
@@ -2369,6 +2347,14 @@ declare namespace Components {
2369
2347
  * false
2370
2348
  */
2371
2349
  has_portal_user?: boolean;
2350
+ /**
2351
+ * The e-mail the identified contact's portal user on this portal logs in with. It can
2352
+ * differ from the contact's own e-mail. Present only when `has_portal_user` is true.
2353
+ *
2354
+ * example:
2355
+ * john.doe@example.com
2356
+ */
2357
+ portal_user_email?: string;
2372
2358
  /**
2373
2359
  * Present only when no token was issued. NOT_FOUND means the given identifiers did not
2374
2360
  * match any contact (definitive - the client should not retry). TIMEOUT means the contact
@@ -2377,13 +2363,6 @@ declare namespace Components {
2377
2363
  *
2378
2364
  */
2379
2365
  reason?: "TIMEOUT" | "NOT_FOUND";
2380
- /**
2381
- * Correlation id of the triggered ERP sync. Present only with `reason: TIMEOUT`, for
2382
- * portals waiting on the Integration Toolkit (`wait_for_toolkit`). Send it back with
2383
- * `trigger_identifiers_check: false` to keep waiting on the same correlation.
2384
- *
2385
- */
2386
- correlation_id?: string; // ^[A-Za-z0-9_-]+$
2387
2366
  }
2388
2367
  export interface ContentWidget {
2389
2368
  id: string;
@@ -2774,37 +2753,6 @@ declare namespace Components {
2774
2753
  extension?: PublicExtensionDetails;
2775
2754
  hook?: PublicDataRetrievalHookDetails;
2776
2755
  }
2777
- export interface DeleteEntityFile {
2778
- entity_id: /**
2779
- * Entity ID
2780
- * example:
2781
- * 5da0a718-c822-403d-9f5d-20d4584e0528
2782
- */
2783
- EntityId /* uuid */;
2784
- /**
2785
- * Entity type
2786
- * example:
2787
- * order
2788
- */
2789
- entity_type: string;
2790
- /**
2791
- * Array of file entity IDs
2792
- */
2793
- file_entity_ids: [
2794
- /**
2795
- * Entity ID
2796
- * example:
2797
- * 5da0a718-c822-403d-9f5d-20d4584e0528
2798
- */
2799
- EntityId /* uuid */,
2800
- .../**
2801
- * Entity ID
2802
- * example:
2803
- * 5da0a718-c822-403d-9f5d-20d4584e0528
2804
- */
2805
- EntityId /* uuid */[]
2806
- ];
2807
- }
2808
2756
  export type Direction = "feed-in" | "feed-out";
2809
2757
  export interface DocumentWidget {
2810
2758
  id: string;
@@ -2979,6 +2927,23 @@ declare namespace Components {
2979
2927
  */
2980
2928
  EntityId /* uuid */;
2981
2929
  }
2930
+ /**
2931
+ * Handlebars templates rendering each outstanding task (to-do) row in the portal's engagement center. Resolved server-side per task against the task's entity (same variable syntax as page block templates, e.g. `{{order.order_number}}`, custom and environment variables) plus `task.*` (the workflow step, e.g. `{{task.name}}`), `workflow.*` (the execution, e.g. `{{workflow.name}}`) and `entity.*` (the task's entity regardless of its schema, e.g. `{{entity._title}}`). A template that is absent or blank keeps the portal's default rendering for that line. Admin/builder-only — never exposed via the public portal config.
2932
+ */
2933
+ export interface EngagementCenterTaskTemplates {
2934
+ /**
2935
+ * Template for the row title. Default rendering is the step name.
2936
+ * example:
2937
+ * {{task.name}}
2938
+ */
2939
+ title?: string;
2940
+ /**
2941
+ * Template for the row's context line. Default rendering is the workflow name and the entity title.
2942
+ * example:
2943
+ * {{workflow.name}} · {{entity._title}}
2944
+ */
2945
+ subtitle?: string;
2946
+ }
2982
2947
  export interface Entity {
2983
2948
  [name: string]: any;
2984
2949
  /**
@@ -3480,10 +3445,18 @@ declare namespace Components {
3480
3445
  [name: string]: string | number;
3481
3446
  };
3482
3447
  /**
3483
- * example:
3484
- * _created_at:desc
3448
+ * Sort order of the results: an `attribute:order` pair, or a list of Elasticsearch sort fields that are
3449
+ * used as they are, e.g. the sort order of a target as returned by the Targeting API.
3450
+ * Without a sort, the sort order of the first requested target that defines one applies.
3451
+ *
3452
+ */
3453
+ sort?: /**
3454
+ * Sort order of the results: an `attribute:order` pair, or a list of Elasticsearch sort fields that are
3455
+ * used as they are, e.g. the sort order of a target as returned by the Targeting API.
3456
+ * Without a sort, the sort order of the first requested target that defines one applies.
3457
+ *
3485
3458
  */
3486
- sort?: string;
3459
+ string | string /* ^[^\s:,]+:(asc|desc)$ */[];
3487
3460
  from?: number;
3488
3461
  /**
3489
3462
  * Max search size is 1000 with higher values defaulting to 1000
@@ -4240,35 +4213,12 @@ declare namespace Components {
4240
4213
  * Deprecated. Use `resolved.result` instead. Contact ID usually retrieved from the response body, e.g. `{{CallResponse.data.contact_id}}`. If no result is passed and the request suceeds, we attempt to resolve the Contact ID automatically. Supports variable interpolation.
4241
4214
  */
4242
4215
  result?: string;
4243
- /**
4244
- * Correlation id to wait for inbound ERP events under, resolved from the third-party
4245
- * response, e.g. `{{CallResponse.data.acknowledgeId}}`. Only read when the portal is
4246
- * configured to wait on the Integration Toolkit
4247
- * (`extension_hooks.<hook>.wait_for_toolkit`).
4248
- *
4249
- * There is no default: unless a hook declares this, the portal waits on the id it
4250
- * minted and handed the hook as `{{CorrelationId}}`, whatever the response carries. A
4251
- * partner that pushes under that id leaves this unset; only a partner that pushes
4252
- * under an id of its own declares where the response carries it. A declared id that
4253
- * is absent from the response falls back to the minted one; one that is not a valid
4254
- * correlation id (at most 255 letters, digits, `-` and `_`) is not waited on, and
4255
- * the portal polls entity search instead.
4256
- *
4257
- */
4258
- result_correlation_id?: string;
4259
4216
  };
4260
4217
  resolved?: {
4261
4218
  /**
4262
4219
  * Contract or Contact ID usually retrieved from the response body, e.g. `{{CallResponse.data.contact_id}}`. If no result is passed and the request suceeds, we attempt to resolve the Contact ID automatically. Supports variable interpolation. Supersedes the deprecated `call.result`.
4263
4220
  */
4264
4221
  result?: string;
4265
- /**
4266
- * Correlation id to wait for inbound ERP events under, resolved from the third-party
4267
- * response, e.g. `{{CallResponse.data.acknowledgeId}}`. Supersedes
4268
- * `call.result_correlation_id`. No default; see `call.result_correlation_id`.
4269
- *
4270
- */
4271
- result_correlation_id?: string;
4272
4222
  /**
4273
4223
  * Optional path to a human-readable error message in the third-party response body, used when the call fails (non-2xx status).
4274
4224
  * If specified and the path resolves to a string, that message is forwarded to the end user instead of a generic error.
@@ -4718,35 +4668,12 @@ declare namespace Components {
4718
4668
  * Deprecated. Use `resolved.result` instead. Contact ID usually retrieved from the response body, e.g. `{{CallResponse.data.contact_id}}`. If no result is passed and the request suceeds, we attempt to resolve the Contact ID automatically. Supports variable interpolation.
4719
4669
  */
4720
4670
  result?: string;
4721
- /**
4722
- * Correlation id to wait for inbound ERP events under, resolved from the third-party
4723
- * response, e.g. `{{CallResponse.data.acknowledgeId}}`. Only read when the portal is
4724
- * configured to wait on the Integration Toolkit
4725
- * (`extension_hooks.<hook>.wait_for_toolkit`).
4726
- *
4727
- * There is no default: unless a hook declares this, the portal waits on the id it
4728
- * minted and handed the hook as `{{CorrelationId}}`, whatever the response carries. A
4729
- * partner that pushes under that id leaves this unset; only a partner that pushes
4730
- * under an id of its own declares where the response carries it. A declared id that
4731
- * is absent from the response falls back to the minted one; one that is not a valid
4732
- * correlation id (at most 255 letters, digits, `-` and `_`) is not waited on, and
4733
- * the portal polls entity search instead.
4734
- *
4735
- */
4736
- result_correlation_id?: string;
4737
4671
  };
4738
4672
  resolved?: {
4739
4673
  /**
4740
4674
  * Contact ID usually retrieved from the response body, e.g. `{{CallResponse.data.contact_id}}`. If no result is passed and the request suceeds, we attempt to resolve the Contact ID automatically. Supports variable interpolation. Supersedes the deprecated `call.result`.
4741
4675
  */
4742
4676
  result?: string;
4743
- /**
4744
- * Correlation id to wait for inbound ERP events under, resolved from the third-party
4745
- * response, e.g. `{{CallResponse.data.acknowledgeId}}`. Supersedes
4746
- * `call.result_correlation_id`. No default; see `call.result_correlation_id`.
4747
- *
4748
- */
4749
- result_correlation_id?: string;
4750
4677
  /**
4751
4678
  * Optional path to a human-readable error message in the third-party response body, used when the call fails (non-2xx status).
4752
4679
  * If specified and the path resolves to a string, that message is forwarded to the end user instead of a generic error.
@@ -4777,137 +4704,6 @@ declare namespace Components {
4777
4704
  * The ID of the selected hook.
4778
4705
  */
4779
4706
  hook_id: string;
4780
- /**
4781
- * Opt in to waiting on the Integration Toolkit instead of polling entity search for the
4782
- * data the ERP pushes after the hook returns. When true, the portal hands the hook a
4783
- * correlation id (`{{CorrelationId}}`) and then asks the toolkit whether the entities it
4784
- * needs have landed under that correlation. Off by default: a portal that does not set it
4785
- * keeps polling entity search exactly as before.
4786
- *
4787
- * Only effective for hooks whose partner pushes through the Integration Toolkit and
4788
- * echoes the correlation id. A hook that answers with an epilot contact id is fetched
4789
- * directly, as today, whatever this flag says.
4790
- *
4791
- */
4792
- wait_for_toolkit?: boolean;
4793
- /**
4794
- * The entities the portal waits for, keyed by entity slug. Configured explicitly per
4795
- * hook: nothing is derived from the hook type or from the portal's identifier
4796
- * configuration, and a hook that configures no requirement for the entity the portal
4797
- * links does not wait at all - it keeps polling entity search exactly as before.
4798
- *
4799
- * A selector may only name an attribute that is literally a member of that entity
4800
- * target's configured `unique_ids` in the inbound use case, because the toolkit reports
4801
- * exactly those and nothing else. A selector on any other attribute can never match. A
4802
- * toolkit that validates selectors rejects such a wait (400) with the slug, the key and
4803
- * the keys it accepts; the portal logs that at error level with the hook it came from
4804
- * and polls entity search for the request, so the customer is unaffected and never told.
4805
- *
4806
- * The slug the portal resolves its link target from is fixed by the hook, and a
4807
- * requirement for it must be configured for the wait to happen at all:
4808
- * `registrationIdentifiersCheck` resolves the contact, every `contractIdentification`
4809
- * assignment mode resolves the contract (in the contact modes the linked contact is the
4810
- * delivered contract's `customer`). Every other configured slug is evidence that the push
4811
- * carried what it promised, and is never linked.
4812
- *
4813
- * Ignored unless `wait_for_toolkit` is true.
4814
- *
4815
- * Worked examples, verified against the live integration configuration. Each block is the
4816
- * `wait_for_entities` of one hook selection, and each names the slug that hook links.
4817
- *
4818
- * Ratingen / Wilken add-contract hook (`contractIdentification`, `contact_to_portal_user`).
4819
- * No value the user types is a unique id anywhere in the org - every one is a Wilken
4820
- * surrogate `external_id` - so the contact cannot be selected by attribute at all. Wait on
4821
- * the contract and link its `customer`; the identity-keyed contact is evidence that the
4822
- * business partner landed, and is never linked.
4823
- *
4824
- * ```yaml
4825
- * contract: {}
4826
- * contact:
4827
- * key: external_id # the PROFILE contact's unique id is external_id
4828
- * from_caller_contact: external_id
4829
- * ```
4830
- *
4831
- * WEMAG registration hook (`registrationIdentifiersCheck`). The contact's unique ids are
4832
- * `customer_pin` and `reenumber`; `meter.external_id` and `meter.meter_number` are both
4833
- * the `ZNR` the user types.
4834
- *
4835
- * ```yaml
4836
- * contact:
4837
- * key: reenumber
4838
- * from_identifier: contact.complete_customer_number
4839
- * split_on: "-" # "0002-<customer_pin>-<reenumber>"
4840
- * part: 2
4841
- * meter:
4842
- * key: external_id
4843
- * from_identifier: meter.meter_number
4844
- * ```
4845
- *
4846
- * WEMAG add-contract hook (`contractIdentification`, `contact_to_portal_user`). The
4847
- * contract's unique ids are `billing_account_number` (the `reenumber`, the same third
4848
- * part of `complete_customer_number`) and `customer_number` (the PIN). Wait on the
4849
- * contract of the typed Rechnungseinheit and link its `customer`.
4850
- *
4851
- * ```yaml
4852
- * contract:
4853
- * key: billing_account_number
4854
- * from_identifier: contact.complete_customer_number
4855
- * split_on: "-" # "0002-<customer_pin>-<reenumber>"
4856
- * part: 2
4857
- * meter:
4858
- * key: external_id
4859
- * from_identifier: meter.meter_number
4860
- * ```
4861
- *
4862
- * Never `complete_customer_number` or `customer_number` on a WEMAG contact - neither is a
4863
- * unique id there - and never `customer_pin` alone on a contact or `customer_number` alone
4864
- * on a contract, both of which are the PIN and ambiguous, because one person has one
4865
- * contact and one contract per Rechnungseinheit. Never a key-less `contract` either: WEMAG's
4866
- * `EKM Anlagedaten` writes contracts of its own, keyed on `contract_number`.
4867
- *
4868
- * example:
4869
- * {
4870
- * "contract": {},
4871
- * "contact": {
4872
- * "key": "external_id",
4873
- * "from_caller_contact": "external_id"
4874
- * }
4875
- * }
4876
- */
4877
- wait_for_entities?: {
4878
- [name: string]: /**
4879
- * One requirement of a hook's correlation wait, for the entity slug it is configured under.
4880
- *
4881
- * Without `key` the requirement is satisfied by any entity of that slug. That is safe for
4882
- * evidence, and for a linked slug only where the inbound use case writes exactly one entity
4883
- * of it per push - Wilken's `BusinessPartnerChanged` always writes two contacts, and WEMAG's
4884
- * `DocumentChange` / `D3Metadata` write contacts under the same unique-id keys a registration
4885
- * push uses - so a second match answers 409 rather than linking a guess.
4886
- *
4887
- * With `key`, the value comes from exactly one declared source, `from_identifier` or
4888
- * `from_caller_contact`. A rule whose source has no value produces no wait at all, so the
4889
- * hook keeps polling rather than waiting on a requirement that cannot be met.
4890
- *
4891
- */
4892
- WaitForEntityRule;
4893
- };
4894
- /**
4895
- * Inbound use case slugs the portal additionally waits for. A requirement is met once at
4896
- * least one event of that use case slug has finished processing, whether or not it
4897
- * produced an entity, so it covers pushes whose entity set varies and pushes whose
4898
- * outcome is a file or a relation rather than an entity.
4899
- *
4900
- * Entity requirements stay primary - the portal links by entity id, so it always waits
4901
- * for the entity it links. Use case slugs are an additional bar: when both are
4902
- * configured, both must be met. Empty by default. Ignored unless `wait_for_toolkit` is
4903
- * true.
4904
- *
4905
- * example:
4906
- * [
4907
- * "wilken_contract_changed"
4908
- * ]
4909
- */
4910
- wait_for_use_cases?: string[];
4911
4707
  } | null;
4912
4708
  /**
4913
4709
  * Hook that returns runtime metadata describing how a visualization should be rendered for a given portal context. Invoked by the portal before fetching data, with the same context the data hook receives.
@@ -5318,6 +5114,23 @@ declare namespace Components {
5318
5114
  */
5319
5115
  effect?: "allow" | "deny";
5320
5116
  }
5117
+ /**
5118
+ * A blueprint-managed page or block a write tried to change; the stored version was kept.
5119
+ */
5120
+ export interface HeldBackNode {
5121
+ /**
5122
+ * example:
5123
+ * 5da0a718-c822-403d-9f5d-20d4584e0528
5124
+ */
5125
+ page_id: string;
5126
+ /**
5127
+ * Set when a single block (not the whole page) was held back
5128
+ * example:
5129
+ * c495fef9-eeca-4019-a989-8390dcd9825b
5130
+ */
5131
+ block_id?: string;
5132
+ reason: "BLUEPRINT_MANAGED";
5133
+ }
5321
5134
  export interface IdentifierAttribute {
5322
5135
  /**
5323
5136
  * Label attribute
@@ -5490,6 +5303,16 @@ declare namespace Components {
5490
5303
  token: string;
5491
5304
  at?: string;
5492
5305
  };
5306
+ /**
5307
+ * Tells journey-api which route to link; omitted for a portal without an id
5308
+ */
5309
+ link_hint?: {
5310
+ route: "portal-settings";
5311
+ params: {
5312
+ portal_id: string;
5313
+ settings?: "journey-actions";
5314
+ };
5315
+ };
5493
5316
  }[];
5494
5317
  }
5495
5318
  export interface JuiceSettings {
@@ -5531,6 +5354,47 @@ declare namespace Components {
5531
5354
  * Design of the portal, used to preload it from the served document
5532
5355
  */
5533
5356
  design_id?: string;
5357
+ /**
5358
+ * Portal design background and accent for the served document. `null` when the portal has no design or it could not be read.
5359
+ *
5360
+ */
5361
+ design?: {
5362
+ /**
5363
+ * Spark background as hex colours; `null` when the design sets neither
5364
+ */
5365
+ background: {
5366
+ /**
5367
+ * example:
5368
+ * #f5f5f5
5369
+ */
5370
+ light: string | null; // ^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$
5371
+ /**
5372
+ * example:
5373
+ * #101010
5374
+ */
5375
+ dark: string | null; // ^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$
5376
+ } | null;
5377
+ /**
5378
+ * Spark accent as hex colours, falling back to the classic palette primary; dark falls back to light. `null` when the design sets neither
5379
+ *
5380
+ */
5381
+ accent: {
5382
+ /**
5383
+ * example:
5384
+ * #005eb4
5385
+ */
5386
+ light: string | null; // ^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$
5387
+ /**
5388
+ * example:
5389
+ * #4a9eff
5390
+ */
5391
+ dark: string | null; // ^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$
5392
+ } | null;
5393
+ /**
5394
+ * When the design was last saved
5395
+ */
5396
+ last_modified_at: string | null;
5397
+ } | null;
5534
5398
  }
5535
5399
  /**
5536
5400
  * The meter entity
@@ -5695,6 +5559,27 @@ declare namespace Components {
5695
5559
  [name: string]: string;
5696
5560
  };
5697
5561
  }
5562
+ /**
5563
+ * Display details of the counter the readings belong to. Only returned when `include_counter` is true and the counter could be resolved.
5564
+ */
5565
+ export interface MeterReadingCounterDetails {
5566
+ /**
5567
+ * example:
5568
+ * kwh
5569
+ */
5570
+ unit?: string | null;
5571
+ /**
5572
+ * example:
5573
+ * 1-1:1.8.1
5574
+ */
5575
+ obis_number?: string | null;
5576
+ /**
5577
+ * example:
5578
+ * feed-in
5579
+ */
5580
+ direction?: string | null;
5581
+ tariff_type?: string | null;
5582
+ }
5698
5583
  export interface MeterReadingPhoto {
5699
5584
  /**
5700
5585
  * example:
@@ -5962,11 +5847,11 @@ declare namespace Components {
5962
5847
  }
5963
5848
  export interface NotificationTriggerConfig {
5964
5849
  /**
5965
- * The 360 event that fires this notification trigger.
5850
+ * The 360 event that fires this notification trigger. `entity_added` is the unified trigger written by the Portal Builder: it fires for both the entity-created and the entity-assigned event of its `entity_schema`. `entity_created` / `entity_assigned` are the legacy per-event triggers and keep working; when a portal has both a legacy row and an `entity_added` row for the same schema, the legacy row wins for its event.
5966
5851
  */
5967
- trigger_type: "entity_created" | "entity_assigned" | "workflow_step_overdue";
5852
+ trigger_type: "entity_added" | "entity_created" | "entity_assigned" | "workflow_step_overdue";
5968
5853
  /**
5969
- * For `entity_created` / `entity_assigned` triggers, the entity schema slug (e.g. `opportunity`, `order`) whose creation or assignment fires this trigger. Ignored for other trigger types.
5854
+ * For `entity_added` / `entity_created` / `entity_assigned` triggers, the entity schema slug (e.g. `opportunity`, `order`) whose creation or assignment fires this trigger. Ignored for other trigger types.
5970
5855
  * example:
5971
5856
  * opportunity
5972
5857
  */
@@ -5979,6 +5864,10 @@ declare namespace Components {
5979
5864
  * Entity id of the notification_template to render for this trigger.
5980
5865
  */
5981
5866
  template_id?: string; // uuid
5867
+ /**
5868
+ * Targeting segment ids (targets) that narrow this trigger's recipients: the notification is only created for portal users whose contact matches at least one of the targets. Absent or empty means no narrowing — every portal user linked to the entity's contacts is notified.
5869
+ */
5870
+ target_ids?: string[];
5982
5871
  }
5983
5872
  /**
5984
5873
  * OIDC provider configuration. Values are resolved at SSO invocation time
@@ -6403,6 +6292,14 @@ declare namespace Components {
6403
6292
  * Whether submitting the journey from the portal should auto-complete the task. When false, an internal user completes it.
6404
6293
  */
6405
6294
  complete_task_automatically?: boolean;
6295
+ /**
6296
+ * Row title rendered from the portal's `engagement_center_task_templates.title`. Absent when the portal has no title template or it rendered blank for this task; the client then shows `step_name`.
6297
+ */
6298
+ title?: string;
6299
+ /**
6300
+ * Row context line rendered from the portal's `engagement_center_task_templates.subtitle`. Absent when the portal has no subtitle template or it rendered blank for this task; the client then shows the workflow name and entity title.
6301
+ */
6302
+ subtitle?: string;
6406
6303
  }
6407
6304
  export interface Page {
6408
6305
  [name: string]: any;
@@ -6554,6 +6451,21 @@ declare namespace Components {
6554
6451
  * ]
6555
6452
  */
6556
6453
  past_routes?: string[];
6454
+ /**
6455
+ * Blueprint instance ids managing this page. Non-empty means the page is blueprint-managed: its page-level fields and its blueprint-managed blocks are read-only for users (single-target writes answer 409 `BLUEPRINT_MANAGED`, bulk saves keep the stored version), while detached and customer-added blocks on it stay editable and the page keeps receiving blueprint updates. Server-managed: ignored (stripped) on every write from a user.
6456
+ *
6457
+ */
6458
+ _manifest?: string[];
6459
+ /**
6460
+ * Stable id of this page in the blueprint source. Set once: a blueprint install or update (`page_upsert_mode=slug`, portal create, or a revision with `revision_source` `blueprint_sync`) may give a page the lineage it does not have yet, unless another page of the portal holds it. After that it never changes; every other write keeps the stored value. Locks nothing on its own.
6461
+ *
6462
+ */
6463
+ _lineage_id?: string;
6464
+ /**
6465
+ * Lineage ids of blocks on this page that were detached from their blueprint; a blueprint sync leaves them alone. Server-managed.
6466
+ *
6467
+ */
6468
+ detached_lineage_ids?: string[];
6557
6469
  }
6558
6470
  export interface PageRequest {
6559
6471
  [name: string]: any;
@@ -6786,6 +6698,16 @@ declare namespace Components {
6786
6698
  */
6787
6699
  enabled?: boolean;
6788
6700
  };
6701
+ /**
6702
+ * Opt-in, set by the configuring user. When enabled, a second factor is enforced after the password and portal users can add passkeys (fingerprint, face or device PIN) as one variant of it, next to the email code of advanced_mfa. Users with a passkey use it by default; with advanced_mfa off, the passkey is the only second factor once a user has added one. On passwordless portals a passkey can replace the email code. Passkeys are bound to the domain they were added on. Default off; turning it off again restores the previous behaviour and keeps registered passkeys.
6703
+ *
6704
+ */
6705
+ passkeys?: {
6706
+ /**
6707
+ * Enforce a second factor and allow passkeys as one variant of it
6708
+ */
6709
+ enabled?: boolean;
6710
+ };
6789
6711
  entry_point?: "PASSWORD" | "SSO";
6790
6712
  preferred_sso_providers?: /**
6791
6713
  * URL-friendly slug to use as organization-unique identifier for Provider
@@ -6813,6 +6735,12 @@ declare namespace Components {
6813
6735
  * 6bsd0jkgoie74k2i8mrhc1vest
6814
6736
  */
6815
6737
  cognito_user_pool_client_id?: string;
6738
+ /**
6739
+ * Cognito user pool client ID used by the native portal apps (longer refresh token validity)
6740
+ * example:
6741
+ * 3k9fj2l1m0n8b7v6c5x4z3a2s1
6742
+ */
6743
+ cognito_mobile_client_id?: string;
6816
6744
  /**
6817
6745
  * Cognito user pool ARN
6818
6746
  * example:
@@ -7005,6 +6933,13 @@ declare namespace Components {
7005
6933
  * ]
7006
6934
  */
7007
6935
  contract_identifiers?: ContractIdentifier[];
6936
+ /**
6937
+ * What the built-in self-assignment (without a contractIdentification hook) assigns once the `contract_identifiers` match a Contract:
6938
+ * - `contracts`: the user's Contact is added as a customer of the Contract.
6939
+ * - `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.
6940
+ *
6941
+ */
6942
+ self_assignment_mode?: "contracts" | "customer_to_portal_user";
7008
6943
  /**
7009
6944
  * Configuration for contract selector in the portal
7010
6945
  */
@@ -7188,7 +7123,7 @@ declare namespace Components {
7188
7123
  */
7189
7124
  is_dummy?: boolean;
7190
7125
  /**
7191
- * Whether this is a v3 portal configuration
7126
+ * Always true. Legacy v2 storage was migrated; field kept for compatibility and will be removed.
7192
7127
  */
7193
7128
  is_v3_item?: boolean;
7194
7129
  /**
@@ -7227,6 +7162,7 @@ declare namespace Components {
7227
7162
  * Master toggle for the portal's engagement center (in-app notifications including the notification triggers above). Off when absent — portal users only see the engagement center and receive trigger notifications after an admin enables it.
7228
7163
  */
7229
7164
  engagement_center_enabled?: boolean;
7165
+ engagement_center_task_templates?: /* Handlebars templates rendering each outstanding task (to-do) row in the portal's engagement center. Resolved server-side per task against the task's entity (same variable syntax as page block templates, e.g. `{{order.order_number}}`, custom and environment variables) plus `task.*` (the workflow step, e.g. `{{task.name}}`), `workflow.*` (the execution, e.g. `{{workflow.name}}`) and `entity.*` (the task's entity regardless of its schema, e.g. `{{entity._title}}`). A template that is absent or blank keeps the portal's default rendering for that line. Admin/builder-only — never exposed via the public portal config. */ EngagementCenterTaskTemplates;
7230
7166
  /**
7231
7167
  * ID of the organization
7232
7168
  * example:
@@ -7240,14 +7176,34 @@ declare namespace Components {
7240
7176
  */
7241
7177
  organization_id?: string;
7242
7178
  /**
7243
- * Organization settings
7179
+ * Blueprint instance ids managing this portal. Server-managed: ignored (stripped) on every write from a user.
7180
+ *
7244
7181
  */
7245
- org_settings?: {
7246
- /**
7247
- * Canary feature flag
7248
- */
7249
- canary?: {
7250
- /**
7182
+ _manifest?: string[];
7183
+ /**
7184
+ * Id of this portal in the blueprint source. Set once: a blueprint install or update (portal create, `page_upsert_mode=slug`, or a revision with `revision_source` `blueprint_sync`) may give a portal the lineage it does not have yet, unless another portal of the organization holds it. A portal created as a copy next to the organization's live portal of its origin (downgraded to `ADDITIONAL_PORTAL`) never takes it. After that it never changes; every other write keeps the stored value. Locks nothing on its own.
7185
+ *
7186
+ */
7187
+ _lineage_id?: string;
7188
+ /**
7189
+ * Lineage ids of pages detached from their blueprint; a blueprint sync leaves them alone. Server-managed.
7190
+ *
7191
+ */
7192
+ detached_lineage_ids?: string[];
7193
+ /**
7194
+ * Only present on write responses: blueprint-managed pages/blocks the request tried to change. Their stored version was kept and the rest of the save succeeded.
7195
+ *
7196
+ */
7197
+ held_back?: /* A blueprint-managed page or block a write tried to change; the stored version was kept. */ HeldBackNode[];
7198
+ /**
7199
+ * Organization settings
7200
+ */
7201
+ org_settings?: {
7202
+ /**
7203
+ * Canary feature flag
7204
+ */
7205
+ canary?: {
7206
+ /**
7251
7207
  * Enable/Disable the canary feature
7252
7208
  */
7253
7209
  enabled?: boolean;
@@ -7273,6 +7229,19 @@ declare namespace Components {
7273
7229
  */
7274
7230
  grants?: Grant[];
7275
7231
  identity_providers?: ProviderPublicConfig[];
7232
+ /**
7233
+ * Present only when the request carried a valid `x-portal-preview-token`: the config is this revision's, not the live one.
7234
+ *
7235
+ */
7236
+ preview_revision?: {
7237
+ /**
7238
+ * example:
7239
+ * 2026-08-25T14:03:11.482Z-a7f3c1d9
7240
+ */
7241
+ revision_id: string;
7242
+ name?: string;
7243
+ created_at: string; // date-time
7244
+ };
7276
7245
  }
7277
7246
  /**
7278
7247
  * Lightweight view of a portal config for lists and pickers. Carries the identifying,
@@ -7536,6 +7505,16 @@ declare namespace Components {
7536
7505
  */
7537
7506
  enabled?: boolean;
7538
7507
  };
7508
+ /**
7509
+ * Opt-in, set by the configuring user. When enabled, a second factor is enforced after the password and portal users can add passkeys (fingerprint, face or device PIN) as one variant of it, next to the email code of advanced_mfa. Users with a passkey use it by default; with advanced_mfa off, the passkey is the only second factor once a user has added one. On passwordless portals a passkey can replace the email code. Passkeys are bound to the domain they were added on. Default off; turning it off again restores the previous behaviour and keeps registered passkeys.
7510
+ *
7511
+ */
7512
+ passkeys?: {
7513
+ /**
7514
+ * Enforce a second factor and allow passkeys as one variant of it
7515
+ */
7516
+ enabled?: boolean;
7517
+ };
7539
7518
  entry_point?: "PASSWORD" | "SSO";
7540
7519
  preferred_sso_providers?: /**
7541
7520
  * URL-friendly slug to use as organization-unique identifier for Provider
@@ -7563,6 +7542,12 @@ declare namespace Components {
7563
7542
  * 6bsd0jkgoie74k2i8mrhc1vest
7564
7543
  */
7565
7544
  cognito_user_pool_client_id?: string;
7545
+ /**
7546
+ * Cognito user pool client ID used by the native portal apps (longer refresh token validity)
7547
+ * example:
7548
+ * 3k9fj2l1m0n8b7v6c5x4z3a2s1
7549
+ */
7550
+ cognito_mobile_client_id?: string;
7566
7551
  /**
7567
7552
  * Cognito user pool ARN
7568
7553
  * example:
@@ -7755,6 +7740,13 @@ declare namespace Components {
7755
7740
  * ]
7756
7741
  */
7757
7742
  contract_identifiers?: ContractIdentifier[];
7743
+ /**
7744
+ * What the built-in self-assignment (without a contractIdentification hook) assigns once the `contract_identifiers` match a Contract:
7745
+ * - `contracts`: the user's Contact is added as a customer of the Contract.
7746
+ * - `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.
7747
+ *
7748
+ */
7749
+ self_assignment_mode?: "contracts" | "customer_to_portal_user";
7758
7750
  /**
7759
7751
  * Configuration for contract selector in the portal
7760
7752
  */
@@ -7938,7 +7930,7 @@ declare namespace Components {
7938
7930
  */
7939
7931
  is_dummy?: boolean;
7940
7932
  /**
7941
- * Whether this is a v3 portal configuration
7933
+ * Always true. Legacy v2 storage was migrated; field kept for compatibility and will be removed.
7942
7934
  */
7943
7935
  is_v3_item?: boolean;
7944
7936
  /**
@@ -8007,6 +7999,71 @@ declare namespace Components {
8007
7999
  grants?: Grant[];
8008
8000
  pages?: Page[];
8009
8001
  }
8002
+ /**
8003
+ * Contact attributes a portal user can change. Other attributes are ignored.
8004
+ * Value types follow the organization's contact schema.
8005
+ *
8006
+ */
8007
+ export interface PortalContactUpdate {
8008
+ [name: string]: any;
8009
+ /**
8010
+ * example:
8011
+ * de
8012
+ */
8013
+ language?: string;
8014
+ first_name?: any;
8015
+ last_name?: any;
8016
+ salutation?: any;
8017
+ phone?: any;
8018
+ phone_number?: any;
8019
+ mobile?: any;
8020
+ street?: any;
8021
+ street_number?: any;
8022
+ postal_code?: any;
8023
+ city?: any;
8024
+ country?: any;
8025
+ preferred_language?: any;
8026
+ communication_preferences?: any;
8027
+ }
8028
+ /**
8029
+ * Contract attributes a portal user can change. Other attributes are ignored.
8030
+ */
8031
+ export interface PortalContractUpdate {
8032
+ [name: string]: any;
8033
+ /**
8034
+ * Installment amount in cents
8035
+ * example:
8036
+ * 8500
8037
+ */
8038
+ installment_amount?: number;
8039
+ /**
8040
+ * Installment amount as a decimal string
8041
+ * example:
8042
+ * 85.00
8043
+ */
8044
+ installment_amount_decimal?: string;
8045
+ }
8046
+ /**
8047
+ * Limits portal chat to portal users matching targets, with the same rules as page and block visibility. Without targets every signed-in portal user can use the chat.
8048
+ */
8049
+ export interface PortalCopilotVisibility {
8050
+ /**
8051
+ * Target IDs that must match for the portal user to use the chat
8052
+ */
8053
+ visible_for_targets?: string[];
8054
+ /**
8055
+ * Operator for visible_for_targets matching
8056
+ */
8057
+ visible_for_operator?: "and" | "or";
8058
+ /**
8059
+ * Target IDs that if matched deny the portal user the chat
8060
+ */
8061
+ hidden_for_targets?: string[];
8062
+ /**
8063
+ * Operator for hidden_for_targets matching
8064
+ */
8065
+ hidden_for_operator?: "and" | "or";
8066
+ }
8010
8067
  /**
8011
8068
  * One column of the portal data export CSV.
8012
8069
  */
@@ -8122,6 +8179,7 @@ declare namespace Components {
8122
8179
  * 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.
8123
8180
  */
8124
8181
  portal_copilot_agent_id?: string;
8182
+ portal_copilot_visibility?: /* Limits portal chat to portal users matching targets, with the same rules as page and block visibility. Without targets every signed-in portal user can use the chat. */ PortalCopilotVisibility;
8125
8183
  }
8126
8184
  /**
8127
8185
  * ID of the portal
@@ -8344,6 +8402,23 @@ declare namespace Components {
8344
8402
  */
8345
8403
  next_cursor?: string;
8346
8404
  }
8405
+ export interface PortalRevisionPreview {
8406
+ /**
8407
+ * Short-lived token that makes portal reads return this revision. Send it in the `x-portal-preview-token` header.
8408
+ *
8409
+ */
8410
+ preview_token: string;
8411
+ /**
8412
+ * When the preview token stops being honoured.
8413
+ */
8414
+ expires_at: string; // date-time
8415
+ /**
8416
+ * Link that opens the revision in the portal on its live domain.
8417
+ * example:
8418
+ * https://portal.example.com/?preview_token=eyJhbGciOiJIUzI1NiIs...
8419
+ */
8420
+ url: string;
8421
+ }
8347
8422
  export interface PortalRevisionRequest {
8348
8423
  [name: string]: any;
8349
8424
  /**
@@ -8504,6 +8579,16 @@ declare namespace Components {
8504
8579
  */
8505
8580
  enabled?: boolean;
8506
8581
  };
8582
+ /**
8583
+ * Opt-in, set by the configuring user. When enabled, a second factor is enforced after the password and portal users can add passkeys (fingerprint, face or device PIN) as one variant of it, next to the email code of advanced_mfa. Users with a passkey use it by default; with advanced_mfa off, the passkey is the only second factor once a user has added one. On passwordless portals a passkey can replace the email code. Passkeys are bound to the domain they were added on. Default off; turning it off again restores the previous behaviour and keeps registered passkeys.
8584
+ *
8585
+ */
8586
+ passkeys?: {
8587
+ /**
8588
+ * Enforce a second factor and allow passkeys as one variant of it
8589
+ */
8590
+ enabled?: boolean;
8591
+ };
8507
8592
  entry_point?: "PASSWORD" | "SSO";
8508
8593
  preferred_sso_providers?: /**
8509
8594
  * URL-friendly slug to use as organization-unique identifier for Provider
@@ -8531,6 +8616,12 @@ declare namespace Components {
8531
8616
  * 6bsd0jkgoie74k2i8mrhc1vest
8532
8617
  */
8533
8618
  cognito_user_pool_client_id?: string;
8619
+ /**
8620
+ * Cognito user pool client ID used by the native portal apps (longer refresh token validity)
8621
+ * example:
8622
+ * 3k9fj2l1m0n8b7v6c5x4z3a2s1
8623
+ */
8624
+ cognito_mobile_client_id?: string;
8534
8625
  /**
8535
8626
  * Cognito user pool ARN
8536
8627
  * example:
@@ -8723,6 +8814,13 @@ declare namespace Components {
8723
8814
  * ]
8724
8815
  */
8725
8816
  contract_identifiers?: ContractIdentifier[];
8817
+ /**
8818
+ * What the built-in self-assignment (without a contractIdentification hook) assigns once the `contract_identifiers` match a Contract:
8819
+ * - `contracts`: the user's Contact is added as a customer of the Contract.
8820
+ * - `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.
8821
+ *
8822
+ */
8823
+ self_assignment_mode?: "contracts" | "customer_to_portal_user";
8726
8824
  /**
8727
8825
  * Configuration for contract selector in the portal
8728
8826
  */
@@ -8906,7 +9004,7 @@ declare namespace Components {
8906
9004
  */
8907
9005
  is_dummy?: boolean;
8908
9006
  /**
8909
- * Whether this is a v3 portal configuration
9007
+ * Always true. Legacy v2 storage was migrated; field kept for compatibility and will be removed.
8910
9008
  */
8911
9009
  is_v3_item?: boolean;
8912
9010
  /**
@@ -9185,7 +9283,60 @@ declare namespace Components {
9185
9283
  }[];
9186
9284
  _schema: "portal_user";
9187
9285
  }
9286
+ /**
9287
+ * Resolved notification preferences of a portal user. Notifications are opt-out: a channel that was never stored on the portal user resolves to enabled (true).
9288
+ */
9289
+ export interface PortalUserNotificationPreferences {
9290
+ /**
9291
+ * Whether the portal user receives in-app notifications.
9292
+ * example:
9293
+ * true
9294
+ */
9295
+ in_app: boolean;
9296
+ }
9297
+ export interface PortalUserPasskey {
9298
+ /**
9299
+ * WebAuthn credential ID (base64url)
9300
+ */
9301
+ credential_id: string;
9302
+ name?: string;
9303
+ /**
9304
+ * Domain the passkey works on
9305
+ * example:
9306
+ * kundenportal.example.de
9307
+ */
9308
+ rp_id: string;
9309
+ device_type?: "singleDevice" | "multiDevice";
9310
+ /**
9311
+ * Whether the passkey is synced, e.g. via iCloud Keychain or Google Password Manager
9312
+ */
9313
+ backed_up?: boolean;
9314
+ created_at: string; // date-time
9315
+ last_used_at?: string; // date-time
9316
+ }
9188
9317
  export type PortalUserRegistrationStatus = "Registration Pending" | "Confirmation Email Sent" | "Registered" | "Email Update In Progress";
9318
+ /**
9319
+ * A portal whose design_id is the design asked about.
9320
+ */
9321
+ export interface PortalUsingDesign {
9322
+ portal_id: /**
9323
+ * ID of the portal
9324
+ * example:
9325
+ * 453ad7bf-86d5-46c8-8252-bcc868df5e3c
9326
+ */
9327
+ PortalId;
9328
+ /**
9329
+ * example:
9330
+ * Kundenportal
9331
+ */
9332
+ name?: string;
9333
+ origin?: /* Origin of the portal */ Origin;
9334
+ /**
9335
+ * example:
9336
+ * 9ba94f20-b872-11ed-b30a-b3e3bf2dc8ab
9337
+ */
9338
+ design_id?: string;
9339
+ }
9189
9340
  export type PortalWidget = EntityWidget | ContentWidget | ActionWidget | TeaserWidget | DocumentWidget | PaymentWidget | MeterReadingWidget | MeterChartWidget | CampaignWidget | ProductRecommendationsWidget;
9190
9341
  /**
9191
9342
  * A portal-facing projection of a workflow execution (V1 or V2), with the execution
@@ -9345,9 +9496,19 @@ declare namespace Components {
9345
9496
  * True when the task has been reached in the execution — all predecessor tasks on its
9346
9497
  * path are completed/skipped — so the portal user can act on it (e.g. start its journey).
9347
9498
  * Tasks that are only part of the projected future path are returned with is_active false.
9499
+ * The start date is not taken into account: an active task can still be upcoming (see start_date).
9348
9500
  *
9349
9501
  */
9350
9502
  is_active: boolean;
9503
+ /**
9504
+ * Instant before which nobody may work on the task. While it lies in the future, a task
9505
+ * that is not done yet is upcoming: the Workflows API refuses to complete it, so the
9506
+ * portal shows it as upcoming instead of offering its journey. Neither status nor
9507
+ * is_active reflects it; compare it with the current time. Absent when the task has no
9508
+ * start date or its relative start date has not been resolved yet.
9509
+ *
9510
+ */
9511
+ start_date?: string; // date-time
9351
9512
  ecp?: /* Portal-specific (ECP / installer) display config of a workflow task */ PortalTaskConfig;
9352
9513
  installer?: /* Portal-specific (ECP / installer) display config of a workflow task */ PortalTaskConfig;
9353
9514
  /**
@@ -9390,6 +9551,18 @@ declare namespace Components {
9390
9551
  */
9391
9552
  updated_at?: string;
9392
9553
  }
9554
+ /**
9555
+ * The revision a config response shows instead of the live portal config.
9556
+ */
9557
+ export interface PreviewRevision {
9558
+ /**
9559
+ * example:
9560
+ * 2026-08-25T14:03:11.482Z-a7f3c1d9
9561
+ */
9562
+ revision_id: string;
9563
+ name?: string;
9564
+ created_at: string; // date-time
9565
+ }
9393
9566
  /**
9394
9567
  * The product entity
9395
9568
  */
@@ -9544,6 +9717,21 @@ declare namespace Components {
9544
9717
  * false
9545
9718
  */
9546
9719
  expose_client_secret?: boolean;
9720
+ /**
9721
+ * Temporarily enables SSO debug mode for this provider. While the current time is
9722
+ * before this timestamp, failed SSO logins and token exchanges answer with a `debug`
9723
+ * object (`SSODebugInfo`) next to the error, so admins can see the real cause (e.g. the
9724
+ * IdP's `AADSTS…` error) on the portal login page.
9725
+ *
9726
+ * Capped at 24 hours from the time of the write (plus 5 minutes clock-skew tolerance);
9727
+ * a later value is rejected with 400. `null` or absent turns debug mode off, and an
9728
+ * expired value is simply inactive. Never exposed publicly — public reads only carry
9729
+ * the derived `debug_mode` flag.
9730
+ *
9731
+ * example:
9732
+ * 2026-10-30T12:00:00.000Z
9733
+ */
9734
+ debug_mode_until?: string | null; // date-time
9547
9735
  }
9548
9736
  /**
9549
9737
  * Human-readable display name for identity provider shown in login
@@ -9581,6 +9769,15 @@ declare namespace Components {
9581
9769
  *
9582
9770
  */
9583
9771
  MoblieOIDCConfig;
9772
+ /**
9773
+ * Derived from `ProviderConfig.debug_mode_until`: `true` only while SSO debug mode is
9774
+ * active for this provider. Clients may use it to show technical error details on
9775
+ * failed SSO logins. Absent or `false` when debug mode is off.
9776
+ *
9777
+ * example:
9778
+ * false
9779
+ */
9780
+ debug_mode?: boolean;
9584
9781
  }
9585
9782
  /**
9586
9783
  * Web-only public provider configuration served by `getPublicSSOProviderV3`.
@@ -9613,6 +9810,15 @@ declare namespace Components {
9613
9810
  *
9614
9811
  */
9615
9812
  OIDCProviderConfig;
9813
+ /**
9814
+ * Derived from `ProviderConfig.debug_mode_until`: `true` only while SSO debug mode is
9815
+ * active for this provider. Clients may use it to show technical error details on
9816
+ * failed SSO logins. Absent or `false` when debug mode is off.
9817
+ *
9818
+ * example:
9819
+ * false
9820
+ */
9821
+ debug_mode?: boolean;
9616
9822
  }
9617
9823
  /**
9618
9824
  * URL-friendly slug to use as organization-unique identifier for Provider
@@ -9802,12 +10008,17 @@ declare namespace Components {
9802
10008
  * Stable, machine-readable codes for best-effort post-publish side effects that exhausted their retries. Publishing itself succeeded; these are not error messages and not meant for display as-is. Clients map each code to their own localized text.
9803
10009
  * Known codes: `allowed_entities_change` (portal entity grants and detail pages did not sync), `dns_records_clear` (the previous domain's DNS records were not cleared). New codes may be added without a client update, so treat an unrecognized code as a generic "a follow-up step did not finish" case rather than an error.
9804
10010
  *
10011
+ */
10012
+ post_publish_warnings: string[];
10013
+ /**
10014
+ * Only present when non-empty: blueprint-managed live pages/blocks this publish could not replace because the publisher is not the owning blueprint. Their live version stays as it is; the rest of the revision was published. Detach a node to make it publishable.
10015
+ *
9805
10016
  * example:
9806
10017
  * [
9807
10018
  * "allowed_entities_change"
9808
10019
  * ]
9809
10020
  */
9810
- post_publish_warnings: string[];
10021
+ held_back?: /* A blueprint-managed page or block a write tried to change; the stored version was kept. */ HeldBackNode[];
9811
10022
  }
9812
10023
  export interface PublishRevisionRequest {
9813
10024
  /**
@@ -10122,6 +10333,21 @@ declare namespace Components {
10122
10333
  * ]
10123
10334
  */
10124
10335
  past_routes?: string[];
10336
+ /**
10337
+ * Blueprint instance ids managing this page. Non-empty means the page is blueprint-managed: its page-level fields and its blueprint-managed blocks are read-only for users (single-target writes answer 409 `BLUEPRINT_MANAGED`, bulk saves keep the stored version), while detached and customer-added blocks on it stay editable and the page keeps receiving blueprint updates. Server-managed: ignored (stripped) on every write from a user.
10338
+ *
10339
+ */
10340
+ _manifest?: string[];
10341
+ /**
10342
+ * Stable id of this page in the blueprint source. Set once: a blueprint install or update (`page_upsert_mode=slug`, portal create, or a revision with `revision_source` `blueprint_sync`) may give a page the lineage it does not have yet, unless another page of the portal holds it. After that it never changes; every other write keeps the stored value. Locks nothing on its own.
10343
+ *
10344
+ */
10345
+ _lineage_id?: string;
10346
+ /**
10347
+ * Lineage ids of blocks on this page that were detached from their blueprint; a blueprint sync leaves them alone. Server-managed.
10348
+ *
10349
+ */
10350
+ detached_lineage_ids?: string[];
10125
10351
  org_id?: string;
10126
10352
  }
10127
10353
  /**
@@ -10256,6 +10482,101 @@ declare namespace Components {
10256
10482
  */
10257
10483
  scope?: string;
10258
10484
  }
10485
+ /**
10486
+ * Technical details of a failed SSO login or token exchange, returned only while SSO debug
10487
+ * mode is active for the provider. Never carries secrets, authorization codes, PKCE
10488
+ * verifiers, tokens or claim values.
10489
+ *
10490
+ */
10491
+ export interface SSODebugInfo {
10492
+ /**
10493
+ * Which step failed — the backend token exchange (`ssoCallback`) or the login (`ssoLogin`).
10494
+ */
10495
+ stage?: "exchange" | "login";
10496
+ /**
10497
+ * Stable reason code, e.g. `TOKEN_EXCHANGE_FAILED`, `MISSING_EMAIL_CLAIM`, `INVALID_PROVIDER`.
10498
+ * example:
10499
+ * TOKEN_EXCHANGE_FAILED
10500
+ */
10501
+ reason?: string;
10502
+ /**
10503
+ * The API's error message.
10504
+ */
10505
+ message?: string;
10506
+ /**
10507
+ * HTTP status the IdP's token endpoint answered with.
10508
+ * example:
10509
+ * 401
10510
+ */
10511
+ upstream_status?: number;
10512
+ /**
10513
+ * The IdP's RFC 6749 §5.2 `error`.
10514
+ * example:
10515
+ * invalid_client
10516
+ */
10517
+ oauth_error?: string;
10518
+ /**
10519
+ * The IdP's RFC 6749 §5.2 `error_description` (e.g. the full `AADSTS…` text).
10520
+ */
10521
+ oauth_error_description?: string;
10522
+ /**
10523
+ * example:
10524
+ * login.microsoftonline.com
10525
+ */
10526
+ token_endpoint_host?: string;
10527
+ /**
10528
+ * Path of the configured token endpoint, without query.
10529
+ * example:
10530
+ * /contoso.onmicrosoft.com/oauth2/v2.0/token
10531
+ */
10532
+ token_endpoint_path?: string;
10533
+ /**
10534
+ * The redirect URI sent in the token exchange.
10535
+ */
10536
+ redirect_uri?: string;
10537
+ /**
10538
+ * Names (never values) of the claims received from the IdP.
10539
+ */
10540
+ received_claims?: string[];
10541
+ /**
10542
+ * API request id, for support.
10543
+ */
10544
+ request_id?: string;
10545
+ /**
10546
+ * English hint for well-known IdP errors.
10547
+ */
10548
+ hint?: string;
10549
+ }
10550
+ /**
10551
+ * Error response of the public SSO endpoints. Like every error response the message is in
10552
+ * `error`; `reason` carries a stable machine-readable cause when one is known (e.g.
10553
+ * `MISSING_EMAIL_CLAIM`, `INVALID_PROVIDER`, `SELF_REGISTRATION_NOT_ALLOWED`,
10554
+ * `TOKEN_EXCHANGE_FAILED`). `debug` is only present while SSO debug mode is active for the
10555
+ * resolved provider (`ProviderConfig.debug_mode_until`).
10556
+ *
10557
+ */
10558
+ export interface SSOErrorResp {
10559
+ /**
10560
+ * example:
10561
+ * 400
10562
+ */
10563
+ status?: number;
10564
+ /**
10565
+ * Error message
10566
+ */
10567
+ error?: string;
10568
+ /**
10569
+ * Machine-readable cause, when the API can name one.
10570
+ */
10571
+ reason?: string;
10572
+ debug?: /**
10573
+ * Technical details of a failed SSO login or token exchange, returned only while SSO debug
10574
+ * mode is active for the provider. Never carries secrets, authorization codes, PKCE
10575
+ * verifiers, tokens or claim values.
10576
+ *
10577
+ */
10578
+ SSODebugInfo;
10579
+ }
10259
10580
  export type SSOLoginToken = string;
10260
10581
  export interface SaveEntityFile {
10261
10582
  entity_id: /**
@@ -10756,6 +11077,16 @@ declare namespace Components {
10756
11077
  */
10757
11078
  enabled?: boolean;
10758
11079
  };
11080
+ /**
11081
+ * Opt-in, set by the configuring user. When enabled, a second factor is enforced after the password and portal users can add passkeys (fingerprint, face or device PIN) as one variant of it, next to the email code of advanced_mfa. Users with a passkey use it by default; with advanced_mfa off, the passkey is the only second factor once a user has added one. On passwordless portals a passkey can replace the email code. Passkeys are bound to the domain they were added on. Default off; turning it off again restores the previous behaviour and keeps registered passkeys.
11082
+ *
11083
+ */
11084
+ passkeys?: {
11085
+ /**
11086
+ * Enforce a second factor and allow passkeys as one variant of it
11087
+ */
11088
+ enabled?: boolean;
11089
+ };
10759
11090
  entry_point?: "PASSWORD" | "SSO";
10760
11091
  preferred_sso_providers?: /**
10761
11092
  * URL-friendly slug to use as organization-unique identifier for Provider
@@ -10783,6 +11114,12 @@ declare namespace Components {
10783
11114
  * 6bsd0jkgoie74k2i8mrhc1vest
10784
11115
  */
10785
11116
  cognito_user_pool_client_id?: string;
11117
+ /**
11118
+ * Cognito user pool client ID used by the native portal apps (longer refresh token validity)
11119
+ * example:
11120
+ * 3k9fj2l1m0n8b7v6c5x4z3a2s1
11121
+ */
11122
+ cognito_mobile_client_id?: string;
10786
11123
  /**
10787
11124
  * Cognito user pool ARN
10788
11125
  * example:
@@ -10975,6 +11312,13 @@ declare namespace Components {
10975
11312
  * ]
10976
11313
  */
10977
11314
  contract_identifiers?: ContractIdentifier[];
11315
+ /**
11316
+ * What the built-in self-assignment (without a contractIdentification hook) assigns once the `contract_identifiers` match a Contract:
11317
+ * - `contracts`: the user's Contact is added as a customer of the Contract.
11318
+ * - `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.
11319
+ *
11320
+ */
11321
+ self_assignment_mode?: "contracts" | "customer_to_portal_user";
10978
11322
  /**
10979
11323
  * Configuration for contract selector in the portal
10980
11324
  */
@@ -11158,7 +11502,7 @@ declare namespace Components {
11158
11502
  */
11159
11503
  is_dummy?: boolean;
11160
11504
  /**
11161
- * Whether this is a v3 portal configuration
11505
+ * Always true. Legacy v2 storage was migrated; field kept for compatibility and will be removed.
11162
11506
  */
11163
11507
  is_v3_item?: boolean;
11164
11508
  /**
@@ -11197,6 +11541,7 @@ declare namespace Components {
11197
11541
  * Master toggle for the portal's engagement center (in-app notifications including the notification triggers above). Off when absent — portal users only see the engagement center and receive trigger notifications after an admin enables it.
11198
11542
  */
11199
11543
  engagement_center_enabled?: boolean;
11544
+ engagement_center_task_templates?: /* Handlebars templates rendering each outstanding task (to-do) row in the portal's engagement center. Resolved server-side per task against the task's entity (same variable syntax as page block templates, e.g. `{{order.order_number}}`, custom and environment variables) plus `task.*` (the workflow step, e.g. `{{task.name}}`), `workflow.*` (the execution, e.g. `{{workflow.name}}`) and `entity.*` (the task's entity regardless of its schema, e.g. `{{entity._title}}`). A template that is absent or blank keeps the portal's default rendering for that line. Admin/builder-only — never exposed via the public portal config. */ EngagementCenterTaskTemplates;
11200
11545
  }
11201
11546
  export interface UpsertPortalConfigV3 {
11202
11547
  /**
@@ -11357,6 +11702,16 @@ declare namespace Components {
11357
11702
  */
11358
11703
  enabled?: boolean;
11359
11704
  };
11705
+ /**
11706
+ * Opt-in, set by the configuring user. When enabled, a second factor is enforced after the password and portal users can add passkeys (fingerprint, face or device PIN) as one variant of it, next to the email code of advanced_mfa. Users with a passkey use it by default; with advanced_mfa off, the passkey is the only second factor once a user has added one. On passwordless portals a passkey can replace the email code. Passkeys are bound to the domain they were added on. Default off; turning it off again restores the previous behaviour and keeps registered passkeys.
11707
+ *
11708
+ */
11709
+ passkeys?: {
11710
+ /**
11711
+ * Enforce a second factor and allow passkeys as one variant of it
11712
+ */
11713
+ enabled?: boolean;
11714
+ };
11360
11715
  entry_point?: "PASSWORD" | "SSO";
11361
11716
  preferred_sso_providers?: /**
11362
11717
  * URL-friendly slug to use as organization-unique identifier for Provider
@@ -11384,6 +11739,12 @@ declare namespace Components {
11384
11739
  * 6bsd0jkgoie74k2i8mrhc1vest
11385
11740
  */
11386
11741
  cognito_user_pool_client_id?: string;
11742
+ /**
11743
+ * Cognito user pool client ID used by the native portal apps (longer refresh token validity)
11744
+ * example:
11745
+ * 3k9fj2l1m0n8b7v6c5x4z3a2s1
11746
+ */
11747
+ cognito_mobile_client_id?: string;
11387
11748
  /**
11388
11749
  * Cognito user pool ARN
11389
11750
  * example:
@@ -11576,6 +11937,13 @@ declare namespace Components {
11576
11937
  * ]
11577
11938
  */
11578
11939
  contract_identifiers?: ContractIdentifier[];
11940
+ /**
11941
+ * What the built-in self-assignment (without a contractIdentification hook) assigns once the `contract_identifiers` match a Contract:
11942
+ * - `contracts`: the user's Contact is added as a customer of the Contract.
11943
+ * - `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.
11944
+ *
11945
+ */
11946
+ self_assignment_mode?: "contracts" | "customer_to_portal_user";
11579
11947
  /**
11580
11948
  * Configuration for contract selector in the portal
11581
11949
  */
@@ -11759,7 +12127,7 @@ declare namespace Components {
11759
12127
  */
11760
12128
  is_dummy?: boolean;
11761
12129
  /**
11762
- * Whether this is a v3 portal configuration
12130
+ * Always true. Legacy v2 storage was migrated; field kept for compatibility and will be removed.
11763
12131
  */
11764
12132
  is_v3_item?: boolean;
11765
12133
  /**
@@ -11795,7 +12163,7 @@ declare namespace Components {
11795
12163
  */
11796
12164
  portal_sk_v3?: string;
11797
12165
  /**
11798
- * Indicates whether the widget configuration is stored as a V3 portal-scoped item
12166
+ * Always true. Legacy v2 storage was migrated; field kept for compatibility and will be removed.
11799
12167
  */
11800
12168
  is_v3_item?: boolean;
11801
12169
  widgets: PortalWidget[];
@@ -11899,64 +12267,6 @@ declare namespace Components {
11899
12267
  */
11900
12268
  precision?: number;
11901
12269
  }
11902
- /**
11903
- * One requirement of a hook's correlation wait, for the entity slug it is configured under.
11904
- *
11905
- * Without `key` the requirement is satisfied by any entity of that slug. That is safe for
11906
- * evidence, and for a linked slug only where the inbound use case writes exactly one entity
11907
- * of it per push - Wilken's `BusinessPartnerChanged` always writes two contacts, and WEMAG's
11908
- * `DocumentChange` / `D3Metadata` write contacts under the same unique-id keys a registration
11909
- * push uses - so a second match answers 409 rather than linking a guess.
11910
- *
11911
- * With `key`, the value comes from exactly one declared source, `from_identifier` or
11912
- * `from_caller_contact`. A rule whose source has no value produces no wait at all, so the
11913
- * hook keeps polling rather than waiting on a requirement that cannot be met.
11914
- *
11915
- */
11916
- export interface WaitForEntityRule {
11917
- /**
11918
- * Unique-id attribute the selector matches on. Must be a member of that entity target's
11919
- * configured `unique_ids` in the inbound use case; the toolkit reports nothing else.
11920
- *
11921
- * example:
11922
- * reenumber
11923
- */
11924
- key?: string;
11925
- /**
11926
- * Identifier the user submitted to take the value from, as `<schema>.<name>` - the same
11927
- * schema and name the portal's `registration_identifiers` / `contract_identifiers` use.
11928
- * Mutually exclusive with `from_caller_contact`.
11929
- *
11930
- * example:
11931
- * contact.complete_customer_number
11932
- */
11933
- from_identifier?: string;
11934
- /**
11935
- * Attribute of the calling portal user's own contact to take the value from. Only
11936
- * available to hooks called by a signed-in user. Mutually exclusive with
11937
- * `from_identifier`.
11938
- *
11939
- * example:
11940
- * external_id
11941
- */
11942
- from_caller_contact?: string;
11943
- /**
11944
- * Separator the source value is split on before `part` is taken, for identifiers that
11945
- * carry a unique id inside a larger value the user types. WEMAG's
11946
- * `complete_customer_number` is `"0002-<customer_pin>-<reenumber>"`, so splitting on `-`
11947
- * and taking part 2 yields the contact's `reenumber` unique id.
11948
- *
11949
- * example:
11950
- * -
11951
- */
11952
- split_on?: string;
11953
- /**
11954
- * Zero-based index of the part to use after splitting on `split_on`.
11955
- * example:
11956
- * 2
11957
- */
11958
- part?: number;
11959
- }
11960
12270
  export interface WidgetAction {
11961
12271
  _id: string;
11962
12272
  type: "link" | "journey";
@@ -12078,12 +12388,6 @@ declare namespace Components {
12078
12388
  }
12079
12389
  declare namespace Paths {
12080
12390
  namespace AddContractByIdentifiers {
12081
- namespace Parameters {
12082
- export type CorrelationId = string; // ^[A-Za-z0-9_-]+$
12083
- }
12084
- export interface QueryParameters {
12085
- correlation_id?: Parameters.CorrelationId /* ^[A-Za-z0-9_-]+$ */;
12086
- }
12087
12391
  /**
12088
12392
  * Identifier-value pairs per schema to identify the contract
12089
12393
  * example:
@@ -12109,11 +12413,31 @@ declare namespace Paths {
12109
12413
  export type $400 = Components.Responses.InvalidRequest;
12110
12414
  export type $401 = Components.Responses.Unauthorized;
12111
12415
  export type $403 = Components.Responses.Forbidden;
12112
- export type $404 = Components.Responses.ContractAssignmentNotFound;
12113
12416
  export type $409 = Components.Responses.ContractAssignmentConflict;
12114
12417
  export type $500 = Components.Responses.InternalServerError;
12115
12418
  }
12116
12419
  }
12420
+ namespace AddPortalUserPasskey {
12421
+ export interface RequestBody {
12422
+ /**
12423
+ * WebAuthn RegistrationResponseJSON from the browser
12424
+ */
12425
+ registration_response: {
12426
+ [name: string]: any;
12427
+ };
12428
+ /**
12429
+ * Label shown to the user, e.g. "iPhone"
12430
+ */
12431
+ name?: string;
12432
+ }
12433
+ namespace Responses {
12434
+ export type $201 = Components.Schemas.PortalUserPasskey;
12435
+ export type $400 = Components.Responses.InvalidRequest;
12436
+ export type $401 = Components.Responses.Unauthorized;
12437
+ export type $403 = Components.Responses.Forbidden;
12438
+ export type $500 = Components.Responses.InternalServerError;
12439
+ }
12440
+ }
12117
12441
  namespace CanTriggerPortalFlow {
12118
12442
  namespace Parameters {
12119
12443
  export type Origin = /* Origin of the portal */ Components.Schemas.Origin;
@@ -12293,25 +12617,9 @@ declare namespace Paths {
12293
12617
  *
12294
12618
  */
12295
12619
  reason?: "TIMEOUT" | "NOT_FOUND";
12296
- /**
12297
- * Correlation id of the triggered ERP sync. Present only for portals waiting on
12298
- * the Integration Toolkit (`wait_for_toolkit`). Send it back with
12299
- * `trigger_identifiers_check: false` to keep waiting on the same correlation.
12300
- *
12301
- */
12302
- correlation_id?: string; // ^[A-Za-z0-9_-]+$
12303
- /**
12304
- * Human-readable reason the identifiers did not resolve, when the portal knows
12305
- * one. Set when the ERP finished sending for this correlation without the
12306
- * entities the portal needs (e.g. "account data arrived, no contract"), so
12307
- * support can tell a silent timeout from an incomplete delivery.
12308
- *
12309
- */
12310
- message?: string;
12311
12620
  }
12312
12621
  export type $400 = Components.Responses.InvalidRequest;
12313
12622
  export type $404 = Components.Responses.NotFound;
12314
- export type $409 = Components.Responses.ContactAmbiguousMatch;
12315
12623
  export type $429 = Components.Responses.TooManyRequests;
12316
12624
  export type $500 = Components.Responses.InternalServerError;
12317
12625
  }
@@ -12646,6 +12954,40 @@ declare namespace Paths {
12646
12954
  export type $500 = Components.Responses.InternalServerError;
12647
12955
  }
12648
12956
  }
12957
+ namespace CreatePortalRevisionPreview {
12958
+ namespace Parameters {
12959
+ /**
12960
+ * example:
12961
+ * 5da0a718-c822-403d-9f5d-20d4584e0528
12962
+ */
12963
+ export type PortalId = string; // uuid
12964
+ /**
12965
+ * example:
12966
+ * 2026-08-25T14:03:11.482Z-a7f3c1d9
12967
+ */
12968
+ export type RevisionId = string;
12969
+ }
12970
+ export interface PathParameters {
12971
+ portal_id: /**
12972
+ * example:
12973
+ * 5da0a718-c822-403d-9f5d-20d4584e0528
12974
+ */
12975
+ Parameters.PortalId /* uuid */;
12976
+ revision_id: /**
12977
+ * example:
12978
+ * 2026-08-25T14:03:11.482Z-a7f3c1d9
12979
+ */
12980
+ Parameters.RevisionId;
12981
+ }
12982
+ namespace Responses {
12983
+ export type $200 = Components.Schemas.PortalRevisionPreview;
12984
+ export type $400 = Components.Responses.InvalidRequest;
12985
+ export type $401 = Components.Responses.Unauthorized;
12986
+ export type $403 = Components.Responses.Forbidden;
12987
+ export type $404 = Components.Responses.NotFound;
12988
+ export type $500 = Components.Responses.InternalServerError;
12989
+ }
12990
+ }
12649
12991
  namespace CreatePortalUserEntity {
12650
12992
  namespace Parameters {
12651
12993
  /**
@@ -12670,6 +13012,23 @@ declare namespace Paths {
12670
13012
  export type $500 = Components.Responses.InternalServerError;
12671
13013
  }
12672
13014
  }
13015
+ namespace CreatePortalUserPasskeyRegistrationOptions {
13016
+ export interface RequestBody {
13017
+ /**
13018
+ * The 6-digit code sent to the user's email address
13019
+ */
13020
+ verification_code: string;
13021
+ }
13022
+ namespace Responses {
13023
+ export interface $200 {
13024
+ [name: string]: any;
13025
+ }
13026
+ export type $400 = Components.Responses.InvalidRequest;
13027
+ export type $401 = Components.Responses.Unauthorized;
13028
+ export type $403 = Components.Responses.Forbidden;
13029
+ export type $500 = Components.Responses.InternalServerError;
13030
+ }
13031
+ }
12673
13032
  namespace CreateUser {
12674
13033
  namespace Parameters {
12675
13034
  export type Origin = /* Origin of the portal */ Components.Schemas.Origin;
@@ -12725,24 +13084,6 @@ declare namespace Paths {
12725
13084
  export type $500 = Components.Responses.InternalServerError;
12726
13085
  }
12727
13086
  }
12728
- namespace DeleteEntityFile {
12729
- export type RequestBody = Components.Schemas.DeleteEntityFile;
12730
- namespace Responses {
12731
- export interface $202 {
12732
- deletedFiles?: /**
12733
- * Entity ID
12734
- * example:
12735
- * 5da0a718-c822-403d-9f5d-20d4584e0528
12736
- */
12737
- Components.Schemas.EntityId /* uuid */[];
12738
- }
12739
- export type $400 = Components.Responses.InvalidRequest;
12740
- export type $401 = Components.Responses.Unauthorized;
12741
- export type $403 = Components.Responses.Forbidden;
12742
- export type $404 = Components.Responses.NotFound;
12743
- export type $500 = Components.Responses.InternalServerError;
12744
- }
12745
- }
12746
13087
  namespace DeletePortal {
12747
13088
  namespace Parameters {
12748
13089
  export type Origin = /* Origin of the portal */ Components.Schemas.Origin;
@@ -12824,6 +13165,39 @@ declare namespace Paths {
12824
13165
  export type $500 = Components.Responses.InternalServerError;
12825
13166
  }
12826
13167
  }
13168
+ namespace DeletePortalUserPasskey {
13169
+ namespace Parameters {
13170
+ export type CredentialId = string;
13171
+ }
13172
+ export interface PathParameters {
13173
+ credential_id: Parameters.CredentialId;
13174
+ }
13175
+ namespace Responses {
13176
+ export interface $204 {
13177
+ }
13178
+ export type $401 = Components.Responses.Unauthorized;
13179
+ export type $404 = Components.Responses.NotFound;
13180
+ export type $500 = Components.Responses.InternalServerError;
13181
+ }
13182
+ }
13183
+ namespace DetachPortalPage {
13184
+ namespace Responses {
13185
+ export type $200 = Components.Schemas.Page;
13186
+ export type $401 = Components.Responses.Unauthorized;
13187
+ export type $403 = Components.Responses.Forbidden;
13188
+ export type $404 = Components.Responses.NotFound;
13189
+ export type $500 = Components.Responses.InternalServerError;
13190
+ }
13191
+ }
13192
+ namespace DetachPortalPageBlock {
13193
+ namespace Responses {
13194
+ export type $200 = Components.Schemas.Block;
13195
+ export type $401 = Components.Responses.Unauthorized;
13196
+ export type $403 = Components.Responses.Forbidden;
13197
+ export type $404 = Components.Responses.NotFound;
13198
+ export type $500 = Components.Responses.InternalServerError;
13199
+ }
13200
+ }
12827
13201
  namespace DisablePartner {
12828
13202
  namespace Parameters {
12829
13203
  /**
@@ -15172,6 +15546,10 @@ declare namespace Paths {
15172
15546
  counter_templates?: {
15173
15547
  [name: string]: string;
15174
15548
  };
15549
+ /**
15550
+ * When true, the response includes `counter` with the counter's unit, OBIS number, direction and tariff type. Access is checked by metering-api on the counter's parent meter.
15551
+ */
15552
+ include_counter?: boolean;
15175
15553
  /**
15176
15554
  * Reference to the meter reading block whose admin-configured content provides both the per-reading templates (content_top_name, main_content_name, content_bottom_name) and the counter templates (counter_title_name, counter_subtitle_name), derived server-side.
15177
15555
  */
@@ -15192,6 +15570,7 @@ declare namespace Paths {
15192
15570
  counter_templates_output?: {
15193
15571
  [name: string]: string;
15194
15572
  };
15573
+ counter?: /* Display details of the counter the readings belong to. Only returned when `include_counter` is true and the counter could be resolved. */ Components.Schemas.MeterReadingCounterDetails;
15195
15574
  }
15196
15575
  export type $400 = Components.Responses.InvalidRequest;
15197
15576
  export type $401 = Components.Responses.Unauthorized;
@@ -15494,6 +15873,16 @@ declare namespace Paths {
15494
15873
  */
15495
15874
  enabled?: boolean;
15496
15875
  };
15876
+ /**
15877
+ * Opt-in, set by the configuring user. When enabled, a second factor is enforced after the password and portal users can add passkeys (fingerprint, face or device PIN) as one variant of it, next to the email code of advanced_mfa. Users with a passkey use it by default; with advanced_mfa off, the passkey is the only second factor once a user has added one. On passwordless portals a passkey can replace the email code. Passkeys are bound to the domain they were added on. Default off; turning it off again restores the previous behaviour and keeps registered passkeys.
15878
+ *
15879
+ */
15880
+ passkeys?: {
15881
+ /**
15882
+ * Enforce a second factor and allow passkeys as one variant of it
15883
+ */
15884
+ enabled?: boolean;
15885
+ };
15497
15886
  entry_point?: "PASSWORD" | "SSO";
15498
15887
  preferred_sso_providers?: /**
15499
15888
  * URL-friendly slug to use as organization-unique identifier for Provider
@@ -15521,6 +15910,12 @@ declare namespace Paths {
15521
15910
  * 6bsd0jkgoie74k2i8mrhc1vest
15522
15911
  */
15523
15912
  cognito_user_pool_client_id?: string;
15913
+ /**
15914
+ * Cognito user pool client ID used by the native portal apps (longer refresh token validity)
15915
+ * example:
15916
+ * 3k9fj2l1m0n8b7v6c5x4z3a2s1
15917
+ */
15918
+ cognito_mobile_client_id?: string;
15524
15919
  /**
15525
15920
  * Cognito user pool ARN
15526
15921
  * example:
@@ -15713,6 +16108,13 @@ declare namespace Paths {
15713
16108
  * ]
15714
16109
  */
15715
16110
  contract_identifiers?: Components.Schemas.ContractIdentifier[];
16111
+ /**
16112
+ * What the built-in self-assignment (without a contractIdentification hook) assigns once the `contract_identifiers` match a Contract:
16113
+ * - `contracts`: the user's Contact is added as a customer of the Contract.
16114
+ * - `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.
16115
+ *
16116
+ */
16117
+ self_assignment_mode?: "contracts" | "customer_to_portal_user";
15716
16118
  /**
15717
16119
  * Configuration for contract selector in the portal
15718
16120
  */
@@ -15896,7 +16298,7 @@ declare namespace Paths {
15896
16298
  */
15897
16299
  is_dummy?: boolean;
15898
16300
  /**
15899
- * Whether this is a v3 portal configuration
16301
+ * Always true. Legacy v2 storage was migrated; field kept for compatibility and will be removed.
15900
16302
  */
15901
16303
  is_v3_item?: boolean;
15902
16304
  /**
@@ -15935,6 +16337,7 @@ declare namespace Paths {
15935
16337
  * Master toggle for the portal's engagement center (in-app notifications including the notification triggers above). Off when absent — portal users only see the engagement center and receive trigger notifications after an admin enables it.
15936
16338
  */
15937
16339
  engagement_center_enabled?: boolean;
16340
+ engagement_center_task_templates?: /* Handlebars templates rendering each outstanding task (to-do) row in the portal's engagement center. Resolved server-side per task against the task's entity (same variable syntax as page block templates, e.g. `{{order.order_number}}`, custom and environment variables) plus `task.*` (the workflow step, e.g. `{{task.name}}`), `workflow.*` (the execution, e.g. `{{workflow.name}}`) and `entity.*` (the task's entity regardless of its schema, e.g. `{{entity._title}}`). A template that is absent or blank keeps the portal's default rendering for that line. Admin/builder-only — never exposed via the public portal config. */ Components.Schemas.EngagementCenterTaskTemplates;
15938
16341
  /**
15939
16342
  * ID of the organization
15940
16343
  * example:
@@ -15947,6 +16350,26 @@ declare namespace Paths {
15947
16350
  * 12345
15948
16351
  */
15949
16352
  organization_id?: string;
16353
+ /**
16354
+ * Blueprint instance ids managing this portal. Server-managed: ignored (stripped) on every write from a user.
16355
+ *
16356
+ */
16357
+ _manifest?: string[];
16358
+ /**
16359
+ * Id of this portal in the blueprint source. Set once: a blueprint install or update (portal create, `page_upsert_mode=slug`, or a revision with `revision_source` `blueprint_sync`) may give a portal the lineage it does not have yet, unless another portal of the organization holds it. A portal created as a copy next to the organization's live portal of its origin (downgraded to `ADDITIONAL_PORTAL`) never takes it. After that it never changes; every other write keeps the stored value. Locks nothing on its own.
16360
+ *
16361
+ */
16362
+ _lineage_id?: string;
16363
+ /**
16364
+ * Lineage ids of pages detached from their blueprint; a blueprint sync leaves them alone. Server-managed.
16365
+ *
16366
+ */
16367
+ detached_lineage_ids?: string[];
16368
+ /**
16369
+ * Only present on write responses: blueprint-managed pages/blocks the request tried to change. Their stored version was kept and the rest of the save succeeded.
16370
+ *
16371
+ */
16372
+ held_back?: /* A blueprint-managed page or block a write tried to change; the stored version was kept. */ Components.Schemas.HeldBackNode[];
15950
16373
  /**
15951
16374
  * Organization settings
15952
16375
  */
@@ -16002,6 +16425,19 @@ declare namespace Paths {
16002
16425
  *
16003
16426
  */
16004
16427
  Components.Schemas.ProviderConfig[];
16428
+ /**
16429
+ * Present only when the request carried a valid `x-portal-preview-token`: the config is this revision's, not the live one.
16430
+ *
16431
+ */
16432
+ preview_revision?: {
16433
+ /**
16434
+ * example:
16435
+ * 2026-08-25T14:03:11.482Z-a7f3c1d9
16436
+ */
16437
+ revision_id: string;
16438
+ name?: string;
16439
+ created_at: string; // date-time
16440
+ };
16005
16441
  certificate_details?: {
16006
16442
  /**
16007
16443
  * Status of the certificate
@@ -16125,6 +16561,16 @@ declare namespace Paths {
16125
16561
  */
16126
16562
  enabled?: boolean;
16127
16563
  };
16564
+ /**
16565
+ * Opt-in, set by the configuring user. When enabled, a second factor is enforced after the password and portal users can add passkeys (fingerprint, face or device PIN) as one variant of it, next to the email code of advanced_mfa. Users with a passkey use it by default; with advanced_mfa off, the passkey is the only second factor once a user has added one. On passwordless portals a passkey can replace the email code. Passkeys are bound to the domain they were added on. Default off; turning it off again restores the previous behaviour and keeps registered passkeys.
16566
+ *
16567
+ */
16568
+ passkeys?: {
16569
+ /**
16570
+ * Enforce a second factor and allow passkeys as one variant of it
16571
+ */
16572
+ enabled?: boolean;
16573
+ };
16128
16574
  entry_point?: "PASSWORD" | "SSO";
16129
16575
  preferred_sso_providers?: /**
16130
16576
  * URL-friendly slug to use as organization-unique identifier for Provider
@@ -16152,6 +16598,12 @@ declare namespace Paths {
16152
16598
  * 6bsd0jkgoie74k2i8mrhc1vest
16153
16599
  */
16154
16600
  cognito_user_pool_client_id?: string;
16601
+ /**
16602
+ * Cognito user pool client ID used by the native portal apps (longer refresh token validity)
16603
+ * example:
16604
+ * 3k9fj2l1m0n8b7v6c5x4z3a2s1
16605
+ */
16606
+ cognito_mobile_client_id?: string;
16155
16607
  /**
16156
16608
  * Cognito user pool ARN
16157
16609
  * example:
@@ -16344,6 +16796,13 @@ declare namespace Paths {
16344
16796
  * ]
16345
16797
  */
16346
16798
  contract_identifiers?: Components.Schemas.ContractIdentifier[];
16799
+ /**
16800
+ * What the built-in self-assignment (without a contractIdentification hook) assigns once the `contract_identifiers` match a Contract:
16801
+ * - `contracts`: the user's Contact is added as a customer of the Contract.
16802
+ * - `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.
16803
+ *
16804
+ */
16805
+ self_assignment_mode?: "contracts" | "customer_to_portal_user";
16347
16806
  /**
16348
16807
  * Configuration for contract selector in the portal
16349
16808
  */
@@ -16527,7 +16986,7 @@ declare namespace Paths {
16527
16986
  */
16528
16987
  is_dummy?: boolean;
16529
16988
  /**
16530
- * Whether this is a v3 portal configuration
16989
+ * Always true. Legacy v2 storage was migrated; field kept for compatibility and will be removed.
16531
16990
  */
16532
16991
  is_v3_item?: boolean;
16533
16992
  /**
@@ -16566,6 +17025,7 @@ declare namespace Paths {
16566
17025
  * Master toggle for the portal's engagement center (in-app notifications including the notification triggers above). Off when absent — portal users only see the engagement center and receive trigger notifications after an admin enables it.
16567
17026
  */
16568
17027
  engagement_center_enabled?: boolean;
17028
+ engagement_center_task_templates?: /* Handlebars templates rendering each outstanding task (to-do) row in the portal's engagement center. Resolved server-side per task against the task's entity (same variable syntax as page block templates, e.g. `{{order.order_number}}`, custom and environment variables) plus `task.*` (the workflow step, e.g. `{{task.name}}`), `workflow.*` (the execution, e.g. `{{workflow.name}}`) and `entity.*` (the task's entity regardless of its schema, e.g. `{{entity._title}}`). A template that is absent or blank keeps the portal's default rendering for that line. Admin/builder-only — never exposed via the public portal config. */ Components.Schemas.EngagementCenterTaskTemplates;
16569
17029
  /**
16570
17030
  * ID of the organization
16571
17031
  * example:
@@ -16578,6 +17038,26 @@ declare namespace Paths {
16578
17038
  * 12345
16579
17039
  */
16580
17040
  organization_id?: string;
17041
+ /**
17042
+ * Blueprint instance ids managing this portal. Server-managed: ignored (stripped) on every write from a user.
17043
+ *
17044
+ */
17045
+ _manifest?: string[];
17046
+ /**
17047
+ * Id of this portal in the blueprint source. Set once: a blueprint install or update (portal create, `page_upsert_mode=slug`, or a revision with `revision_source` `blueprint_sync`) may give a portal the lineage it does not have yet, unless another portal of the organization holds it. A portal created as a copy next to the organization's live portal of its origin (downgraded to `ADDITIONAL_PORTAL`) never takes it. After that it never changes; every other write keeps the stored value. Locks nothing on its own.
17048
+ *
17049
+ */
17050
+ _lineage_id?: string;
17051
+ /**
17052
+ * Lineage ids of pages detached from their blueprint; a blueprint sync leaves them alone. Server-managed.
17053
+ *
17054
+ */
17055
+ detached_lineage_ids?: string[];
17056
+ /**
17057
+ * Only present on write responses: blueprint-managed pages/blocks the request tried to change. Their stored version was kept and the rest of the save succeeded.
17058
+ *
17059
+ */
17060
+ held_back?: /* A blueprint-managed page or block a write tried to change; the stored version was kept. */ Components.Schemas.HeldBackNode[];
16581
17061
  /**
16582
17062
  * Organization settings
16583
17063
  */
@@ -16633,6 +17113,19 @@ declare namespace Paths {
16633
17113
  *
16634
17114
  */
16635
17115
  Components.Schemas.ProviderConfig[];
17116
+ /**
17117
+ * Present only when the request carried a valid `x-portal-preview-token`: the config is this revision's, not the live one.
17118
+ *
17119
+ */
17120
+ preview_revision?: {
17121
+ /**
17122
+ * example:
17123
+ * 2026-08-25T14:03:11.482Z-a7f3c1d9
17124
+ */
17125
+ revision_id: string;
17126
+ name?: string;
17127
+ created_at: string; // date-time
17128
+ };
16636
17129
  certificate_details?: {
16637
17130
  /**
16638
17131
  * Status of the certificate
@@ -16758,6 +17251,15 @@ declare namespace Paths {
16758
17251
  export type $500 = Components.Responses.InternalServerError;
16759
17252
  }
16760
17253
  }
17254
+ namespace GetPortalCopilotAccess {
17255
+ namespace Responses {
17256
+ export interface $200 {
17257
+ allowed: boolean;
17258
+ }
17259
+ export type $401 = Components.Responses.Unauthorized;
17260
+ export type $500 = Components.Responses.InternalServerError;
17261
+ }
17262
+ }
16761
17263
  namespace GetPortalExtensions {
16762
17264
  namespace Parameters {
16763
17265
  export type Origin = /* Origin of the portal */ Components.Schemas.Origin;
@@ -16937,6 +17439,15 @@ declare namespace Paths {
16937
17439
  export type $500 = Components.Responses.InternalServerError;
16938
17440
  }
16939
17441
  }
17442
+ namespace GetPortalUserNotificationPreferences {
17443
+ namespace Responses {
17444
+ export type $200 = /* Resolved notification preferences of a portal user. Notifications are opt-out: a channel that was never stored on the portal user resolves to enabled (true). */ Components.Schemas.PortalUserNotificationPreferences;
17445
+ export type $401 = Components.Responses.Unauthorized;
17446
+ export type $403 = Components.Responses.Forbidden;
17447
+ export type $404 = Components.Responses.NotFound;
17448
+ export type $500 = Components.Responses.InternalServerError;
17449
+ }
17450
+ }
16940
17451
  namespace GetPortalWidgets {
16941
17452
  namespace Parameters {
16942
17453
  export type ContractId = /**
@@ -17310,6 +17821,16 @@ declare namespace Paths {
17310
17821
  */
17311
17822
  enabled?: boolean;
17312
17823
  };
17824
+ /**
17825
+ * Opt-in, set by the configuring user. When enabled, a second factor is enforced after the password and portal users can add passkeys (fingerprint, face or device PIN) as one variant of it, next to the email code of advanced_mfa. Users with a passkey use it by default; with advanced_mfa off, the passkey is the only second factor once a user has added one. On passwordless portals a passkey can replace the email code. Passkeys are bound to the domain they were added on. Default off; turning it off again restores the previous behaviour and keeps registered passkeys.
17826
+ *
17827
+ */
17828
+ passkeys?: {
17829
+ /**
17830
+ * Enforce a second factor and allow passkeys as one variant of it
17831
+ */
17832
+ enabled?: boolean;
17833
+ };
17313
17834
  entry_point?: "PASSWORD" | "SSO";
17314
17835
  preferred_sso_providers?: /**
17315
17836
  * URL-friendly slug to use as organization-unique identifier for Provider
@@ -17337,6 +17858,12 @@ declare namespace Paths {
17337
17858
  * 6bsd0jkgoie74k2i8mrhc1vest
17338
17859
  */
17339
17860
  cognito_user_pool_client_id?: string;
17861
+ /**
17862
+ * Cognito user pool client ID used by the native portal apps (longer refresh token validity)
17863
+ * example:
17864
+ * 3k9fj2l1m0n8b7v6c5x4z3a2s1
17865
+ */
17866
+ cognito_mobile_client_id?: string;
17340
17867
  /**
17341
17868
  * Cognito user pool ARN
17342
17869
  * example:
@@ -17529,6 +18056,13 @@ declare namespace Paths {
17529
18056
  * ]
17530
18057
  */
17531
18058
  contract_identifiers?: Components.Schemas.ContractIdentifier[];
18059
+ /**
18060
+ * What the built-in self-assignment (without a contractIdentification hook) assigns once the `contract_identifiers` match a Contract:
18061
+ * - `contracts`: the user's Contact is added as a customer of the Contract.
18062
+ * - `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.
18063
+ *
18064
+ */
18065
+ self_assignment_mode?: "contracts" | "customer_to_portal_user";
17532
18066
  /**
17533
18067
  * Configuration for contract selector in the portal
17534
18068
  */
@@ -17712,7 +18246,7 @@ declare namespace Paths {
17712
18246
  */
17713
18247
  is_dummy?: boolean;
17714
18248
  /**
17715
- * Whether this is a v3 portal configuration
18249
+ * Always true. Legacy v2 storage was migrated; field kept for compatibility and will be removed.
17716
18250
  */
17717
18251
  is_v3_item?: boolean;
17718
18252
  /**
@@ -17751,6 +18285,7 @@ declare namespace Paths {
17751
18285
  * Master toggle for the portal's engagement center (in-app notifications including the notification triggers above). Off when absent — portal users only see the engagement center and receive trigger notifications after an admin enables it.
17752
18286
  */
17753
18287
  engagement_center_enabled?: boolean;
18288
+ engagement_center_task_templates?: /* Handlebars templates rendering each outstanding task (to-do) row in the portal's engagement center. Resolved server-side per task against the task's entity (same variable syntax as page block templates, e.g. `{{order.order_number}}`, custom and environment variables) plus `task.*` (the workflow step, e.g. `{{task.name}}`), `workflow.*` (the execution, e.g. `{{workflow.name}}`) and `entity.*` (the task's entity regardless of its schema, e.g. `{{entity._title}}`). A template that is absent or blank keeps the portal's default rendering for that line. Admin/builder-only — never exposed via the public portal config. */ Components.Schemas.EngagementCenterTaskTemplates;
17754
18289
  /**
17755
18290
  * ID of the organization
17756
18291
  * example:
@@ -17763,6 +18298,26 @@ declare namespace Paths {
17763
18298
  * 12345
17764
18299
  */
17765
18300
  organization_id?: string;
18301
+ /**
18302
+ * Blueprint instance ids managing this portal. Server-managed: ignored (stripped) on every write from a user.
18303
+ *
18304
+ */
18305
+ _manifest?: string[];
18306
+ /**
18307
+ * Id of this portal in the blueprint source. Set once: a blueprint install or update (portal create, `page_upsert_mode=slug`, or a revision with `revision_source` `blueprint_sync`) may give a portal the lineage it does not have yet, unless another portal of the organization holds it. A portal created as a copy next to the organization's live portal of its origin (downgraded to `ADDITIONAL_PORTAL`) never takes it. After that it never changes; every other write keeps the stored value. Locks nothing on its own.
18308
+ *
18309
+ */
18310
+ _lineage_id?: string;
18311
+ /**
18312
+ * Lineage ids of pages detached from their blueprint; a blueprint sync leaves them alone. Server-managed.
18313
+ *
18314
+ */
18315
+ detached_lineage_ids?: string[];
18316
+ /**
18317
+ * Only present on write responses: blueprint-managed pages/blocks the request tried to change. Their stored version was kept and the rest of the save succeeded.
18318
+ *
18319
+ */
18320
+ held_back?: /* A blueprint-managed page or block a write tried to change; the stored version was kept. */ Components.Schemas.HeldBackNode[];
17766
18321
  /**
17767
18322
  * Organization settings
17768
18323
  */
@@ -17803,6 +18358,19 @@ declare namespace Paths {
17803
18358
  *
17804
18359
  */
17805
18360
  identity_providers?: /* Minimal public identity provider info — enough to render a provider login button. */ Components.Schemas.PublicIdentityProvider[];
18361
+ /**
18362
+ * Present only when the request carried a valid `x-portal-preview-token`: the config is this revision's, not the live one.
18363
+ *
18364
+ */
18365
+ preview_revision?: {
18366
+ /**
18367
+ * example:
18368
+ * 2026-08-25T14:03:11.482Z-a7f3c1d9
18369
+ */
18370
+ revision_id: string;
18371
+ name?: string;
18372
+ created_at: string; // date-time
18373
+ };
17806
18374
  }
17807
18375
  export type $500 = Components.Responses.InternalServerError;
17808
18376
  }
@@ -18718,10 +19286,20 @@ declare namespace Paths {
18718
19286
  export type $500 = Components.Responses.InternalServerError;
18719
19287
  }
18720
19288
  }
18721
- namespace LoginToPortalAsUser {
18722
- export interface RequestBody {
18723
- /**
18724
- * The email address of the user to log in as
19289
+ namespace ListPortalUserPasskeys {
19290
+ namespace Responses {
19291
+ export interface $200 {
19292
+ results?: Components.Schemas.PortalUserPasskey[];
19293
+ }
19294
+ export type $401 = Components.Responses.Unauthorized;
19295
+ export type $403 = Components.Responses.Forbidden;
19296
+ export type $500 = Components.Responses.InternalServerError;
19297
+ }
19298
+ }
19299
+ namespace LoginToPortalAsUser {
19300
+ export interface RequestBody {
19301
+ /**
19302
+ * The email address of the user to log in as
18725
19303
  * example:
18726
19304
  * portal-customer@email.com
18727
19305
  */
@@ -18742,6 +19320,12 @@ declare namespace Paths {
18742
19320
  * A generated login_as_token to log in to a portal impersonating a user.
18743
19321
  */
18744
19322
  login_as_token?: string;
19323
+ /**
19324
+ * URL of the portal on its epilot domain, to open `/login-as?token=<login_as_token>` on.
19325
+ * example:
19326
+ * https://my-portal.ecp.epilot.io
19327
+ */
19328
+ portal_url?: string;
18745
19329
  }
18746
19330
  }
18747
19331
  }
@@ -19365,6 +19949,16 @@ declare namespace Paths {
19365
19949
  export type $500 = Components.Responses.InternalServerError;
19366
19950
  }
19367
19951
  }
19952
+ namespace SendPortalUserPasskeyVerificationCode {
19953
+ namespace Responses {
19954
+ export interface $204 {
19955
+ }
19956
+ export type $401 = Components.Responses.Unauthorized;
19957
+ export type $403 = Components.Responses.Forbidden;
19958
+ export type $429 = Components.Responses.TooManyRequests;
19959
+ export type $500 = Components.Responses.InternalServerError;
19960
+ }
19961
+ }
19368
19962
  namespace SsoCallback {
19369
19963
  namespace Parameters {
19370
19964
  /**
@@ -19385,6 +19979,15 @@ declare namespace Paths {
19385
19979
  export type RequestBody = Components.Schemas.SSOCallbackRequest;
19386
19980
  namespace Responses {
19387
19981
  export type $200 = Components.Schemas.SSOCallbackResponse;
19982
+ export type $400 = /**
19983
+ * Error response of the public SSO endpoints. Like every error response the message is in
19984
+ * `error`; `reason` carries a stable machine-readable cause when one is known (e.g.
19985
+ * `MISSING_EMAIL_CLAIM`, `INVALID_PROVIDER`, `SELF_REGISTRATION_NOT_ALLOWED`,
19986
+ * `TOKEN_EXCHANGE_FAILED`). `debug` is only present while SSO debug mode is active for the
19987
+ * resolved provider (`ProviderConfig.debug_mode_until`).
19988
+ *
19989
+ */
19990
+ Components.Schemas.SSOErrorResp;
19388
19991
  export type $500 = Components.Responses.InternalServerError;
19389
19992
  }
19390
19993
  }
@@ -19433,6 +20036,15 @@ declare namespace Paths {
19433
20036
  */
19434
20037
  email?: string;
19435
20038
  }
20039
+ export type $400 = /**
20040
+ * Error response of the public SSO endpoints. Like every error response the message is in
20041
+ * `error`; `reason` carries a stable machine-readable cause when one is known (e.g.
20042
+ * `MISSING_EMAIL_CLAIM`, `INVALID_PROVIDER`, `SELF_REGISTRATION_NOT_ALLOWED`,
20043
+ * `TOKEN_EXCHANGE_FAILED`). `debug` is only present while SSO debug mode is active for the
20044
+ * resolved provider (`ProviderConfig.debug_mode_until`).
20045
+ *
20046
+ */
20047
+ Components.Schemas.SSOErrorResp;
19436
20048
  }
19437
20049
  }
19438
20050
  namespace SsoLoginV3 {
@@ -19491,7 +20103,15 @@ declare namespace Paths {
19491
20103
  */
19492
20104
  email?: string;
19493
20105
  }
19494
- export type $400 = Components.Responses.InvalidRequest;
20106
+ export type $400 = /**
20107
+ * Error response of the public SSO endpoints. Like every error response the message is in
20108
+ * `error`; `reason` carries a stable machine-readable cause when one is known (e.g.
20109
+ * `MISSING_EMAIL_CLAIM`, `INVALID_PROVIDER`, `SELF_REGISTRATION_NOT_ALLOWED`,
20110
+ * `TOKEN_EXCHANGE_FAILED`). `debug` is only present while SSO debug mode is active for the
20111
+ * resolved provider (`ProviderConfig.debug_mode_until`).
20112
+ *
20113
+ */
20114
+ Components.Schemas.SSOErrorResp;
19495
20115
  }
19496
20116
  }
19497
20117
  namespace SsoRedirect {
@@ -19583,6 +20203,7 @@ declare namespace Paths {
19583
20203
  export type $401 = Components.Responses.Unauthorized;
19584
20204
  export type $403 = Components.Responses.Forbidden;
19585
20205
  export type $404 = Components.Responses.NotFound;
20206
+ export type $409 = Components.Schemas.ErrorResp;
19586
20207
  export type $500 = Components.Responses.InternalServerError;
19587
20208
  }
19588
20209
  }
@@ -19751,7 +20372,12 @@ declare namespace Paths {
19751
20372
  }
19752
20373
  }
19753
20374
  namespace UpdateContact {
19754
- export type RequestBody = Components.Schemas.Entity;
20375
+ export type RequestBody = /**
20376
+ * Contact attributes a portal user can change. Other attributes are ignored.
20377
+ * Value types follow the organization's contact schema.
20378
+ *
20379
+ */
20380
+ Components.Schemas.PortalContactUpdate;
19755
20381
  namespace Responses {
19756
20382
  export interface $200 {
19757
20383
  data?: /* The mapped contact of the portal user */ Components.Schemas.Contact;
@@ -19774,7 +20400,7 @@ declare namespace Paths {
19774
20400
  export interface PathParameters {
19775
20401
  id: Parameters.Id;
19776
20402
  }
19777
- export type RequestBody = Components.Schemas.Entity;
20403
+ export type RequestBody = /* Contract attributes a portal user can change. Other attributes are ignored. */ Components.Schemas.PortalContractUpdate;
19778
20404
  namespace Responses {
19779
20405
  export interface $200 {
19780
20406
  data?: /* The contract entity */ Components.Schemas.Contract;
@@ -19814,52 +20440,6 @@ declare namespace Paths {
19814
20440
  export type $500 = Components.Responses.InternalServerError;
19815
20441
  }
19816
20442
  }
19817
- namespace UpdateOpportunity {
19818
- namespace Parameters {
19819
- export type Id = /**
19820
- * Entity ID
19821
- * example:
19822
- * 5da0a718-c822-403d-9f5d-20d4584e0528
19823
- */
19824
- Components.Schemas.EntityId /* uuid */;
19825
- }
19826
- export interface PathParameters {
19827
- id: Parameters.Id;
19828
- }
19829
- export type RequestBody = Components.Schemas.Entity;
19830
- namespace Responses {
19831
- export interface $200 {
19832
- data?: /* The opportunity entity */ Components.Schemas.Opportunity;
19833
- }
19834
- export type $401 = Components.Responses.Unauthorized;
19835
- export type $403 = Components.Responses.Forbidden;
19836
- export type $404 = Components.Responses.NotFound;
19837
- export type $500 = Components.Responses.InternalServerError;
19838
- }
19839
- }
19840
- namespace UpdateOrder {
19841
- namespace Parameters {
19842
- export type Id = /**
19843
- * Entity ID
19844
- * example:
19845
- * 5da0a718-c822-403d-9f5d-20d4584e0528
19846
- */
19847
- Components.Schemas.EntityId /* uuid */;
19848
- }
19849
- export interface PathParameters {
19850
- id: Parameters.Id;
19851
- }
19852
- export type RequestBody = Components.Schemas.Entity;
19853
- namespace Responses {
19854
- export interface $200 {
19855
- data?: /* The order entity */ Components.Schemas.Order;
19856
- }
19857
- export type $401 = Components.Responses.Unauthorized;
19858
- export type $403 = Components.Responses.Forbidden;
19859
- export type $404 = Components.Responses.NotFound;
19860
- export type $500 = Components.Responses.InternalServerError;
19861
- }
19862
- }
19863
20443
  namespace UpdatePortalPage {
19864
20444
  export type RequestBody = Components.Schemas.PageRequest;
19865
20445
  namespace Responses {
@@ -19915,16 +20495,6 @@ declare namespace Paths {
19915
20495
  export type $500 = Components.Responses.InternalServerError;
19916
20496
  }
19917
20497
  }
19918
- namespace UpdatePortalUser {
19919
- export type RequestBody = Components.Schemas.Entity;
19920
- namespace Responses {
19921
- export interface $200 {
19922
- data?: /* The portal user entity */ Components.Schemas.PortalUser;
19923
- }
19924
- export type $401 = Components.Responses.Unauthorized;
19925
- export type $500 = Components.Responses.InternalServerError;
19926
- }
19927
- }
19928
20498
  namespace UpdatePortalUserEmail {
19929
20499
  export interface RequestBody {
19930
20500
  /**
@@ -19960,6 +20530,25 @@ declare namespace Paths {
19960
20530
  export type $500 = Components.Responses.InternalServerError;
19961
20531
  }
19962
20532
  }
20533
+ namespace UpdatePortalUserNotificationPreferences {
20534
+ /**
20535
+ * Channels to update. Omitted channels are left unchanged.
20536
+ */
20537
+ export interface RequestBody {
20538
+ /**
20539
+ * Whether the portal user wants to receive in-app notifications.
20540
+ */
20541
+ in_app?: boolean;
20542
+ }
20543
+ namespace Responses {
20544
+ export type $200 = /* Resolved notification preferences of a portal user. Notifications are opt-out: a channel that was never stored on the portal user resolves to enabled (true). */ Components.Schemas.PortalUserNotificationPreferences;
20545
+ export type $400 = Components.Responses.InvalidRequest;
20546
+ export type $401 = Components.Responses.Unauthorized;
20547
+ export type $403 = Components.Responses.Forbidden;
20548
+ export type $404 = Components.Responses.NotFound;
20549
+ export type $500 = Components.Responses.InternalServerError;
20550
+ }
20551
+ }
19963
20552
  namespace UpdateWorkflowStepAsDone {
19964
20553
  namespace Parameters {
19965
20554
  /**
@@ -20316,6 +20905,48 @@ declare namespace Paths {
20316
20905
  Parameters.BlockId /* uuid */;
20317
20906
  }
20318
20907
  }
20908
+ namespace V2PortalPages$IdBlocks$BlockIdDetach {
20909
+ namespace Parameters {
20910
+ /**
20911
+ * example:
20912
+ * c495fef9-eeca-4019-a989-8390dcd9825b
20913
+ */
20914
+ export type BlockId = string; // uuid
20915
+ /**
20916
+ * example:
20917
+ * 5da0a718-c822-403d-9f5d-20d4584e0528
20918
+ */
20919
+ export type Id = string; // uuid
20920
+ }
20921
+ export interface PathParameters {
20922
+ id: /**
20923
+ * example:
20924
+ * 5da0a718-c822-403d-9f5d-20d4584e0528
20925
+ */
20926
+ Parameters.Id /* uuid */;
20927
+ block_id: /**
20928
+ * example:
20929
+ * c495fef9-eeca-4019-a989-8390dcd9825b
20930
+ */
20931
+ Parameters.BlockId /* uuid */;
20932
+ }
20933
+ }
20934
+ namespace V2PortalPages$IdDetach {
20935
+ namespace Parameters {
20936
+ /**
20937
+ * example:
20938
+ * 5da0a718-c822-403d-9f5d-20d4584e0528
20939
+ */
20940
+ export type Id = string; // uuid
20941
+ }
20942
+ export interface PathParameters {
20943
+ id: /**
20944
+ * example:
20945
+ * 5da0a718-c822-403d-9f5d-20d4584e0528
20946
+ */
20947
+ Parameters.Id /* uuid */;
20948
+ }
20949
+ }
20319
20950
  namespace ValidateCaaRecords {
20320
20951
  namespace Parameters {
20321
20952
  export type Origin = /* Origin of the portal */ Components.Schemas.Origin;
@@ -20776,8 +21407,8 @@ export interface OperationMethods {
20776
21407
  * at `destination_template_id`. Intended to be called from the email-template
20777
21408
  * migration flow when a duplicated template is refined.
20778
21409
  *
20779
- * Only v3-shaped rows are migrated (those carrying `portal_sk_v3`). Returns
20780
- * the portal IDs that were rewritten and any whose update failed.
21410
+ * Rows are keyed by portal id (`portal_sk_v3`); a row without one is skipped.
21411
+ * Returns the portal IDs that were rewritten and any whose update failed.
20781
21412
  *
20782
21413
  */
20783
21414
  'migrateEmailTemplateReferences'(
@@ -21001,7 +21632,9 @@ export interface OperationMethods {
21001
21632
  /**
21002
21633
  * updateContact - updateContact
21003
21634
  *
21004
- * Updates the contact details.
21635
+ * Updates the portal user's contact. Only the attributes in `PortalContactUpdate` can be changed;
21636
+ * other attributes are ignored. Returns 403 when the body has none of them.
21637
+ *
21005
21638
  */
21006
21639
  'updateContact'(
21007
21640
  parameters?: Parameters<UnknownParamsObject> | null,
@@ -21094,25 +21727,25 @@ export interface OperationMethods {
21094
21727
  config?: AxiosRequestConfig
21095
21728
  ): OperationResponse<Paths.GetValidSecondaryAttributes.Responses.$200>
21096
21729
  /**
21097
- * getPortalUser - getPortalUser
21730
+ * getPortalCopilotAccess - getPortalCopilotAccess
21098
21731
  *
21099
- * Get the portal user details
21732
+ * Whether the signed-in portal user may use the portal chat. False when the chat is off for the portal, when the user does not match its target visibility, or when targets cannot be matched.
21100
21733
  */
21101
- 'getPortalUser'(
21734
+ 'getPortalCopilotAccess'(
21102
21735
  parameters?: Parameters<UnknownParamsObject> | null,
21103
21736
  data?: any,
21104
21737
  config?: AxiosRequestConfig
21105
- ): OperationResponse<Paths.GetPortalUser.Responses.$200>
21738
+ ): OperationResponse<Paths.GetPortalCopilotAccess.Responses.$200>
21106
21739
  /**
21107
- * updatePortalUser - updatePortalUser
21740
+ * getPortalUser - getPortalUser
21108
21741
  *
21109
- * Update the portal user details
21742
+ * Get the portal user details
21110
21743
  */
21111
- 'updatePortalUser'(
21744
+ 'getPortalUser'(
21112
21745
  parameters?: Parameters<UnknownParamsObject> | null,
21113
- data?: Paths.UpdatePortalUser.RequestBody,
21746
+ data?: any,
21114
21747
  config?: AxiosRequestConfig
21115
- ): OperationResponse<Paths.UpdatePortalUser.Responses.$200>
21748
+ ): OperationResponse<Paths.GetPortalUser.Responses.$200>
21116
21749
  /**
21117
21750
  * deletePortalUser - deletePortalUser
21118
21751
  *
@@ -21145,6 +21778,86 @@ export interface OperationMethods {
21145
21778
  data?: Paths.ChangePortalUserPassword.RequestBody,
21146
21779
  config?: AxiosRequestConfig
21147
21780
  ): OperationResponse<Paths.ChangePortalUserPassword.Responses.$200>
21781
+ /**
21782
+ * getPortalUserNotificationPreferences - getPortalUserNotificationPreferences
21783
+ *
21784
+ * Returns the notification preferences of the authenticated portal user. Notifications follow an opt-out model: a preference that was never stored on the portal user defaults to enabled (true). Responds 404 while the engagement-center v2 feature is not enabled for the organization.
21785
+ */
21786
+ 'getPortalUserNotificationPreferences'(
21787
+ parameters?: Parameters<UnknownParamsObject> | null,
21788
+ data?: any,
21789
+ config?: AxiosRequestConfig
21790
+ ): OperationResponse<Paths.GetPortalUserNotificationPreferences.Responses.$200>
21791
+ /**
21792
+ * updatePortalUserNotificationPreferences - updatePortalUserNotificationPreferences
21793
+ *
21794
+ * Partially updates the notification preferences of the authenticated portal user. Only the channels present in the request body are changed; omitted channels keep their stored value (or the enabled-by-default behaviour when never set). Returns the resulting full preferences. Responds 404 while the engagement-center v2 feature is not enabled for the organization.
21795
+ */
21796
+ 'updatePortalUserNotificationPreferences'(
21797
+ parameters?: Parameters<UnknownParamsObject> | null,
21798
+ data?: Paths.UpdatePortalUserNotificationPreferences.RequestBody,
21799
+ config?: AxiosRequestConfig
21800
+ ): OperationResponse<Paths.UpdatePortalUserNotificationPreferences.Responses.$200>
21801
+ /**
21802
+ * listPortalUserPasskeys - listPortalUserPasskeys
21803
+ *
21804
+ * Lists the passkeys the logged-in portal user has added.
21805
+ */
21806
+ 'listPortalUserPasskeys'(
21807
+ parameters?: Parameters<UnknownParamsObject> | null,
21808
+ data?: any,
21809
+ config?: AxiosRequestConfig
21810
+ ): OperationResponse<Paths.ListPortalUserPasskeys.Responses.$200>
21811
+ /**
21812
+ * addPortalUserPasskey - addPortalUserPasskey
21813
+ *
21814
+ * Stores a new passkey for the logged-in portal user.
21815
+ * Send the browser's `navigator.credentials.create()` result for options from `createPortalUserPasskeyRegistrationOptions`.
21816
+ * Only available when `auth_settings.passkeys.enabled` is set for the portal.
21817
+ *
21818
+ */
21819
+ 'addPortalUserPasskey'(
21820
+ parameters?: Parameters<UnknownParamsObject> | null,
21821
+ data?: Paths.AddPortalUserPasskey.RequestBody,
21822
+ config?: AxiosRequestConfig
21823
+ ): OperationResponse<Paths.AddPortalUserPasskey.Responses.$201>
21824
+ /**
21825
+ * createPortalUserPasskeyRegistrationOptions - createPortalUserPasskeyRegistrationOptions
21826
+ *
21827
+ * Returns WebAuthn options for `navigator.credentials.create()` to add a passkey for the logged-in portal user.
21828
+ * Needs the code from `sendPortalUserPasskeyVerificationCode`, so a session alone can't add a passkey; the code is used up here.
21829
+ * The passkey is bound to the domain in the request's `Origin` header, which must be one of the portal's domains.
21830
+ * Only available when `auth_settings.passkeys.enabled` is set for the portal.
21831
+ *
21832
+ */
21833
+ 'createPortalUserPasskeyRegistrationOptions'(
21834
+ parameters?: Parameters<UnknownParamsObject> | null,
21835
+ data?: Paths.CreatePortalUserPasskeyRegistrationOptions.RequestBody,
21836
+ config?: AxiosRequestConfig
21837
+ ): OperationResponse<Paths.CreatePortalUserPasskeyRegistrationOptions.Responses.$200>
21838
+ /**
21839
+ * sendPortalUserPasskeyVerificationCode - sendPortalUserPasskeyVerificationCode
21840
+ *
21841
+ * Emails the logged-in portal user a 6-digit code needed to add a passkey (`createPortalUserPasskeyRegistrationOptions`).
21842
+ * The code is valid for 10 minutes and allows 5 attempts; a new code replaces the previous one and can be requested once a minute.
21843
+ * Only available when `auth_settings.passkeys.enabled` is set for the portal.
21844
+ *
21845
+ */
21846
+ 'sendPortalUserPasskeyVerificationCode'(
21847
+ parameters?: Parameters<UnknownParamsObject> | null,
21848
+ data?: any,
21849
+ config?: AxiosRequestConfig
21850
+ ): OperationResponse<Paths.SendPortalUserPasskeyVerificationCode.Responses.$204>
21851
+ /**
21852
+ * deletePortalUserPasskey - deletePortalUserPasskey
21853
+ *
21854
+ * Removes one of the logged-in portal user's passkeys. Works even when passkeys are turned off for the portal.
21855
+ */
21856
+ 'deletePortalUserPasskey'(
21857
+ parameters?: Parameters<Paths.DeletePortalUserPasskey.PathParameters> | null,
21858
+ data?: any,
21859
+ config?: AxiosRequestConfig
21860
+ ): OperationResponse<Paths.DeletePortalUserPasskey.Responses.$204>
21148
21861
  /**
21149
21862
  * resendConfirmationEmail - resendConfirmationEmail
21150
21863
  *
@@ -21269,16 +21982,6 @@ export interface OperationMethods {
21269
21982
  data?: any,
21270
21983
  config?: AxiosRequestConfig
21271
21984
  ): OperationResponse<Paths.GetOrder.Responses.$200>
21272
- /**
21273
- * updateOrder - updateOrder
21274
- *
21275
- * Update an order by id. Use getPortalUserEntity instead.
21276
- */
21277
- 'updateOrder'(
21278
- parameters?: Parameters<Paths.UpdateOrder.PathParameters> | null,
21279
- data?: Paths.UpdateOrder.RequestBody,
21280
- config?: AxiosRequestConfig
21281
- ): OperationResponse<Paths.UpdateOrder.Responses.$200>
21282
21985
  /**
21283
21986
  * getAllOpportunities - getAllOpportunities
21284
21987
  *
@@ -21319,16 +22022,6 @@ export interface OperationMethods {
21319
22022
  data?: any,
21320
22023
  config?: AxiosRequestConfig
21321
22024
  ): OperationResponse<Paths.GetOpportunity.Responses.$200>
21322
- /**
21323
- * updateOpportunity - updateOpportunity
21324
- *
21325
- * Update an opportunity by id.
21326
- */
21327
- 'updateOpportunity'(
21328
- parameters?: Parameters<Paths.UpdateOpportunity.PathParameters> | null,
21329
- data?: Paths.UpdateOpportunity.RequestBody,
21330
- config?: AxiosRequestConfig
21331
- ): OperationResponse<Paths.UpdateOpportunity.Responses.$200>
21332
22025
  /**
21333
22026
  * getAllRequests - getAllRequests
21334
22027
  *
@@ -21362,7 +22055,9 @@ export interface OperationMethods {
21362
22055
  /**
21363
22056
  * updateContract - updateContract
21364
22057
  *
21365
- * Update a contract by id. Use getPortalUserEntity instead.
22058
+ * Updates a contract of the portal user. Only the attributes in `PortalContractUpdate` can be changed;
22059
+ * other attributes are ignored. Returns 403 when the body has none of them.
22060
+ *
21366
22061
  */
21367
22062
  'updateContract'(
21368
22063
  parameters?: Parameters<Paths.UpdateContract.PathParameters> | null,
@@ -21383,16 +22078,9 @@ export interface OperationMethods {
21383
22078
  * addContractByIdentifiers - addContractByIdentifiers
21384
22079
  *
21385
22080
  * Self-assign contract(s) by pre-configured identifiers.
21386
- *
21387
- * When the portal is configured to wait on the Integration Toolkit
21388
- * (`extension_hooks.contractIdentification.wait_for_toolkit`) and the ERP has not finished
21389
- * sending within the request budget, the call fails with 404 and `reason: TIMEOUT`, carrying
21390
- * the `correlation_id` of the triggered sync. Repeating the call with that `correlation_id`
21391
- * keeps waiting on the same correlation without calling the third party again.
21392
- *
21393
22081
  */
21394
22082
  'addContractByIdentifiers'(
21395
- parameters?: Parameters<Paths.AddContractByIdentifiers.QueryParameters> | null,
22083
+ parameters?: Parameters<UnknownParamsObject> | null,
21396
22084
  data?: Paths.AddContractByIdentifiers.RequestBody,
21397
22085
  config?: AxiosRequestConfig
21398
22086
  ): OperationResponse<Paths.AddContractByIdentifiers.Responses.$200>
@@ -21459,16 +22147,6 @@ export interface OperationMethods {
21459
22147
  data?: Paths.SaveEntityFile.RequestBody,
21460
22148
  config?: AxiosRequestConfig
21461
22149
  ): OperationResponse<Paths.SaveEntityFile.Responses.$201>
21462
- /**
21463
- * deleteEntityFile - deleteEntityFile
21464
- *
21465
- * Delete files from an entity
21466
- */
21467
- 'deleteEntityFile'(
21468
- parameters?: Parameters<UnknownParamsObject> | null,
21469
- data?: Paths.DeleteEntityFile.RequestBody,
21470
- config?: AxiosRequestConfig
21471
- ): OperationResponse<Paths.DeleteEntityFile.Responses.$202>
21472
22150
  /**
21473
22151
  * savePortalFiles - savePortalFiles
21474
22152
  *
@@ -21581,6 +22259,10 @@ export interface OperationMethods {
21581
22259
  * 2. Using domain
21582
22260
  * 3. Using origin (legacy)
21583
22261
  *
22262
+ * A partner user can log in as a portal user the vendor shared with their organization by sending
22263
+ * `x-epilot-org-id: <vendor org id>` with a `portal_id`. This needs `portal:login_as_user` on that portal in the
22264
+ * partner role and the portal user shared with the partner organization.
22265
+ *
21584
22266
  */
21585
22267
  'loginToPortalAsUser'(
21586
22268
  parameters?: Parameters<UnknownParamsObject> | null,
@@ -21696,7 +22378,7 @@ export interface OperationMethods {
21696
22378
  /**
21697
22379
  * getOutstandingTasks - Get outstanding workflow tasks for the portal user
21698
22380
  *
21699
- * Returns all outstanding workflow journey tasks for the authenticated portal user, across their opportunity, order and contract entities. Each task is an active workflow step that exposes a journey the customer still needs to fill out.
22381
+ * Returns all outstanding workflow journey tasks for the authenticated portal user, across their opportunity, order and contract entities. Each task is an active workflow step that exposes a journey the customer still needs to fill out. A step whose start date still lies in the future is left out until that date.
21700
22382
  */
21701
22383
  'getOutstandingTasks'(
21702
22384
  parameters?: Parameters<UnknownParamsObject> | null,
@@ -21917,6 +22599,28 @@ export interface OperationMethods {
21917
22599
  data?: any,
21918
22600
  config?: AxiosRequestConfig
21919
22601
  ): OperationResponse<Paths.DeletePortalPage.Responses.$204>
22602
+ /**
22603
+ * detachPortalPage - detachPortalPage
22604
+ *
22605
+ * Detach a blueprint-managed page from its blueprint. The page and all of its blocks become local (editable, no longer updated by the blueprint) and the page's lineage is tombstoned on the portal so future syncs skip it. One-way. Idempotent for pages that are not managed.
22606
+ *
22607
+ */
22608
+ 'detachPortalPage'(
22609
+ parameters?: Parameters<Paths.V2PortalPages$IdDetach.PathParameters> | null,
22610
+ data?: any,
22611
+ config?: AxiosRequestConfig
22612
+ ): OperationResponse<Paths.DetachPortalPage.Responses.$200>
22613
+ /**
22614
+ * detachPortalPageBlock - detachPortalPageBlock
22615
+ *
22616
+ * Detach a blueprint-managed block. The block becomes the customer's and its lineage is tombstoned on the page so future syncs skip it. A managed page stays managed and keeps receiving blueprint updates for everything else. One-way. Idempotent for blocks that are not managed.
22617
+ *
22618
+ */
22619
+ 'detachPortalPageBlock'(
22620
+ parameters?: Parameters<Paths.V2PortalPages$IdBlocks$BlockIdDetach.PathParameters> | null,
22621
+ data?: any,
22622
+ config?: AxiosRequestConfig
22623
+ ): OperationResponse<Paths.DetachPortalPageBlock.Responses.$200>
21920
22624
  /**
21921
22625
  * getPortalPages - getPortalPages
21922
22626
  *
@@ -22231,6 +22935,21 @@ export interface OperationMethods {
22231
22935
  data?: Paths.UpdatePortalRevision.RequestBody,
22232
22936
  config?: AxiosRequestConfig
22233
22937
  ): OperationResponse<Paths.UpdatePortalRevision.Responses.$200>
22938
+ /**
22939
+ * createPortalRevisionPreview - createPortalRevisionPreview
22940
+ *
22941
+ * Mints a short-lived preview token for one revision and returns a link that opens the revision inside the real end-customer portal, on the portal's live domain, without publishing it.
22942
+ *
22943
+ * The portal sends the token back in the `x-portal-preview-token` header. Public and portal-user config, page, widget and extension reads that honour it answer with the revision's config and pages instead of the live ones and add `preview_revision` to config responses. Server-owned fields (ids, domains, Cognito pool identifiers, extension secrets) always come from the live portal. Nothing is written: the live portal, its pages and which revision is published stay as they are.
22944
+ *
22945
+ * Requires view permission on the portal. Returns `404` when portal versioning or revision preview is not enabled for the organization, or when the revision does not exist.
22946
+ *
22947
+ */
22948
+ 'createPortalRevisionPreview'(
22949
+ parameters?: Parameters<Paths.CreatePortalRevisionPreview.PathParameters> | null,
22950
+ data?: any,
22951
+ config?: AxiosRequestConfig
22952
+ ): OperationResponse<Paths.CreatePortalRevisionPreview.Responses.$200>
22234
22953
  /**
22235
22954
  * publishPortalRevision - publishPortalRevision
22236
22955
  *
@@ -22790,8 +23509,8 @@ export interface PathsDictionary {
22790
23509
  * at `destination_template_id`. Intended to be called from the email-template
22791
23510
  * migration flow when a duplicated template is refined.
22792
23511
  *
22793
- * Only v3-shaped rows are migrated (those carrying `portal_sk_v3`). Returns
22794
- * the portal IDs that were rewritten and any whose update failed.
23512
+ * Rows are keyed by portal id (`portal_sk_v3`); a row without one is skipped.
23513
+ * Returns the portal IDs that were rewritten and any whose update failed.
22795
23514
  *
22796
23515
  */
22797
23516
  'post'(
@@ -23049,7 +23768,9 @@ export interface PathsDictionary {
23049
23768
  /**
23050
23769
  * updateContact - updateContact
23051
23770
  *
23052
- * Updates the contact details.
23771
+ * Updates the portal user's contact. Only the attributes in `PortalContactUpdate` can be changed;
23772
+ * other attributes are ignored. Returns 403 when the body has none of them.
23773
+ *
23053
23774
  */
23054
23775
  'patch'(
23055
23776
  parameters?: Parameters<UnknownParamsObject> | null,
@@ -23154,27 +23875,29 @@ export interface PathsDictionary {
23154
23875
  config?: AxiosRequestConfig
23155
23876
  ): OperationResponse<Paths.GetValidSecondaryAttributes.Responses.$200>
23156
23877
  }
23157
- ['/v2/portal/user']: {
23878
+ ['/v2/portal/copilot/access']: {
23158
23879
  /**
23159
- * getPortalUser - getPortalUser
23880
+ * getPortalCopilotAccess - getPortalCopilotAccess
23160
23881
  *
23161
- * Get the portal user details
23882
+ * Whether the signed-in portal user may use the portal chat. False when the chat is off for the portal, when the user does not match its target visibility, or when targets cannot be matched.
23162
23883
  */
23163
23884
  'get'(
23164
23885
  parameters?: Parameters<UnknownParamsObject> | null,
23165
23886
  data?: any,
23166
23887
  config?: AxiosRequestConfig
23167
- ): OperationResponse<Paths.GetPortalUser.Responses.$200>
23888
+ ): OperationResponse<Paths.GetPortalCopilotAccess.Responses.$200>
23889
+ }
23890
+ ['/v2/portal/user']: {
23168
23891
  /**
23169
- * updatePortalUser - updatePortalUser
23892
+ * getPortalUser - getPortalUser
23170
23893
  *
23171
- * Update the portal user details
23894
+ * Get the portal user details
23172
23895
  */
23173
- 'patch'(
23896
+ 'get'(
23174
23897
  parameters?: Parameters<UnknownParamsObject> | null,
23175
- data?: Paths.UpdatePortalUser.RequestBody,
23898
+ data?: any,
23176
23899
  config?: AxiosRequestConfig
23177
- ): OperationResponse<Paths.UpdatePortalUser.Responses.$200>
23900
+ ): OperationResponse<Paths.GetPortalUser.Responses.$200>
23178
23901
  /**
23179
23902
  * deletePortalUser - deletePortalUser
23180
23903
  *
@@ -23212,6 +23935,96 @@ export interface PathsDictionary {
23212
23935
  config?: AxiosRequestConfig
23213
23936
  ): OperationResponse<Paths.ChangePortalUserPassword.Responses.$200>
23214
23937
  }
23938
+ ['/v2/portal/user/notification-preferences']: {
23939
+ /**
23940
+ * getPortalUserNotificationPreferences - getPortalUserNotificationPreferences
23941
+ *
23942
+ * Returns the notification preferences of the authenticated portal user. Notifications follow an opt-out model: a preference that was never stored on the portal user defaults to enabled (true). Responds 404 while the engagement-center v2 feature is not enabled for the organization.
23943
+ */
23944
+ 'get'(
23945
+ parameters?: Parameters<UnknownParamsObject> | null,
23946
+ data?: any,
23947
+ config?: AxiosRequestConfig
23948
+ ): OperationResponse<Paths.GetPortalUserNotificationPreferences.Responses.$200>
23949
+ /**
23950
+ * updatePortalUserNotificationPreferences - updatePortalUserNotificationPreferences
23951
+ *
23952
+ * Partially updates the notification preferences of the authenticated portal user. Only the channels present in the request body are changed; omitted channels keep their stored value (or the enabled-by-default behaviour when never set). Returns the resulting full preferences. Responds 404 while the engagement-center v2 feature is not enabled for the organization.
23953
+ */
23954
+ 'put'(
23955
+ parameters?: Parameters<UnknownParamsObject> | null,
23956
+ data?: Paths.UpdatePortalUserNotificationPreferences.RequestBody,
23957
+ config?: AxiosRequestConfig
23958
+ ): OperationResponse<Paths.UpdatePortalUserNotificationPreferences.Responses.$200>
23959
+ }
23960
+ ['/v2/portal/user/passkeys']: {
23961
+ /**
23962
+ * listPortalUserPasskeys - listPortalUserPasskeys
23963
+ *
23964
+ * Lists the passkeys the logged-in portal user has added.
23965
+ */
23966
+ 'get'(
23967
+ parameters?: Parameters<UnknownParamsObject> | null,
23968
+ data?: any,
23969
+ config?: AxiosRequestConfig
23970
+ ): OperationResponse<Paths.ListPortalUserPasskeys.Responses.$200>
23971
+ /**
23972
+ * addPortalUserPasskey - addPortalUserPasskey
23973
+ *
23974
+ * Stores a new passkey for the logged-in portal user.
23975
+ * Send the browser's `navigator.credentials.create()` result for options from `createPortalUserPasskeyRegistrationOptions`.
23976
+ * Only available when `auth_settings.passkeys.enabled` is set for the portal.
23977
+ *
23978
+ */
23979
+ 'post'(
23980
+ parameters?: Parameters<UnknownParamsObject> | null,
23981
+ data?: Paths.AddPortalUserPasskey.RequestBody,
23982
+ config?: AxiosRequestConfig
23983
+ ): OperationResponse<Paths.AddPortalUserPasskey.Responses.$201>
23984
+ }
23985
+ ['/v2/portal/user/passkeys/registration-options']: {
23986
+ /**
23987
+ * createPortalUserPasskeyRegistrationOptions - createPortalUserPasskeyRegistrationOptions
23988
+ *
23989
+ * Returns WebAuthn options for `navigator.credentials.create()` to add a passkey for the logged-in portal user.
23990
+ * Needs the code from `sendPortalUserPasskeyVerificationCode`, so a session alone can't add a passkey; the code is used up here.
23991
+ * The passkey is bound to the domain in the request's `Origin` header, which must be one of the portal's domains.
23992
+ * Only available when `auth_settings.passkeys.enabled` is set for the portal.
23993
+ *
23994
+ */
23995
+ 'post'(
23996
+ parameters?: Parameters<UnknownParamsObject> | null,
23997
+ data?: Paths.CreatePortalUserPasskeyRegistrationOptions.RequestBody,
23998
+ config?: AxiosRequestConfig
23999
+ ): OperationResponse<Paths.CreatePortalUserPasskeyRegistrationOptions.Responses.$200>
24000
+ }
24001
+ ['/v2/portal/user/passkeys/verification-code']: {
24002
+ /**
24003
+ * sendPortalUserPasskeyVerificationCode - sendPortalUserPasskeyVerificationCode
24004
+ *
24005
+ * Emails the logged-in portal user a 6-digit code needed to add a passkey (`createPortalUserPasskeyRegistrationOptions`).
24006
+ * The code is valid for 10 minutes and allows 5 attempts; a new code replaces the previous one and can be requested once a minute.
24007
+ * Only available when `auth_settings.passkeys.enabled` is set for the portal.
24008
+ *
24009
+ */
24010
+ 'post'(
24011
+ parameters?: Parameters<UnknownParamsObject> | null,
24012
+ data?: any,
24013
+ config?: AxiosRequestConfig
24014
+ ): OperationResponse<Paths.SendPortalUserPasskeyVerificationCode.Responses.$204>
24015
+ }
24016
+ ['/v2/portal/user/passkeys/{credential_id}']: {
24017
+ /**
24018
+ * deletePortalUserPasskey - deletePortalUserPasskey
24019
+ *
24020
+ * Removes one of the logged-in portal user's passkeys. Works even when passkeys are turned off for the portal.
24021
+ */
24022
+ 'delete'(
24023
+ parameters?: Parameters<Paths.DeletePortalUserPasskey.PathParameters> | null,
24024
+ data?: any,
24025
+ config?: AxiosRequestConfig
24026
+ ): OperationResponse<Paths.DeletePortalUserPasskey.Responses.$204>
24027
+ }
23215
24028
  ['/v2/portal/user/resend/confirmation-email/{id}']: {
23216
24029
  /**
23217
24030
  * resendConfirmationEmail - resendConfirmationEmail
@@ -23359,16 +24172,6 @@ export interface PathsDictionary {
23359
24172
  data?: any,
23360
24173
  config?: AxiosRequestConfig
23361
24174
  ): OperationResponse<Paths.GetOrder.Responses.$200>
23362
- /**
23363
- * updateOrder - updateOrder
23364
- *
23365
- * Update an order by id. Use getPortalUserEntity instead.
23366
- */
23367
- 'patch'(
23368
- parameters?: Parameters<Paths.UpdateOrder.PathParameters> | null,
23369
- data?: Paths.UpdateOrder.RequestBody,
23370
- config?: AxiosRequestConfig
23371
- ): OperationResponse<Paths.UpdateOrder.Responses.$200>
23372
24175
  }
23373
24176
  ['/v2/portal/opportunity']: {
23374
24177
  /**
@@ -23417,16 +24220,6 @@ export interface PathsDictionary {
23417
24220
  data?: any,
23418
24221
  config?: AxiosRequestConfig
23419
24222
  ): OperationResponse<Paths.GetOpportunity.Responses.$200>
23420
- /**
23421
- * updateOpportunity - updateOpportunity
23422
- *
23423
- * Update an opportunity by id.
23424
- */
23425
- 'patch'(
23426
- parameters?: Parameters<Paths.UpdateOpportunity.PathParameters> | null,
23427
- data?: Paths.UpdateOpportunity.RequestBody,
23428
- config?: AxiosRequestConfig
23429
- ): OperationResponse<Paths.UpdateOpportunity.Responses.$200>
23430
24223
  }
23431
24224
  ['/v2/portal/request']: {
23432
24225
  /**
@@ -23466,7 +24259,9 @@ export interface PathsDictionary {
23466
24259
  /**
23467
24260
  * updateContract - updateContract
23468
24261
  *
23469
- * Update a contract by id. Use getPortalUserEntity instead.
24262
+ * Updates a contract of the portal user. Only the attributes in `PortalContractUpdate` can be changed;
24263
+ * other attributes are ignored. Returns 403 when the body has none of them.
24264
+ *
23470
24265
  */
23471
24266
  'patch'(
23472
24267
  parameters?: Parameters<Paths.UpdateContract.PathParameters> | null,
@@ -23491,16 +24286,9 @@ export interface PathsDictionary {
23491
24286
  * addContractByIdentifiers - addContractByIdentifiers
23492
24287
  *
23493
24288
  * Self-assign contract(s) by pre-configured identifiers.
23494
- *
23495
- * When the portal is configured to wait on the Integration Toolkit
23496
- * (`extension_hooks.contractIdentification.wait_for_toolkit`) and the ERP has not finished
23497
- * sending within the request budget, the call fails with 404 and `reason: TIMEOUT`, carrying
23498
- * the `correlation_id` of the triggered sync. Repeating the call with that `correlation_id`
23499
- * keeps waiting on the same correlation without calling the third party again.
23500
- *
23501
24289
  */
23502
24290
  'post'(
23503
- parameters?: Parameters<Paths.AddContractByIdentifiers.QueryParameters> | null,
24291
+ parameters?: Parameters<UnknownParamsObject> | null,
23504
24292
  data?: Paths.AddContractByIdentifiers.RequestBody,
23505
24293
  config?: AxiosRequestConfig
23506
24294
  ): OperationResponse<Paths.AddContractByIdentifiers.Responses.$200>
@@ -23579,16 +24367,6 @@ export interface PathsDictionary {
23579
24367
  data?: Paths.SaveEntityFile.RequestBody,
23580
24368
  config?: AxiosRequestConfig
23581
24369
  ): OperationResponse<Paths.SaveEntityFile.Responses.$201>
23582
- /**
23583
- * deleteEntityFile - deleteEntityFile
23584
- *
23585
- * Delete files from an entity
23586
- */
23587
- 'delete'(
23588
- parameters?: Parameters<UnknownParamsObject> | null,
23589
- data?: Paths.DeleteEntityFile.RequestBody,
23590
- config?: AxiosRequestConfig
23591
- ): OperationResponse<Paths.DeleteEntityFile.Responses.$202>
23592
24370
  }
23593
24371
  ['/v2/portal/portal/files']: {
23594
24372
  /**
@@ -23723,6 +24501,10 @@ export interface PathsDictionary {
23723
24501
  * 2. Using domain
23724
24502
  * 3. Using origin (legacy)
23725
24503
  *
24504
+ * A partner user can log in as a portal user the vendor shared with their organization by sending
24505
+ * `x-epilot-org-id: <vendor org id>` with a `portal_id`. This needs `portal:login_as_user` on that portal in the
24506
+ * partner role and the portal user shared with the partner organization.
24507
+ *
23726
24508
  */
23727
24509
  'post'(
23728
24510
  parameters?: Parameters<UnknownParamsObject> | null,
@@ -23860,7 +24642,7 @@ export interface PathsDictionary {
23860
24642
  /**
23861
24643
  * getOutstandingTasks - Get outstanding workflow tasks for the portal user
23862
24644
  *
23863
- * Returns all outstanding workflow journey tasks for the authenticated portal user, across their opportunity, order and contract entities. Each task is an active workflow step that exposes a journey the customer still needs to fill out.
24645
+ * Returns all outstanding workflow journey tasks for the authenticated portal user, across their opportunity, order and contract entities. Each task is an active workflow step that exposes a journey the customer still needs to fill out. A step whose start date still lies in the future is left out until that date.
23864
24646
  */
23865
24647
  'get'(
23866
24648
  parameters?: Parameters<UnknownParamsObject> | null,
@@ -24108,6 +24890,32 @@ export interface PathsDictionary {
24108
24890
  config?: AxiosRequestConfig
24109
24891
  ): OperationResponse<Paths.DeletePortalPage.Responses.$204>
24110
24892
  }
24893
+ ['/v2/portal/pages/{id}/detach']: {
24894
+ /**
24895
+ * detachPortalPage - detachPortalPage
24896
+ *
24897
+ * Detach a blueprint-managed page from its blueprint. The page and all of its blocks become local (editable, no longer updated by the blueprint) and the page's lineage is tombstoned on the portal so future syncs skip it. One-way. Idempotent for pages that are not managed.
24898
+ *
24899
+ */
24900
+ 'post'(
24901
+ parameters?: Parameters<Paths.V2PortalPages$IdDetach.PathParameters> | null,
24902
+ data?: any,
24903
+ config?: AxiosRequestConfig
24904
+ ): OperationResponse<Paths.DetachPortalPage.Responses.$200>
24905
+ }
24906
+ ['/v2/portal/pages/{id}/blocks/{block_id}/detach']: {
24907
+ /**
24908
+ * detachPortalPageBlock - detachPortalPageBlock
24909
+ *
24910
+ * Detach a blueprint-managed block. The block becomes the customer's and its lineage is tombstoned on the page so future syncs skip it. A managed page stays managed and keeps receiving blueprint updates for everything else. One-way. Idempotent for blocks that are not managed.
24911
+ *
24912
+ */
24913
+ 'post'(
24914
+ parameters?: Parameters<Paths.V2PortalPages$IdBlocks$BlockIdDetach.PathParameters> | null,
24915
+ data?: any,
24916
+ config?: AxiosRequestConfig
24917
+ ): OperationResponse<Paths.DetachPortalPageBlock.Responses.$200>
24918
+ }
24111
24919
  ['/v2/portal/pages']: {
24112
24920
  /**
24113
24921
  * getPortalPages - getPortalPages
@@ -24464,6 +25272,23 @@ export interface PathsDictionary {
24464
25272
  config?: AxiosRequestConfig
24465
25273
  ): OperationResponse<Paths.UpdatePortalRevision.Responses.$200>
24466
25274
  }
25275
+ ['/v3/portal/config/{portal_id}/revisions/{revision_id}:preview']: {
25276
+ /**
25277
+ * createPortalRevisionPreview - createPortalRevisionPreview
25278
+ *
25279
+ * Mints a short-lived preview token for one revision and returns a link that opens the revision inside the real end-customer portal, on the portal's live domain, without publishing it.
25280
+ *
25281
+ * The portal sends the token back in the `x-portal-preview-token` header. Public and portal-user config, page, widget and extension reads that honour it answer with the revision's config and pages instead of the live ones and add `preview_revision` to config responses. Server-owned fields (ids, domains, Cognito pool identifiers, extension secrets) always come from the live portal. Nothing is written: the live portal, its pages and which revision is published stay as they are.
25282
+ *
25283
+ * Requires view permission on the portal. Returns `404` when portal versioning or revision preview is not enabled for the organization, or when the revision does not exist.
25284
+ *
25285
+ */
25286
+ 'post'(
25287
+ parameters?: Parameters<Paths.CreatePortalRevisionPreview.PathParameters> | null,
25288
+ data?: any,
25289
+ config?: AxiosRequestConfig
25290
+ ): OperationResponse<Paths.CreatePortalRevisionPreview.Responses.$200>
25291
+ }
24467
25292
  ['/v3/portal/config/{portal_id}/publish']: {
24468
25293
  /**
24469
25294
  * publishPortalRevision - publishPortalRevision
@@ -24707,11 +25532,11 @@ export type CreateSupportRequest = Components.Schemas.CreateSupportRequest;
24707
25532
  export type CreateUserRequest = Components.Schemas.CreateUserRequest;
24708
25533
  export type Currency = Components.Schemas.Currency;
24709
25534
  export type DataRetrievalItem = Components.Schemas.DataRetrievalItem;
24710
- export type DeleteEntityFile = Components.Schemas.DeleteEntityFile;
24711
25535
  export type Direction = Components.Schemas.Direction;
24712
25536
  export type DocumentWidget = Components.Schemas.DocumentWidget;
24713
25537
  export type DomainSettings = Components.Schemas.DomainSettings;
24714
25538
  export type EmailTemplates = Components.Schemas.EmailTemplates;
25539
+ export type EngagementCenterTaskTemplates = Components.Schemas.EngagementCenterTaskTemplates;
24715
25540
  export type Entity = Components.Schemas.Entity;
24716
25541
  export type EntityEditRule = Components.Schemas.EntityEditRule;
24717
25542
  export type EntityFileCount = Components.Schemas.EntityFileCount;
@@ -24754,6 +25579,7 @@ export type File = Components.Schemas.File;
24754
25579
  export type FileItem = Components.Schemas.FileItem;
24755
25580
  export type FilePreviewResult = Components.Schemas.FilePreviewResult;
24756
25581
  export type Grant = Components.Schemas.Grant;
25582
+ export type HeldBackNode = Components.Schemas.HeldBackNode;
24757
25583
  export type IdentifierAttribute = Components.Schemas.IdentifierAttribute;
24758
25584
  export type InstallmentEvent = Components.Schemas.InstallmentEvent;
24759
25585
  export type JourneyActions = Components.Schemas.JourneyActions;
@@ -24763,6 +25589,7 @@ export type JuiceSettings = Components.Schemas.JuiceSettings;
24763
25589
  export type Meter = Components.Schemas.Meter;
24764
25590
  export type MeterChartWidget = Components.Schemas.MeterChartWidget;
24765
25591
  export type MeterReading = Components.Schemas.MeterReading;
25592
+ export type MeterReadingCounterDetails = Components.Schemas.MeterReadingCounterDetails;
24766
25593
  export type MeterReadingPhoto = Components.Schemas.MeterReadingPhoto;
24767
25594
  export type MeterReadingPhotoData = Components.Schemas.MeterReadingPhotoData;
24768
25595
  export type MeterReadingWidget = Components.Schemas.MeterReadingWidget;
@@ -24788,6 +25615,9 @@ export type PaymentWidget = Components.Schemas.PaymentWidget;
24788
25615
  export type PortalConfig = Components.Schemas.PortalConfig;
24789
25616
  export type PortalConfigSummaryV3 = Components.Schemas.PortalConfigSummaryV3;
24790
25617
  export type PortalConfigV3 = Components.Schemas.PortalConfigV3;
25618
+ export type PortalContactUpdate = Components.Schemas.PortalContactUpdate;
25619
+ export type PortalContractUpdate = Components.Schemas.PortalContractUpdate;
25620
+ export type PortalCopilotVisibility = Components.Schemas.PortalCopilotVisibility;
24791
25621
  export type PortalDataExportColumn = Components.Schemas.PortalDataExportColumn;
24792
25622
  export type PortalDescriptionOverrides = Components.Schemas.PortalDescriptionOverrides;
24793
25623
  export type PortalFeatureSettings = Components.Schemas.PortalFeatureSettings;
@@ -24797,6 +25627,7 @@ export type PortalNotification = Components.Schemas.PortalNotification;
24797
25627
  export type PortalRevision = Components.Schemas.PortalRevision;
24798
25628
  export type PortalRevisionCreated = Components.Schemas.PortalRevisionCreated;
24799
25629
  export type PortalRevisionList = Components.Schemas.PortalRevisionList;
25630
+ export type PortalRevisionPreview = Components.Schemas.PortalRevisionPreview;
24800
25631
  export type PortalRevisionRequest = Components.Schemas.PortalRevisionRequest;
24801
25632
  export type PortalRevisionSummary = Components.Schemas.PortalRevisionSummary;
24802
25633
  export type PortalSurface = Components.Schemas.PortalSurface;
@@ -24804,11 +25635,15 @@ export type PortalSurfaceDataAccess = Components.Schemas.PortalSurfaceDataAccess
24804
25635
  export type PortalSurfaceEntityAccess = Components.Schemas.PortalSurfaceEntityAccess;
24805
25636
  export type PortalTaskConfig = Components.Schemas.PortalTaskConfig;
24806
25637
  export type PortalUser = Components.Schemas.PortalUser;
25638
+ export type PortalUserNotificationPreferences = Components.Schemas.PortalUserNotificationPreferences;
25639
+ export type PortalUserPasskey = Components.Schemas.PortalUserPasskey;
24807
25640
  export type PortalUserRegistrationStatus = Components.Schemas.PortalUserRegistrationStatus;
25641
+ export type PortalUsingDesign = Components.Schemas.PortalUsingDesign;
24808
25642
  export type PortalWidget = Components.Schemas.PortalWidget;
24809
25643
  export type PortalWorkflow = Components.Schemas.PortalWorkflow;
24810
25644
  export type PortalWorkflowStage = Components.Schemas.PortalWorkflowStage;
24811
25645
  export type PortalWorkflowTask = Components.Schemas.PortalWorkflowTask;
25646
+ export type PreviewRevision = Components.Schemas.PreviewRevision;
24812
25647
  export type Product = Components.Schemas.Product;
24813
25648
  export type ProductRecommendationsWidget = Components.Schemas.ProductRecommendationsWidget;
24814
25649
  export type ProviderConfig = Components.Schemas.ProviderConfig;
@@ -24841,6 +25676,8 @@ export type Rule = Components.Schemas.Rule;
24841
25676
  export type SAMLProviderConfig = Components.Schemas.SAMLProviderConfig;
24842
25677
  export type SSOCallbackRequest = Components.Schemas.SSOCallbackRequest;
24843
25678
  export type SSOCallbackResponse = Components.Schemas.SSOCallbackResponse;
25679
+ export type SSODebugInfo = Components.Schemas.SSODebugInfo;
25680
+ export type SSOErrorResp = Components.Schemas.SSOErrorResp;
24844
25681
  export type SSOLoginToken = Components.Schemas.SSOLoginToken;
24845
25682
  export type SaveEntityFile = Components.Schemas.SaveEntityFile;
24846
25683
  export type SavePortalFile = Components.Schemas.SavePortalFile;
@@ -24868,7 +25705,6 @@ export type UserRequest = Components.Schemas.UserRequest;
24868
25705
  export type VisualizationDataRange = Components.Schemas.VisualizationDataRange;
24869
25706
  export type VisualizationMetadata = Components.Schemas.VisualizationMetadata;
24870
25707
  export type VisualizationTypeOption = Components.Schemas.VisualizationTypeOption;
24871
- export type WaitForEntityRule = Components.Schemas.WaitForEntityRule;
24872
25708
  export type WidgetAction = Components.Schemas.WidgetAction;
24873
25709
  export type WidgetBase = Components.Schemas.WidgetBase;
24874
25710
  export type WorfklowIdentifier = Components.Schemas.WorfklowIdentifier;