@epilot/customer-portal-client 0.49.0 → 0.50.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@epilot/customer-portal-client",
3
- "version": "0.49.0",
3
+ "version": "0.50.0",
4
4
  "description": "API Client for epilot portal API",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1488,6 +1488,13 @@
1488
1488
  "/v2/portal/contract/by-identifiers": {
1489
1489
  "post": {
1490
1490
  "operationId": "addContractByIdentifiers",
1491
+ "parameters": [
1492
+ {
1493
+ "in": "query",
1494
+ "name": "correlation_id",
1495
+ "required": false
1496
+ }
1497
+ ],
1491
1498
  "requestBody": {
1492
1499
  "required": true,
1493
1500
  "content": {
@@ -2944,6 +2951,16 @@
2944
2951
  "application/json": {}
2945
2952
  }
2946
2953
  },
2954
+ "ContractAssignmentNotFound": {
2955
+ "content": {
2956
+ "application/json": {}
2957
+ }
2958
+ },
2959
+ "ContactAmbiguousMatch": {
2960
+ "content": {
2961
+ "application/json": {}
2962
+ }
2963
+ },
2947
2964
  "NotFound": {
2948
2965
  "content": {
2949
2966
  "application/json": {}
package/src/openapi.json CHANGED
@@ -4011,6 +4011,17 @@
4011
4011
  "NOT_FOUND"
4012
4012
  ],
4013
4013
  "description": "Present only when exists is false. NOT_FOUND means the given identifiers did\nnot match any contact (definitive - the client should not retry). TIMEOUT\nmeans the contact was not found within the processing window but may still be\ningesting; the client may retry (ideally with trigger_identifiers_check=false).\n"
4014
+ },
4015
+ "correlation_id": {
4016
+ "type": "string",
4017
+ "minLength": 1,
4018
+ "maxLength": 255,
4019
+ "pattern": "^[A-Za-z0-9_-]+$",
4020
+ "description": "Correlation id of the triggered ERP sync. Present only for portals waiting on\nthe Integration Toolkit (`wait_for_toolkit`). Send it back with\n`trigger_identifiers_check: false` to keep waiting on the same correlation.\n"
4021
+ },
4022
+ "message": {
4023
+ "type": "string",
4024
+ "description": "Human-readable reason the identifiers did not resolve, when the portal knows\none. Set when the ERP finished sending for this correlation without the\nentities the portal needs (e.g. \"account data arrived, no contract\"), so\nsupport can tell a silent timeout from an incomplete delivery.\n"
4014
4025
  }
4015
4026
  }
4016
4027
  }
@@ -4023,6 +4034,9 @@
4023
4034
  "404": {
4024
4035
  "$ref": "#/components/responses/NotFound"
4025
4036
  },
4037
+ "409": {
4038
+ "$ref": "#/components/responses/ContactAmbiguousMatch"
4039
+ },
4026
4040
  "429": {
4027
4041
  "$ref": "#/components/responses/TooManyRequests"
4028
4042
  },
@@ -4074,7 +4088,7 @@
4074
4088
  },
