@hyperscale0/udl 1.0.0-beta.1 → 1.0.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/CHANGELOG.md +78 -25
- package/README.md +37 -99
- package/conformance/README.md +44 -41
- package/conformance/evolution/action-contract.expected.json +10 -0
- package/conformance/evolution/action-contract.live.udl +44 -0
- package/conformance/evolution/action-contract.next.udl +45 -0
- package/conformance/evolution/product-identity.expected.json +10 -0
- package/conformance/evolution/product-identity.live.udl +55 -0
- package/conformance/evolution/product-identity.next.udl +55 -0
- package/conformance/evolution/version-required.expected.json +10 -0
- package/conformance/evolution/version-required.live.udl +55 -0
- package/conformance/evolution/version-required.next.udl +58 -0
- package/conformance/invalid/action-without-transition.expected.json +10 -0
- package/conformance/invalid/{verb-without-transition.udl → action-without-transition.udl} +7 -2
- package/conformance/invalid/agent-description-too-long.expected.json +10 -0
- package/conformance/invalid/agent-description-too-long.udl +57 -0
- package/conformance/invalid/blank-title.expected.json +1 -1
- package/conformance/invalid/blank-title.udl +6 -2
- package/conformance/invalid/composition-dial-duplicate-key.expected.json +10 -0
- package/conformance/invalid/composition-dial-duplicate-key.udl +73 -0
- package/conformance/invalid/depth-budget.expected.json +1 -1
- package/conformance/invalid/duplicate-subject.expected.json +10 -0
- package/conformance/invalid/duplicate-subject.udl +230 -0
- package/conformance/invalid/forged-effects.expected.json +10 -0
- package/conformance/invalid/forged-effects.udl +76 -0
- package/conformance/invalid/format-version.expected.json +1 -1
- package/conformance/invalid/format-version.udl +6 -2
- package/conformance/invalid/instrument-id-not-snake-case.expected.json +10 -0
- package/conformance/invalid/{noun-id-not-snake-case.udl → instrument-id-not-snake-case.udl} +6 -2
- package/conformance/invalid/invalid-aggregate-gate-shape.expected.json +10 -0
- package/conformance/invalid/invalid-aggregate-gate-shape.udl +1819 -0
- package/conformance/invalid/invalid-check-duration.expected.json +10 -0
- package/conformance/invalid/invalid-check-duration.udl +219 -0
- package/conformance/invalid/invalid-dial-anchor.expected.json +10 -0
- package/conformance/invalid/invalid-dial-anchor.udl +219 -0
- package/conformance/invalid/invalid-exception-parent-ref.expected.json +10 -0
- package/conformance/invalid/invalid-exception-parent-ref.udl +2487 -0
- package/conformance/invalid/invalid-exposure-shape.expected.json +10 -0
- package/conformance/invalid/invalid-exposure-shape.udl +1819 -0
- package/conformance/invalid/invalid-remainder.expected.json +10 -0
- package/conformance/invalid/invalid-remainder.udl +220 -0
- package/conformance/invalid/invalid-schema-keyword.expected.json +10 -0
- package/conformance/invalid/invalid-schema-keyword.udl +220 -0
- package/conformance/invalid/invalid-utf8.expected.json +1 -1
- package/conformance/invalid/malformed-json.expected.json +1 -1
- package/conformance/invalid/missing-create-action.expected.json +10 -0
- package/conformance/invalid/{missing-create-verb.udl → missing-create-action.udl} +5 -2
- package/conformance/invalid/missing-exception-amount-field.expected.json +10 -0
- package/conformance/invalid/missing-exception-amount-field.udl +2487 -0
- package/conformance/invalid/missing-exception-contract.expected.json +14 -0
- package/conformance/invalid/missing-exception-contract.udl +2523 -0
- package/conformance/invalid/missing-exception-reason-field.expected.json +10 -0
- package/conformance/invalid/missing-exception-reason-field.udl +2487 -0
- package/conformance/invalid/not-an-object.expected.json +1 -1
- package/conformance/invalid/payout-reconcile-not-a-bank-debit.expected.json +10 -0
- package/conformance/invalid/payout-reconcile-not-a-bank-debit.udl +259 -0
- package/conformance/invalid/quote-freeze-set-incomplete.expected.json +10 -0
- package/conformance/invalid/quote-freeze-set-incomplete.udl +261 -0
- package/conformance/invalid/quote-named-reference-gate.expected.json +10 -0
- package/conformance/invalid/quote-named-reference-gate.udl +50 -0
- package/conformance/invalid/reconcile-named-reference-gate.expected.json +10 -0
- package/conformance/invalid/reconcile-named-reference-gate.udl +50 -0
- package/conformance/invalid/unknown-key.expected.json +1 -1
- package/conformance/invalid/unknown-key.udl +6 -2
- package/conformance/invalid/unknown-reference-gate-field.expected.json +10 -0
- package/conformance/invalid/unknown-reference-gate-field.udl +1819 -0
- package/conformance/invalid/unknown-required-field.expected.json +10 -0
- package/conformance/invalid/unknown-required-field.udl +220 -0
- package/conformance/invalid/unreachable-state.expected.json +2 -2
- package/conformance/invalid/unreachable-state.udl +6 -2
- package/conformance/invalid/wrong-exception-amount-field.expected.json +10 -0
- package/conformance/invalid/wrong-exception-amount-field.udl +2487 -0
- package/conformance/invalid/wrong-exception-reason-field.expected.json +10 -0
- package/conformance/invalid/wrong-exception-reason-field.udl +2487 -0
- package/conformance/valid/agent-description.expected.json +6 -0
- package/conformance/valid/agent-description.udl +66 -0
- package/conformance/valid/cards.expected.json +1 -0
- package/conformance/valid/cards.udl +843 -356
- package/conformance/valid/commerce-escrow.expected.json +1 -0
- package/conformance/valid/commerce-escrow.udl +792 -291
- package/conformance/valid/compiled-crowdfunding.expected.json +6 -0
- package/conformance/valid/compiled-crowdfunding.udl +1843 -0
- package/conformance/valid/compiled-watch-club.expected.json +6 -0
- package/conformance/valid/compiled-watch-club.udl +2486 -0
- package/conformance/valid/complete-contract.expected.json +6 -0
- package/conformance/valid/complete-contract.udl +218 -0
- package/conformance/valid/effect-signatures.expected.json +6 -0
- package/conformance/valid/effect-signatures.udl +75 -0
- package/conformance/valid/hand-edited.expected.json +1 -0
- package/conformance/valid/hand-edited.udl +1 -1
- package/conformance/valid/insured-car-marketplace.expected.json +1 -0
- package/conformance/valid/insured-car-marketplace.udl +534 -315
- package/conformance/valid/insured-travel.expected.json +2 -1
- package/conformance/valid/insured-travel.udl +1489 -641
- package/conformance/valid/minimal.expected.json +1 -0
- package/conformance/valid/minimal.udl +18 -14
- package/conformance/valid/protection.expected.json +1 -0
- package/conformance/valid/protection.udl +719 -304
- package/conformance/valid/string-escaping.expected.json +6 -0
- package/conformance/valid/string-escaping.udl +54 -0
- package/dist/canonical.d.ts +2 -0
- package/dist/canonical.d.ts.map +1 -1
- package/dist/canonical.js +7 -0
- package/dist/canonical.js.map +1 -1
- package/dist/check-profiles.d.ts +57 -0
- package/dist/check-profiles.d.ts.map +1 -0
- package/dist/check-profiles.js +62 -0
- package/dist/check-profiles.js.map +1 -0
- package/dist/cli.js +48 -4
- package/dist/cli.js.map +1 -1
- package/dist/diagnostics.d.ts +168 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +164 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/effects.d.ts +41 -0
- package/dist/effects.d.ts.map +1 -0
- package/dist/effects.js +110 -0
- package/dist/effects.js.map +1 -0
- package/dist/evolution.d.ts +51 -18
- package/dist/evolution.d.ts.map +1 -1
- package/dist/evolution.js +244 -102
- package/dist/evolution.js.map +1 -1
- package/dist/finance.d.ts +17 -13
- package/dist/finance.d.ts.map +1 -1
- package/dist/finance.js +165 -109
- package/dist/finance.js.map +1 -1
- package/dist/index.d.ts +12 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -5
- package/dist/index.js.map +1 -1
- package/dist/limits.d.ts +2 -2
- package/dist/limits.d.ts.map +1 -1
- package/dist/limits.js +4 -3
- package/dist/limits.js.map +1 -1
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +6 -16
- package/dist/parser.js.map +1 -1
- package/dist/schema.d.ts +2059 -135
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +759 -73
- package/dist/schema.js.map +1 -1
- package/dist/validation.d.ts +22 -9
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +1463 -457
- package/dist/validation.js.map +1 -1
- package/docs/README.md +14 -0
- package/docs/guide/01-a-document.md +37 -0
- package/docs/guide/02-money-steps.md +23 -0
- package/docs/guide/03-laws.md +18 -0
- package/docs/guide/04-fees-and-remainder.md +15 -0
- package/docs/guide/05-checks-updates-dials.md +7 -0
- package/docs/guide/06-effects.md +11 -0
- package/docs/guide/07-evolution.md +11 -0
- package/docs/guide/08-implementing.md +13 -0
- package/docs/llms-full.txt +1241 -0
- package/docs/llms.txt +14 -0
- package/docs/reference/canonical.md +16 -0
- package/docs/reference/clauses.md +986 -0
- package/docs/reference/cli.md +22 -0
- package/docs/reference/diagnostics.md +32 -0
- package/package.json +6 -2
- package/skills/udl/SKILL.md +28 -0
- package/spec/README.md +82 -51
- package/spec/udl.schema.json +1191 -119
- package/src/canonical.ts +11 -0
- package/src/check-profiles.ts +80 -0
- package/src/cli.ts +49 -3
- package/src/diagnostics.ts +221 -0
- package/src/effects.ts +163 -0
- package/src/evolution.ts +375 -125
- package/src/finance.ts +255 -160
- package/src/index.ts +50 -14
- package/src/limits.ts +4 -3
- package/src/parser.ts +15 -18
- package/src/schema.ts +855 -81
- package/src/validation.ts +2666 -560
- package/conformance/invalid/missing-create-verb.expected.json +0 -10
- package/conformance/invalid/noun-id-not-snake-case.expected.json +0 -10
- package/conformance/invalid/verb-without-transition.expected.json +0 -10
|
@@ -1,200 +1,40 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
2
|
+
"instruments": [
|
|
3
3
|
{
|
|
4
|
-
"
|
|
5
|
-
|
|
6
|
-
"
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
"
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
},
|
|
18
|
-
"departsAt": {
|
|
19
|
-
"format": "hyperscale-date-time",
|
|
20
|
-
"type": "string"
|
|
21
|
-
},
|
|
22
|
-
"fareAmount": {
|
|
23
|
-
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
24
|
-
"pattern": "^[1-9][0-9]{0,17}$",
|
|
25
|
-
"type": "string"
|
|
26
|
-
},
|
|
27
|
-
"holdExpiresAt": {
|
|
28
|
-
"format": "hyperscale-date-time",
|
|
29
|
-
"type": "string"
|
|
30
|
-
},
|
|
31
|
-
"operatorAccountId": {
|
|
32
|
-
"description": "Hyperscale account ID",
|
|
33
|
-
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
34
|
-
"type": "string",
|
|
35
|
-
"x-hyperscale-reference-filter": {
|
|
36
|
-
"column": "role",
|
|
37
|
-
"values": [
|
|
38
|
-
"customer_balance"
|
|
39
|
-
]
|
|
40
|
-
}
|
|
41
|
-
},
|
|
42
|
-
"travelPackageId": {
|
|
43
|
-
"description": "Travel package this booking is a leg of",
|
|
44
|
-
"pattern": "^tpkg_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
45
|
-
"type": "string"
|
|
46
|
-
},
|
|
47
|
-
"travelerAccountId": {
|
|
48
|
-
"description": "Hyperscale account ID",
|
|
49
|
-
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
50
|
-
"type": "string",
|
|
51
|
-
"x-hyperscale-reference-filter": {
|
|
52
|
-
"column": "role",
|
|
53
|
-
"values": [
|
|
54
|
-
"customer_balance"
|
|
55
|
-
]
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
},
|
|
59
|
-
"id": "flight_booking",
|
|
60
|
-
"idPrefix": "fbkg",
|
|
61
|
-
"lifecycle": {
|
|
62
|
-
"initial": "held",
|
|
63
|
-
"states": [
|
|
64
|
-
"held",
|
|
65
|
-
"released",
|
|
66
|
-
"confirmed",
|
|
67
|
-
"cancel_quoted",
|
|
68
|
-
"completed",
|
|
69
|
-
"canceled",
|
|
70
|
-
"penalty_collected",
|
|
71
|
-
"package_canceled",
|
|
72
|
-
"expired"
|
|
73
|
-
],
|
|
74
|
-
"transitions": {
|
|
75
|
-
"amend_collect": {
|
|
76
|
-
"from": [
|
|
77
|
-
"confirmed"
|
|
78
|
-
],
|
|
79
|
-
"to": "confirmed"
|
|
80
|
-
},
|
|
81
|
-
"amend_fee": {
|
|
82
|
-
"from": [
|
|
83
|
-
"confirmed"
|
|
84
|
-
],
|
|
85
|
-
"to": "confirmed"
|
|
86
|
-
},
|
|
87
|
-
"amend_refund": {
|
|
88
|
-
"from": [
|
|
89
|
-
"confirmed"
|
|
90
|
-
],
|
|
91
|
-
"to": "confirmed"
|
|
92
|
-
},
|
|
93
|
-
"cancel_confirm": {
|
|
94
|
-
"from": [
|
|
95
|
-
"cancel_quoted"
|
|
96
|
-
],
|
|
97
|
-
"to": "canceled"
|
|
98
|
-
},
|
|
99
|
-
"cancel_quote": {
|
|
100
|
-
"from": [
|
|
101
|
-
"confirmed"
|
|
102
|
-
],
|
|
103
|
-
"to": "cancel_quoted"
|
|
104
|
-
},
|
|
105
|
-
"collect_penalty": {
|
|
106
|
-
"from": [
|
|
107
|
-
"canceled"
|
|
108
|
-
],
|
|
109
|
-
"to": "penalty_collected"
|
|
110
|
-
},
|
|
111
|
-
"complete": {
|
|
112
|
-
"from": [
|
|
113
|
-
"confirmed",
|
|
114
|
-
"cancel_quoted"
|
|
115
|
-
],
|
|
116
|
-
"to": "completed"
|
|
117
|
-
},
|
|
118
|
-
"confirm": {
|
|
119
|
-
"from": [
|
|
120
|
-
"held"
|
|
121
|
-
],
|
|
122
|
-
"to": "confirmed"
|
|
123
|
-
},
|
|
124
|
-
"expire": {
|
|
125
|
-
"from": [
|
|
126
|
-
"held"
|
|
127
|
-
],
|
|
128
|
-
"to": "expired"
|
|
129
|
-
},
|
|
130
|
-
"package_cancel": {
|
|
131
|
-
"from": [
|
|
132
|
-
"confirmed",
|
|
133
|
-
"cancel_quoted"
|
|
134
|
-
],
|
|
135
|
-
"to": "package_canceled"
|
|
136
|
-
},
|
|
137
|
-
"release": {
|
|
138
|
-
"from": [
|
|
139
|
-
"held"
|
|
140
|
-
],
|
|
141
|
-
"to": "released"
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
},
|
|
145
|
-
"parties": {
|
|
146
|
-
"beneficiary": "operatorAccountId",
|
|
147
|
-
"payer": "travelerAccountId"
|
|
148
|
-
},
|
|
149
|
-
"required": [
|
|
150
|
-
"travelerAccountId",
|
|
151
|
-
"operatorAccountId",
|
|
152
|
-
"fareAmount",
|
|
153
|
-
"currency",
|
|
154
|
-
"holdExpiresAt",
|
|
155
|
-
"departsAt"
|
|
4
|
+
"actionOrder": [
|
|
5
|
+
"create",
|
|
6
|
+
"confirm",
|
|
7
|
+
"amend_collect",
|
|
8
|
+
"amend_refund",
|
|
9
|
+
"amend_fee",
|
|
10
|
+
"release",
|
|
11
|
+
"expire",
|
|
12
|
+
"cancel_quote",
|
|
13
|
+
"cancel_confirm",
|
|
14
|
+
"collect_penalty",
|
|
15
|
+
"package_cancel",
|
|
16
|
+
"complete"
|
|
156
17
|
],
|
|
157
|
-
"
|
|
158
|
-
"kinds": [
|
|
159
|
-
"flight_itinerary"
|
|
160
|
-
]
|
|
161
|
-
},
|
|
162
|
-
"summary": "Held-then-confirmed flight purchase settled on a carrier decision.",
|
|
163
|
-
"title": "Flight booking",
|
|
164
|
-
"unwind": {
|
|
165
|
-
"confirm": "cancel_confirm",
|
|
166
|
-
"penalty": [
|
|
167
|
-
{
|
|
168
|
-
"bps": 0,
|
|
169
|
-
"withinOffset": "P1D"
|
|
170
|
-
},
|
|
171
|
-
{
|
|
172
|
-
"bps": 2500
|
|
173
|
-
}
|
|
174
|
-
],
|
|
175
|
-
"quote": "cancel_quote",
|
|
176
|
-
"refundDestinationField": "travelerAccountId",
|
|
177
|
-
"refundableField": "fareAmount"
|
|
178
|
-
},
|
|
179
|
-
"update": {
|
|
180
|
-
"fields": [
|
|
181
|
-
"departsAt",
|
|
182
|
-
"bookingNote"
|
|
183
|
-
],
|
|
184
|
-
"states": [
|
|
185
|
-
"held",
|
|
186
|
-
"confirmed"
|
|
187
|
-
]
|
|
188
|
-
},
|
|
189
|
-
"verbs": {
|
|
18
|
+
"actions": {
|
|
190
19
|
"amend_collect": {
|
|
20
|
+
"agentDescription": "Charge the traveler the fare difference when an amended itinerary costs more, paid straight to the operator. This moves money. Only a confirmed booking amends. The fare reserve is untouched, so it still pays out in full at departure. Pass fareDifference and amendmentNote.",
|
|
191
21
|
"description": "Reprices a confirmed booking whose amended itinerary costs more: the traveler pays the fare difference to the operator directly and the booking stays confirmed. The fare reserve is untouched; it still pays out in full at departure. Pair with flight_booking.update for the itinerary fields and amend_fee for the reissue fee.",
|
|
22
|
+
"effects": {
|
|
23
|
+
"moves": [
|
|
24
|
+
{
|
|
25
|
+
"signature": "moves.transfer.internal",
|
|
26
|
+
"source": "moves[0]"
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
},
|
|
192
30
|
"eventName": "flight_booking.amendment_collected",
|
|
193
31
|
"examples": [
|
|
194
32
|
{
|
|
195
33
|
"input": {
|
|
196
34
|
"amendmentNote": "Rebooked SV1024 to the evening departure",
|
|
197
|
-
"fareDifference": "24000"
|
|
35
|
+
"fareDifference": "24000",
|
|
36
|
+
"flightBookingId": "fbkg_sandbox_amend0000001",
|
|
37
|
+
"tenantId": "ten_sandbox_travel000001"
|
|
198
38
|
},
|
|
199
39
|
"name": "collect_reissued_fare_increase"
|
|
200
40
|
}
|
|
@@ -238,13 +78,13 @@
|
|
|
238
78
|
"from": "input",
|
|
239
79
|
"path": "amendmentNote"
|
|
240
80
|
},
|
|
241
|
-
"
|
|
81
|
+
"productId": {
|
|
242
82
|
"from": "instance",
|
|
243
|
-
"path": "
|
|
83
|
+
"path": "productId"
|
|
244
84
|
},
|
|
245
|
-
"
|
|
85
|
+
"sourceAccountId": {
|
|
246
86
|
"from": "instance",
|
|
247
|
-
"path": "
|
|
87
|
+
"path": "fields.travelerAccountId"
|
|
248
88
|
}
|
|
249
89
|
},
|
|
250
90
|
"capture": {
|
|
@@ -258,13 +98,24 @@
|
|
|
258
98
|
"summary": "Collect an amended fare increase"
|
|
259
99
|
},
|
|
260
100
|
"amend_fee": {
|
|
261
|
-
"
|
|
101
|
+
"agentDescription": "Charge the operator's reissue fee for one amendment, in either repricing direction. This moves money from the traveler to the operator. Only a confirmed booking amends. Skip it when the amendment is fee-free, and call it alone when a reissue costs a fee but no fare difference.",
|
|
102
|
+
"description": "Collects the operator's reissue fee for one amendment from the traveler, in either repricing direction. Declared as its own action so a fee-free amendment simply never invokes it and an equal-fare reissue is a fee with no difference leg.",
|
|
103
|
+
"effects": {
|
|
104
|
+
"moves": [
|
|
105
|
+
{
|
|
106
|
+
"signature": "moves.transfer.internal",
|
|
107
|
+
"source": "moves[0]"
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
},
|
|
262
111
|
"eventName": "flight_booking.amendment_fee_collected",
|
|
263
112
|
"examples": [
|
|
264
113
|
{
|
|
265
114
|
"input": {
|
|
266
115
|
"amendmentFee": "5000",
|
|
267
|
-
"amendmentNote": "Carrier reissue fee for the date change"
|
|
116
|
+
"amendmentNote": "Carrier reissue fee for the date change",
|
|
117
|
+
"flightBookingId": "fbkg_sandbox_amend0000001",
|
|
118
|
+
"tenantId": "ten_sandbox_travel000001"
|
|
268
119
|
},
|
|
269
120
|
"name": "collect_reissue_fee"
|
|
270
121
|
}
|
|
@@ -308,13 +159,13 @@
|
|
|
308
159
|
"from": "input",
|
|
309
160
|
"path": "amendmentNote"
|
|
310
161
|
},
|
|
311
|
-
"
|
|
162
|
+
"productId": {
|
|
312
163
|
"from": "instance",
|
|
313
|
-
"path": "
|
|
164
|
+
"path": "productId"
|
|
314
165
|
},
|
|
315
|
-
"
|
|
166
|
+
"sourceAccountId": {
|
|
316
167
|
"from": "instance",
|
|
317
|
-
"path": "
|
|
168
|
+
"path": "fields.travelerAccountId"
|
|
318
169
|
}
|
|
319
170
|
},
|
|
320
171
|
"capture": {
|
|
@@ -328,13 +179,24 @@
|
|
|
328
179
|
"summary": "Collect a flight amendment fee"
|
|
329
180
|
},
|
|
330
181
|
"amend_refund": {
|
|
182
|
+
"agentDescription": "Refund the traveler the fare difference when an amended itinerary costs less, paid by the operator directly. This moves money. Only a confirmed booking amends. The fare reserve is untouched, so the operator's departure payout nets to the amended fare. Any reissue fee goes through amend_fee.",
|
|
331
183
|
"description": "Reprices a confirmed booking whose amended itinerary costs less: the operator refunds the fare difference to the traveler directly and the booking stays confirmed. The fare reserve is untouched, so the operator's departure payout still nets to the amended fare. Any reissue fee is collected separately by amend_fee.",
|
|
184
|
+
"effects": {
|
|
185
|
+
"moves": [
|
|
186
|
+
{
|
|
187
|
+
"signature": "moves.transfer.internal",
|
|
188
|
+
"source": "moves[0]"
|
|
189
|
+
}
|
|
190
|
+
]
|
|
191
|
+
},
|
|
332
192
|
"eventName": "flight_booking.amendment_refunded",
|
|
333
193
|
"examples": [
|
|
334
194
|
{
|
|
335
195
|
"input": {
|
|
336
196
|
"amendmentNote": "Moved to the lower morning fare",
|
|
337
|
-
"fareDifference": "18500"
|
|
197
|
+
"fareDifference": "18500",
|
|
198
|
+
"flightBookingId": "fbkg_sandbox_amend0000001",
|
|
199
|
+
"tenantId": "ten_sandbox_travel000001"
|
|
338
200
|
},
|
|
339
201
|
"name": "refund_reissued_fare_decrease"
|
|
340
202
|
}
|
|
@@ -378,13 +240,13 @@
|
|
|
378
240
|
"from": "input",
|
|
379
241
|
"path": "amendmentNote"
|
|
380
242
|
},
|
|
381
|
-
"
|
|
243
|
+
"productId": {
|
|
382
244
|
"from": "instance",
|
|
383
|
-
"path": "
|
|
245
|
+
"path": "productId"
|
|
384
246
|
},
|
|
385
|
-
"
|
|
247
|
+
"sourceAccountId": {
|
|
386
248
|
"from": "instance",
|
|
387
|
-
"path": "
|
|
249
|
+
"path": "fields.operatorAccountId"
|
|
388
250
|
}
|
|
389
251
|
},
|
|
390
252
|
"capture": {
|
|
@@ -398,7 +260,17 @@
|
|
|
398
260
|
"summary": "Refund an amended fare decrease"
|
|
399
261
|
},
|
|
400
262
|
"cancel_confirm": {
|
|
401
|
-
"
|
|
263
|
+
"agentDescription": "Cancel the booking and refund the fare minus the scheduled penalty from the fare reserve to the traveler. This moves money and does not reverse. Only a booking already parked by cancel_quote confirms. The retained penalty stays in the reserve for collect_penalty.",
|
|
264
|
+
"commit": "cancel_quote",
|
|
265
|
+
"description": "Unwinds the booking, refunding the fare minus the scheduled penalty from the fare reserve back to the traveler. The confirm pays the price the quote stamped in refs.unwindRefund. It never reprices. An expired offer, or one whose fare or traveler account moved since it was quoted, is refused. collect_penalty pays the retained remainder separately.",
|
|
266
|
+
"effects": {
|
|
267
|
+
"moves": [
|
|
268
|
+
{
|
|
269
|
+
"signature": "moves.transfer.internal",
|
|
270
|
+
"source": "moves[0]"
|
|
271
|
+
}
|
|
272
|
+
]
|
|
273
|
+
},
|
|
402
274
|
"moves": [
|
|
403
275
|
{
|
|
404
276
|
"bind": {
|
|
@@ -414,13 +286,13 @@
|
|
|
414
286
|
"from": "instance",
|
|
415
287
|
"path": "fields.travelerAccountId"
|
|
416
288
|
},
|
|
417
|
-
"
|
|
289
|
+
"productId": {
|
|
418
290
|
"from": "instance",
|
|
419
|
-
"path": "
|
|
291
|
+
"path": "productId"
|
|
420
292
|
},
|
|
421
|
-
"
|
|
293
|
+
"sourceAccountId": {
|
|
422
294
|
"from": "instance",
|
|
423
|
-
"path": "
|
|
295
|
+
"path": "refs.fareReserveAccountId"
|
|
424
296
|
}
|
|
425
297
|
},
|
|
426
298
|
"capture": {
|
|
@@ -434,13 +306,59 @@
|
|
|
434
306
|
"summary": "Confirm a flight booking cancellation"
|
|
435
307
|
},
|
|
436
308
|
"cancel_quote": {
|
|
437
|
-
"
|
|
309
|
+
"agentDescription": "Park a confirmed booking for cancellation and price the refund under the penalty schedule. No money moves, and the number is advisory because cancel_confirm reprices at its own clock. Only a confirmed booking quotes, and departure still completes a booking whose quote nobody acted on.",
|
|
310
|
+
"description": "Parks the confirmed booking for cancellation and prices the refund under the void-window penalty schedule. No money moves. The quote stamps a frozen offer that expires in 15 minutes, and only the cancellation confirm may spend it.",
|
|
311
|
+
"effects": {
|
|
312
|
+
"holds": [
|
|
313
|
+
{
|
|
314
|
+
"signature": "holds.quote",
|
|
315
|
+
"source": "quote"
|
|
316
|
+
}
|
|
317
|
+
],
|
|
318
|
+
"schedules": [
|
|
319
|
+
{
|
|
320
|
+
"signature": "schedules.expiry",
|
|
321
|
+
"source": "quote"
|
|
322
|
+
}
|
|
323
|
+
]
|
|
324
|
+
},
|
|
438
325
|
"moves": [],
|
|
326
|
+
"quote": {
|
|
327
|
+
"baseField": "fareAmount",
|
|
328
|
+
"chargeRef": "unwindPenalty",
|
|
329
|
+
"charges": [
|
|
330
|
+
{
|
|
331
|
+
"bps": 0,
|
|
332
|
+
"withinOffset": "P1D"
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
"bps": 2500
|
|
336
|
+
}
|
|
337
|
+
],
|
|
338
|
+
"expires": {
|
|
339
|
+
"offset": "PT15M"
|
|
340
|
+
},
|
|
341
|
+
"fixes": [
|
|
342
|
+
"fareAmount",
|
|
343
|
+
"travelerAccountId"
|
|
344
|
+
],
|
|
345
|
+
"netDestinationField": "travelerAccountId",
|
|
346
|
+
"netRef": "unwindRefund"
|
|
347
|
+
},
|
|
439
348
|
"steps": [],
|
|
440
349
|
"summary": "Quote a flight booking cancellation"
|
|
441
350
|
},
|
|
442
351
|
"collect_penalty": {
|
|
352
|
+
"agentDescription": "Pay the retained cancellation penalty out of the fare reserve to the operator. This moves money. Run it only after cancel_confirm, and only when that call reported a positive unwind penalty. A cancellation inside the free window retains nothing.",
|
|
443
353
|
"description": "Pays the computed retained cancellation penalty to the operator. Invoke only when cancel_confirm returns a positive refs.unwindPenalty.",
|
|
354
|
+
"effects": {
|
|
355
|
+
"moves": [
|
|
356
|
+
{
|
|
357
|
+
"signature": "moves.transfer.internal",
|
|
358
|
+
"source": "moves[0]"
|
|
359
|
+
}
|
|
360
|
+
]
|
|
361
|
+
},
|
|
444
362
|
"eventName": "flight_booking.penalty_collected",
|
|
445
363
|
"moves": [
|
|
446
364
|
{
|
|
@@ -457,13 +375,13 @@
|
|
|
457
375
|
"from": "instance",
|
|
458
376
|
"path": "fields.operatorAccountId"
|
|
459
377
|
},
|
|
460
|
-
"
|
|
378
|
+
"productId": {
|
|
461
379
|
"from": "instance",
|
|
462
|
-
"path": "
|
|
380
|
+
"path": "productId"
|
|
463
381
|
},
|
|
464
|
-
"
|
|
382
|
+
"sourceAccountId": {
|
|
465
383
|
"from": "instance",
|
|
466
|
-
"path": "
|
|
384
|
+
"path": "refs.fareReserveAccountId"
|
|
467
385
|
}
|
|
468
386
|
},
|
|
469
387
|
"capture": {
|
|
@@ -482,6 +400,20 @@
|
|
|
482
400
|
"field": "departsAt"
|
|
483
401
|
},
|
|
484
402
|
"earnable": true,
|
|
403
|
+
"effects": {
|
|
404
|
+
"moves": [
|
|
405
|
+
{
|
|
406
|
+
"signature": "moves.transfer.internal",
|
|
407
|
+
"source": "moves[0]"
|
|
408
|
+
}
|
|
409
|
+
],
|
|
410
|
+
"schedules": [
|
|
411
|
+
{
|
|
412
|
+
"signature": "schedules.due",
|
|
413
|
+
"source": "due"
|
|
414
|
+
}
|
|
415
|
+
]
|
|
416
|
+
},
|
|
485
417
|
"moves": [
|
|
486
418
|
{
|
|
487
419
|
"bind": {
|
|
@@ -497,13 +429,13 @@
|
|
|
497
429
|
"from": "instance",
|
|
498
430
|
"path": "fields.operatorAccountId"
|
|
499
431
|
},
|
|
500
|
-
"
|
|
432
|
+
"productId": {
|
|
501
433
|
"from": "instance",
|
|
502
|
-
"path": "
|
|
434
|
+
"path": "productId"
|
|
503
435
|
},
|
|
504
|
-
"
|
|
436
|
+
"sourceAccountId": {
|
|
505
437
|
"from": "instance",
|
|
506
|
-
"path": "
|
|
438
|
+
"path": "refs.fareReserveAccountId"
|
|
507
439
|
}
|
|
508
440
|
},
|
|
509
441
|
"capture": {
|
|
@@ -517,6 +449,7 @@
|
|
|
517
449
|
"summary": "Complete a flight booking"
|
|
518
450
|
},
|
|
519
451
|
"confirm": {
|
|
452
|
+
"agentDescription": "Ask the air carrier to accept the seat, then move the full fare from the traveler into the fare reserve. This moves money and puts the booking in force. Only a held booking confirms, and only before holdExpiresAt passes, whether or not the expiry sweep has fired. A carrier that does not answer in time declines.",
|
|
520
453
|
"deadline": {
|
|
521
454
|
"field": "holdExpiresAt"
|
|
522
455
|
},
|
|
@@ -526,6 +459,26 @@
|
|
|
526
459
|
"onTimeout": "decline"
|
|
527
460
|
},
|
|
528
461
|
"description": "Runs a just-in-time air carrier decision under a deadline, then settles the fare from the traveler into the dedicated fare reserve and puts the booking in force. Refused once the hold expiry has passed, even if the expiry sweep has not fired yet.",
|
|
462
|
+
"effects": {
|
|
463
|
+
"decides": [
|
|
464
|
+
{
|
|
465
|
+
"signature": "decides.air_carrier",
|
|
466
|
+
"source": "decision"
|
|
467
|
+
}
|
|
468
|
+
],
|
|
469
|
+
"moves": [
|
|
470
|
+
{
|
|
471
|
+
"signature": "moves.transfer.internal",
|
|
472
|
+
"source": "moves[0]"
|
|
473
|
+
}
|
|
474
|
+
],
|
|
475
|
+
"schedules": [
|
|
476
|
+
{
|
|
477
|
+
"signature": "schedules.deadline",
|
|
478
|
+
"source": "deadline"
|
|
479
|
+
}
|
|
480
|
+
]
|
|
481
|
+
},
|
|
529
482
|
"moves": [
|
|
530
483
|
{
|
|
531
484
|
"bind": {
|
|
@@ -541,13 +494,13 @@
|
|
|
541
494
|
"from": "instance",
|
|
542
495
|
"path": "refs.fareReserveAccountId"
|
|
543
496
|
},
|
|
544
|
-
"
|
|
497
|
+
"productId": {
|
|
545
498
|
"from": "instance",
|
|
546
|
-
"path": "
|
|
499
|
+
"path": "productId"
|
|
547
500
|
},
|
|
548
|
-
"
|
|
501
|
+
"sourceAccountId": {
|
|
549
502
|
"from": "instance",
|
|
550
|
-
"path": "
|
|
503
|
+
"path": "fields.travelerAccountId"
|
|
551
504
|
}
|
|
552
505
|
},
|
|
553
506
|
"capture": {
|
|
@@ -561,7 +514,16 @@
|
|
|
561
514
|
"summary": "Confirm a flight booking"
|
|
562
515
|
},
|
|
563
516
|
"create": {
|
|
517
|
+
"agentDescription": "Open the booking as a hold on a flight itinerary subject at the quoted fare and provision its fare reserve account. No money moves and the hold expires at holdExpiresAt. Name travelPackageId only when this leg belongs to a package, and that package must still be draft or booked.",
|
|
564
518
|
"description": "Opens the booking as a hold against a flight itinerary subject at the quoted fare and provisions the dedicated fare reserve. No money moves until the booking confirms; the hold carries its own expiry deadline. A booking holding a leg of a packaged trip names its travel package, admitted only while that package is still draft or booked.",
|
|
519
|
+
"effects": {
|
|
520
|
+
"reads": [
|
|
521
|
+
{
|
|
522
|
+
"signature": "reads.requires_refs",
|
|
523
|
+
"source": "requiresRefs"
|
|
524
|
+
}
|
|
525
|
+
]
|
|
526
|
+
},
|
|
565
527
|
"moves": [],
|
|
566
528
|
"requiresRefs": [
|
|
567
529
|
{
|
|
@@ -582,19 +544,19 @@
|
|
|
582
544
|
},
|
|
583
545
|
"owner.id": {
|
|
584
546
|
"from": "instance",
|
|
585
|
-
"path": "
|
|
547
|
+
"path": "productId"
|
|
586
548
|
},
|
|
587
549
|
"owner.type": {
|
|
588
550
|
"from": "const",
|
|
589
|
-
"value": "
|
|
551
|
+
"value": "product"
|
|
552
|
+
},
|
|
553
|
+
"productId": {
|
|
554
|
+
"from": "instance",
|
|
555
|
+
"path": "productId"
|
|
590
556
|
},
|
|
591
557
|
"role": {
|
|
592
558
|
"from": "const",
|
|
593
|
-
"value": "
|
|
594
|
-
},
|
|
595
|
-
"workspaceId": {
|
|
596
|
-
"from": "instance",
|
|
597
|
-
"path": "workspaceId"
|
|
559
|
+
"value": "product_escrow"
|
|
598
560
|
}
|
|
599
561
|
},
|
|
600
562
|
"capture": {
|
|
@@ -610,6 +572,14 @@
|
|
|
610
572
|
"due": {
|
|
611
573
|
"field": "holdExpiresAt"
|
|
612
574
|
},
|
|
575
|
+
"effects": {
|
|
576
|
+
"schedules": [
|
|
577
|
+
{
|
|
578
|
+
"signature": "schedules.due",
|
|
579
|
+
"source": "due"
|
|
580
|
+
}
|
|
581
|
+
]
|
|
582
|
+
},
|
|
613
583
|
"moves": [],
|
|
614
584
|
"requiresDrainedAccount": {
|
|
615
585
|
"path": "refs.fareReserveAccountId"
|
|
@@ -622,13 +592,27 @@
|
|
|
622
592
|
"due": {
|
|
623
593
|
"field": "holdExpiresAt",
|
|
624
594
|
"whenParentStatus": {
|
|
625
|
-
"
|
|
595
|
+
"instrumentId": "travel_package",
|
|
626
596
|
"refField": "travelPackageId",
|
|
627
597
|
"statuses": [
|
|
628
598
|
"cancelled"
|
|
629
599
|
]
|
|
630
600
|
}
|
|
631
601
|
},
|
|
602
|
+
"effects": {
|
|
603
|
+
"moves": [
|
|
604
|
+
{
|
|
605
|
+
"signature": "moves.transfer.internal",
|
|
606
|
+
"source": "moves[0]"
|
|
607
|
+
}
|
|
608
|
+
],
|
|
609
|
+
"schedules": [
|
|
610
|
+
{
|
|
611
|
+
"signature": "schedules.due",
|
|
612
|
+
"source": "due"
|
|
613
|
+
}
|
|
614
|
+
]
|
|
615
|
+
},
|
|
632
616
|
"moves": [
|
|
633
617
|
{
|
|
634
618
|
"bind": {
|
|
@@ -644,13 +628,13 @@
|
|
|
644
628
|
"from": "instance",
|
|
645
629
|
"path": "fields.travelerAccountId"
|
|
646
630
|
},
|
|
647
|
-
"
|
|
631
|
+
"productId": {
|
|
648
632
|
"from": "instance",
|
|
649
|
-
"path": "
|
|
633
|
+
"path": "productId"
|
|
650
634
|
},
|
|
651
|
-
"
|
|
635
|
+
"sourceAccountId": {
|
|
652
636
|
"from": "instance",
|
|
653
|
-
"path": "
|
|
637
|
+
"path": "refs.fareReserveAccountId"
|
|
654
638
|
}
|
|
655
639
|
},
|
|
656
640
|
"capture": {
|
|
@@ -664,6 +648,7 @@
|
|
|
664
648
|
"summary": "Cancel a flight booking with its cancelled package"
|
|
665
649
|
},
|
|
666
650
|
"release": {
|
|
651
|
+
"agentDescription": "Close a hold the traveler walked away from before confirming. No money has moved and the fare reserve must be empty, so this is a lifecycle transition only. Only a held booking releases. A confirmed booking leaves through cancel_quote and cancel_confirm instead.",
|
|
667
652
|
"description": "Closes a hold the traveler abandoned before confirmation. No money has moved, so this is a pure lifecycle transition.",
|
|
668
653
|
"moves": [],
|
|
669
654
|
"requiresDrainedAccount": {
|
|
@@ -672,17 +657,40 @@
|
|
|
672
657
|
"steps": [],
|
|
673
658
|
"summary": "Release a held flight booking"
|
|
674
659
|
}
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
660
|
+
},
|
|
661
|
+
"agentDescription": "Reach for flight_booking when a traveler holds a seat on a flight itinerary and the fare settles only once an air carrier accepts. The hold moves no money and dies at holdExpiresAt. Confirm reserves the fare, the maintenance loop pays the operator at departure, and amendments and cancellations each have their own action.",
|
|
662
|
+
"callerParkedStates": {
|
|
663
|
+
"canceled": "the residual penalty is collected by the operator as a deliberate follow-up transfer"
|
|
664
|
+
},
|
|
665
|
+
"description": "A flight booking opens as a hold against a flight itinerary subject with no money moved. Confirming it runs a just-in-time air carrier decision under a deadline, then settles the fare from the traveler into a dedicated fare reserve. An unconfirmed hold expires on its deadline, cancellation unwinds through a quote then a confirm under the void-window penalty schedule, and completion at departure pays the reserved fare to the operator.",
|
|
666
|
+
"dials": [
|
|
667
|
+
{
|
|
668
|
+
"field": "holdExpiresAt",
|
|
669
|
+
"key": "hold_window",
|
|
670
|
+
"kind": "window",
|
|
671
|
+
"maxOffset": "P7D",
|
|
672
|
+
"summary": "Grace beyond the held expiry timestamp: moves the confirm cutoff and the expire sweep together.",
|
|
673
|
+
"title": "Hold window"
|
|
683
674
|
},
|
|
684
|
-
|
|
685
|
-
"
|
|
675
|
+
{
|
|
676
|
+
"action": "confirm",
|
|
677
|
+
"key": "carrier_decision_deadline_ms",
|
|
678
|
+
"kind": "decision_deadline_ms",
|
|
679
|
+
"minMs": 1000,
|
|
680
|
+
"summary": "How long confirm waits for the air carrier's just-in-time decision before the timeout default applies.",
|
|
681
|
+
"title": "Carrier decision deadline"
|
|
682
|
+
},
|
|
683
|
+
{
|
|
684
|
+
"key": "cancellation_penalty",
|
|
685
|
+
"kind": "unwind_penalty",
|
|
686
|
+
"summary": "Replaces the void-window penalty tiers cancellations are quoted against.",
|
|
687
|
+
"title": "Cancellation penalty schedule"
|
|
688
|
+
}
|
|
689
|
+
],
|
|
690
|
+
"fields": {
|
|
691
|
+
"bookingNote": {
|
|
692
|
+
"maxLength": 180,
|
|
693
|
+
"minLength": 1,
|
|
686
694
|
"type": "string"
|
|
687
695
|
},
|
|
688
696
|
"currency": {
|
|
@@ -692,7 +700,20 @@
|
|
|
692
700
|
"pattern": "^[A-Z]{3}$",
|
|
693
701
|
"type": "string"
|
|
694
702
|
},
|
|
695
|
-
"
|
|
703
|
+
"departsAt": {
|
|
704
|
+
"format": "hyperscale-date-time",
|
|
705
|
+
"type": "string"
|
|
706
|
+
},
|
|
707
|
+
"fareAmount": {
|
|
708
|
+
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
709
|
+
"pattern": "^[1-9][0-9]{0,17}$",
|
|
710
|
+
"type": "string"
|
|
711
|
+
},
|
|
712
|
+
"holdExpiresAt": {
|
|
713
|
+
"format": "hyperscale-date-time",
|
|
714
|
+
"type": "string"
|
|
715
|
+
},
|
|
716
|
+
"operatorAccountId": {
|
|
696
717
|
"description": "Hyperscale account ID",
|
|
697
718
|
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
698
719
|
"type": "string",
|
|
@@ -703,11 +724,12 @@
|
|
|
703
724
|
]
|
|
704
725
|
}
|
|
705
726
|
},
|
|
706
|
-
"
|
|
707
|
-
"
|
|
727
|
+
"travelPackageId": {
|
|
728
|
+
"description": "Travel package this booking is a leg of",
|
|
729
|
+
"pattern": "^tpkg_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
708
730
|
"type": "string"
|
|
709
731
|
},
|
|
710
|
-
"
|
|
732
|
+
"travelerAccountId": {
|
|
711
733
|
"description": "Hyperscale account ID",
|
|
712
734
|
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
713
735
|
"type": "string",
|
|
@@ -717,25 +739,10 @@
|
|
|
717
739
|
"customer_balance"
|
|
718
740
|
]
|
|
719
741
|
}
|
|
720
|
-
},
|
|
721
|
-
"rateAmount": {
|
|
722
|
-
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
723
|
-
"pattern": "^[1-9][0-9]{0,17}$",
|
|
724
|
-
"type": "string"
|
|
725
|
-
},
|
|
726
|
-
"stayNote": {
|
|
727
|
-
"maxLength": 180,
|
|
728
|
-
"minLength": 1,
|
|
729
|
-
"type": "string"
|
|
730
|
-
},
|
|
731
|
-
"travelPackageId": {
|
|
732
|
-
"description": "Travel package this stay is a leg of",
|
|
733
|
-
"pattern": "^tpkg_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
734
|
-
"type": "string"
|
|
735
742
|
}
|
|
736
743
|
},
|
|
737
|
-
"id": "
|
|
738
|
-
"idPrefix": "
|
|
744
|
+
"id": "flight_booking",
|
|
745
|
+
"idPrefix": "fbkg",
|
|
739
746
|
"lifecycle": {
|
|
740
747
|
"initial": "held",
|
|
741
748
|
"states": [
|
|
@@ -820,61 +827,76 @@
|
|
|
820
827
|
}
|
|
821
828
|
}
|
|
822
829
|
},
|
|
830
|
+
"nav": [
|
|
831
|
+
"Blueprints",
|
|
832
|
+
"Flight Bookings"
|
|
833
|
+
],
|
|
823
834
|
"parties": {
|
|
824
|
-
"beneficiary": "
|
|
825
|
-
"payer": "
|
|
835
|
+
"beneficiary": "operatorAccountId",
|
|
836
|
+
"payer": "travelerAccountId"
|
|
826
837
|
},
|
|
827
838
|
"required": [
|
|
828
|
-
"
|
|
829
|
-
"
|
|
830
|
-
"
|
|
839
|
+
"travelerAccountId",
|
|
840
|
+
"operatorAccountId",
|
|
841
|
+
"fareAmount",
|
|
831
842
|
"currency",
|
|
832
843
|
"holdExpiresAt",
|
|
833
|
-
"
|
|
834
|
-
"checkOutAt"
|
|
844
|
+
"departsAt"
|
|
835
845
|
],
|
|
836
846
|
"subject": {
|
|
837
847
|
"kinds": [
|
|
838
|
-
"
|
|
848
|
+
"flight_itinerary"
|
|
839
849
|
]
|
|
840
850
|
},
|
|
841
|
-
"summary": "Held-then-confirmed
|
|
842
|
-
"
|
|
843
|
-
"
|
|
844
|
-
"confirm": "cancel_confirm",
|
|
845
|
-
"penalty": [
|
|
846
|
-
{
|
|
847
|
-
"bps": 0,
|
|
848
|
-
"withinOffset": "P2D"
|
|
849
|
-
},
|
|
850
|
-
{
|
|
851
|
-
"bps": 5000
|
|
852
|
-
}
|
|
853
|
-
],
|
|
854
|
-
"quote": "cancel_quote",
|
|
855
|
-
"refundDestinationField": "guestAccountId",
|
|
856
|
-
"refundableField": "rateAmount"
|
|
857
|
-
},
|
|
851
|
+
"summary": "Held-then-confirmed flight purchase settled on a carrier decision.",
|
|
852
|
+
"templateId": "air_travel",
|
|
853
|
+
"title": "Flight booking",
|
|
858
854
|
"update": {
|
|
859
855
|
"fields": [
|
|
860
|
-
"
|
|
861
|
-
"
|
|
862
|
-
"stayNote"
|
|
856
|
+
"departsAt",
|
|
857
|
+
"bookingNote"
|
|
863
858
|
],
|
|
864
859
|
"states": [
|
|
865
860
|
"held",
|
|
866
861
|
"confirmed"
|
|
867
862
|
]
|
|
868
|
-
}
|
|
869
|
-
|
|
863
|
+
}
|
|
864
|
+
},
|
|
865
|
+
{
|
|
866
|
+
"actionOrder": [
|
|
867
|
+
"create",
|
|
868
|
+
"confirm",
|
|
869
|
+
"amend_collect",
|
|
870
|
+
"amend_refund",
|
|
871
|
+
"amend_fee",
|
|
872
|
+
"release",
|
|
873
|
+
"expire",
|
|
874
|
+
"cancel_quote",
|
|
875
|
+
"cancel_confirm",
|
|
876
|
+
"collect_penalty",
|
|
877
|
+
"package_cancel",
|
|
878
|
+
"complete"
|
|
879
|
+
],
|
|
880
|
+
"actions": {
|
|
870
881
|
"amend_collect": {
|
|
882
|
+
"agentDescription": "Charge the guest the rate difference when an amended stay costs more, paid straight to the property. The stay must be confirmed and does not change state. The rate reserve is untouched and still pays out in full at checkout. Change the dates through hotel_stay.update and any change fee through amend_fee.",
|
|
871
883
|
"description": "Reprices a confirmed stay whose amended dates or room cost more: the guest pays the rate difference to the property directly and the stay remains confirmed. The rate reserve is untouched; it still pays out in full at checkout. Pair with hotel_stay.update for the stay fields and amend_fee for the amendment fee.",
|
|
884
|
+
"effects": {
|
|
885
|
+
"moves": [
|
|
886
|
+
{
|
|
887
|
+
"signature": "moves.transfer.internal",
|
|
888
|
+
"source": "moves[0]"
|
|
889
|
+
}
|
|
890
|
+
]
|
|
891
|
+
},
|
|
872
892
|
"eventName": "hotel_stay.amendment_collected",
|
|
873
893
|
"examples": [
|
|
874
894
|
{
|
|
875
895
|
"input": {
|
|
876
896
|
"amendmentNote": "Extended the stay by two nights",
|
|
877
|
-
"
|
|
897
|
+
"hotelStayId": "hstay_sandbox_amend000001",
|
|
898
|
+
"rateDifference": "32000",
|
|
899
|
+
"tenantId": "ten_sandbox_travel000001"
|
|
878
900
|
},
|
|
879
901
|
"name": "collect_extended_stay_increase"
|
|
880
902
|
}
|
|
@@ -918,13 +940,13 @@
|
|
|
918
940
|
"from": "input",
|
|
919
941
|
"path": "amendmentNote"
|
|
920
942
|
},
|
|
921
|
-
"
|
|
943
|
+
"productId": {
|
|
922
944
|
"from": "instance",
|
|
923
|
-
"path": "
|
|
945
|
+
"path": "productId"
|
|
924
946
|
},
|
|
925
|
-
"
|
|
947
|
+
"sourceAccountId": {
|
|
926
948
|
"from": "instance",
|
|
927
|
-
"path": "
|
|
949
|
+
"path": "fields.guestAccountId"
|
|
928
950
|
}
|
|
929
951
|
},
|
|
930
952
|
"capture": {
|
|
@@ -938,13 +960,24 @@
|
|
|
938
960
|
"summary": "Collect an amended rate increase"
|
|
939
961
|
},
|
|
940
962
|
"amend_fee": {
|
|
941
|
-
"
|
|
963
|
+
"agentDescription": "Charge the property's change fee to the guest for one amendment, in either repricing direction. The stay must be confirmed. This is its own call, so a fee-free amendment skips it and an equal-rate change can be a fee with no difference leg. It moves the guest's money.",
|
|
964
|
+
"description": "Collects the property's amendment fee for one stay change from the guest, in either repricing direction. Declared as its own action so a fee-free amendment simply never invokes it and an equal-rate change is a fee with no difference leg.",
|
|
965
|
+
"effects": {
|
|
966
|
+
"moves": [
|
|
967
|
+
{
|
|
968
|
+
"signature": "moves.transfer.internal",
|
|
969
|
+
"source": "moves[0]"
|
|
970
|
+
}
|
|
971
|
+
]
|
|
972
|
+
},
|
|
942
973
|
"eventName": "hotel_stay.amendment_fee_collected",
|
|
943
974
|
"examples": [
|
|
944
975
|
{
|
|
945
976
|
"input": {
|
|
946
977
|
"amendmentFee": "7500",
|
|
947
|
-
"amendmentNote": "Property fee for the date change"
|
|
978
|
+
"amendmentNote": "Property fee for the date change",
|
|
979
|
+
"hotelStayId": "hstay_sandbox_amend000001",
|
|
980
|
+
"tenantId": "ten_sandbox_travel000001"
|
|
948
981
|
},
|
|
949
982
|
"name": "collect_date_change_fee"
|
|
950
983
|
}
|
|
@@ -988,13 +1021,13 @@
|
|
|
988
1021
|
"from": "input",
|
|
989
1022
|
"path": "amendmentNote"
|
|
990
1023
|
},
|
|
991
|
-
"
|
|
1024
|
+
"productId": {
|
|
992
1025
|
"from": "instance",
|
|
993
|
-
"path": "
|
|
1026
|
+
"path": "productId"
|
|
994
1027
|
},
|
|
995
|
-
"
|
|
1028
|
+
"sourceAccountId": {
|
|
996
1029
|
"from": "instance",
|
|
997
|
-
"path": "
|
|
1030
|
+
"path": "fields.guestAccountId"
|
|
998
1031
|
}
|
|
999
1032
|
},
|
|
1000
1033
|
"capture": {
|
|
@@ -1008,13 +1041,24 @@
|
|
|
1008
1041
|
"summary": "Collect a stay amendment fee"
|
|
1009
1042
|
},
|
|
1010
1043
|
"amend_refund": {
|
|
1044
|
+
"agentDescription": "Refund the guest the rate difference when an amended stay costs less, paid by the property directly. The stay must be confirmed and does not change state. The rate reserve is untouched, so the property's checkout payout nets to the amended rate. Any change fee is a separate amend_fee call.",
|
|
1011
1045
|
"description": "Reprices a confirmed stay whose amended dates or room cost less: the property refunds the rate difference to the guest directly and the stay remains confirmed. The rate reserve is untouched, so the property's checkout payout still nets to the amended rate. Any amendment fee is collected separately by amend_fee.",
|
|
1046
|
+
"effects": {
|
|
1047
|
+
"moves": [
|
|
1048
|
+
{
|
|
1049
|
+
"signature": "moves.transfer.internal",
|
|
1050
|
+
"source": "moves[0]"
|
|
1051
|
+
}
|
|
1052
|
+
]
|
|
1053
|
+
},
|
|
1012
1054
|
"eventName": "hotel_stay.amendment_refunded",
|
|
1013
1055
|
"examples": [
|
|
1014
1056
|
{
|
|
1015
1057
|
"input": {
|
|
1016
1058
|
"amendmentNote": "Shortened the stay by one night",
|
|
1017
|
-
"
|
|
1059
|
+
"hotelStayId": "hstay_sandbox_amend000001",
|
|
1060
|
+
"rateDifference": "16000",
|
|
1061
|
+
"tenantId": "ten_sandbox_travel000001"
|
|
1018
1062
|
},
|
|
1019
1063
|
"name": "refund_shortened_stay_decrease"
|
|
1020
1064
|
}
|
|
@@ -1058,13 +1102,13 @@
|
|
|
1058
1102
|
"from": "input",
|
|
1059
1103
|
"path": "amendmentNote"
|
|
1060
1104
|
},
|
|
1061
|
-
"
|
|
1105
|
+
"productId": {
|
|
1062
1106
|
"from": "instance",
|
|
1063
|
-
"path": "
|
|
1107
|
+
"path": "productId"
|
|
1064
1108
|
},
|
|
1065
|
-
"
|
|
1109
|
+
"sourceAccountId": {
|
|
1066
1110
|
"from": "instance",
|
|
1067
|
-
"path": "
|
|
1111
|
+
"path": "fields.propertyAccountId"
|
|
1068
1112
|
}
|
|
1069
1113
|
},
|
|
1070
1114
|
"capture": {
|
|
@@ -1078,7 +1122,17 @@
|
|
|
1078
1122
|
"summary": "Refund an amended rate decrease"
|
|
1079
1123
|
},
|
|
1080
1124
|
"cancel_confirm": {
|
|
1081
|
-
"
|
|
1125
|
+
"agentDescription": "Cancel the parked stay and refund the rate minus the penalty from the rate reserve to the guest. Requires cancel_quote first. The refund is repriced here into refs.unwindRefund, so it can differ from the quote. This moves money and does not reverse.",
|
|
1126
|
+
"commit": "cancel_quote",
|
|
1127
|
+
"description": "Unwinds the stay, refunding the rate minus the scheduled penalty from the rate reserve back to the guest. The confirm pays the price the quote stamped in refs.unwindRefund. It never reprices. An expired offer, or one whose rate or guest account moved since it was quoted, is refused. collect_penalty pays the retained remainder separately.",
|
|
1128
|
+
"effects": {
|
|
1129
|
+
"moves": [
|
|
1130
|
+
{
|
|
1131
|
+
"signature": "moves.transfer.internal",
|
|
1132
|
+
"source": "moves[0]"
|
|
1133
|
+
}
|
|
1134
|
+
]
|
|
1135
|
+
},
|
|
1082
1136
|
"moves": [
|
|
1083
1137
|
{
|
|
1084
1138
|
"bind": {
|
|
@@ -1094,13 +1148,13 @@
|
|
|
1094
1148
|
"from": "instance",
|
|
1095
1149
|
"path": "fields.guestAccountId"
|
|
1096
1150
|
},
|
|
1097
|
-
"
|
|
1151
|
+
"productId": {
|
|
1098
1152
|
"from": "instance",
|
|
1099
|
-
"path": "
|
|
1153
|
+
"path": "productId"
|
|
1100
1154
|
},
|
|
1101
|
-
"
|
|
1155
|
+
"sourceAccountId": {
|
|
1102
1156
|
"from": "instance",
|
|
1103
|
-
"path": "
|
|
1157
|
+
"path": "refs.rateReserveAccountId"
|
|
1104
1158
|
}
|
|
1105
1159
|
},
|
|
1106
1160
|
"capture": {
|
|
@@ -1114,13 +1168,59 @@
|
|
|
1114
1168
|
"summary": "Confirm a hotel stay cancellation"
|
|
1115
1169
|
},
|
|
1116
1170
|
"cancel_quote": {
|
|
1117
|
-
"
|
|
1171
|
+
"agentDescription": "Park a confirmed stay for cancellation and price the refund against the free-cancel schedule. No money moves, and the number is advisory because cancel_confirm reprices at its own clock. A stay parked here still completes at checkout if nobody confirms the cancellation.",
|
|
1172
|
+
"description": "Parks the confirmed stay for cancellation and prices the refund under the free-cancel penalty schedule. No money moves. The quote stamps a frozen offer that expires in 15 minutes, and only the cancellation confirm may spend it.",
|
|
1173
|
+
"effects": {
|
|
1174
|
+
"holds": [
|
|
1175
|
+
{
|
|
1176
|
+
"signature": "holds.quote",
|
|
1177
|
+
"source": "quote"
|
|
1178
|
+
}
|
|
1179
|
+
],
|
|
1180
|
+
"schedules": [
|
|
1181
|
+
{
|
|
1182
|
+
"signature": "schedules.expiry",
|
|
1183
|
+
"source": "quote"
|
|
1184
|
+
}
|
|
1185
|
+
]
|
|
1186
|
+
},
|
|
1118
1187
|
"moves": [],
|
|
1188
|
+
"quote": {
|
|
1189
|
+
"baseField": "rateAmount",
|
|
1190
|
+
"chargeRef": "unwindPenalty",
|
|
1191
|
+
"charges": [
|
|
1192
|
+
{
|
|
1193
|
+
"bps": 0,
|
|
1194
|
+
"withinOffset": "P2D"
|
|
1195
|
+
},
|
|
1196
|
+
{
|
|
1197
|
+
"bps": 5000
|
|
1198
|
+
}
|
|
1199
|
+
],
|
|
1200
|
+
"expires": {
|
|
1201
|
+
"offset": "PT15M"
|
|
1202
|
+
},
|
|
1203
|
+
"fixes": [
|
|
1204
|
+
"guestAccountId",
|
|
1205
|
+
"rateAmount"
|
|
1206
|
+
],
|
|
1207
|
+
"netDestinationField": "guestAccountId",
|
|
1208
|
+
"netRef": "unwindRefund"
|
|
1209
|
+
},
|
|
1119
1210
|
"steps": [],
|
|
1120
1211
|
"summary": "Quote a hotel stay cancellation"
|
|
1121
1212
|
},
|
|
1122
1213
|
"collect_penalty": {
|
|
1214
|
+
"agentDescription": "Pay the retained cancellation penalty from the rate reserve to the property. Call it only after cancel_confirm returned a positive refs.unwindPenalty. When the penalty is zero the refund already drained the reserve and there is nothing to collect. This moves money.",
|
|
1123
1215
|
"description": "Pays the computed retained cancellation penalty to the property. Invoke only when cancel_confirm returns a positive refs.unwindPenalty.",
|
|
1216
|
+
"effects": {
|
|
1217
|
+
"moves": [
|
|
1218
|
+
{
|
|
1219
|
+
"signature": "moves.transfer.internal",
|
|
1220
|
+
"source": "moves[0]"
|
|
1221
|
+
}
|
|
1222
|
+
]
|
|
1223
|
+
},
|
|
1124
1224
|
"eventName": "hotel_stay.penalty_collected",
|
|
1125
1225
|
"moves": [
|
|
1126
1226
|
{
|
|
@@ -1137,13 +1237,13 @@
|
|
|
1137
1237
|
"from": "instance",
|
|
1138
1238
|
"path": "fields.propertyAccountId"
|
|
1139
1239
|
},
|
|
1140
|
-
"
|
|
1240
|
+
"productId": {
|
|
1141
1241
|
"from": "instance",
|
|
1142
|
-
"path": "
|
|
1242
|
+
"path": "productId"
|
|
1143
1243
|
},
|
|
1144
|
-
"
|
|
1244
|
+
"sourceAccountId": {
|
|
1145
1245
|
"from": "instance",
|
|
1146
|
-
"path": "
|
|
1246
|
+
"path": "refs.rateReserveAccountId"
|
|
1147
1247
|
}
|
|
1148
1248
|
},
|
|
1149
1249
|
"capture": {
|
|
@@ -1162,6 +1262,20 @@
|
|
|
1162
1262
|
"field": "checkOutAt"
|
|
1163
1263
|
},
|
|
1164
1264
|
"earnable": true,
|
|
1265
|
+
"effects": {
|
|
1266
|
+
"moves": [
|
|
1267
|
+
{
|
|
1268
|
+
"signature": "moves.transfer.internal",
|
|
1269
|
+
"source": "moves[0]"
|
|
1270
|
+
}
|
|
1271
|
+
],
|
|
1272
|
+
"schedules": [
|
|
1273
|
+
{
|
|
1274
|
+
"signature": "schedules.due",
|
|
1275
|
+
"source": "due"
|
|
1276
|
+
}
|
|
1277
|
+
]
|
|
1278
|
+
},
|
|
1165
1279
|
"moves": [
|
|
1166
1280
|
{
|
|
1167
1281
|
"bind": {
|
|
@@ -1177,13 +1291,13 @@
|
|
|
1177
1291
|
"from": "instance",
|
|
1178
1292
|
"path": "fields.propertyAccountId"
|
|
1179
1293
|
},
|
|
1180
|
-
"
|
|
1294
|
+
"productId": {
|
|
1181
1295
|
"from": "instance",
|
|
1182
|
-
"path": "
|
|
1296
|
+
"path": "productId"
|
|
1183
1297
|
},
|
|
1184
|
-
"
|
|
1298
|
+
"sourceAccountId": {
|
|
1185
1299
|
"from": "instance",
|
|
1186
|
-
"path": "
|
|
1300
|
+
"path": "refs.rateReserveAccountId"
|
|
1187
1301
|
}
|
|
1188
1302
|
},
|
|
1189
1303
|
"capture": {
|
|
@@ -1197,6 +1311,7 @@
|
|
|
1197
1311
|
"summary": "Complete a hotel stay"
|
|
1198
1312
|
},
|
|
1199
1313
|
"confirm": {
|
|
1314
|
+
"agentDescription": "Commit the hold and move the full rate from the guest into the stay's rate reserve. A lodging supplier decides first under a 15 second deadline and a timeout declines. Refused once holdExpiresAt has passed, even before the expiry sweep fires. This moves the guest's money.",
|
|
1200
1315
|
"deadline": {
|
|
1201
1316
|
"field": "holdExpiresAt"
|
|
1202
1317
|
},
|
|
@@ -1206,6 +1321,26 @@
|
|
|
1206
1321
|
"onTimeout": "decline"
|
|
1207
1322
|
},
|
|
1208
1323
|
"description": "Runs a just-in-time lodging supplier decision under a deadline, then settles the rate from the guest into the dedicated rate reserve and commits the stay. Refused once the hold expiry has passed, even if the expiry sweep has not fired yet.",
|
|
1324
|
+
"effects": {
|
|
1325
|
+
"decides": [
|
|
1326
|
+
{
|
|
1327
|
+
"signature": "decides.lodging_supplier",
|
|
1328
|
+
"source": "decision"
|
|
1329
|
+
}
|
|
1330
|
+
],
|
|
1331
|
+
"moves": [
|
|
1332
|
+
{
|
|
1333
|
+
"signature": "moves.transfer.internal",
|
|
1334
|
+
"source": "moves[0]"
|
|
1335
|
+
}
|
|
1336
|
+
],
|
|
1337
|
+
"schedules": [
|
|
1338
|
+
{
|
|
1339
|
+
"signature": "schedules.deadline",
|
|
1340
|
+
"source": "deadline"
|
|
1341
|
+
}
|
|
1342
|
+
]
|
|
1343
|
+
},
|
|
1209
1344
|
"moves": [
|
|
1210
1345
|
{
|
|
1211
1346
|
"bind": {
|
|
@@ -1221,13 +1356,13 @@
|
|
|
1221
1356
|
"from": "instance",
|
|
1222
1357
|
"path": "refs.rateReserveAccountId"
|
|
1223
1358
|
},
|
|
1224
|
-
"
|
|
1359
|
+
"productId": {
|
|
1225
1360
|
"from": "instance",
|
|
1226
|
-
"path": "
|
|
1361
|
+
"path": "productId"
|
|
1227
1362
|
},
|
|
1228
|
-
"
|
|
1363
|
+
"sourceAccountId": {
|
|
1229
1364
|
"from": "instance",
|
|
1230
|
-
"path": "
|
|
1365
|
+
"path": "fields.guestAccountId"
|
|
1231
1366
|
}
|
|
1232
1367
|
},
|
|
1233
1368
|
"capture": {
|
|
@@ -1241,7 +1376,16 @@
|
|
|
1241
1376
|
"summary": "Confirm a hotel stay"
|
|
1242
1377
|
},
|
|
1243
1378
|
"create": {
|
|
1379
|
+
"agentDescription": "Open a stay as a hold at the quoted rate and provision its rate reserve. No money moves yet. The guest and property accounts must both be customer balance accounts in the stay currency. A stay that is a leg of a trip may name a travel package only while that package is draft or booked.",
|
|
1244
1380
|
"description": "Opens the stay as a hold against a lodging stay subject at the quoted rate and provisions the dedicated rate reserve. No money moves until the stay confirms; the hold carries its own expiry deadline. A stay holding a leg of a packaged trip names its travel package, admitted only while that package is still draft or booked.",
|
|
1381
|
+
"effects": {
|
|
1382
|
+
"reads": [
|
|
1383
|
+
{
|
|
1384
|
+
"signature": "reads.requires_refs",
|
|
1385
|
+
"source": "requiresRefs"
|
|
1386
|
+
}
|
|
1387
|
+
]
|
|
1388
|
+
},
|
|
1245
1389
|
"moves": [],
|
|
1246
1390
|
"requiresRefs": [
|
|
1247
1391
|
{
|
|
@@ -1262,19 +1406,19 @@
|
|
|
1262
1406
|
},
|
|
1263
1407
|
"owner.id": {
|
|
1264
1408
|
"from": "instance",
|
|
1265
|
-
"path": "
|
|
1409
|
+
"path": "productId"
|
|
1266
1410
|
},
|
|
1267
1411
|
"owner.type": {
|
|
1268
1412
|
"from": "const",
|
|
1269
|
-
"value": "
|
|
1413
|
+
"value": "product"
|
|
1414
|
+
},
|
|
1415
|
+
"productId": {
|
|
1416
|
+
"from": "instance",
|
|
1417
|
+
"path": "productId"
|
|
1270
1418
|
},
|
|
1271
1419
|
"role": {
|
|
1272
1420
|
"from": "const",
|
|
1273
|
-
"value": "
|
|
1274
|
-
},
|
|
1275
|
-
"workspaceId": {
|
|
1276
|
-
"from": "instance",
|
|
1277
|
-
"path": "workspaceId"
|
|
1421
|
+
"value": "product_escrow"
|
|
1278
1422
|
}
|
|
1279
1423
|
},
|
|
1280
1424
|
"capture": {
|
|
@@ -1290,6 +1434,14 @@
|
|
|
1290
1434
|
"due": {
|
|
1291
1435
|
"field": "holdExpiresAt"
|
|
1292
1436
|
},
|
|
1437
|
+
"effects": {
|
|
1438
|
+
"schedules": [
|
|
1439
|
+
{
|
|
1440
|
+
"signature": "schedules.due",
|
|
1441
|
+
"source": "due"
|
|
1442
|
+
}
|
|
1443
|
+
]
|
|
1444
|
+
},
|
|
1293
1445
|
"moves": [],
|
|
1294
1446
|
"requiresDrainedAccount": {
|
|
1295
1447
|
"path": "refs.rateReserveAccountId"
|
|
@@ -1302,13 +1454,27 @@
|
|
|
1302
1454
|
"due": {
|
|
1303
1455
|
"field": "holdExpiresAt",
|
|
1304
1456
|
"whenParentStatus": {
|
|
1305
|
-
"
|
|
1457
|
+
"instrumentId": "travel_package",
|
|
1306
1458
|
"refField": "travelPackageId",
|
|
1307
1459
|
"statuses": [
|
|
1308
1460
|
"cancelled"
|
|
1309
1461
|
]
|
|
1310
1462
|
}
|
|
1311
1463
|
},
|
|
1464
|
+
"effects": {
|
|
1465
|
+
"moves": [
|
|
1466
|
+
{
|
|
1467
|
+
"signature": "moves.transfer.internal",
|
|
1468
|
+
"source": "moves[0]"
|
|
1469
|
+
}
|
|
1470
|
+
],
|
|
1471
|
+
"schedules": [
|
|
1472
|
+
{
|
|
1473
|
+
"signature": "schedules.due",
|
|
1474
|
+
"source": "due"
|
|
1475
|
+
}
|
|
1476
|
+
]
|
|
1477
|
+
},
|
|
1312
1478
|
"moves": [
|
|
1313
1479
|
{
|
|
1314
1480
|
"bind": {
|
|
@@ -1324,13 +1490,13 @@
|
|
|
1324
1490
|
"from": "instance",
|
|
1325
1491
|
"path": "fields.guestAccountId"
|
|
1326
1492
|
},
|
|
1327
|
-
"
|
|
1493
|
+
"productId": {
|
|
1328
1494
|
"from": "instance",
|
|
1329
|
-
"path": "
|
|
1495
|
+
"path": "productId"
|
|
1330
1496
|
},
|
|
1331
|
-
"
|
|
1497
|
+
"sourceAccountId": {
|
|
1332
1498
|
"from": "instance",
|
|
1333
|
-
"path": "
|
|
1499
|
+
"path": "refs.rateReserveAccountId"
|
|
1334
1500
|
}
|
|
1335
1501
|
},
|
|
1336
1502
|
"capture": {
|
|
@@ -1344,6 +1510,7 @@
|
|
|
1344
1510
|
"summary": "Cancel a hotel stay with its cancelled package"
|
|
1345
1511
|
},
|
|
1346
1512
|
"release": {
|
|
1513
|
+
"agentDescription": "Close a hold the guest walked away from before confirmation. Only a held stay releases, no money has moved, and the rate reserve must be empty. Reach for this when the guest has already decided, rather than waiting for the expiry sweep.",
|
|
1347
1514
|
"description": "Closes a hold the guest abandoned before confirmation. No money has moved, so this is a pure lifecycle transition.",
|
|
1348
1515
|
"moves": [],
|
|
1349
1516
|
"requiresDrainedAccount": {
|
|
@@ -1352,21 +1519,68 @@
|
|
|
1352
1519
|
"steps": [],
|
|
1353
1520
|
"summary": "Release a held hotel stay"
|
|
1354
1521
|
}
|
|
1355
|
-
}
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1522
|
+
},
|
|
1523
|
+
"agentDescription": "Reach for hotel_stay when the caller holds one lodging stay, then confirms, amends, cancels, or completes it. Between confirm and checkout the rate sits in a dedicated per-stay reserve, not with the property. A stay can name the travel package it is a leg of, and that package is its own instrument.",
|
|
1524
|
+
"callerParkedStates": {
|
|
1525
|
+
"canceled": "the residual penalty is collected by the property as a deliberate follow-up transfer"
|
|
1526
|
+
},
|
|
1527
|
+
"description": "A hotel stay opens as a hold against a lodging stay subject with no money moved. Confirming it runs a just-in-time lodging supplier decision under a deadline, then settles the rate from the guest into a dedicated rate reserve. An unconfirmed hold expires on its deadline, cancellation unwinds through a quote then a confirm under the free-cancel penalty schedule, and completion at checkout pays the reserved rate to the property.",
|
|
1528
|
+
"dials": [
|
|
1529
|
+
{
|
|
1530
|
+
"field": "holdExpiresAt",
|
|
1531
|
+
"key": "hold_window",
|
|
1532
|
+
"kind": "window",
|
|
1533
|
+
"maxOffset": "P7D",
|
|
1534
|
+
"summary": "Grace beyond the held expiry timestamp: moves the confirm cutoff and the expire sweep together.",
|
|
1535
|
+
"title": "Hold window"
|
|
1536
|
+
},
|
|
1537
|
+
{
|
|
1538
|
+
"action": "confirm",
|
|
1539
|
+
"key": "supplier_decision_deadline_ms",
|
|
1540
|
+
"kind": "decision_deadline_ms",
|
|
1541
|
+
"minMs": 1000,
|
|
1542
|
+
"summary": "How long confirm waits for the lodging supplier's just-in-time decision before the timeout default applies.",
|
|
1543
|
+
"title": "Supplier decision deadline"
|
|
1544
|
+
},
|
|
1545
|
+
{
|
|
1546
|
+
"key": "cancellation_penalty",
|
|
1547
|
+
"kind": "unwind_penalty",
|
|
1548
|
+
"summary": "Replaces the free-cancel window tiers cancellations are quoted against.",
|
|
1549
|
+
"title": "Cancellation penalty schedule"
|
|
1550
|
+
}
|
|
1551
|
+
],
|
|
1359
1552
|
"fields": {
|
|
1360
|
-
"
|
|
1553
|
+
"checkInAt": {
|
|
1361
1554
|
"format": "hyperscale-date-time",
|
|
1362
1555
|
"type": "string"
|
|
1363
1556
|
},
|
|
1364
|
-
"
|
|
1365
|
-
"
|
|
1366
|
-
"minLength": 1,
|
|
1557
|
+
"checkOutAt": {
|
|
1558
|
+
"format": "hyperscale-date-time",
|
|
1367
1559
|
"type": "string"
|
|
1368
1560
|
},
|
|
1369
|
-
"
|
|
1561
|
+
"currency": {
|
|
1562
|
+
"description": "ISO 4217 currency code",
|
|
1563
|
+
"maxLength": 3,
|
|
1564
|
+
"minLength": 3,
|
|
1565
|
+
"pattern": "^[A-Z]{3}$",
|
|
1566
|
+
"type": "string"
|
|
1567
|
+
},
|
|
1568
|
+
"guestAccountId": {
|
|
1569
|
+
"description": "Hyperscale account ID",
|
|
1570
|
+
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
1571
|
+
"type": "string",
|
|
1572
|
+
"x-hyperscale-reference-filter": {
|
|
1573
|
+
"column": "role",
|
|
1574
|
+
"values": [
|
|
1575
|
+
"customer_balance"
|
|
1576
|
+
]
|
|
1577
|
+
}
|
|
1578
|
+
},
|
|
1579
|
+
"holdExpiresAt": {
|
|
1580
|
+
"format": "hyperscale-date-time",
|
|
1581
|
+
"type": "string"
|
|
1582
|
+
},
|
|
1583
|
+
"propertyAccountId": {
|
|
1370
1584
|
"description": "Hyperscale account ID",
|
|
1371
1585
|
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
1372
1586
|
"type": "string",
|
|
@@ -1376,75 +1590,213 @@
|
|
|
1376
1590
|
"customer_balance"
|
|
1377
1591
|
]
|
|
1378
1592
|
}
|
|
1593
|
+
},
|
|
1594
|
+
"rateAmount": {
|
|
1595
|
+
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
1596
|
+
"pattern": "^[1-9][0-9]{0,17}$",
|
|
1597
|
+
"type": "string"
|
|
1598
|
+
},
|
|
1599
|
+
"stayNote": {
|
|
1600
|
+
"maxLength": 180,
|
|
1601
|
+
"minLength": 1,
|
|
1602
|
+
"type": "string"
|
|
1603
|
+
},
|
|
1604
|
+
"travelPackageId": {
|
|
1605
|
+
"description": "Travel package this stay is a leg of",
|
|
1606
|
+
"pattern": "^tpkg_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
1607
|
+
"type": "string"
|
|
1379
1608
|
}
|
|
1380
1609
|
},
|
|
1381
|
-
"id": "
|
|
1382
|
-
"idPrefix": "
|
|
1610
|
+
"id": "hotel_stay",
|
|
1611
|
+
"idPrefix": "hstay",
|
|
1383
1612
|
"lifecycle": {
|
|
1384
|
-
"initial": "
|
|
1613
|
+
"initial": "held",
|
|
1385
1614
|
"states": [
|
|
1386
|
-
"
|
|
1387
|
-
"
|
|
1388
|
-
"
|
|
1389
|
-
"
|
|
1615
|
+
"held",
|
|
1616
|
+
"released",
|
|
1617
|
+
"confirmed",
|
|
1618
|
+
"cancel_quoted",
|
|
1619
|
+
"completed",
|
|
1620
|
+
"canceled",
|
|
1621
|
+
"penalty_collected",
|
|
1622
|
+
"package_canceled",
|
|
1623
|
+
"expired"
|
|
1390
1624
|
],
|
|
1391
1625
|
"transitions": {
|
|
1392
|
-
"
|
|
1626
|
+
"amend_collect": {
|
|
1393
1627
|
"from": [
|
|
1394
|
-
"
|
|
1628
|
+
"confirmed"
|
|
1395
1629
|
],
|
|
1396
|
-
"to": "
|
|
1630
|
+
"to": "confirmed"
|
|
1631
|
+
},
|
|
1632
|
+
"amend_fee": {
|
|
1633
|
+
"from": [
|
|
1634
|
+
"confirmed"
|
|
1635
|
+
],
|
|
1636
|
+
"to": "confirmed"
|
|
1637
|
+
},
|
|
1638
|
+
"amend_refund": {
|
|
1639
|
+
"from": [
|
|
1640
|
+
"confirmed"
|
|
1641
|
+
],
|
|
1642
|
+
"to": "confirmed"
|
|
1643
|
+
},
|
|
1644
|
+
"cancel_confirm": {
|
|
1645
|
+
"from": [
|
|
1646
|
+
"cancel_quoted"
|
|
1647
|
+
],
|
|
1648
|
+
"to": "canceled"
|
|
1649
|
+
},
|
|
1650
|
+
"cancel_quote": {
|
|
1651
|
+
"from": [
|
|
1652
|
+
"confirmed"
|
|
1653
|
+
],
|
|
1654
|
+
"to": "cancel_quoted"
|
|
1655
|
+
},
|
|
1656
|
+
"collect_penalty": {
|
|
1657
|
+
"from": [
|
|
1658
|
+
"canceled"
|
|
1659
|
+
],
|
|
1660
|
+
"to": "penalty_collected"
|
|
1397
1661
|
},
|
|
1398
1662
|
"complete": {
|
|
1399
1663
|
"from": [
|
|
1400
|
-
"
|
|
1664
|
+
"confirmed",
|
|
1665
|
+
"cancel_quoted"
|
|
1401
1666
|
],
|
|
1402
1667
|
"to": "completed"
|
|
1403
1668
|
},
|
|
1404
1669
|
"confirm": {
|
|
1405
1670
|
"from": [
|
|
1406
|
-
"
|
|
1671
|
+
"held"
|
|
1407
1672
|
],
|
|
1408
|
-
"to": "
|
|
1673
|
+
"to": "confirmed"
|
|
1674
|
+
},
|
|
1675
|
+
"expire": {
|
|
1676
|
+
"from": [
|
|
1677
|
+
"held"
|
|
1678
|
+
],
|
|
1679
|
+
"to": "expired"
|
|
1680
|
+
},
|
|
1681
|
+
"package_cancel": {
|
|
1682
|
+
"from": [
|
|
1683
|
+
"confirmed",
|
|
1684
|
+
"cancel_quoted"
|
|
1685
|
+
],
|
|
1686
|
+
"to": "package_canceled"
|
|
1687
|
+
},
|
|
1688
|
+
"release": {
|
|
1689
|
+
"from": [
|
|
1690
|
+
"held"
|
|
1691
|
+
],
|
|
1692
|
+
"to": "released"
|
|
1409
1693
|
}
|
|
1410
1694
|
}
|
|
1411
1695
|
},
|
|
1696
|
+
"nav": [
|
|
1697
|
+
"Blueprints",
|
|
1698
|
+
"Hotel Stays"
|
|
1699
|
+
],
|
|
1412
1700
|
"parties": {
|
|
1413
|
-
"
|
|
1701
|
+
"beneficiary": "propertyAccountId",
|
|
1702
|
+
"payer": "guestAccountId"
|
|
1414
1703
|
},
|
|
1415
1704
|
"required": [
|
|
1416
|
-
"
|
|
1417
|
-
"
|
|
1705
|
+
"guestAccountId",
|
|
1706
|
+
"propertyAccountId",
|
|
1707
|
+
"rateAmount",
|
|
1708
|
+
"currency",
|
|
1709
|
+
"holdExpiresAt",
|
|
1710
|
+
"checkInAt",
|
|
1711
|
+
"checkOutAt"
|
|
1418
1712
|
],
|
|
1419
1713
|
"subject": {
|
|
1420
1714
|
"kinds": [
|
|
1421
|
-
"
|
|
1715
|
+
"lodging_stay"
|
|
1422
1716
|
]
|
|
1423
1717
|
},
|
|
1424
|
-
"summary": "
|
|
1425
|
-
"
|
|
1426
|
-
"
|
|
1718
|
+
"summary": "Held-then-confirmed hotel stay settled on a supplier decision.",
|
|
1719
|
+
"templateId": "lodging",
|
|
1720
|
+
"title": "Hotel stay",
|
|
1721
|
+
"update": {
|
|
1722
|
+
"fields": [
|
|
1723
|
+
"checkInAt",
|
|
1724
|
+
"checkOutAt",
|
|
1725
|
+
"stayNote"
|
|
1726
|
+
],
|
|
1727
|
+
"states": [
|
|
1728
|
+
"held",
|
|
1729
|
+
"confirmed"
|
|
1730
|
+
]
|
|
1731
|
+
}
|
|
1732
|
+
},
|
|
1733
|
+
{
|
|
1734
|
+
"actionOrder": [
|
|
1735
|
+
"create",
|
|
1736
|
+
"confirm",
|
|
1737
|
+
"cancel",
|
|
1738
|
+
"complete"
|
|
1739
|
+
],
|
|
1740
|
+
"actions": {
|
|
1427
1741
|
"cancel": {
|
|
1428
|
-
"
|
|
1742
|
+
"agentDescription": "Cancel a booked trip. This call is what triggers the refunds: every confirmed leg becomes due for its own package_cancel and returns its full reserve. The package itself moves nothing. A cancelled package cannot go back to booked.",
|
|
1743
|
+
"description": "Cancels the bundled trip as one pure transition. The refunds are the legs' own: each confirmed flight booking and hotel stay referencing this package becomes due for its package_cancel action under the parent-status gate and refunds its full reserve as its own receipted operation.",
|
|
1744
|
+
"examples": [
|
|
1745
|
+
{
|
|
1746
|
+
"input": {
|
|
1747
|
+
"tenantId": "ten_sandbox_travel000001",
|
|
1748
|
+
"travelPackageId": "tpkg_sandbox_getaway00001"
|
|
1749
|
+
},
|
|
1750
|
+
"name": "cancel_booked_package"
|
|
1751
|
+
}
|
|
1752
|
+
],
|
|
1429
1753
|
"moves": [],
|
|
1430
1754
|
"steps": [],
|
|
1431
1755
|
"summary": "Cancel a booked travel package"
|
|
1432
1756
|
},
|
|
1433
1757
|
"complete": {
|
|
1434
|
-
"
|
|
1758
|
+
"agentDescription": "Close a booked trip that has already run. No money moves, because the legs paid their operators at departure and checkout. Use this rather than cancel when the traveler actually flew.",
|
|
1759
|
+
"description": "Closes a booked package once the trip has run. Pure transition: the legs' own departure and checkout due actions already paid their operators from their reserves.",
|
|
1760
|
+
"examples": [
|
|
1761
|
+
{
|
|
1762
|
+
"input": {
|
|
1763
|
+
"tenantId": "ten_sandbox_travel000001",
|
|
1764
|
+
"travelPackageId": "tpkg_sandbox_getaway00001"
|
|
1765
|
+
},
|
|
1766
|
+
"name": "complete_delivered_package"
|
|
1767
|
+
}
|
|
1768
|
+
],
|
|
1435
1769
|
"moves": [],
|
|
1436
1770
|
"steps": [],
|
|
1437
1771
|
"summary": "Complete a delivered travel package"
|
|
1438
1772
|
},
|
|
1439
1773
|
"confirm": {
|
|
1774
|
+
"agentDescription": "Book the whole trip. Refused with 409 aggregate_condition_unmet while any flight booking or hotel stay on this package is in any status but confirmed. No money moves here, because each leg already settled its fare into its own reserve at its own confirm.",
|
|
1440
1775
|
"description": "Books the package once every linked leg has confirmed: refused (409 aggregate_condition_unmet) while any flight booking or hotel stay referencing this package is in any status but confirmed. Booking the package moves no money -- each leg's fare or rate already settled into that leg's own reserve at its own confirm.",
|
|
1776
|
+
"effects": {
|
|
1777
|
+
"reads": [
|
|
1778
|
+
{
|
|
1779
|
+
"signature": "reads.requires_aggregate",
|
|
1780
|
+
"source": "requiresAggregate"
|
|
1781
|
+
}
|
|
1782
|
+
]
|
|
1783
|
+
},
|
|
1784
|
+
"examples": [
|
|
1785
|
+
{
|
|
1786
|
+
"input": {
|
|
1787
|
+
"tenantId": "ten_sandbox_travel000001",
|
|
1788
|
+
"travelPackageId": "tpkg_sandbox_getaway00001"
|
|
1789
|
+
},
|
|
1790
|
+
"name": "book_confirmed_package"
|
|
1791
|
+
}
|
|
1792
|
+
],
|
|
1441
1793
|
"moves": [],
|
|
1442
1794
|
"requiresAggregate": [
|
|
1443
1795
|
{
|
|
1444
1796
|
"check": {
|
|
1445
1797
|
"kind": "all_in"
|
|
1446
1798
|
},
|
|
1447
|
-
"
|
|
1799
|
+
"instrumentId": "flight_booking",
|
|
1448
1800
|
"over": "children",
|
|
1449
1801
|
"refField": "travelPackageId",
|
|
1450
1802
|
"statuses": [
|
|
@@ -1455,7 +1807,7 @@
|
|
|
1455
1807
|
"check": {
|
|
1456
1808
|
"kind": "all_in"
|
|
1457
1809
|
},
|
|
1458
|
-
"
|
|
1810
|
+
"instrumentId": "hotel_stay",
|
|
1459
1811
|
"over": "children",
|
|
1460
1812
|
"refField": "travelPackageId",
|
|
1461
1813
|
"statuses": [
|
|
@@ -1467,6 +1819,7 @@
|
|
|
1467
1819
|
"summary": "Confirm a travel package"
|
|
1468
1820
|
},
|
|
1469
1821
|
"create": {
|
|
1822
|
+
"agentDescription": "Open a draft trip for one traveler party and name the payer account the legs will settle against. No money moves and no account is provisioned. Add flight bookings and hotel stays against the returned package ID before confirming.",
|
|
1470
1823
|
"description": "Opens the bundled trip for one traveler party and names the payer the legs will settle against. No money moves and no account is provisioned: every transfer of the trip belongs to a linked flight booking or hotel stay.",
|
|
1471
1824
|
"examples": [
|
|
1472
1825
|
{
|
|
@@ -1474,7 +1827,9 @@
|
|
|
1474
1827
|
"departAt": "2026-09-01T21:00:00.000Z",
|
|
1475
1828
|
"memo": "Jeddah corniche long weekend.",
|
|
1476
1829
|
"payerAccountId": "acct_sandbox_traveler0001",
|
|
1477
|
-
"
|
|
1830
|
+
"productId": "prd_sandbox_travel000001",
|
|
1831
|
+
"subject": "sbj_sandbox_travelparty01",
|
|
1832
|
+
"tenantId": "ten_sandbox_travel000001"
|
|
1478
1833
|
},
|
|
1479
1834
|
"name": "draft_jeddah_getaway"
|
|
1480
1835
|
}
|
|
@@ -1483,89 +1838,24 @@
|
|
|
1483
1838
|
"steps": [],
|
|
1484
1839
|
"summary": "Draft a travel package"
|
|
1485
1840
|
}
|
|
1486
|
-
}
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
"childRefField": "policyId",
|
|
1494
|
-
"childStatuses": [
|
|
1495
|
-
"filed",
|
|
1496
|
-
"assessed",
|
|
1497
|
-
"approved",
|
|
1498
|
-
"paid"
|
|
1499
|
-
],
|
|
1500
|
-
"parentField": "coverageLimit"
|
|
1501
|
-
}
|
|
1502
|
-
],
|
|
1503
|
-
"description": "A policy quotes protection over one subject, binds after a carrier decision, activates at its declared start, and expires at term. Premium remains refundable while bound but not active; activation pays the insurer and opens the policy to claims.",
|
|
1841
|
+
},
|
|
1842
|
+
"agentDescription": "Reach for travel package when one traveler's flight bookings and hotel stays have to confirm or cancel as a single trip. The package never moves money itself. Each leg holds its own fare or rate in its own reserve and pays or refunds it on its own actions.",
|
|
1843
|
+
"callerParkedStates": {
|
|
1844
|
+
"booked": "the operator completes a delivered trip or cancels it; the legs' own due actions carry the money either way",
|
|
1845
|
+
"draft": "confirming the package is the operator's decision once every leg has settled its own reserve"
|
|
1846
|
+
},
|
|
1847
|
+
"description": "A travel package drafts a bundled trip for one traveler party. Confirming it is refused while any linked flight booking or hotel stay is not yet confirmed, so a booked package always means every leg's money is settled in its own reserve. Cancelling a booked package flips the status each leg's own package-cancel refund waits on, and completion closes a delivered trip. The package itself never moves money.",
|
|
1504
1848
|
"fields": {
|
|
1505
|
-
"
|
|
1506
|
-
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
1507
|
-
"pattern": "^[1-9][0-9]{0,17}$",
|
|
1508
|
-
"type": "string"
|
|
1509
|
-
},
|
|
1510
|
-
"currency": {
|
|
1511
|
-
"description": "ISO 4217 currency code",
|
|
1512
|
-
"maxLength": 3,
|
|
1513
|
-
"minLength": 3,
|
|
1514
|
-
"pattern": "^[A-Z]{3}$",
|
|
1515
|
-
"type": "string"
|
|
1516
|
-
},
|
|
1517
|
-
"expiresAt": {
|
|
1849
|
+
"departAt": {
|
|
1518
1850
|
"format": "hyperscale-date-time",
|
|
1519
1851
|
"type": "string"
|
|
1520
1852
|
},
|
|
1521
|
-
"
|
|
1522
|
-
"
|
|
1523
|
-
"
|
|
1524
|
-
"type": "string"
|
|
1525
|
-
"x-hyperscale-reference-filter": {
|
|
1526
|
-
"column": "role",
|
|
1527
|
-
"values": [
|
|
1528
|
-
"customer_balance"
|
|
1529
|
-
]
|
|
1530
|
-
}
|
|
1531
|
-
},
|
|
1532
|
-
"perilSchedule": {
|
|
1533
|
-
"items": {
|
|
1534
|
-
"additionalProperties": false,
|
|
1535
|
-
"properties": {
|
|
1536
|
-
"deductibleBps": {
|
|
1537
|
-
"maximum": 10000,
|
|
1538
|
-
"minimum": 0,
|
|
1539
|
-
"type": "integer"
|
|
1540
|
-
},
|
|
1541
|
-
"limitAmount": {
|
|
1542
|
-
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
1543
|
-
"pattern": "^[1-9][0-9]{0,17}$",
|
|
1544
|
-
"type": "string"
|
|
1545
|
-
},
|
|
1546
|
-
"peril": {
|
|
1547
|
-
"pattern": "^[a-z][a-z0-9_]{1,79}$",
|
|
1548
|
-
"type": "string"
|
|
1549
|
-
},
|
|
1550
|
-
"waitingPeriodDays": {
|
|
1551
|
-
"maximum": 3650,
|
|
1552
|
-
"minimum": 0,
|
|
1553
|
-
"type": "integer"
|
|
1554
|
-
}
|
|
1555
|
-
},
|
|
1556
|
-
"required": [
|
|
1557
|
-
"peril",
|
|
1558
|
-
"limitAmount",
|
|
1559
|
-
"deductibleBps",
|
|
1560
|
-
"waitingPeriodDays"
|
|
1561
|
-
],
|
|
1562
|
-
"type": "object"
|
|
1563
|
-
},
|
|
1564
|
-
"maxItems": 24,
|
|
1565
|
-
"minItems": 1,
|
|
1566
|
-
"type": "array"
|
|
1853
|
+
"memo": {
|
|
1854
|
+
"maxLength": 180,
|
|
1855
|
+
"minLength": 1,
|
|
1856
|
+
"type": "string"
|
|
1567
1857
|
},
|
|
1568
|
-
"
|
|
1858
|
+
"payerAccountId": {
|
|
1569
1859
|
"description": "Hyperscale account ID",
|
|
1570
1860
|
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
1571
1861
|
"type": "string",
|
|
@@ -1575,140 +1865,100 @@
|
|
|
1575
1865
|
"customer_balance"
|
|
1576
1866
|
]
|
|
1577
1867
|
}
|
|
1578
|
-
},
|
|
1579
|
-
"premiumAmount": {
|
|
1580
|
-
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
1581
|
-
"pattern": "^[1-9][0-9]{0,17}$",
|
|
1582
|
-
"type": "string"
|
|
1583
|
-
},
|
|
1584
|
-
"renewalOfPolicyId": {
|
|
1585
|
-
"description": "Prior policy this quote renews; the prior term must be active or already expired",
|
|
1586
|
-
"pattern": "^pol_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
1587
|
-
"type": "string"
|
|
1588
|
-
},
|
|
1589
|
-
"startsAt": {
|
|
1590
|
-
"format": "hyperscale-date-time",
|
|
1591
|
-
"type": "string"
|
|
1592
|
-
},
|
|
1593
|
-
"termsSummary": {
|
|
1594
|
-
"maxLength": 1000,
|
|
1595
|
-
"minLength": 1,
|
|
1596
|
-
"type": "string"
|
|
1597
1868
|
}
|
|
1598
1869
|
},
|
|
1599
|
-
"id": "
|
|
1600
|
-
"idPrefix": "
|
|
1870
|
+
"id": "travel_package",
|
|
1871
|
+
"idPrefix": "tpkg",
|
|
1601
1872
|
"lifecycle": {
|
|
1602
|
-
"initial": "
|
|
1873
|
+
"initial": "draft",
|
|
1603
1874
|
"states": [
|
|
1604
|
-
"
|
|
1605
|
-
"
|
|
1606
|
-
"
|
|
1607
|
-
"
|
|
1608
|
-
"canceled",
|
|
1609
|
-
"expired"
|
|
1875
|
+
"draft",
|
|
1876
|
+
"booked",
|
|
1877
|
+
"completed",
|
|
1878
|
+
"cancelled"
|
|
1610
1879
|
],
|
|
1611
1880
|
"transitions": {
|
|
1612
|
-
"activate": {
|
|
1613
|
-
"from": [
|
|
1614
|
-
"bound"
|
|
1615
|
-
],
|
|
1616
|
-
"to": "active"
|
|
1617
|
-
},
|
|
1618
|
-
"bind": {
|
|
1619
|
-
"from": [
|
|
1620
|
-
"quoted"
|
|
1621
|
-
],
|
|
1622
|
-
"to": "bound"
|
|
1623
|
-
},
|
|
1624
1881
|
"cancel": {
|
|
1625
1882
|
"from": [
|
|
1626
|
-
"
|
|
1627
|
-
],
|
|
1628
|
-
"to": "canceled"
|
|
1629
|
-
},
|
|
1630
|
-
"endorse": {
|
|
1631
|
-
"from": [
|
|
1632
|
-
"active"
|
|
1633
|
-
],
|
|
1634
|
-
"to": "active"
|
|
1635
|
-
},
|
|
1636
|
-
"expire": {
|
|
1637
|
-
"from": [
|
|
1638
|
-
"active"
|
|
1883
|
+
"booked"
|
|
1639
1884
|
],
|
|
1640
|
-
"to": "
|
|
1885
|
+
"to": "cancelled"
|
|
1641
1886
|
},
|
|
1642
|
-
"
|
|
1887
|
+
"complete": {
|
|
1643
1888
|
"from": [
|
|
1644
|
-
"
|
|
1889
|
+
"booked"
|
|
1645
1890
|
],
|
|
1646
|
-
"to": "
|
|
1891
|
+
"to": "completed"
|
|
1647
1892
|
},
|
|
1648
|
-
"
|
|
1893
|
+
"confirm": {
|
|
1649
1894
|
"from": [
|
|
1650
|
-
"
|
|
1895
|
+
"draft"
|
|
1651
1896
|
],
|
|
1652
|
-
"to": "
|
|
1897
|
+
"to": "booked"
|
|
1653
1898
|
}
|
|
1654
1899
|
}
|
|
1655
1900
|
},
|
|
1901
|
+
"nav": [
|
|
1902
|
+
"Blueprints",
|
|
1903
|
+
"Travel Packages"
|
|
1904
|
+
],
|
|
1656
1905
|
"parties": {
|
|
1657
|
-
"
|
|
1658
|
-
"payer": "policyholderAccountId"
|
|
1906
|
+
"payer": "payerAccountId"
|
|
1659
1907
|
},
|
|
1660
1908
|
"required": [
|
|
1661
|
-
"
|
|
1662
|
-
"
|
|
1663
|
-
"premiumAmount",
|
|
1664
|
-
"coverageLimit",
|
|
1665
|
-
"currency",
|
|
1666
|
-
"startsAt",
|
|
1667
|
-
"expiresAt",
|
|
1668
|
-
"perilSchedule"
|
|
1909
|
+
"payerAccountId",
|
|
1910
|
+
"departAt"
|
|
1669
1911
|
],
|
|
1670
1912
|
"subject": {
|
|
1671
1913
|
"kinds": [
|
|
1672
|
-
"
|
|
1673
|
-
"flight_itinerary",
|
|
1674
|
-
"lodging_stay",
|
|
1675
|
-
"vehicle",
|
|
1676
|
-
"pet",
|
|
1677
|
-
"traveler_party",
|
|
1678
|
-
"employee_census"
|
|
1679
|
-
]
|
|
1680
|
-
},
|
|
1681
|
-
"summary": "Carrier-backed protection over one declared-value subject.",
|
|
1682
|
-
"title": "Policy",
|
|
1683
|
-
"unwind": {
|
|
1684
|
-
"confirm": "cancel",
|
|
1685
|
-
"penalty": [
|
|
1686
|
-
{
|
|
1687
|
-
"bps": 0
|
|
1688
|
-
}
|
|
1689
|
-
],
|
|
1690
|
-
"quote": "preview",
|
|
1691
|
-
"refundDestinationField": "policyholderAccountId",
|
|
1692
|
-
"refundableField": "premiumAmount"
|
|
1693
|
-
},
|
|
1694
|
-
"update": {
|
|
1695
|
-
"fields": [
|
|
1696
|
-
"startsAt",
|
|
1697
|
-
"expiresAt",
|
|
1698
|
-
"perilSchedule",
|
|
1699
|
-
"termsSummary"
|
|
1700
|
-
],
|
|
1701
|
-
"states": [
|
|
1702
|
-
"quoted"
|
|
1914
|
+
"traveler_party"
|
|
1703
1915
|
]
|
|
1704
1916
|
},
|
|
1705
|
-
"
|
|
1917
|
+
"summary": "One bundled trip whose flight and hotel legs confirm together.",
|
|
1918
|
+
"templateId": "air_travel",
|
|
1919
|
+
"title": "Travel package"
|
|
1920
|
+
},
|
|
1921
|
+
{
|
|
1922
|
+
"actionOrder": [
|
|
1923
|
+
"create",
|
|
1924
|
+
"bind",
|
|
1925
|
+
"activate",
|
|
1926
|
+
"preview",
|
|
1927
|
+
"cancel",
|
|
1928
|
+
"withdraw",
|
|
1929
|
+
"endorse",
|
|
1930
|
+
"expire"
|
|
1931
|
+
],
|
|
1932
|
+
"actions": {
|
|
1706
1933
|
"activate": {
|
|
1707
1934
|
"description": "Starts cover at the declared time and pays the held premium to the insurer under the machine principal.",
|
|
1708
1935
|
"due": {
|
|
1709
1936
|
"field": "startsAt"
|
|
1710
1937
|
},
|
|
1711
1938
|
"earnable": true,
|
|
1939
|
+
"effects": {
|
|
1940
|
+
"moves": [
|
|
1941
|
+
{
|
|
1942
|
+
"signature": "moves.transfer.internal",
|
|
1943
|
+
"source": "moves[0]"
|
|
1944
|
+
}
|
|
1945
|
+
],
|
|
1946
|
+
"schedules": [
|
|
1947
|
+
{
|
|
1948
|
+
"signature": "schedules.due",
|
|
1949
|
+
"source": "due"
|
|
1950
|
+
}
|
|
1951
|
+
]
|
|
1952
|
+
},
|
|
1953
|
+
"examples": [
|
|
1954
|
+
{
|
|
1955
|
+
"input": {
|
|
1956
|
+
"policyId": "pol_sandbox_protection001",
|
|
1957
|
+
"tenantId": "ten_sandbox_protection01"
|
|
1958
|
+
},
|
|
1959
|
+
"name": "activate_cover_at_start"
|
|
1960
|
+
}
|
|
1961
|
+
],
|
|
1712
1962
|
"moves": [
|
|
1713
1963
|
{
|
|
1714
1964
|
"bind": {
|
|
@@ -1724,13 +1974,13 @@
|
|
|
1724
1974
|
"from": "instance",
|
|
1725
1975
|
"path": "fields.insurerAccountId"
|
|
1726
1976
|
},
|
|
1727
|
-
"
|
|
1977
|
+
"productId": {
|
|
1728
1978
|
"from": "instance",
|
|
1729
|
-
"path": "
|
|
1979
|
+
"path": "productId"
|
|
1730
1980
|
},
|
|
1731
|
-
"
|
|
1981
|
+
"sourceAccountId": {
|
|
1732
1982
|
"from": "instance",
|
|
1733
|
-
"path": "
|
|
1983
|
+
"path": "refs.premiumReserveAccountId"
|
|
1734
1984
|
}
|
|
1735
1985
|
},
|
|
1736
1986
|
"capture": {
|
|
@@ -1744,13 +1994,37 @@
|
|
|
1744
1994
|
"summary": "Activate a policy"
|
|
1745
1995
|
},
|
|
1746
1996
|
"bind": {
|
|
1997
|
+
"agentDescription": "Ask the carrier to accept the risk under a 15 second deadline, where a timeout declines, then move the full premium from the policyholder into the policy's premium reserve. Only a quoted policy binds. Cover is not live yet. Activation happens at startsAt. This moves the policyholder's money.",
|
|
1747
1998
|
"decision": {
|
|
1748
1999
|
"capability": "insurance_carrier",
|
|
1749
2000
|
"deadlineMs": 15000,
|
|
1750
2001
|
"onTimeout": "decline"
|
|
1751
2002
|
},
|
|
1752
2003
|
"description": "Asks the carrier to accept the risk, then moves the premium into its dedicated reserve until cover starts.",
|
|
2004
|
+
"effects": {
|
|
2005
|
+
"decides": [
|
|
2006
|
+
{
|
|
2007
|
+
"signature": "decides.insurance_carrier",
|
|
2008
|
+
"source": "decision"
|
|
2009
|
+
}
|
|
2010
|
+
],
|
|
2011
|
+
"moves": [
|
|
2012
|
+
{
|
|
2013
|
+
"signature": "moves.transfer.internal",
|
|
2014
|
+
"source": "moves[0]"
|
|
2015
|
+
}
|
|
2016
|
+
]
|
|
2017
|
+
},
|
|
1753
2018
|
"eventName": "policy.bound",
|
|
2019
|
+
"examples": [
|
|
2020
|
+
{
|
|
2021
|
+
"input": {
|
|
2022
|
+
"policyId": "pol_sandbox_protection001",
|
|
2023
|
+
"tenantId": "ten_sandbox_protection01"
|
|
2024
|
+
},
|
|
2025
|
+
"name": "bind_carrier_accepted_risk"
|
|
2026
|
+
}
|
|
2027
|
+
],
|
|
1754
2028
|
"moves": [
|
|
1755
2029
|
{
|
|
1756
2030
|
"bind": {
|
|
@@ -1764,15 +2038,15 @@
|
|
|
1764
2038
|
},
|
|
1765
2039
|
"destinationAccountId": {
|
|
1766
2040
|
"from": "instance",
|
|
1767
|
-
"path": "refs.premiumReserveAccountId"
|
|
2041
|
+
"path": "refs.premiumReserveAccountId"
|
|
2042
|
+
},
|
|
2043
|
+
"productId": {
|
|
2044
|
+
"from": "instance",
|
|
2045
|
+
"path": "productId"
|
|
1768
2046
|
},
|
|
1769
2047
|
"sourceAccountId": {
|
|
1770
2048
|
"from": "instance",
|
|
1771
2049
|
"path": "fields.policyholderAccountId"
|
|
1772
|
-
},
|
|
1773
|
-
"workspaceId": {
|
|
1774
|
-
"from": "instance",
|
|
1775
|
-
"path": "workspaceId"
|
|
1776
2050
|
}
|
|
1777
2051
|
},
|
|
1778
2052
|
"capture": {
|
|
@@ -1786,7 +2060,26 @@
|
|
|
1786
2060
|
"summary": "Bind a policy"
|
|
1787
2061
|
},
|
|
1788
2062
|
"cancel": {
|
|
2063
|
+
"agentDescription": "Confirm the previewed cancellation and return the entire reserved premium to the policyholder. It requires preview first and only works before cover activates. This moves money and does not reverse. An active policy has no cancellation path and runs to its expiry.",
|
|
2064
|
+
"commit": "preview",
|
|
1789
2065
|
"description": "Confirms the previewed cancellation and returns the entire reserved premium to the policyholder before cover starts.",
|
|
2066
|
+
"effects": {
|
|
2067
|
+
"moves": [
|
|
2068
|
+
{
|
|
2069
|
+
"signature": "moves.transfer.internal",
|
|
2070
|
+
"source": "moves[0]"
|
|
2071
|
+
}
|
|
2072
|
+
]
|
|
2073
|
+
},
|
|
2074
|
+
"examples": [
|
|
2075
|
+
{
|
|
2076
|
+
"input": {
|
|
2077
|
+
"policyId": "pol_sandbox_protection001",
|
|
2078
|
+
"tenantId": "ten_sandbox_protection01"
|
|
2079
|
+
},
|
|
2080
|
+
"name": "confirm_pre_activation_cancel"
|
|
2081
|
+
}
|
|
2082
|
+
],
|
|
1790
2083
|
"moves": [
|
|
1791
2084
|
{
|
|
1792
2085
|
"bind": {
|
|
@@ -1802,13 +2095,13 @@
|
|
|
1802
2095
|
"from": "instance",
|
|
1803
2096
|
"path": "fields.policyholderAccountId"
|
|
1804
2097
|
},
|
|
1805
|
-
"
|
|
2098
|
+
"productId": {
|
|
1806
2099
|
"from": "instance",
|
|
1807
|
-
"path": "
|
|
2100
|
+
"path": "productId"
|
|
1808
2101
|
},
|
|
1809
|
-
"
|
|
2102
|
+
"sourceAccountId": {
|
|
1810
2103
|
"from": "instance",
|
|
1811
|
-
"path": "
|
|
2104
|
+
"path": "refs.premiumReserveAccountId"
|
|
1812
2105
|
}
|
|
1813
2106
|
},
|
|
1814
2107
|
"capture": {
|
|
@@ -1822,7 +2115,16 @@
|
|
|
1822
2115
|
"summary": "Cancel a policy"
|
|
1823
2116
|
},
|
|
1824
2117
|
"create": {
|
|
2118
|
+
"agentDescription": "Open a quote against one declared-value subject with its premium, coverage limit, peril schedule, and term, and provision the premium reserve. No premium moves. A renewal may name the prior policy only while that prior term is active or already expired.",
|
|
1825
2119
|
"description": "Creates a quote against one declared-value risk and provisions the premium reserve. No premium moves until the carrier binds.",
|
|
2120
|
+
"effects": {
|
|
2121
|
+
"reads": [
|
|
2122
|
+
{
|
|
2123
|
+
"signature": "reads.requires_refs",
|
|
2124
|
+
"source": "requiresRefs"
|
|
2125
|
+
}
|
|
2126
|
+
]
|
|
2127
|
+
},
|
|
1826
2128
|
"eventName": "policy.quoted",
|
|
1827
2129
|
"examples": [
|
|
1828
2130
|
{
|
|
@@ -1847,8 +2149,10 @@
|
|
|
1847
2149
|
],
|
|
1848
2150
|
"policyholderAccountId": "acct_sandbox_holder00001",
|
|
1849
2151
|
"premiumAmount": "12500",
|
|
2152
|
+
"productId": "prd_sandbox_protection01",
|
|
1850
2153
|
"startsAt": "2026-08-01T00:00:00.000Z",
|
|
1851
2154
|
"subject": "sbj_sandbox_protection001",
|
|
2155
|
+
"tenantId": "ten_sandbox_protection01",
|
|
1852
2156
|
"termsSummary": "Annual cover for accidental damage and theft."
|
|
1853
2157
|
},
|
|
1854
2158
|
"name": "quote_asset_protection"
|
|
@@ -1874,19 +2178,19 @@
|
|
|
1874
2178
|
},
|
|
1875
2179
|
"owner.id": {
|
|
1876
2180
|
"from": "instance",
|
|
1877
|
-
"path": "
|
|
2181
|
+
"path": "productId"
|
|
1878
2182
|
},
|
|
1879
2183
|
"owner.type": {
|
|
1880
2184
|
"from": "const",
|
|
1881
|
-
"value": "
|
|
2185
|
+
"value": "product"
|
|
2186
|
+
},
|
|
2187
|
+
"productId": {
|
|
2188
|
+
"from": "instance",
|
|
2189
|
+
"path": "productId"
|
|
1882
2190
|
},
|
|
1883
2191
|
"role": {
|
|
1884
2192
|
"from": "const",
|
|
1885
|
-
"value": "
|
|
1886
|
-
},
|
|
1887
|
-
"workspaceId": {
|
|
1888
|
-
"from": "instance",
|
|
1889
|
-
"path": "workspaceId"
|
|
2193
|
+
"value": "product_escrow"
|
|
1890
2194
|
}
|
|
1891
2195
|
},
|
|
1892
2196
|
"capture": {
|
|
@@ -1898,16 +2202,27 @@
|
|
|
1898
2202
|
"summary": "Quote a policy"
|
|
1899
2203
|
},
|
|
1900
2204
|
"endorse": {
|
|
2205
|
+
"agentDescription": "Rewrite the peril schedule, terms summary, or expiry on active cover. The carrier approves under a 15 second deadline and a timeout declines. No premium moves, because mid-term repricing is not modeled. A change that should reprice the cover needs a new policy.",
|
|
1901
2206
|
"decision": {
|
|
1902
2207
|
"capability": "insurance_carrier",
|
|
1903
2208
|
"deadlineMs": 15000,
|
|
1904
2209
|
"onTimeout": "decline"
|
|
1905
2210
|
},
|
|
1906
2211
|
"description": "Applies a carrier-approved mid-term change to active cover: the peril schedule, terms summary, or expiry may be rewritten. No premium moves; mid-term premium adjustment is not modeled.",
|
|
2212
|
+
"effects": {
|
|
2213
|
+
"decides": [
|
|
2214
|
+
{
|
|
2215
|
+
"signature": "decides.insurance_carrier",
|
|
2216
|
+
"source": "decision"
|
|
2217
|
+
}
|
|
2218
|
+
]
|
|
2219
|
+
},
|
|
1907
2220
|
"examples": [
|
|
1908
2221
|
{
|
|
1909
2222
|
"input": {
|
|
1910
2223
|
"expiresAt": "2027-11-01T00:00:00.000Z",
|
|
2224
|
+
"policyId": "pol_sandbox_protection001",
|
|
2225
|
+
"tenantId": "ten_sandbox_protection01",
|
|
1911
2226
|
"termsSummary": "Extended cover incl. water damage."
|
|
1912
2227
|
},
|
|
1913
2228
|
"name": "endorse_extend_active_cover"
|
|
@@ -1966,13 +2281,35 @@
|
|
|
1966
2281
|
},
|
|
1967
2282
|
"moves": [],
|
|
1968
2283
|
"steps": [],
|
|
1969
|
-
"summary": "Endorse a policy"
|
|
2284
|
+
"summary": "Endorse a policy",
|
|
2285
|
+
"updates": [
|
|
2286
|
+
"perilSchedule",
|
|
2287
|
+
"termsSummary",
|
|
2288
|
+
"expiresAt"
|
|
2289
|
+
]
|
|
1970
2290
|
},
|
|
1971
2291
|
"expire": {
|
|
1972
2292
|
"description": "Ends active cover at term under the machine principal. Earned premium remains with the insurer.",
|
|
1973
2293
|
"due": {
|
|
1974
2294
|
"field": "expiresAt"
|
|
1975
2295
|
},
|
|
2296
|
+
"effects": {
|
|
2297
|
+
"schedules": [
|
|
2298
|
+
{
|
|
2299
|
+
"signature": "schedules.due",
|
|
2300
|
+
"source": "due"
|
|
2301
|
+
}
|
|
2302
|
+
]
|
|
2303
|
+
},
|
|
2304
|
+
"examples": [
|
|
2305
|
+
{
|
|
2306
|
+
"input": {
|
|
2307
|
+
"policyId": "pol_sandbox_protection001",
|
|
2308
|
+
"tenantId": "ten_sandbox_protection01"
|
|
2309
|
+
},
|
|
2310
|
+
"name": "expire_cover_at_term"
|
|
2311
|
+
}
|
|
2312
|
+
],
|
|
1976
2313
|
"moves": [],
|
|
1977
2314
|
"requiresDrainedAccount": {
|
|
1978
2315
|
"path": "refs.premiumReserveAccountId"
|
|
@@ -1981,14 +2318,66 @@
|
|
|
1981
2318
|
"summary": "Expire a policy"
|
|
1982
2319
|
},
|
|
1983
2320
|
"preview": {
|
|
2321
|
+
"agentDescription": "Price the cancellation refund while the policy is bound and cover has not started. No money moves. Under the declared schedule the refund is the whole premium. Required before cancel, which is the call that actually returns the money.",
|
|
1984
2322
|
"description": "Quotes the full premium refund while cover is bound but not active. No money moves until cancellation is confirmed.",
|
|
2323
|
+
"effects": {
|
|
2324
|
+
"holds": [
|
|
2325
|
+
{
|
|
2326
|
+
"signature": "holds.quote",
|
|
2327
|
+
"source": "quote"
|
|
2328
|
+
}
|
|
2329
|
+
],
|
|
2330
|
+
"schedules": [
|
|
2331
|
+
{
|
|
2332
|
+
"signature": "schedules.expiry",
|
|
2333
|
+
"source": "quote"
|
|
2334
|
+
}
|
|
2335
|
+
]
|
|
2336
|
+
},
|
|
2337
|
+
"examples": [
|
|
2338
|
+
{
|
|
2339
|
+
"input": {
|
|
2340
|
+
"policyId": "pol_sandbox_protection001",
|
|
2341
|
+
"tenantId": "ten_sandbox_protection01"
|
|
2342
|
+
},
|
|
2343
|
+
"name": "preview_pre_activation_cancel"
|
|
2344
|
+
}
|
|
2345
|
+
],
|
|
1985
2346
|
"moves": [],
|
|
2347
|
+
"quote": {
|
|
2348
|
+
"baseField": "premiumAmount",
|
|
2349
|
+
"chargeRef": "unwindPenalty",
|
|
2350
|
+
"charges": [
|
|
2351
|
+
{
|
|
2352
|
+
"bps": 0
|
|
2353
|
+
}
|
|
2354
|
+
],
|
|
2355
|
+
"expires": {
|
|
2356
|
+
"offset": "PT15M"
|
|
2357
|
+
},
|
|
2358
|
+
"fixes": [
|
|
2359
|
+
"policyholderAccountId",
|
|
2360
|
+
"premiumAmount"
|
|
2361
|
+
],
|
|
2362
|
+
"netDestinationField": "policyholderAccountId",
|
|
2363
|
+
"netRef": "unwindRefund"
|
|
2364
|
+
},
|
|
1986
2365
|
"steps": [],
|
|
1987
2366
|
"summary": "Preview policy cancellation"
|
|
1988
2367
|
},
|
|
1989
2368
|
"withdraw": {
|
|
2369
|
+
"agentDescription": "Drop a quote the carrier never bound. Only a quoted policy withdraws, no premium has moved, and the premium reserve must be empty. No preview is needed because there is nothing to refund.",
|
|
1990
2370
|
"description": "Closes an unbound quote. No premium moved, so no cancellation preview is required.",
|
|
1991
2371
|
"eventName": "policy.withdrawn",
|
|
2372
|
+
"examples": [
|
|
2373
|
+
{
|
|
2374
|
+
"input": {
|
|
2375
|
+
"policyId": "pol_sandbox_protection001",
|
|
2376
|
+
"tenantId": "ten_sandbox_protection01"
|
|
2377
|
+
},
|
|
2378
|
+
"name": "withdraw_unbound_quote"
|
|
2379
|
+
}
|
|
2380
|
+
],
|
|
1992
2381
|
"moves": [],
|
|
1993
2382
|
"requiresDrainedAccount": {
|
|
1994
2383
|
"path": "refs.premiumReserveAccountId"
|
|
@@ -1996,17 +2385,45 @@
|
|
|
1996
2385
|
"steps": [],
|
|
1997
2386
|
"summary": "Withdraw a policy quote"
|
|
1998
2387
|
}
|
|
1999
|
-
}
|
|
2000
|
-
|
|
2001
|
-
|
|
2002
|
-
|
|
2388
|
+
},
|
|
2389
|
+
"agentDescription": "Reach for policy when the caller quotes carrier-backed cover over one declared-value subject and drives it through bind, endorsement, and expiry. Between bind and activation the premium sits in a per-policy reserve and is fully refundable. Once cover activates the premium is the insurer's. Claims are a separate instrument.",
|
|
2390
|
+
"aggregateInvariants": [
|
|
2391
|
+
{
|
|
2392
|
+
"childField": "claimAmount",
|
|
2393
|
+
"childInstrumentId": "claim",
|
|
2394
|
+
"childRefField": "policyId",
|
|
2395
|
+
"childStatuses": [
|
|
2396
|
+
"filed",
|
|
2397
|
+
"assessed",
|
|
2398
|
+
"approved",
|
|
2399
|
+
"paid"
|
|
2400
|
+
],
|
|
2401
|
+
"parentField": "coverageLimit"
|
|
2402
|
+
}
|
|
2403
|
+
],
|
|
2404
|
+
"callerParkedStates": {
|
|
2405
|
+
"cancel_quoted": "a quoted cancellation moves money only when the caller confirms it",
|
|
2406
|
+
"quoted": "binding or withdrawing a quote is the policyholder's decision"
|
|
2407
|
+
},
|
|
2408
|
+
"description": "A policy quotes protection over one subject, binds after a carrier decision, activates at its declared start, and expires at term. Premium remains refundable while bound but not active; activation pays the insurer and opens the policy to claims.",
|
|
2003
2409
|
"fields": {
|
|
2004
|
-
"
|
|
2410
|
+
"coverageLimit": {
|
|
2005
2411
|
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
2006
2412
|
"pattern": "^[1-9][0-9]{0,17}$",
|
|
2007
2413
|
"type": "string"
|
|
2008
2414
|
},
|
|
2009
|
-
"
|
|
2415
|
+
"currency": {
|
|
2416
|
+
"description": "ISO 4217 currency code",
|
|
2417
|
+
"maxLength": 3,
|
|
2418
|
+
"minLength": 3,
|
|
2419
|
+
"pattern": "^[A-Z]{3}$",
|
|
2420
|
+
"type": "string"
|
|
2421
|
+
},
|
|
2422
|
+
"expiresAt": {
|
|
2423
|
+
"format": "hyperscale-date-time",
|
|
2424
|
+
"type": "string"
|
|
2425
|
+
},
|
|
2426
|
+
"insurerAccountId": {
|
|
2010
2427
|
"description": "Hyperscale account ID",
|
|
2011
2428
|
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
2012
2429
|
"type": "string",
|
|
@@ -2017,19 +2434,43 @@
|
|
|
2017
2434
|
]
|
|
2018
2435
|
}
|
|
2019
2436
|
},
|
|
2020
|
-
"
|
|
2021
|
-
"
|
|
2022
|
-
|
|
2023
|
-
|
|
2024
|
-
|
|
2025
|
-
|
|
2026
|
-
|
|
2027
|
-
|
|
2028
|
-
|
|
2029
|
-
|
|
2030
|
-
|
|
2437
|
+
"perilSchedule": {
|
|
2438
|
+
"items": {
|
|
2439
|
+
"additionalProperties": false,
|
|
2440
|
+
"properties": {
|
|
2441
|
+
"deductibleBps": {
|
|
2442
|
+
"maximum": 10000,
|
|
2443
|
+
"minimum": 0,
|
|
2444
|
+
"type": "integer"
|
|
2445
|
+
},
|
|
2446
|
+
"limitAmount": {
|
|
2447
|
+
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
2448
|
+
"pattern": "^[1-9][0-9]{0,17}$",
|
|
2449
|
+
"type": "string"
|
|
2450
|
+
},
|
|
2451
|
+
"peril": {
|
|
2452
|
+
"pattern": "^[a-z][a-z0-9_]{1,79}$",
|
|
2453
|
+
"type": "string"
|
|
2454
|
+
},
|
|
2455
|
+
"waitingPeriodDays": {
|
|
2456
|
+
"maximum": 3650,
|
|
2457
|
+
"minimum": 0,
|
|
2458
|
+
"type": "integer"
|
|
2459
|
+
}
|
|
2460
|
+
},
|
|
2461
|
+
"required": [
|
|
2462
|
+
"peril",
|
|
2463
|
+
"limitAmount",
|
|
2464
|
+
"deductibleBps",
|
|
2465
|
+
"waitingPeriodDays"
|
|
2466
|
+
],
|
|
2467
|
+
"type": "object"
|
|
2468
|
+
},
|
|
2469
|
+
"maxItems": 24,
|
|
2470
|
+
"minItems": 1,
|
|
2471
|
+
"type": "array"
|
|
2031
2472
|
},
|
|
2032
|
-
"
|
|
2473
|
+
"policyholderAccountId": {
|
|
2033
2474
|
"description": "Hyperscale account ID",
|
|
2034
2475
|
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
2035
2476
|
"type": "string",
|
|
@@ -2040,83 +2481,100 @@
|
|
|
2040
2481
|
]
|
|
2041
2482
|
}
|
|
2042
2483
|
},
|
|
2043
|
-
"
|
|
2044
|
-
"
|
|
2484
|
+
"premiumAmount": {
|
|
2485
|
+
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
2486
|
+
"pattern": "^[1-9][0-9]{0,17}$",
|
|
2045
2487
|
"type": "string"
|
|
2046
2488
|
},
|
|
2047
|
-
"
|
|
2048
|
-
"
|
|
2489
|
+
"renewalOfPolicyId": {
|
|
2490
|
+
"description": "Prior policy this quote renews; the prior term must be active or already expired",
|
|
2491
|
+
"pattern": "^pol_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
2049
2492
|
"type": "string"
|
|
2050
2493
|
},
|
|
2051
|
-
"
|
|
2052
|
-
"
|
|
2053
|
-
"
|
|
2494
|
+
"startsAt": {
|
|
2495
|
+
"format": "hyperscale-date-time",
|
|
2496
|
+
"type": "string"
|
|
2497
|
+
},
|
|
2498
|
+
"termsSummary": {
|
|
2499
|
+
"maxLength": 1000,
|
|
2500
|
+
"minLength": 1,
|
|
2054
2501
|
"type": "string"
|
|
2055
2502
|
}
|
|
2056
2503
|
},
|
|
2057
|
-
"id": "
|
|
2058
|
-
"idPrefix": "
|
|
2504
|
+
"id": "policy",
|
|
2505
|
+
"idPrefix": "pol",
|
|
2059
2506
|
"lifecycle": {
|
|
2060
|
-
"initial": "
|
|
2507
|
+
"initial": "quoted",
|
|
2061
2508
|
"states": [
|
|
2062
|
-
"
|
|
2063
|
-
"
|
|
2064
|
-
"
|
|
2065
|
-
"
|
|
2066
|
-
"
|
|
2509
|
+
"quoted",
|
|
2510
|
+
"bound",
|
|
2511
|
+
"active",
|
|
2512
|
+
"cancel_quoted",
|
|
2513
|
+
"canceled",
|
|
2514
|
+
"expired"
|
|
2067
2515
|
],
|
|
2068
2516
|
"transitions": {
|
|
2069
|
-
"
|
|
2517
|
+
"activate": {
|
|
2070
2518
|
"from": [
|
|
2071
|
-
"
|
|
2519
|
+
"bound"
|
|
2072
2520
|
],
|
|
2073
|
-
"to": "
|
|
2521
|
+
"to": "active"
|
|
2074
2522
|
},
|
|
2075
|
-
"
|
|
2523
|
+
"bind": {
|
|
2076
2524
|
"from": [
|
|
2077
|
-
"
|
|
2525
|
+
"quoted"
|
|
2078
2526
|
],
|
|
2079
|
-
"to": "
|
|
2527
|
+
"to": "bound"
|
|
2080
2528
|
},
|
|
2081
|
-
"
|
|
2529
|
+
"cancel": {
|
|
2082
2530
|
"from": [
|
|
2083
|
-
"
|
|
2531
|
+
"cancel_quoted"
|
|
2084
2532
|
],
|
|
2085
|
-
"to": "
|
|
2533
|
+
"to": "canceled"
|
|
2086
2534
|
},
|
|
2087
|
-
"
|
|
2535
|
+
"endorse": {
|
|
2088
2536
|
"from": [
|
|
2089
|
-
"
|
|
2090
|
-
"assessed"
|
|
2537
|
+
"active"
|
|
2091
2538
|
],
|
|
2092
|
-
"to": "
|
|
2539
|
+
"to": "active"
|
|
2093
2540
|
},
|
|
2094
|
-
"
|
|
2541
|
+
"expire": {
|
|
2095
2542
|
"from": [
|
|
2096
|
-
"
|
|
2543
|
+
"active"
|
|
2097
2544
|
],
|
|
2098
|
-
"to": "
|
|
2545
|
+
"to": "expired"
|
|
2099
2546
|
},
|
|
2100
|
-
"
|
|
2547
|
+
"preview": {
|
|
2101
2548
|
"from": [
|
|
2102
|
-
"
|
|
2549
|
+
"bound"
|
|
2103
2550
|
],
|
|
2104
|
-
"to": "
|
|
2551
|
+
"to": "cancel_quoted"
|
|
2552
|
+
},
|
|
2553
|
+
"withdraw": {
|
|
2554
|
+
"from": [
|
|
2555
|
+
"quoted"
|
|
2556
|
+
],
|
|
2557
|
+
"to": "canceled"
|
|
2105
2558
|
}
|
|
2106
2559
|
}
|
|
2107
2560
|
},
|
|
2561
|
+
"nav": [
|
|
2562
|
+
"Blueprints",
|
|
2563
|
+
"Policies"
|
|
2564
|
+
],
|
|
2108
2565
|
"parties": {
|
|
2109
|
-
"beneficiary": "
|
|
2110
|
-
"payer": "
|
|
2566
|
+
"beneficiary": "insurerAccountId",
|
|
2567
|
+
"payer": "policyholderAccountId"
|
|
2111
2568
|
},
|
|
2112
2569
|
"required": [
|
|
2113
|
-
"
|
|
2114
|
-
"claimantAccountId",
|
|
2570
|
+
"policyholderAccountId",
|
|
2115
2571
|
"insurerAccountId",
|
|
2116
|
-
"
|
|
2572
|
+
"premiumAmount",
|
|
2573
|
+
"coverageLimit",
|
|
2117
2574
|
"currency",
|
|
2118
|
-
"
|
|
2119
|
-
"
|
|
2575
|
+
"startsAt",
|
|
2576
|
+
"expiresAt",
|
|
2577
|
+
"perilSchedule"
|
|
2120
2578
|
],
|
|
2121
2579
|
"subject": {
|
|
2122
2580
|
"kinds": [
|
|
@@ -2124,30 +2582,99 @@
|
|
|
2124
2582
|
"flight_itinerary",
|
|
2125
2583
|
"lodging_stay",
|
|
2126
2584
|
"vehicle",
|
|
2585
|
+
"merchandise",
|
|
2127
2586
|
"pet",
|
|
2128
2587
|
"traveler_party",
|
|
2129
2588
|
"employee_census"
|
|
2130
2589
|
]
|
|
2131
2590
|
},
|
|
2132
|
-
"summary": "
|
|
2133
|
-
"
|
|
2591
|
+
"summary": "Carrier-backed protection over one declared-value subject.",
|
|
2592
|
+
"templateId": "insurance",
|
|
2593
|
+
"title": "Policy",
|
|
2134
2594
|
"update": {
|
|
2595
|
+
"examples": [
|
|
2596
|
+
{
|
|
2597
|
+
"input": {
|
|
2598
|
+
"perilSchedule": [
|
|
2599
|
+
{
|
|
2600
|
+
"deductibleBps": 500,
|
|
2601
|
+
"limitAmount": "200000",
|
|
2602
|
+
"peril": "accidental_damage",
|
|
2603
|
+
"waitingPeriodDays": 0
|
|
2604
|
+
},
|
|
2605
|
+
{
|
|
2606
|
+
"deductibleBps": 250,
|
|
2607
|
+
"limitAmount": "200000",
|
|
2608
|
+
"peril": "theft",
|
|
2609
|
+
"waitingPeriodDays": 7
|
|
2610
|
+
}
|
|
2611
|
+
],
|
|
2612
|
+
"policyId": "pol_sandbox_protection001",
|
|
2613
|
+
"tenantId": "ten_sandbox_protection01",
|
|
2614
|
+
"termsSummary": "Covers accidental damage and theft."
|
|
2615
|
+
},
|
|
2616
|
+
"name": "refine_quoted_cover"
|
|
2617
|
+
}
|
|
2618
|
+
],
|
|
2135
2619
|
"fields": [
|
|
2136
|
-
"
|
|
2620
|
+
"startsAt",
|
|
2621
|
+
"expiresAt",
|
|
2622
|
+
"perilSchedule",
|
|
2623
|
+
"termsSummary"
|
|
2137
2624
|
],
|
|
2138
2625
|
"states": [
|
|
2139
|
-
"
|
|
2140
|
-
"assessed"
|
|
2626
|
+
"quoted"
|
|
2141
2627
|
]
|
|
2142
|
-
}
|
|
2143
|
-
|
|
2628
|
+
}
|
|
2629
|
+
},
|
|
2630
|
+
{
|
|
2631
|
+
"actionOrder": [
|
|
2632
|
+
"create",
|
|
2633
|
+
"assess",
|
|
2634
|
+
"approve",
|
|
2635
|
+
"attest",
|
|
2636
|
+
"pay",
|
|
2637
|
+
"deny",
|
|
2638
|
+
"reverse"
|
|
2639
|
+
],
|
|
2640
|
+
"actions": {
|
|
2144
2641
|
"approve": {
|
|
2642
|
+
"agentDescription": "Ask the claims adjuster for a verdict and hold the claim amount from the insurer account for the claimant. Only an assessed claim can approve, and an adjuster that misses the deadline declines by default. The hold reserves money without settling it. Pay posts it, reverse voids it.",
|
|
2145
2643
|
"decision": {
|
|
2146
2644
|
"capability": "insurance_claims_adjuster",
|
|
2147
2645
|
"deadlineMs": 15000,
|
|
2148
2646
|
"onTimeout": "decline"
|
|
2149
2647
|
},
|
|
2150
2648
|
"description": "Asks the claims adjuster to approve the assessed demand, then holds the immutable claim amount from the insurer for the claimant. For a carrier that exposes an adjudication API: the verdict is the provider's, taken just in time under a deadline.",
|
|
2649
|
+
"effects": {
|
|
2650
|
+
"decides": [
|
|
2651
|
+
{
|
|
2652
|
+
"signature": "decides.insurance_claims_adjuster",
|
|
2653
|
+
"source": "decision"
|
|
2654
|
+
}
|
|
2655
|
+
],
|
|
2656
|
+
"holds": [
|
|
2657
|
+
{
|
|
2658
|
+
"signature": "holds.reserve",
|
|
2659
|
+
"source": "moves[0]"
|
|
2660
|
+
}
|
|
2661
|
+
],
|
|
2662
|
+
"moves": [
|
|
2663
|
+
{
|
|
2664
|
+
"signature": "moves.transfer.internal",
|
|
2665
|
+
"source": "moves[0]"
|
|
2666
|
+
}
|
|
2667
|
+
]
|
|
2668
|
+
},
|
|
2669
|
+
"examples": [
|
|
2670
|
+
{
|
|
2671
|
+
"input": {
|
|
2672
|
+
"claimId": "clm_sandbox_protection001",
|
|
2673
|
+
"tenantId": "ten_sandbox_protection01"
|
|
2674
|
+
},
|
|
2675
|
+
"name": "approve_assessed_claim"
|
|
2676
|
+
}
|
|
2677
|
+
],
|
|
2151
2678
|
"moves": [
|
|
2152
2679
|
{
|
|
2153
2680
|
"bind": {
|
|
@@ -2179,13 +2706,54 @@
|
|
|
2179
2706
|
"summary": "Approve a claim"
|
|
2180
2707
|
},
|
|
2181
2708
|
"assess": {
|
|
2709
|
+
"agentDescription": "Mark the filed evidence ready for an approval decision. Only a filed claim can assess and no money moves. A claim filed validly during cover stays alive even if the policy term later expires.",
|
|
2182
2710
|
"description": "Marks filed evidence ready for an approval decision. A claim validly filed during cover continues even if the policy term later expires.",
|
|
2711
|
+
"examples": [
|
|
2712
|
+
{
|
|
2713
|
+
"input": {
|
|
2714
|
+
"claimId": "clm_sandbox_protection001",
|
|
2715
|
+
"tenantId": "ten_sandbox_protection01"
|
|
2716
|
+
},
|
|
2717
|
+
"name": "complete_claim_assessment"
|
|
2718
|
+
}
|
|
2719
|
+
],
|
|
2183
2720
|
"moves": [],
|
|
2184
2721
|
"steps": [],
|
|
2185
2722
|
"summary": "Assess a claim"
|
|
2186
2723
|
},
|
|
2187
2724
|
"attest": {
|
|
2725
|
+
"agentDescription": "Record an approval the insurer already made outside the platform and hold the claim amount from the insurer for the claimant. Only an assessed claim can attest, and the caller must assert the insurer as the acting party. Use this where the carrier has no adjudication API. Where one exists, approve calls it.",
|
|
2188
2726
|
"description": "Records the insurer's own approval of the assessed demand, taken outside the platform, and holds the immutable claim amount from the insurer for the claimant. The insurer must be asserted as the acting party. Use this where the carrier exposes no adjudication API; where one exists, approve calls it instead.",
|
|
2727
|
+
"effects": {
|
|
2728
|
+
"decides": [
|
|
2729
|
+
{
|
|
2730
|
+
"signature": "decides.tenant_port",
|
|
2731
|
+
"source": "port"
|
|
2732
|
+
}
|
|
2733
|
+
],
|
|
2734
|
+
"holds": [
|
|
2735
|
+
{
|
|
2736
|
+
"signature": "holds.reserve",
|
|
2737
|
+
"source": "moves[0]"
|
|
2738
|
+
}
|
|
2739
|
+
],
|
|
2740
|
+
"moves": [
|
|
2741
|
+
{
|
|
2742
|
+
"signature": "moves.transfer.internal",
|
|
2743
|
+
"source": "moves[0]"
|
|
2744
|
+
}
|
|
2745
|
+
]
|
|
2746
|
+
},
|
|
2747
|
+
"examples": [
|
|
2748
|
+
{
|
|
2749
|
+
"input": {
|
|
2750
|
+
"actorAccountId": "acct_sandbox_insurer0001",
|
|
2751
|
+
"claimId": "clm_sandbox_protection001",
|
|
2752
|
+
"tenantId": "ten_sandbox_protection01"
|
|
2753
|
+
},
|
|
2754
|
+
"name": "attest_insurer_approval"
|
|
2755
|
+
}
|
|
2756
|
+
],
|
|
2189
2757
|
"moves": [
|
|
2190
2758
|
{
|
|
2191
2759
|
"bind": {
|
|
@@ -2222,7 +2790,16 @@
|
|
|
2222
2790
|
"summary": "Attest an out-of-band claim approval"
|
|
2223
2791
|
},
|
|
2224
2792
|
"create": {
|
|
2793
|
+
"agentDescription": "File a demand against a policy. The policy must be active, and the filed amount is reserved against its aggregate coverage limit. The caller supplies the peril, the moment it occurred, the claim amount, and both accounts. No money moves at filing.",
|
|
2225
2794
|
"description": "Records a demand against an active policy and reserves its filed amount against the policy's aggregate coverage limit.",
|
|
2795
|
+
"effects": {
|
|
2796
|
+
"reads": [
|
|
2797
|
+
{
|
|
2798
|
+
"signature": "reads.requires_refs",
|
|
2799
|
+
"source": "requiresRefs"
|
|
2800
|
+
}
|
|
2801
|
+
]
|
|
2802
|
+
},
|
|
2226
2803
|
"eventName": "claim.filed",
|
|
2227
2804
|
"examples": [
|
|
2228
2805
|
{
|
|
@@ -2235,7 +2812,9 @@
|
|
|
2235
2812
|
"occurredAt": "2026-10-14T11:30:00.000Z",
|
|
2236
2813
|
"peril": "accidental_damage",
|
|
2237
2814
|
"policyId": "pol_sandbox_protection001",
|
|
2238
|
-
"
|
|
2815
|
+
"productId": "prd_sandbox_protection01",
|
|
2816
|
+
"subject": "sbj_sandbox_protection001",
|
|
2817
|
+
"tenantId": "ten_sandbox_protection01"
|
|
2239
2818
|
},
|
|
2240
2819
|
"name": "file_accidental_damage_claim"
|
|
2241
2820
|
}
|
|
@@ -2253,15 +2832,43 @@
|
|
|
2253
2832
|
"summary": "File a claim"
|
|
2254
2833
|
},
|
|
2255
2834
|
"deny": {
|
|
2835
|
+
"agentDescription": "Close a filed or assessed demand with no payout. Only a claim with no hold behind it can deny, so an approved claim goes through reverse instead. No money moves.",
|
|
2256
2836
|
"description": "Closes a filed or assessed demand before any payout hold exists.",
|
|
2257
2837
|
"eventName": "claim.denied",
|
|
2838
|
+
"examples": [
|
|
2839
|
+
{
|
|
2840
|
+
"input": {
|
|
2841
|
+
"claimId": "clm_sandbox_protection001",
|
|
2842
|
+
"tenantId": "ten_sandbox_protection01"
|
|
2843
|
+
},
|
|
2844
|
+
"name": "deny_unapproved_claim"
|
|
2845
|
+
}
|
|
2846
|
+
],
|
|
2258
2847
|
"moves": [],
|
|
2259
2848
|
"steps": [],
|
|
2260
2849
|
"summary": "Deny a claim"
|
|
2261
2850
|
},
|
|
2262
2851
|
"pay": {
|
|
2852
|
+
"agentDescription": "Post the approved hold so the claim amount settles into the claimant account. Only an approved claim can pay. This settles money and is terminal.",
|
|
2263
2853
|
"description": "Posts the approved hold and settles the claim amount into the claimant account.",
|
|
2854
|
+
"effects": {
|
|
2855
|
+
"moves": [
|
|
2856
|
+
{
|
|
2857
|
+
"signature": "moves.transfer.internal",
|
|
2858
|
+
"source": "moves[0]"
|
|
2859
|
+
}
|
|
2860
|
+
]
|
|
2861
|
+
},
|
|
2264
2862
|
"eventName": "claim.paid",
|
|
2863
|
+
"examples": [
|
|
2864
|
+
{
|
|
2865
|
+
"input": {
|
|
2866
|
+
"claimId": "clm_sandbox_protection001",
|
|
2867
|
+
"tenantId": "ten_sandbox_protection01"
|
|
2868
|
+
},
|
|
2869
|
+
"name": "pay_approved_claim"
|
|
2870
|
+
}
|
|
2871
|
+
],
|
|
2265
2872
|
"moves": [
|
|
2266
2873
|
{
|
|
2267
2874
|
"bind": {
|
|
@@ -2278,7 +2885,25 @@
|
|
|
2278
2885
|
"summary": "Pay a claim"
|
|
2279
2886
|
},
|
|
2280
2887
|
"reverse": {
|
|
2888
|
+
"agentDescription": "Void an approved payout hold before payment and close the claim as denied. Only an approved claim can reverse. The insurer's held funds are released and no settled money is clawed back.",
|
|
2281
2889
|
"description": "Voids an approved payout hold before payment and closes the claim denied. No settled money is reversed.",
|
|
2890
|
+
"effects": {
|
|
2891
|
+
"moves": [
|
|
2892
|
+
{
|
|
2893
|
+
"signature": "moves.transfer.internal",
|
|
2894
|
+
"source": "moves[0]"
|
|
2895
|
+
}
|
|
2896
|
+
]
|
|
2897
|
+
},
|
|
2898
|
+
"examples": [
|
|
2899
|
+
{
|
|
2900
|
+
"input": {
|
|
2901
|
+
"claimId": "clm_sandbox_protection001",
|
|
2902
|
+
"tenantId": "ten_sandbox_protection01"
|
|
2903
|
+
},
|
|
2904
|
+
"name": "reverse_approved_claim"
|
|
2905
|
+
}
|
|
2906
|
+
],
|
|
2282
2907
|
"moves": [
|
|
2283
2908
|
{
|
|
2284
2909
|
"bind": {
|
|
@@ -2298,6 +2923,179 @@
|
|
|
2298
2923
|
"steps": [],
|
|
2299
2924
|
"summary": "Reverse claim approval"
|
|
2300
2925
|
}
|
|
2926
|
+
},
|
|
2927
|
+
"agentDescription": "Reach for claim when a policyholder demands payment for a covered peril under an active policy. Filing reserves the amount against the policy's coverage limit. Use approve where the carrier exposes an adjudication API and attest where the insurer decides out of band. Premium collection and cover dates live on policy.",
|
|
2928
|
+
"callerParkedStates": {
|
|
2929
|
+
"approved": "paying or reversing an approved claim is the operator's deliberate money movement",
|
|
2930
|
+
"assessed": "approval or denial is an adjuster's judgment, whether the adjuster answers over an API or out of band",
|
|
2931
|
+
"filed": "assessment is an adjuster's judgment"
|
|
2932
|
+
},
|
|
2933
|
+
"description": "A claim is filed against an active policy, assessed, approved or denied, and paid from the insurer account through a held transfer. Approval can be reversed before payment, releasing the insurer's hold without moving settled money.",
|
|
2934
|
+
"dials": [
|
|
2935
|
+
{
|
|
2936
|
+
"action": "approve",
|
|
2937
|
+
"key": "adjuster_decision_deadline_ms",
|
|
2938
|
+
"kind": "decision_deadline_ms",
|
|
2939
|
+
"minMs": 1000,
|
|
2940
|
+
"summary": "How long approve waits for the claims adjuster's decision before the timeout default declines.",
|
|
2941
|
+
"title": "Adjuster decision deadline"
|
|
2942
|
+
}
|
|
2943
|
+
],
|
|
2944
|
+
"fields": {
|
|
2945
|
+
"claimAmount": {
|
|
2946
|
+
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
2947
|
+
"pattern": "^[1-9][0-9]{0,17}$",
|
|
2948
|
+
"type": "string"
|
|
2949
|
+
},
|
|
2950
|
+
"claimantAccountId": {
|
|
2951
|
+
"description": "Hyperscale account ID",
|
|
2952
|
+
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
2953
|
+
"type": "string",
|
|
2954
|
+
"x-hyperscale-reference-filter": {
|
|
2955
|
+
"column": "role",
|
|
2956
|
+
"values": [
|
|
2957
|
+
"customer_balance"
|
|
2958
|
+
]
|
|
2959
|
+
}
|
|
2960
|
+
},
|
|
2961
|
+
"currency": {
|
|
2962
|
+
"description": "ISO 4217 currency code",
|
|
2963
|
+
"maxLength": 3,
|
|
2964
|
+
"minLength": 3,
|
|
2965
|
+
"pattern": "^[A-Z]{3}$",
|
|
2966
|
+
"type": "string"
|
|
2967
|
+
},
|
|
2968
|
+
"evidenceSummary": {
|
|
2969
|
+
"maxLength": 2000,
|
|
2970
|
+
"minLength": 1,
|
|
2971
|
+
"type": "string"
|
|
2972
|
+
},
|
|
2973
|
+
"insurerAccountId": {
|
|
2974
|
+
"description": "Hyperscale account ID",
|
|
2975
|
+
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
2976
|
+
"type": "string",
|
|
2977
|
+
"x-hyperscale-reference-filter": {
|
|
2978
|
+
"column": "role",
|
|
2979
|
+
"values": [
|
|
2980
|
+
"customer_balance"
|
|
2981
|
+
]
|
|
2982
|
+
}
|
|
2983
|
+
},
|
|
2984
|
+
"occurredAt": {
|
|
2985
|
+
"format": "hyperscale-date-time",
|
|
2986
|
+
"type": "string"
|
|
2987
|
+
},
|
|
2988
|
+
"peril": {
|
|
2989
|
+
"pattern": "^[a-z][a-z0-9_]{1,79}$",
|
|
2990
|
+
"type": "string"
|
|
2991
|
+
},
|
|
2992
|
+
"policyId": {
|
|
2993
|
+
"description": "Active policy this claim is made against",
|
|
2994
|
+
"pattern": "^pol_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
2995
|
+
"type": "string"
|
|
2996
|
+
}
|
|
2997
|
+
},
|
|
2998
|
+
"id": "claim",
|
|
2999
|
+
"idPrefix": "clm",
|
|
3000
|
+
"lifecycle": {
|
|
3001
|
+
"initial": "filed",
|
|
3002
|
+
"states": [
|
|
3003
|
+
"filed",
|
|
3004
|
+
"assessed",
|
|
3005
|
+
"approved",
|
|
3006
|
+
"paid",
|
|
3007
|
+
"denied"
|
|
3008
|
+
],
|
|
3009
|
+
"transitions": {
|
|
3010
|
+
"approve": {
|
|
3011
|
+
"from": [
|
|
3012
|
+
"assessed"
|
|
3013
|
+
],
|
|
3014
|
+
"to": "approved"
|
|
3015
|
+
},
|
|
3016
|
+
"assess": {
|
|
3017
|
+
"from": [
|
|
3018
|
+
"filed"
|
|
3019
|
+
],
|
|
3020
|
+
"to": "assessed"
|
|
3021
|
+
},
|
|
3022
|
+
"attest": {
|
|
3023
|
+
"from": [
|
|
3024
|
+
"assessed"
|
|
3025
|
+
],
|
|
3026
|
+
"to": "approved"
|
|
3027
|
+
},
|
|
3028
|
+
"deny": {
|
|
3029
|
+
"from": [
|
|
3030
|
+
"filed",
|
|
3031
|
+
"assessed"
|
|
3032
|
+
],
|
|
3033
|
+
"to": "denied"
|
|
3034
|
+
},
|
|
3035
|
+
"pay": {
|
|
3036
|
+
"from": [
|
|
3037
|
+
"approved"
|
|
3038
|
+
],
|
|
3039
|
+
"to": "paid"
|
|
3040
|
+
},
|
|
3041
|
+
"reverse": {
|
|
3042
|
+
"from": [
|
|
3043
|
+
"approved"
|
|
3044
|
+
],
|
|
3045
|
+
"to": "denied"
|
|
3046
|
+
}
|
|
3047
|
+
}
|
|
3048
|
+
},
|
|
3049
|
+
"nav": [
|
|
3050
|
+
"Blueprints",
|
|
3051
|
+
"Claims"
|
|
3052
|
+
],
|
|
3053
|
+
"parties": {
|
|
3054
|
+
"beneficiary": "claimantAccountId",
|
|
3055
|
+
"payer": "insurerAccountId"
|
|
3056
|
+
},
|
|
3057
|
+
"required": [
|
|
3058
|
+
"policyId",
|
|
3059
|
+
"claimantAccountId",
|
|
3060
|
+
"insurerAccountId",
|
|
3061
|
+
"claimAmount",
|
|
3062
|
+
"currency",
|
|
3063
|
+
"peril",
|
|
3064
|
+
"occurredAt"
|
|
3065
|
+
],
|
|
3066
|
+
"subject": {
|
|
3067
|
+
"kinds": [
|
|
3068
|
+
"policy_risk",
|
|
3069
|
+
"flight_itinerary",
|
|
3070
|
+
"lodging_stay",
|
|
3071
|
+
"vehicle",
|
|
3072
|
+
"merchandise",
|
|
3073
|
+
"pet",
|
|
3074
|
+
"traveler_party",
|
|
3075
|
+
"employee_census"
|
|
3076
|
+
]
|
|
3077
|
+
},
|
|
3078
|
+
"summary": "Demand against active protection for one covered peril.",
|
|
3079
|
+
"templateId": "insurance",
|
|
3080
|
+
"title": "Claim",
|
|
3081
|
+
"update": {
|
|
3082
|
+
"examples": [
|
|
3083
|
+
{
|
|
3084
|
+
"input": {
|
|
3085
|
+
"claimId": "clm_sandbox_protection001",
|
|
3086
|
+
"evidenceSummary": "Damage assessment confirms the covered accidental event.",
|
|
3087
|
+
"tenantId": "ten_sandbox_protection01"
|
|
3088
|
+
},
|
|
3089
|
+
"name": "add_claim_evidence_summary"
|
|
3090
|
+
}
|
|
3091
|
+
],
|
|
3092
|
+
"fields": [
|
|
3093
|
+
"evidenceSummary"
|
|
3094
|
+
],
|
|
3095
|
+
"states": [
|
|
3096
|
+
"filed",
|
|
3097
|
+
"assessed"
|
|
3098
|
+
]
|
|
2301
3099
|
}
|
|
2302
3100
|
}
|
|
2303
3101
|
],
|
|
@@ -2346,6 +3144,56 @@
|
|
|
2346
3144
|
"title": "Vehicle",
|
|
2347
3145
|
"version": 1
|
|
2348
3146
|
},
|
|
3147
|
+
{
|
|
3148
|
+
"declaredValue": "required",
|
|
3149
|
+
"kind": "merchandise",
|
|
3150
|
+
"schema": {
|
|
3151
|
+
"additionalProperties": false,
|
|
3152
|
+
"properties": {
|
|
3153
|
+
"brand": {
|
|
3154
|
+
"maxLength": 60,
|
|
3155
|
+
"minLength": 1,
|
|
3156
|
+
"type": "string"
|
|
3157
|
+
},
|
|
3158
|
+
"category": {
|
|
3159
|
+
"maxLength": 60,
|
|
3160
|
+
"minLength": 1,
|
|
3161
|
+
"type": "string"
|
|
3162
|
+
},
|
|
3163
|
+
"condition": {
|
|
3164
|
+
"enum": [
|
|
3165
|
+
"new",
|
|
3166
|
+
"excellent",
|
|
3167
|
+
"good",
|
|
3168
|
+
"fair",
|
|
3169
|
+
"poor"
|
|
3170
|
+
],
|
|
3171
|
+
"type": "string"
|
|
3172
|
+
},
|
|
3173
|
+
"model": {
|
|
3174
|
+
"maxLength": 60,
|
|
3175
|
+
"minLength": 1,
|
|
3176
|
+
"type": "string"
|
|
3177
|
+
},
|
|
3178
|
+
"serialNumber": {
|
|
3179
|
+
"maxLength": 80,
|
|
3180
|
+
"minLength": 1,
|
|
3181
|
+
"type": "string"
|
|
3182
|
+
},
|
|
3183
|
+
"yearOfManufacture": {
|
|
3184
|
+
"pattern": "^\\d{4}$",
|
|
3185
|
+
"type": "string"
|
|
3186
|
+
}
|
|
3187
|
+
},
|
|
3188
|
+
"required": [
|
|
3189
|
+
"category",
|
|
3190
|
+
"condition"
|
|
3191
|
+
],
|
|
3192
|
+
"type": "object"
|
|
3193
|
+
},
|
|
3194
|
+
"title": "Merchandise",
|
|
3195
|
+
"version": 1
|
|
3196
|
+
},
|
|
2349
3197
|
{
|
|
2350
3198
|
"declaredValue": "required",
|
|
2351
3199
|
"kind": "policy_risk",
|