4075
4089
  "responses": {
4076
4090
  "200": {
4077
- "description": "The identification result. On a match, `contact_id` and `token` are present. When no\ncontact matched, only `reason` is present - the response is deliberately shaped the same\nway for every negative outcome so it cannot be used to enumerate contacts.\n",
4091
+ "description": "The identification result. On a match, `contact_id` and `token` are present. When no\ncontact matched, only `reason` is present - the response is deliberately shaped the same\nway for every negative outcome so it cannot be used to enumerate contacts. The one\naddition is `correlation_id` on a TIMEOUT from a portal waiting on the Integration\nToolkit, which a retry needs; what the ERP did or did not send is never part of it.\nThat includes an ERP delivery of several matching contacts: unlike\n`checkContactExistsV3`, which answers it with 409 `AMBIGUOUS_MATCH`, this endpoint\nanswers it as `NOT_FOUND`, because the 409 would confirm that the ERP knows the\nidentifiers.\n",
4078
4092
  "content": {
4079
4093
  "application/json": {
4080
4094
  "schema": {
@@ -6262,7 +6276,7 @@
6262
6276
  "post": {
6263
6277
  "operationId": "addContractByIdentifiers",
6264
6278
  "summary": "addContractByIdentifiers",
6265
- "description": "Self-assign contract(s) by pre-configured identifiers.",
6279
+ "description": "Self-assign contract(s) by pre-configured identifiers.\n\nWhen the portal is configured to wait on the Integration Toolkit\n(`extension_hooks.contractIdentification.wait_for_toolkit`) and the ERP has not finished\nsending within the request budget, the call fails with 404 and `reason: TIMEOUT`, carrying\nthe `correlation_id` of the triggered sync. Repeating the call with that `correlation_id`\nkeeps waiting on the same correlation without calling the third party again.\n",
6266
6280
  "tags": [
6267
6281
  "ECP"
6268
6282
  ],
@@ -6271,6 +6285,20 @@
6271
6285
  "PortalAuth": []
6272
6286
  }
6273
6287
  ],
6288
+ "parameters": [
6289
+ {
6290
+ "in": "query",
6291
+ "name": "correlation_id",
6292
+ "required": false,
6293
+ "schema": {
6294
+ "type": "string",
6295
+ "minLength": 1,
6296
+ "maxLength": 255,
6297
+ "pattern": "^[A-Za-z0-9_-]+$"
6298
+ },
6299
+ "description": "Correlation id of an already triggered ERP sync, as returned by a previous call that\nfailed with `reason: TIMEOUT`. Keeps waiting on the same correlation instead of calling\nthe contract identification hook again. Ignored unless the portal is configured with\n`extension_hooks.contractIdentification.wait_for_toolkit`. At most 255 letters, digits,\nhyphens and underscores: the toolkit's bound for a correlation id and the charset it\nenforces on its identifiers.\n"
6300
+ }
6301
+ ],
6274
6302
  "requestBody": {
6275
6303
  "description": "Identifiers to search by. Have to be pre-configured in Portal Configuration Permissions.",
6276
6304
  "required": true,
@@ -6332,6 +6360,9 @@
6332
6360
  "403": {
6333
6361
  "$ref": "#/components/responses/Forbidden"
6334
6362
  },
6363
+ "404": {
6364
+ "$ref": "#/components/responses/ContractAssignmentNotFound"
6365
+ },
6335
6366
  "409": {
6336
6367
  "$ref": "#/components/responses/ContractAssignmentConflict"
6337
6368
  },
@@ -12198,13 +12229,31 @@
12198
12229
  },
12199
12230
  {
12200
12231
  "properties": {
12232
+ "status": {
12233
+ "type": "integer",
12234
+ "description": "The HTTP status code, repeated in the body.",
12235
+ "example": 409
12236
+ },
12237
+ "error": {
12238
+ "type": "string",
12239
+ "description": "Human-readable error message. For support, not for display to end customers."
12240
+ },
12201
12241
  "reason": {
12202
12242
  "type": "string",
12203
- "description": "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.",
12243
+ "description": "Reason why the contract is not assignable.\n- `DRAFT`: the contract is still a draft.\n- `MULTIPLE`: multiple contracts were found and the business logic does not allow it.\n- `SELF_ASSIGNMENT_DISABLED`: the contract already has a contact assigned and\n self-assignment is disabled.\n- `AMBIGUOUS_MATCH`: the portal waited on the Integration Toolkit and the ERP\n delivered entities it cannot tell apart (several matching the selector, or\n contracts naming different customers). Nothing was assigned, and retrying\n will not help.\n",
12204
12244
  "enum": [
12205
12245
  "DRAFT",
12206
- "MULTIPLE"
12246
+ "MULTIPLE",
12247
+ "SELF_ASSIGNMENT_DISABLED",
12248
+ "AMBIGUOUS_MATCH"
12207
12249
  ]
12250
+ },
12251
+ "correlation_id": {
12252
+ "type": "string",
12253
+ "minLength": 1,
12254
+ "maxLength": 255,
12255
+ "pattern": "^[A-Za-z0-9_-]+$",
12256
+ "description": "Correlation id of the ERP sync that was waited on. Present only with `AMBIGUOUS_MATCH`."
12208
12257
  }
12209
12258
  },
12210
12259
  "required": [
@@ -12216,6 +12265,84 @@
12216
12265
  }
12217
12266
  }
12218
12267
  },
12268
+ "ContractAssignmentNotFound": {
12269
+ "description": "No contract could be assigned. Without a `reason`, the identifiers matched nothing. With\n`reason`, the portal waited on the Integration Toolkit\n(`extension_hooks.contractIdentification.wait_for_toolkit`):\n- `TIMEOUT`: the ERP has not finished sending yet. Repeat the request with the\n `correlation_id` query parameter set to the `correlation_id` of this body to keep waiting\n on the same ERP sync without calling the third party again.\n- `INCOMPLETE`: the ERP finished sending without the data needed. Definitive; `error` names\n what was missing, for support, not for display to end customers.\n",
12270
+ "content": {
12271
+ "application/json": {
12272
+ "schema": {
12273
+ "type": "object",
12274
+ "properties": {
12275
+ "status": {
12276
+ "type": "integer",
12277
+ "description": "The HTTP status code, repeated in the body.",
12278
+ "example": 404
12279
+ },
12280
+ "error": {
12281
+ "type": "string",
12282
+ "description": "Human-readable error message. For support, not for display to end customers."
12283
+ },
12284
+ "reason": {
12285
+ "type": "string",
12286
+ "enum": [
12287
+ "TIMEOUT",
12288
+ "INCOMPLETE"
12289
+ ]
12290
+ },
12291
+ "correlation_id": {
12292
+ "type": "string",
12293
+ "minLength": 1,
12294
+ "maxLength": 255,
12295
+ "pattern": "^[A-Za-z0-9_-]+$",
12296
+ "description": "Correlation id of the ERP sync that was waited on. Present with `TIMEOUT` and `INCOMPLETE`."
12297
+ }
12298
+ },
12299
+ "required": [
12300
+ "status",
12301
+ "error"
12302
+ ]
12303
+ }
12304
+ }
12305
+ }
12306
+ },
12307
+ "ContactAmbiguousMatch": {
12308
+ "description": "The portal waited on the Integration Toolkit\n(`extension_hooks.registrationIdentifiersCheck.wait_for_toolkit`) and the ERP delivered\nseveral contacts matching the identifiers. Nothing was linked; retrying will not help.\n",
12309
+ "content": {
12310
+ "application/json": {
12311
+ "schema": {
12312
+ "type": "object",
12313
+ "properties": {
12314
+ "status": {
12315
+ "type": "integer",
12316
+ "description": "The HTTP status code, repeated in the body.",
12317
+ "example": 409
12318
+ },
12319
+ "error": {
12320
+ "type": "string",
12321
+ "description": "Human-readable error message. For support, not for display to end customers."
12322
+ },
12323
+ "reason": {
12324
+ "type": "string",
12325
+ "enum": [
12326
+ "AMBIGUOUS_MATCH"
12327
+ ]
12328
+ },
12329
+ "correlation_id": {
12330
+ "type": "string",
12331
+ "minLength": 1,
12332
+ "maxLength": 255,
12333
+ "pattern": "^[A-Za-z0-9_-]+$",
12334
+ "description": "Correlation id of the ERP sync that was waited on."
12335
+ }
12336
+ },
12337
+ "required": [
12338
+ "status",
12339
+ "error",
12340
+ "reason"
12341
+ ]
12342
+ }
12343
+ }
12344
+ }
12345
+ },
12219
12346
  "NotFound": {
12220
12347
  "description": "The specified resource was not found",
12221
12348
  "content": {
@@ -13591,15 +13718,6 @@
13591
13718
  }
13592
13719
  ]
13593
13720
  },
13594
- "self_assignment_mode": {
13595
- "type": "string",
13596
- "enum": [
13597
- "contracts",
13598
- "customer_to_portal_user"
13599
- ],
13600
- "default": "contracts",
13601
- "description": "What the built-in self-assignment (without a contractIdentification hook) assigns once the `contract_identifiers` match a Contract:\n - `contracts`: the user's Contact is added as a customer of the Contract.\n - `customer_to_portal_user`: the Contract's customers (Contacts and Accounts) are added to the Portal User's `represents`. The Portal User sees all their data, including Contracts, transitively. Mirrors the `contact_to_portal_user` assignment mode of the contractIdentification hook.\n"
13602
- },
13603
13721
  "contract_selector_config": {
13604
13722
  "type": "object",
13605
13723
  "description": "Configuration for contract selector in the portal",
@@ -14338,6 +14456,14 @@
14338
14456
  "type": "boolean",
14339
14457
  "default": true,
14340
14458
  "description": "Whether to (re)trigger the registration identifiers check hook, which issues a request\nto the connected ERP to (re)sync the contact, in addition to waiting for the entity to\narrive. Defaults to true to preserve existing behaviour. Set to false on retry attempts\nto only poll for an already-triggered sync to land, without issuing another upstream\nrequest to the ERP.\n"
14459
+ },
14460
+ "correlation_id": {
14461
+ "type": "string",
14462
+ "minLength": 1,
14463
+ "maxLength": 255,
14464
+ "pattern": "^[A-Za-z0-9_-]+$",
14465
+ "description": "Correlation id of an already triggered ERP sync, as returned by a previous call that\nanswered `reason: TIMEOUT`. Sent together with `trigger_identifiers_check: false` on a\nretry so the portal keeps waiting on the same correlation instead of starting over.\nOnly used by portals configured with\n`extension_hooks.registrationIdentifiersCheck.wait_for_toolkit`; ignored otherwise.\nAt most 255 letters, digits, hyphens and underscores: the toolkit's bound for a\ncorrelation id and the charset it enforces on its identifiers.\n",
14466
+ "example": "0199c0d5-6f1c-7a3b-9e21-9a9ce1d1b2c3"
14341
14467
  }
14342
14468
  }
14343
14469
  },
@@ -14416,6 +14542,13 @@
14416
14542
  "NOT_FOUND"
14417
14543
  ],
14418
14544
  "description": "Present only when no token was issued. NOT_FOUND means the given identifiers did not\nmatch any contact (definitive - the client should not retry). TIMEOUT means the contact\nwas not found within the processing window but may still be ingesting; the client may\nretry (ideally with trigger_identifiers_check=false).\n"
14545
+ },
14546
+ "correlation_id": {
14547
+ "type": "string",
14548
+ "minLength": 1,
14549
+ "maxLength": 255,
14550
+ "pattern": "^[A-Za-z0-9_-]+$",
14551
+ "description": "Correlation id of the triggered ERP sync. Present only with `reason: TIMEOUT`, for\nportals waiting on the Integration Toolkit (`wait_for_toolkit`). Send it back with\n`trigger_identifiers_check: false` to keep waiting on the same correlation.\n"
14419
14552
  }
14420
14553
  }
14421
14554
  },
@@ -17494,6 +17627,36 @@
17494
17627
  "hook_id": {
17495
17628
  "type": "string",
17496
17629
  "description": "The ID of the selected hook."
17630
+ },
17631
+ "wait_for_toolkit": {
17632
+ "type": "boolean",
17633
+ "default": false,
17634
+ "description": "Opt in to waiting on the Integration Toolkit instead of polling entity search for the\ndata the ERP pushes after the hook returns. When true, the portal hands the hook a\ncorrelation id (`{{CorrelationId}}`) and then asks the toolkit whether the entities it\nneeds have landed under that correlation. Off by default: a portal that does not set it\nkeeps polling entity search exactly as before.\n\nOnly effective for hooks whose partner pushes through the Integration Toolkit and\nechoes the correlation id. A hook that answers with an epilot contact id is fetched\ndirectly, as today, whatever this flag says.\n"
17635
+ },
17636
+ "wait_for_entities": {
17637
+ "type": "object",
17638
+ "description": "The entities the portal waits for, keyed by entity slug. Configured explicitly per\nhook: nothing is derived from the hook type or from the portal's identifier\nconfiguration, and a hook that configures no requirement for the entity the portal\nlinks does not wait at all - it keeps polling entity search exactly as before.\n\nA selector may only name an attribute that is literally a member of that entity\ntarget's configured `unique_ids` in the inbound use case, because the toolkit reports\nexactly those and nothing else. A selector on any other attribute can never match. A\ntoolkit that validates selectors rejects such a wait (400) with the slug, the key and\nthe keys it accepts; the portal logs that at error level with the hook it came from\nand polls entity search for the request, so the customer is unaffected and never told.\n\nThe slug the portal resolves its link target from is fixed by the hook, and a\nrequirement for it must be configured for the wait to happen at all:\n`registrationIdentifiersCheck` resolves the contact, every `contractIdentification`\nassignment mode resolves the contract (in the contact modes the linked contact is the\ndelivered contract's `customer`). Every other configured slug is evidence that the push\ncarried what it promised, and is never linked.\n\nIgnored unless `wait_for_toolkit` is true.\n\nWorked examples, verified against the live integration configuration. Each block is the\n`wait_for_entities` of one hook selection, and each names the slug that hook links.\n\nRatingen / Wilken add-contract hook (`contractIdentification`, `contact_to_portal_user`).\nNo value the user types is a unique id anywhere in the org - every one is a Wilken\nsurrogate `external_id` - so the contact cannot be selected by attribute at all. Wait on\nthe contract and link its `customer`; the identity-keyed contact is evidence that the\nbusiness partner landed, and is never linked.\n\n```yaml\ncontract: {}\ncontact:\n key: external_id # the PROFILE contact's unique id is external_id\n from_caller_contact: external_id\n```\n\nWEMAG registration hook (`registrationIdentifiersCheck`). The contact's unique ids are\n`customer_pin` and `reenumber`; `meter.external_id` and `meter.meter_number` are both\nthe `ZNR` the user types.\n\n```yaml\ncontact:\n key: reenumber\n from_identifier: contact.complete_customer_number\n split_on: \"-\" # \"0002-<customer_pin>-<reenumber>\"\n part: 2\nmeter:\n key: external_id\n from_identifier: meter.meter_number\n```\n\nWEMAG add-contract hook (`contractIdentification`, `contact_to_portal_user`). The\ncontract's unique ids are `billing_account_number` (the `reenumber`, the same third\npart of `complete_customer_number`) and `customer_number` (the PIN). Wait on the\ncontract of the typed Rechnungseinheit and link its `customer`.\n\n```yaml\ncontract:\n key: billing_account_number\n from_identifier: contact.complete_customer_number\n split_on: \"-\" # \"0002-<customer_pin>-<reenumber>\"\n part: 2\nmeter:\n key: external_id\n from_identifier: meter.meter_number\n```\n\nNever `complete_customer_number` or `customer_number` on a WEMAG contact - neither is a\nunique id there - and never `customer_pin` alone on a contact or `customer_number` alone\non a contract, both of which are the PIN and ambiguous, because one person has one\ncontact and one contract per Rechnungseinheit. Never a key-less `contract` either: WEMAG's\n`EKM Anlagedaten` writes contracts of its own, keyed on `contract_number`.\n",
17639
+ "additionalProperties": {
17640
+ "$ref": "#/components/schemas/WaitForEntityRule"
17641
+ },
17642
+ "example": {
17643
+ "contract": {},
17644
+ "contact": {
17645
+ "key": "external_id",
17646
+ "from_caller_contact": "external_id"
17647
+ }
17648
+ }
17649
+ },
17650
+ "wait_for_use_cases": {
17651
+ "type": "array",
17652
+ "description": "Inbound use case slugs the portal additionally waits for. A requirement is met once at\nleast one event of that use case slug has finished processing, whether or not it\nproduced an entity, so it covers pushes whose entity set varies and pushes whose\noutcome is a file or a relation rather than an entity.\n\nEntity requirements stay primary - the portal links by entity id, so it always waits\nfor the entity it links. Use case slugs are an additional bar: when both are\nconfigured, both must be met. Empty by default. Ignored unless `wait_for_toolkit` is\ntrue.\n",
17653
+ "items": {
17654
+ "type": "string"
17655
+ },
17656
+ "default": [],
17657
+ "example": [
17658
+ "wilken_contract_changed"
17659
+ ]
17497
17660
  }
17498
17661
  },
17499
17662
  "required": [
@@ -17502,6 +17665,39 @@
17502
17665
  "hook_id"
17503
17666
  ]
17504
17667
  },
17668
+ "WaitForEntityRule": {
17669
+ "type": "object",
17670
+ "description": "One requirement of a hook's correlation wait, for the entity slug it is configured under.\n\nWithout `key` the requirement is satisfied by any entity of that slug. That is safe for\nevidence, and for a linked slug only where the inbound use case writes exactly one entity\nof it per push - Wilken's `BusinessPartnerChanged` always writes two contacts, and WEMAG's\n`DocumentChange` / `D3Metadata` write contacts under the same unique-id keys a registration\npush uses - so a second match answers 409 rather than linking a guess.\n\nWith `key`, the value comes from exactly one declared source, `from_identifier` or\n`from_caller_contact`. A rule whose source has no value produces no wait at all, so the\nhook keeps polling rather than waiting on a requirement that cannot be met.\n",
17671
+ "properties": {
17672
+ "key": {
17673
+ "type": "string",
17674
+ "description": "Unique-id attribute the selector matches on. Must be a member of that entity target's\nconfigured `unique_ids` in the inbound use case; the toolkit reports nothing else.\n",
17675
+ "example": "reenumber"
17676
+ },
17677
+ "from_identifier": {
17678
+ "type": "string",
17679
+ "description": "Identifier the user submitted to take the value from, as `<schema>.<name>` - the same\nschema and name the portal's `registration_identifiers` / `contract_identifiers` use.\nMutually exclusive with `from_caller_contact`.\n",
17680
+ "example": "contact.complete_customer_number"
17681
+ },
17682
+ "from_caller_contact": {
17683
+ "type": "string",
17684
+ "description": "Attribute of the calling portal user's own contact to take the value from. Only\navailable to hooks called by a signed-in user. Mutually exclusive with\n`from_identifier`.\n",
17685
+ "example": "external_id"
17686
+ },
17687
+ "split_on": {
17688
+ "type": "string",
17689
+ "description": "Separator the source value is split on before `part` is taken, for identifiers that\ncarry a unique id inside a larger value the user types. WEMAG's\n`complete_customer_number` is `\"0002-<customer_pin>-<reenumber>\"`, so splitting on `-`\nand taking part 2 yields the contact's `reenumber` unique id.\n",
17690
+ "example": "-"
17691
+ },
17692
+ "part": {
17693
+ "type": "integer",
17694
+ "minimum": 0,
17695
+ "default": 0,
17696
+ "description": "Zero-based index of the part to use after splitting on `split_on`.",
17697
+ "example": 2
17698
+ }
17699
+ }
17700
+ },
17505
17701
  "PublicExtensionCapabilities": {
17506
17702
  "type": "object",
17507
17703
  "properties": {
@@ -18240,6 +18436,10 @@
18240
18436
  "type": "string",
18241
18437
  "deprecated": true,
18242
18438
  "description": "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."
18439
+ },
18440
+ "result_correlation_id": {
18441
+ "type": "string",
18442
+ "description": "Correlation id to wait for inbound ERP events under, resolved from the third-party\nresponse, e.g. `{{CallResponse.data.acknowledgeId}}`. Only read when the portal is\nconfigured to wait on the Integration Toolkit\n(`extension_hooks.<hook>.wait_for_toolkit`).\n\nThere is no default: unless a hook declares this, the portal waits on the id it\nminted and handed the hook as `{{CorrelationId}}`, whatever the response carries. A\npartner that pushes under that id leaves this unset; only a partner that pushes\nunder an id of its own declares where the response carries it. A declared id that\nis absent from the response falls back to the minted one; one that is not a valid\ncorrelation id (at most 255 letters, digits, `-` and `_`) is not waited on, and\nthe portal polls entity search instead.\n"
18243
18443
  }
18244
18444
  },
18245
18445
  "required": [
@@ -18254,6 +18454,10 @@
18254
18454
  "type": "string",
18255
18455
  "description": "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`."
18256
18456
  },
18457
+ "result_correlation_id": {
18458
+ "type": "string",
18459
+ "description": "Correlation id to wait for inbound ERP events under, resolved from the third-party\nresponse, e.g. `{{CallResponse.data.acknowledgeId}}`. Supersedes\n`call.result_correlation_id`. No default; see `call.result_correlation_id`.\n"
18460
+ },
18257
18461
  "error_message_path": {
18258
18462
  "type": "string",
18259
18463
  "description": "Optional path to a human-readable error message in the third-party response body, used when the call fails (non-2xx status).\nIf specified and the path resolves to a string, that message is forwarded to the end user instead of a generic error.\n",
@@ -18325,6 +18529,10 @@
18325
18529
  "type": "string",
18326
18530
  "deprecated": true,
18327
18531
  "description": "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."
18532
+ },
18533
+ "result_correlation_id": {
18534
+ "type": "string",
18535
+ "description": "Correlation id to wait for inbound ERP events under, resolved from the third-party\nresponse, e.g. `{{CallResponse.data.acknowledgeId}}`. Only read when the portal is\nconfigured to wait on the Integration Toolkit\n(`extension_hooks.<hook>.wait_for_toolkit`).\n\nThere is no default: unless a hook declares this, the portal waits on the id it\nminted and handed the hook as `{{CorrelationId}}`, whatever the response carries. A\npartner that pushes under that id leaves this unset; only a partner that pushes\nunder an id of its own declares where the response carries it. A declared id that\nis absent from the response falls back to the minted one; one that is not a valid\ncorrelation id (at most 255 letters, digits, `-` and `_`) is not waited on, and\nthe portal polls entity search instead.\n"
18328
18536
  }
18329
18537
  },
18330
18538
  "required": [
@@ -18339,6 +18547,10 @@
18339
18547
  "type": "string",
18340
18548
  "description": "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`."
18341
18549
  },
18550
+ "result_correlation_id": {
18551
+ "type": "string",
18552
+ "description": "Correlation id to wait for inbound ERP events under, resolved from the third-party\nresponse, e.g. `{{CallResponse.data.acknowledgeId}}`. Supersedes\n`call.result_correlation_id`. No default; see `call.result_correlation_id`.\n"
18553
+ },
18342
18554
  "error_message_path": {
18343
18555
  "type": "string",
18344
18556
  "description": "Optional path to a human-readable error message in the third-party response body, used when the call fails (non-2xx status).\nIf specified and the path resolves to a string, that message is forwarded to the end user instead of a generic error.\n",
@@ -20690,15 +20902,6 @@
20690
20902
  }
20691
20903
  ]
20692
20904
  },
20693
- "self_assignment_mode": {
20694
- "type": "string",
20695
- "enum": [
20696
- "contracts",
20697
- "customer_to_portal_user"
20698
- ],
20699
- "default": "contracts",
20700
- "description": "What the built-in self-assignment (without a contractIdentification hook) assigns once the `contract_identifiers` match a Contract:\n - `contracts`: the user's Contact is added as a customer of the Contract.\n - `customer_to_portal_user`: the Contract's customers (Contacts and Accounts) are added to the Portal User's `represents`. The Portal User sees all their data, including Contracts, transitively. Mirrors the `contact_to_portal_user` assignment mode of the contractIdentification hook.\n"
20701
- },
20702
20905
  "contract_selector_config": {
20703
20906
  "type": "object",
20704
20907
  "description": "Configuration for contract selector in the portal",
@@ -21145,29 +21348,6 @@
21145
21348
  }
21146
21349
  }
21147
21350
  },
21148
- "PortalUsingDesign": {
21149
- "type": "object",
21150
- "description": "A portal whose design_id is the design asked about.",
21151
- "required": [
21152
- "portal_id"
21153
- ],
21154
- "properties": {
21155
- "portal_id": {
21156
- "$ref": "#/components/schemas/PortalId"
21157
- },
21158
- "name": {
21159
- "type": "string",
21160
- "example": "Kundenportal"
21161
- },
21162
- "origin": {
21163
- "$ref": "#/components/schemas/Origin"
21164
- },
21165
- "design_id": {
21166
- "type": "string",
21167
- "example": "9ba94f20-b872-11ed-b30a-b3e3bf2dc8ab"
21168
- }
21169
- }
21170
- },
21171
21351
  "PortalConfigSummaryV3": {
21172
21352
  "type": "object",
21173
21353
  "description": "Lightweight view of a portal config for lists and pickers. Carries the identifying,\ndisplay and registration fields only. Pages, email templates, grants, feature flags,\nidentity providers and certificate details are left out; read them per portal with\n`getPortalConfigV3`.\n",
@@ -21357,12 +21537,6 @@
21357
21537
  "design_id": {
21358
21538
  "type": "string",
21359
21539
  "description": "Design of the portal, used to preload it from the served document"
21360
- },
21361
- "design": {
21362
- "type": "object",
21363
- "additionalProperties": true,
21364
- "nullable": true,
21365
- "description": "The portal design as returned by design-builder parse (theme=NEW), for the served document; absent when the design could not be read"
21366
21540
  }
21367
21541
  }
21368
21542
  },