@hyperscale0/udl 2.6.1 → 3.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 +2 -330
- package/LICENSING.md +1 -2
- package/README.md +3 -114
- package/TRADEMARKS.md +2 -2
- package/dist/diagnostics.d.ts +21 -201
- package/dist/diagnostics.d.ts.map +1 -1
- package/dist/diagnostics.js +29 -193
- package/dist/diagnostics.js.map +1 -1
- package/dist/evolution.d.ts +3 -132
- package/dist/evolution.d.ts.map +1 -1
- package/dist/evolution.js +29 -633
- package/dist/evolution.js.map +1 -1
- package/dist/finance.d.ts +5 -72
- package/dist/finance.d.ts.map +1 -1
- package/dist/finance.js +233 -737
- package/dist/finance.js.map +1 -1
- package/dist/index.d.ts +7 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -12
- package/dist/index.js.map +1 -1
- package/dist/instrument-references.d.ts.map +1 -1
- package/dist/instrument-references.js +3 -2
- package/dist/instrument-references.js.map +1 -1
- package/dist/schema.d.ts +2079 -4564
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +270 -1609
- package/dist/schema.js.map +1 -1
- package/dist/validation.d.ts +8 -104
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +653 -3271
- package/dist/validation.js.map +1 -1
- package/docs/README.md +147 -14
- package/package.json +7 -11
- package/spec/README.md +151 -164
- package/spec/darb.udl.json +249 -0
- package/spec/udl.schema.json +4104 -3202
- package/src/diagnostics.ts +51 -246
- package/src/evolution.ts +39 -1045
- package/src/finance.ts +287 -1127
- package/src/index.ts +18 -142
- package/src/instrument-references.ts +3 -2
- package/src/schema.ts +285 -1843
- package/src/validation.ts +870 -5611
- package/conformance/README.md +0 -82
- package/conformance/evolution/action-contract.expected.json +0 -10
- package/conformance/evolution/action-contract.live.udl +0 -44
- package/conformance/evolution/action-contract.next.udl +0 -45
- package/conformance/evolution/product-identity.expected.json +0 -10
- package/conformance/evolution/product-identity.live.udl +0 -55
- package/conformance/evolution/product-identity.next.udl +0 -55
- package/conformance/evolution/version-required.expected.json +0 -10
- package/conformance/evolution/version-required.live.udl +0 -55
- package/conformance/evolution/version-required.next.udl +0 -58
- package/conformance/invalid/action-without-transition.expected.json +0 -10
- package/conformance/invalid/action-without-transition.udl +0 -60
- package/conformance/invalid/agent-description-too-long.expected.json +0 -10
- package/conformance/invalid/agent-description-too-long.udl +0 -57
- package/conformance/invalid/blank-title.expected.json +0 -10
- package/conformance/invalid/blank-title.udl +0 -54
- package/conformance/invalid/call-binds-results.expected.json +0 -10
- package/conformance/invalid/call-binds-results.udl +0 -314
- package/conformance/invalid/call-unknown-action.expected.json +0 -10
- package/conformance/invalid/call-unknown-action.udl +0 -314
- package/conformance/invalid/composition-dial-duplicate-key.expected.json +0 -10
- package/conformance/invalid/composition-dial-duplicate-key.udl +0 -73
- package/conformance/invalid/depth-budget.expected.json +0 -10
- package/conformance/invalid/depth-budget.udl +0 -49
- package/conformance/invalid/duplicate-subject.expected.json +0 -10
- package/conformance/invalid/duplicate-subject.udl +0 -230
- package/conformance/invalid/forged-effects.expected.json +0 -10
- package/conformance/invalid/forged-effects.udl +0 -76
- package/conformance/invalid/format-version.expected.json +0 -10
- package/conformance/invalid/format-version.udl +0 -54
- package/conformance/invalid/instrument-id-not-snake-case.expected.json +0 -10
- package/conformance/invalid/instrument-id-not-snake-case.udl +0 -54
- package/conformance/invalid/invalid-aggregate-gate-shape.expected.json +0 -10
- package/conformance/invalid/invalid-aggregate-gate-shape.udl +0 -1819
- package/conformance/invalid/invalid-check-duration.expected.json +0 -10
- package/conformance/invalid/invalid-check-duration.udl +0 -219
- package/conformance/invalid/invalid-dial-anchor.expected.json +0 -10
- package/conformance/invalid/invalid-dial-anchor.udl +0 -219
- package/conformance/invalid/invalid-exception-parent-ref.expected.json +0 -10
- package/conformance/invalid/invalid-exception-parent-ref.udl +0 -2487
- package/conformance/invalid/invalid-exposure-shape.expected.json +0 -10
- package/conformance/invalid/invalid-exposure-shape.udl +0 -1819
- package/conformance/invalid/invalid-journeys.expected.json +0 -10
- package/conformance/invalid/invalid-journeys.udl +0 -77
- package/conformance/invalid/invalid-remainder.expected.json +0 -10
- package/conformance/invalid/invalid-remainder.udl +0 -220
- package/conformance/invalid/invalid-schema-keyword.expected.json +0 -10
- package/conformance/invalid/invalid-schema-keyword.udl +0 -220
- package/conformance/invalid/invalid-utf8.expected.json +0 -10
- package/conformance/invalid/invalid-utf8.udl +0 -1
- package/conformance/invalid/leaf-effect-mismatch.expected.json +0 -10
- package/conformance/invalid/leaf-effect-mismatch.udl +0 -314
- package/conformance/invalid/malformed-json.expected.json +0 -10
- package/conformance/invalid/malformed-json.udl +0 -1
- package/conformance/invalid/missing-create-action.expected.json +0 -10
- package/conformance/invalid/missing-create-action.udl +0 -48
- package/conformance/invalid/missing-exception-amount-field.expected.json +0 -10
- package/conformance/invalid/missing-exception-amount-field.udl +0 -2487
- package/conformance/invalid/missing-exception-contract.expected.json +0 -14
- package/conformance/invalid/missing-exception-contract.udl +0 -2523
- package/conformance/invalid/missing-exception-reason-field.expected.json +0 -10
- package/conformance/invalid/missing-exception-reason-field.udl +0 -2487
- package/conformance/invalid/not-an-object.expected.json +0 -10
- package/conformance/invalid/not-an-object.udl +0 -1
- package/conformance/invalid/payout-reconcile-not-a-bank-debit.expected.json +0 -10
- package/conformance/invalid/payout-reconcile-not-a-bank-debit.udl +0 -259
- package/conformance/invalid/piece-plan-without-partition.expected.json +0 -10
- package/conformance/invalid/piece-plan-without-partition.udl +0 -305
- package/conformance/invalid/private-action-independent-approval.expected.json +0 -10
- package/conformance/invalid/private-action-independent-approval.udl +0 -314
- package/conformance/invalid/quote-freeze-set-incomplete.expected.json +0 -10
- package/conformance/invalid/quote-freeze-set-incomplete.udl +0 -261
- package/conformance/invalid/quote-named-reference-gate.expected.json +0 -10
- package/conformance/invalid/quote-named-reference-gate.udl +0 -50
- package/conformance/invalid/reconcile-named-reference-gate.expected.json +0 -10
- package/conformance/invalid/reconcile-named-reference-gate.udl +0 -50
- package/conformance/invalid/unfund-order-not-reversed.expected.json +0 -10
- package/conformance/invalid/unfund-order-not-reversed.udl +0 -314
- package/conformance/invalid/unknown-key.expected.json +0 -10
- package/conformance/invalid/unknown-key.udl +0 -55
- package/conformance/invalid/unknown-reference-gate-field.expected.json +0 -10
- package/conformance/invalid/unknown-reference-gate-field.udl +0 -1819
- package/conformance/invalid/unknown-required-field.expected.json +0 -10
- package/conformance/invalid/unknown-required-field.udl +0 -220
- package/conformance/invalid/unreachable-state.expected.json +0 -10
- package/conformance/invalid/unreachable-state.udl +0 -55
- package/conformance/invalid/wrong-exception-amount-field.expected.json +0 -10
- package/conformance/invalid/wrong-exception-amount-field.udl +0 -2487
- package/conformance/invalid/wrong-exception-reason-field.expected.json +0 -10
- package/conformance/invalid/wrong-exception-reason-field.udl +0 -2487
- package/conformance/valid/agent-description.expected.json +0 -6
- package/conformance/valid/agent-description.udl +0 -66
- package/conformance/valid/attested.expected.json +0 -6
- package/conformance/valid/attested.udl +0 -251
- package/conformance/valid/cards.expected.json +0 -6
- package/conformance/valid/cards.udl +0 -1579
- package/conformance/valid/commerce-escrow.expected.json +0 -6
- package/conformance/valid/commerce-escrow.udl +0 -1512
- package/conformance/valid/compiled-crowdfunding.expected.json +0 -6
- package/conformance/valid/compiled-crowdfunding.udl +0 -1843
- package/conformance/valid/compiled-watch-club.expected.json +0 -6
- package/conformance/valid/compiled-watch-club.udl +0 -2486
- package/conformance/valid/complete-contract.expected.json +0 -6
- package/conformance/valid/complete-contract.udl +0 -218
- package/conformance/valid/effect-signatures.expected.json +0 -6
- package/conformance/valid/effect-signatures.udl +0 -75
- package/conformance/valid/hand-edited.expected.json +0 -6
- package/conformance/valid/hand-edited.udl +0 -1
- package/conformance/valid/insured-car-marketplace.expected.json +0 -6
- package/conformance/valid/insured-car-marketplace.udl +0 -1050
- package/conformance/valid/insured-travel.expected.json +0 -6
- package/conformance/valid/insured-travel.udl +0 -3469
- package/conformance/valid/minimal.expected.json +0 -6
- package/conformance/valid/minimal.udl +0 -62
- package/conformance/valid/piece-plan-calls.expected.json +0 -6
- package/conformance/valid/piece-plan-calls.udl +0 -314
- package/conformance/valid/protection.expected.json +0 -6
- package/conformance/valid/protection.udl +0 -1551
- package/conformance/valid/string-escaping.expected.json +0 -6
- package/conformance/valid/string-escaping.udl +0 -54
- package/conformance/valid/vocabulary.expected.json +0 -6
- package/conformance/valid/vocabulary.udl +0 -2012
- package/dist/allocation.d.ts +0 -60
- package/dist/allocation.d.ts.map +0 -1
- package/dist/allocation.js +0 -177
- package/dist/allocation.js.map +0 -1
- package/dist/check-profiles.d.ts +0 -57
- package/dist/check-profiles.d.ts.map +0 -1
- package/dist/check-profiles.js +0 -62
- package/dist/check-profiles.js.map +0 -1
- package/dist/distribution.d.ts +0 -15
- package/dist/distribution.d.ts.map +0 -1
- package/dist/distribution.js +0 -49
- package/dist/distribution.js.map +0 -1
- package/dist/effects.d.ts +0 -58
- package/dist/effects.d.ts.map +0 -1
- package/dist/effects.js +0 -1126
- package/dist/effects.js.map +0 -1
- package/dist/reference.d.ts +0 -3
- package/dist/reference.d.ts.map +0 -1
- package/dist/reference.js +0 -28
- package/dist/reference.js.map +0 -1
- package/dist/vocabulary.d.ts +0 -23
- package/dist/vocabulary.d.ts.map +0 -1
- package/dist/vocabulary.js +0 -1052
- package/dist/vocabulary.js.map +0 -1
- package/docs/funding-custody.md +0 -165
- package/docs/guide/01-a-document.md +0 -37
- package/docs/guide/02-money-steps.md +0 -23
- package/docs/guide/03-laws.md +0 -18
- package/docs/guide/04-fees-and-remainder.md +0 -36
- package/docs/guide/05-checks-updates-dials.md +0 -7
- package/docs/guide/06-effects.md +0 -11
- package/docs/guide/07-evolution.md +0 -11
- package/docs/guide/08-implementing.md +0 -13
- package/docs/guide/09-schedules-and-allocation.md +0 -132
- package/docs/llms-full.txt +0 -2008
- package/docs/llms.txt +0 -14
- package/docs/piece-plans.md +0 -148
- package/docs/reference/canonical.md +0 -16
- package/docs/reference/clauses.md +0 -1585
- package/docs/reference/cli.md +0 -24
- package/docs/reference/diagnostics.md +0 -38
- package/skills/udl/SKILL.md +0 -28
- package/src/allocation.ts +0 -259
- package/src/check-profiles.ts +0 -80
- package/src/distribution.ts +0 -61
- package/src/effects.ts +0 -1920
- package/src/reference.ts +0 -31
- package/src/vocabulary.ts +0 -1635
|
@@ -1,3469 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"instruments": [
|
|
3
|
-
{
|
|
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"
|
|
17
|
-
],
|
|
18
|
-
"actions": {
|
|
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.",
|
|
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
|
-
},
|
|
30
|
-
"eventName": "flight_booking.amendment_collected",
|
|
31
|
-
"examples": [
|
|
32
|
-
{
|
|
33
|
-
"input": {
|
|
34
|
-
"amendmentNote": "Rebooked SV1024 to the evening departure",
|
|
35
|
-
"fareDifference": "24000",
|
|
36
|
-
"flightBookingId": "fbkg_sandbox_amend0000001",
|
|
37
|
-
"tenantId": "ten_sandbox_travel000001"
|
|
38
|
-
},
|
|
39
|
-
"name": "collect_reissued_fare_increase"
|
|
40
|
-
}
|
|
41
|
-
],
|
|
42
|
-
"input": {
|
|
43
|
-
"additionalProperties": false,
|
|
44
|
-
"properties": {
|
|
45
|
-
"amendmentNote": {
|
|
46
|
-
"maxLength": 180,
|
|
47
|
-
"minLength": 1,
|
|
48
|
-
"type": "string"
|
|
49
|
-
},
|
|
50
|
-
"fareDifference": {
|
|
51
|
-
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
52
|
-
"pattern": "^[1-9][0-9]{0,17}$",
|
|
53
|
-
"type": "string"
|
|
54
|
-
}
|
|
55
|
-
},
|
|
56
|
-
"required": [
|
|
57
|
-
"fareDifference",
|
|
58
|
-
"amendmentNote"
|
|
59
|
-
],
|
|
60
|
-
"type": "object"
|
|
61
|
-
},
|
|
62
|
-
"moves": [
|
|
63
|
-
{
|
|
64
|
-
"bind": {
|
|
65
|
-
"amount": {
|
|
66
|
-
"from": "input",
|
|
67
|
-
"path": "fareDifference"
|
|
68
|
-
},
|
|
69
|
-
"currency": {
|
|
70
|
-
"from": "instance",
|
|
71
|
-
"path": "fields.currency"
|
|
72
|
-
},
|
|
73
|
-
"destinationAccountId": {
|
|
74
|
-
"from": "instance",
|
|
75
|
-
"path": "fields.operatorAccountId"
|
|
76
|
-
},
|
|
77
|
-
"memo": {
|
|
78
|
-
"from": "input",
|
|
79
|
-
"path": "amendmentNote"
|
|
80
|
-
},
|
|
81
|
-
"productId": {
|
|
82
|
-
"from": "instance",
|
|
83
|
-
"path": "productId"
|
|
84
|
-
},
|
|
85
|
-
"sourceAccountId": {
|
|
86
|
-
"from": "instance",
|
|
87
|
-
"path": "fields.travelerAccountId"
|
|
88
|
-
}
|
|
89
|
-
},
|
|
90
|
-
"capture": {
|
|
91
|
-
"amendCollectTransferId": "transferId"
|
|
92
|
-
},
|
|
93
|
-
"key": "transfer",
|
|
94
|
-
"operation": "internal_transfer.create"
|
|
95
|
-
}
|
|
96
|
-
],
|
|
97
|
-
"steps": [],
|
|
98
|
-
"summary": "Collect an amended fare increase"
|
|
99
|
-
},
|
|
100
|
-
"amend_fee": {
|
|
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
|
-
},
|
|
111
|
-
"eventName": "flight_booking.amendment_fee_collected",
|
|
112
|
-
"examples": [
|
|
113
|
-
{
|
|
114
|
-
"input": {
|
|
115
|
-
"amendmentFee": "5000",
|
|
116
|
-
"amendmentNote": "Carrier reissue fee for the date change",
|
|
117
|
-
"flightBookingId": "fbkg_sandbox_amend0000001",
|
|
118
|
-
"tenantId": "ten_sandbox_travel000001"
|
|
119
|
-
},
|
|
120
|
-
"name": "collect_reissue_fee"
|
|
121
|
-
}
|
|
122
|
-
],
|
|
123
|
-
"input": {
|
|
124
|
-
"additionalProperties": false,
|
|
125
|
-
"properties": {
|
|
126
|
-
"amendmentFee": {
|
|
127
|
-
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
128
|
-
"pattern": "^[1-9][0-9]{0,17}$",
|
|
129
|
-
"type": "string"
|
|
130
|
-
},
|
|
131
|
-
"amendmentNote": {
|
|
132
|
-
"maxLength": 180,
|
|
133
|
-
"minLength": 1,
|
|
134
|
-
"type": "string"
|
|
135
|
-
}
|
|
136
|
-
},
|
|
137
|
-
"required": [
|
|
138
|
-
"amendmentFee",
|
|
139
|
-
"amendmentNote"
|
|
140
|
-
],
|
|
141
|
-
"type": "object"
|
|
142
|
-
},
|
|
143
|
-
"moves": [
|
|
144
|
-
{
|
|
145
|
-
"bind": {
|
|
146
|
-
"amount": {
|
|
147
|
-
"from": "input",
|
|
148
|
-
"path": "amendmentFee"
|
|
149
|
-
},
|
|
150
|
-
"currency": {
|
|
151
|
-
"from": "instance",
|
|
152
|
-
"path": "fields.currency"
|
|
153
|
-
},
|
|
154
|
-
"destinationAccountId": {
|
|
155
|
-
"from": "instance",
|
|
156
|
-
"path": "fields.operatorAccountId"
|
|
157
|
-
},
|
|
158
|
-
"memo": {
|
|
159
|
-
"from": "input",
|
|
160
|
-
"path": "amendmentNote"
|
|
161
|
-
},
|
|
162
|
-
"productId": {
|
|
163
|
-
"from": "instance",
|
|
164
|
-
"path": "productId"
|
|
165
|
-
},
|
|
166
|
-
"sourceAccountId": {
|
|
167
|
-
"from": "instance",
|
|
168
|
-
"path": "fields.travelerAccountId"
|
|
169
|
-
}
|
|
170
|
-
},
|
|
171
|
-
"capture": {
|
|
172
|
-
"amendFeeTransferId": "transferId"
|
|
173
|
-
},
|
|
174
|
-
"key": "transfer",
|
|
175
|
-
"operation": "internal_transfer.create"
|
|
176
|
-
}
|
|
177
|
-
],
|
|
178
|
-
"steps": [],
|
|
179
|
-
"summary": "Collect a flight amendment fee"
|
|
180
|
-
},
|
|
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.",
|
|
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
|
-
},
|
|
192
|
-
"eventName": "flight_booking.amendment_refunded",
|
|
193
|
-
"examples": [
|
|
194
|
-
{
|
|
195
|
-
"input": {
|
|
196
|
-
"amendmentNote": "Moved to the lower morning fare",
|
|
197
|
-
"fareDifference": "18500",
|
|
198
|
-
"flightBookingId": "fbkg_sandbox_amend0000001",
|
|
199
|
-
"tenantId": "ten_sandbox_travel000001"
|
|
200
|
-
},
|
|
201
|
-
"name": "refund_reissued_fare_decrease"
|
|
202
|
-
}
|
|
203
|
-
],
|
|
204
|
-
"input": {
|
|
205
|
-
"additionalProperties": false,
|
|
206
|
-
"properties": {
|
|
207
|
-
"amendmentNote": {
|
|
208
|
-
"maxLength": 180,
|
|
209
|
-
"minLength": 1,
|
|
210
|
-
"type": "string"
|
|
211
|
-
},
|
|
212
|
-
"fareDifference": {
|
|
213
|
-
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
214
|
-
"pattern": "^[1-9][0-9]{0,17}$",
|
|
215
|
-
"type": "string"
|
|
216
|
-
}
|
|
217
|
-
},
|
|
218
|
-
"required": [
|
|
219
|
-
"fareDifference",
|
|
220
|
-
"amendmentNote"
|
|
221
|
-
],
|
|
222
|
-
"type": "object"
|
|
223
|
-
},
|
|
224
|
-
"moves": [
|
|
225
|
-
{
|
|
226
|
-
"bind": {
|
|
227
|
-
"amount": {
|
|
228
|
-
"from": "input",
|
|
229
|
-
"path": "fareDifference"
|
|
230
|
-
},
|
|
231
|
-
"currency": {
|
|
232
|
-
"from": "instance",
|
|
233
|
-
"path": "fields.currency"
|
|
234
|
-
},
|
|
235
|
-
"destinationAccountId": {
|
|
236
|
-
"from": "instance",
|
|
237
|
-
"path": "fields.travelerAccountId"
|
|
238
|
-
},
|
|
239
|
-
"memo": {
|
|
240
|
-
"from": "input",
|
|
241
|
-
"path": "amendmentNote"
|
|
242
|
-
},
|
|
243
|
-
"productId": {
|
|
244
|
-
"from": "instance",
|
|
245
|
-
"path": "productId"
|
|
246
|
-
},
|
|
247
|
-
"sourceAccountId": {
|
|
248
|
-
"from": "instance",
|
|
249
|
-
"path": "fields.operatorAccountId"
|
|
250
|
-
}
|
|
251
|
-
},
|
|
252
|
-
"capture": {
|
|
253
|
-
"amendRefundTransferId": "transferId"
|
|
254
|
-
},
|
|
255
|
-
"key": "transfer",
|
|
256
|
-
"operation": "internal_transfer.create"
|
|
257
|
-
}
|
|
258
|
-
],
|
|
259
|
-
"steps": [],
|
|
260
|
-
"summary": "Refund an amended fare decrease"
|
|
261
|
-
},
|
|
262
|
-
"cancel_confirm": {
|
|
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
|
-
},
|
|
274
|
-
"moves": [
|
|
275
|
-
{
|
|
276
|
-
"bind": {
|
|
277
|
-
"amount": {
|
|
278
|
-
"from": "instance",
|
|
279
|
-
"path": "refs.unwindRefund"
|
|
280
|
-
},
|
|
281
|
-
"currency": {
|
|
282
|
-
"from": "instance",
|
|
283
|
-
"path": "fields.currency"
|
|
284
|
-
},
|
|
285
|
-
"destinationAccountId": {
|
|
286
|
-
"from": "instance",
|
|
287
|
-
"path": "fields.travelerAccountId"
|
|
288
|
-
},
|
|
289
|
-
"productId": {
|
|
290
|
-
"from": "instance",
|
|
291
|
-
"path": "productId"
|
|
292
|
-
},
|
|
293
|
-
"sourceAccountId": {
|
|
294
|
-
"from": "instance",
|
|
295
|
-
"path": "refs.fareReserveAccountId"
|
|
296
|
-
}
|
|
297
|
-
},
|
|
298
|
-
"capture": {
|
|
299
|
-
"refundTransferId": "transferId"
|
|
300
|
-
},
|
|
301
|
-
"key": "transfer",
|
|
302
|
-
"operation": "internal_transfer.create"
|
|
303
|
-
}
|
|
304
|
-
],
|
|
305
|
-
"steps": [],
|
|
306
|
-
"summary": "Confirm a flight booking cancellation"
|
|
307
|
-
},
|
|
308
|
-
"cancel_quote": {
|
|
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
|
-
},
|
|
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
|
-
},
|
|
348
|
-
"steps": [],
|
|
349
|
-
"summary": "Quote a flight booking cancellation"
|
|
350
|
-
},
|
|
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.",
|
|
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
|
-
},
|
|
362
|
-
"eventName": "flight_booking.penalty_collected",
|
|
363
|
-
"moves": [
|
|
364
|
-
{
|
|
365
|
-
"bind": {
|
|
366
|
-
"amount": {
|
|
367
|
-
"from": "instance",
|
|
368
|
-
"path": "refs.unwindPenalty"
|
|
369
|
-
},
|
|
370
|
-
"currency": {
|
|
371
|
-
"from": "instance",
|
|
372
|
-
"path": "fields.currency"
|
|
373
|
-
},
|
|
374
|
-
"destinationAccountId": {
|
|
375
|
-
"from": "instance",
|
|
376
|
-
"path": "fields.operatorAccountId"
|
|
377
|
-
},
|
|
378
|
-
"productId": {
|
|
379
|
-
"from": "instance",
|
|
380
|
-
"path": "productId"
|
|
381
|
-
},
|
|
382
|
-
"sourceAccountId": {
|
|
383
|
-
"from": "instance",
|
|
384
|
-
"path": "refs.fareReserveAccountId"
|
|
385
|
-
}
|
|
386
|
-
},
|
|
387
|
-
"capture": {
|
|
388
|
-
"penaltyTransferId": "transferId"
|
|
389
|
-
},
|
|
390
|
-
"key": "transfer",
|
|
391
|
-
"operation": "internal_transfer.create"
|
|
392
|
-
}
|
|
393
|
-
],
|
|
394
|
-
"steps": [],
|
|
395
|
-
"summary": "Collect a flight cancellation penalty"
|
|
396
|
-
},
|
|
397
|
-
"complete": {
|
|
398
|
-
"description": "Closes a confirmed booking at departure and pays the reserved fare to the operator under the machine principal, even if a cancellation quote is parked un-acted. This is the operator's revenue event, fired by the maintenance loop under the departure due-condition.",
|
|
399
|
-
"due": {
|
|
400
|
-
"field": "departsAt"
|
|
401
|
-
},
|
|
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
|
-
},
|
|
417
|
-
"moves": [
|
|
418
|
-
{
|
|
419
|
-
"bind": {
|
|
420
|
-
"amount": {
|
|
421
|
-
"from": "instance",
|
|
422
|
-
"path": "fields.fareAmount"
|
|
423
|
-
},
|
|
424
|
-
"currency": {
|
|
425
|
-
"from": "instance",
|
|
426
|
-
"path": "fields.currency"
|
|
427
|
-
},
|
|
428
|
-
"destinationAccountId": {
|
|
429
|
-
"from": "instance",
|
|
430
|
-
"path": "fields.operatorAccountId"
|
|
431
|
-
},
|
|
432
|
-
"productId": {
|
|
433
|
-
"from": "instance",
|
|
434
|
-
"path": "productId"
|
|
435
|
-
},
|
|
436
|
-
"sourceAccountId": {
|
|
437
|
-
"from": "instance",
|
|
438
|
-
"path": "refs.fareReserveAccountId"
|
|
439
|
-
}
|
|
440
|
-
},
|
|
441
|
-
"capture": {
|
|
442
|
-
"farePayoutTransferId": "transferId"
|
|
443
|
-
},
|
|
444
|
-
"key": "transfer",
|
|
445
|
-
"operation": "internal_transfer.create"
|
|
446
|
-
}
|
|
447
|
-
],
|
|
448
|
-
"steps": [],
|
|
449
|
-
"summary": "Complete a flight booking"
|
|
450
|
-
},
|
|
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.",
|
|
453
|
-
"deadline": {
|
|
454
|
-
"field": "holdExpiresAt"
|
|
455
|
-
},
|
|
456
|
-
"decision": {
|
|
457
|
-
"capability": "air_carrier",
|
|
458
|
-
"deadlineMs": 15000,
|
|
459
|
-
"onTimeout": "decline"
|
|
460
|
-
},
|
|
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
|
-
},
|
|
482
|
-
"moves": [
|
|
483
|
-
{
|
|
484
|
-
"bind": {
|
|
485
|
-
"amount": {
|
|
486
|
-
"from": "instance",
|
|
487
|
-
"path": "fields.fareAmount"
|
|
488
|
-
},
|
|
489
|
-
"currency": {
|
|
490
|
-
"from": "instance",
|
|
491
|
-
"path": "fields.currency"
|
|
492
|
-
},
|
|
493
|
-
"destinationAccountId": {
|
|
494
|
-
"from": "instance",
|
|
495
|
-
"path": "refs.fareReserveAccountId"
|
|
496
|
-
},
|
|
497
|
-
"productId": {
|
|
498
|
-
"from": "instance",
|
|
499
|
-
"path": "productId"
|
|
500
|
-
},
|
|
501
|
-
"sourceAccountId": {
|
|
502
|
-
"from": "instance",
|
|
503
|
-
"path": "fields.travelerAccountId"
|
|
504
|
-
}
|
|
505
|
-
},
|
|
506
|
-
"capture": {
|
|
507
|
-
"fareTransferId": "transferId"
|
|
508
|
-
},
|
|
509
|
-
"key": "transfer",
|
|
510
|
-
"operation": "internal_transfer.create"
|
|
511
|
-
}
|
|
512
|
-
],
|
|
513
|
-
"steps": [],
|
|
514
|
-
"summary": "Confirm a flight booking"
|
|
515
|
-
},
|
|
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.",
|
|
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
|
-
},
|
|
527
|
-
"moves": [],
|
|
528
|
-
"requiresRefs": [
|
|
529
|
-
{
|
|
530
|
-
"field": "travelPackageId",
|
|
531
|
-
"optional": true,
|
|
532
|
-
"statuses": [
|
|
533
|
-
"draft",
|
|
534
|
-
"booked"
|
|
535
|
-
]
|
|
536
|
-
}
|
|
537
|
-
],
|
|
538
|
-
"steps": [
|
|
539
|
-
{
|
|
540
|
-
"bind": {
|
|
541
|
-
"currency": {
|
|
542
|
-
"from": "instance",
|
|
543
|
-
"path": "fields.currency"
|
|
544
|
-
},
|
|
545
|
-
"owner.id": {
|
|
546
|
-
"from": "instance",
|
|
547
|
-
"path": "productId"
|
|
548
|
-
},
|
|
549
|
-
"owner.type": {
|
|
550
|
-
"from": "const",
|
|
551
|
-
"value": "product"
|
|
552
|
-
},
|
|
553
|
-
"productId": {
|
|
554
|
-
"from": "instance",
|
|
555
|
-
"path": "productId"
|
|
556
|
-
},
|
|
557
|
-
"role": {
|
|
558
|
-
"from": "const",
|
|
559
|
-
"value": "product_escrow"
|
|
560
|
-
}
|
|
561
|
-
},
|
|
562
|
-
"capture": {
|
|
563
|
-
"fareReserveAccountId": "accountId"
|
|
564
|
-
},
|
|
565
|
-
"operation": "account.escrow.provision"
|
|
566
|
-
}
|
|
567
|
-
],
|
|
568
|
-
"summary": "Hold a flight booking"
|
|
569
|
-
},
|
|
570
|
-
"expire": {
|
|
571
|
-
"description": "Ends an unconfirmed hold at its deadline. No money has moved, so this is a pure lifecycle transition fired by the maintenance loop under the hold-expiry due-condition.",
|
|
572
|
-
"due": {
|
|
573
|
-
"field": "holdExpiresAt"
|
|
574
|
-
},
|
|
575
|
-
"effects": {
|
|
576
|
-
"schedules": [
|
|
577
|
-
{
|
|
578
|
-
"signature": "schedules.due",
|
|
579
|
-
"source": "due"
|
|
580
|
-
}
|
|
581
|
-
]
|
|
582
|
-
},
|
|
583
|
-
"moves": [],
|
|
584
|
-
"requiresDrainedAccount": {
|
|
585
|
-
"path": "refs.fareReserveAccountId"
|
|
586
|
-
},
|
|
587
|
-
"steps": [],
|
|
588
|
-
"summary": "Expire a held flight booking"
|
|
589
|
-
},
|
|
590
|
-
"package_cancel": {
|
|
591
|
-
"description": "Fires under the machine principal for a leg of a cancelled travel package: refunds the full reserved fare to the traveler, penalty-free, because the cancellation is the package's, not the traveler's. Selectable once the hold window has passed (a confirmed leg is past it in practice); a held leg simply expires on its own deadline, and an already-flown (completed) booking is never cascade-cancelled.",
|
|
592
|
-
"due": {
|
|
593
|
-
"field": "holdExpiresAt",
|
|
594
|
-
"whenParentStatus": {
|
|
595
|
-
"instrumentId": "travel_package",
|
|
596
|
-
"refField": "travelPackageId",
|
|
597
|
-
"statuses": [
|
|
598
|
-
"cancelled"
|
|
599
|
-
]
|
|
600
|
-
}
|
|
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
|
-
},
|
|
616
|
-
"moves": [
|
|
617
|
-
{
|
|
618
|
-
"bind": {
|
|
619
|
-
"amount": {
|
|
620
|
-
"from": "instance",
|
|
621
|
-
"path": "fields.fareAmount"
|
|
622
|
-
},
|
|
623
|
-
"currency": {
|
|
624
|
-
"from": "instance",
|
|
625
|
-
"path": "fields.currency"
|
|
626
|
-
},
|
|
627
|
-
"destinationAccountId": {
|
|
628
|
-
"from": "instance",
|
|
629
|
-
"path": "fields.travelerAccountId"
|
|
630
|
-
},
|
|
631
|
-
"productId": {
|
|
632
|
-
"from": "instance",
|
|
633
|
-
"path": "productId"
|
|
634
|
-
},
|
|
635
|
-
"sourceAccountId": {
|
|
636
|
-
"from": "instance",
|
|
637
|
-
"path": "refs.fareReserveAccountId"
|
|
638
|
-
}
|
|
639
|
-
},
|
|
640
|
-
"capture": {
|
|
641
|
-
"packageRefundTransferId": "transferId"
|
|
642
|
-
},
|
|
643
|
-
"key": "transfer",
|
|
644
|
-
"operation": "internal_transfer.create"
|
|
645
|
-
}
|
|
646
|
-
],
|
|
647
|
-
"steps": [],
|
|
648
|
-
"summary": "Cancel a flight booking with its cancelled package"
|
|
649
|
-
},
|
|
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.",
|
|
652
|
-
"description": "Closes a hold the traveler abandoned before confirmation. No money has moved, so this is a pure lifecycle transition.",
|
|
653
|
-
"moves": [],
|
|
654
|
-
"requiresDrainedAccount": {
|
|
655
|
-
"path": "refs.fareReserveAccountId"
|
|
656
|
-
},
|
|
657
|
-
"steps": [],
|
|
658
|
-
"summary": "Release a held flight booking"
|
|
659
|
-
}
|
|
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"
|
|
674
|
-
},
|
|
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,
|
|
694
|
-
"type": "string"
|
|
695
|
-
},
|
|
696
|
-
"currency": {
|
|
697
|
-
"description": "ISO 4217 currency code",
|
|
698
|
-
"maxLength": 3,
|
|
699
|
-
"minLength": 3,
|
|
700
|
-
"pattern": "^[A-Z]{3}$",
|
|
701
|
-
"type": "string"
|
|
702
|
-
},
|
|
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": {
|
|
717
|
-
"description": "Hyperscale account ID",
|
|
718
|
-
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
719
|
-
"type": "string",
|
|
720
|
-
"x-hyperscale-reference-filter": {
|
|
721
|
-
"column": "role",
|
|
722
|
-
"values": [
|
|
723
|
-
"customer_balance"
|
|
724
|
-
]
|
|
725
|
-
}
|
|
726
|
-
},
|
|
727
|
-
"travelPackageId": {
|
|
728
|
-
"description": "Travel package this booking is a leg of",
|
|
729
|
-
"pattern": "^tpkg_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
730
|
-
"type": "string"
|
|
731
|
-
},
|
|
732
|
-
"travelerAccountId": {
|
|
733
|
-
"description": "Hyperscale account ID",
|
|
734
|
-
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
735
|
-
"type": "string",
|
|
736
|
-
"x-hyperscale-reference-filter": {
|
|
737
|
-
"column": "role",
|
|
738
|
-
"values": [
|
|
739
|
-
"customer_balance"
|
|
740
|
-
]
|
|
741
|
-
}
|
|
742
|
-
}
|
|
743
|
-
},
|
|
744
|
-
"id": "flight_booking",
|
|
745
|
-
"idPrefix": "fbkg",
|
|
746
|
-
"lifecycle": {
|
|
747
|
-
"initial": "held",
|
|
748
|
-
"states": [
|
|
749
|
-
"held",
|
|
750
|
-
"released",
|
|
751
|
-
"confirmed",
|
|
752
|
-
"cancel_quoted",
|
|
753
|
-
"completed",
|
|
754
|
-
"canceled",
|
|
755
|
-
"penalty_collected",
|
|
756
|
-
"package_canceled",
|
|
757
|
-
"expired"
|
|
758
|
-
],
|
|
759
|
-
"transitions": {
|
|
760
|
-
"amend_collect": {
|
|
761
|
-
"from": [
|
|
762
|
-
"confirmed"
|
|
763
|
-
],
|
|
764
|
-
"to": "confirmed"
|
|
765
|
-
},
|
|
766
|
-
"amend_fee": {
|
|
767
|
-
"from": [
|
|
768
|
-
"confirmed"
|
|
769
|
-
],
|
|
770
|
-
"to": "confirmed"
|
|
771
|
-
},
|
|
772
|
-
"amend_refund": {
|
|
773
|
-
"from": [
|
|
774
|
-
"confirmed"
|
|
775
|
-
],
|
|
776
|
-
"to": "confirmed"
|
|
777
|
-
},
|
|
778
|
-
"cancel_confirm": {
|
|
779
|
-
"from": [
|
|
780
|
-
"cancel_quoted"
|
|
781
|
-
],
|
|
782
|
-
"to": "canceled"
|
|
783
|
-
},
|
|
784
|
-
"cancel_quote": {
|
|
785
|
-
"from": [
|
|
786
|
-
"confirmed"
|
|
787
|
-
],
|
|
788
|
-
"to": "cancel_quoted"
|
|
789
|
-
},
|
|
790
|
-
"collect_penalty": {
|
|
791
|
-
"from": [
|
|
792
|
-
"canceled"
|
|
793
|
-
],
|
|
794
|
-
"to": "penalty_collected"
|
|
795
|
-
},
|
|
796
|
-
"complete": {
|
|
797
|
-
"from": [
|
|
798
|
-
"confirmed",
|
|
799
|
-
"cancel_quoted"
|
|
800
|
-
],
|
|
801
|
-
"to": "completed"
|
|
802
|
-
},
|
|
803
|
-
"confirm": {
|
|
804
|
-
"from": [
|
|
805
|
-
"held"
|
|
806
|
-
],
|
|
807
|
-
"to": "confirmed"
|
|
808
|
-
},
|
|
809
|
-
"expire": {
|
|
810
|
-
"from": [
|
|
811
|
-
"held"
|
|
812
|
-
],
|
|
813
|
-
"to": "expired"
|
|
814
|
-
},
|
|
815
|
-
"package_cancel": {
|
|
816
|
-
"from": [
|
|
817
|
-
"confirmed",
|
|
818
|
-
"cancel_quoted"
|
|
819
|
-
],
|
|
820
|
-
"to": "package_canceled"
|
|
821
|
-
},
|
|
822
|
-
"release": {
|
|
823
|
-
"from": [
|
|
824
|
-
"held"
|
|
825
|
-
],
|
|
826
|
-
"to": "released"
|
|
827
|
-
}
|
|
828
|
-
}
|
|
829
|
-
},
|
|
830
|
-
"nav": [
|
|
831
|
-
"Blueprints",
|
|
832
|
-
"Flight Bookings"
|
|
833
|
-
],
|
|
834
|
-
"parties": {
|
|
835
|
-
"beneficiary": "operatorAccountId",
|
|
836
|
-
"payer": "travelerAccountId"
|
|
837
|
-
},
|
|
838
|
-
"required": [
|
|
839
|
-
"travelerAccountId",
|
|
840
|
-
"operatorAccountId",
|
|
841
|
-
"fareAmount",
|
|
842
|
-
"currency",
|
|
843
|
-
"holdExpiresAt",
|
|
844
|
-
"departsAt"
|
|
845
|
-
],
|
|
846
|
-
"subject": {
|
|
847
|
-
"kinds": [
|
|
848
|
-
"flight_itinerary"
|
|
849
|
-
]
|
|
850
|
-
},
|
|
851
|
-
"summary": "Held-then-confirmed flight purchase settled on a carrier decision.",
|
|
852
|
-
"templateId": "air_travel",
|
|
853
|
-
"title": "Flight booking",
|
|
854
|
-
"update": {
|
|
855
|
-
"fields": [
|
|
856
|
-
"departsAt",
|
|
857
|
-
"bookingNote"
|
|
858
|
-
],
|
|
859
|
-
"states": [
|
|
860
|
-
"held",
|
|
861
|
-
"confirmed"
|
|
862
|
-
]
|
|
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": {
|
|
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.",
|
|
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
|
-
},
|
|
892
|
-
"eventName": "hotel_stay.amendment_collected",
|
|
893
|
-
"examples": [
|
|
894
|
-
{
|
|
895
|
-
"input": {
|
|
896
|
-
"amendmentNote": "Extended the stay by two nights",
|
|
897
|
-
"hotelStayId": "hstay_sandbox_amend000001",
|
|
898
|
-
"rateDifference": "32000",
|
|
899
|
-
"tenantId": "ten_sandbox_travel000001"
|
|
900
|
-
},
|
|
901
|
-
"name": "collect_extended_stay_increase"
|
|
902
|
-
}
|
|
903
|
-
],
|
|
904
|
-
"input": {
|
|
905
|
-
"additionalProperties": false,
|
|
906
|
-
"properties": {
|
|
907
|
-
"amendmentNote": {
|
|
908
|
-
"maxLength": 180,
|
|
909
|
-
"minLength": 1,
|
|
910
|
-
"type": "string"
|
|
911
|
-
},
|
|
912
|
-
"rateDifference": {
|
|
913
|
-
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
914
|
-
"pattern": "^[1-9][0-9]{0,17}$",
|
|
915
|
-
"type": "string"
|
|
916
|
-
}
|
|
917
|
-
},
|
|
918
|
-
"required": [
|
|
919
|
-
"rateDifference",
|
|
920
|
-
"amendmentNote"
|
|
921
|
-
],
|
|
922
|
-
"type": "object"
|
|
923
|
-
},
|
|
924
|
-
"moves": [
|
|
925
|
-
{
|
|
926
|
-
"bind": {
|
|
927
|
-
"amount": {
|
|
928
|
-
"from": "input",
|
|
929
|
-
"path": "rateDifference"
|
|
930
|
-
},
|
|
931
|
-
"currency": {
|
|
932
|
-
"from": "instance",
|
|
933
|
-
"path": "fields.currency"
|
|
934
|
-
},
|
|
935
|
-
"destinationAccountId": {
|
|
936
|
-
"from": "instance",
|
|
937
|
-
"path": "fields.propertyAccountId"
|
|
938
|
-
},
|
|
939
|
-
"memo": {
|
|
940
|
-
"from": "input",
|
|
941
|
-
"path": "amendmentNote"
|
|
942
|
-
},
|
|
943
|
-
"productId": {
|
|
944
|
-
"from": "instance",
|
|
945
|
-
"path": "productId"
|
|
946
|
-
},
|
|
947
|
-
"sourceAccountId": {
|
|
948
|
-
"from": "instance",
|
|
949
|
-
"path": "fields.guestAccountId"
|
|
950
|
-
}
|
|
951
|
-
},
|
|
952
|
-
"capture": {
|
|
953
|
-
"amendCollectTransferId": "transferId"
|
|
954
|
-
},
|
|
955
|
-
"key": "transfer",
|
|
956
|
-
"operation": "internal_transfer.create"
|
|
957
|
-
}
|
|
958
|
-
],
|
|
959
|
-
"steps": [],
|
|
960
|
-
"summary": "Collect an amended rate increase"
|
|
961
|
-
},
|
|
962
|
-
"amend_fee": {
|
|
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
|
-
},
|
|
973
|
-
"eventName": "hotel_stay.amendment_fee_collected",
|
|
974
|
-
"examples": [
|
|
975
|
-
{
|
|
976
|
-
"input": {
|
|
977
|
-
"amendmentFee": "7500",
|
|
978
|
-
"amendmentNote": "Property fee for the date change",
|
|
979
|
-
"hotelStayId": "hstay_sandbox_amend000001",
|
|
980
|
-
"tenantId": "ten_sandbox_travel000001"
|
|
981
|
-
},
|
|
982
|
-
"name": "collect_date_change_fee"
|
|
983
|
-
}
|
|
984
|
-
],
|
|
985
|
-
"input": {
|
|
986
|
-
"additionalProperties": false,
|
|
987
|
-
"properties": {
|
|
988
|
-
"amendmentFee": {
|
|
989
|
-
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
990
|
-
"pattern": "^[1-9][0-9]{0,17}$",
|
|
991
|
-
"type": "string"
|
|
992
|
-
},
|
|
993
|
-
"amendmentNote": {
|
|
994
|
-
"maxLength": 180,
|
|
995
|
-
"minLength": 1,
|
|
996
|
-
"type": "string"
|
|
997
|
-
}
|
|
998
|
-
},
|
|
999
|
-
"required": [
|
|
1000
|
-
"amendmentFee",
|
|
1001
|
-
"amendmentNote"
|
|
1002
|
-
],
|
|
1003
|
-
"type": "object"
|
|
1004
|
-
},
|
|
1005
|
-
"moves": [
|
|
1006
|
-
{
|
|
1007
|
-
"bind": {
|
|
1008
|
-
"amount": {
|
|
1009
|
-
"from": "input",
|
|
1010
|
-
"path": "amendmentFee"
|
|
1011
|
-
},
|
|
1012
|
-
"currency": {
|
|
1013
|
-
"from": "instance",
|
|
1014
|
-
"path": "fields.currency"
|
|
1015
|
-
},
|
|
1016
|
-
"destinationAccountId": {
|
|
1017
|
-
"from": "instance",
|
|
1018
|
-
"path": "fields.propertyAccountId"
|
|
1019
|
-
},
|
|
1020
|
-
"memo": {
|
|
1021
|
-
"from": "input",
|
|
1022
|
-
"path": "amendmentNote"
|
|
1023
|
-
},
|
|
1024
|
-
"productId": {
|
|
1025
|
-
"from": "instance",
|
|
1026
|
-
"path": "productId"
|
|
1027
|
-
},
|
|
1028
|
-
"sourceAccountId": {
|
|
1029
|
-
"from": "instance",
|
|
1030
|
-
"path": "fields.guestAccountId"
|
|
1031
|
-
}
|
|
1032
|
-
},
|
|
1033
|
-
"capture": {
|
|
1034
|
-
"amendFeeTransferId": "transferId"
|
|
1035
|
-
},
|
|
1036
|
-
"key": "transfer",
|
|
1037
|
-
"operation": "internal_transfer.create"
|
|
1038
|
-
}
|
|
1039
|
-
],
|
|
1040
|
-
"steps": [],
|
|
1041
|
-
"summary": "Collect a stay amendment fee"
|
|
1042
|
-
},
|
|
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.",
|
|
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
|
-
},
|
|
1054
|
-
"eventName": "hotel_stay.amendment_refunded",
|
|
1055
|
-
"examples": [
|
|
1056
|
-
{
|
|
1057
|
-
"input": {
|
|
1058
|
-
"amendmentNote": "Shortened the stay by one night",
|
|
1059
|
-
"hotelStayId": "hstay_sandbox_amend000001",
|
|
1060
|
-
"rateDifference": "16000",
|
|
1061
|
-
"tenantId": "ten_sandbox_travel000001"
|
|
1062
|
-
},
|
|
1063
|
-
"name": "refund_shortened_stay_decrease"
|
|
1064
|
-
}
|
|
1065
|
-
],
|
|
1066
|
-
"input": {
|
|
1067
|
-
"additionalProperties": false,
|
|
1068
|
-
"properties": {
|
|
1069
|
-
"amendmentNote": {
|
|
1070
|
-
"maxLength": 180,
|
|
1071
|
-
"minLength": 1,
|
|
1072
|
-
"type": "string"
|
|
1073
|
-
},
|
|
1074
|
-
"rateDifference": {
|
|
1075
|
-
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
1076
|
-
"pattern": "^[1-9][0-9]{0,17}$",
|
|
1077
|
-
"type": "string"
|
|
1078
|
-
}
|
|
1079
|
-
},
|
|
1080
|
-
"required": [
|
|
1081
|
-
"rateDifference",
|
|
1082
|
-
"amendmentNote"
|
|
1083
|
-
],
|
|
1084
|
-
"type": "object"
|
|
1085
|
-
},
|
|
1086
|
-
"moves": [
|
|
1087
|
-
{
|
|
1088
|
-
"bind": {
|
|
1089
|
-
"amount": {
|
|
1090
|
-
"from": "input",
|
|
1091
|
-
"path": "rateDifference"
|
|
1092
|
-
},
|
|
1093
|
-
"currency": {
|
|
1094
|
-
"from": "instance",
|
|
1095
|
-
"path": "fields.currency"
|
|
1096
|
-
},
|
|
1097
|
-
"destinationAccountId": {
|
|
1098
|
-
"from": "instance",
|
|
1099
|
-
"path": "fields.guestAccountId"
|
|
1100
|
-
},
|
|
1101
|
-
"memo": {
|
|
1102
|
-
"from": "input",
|
|
1103
|
-
"path": "amendmentNote"
|
|
1104
|
-
},
|
|
1105
|
-
"productId": {
|
|
1106
|
-
"from": "instance",
|
|
1107
|
-
"path": "productId"
|
|
1108
|
-
},
|
|
1109
|
-
"sourceAccountId": {
|
|
1110
|
-
"from": "instance",
|
|
1111
|
-
"path": "fields.propertyAccountId"
|
|
1112
|
-
}
|
|
1113
|
-
},
|
|
1114
|
-
"capture": {
|
|
1115
|
-
"amendRefundTransferId": "transferId"
|
|
1116
|
-
},
|
|
1117
|
-
"key": "transfer",
|
|
1118
|
-
"operation": "internal_transfer.create"
|
|
1119
|
-
}
|
|
1120
|
-
],
|
|
1121
|
-
"steps": [],
|
|
1122
|
-
"summary": "Refund an amended rate decrease"
|
|
1123
|
-
},
|
|
1124
|
-
"cancel_confirm": {
|
|
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
|
-
},
|
|
1136
|
-
"moves": [
|
|
1137
|
-
{
|
|
1138
|
-
"bind": {
|
|
1139
|
-
"amount": {
|
|
1140
|
-
"from": "instance",
|
|
1141
|
-
"path": "refs.unwindRefund"
|
|
1142
|
-
},
|
|
1143
|
-
"currency": {
|
|
1144
|
-
"from": "instance",
|
|
1145
|
-
"path": "fields.currency"
|
|
1146
|
-
},
|
|
1147
|
-
"destinationAccountId": {
|
|
1148
|
-
"from": "instance",
|
|
1149
|
-
"path": "fields.guestAccountId"
|
|
1150
|
-
},
|
|
1151
|
-
"productId": {
|
|
1152
|
-
"from": "instance",
|
|
1153
|
-
"path": "productId"
|
|
1154
|
-
},
|
|
1155
|
-
"sourceAccountId": {
|
|
1156
|
-
"from": "instance",
|
|
1157
|
-
"path": "refs.rateReserveAccountId"
|
|
1158
|
-
}
|
|
1159
|
-
},
|
|
1160
|
-
"capture": {
|
|
1161
|
-
"refundTransferId": "transferId"
|
|
1162
|
-
},
|
|
1163
|
-
"key": "transfer",
|
|
1164
|
-
"operation": "internal_transfer.create"
|
|
1165
|
-
}
|
|
1166
|
-
],
|
|
1167
|
-
"steps": [],
|
|
1168
|
-
"summary": "Confirm a hotel stay cancellation"
|
|
1169
|
-
},
|
|
1170
|
-
"cancel_quote": {
|
|
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
|
-
},
|
|
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
|
-
},
|
|
1210
|
-
"steps": [],
|
|
1211
|
-
"summary": "Quote a hotel stay cancellation"
|
|
1212
|
-
},
|
|
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.",
|
|
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
|
-
},
|
|
1224
|
-
"eventName": "hotel_stay.penalty_collected",
|
|
1225
|
-
"moves": [
|
|
1226
|
-
{
|
|
1227
|
-
"bind": {
|
|
1228
|
-
"amount": {
|
|
1229
|
-
"from": "instance",
|
|
1230
|
-
"path": "refs.unwindPenalty"
|
|
1231
|
-
},
|
|
1232
|
-
"currency": {
|
|
1233
|
-
"from": "instance",
|
|
1234
|
-
"path": "fields.currency"
|
|
1235
|
-
},
|
|
1236
|
-
"destinationAccountId": {
|
|
1237
|
-
"from": "instance",
|
|
1238
|
-
"path": "fields.propertyAccountId"
|
|
1239
|
-
},
|
|
1240
|
-
"productId": {
|
|
1241
|
-
"from": "instance",
|
|
1242
|
-
"path": "productId"
|
|
1243
|
-
},
|
|
1244
|
-
"sourceAccountId": {
|
|
1245
|
-
"from": "instance",
|
|
1246
|
-
"path": "refs.rateReserveAccountId"
|
|
1247
|
-
}
|
|
1248
|
-
},
|
|
1249
|
-
"capture": {
|
|
1250
|
-
"penaltyTransferId": "transferId"
|
|
1251
|
-
},
|
|
1252
|
-
"key": "transfer",
|
|
1253
|
-
"operation": "internal_transfer.create"
|
|
1254
|
-
}
|
|
1255
|
-
],
|
|
1256
|
-
"steps": [],
|
|
1257
|
-
"summary": "Collect a hotel cancellation penalty"
|
|
1258
|
-
},
|
|
1259
|
-
"complete": {
|
|
1260
|
-
"description": "Closes a confirmed stay at checkout and pays the reserved rate to the property under the machine principal, even if a cancellation quote is parked un-acted. This is the property's revenue event, fired by the maintenance loop under the checkout due-condition.",
|
|
1261
|
-
"due": {
|
|
1262
|
-
"field": "checkOutAt"
|
|
1263
|
-
},
|
|
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
|
-
},
|
|
1279
|
-
"moves": [
|
|
1280
|
-
{
|
|
1281
|
-
"bind": {
|
|
1282
|
-
"amount": {
|
|
1283
|
-
"from": "instance",
|
|
1284
|
-
"path": "fields.rateAmount"
|
|
1285
|
-
},
|
|
1286
|
-
"currency": {
|
|
1287
|
-
"from": "instance",
|
|
1288
|
-
"path": "fields.currency"
|
|
1289
|
-
},
|
|
1290
|
-
"destinationAccountId": {
|
|
1291
|
-
"from": "instance",
|
|
1292
|
-
"path": "fields.propertyAccountId"
|
|
1293
|
-
},
|
|
1294
|
-
"productId": {
|
|
1295
|
-
"from": "instance",
|
|
1296
|
-
"path": "productId"
|
|
1297
|
-
},
|
|
1298
|
-
"sourceAccountId": {
|
|
1299
|
-
"from": "instance",
|
|
1300
|
-
"path": "refs.rateReserveAccountId"
|
|
1301
|
-
}
|
|
1302
|
-
},
|
|
1303
|
-
"capture": {
|
|
1304
|
-
"ratePayoutTransferId": "transferId"
|
|
1305
|
-
},
|
|
1306
|
-
"key": "transfer",
|
|
1307
|
-
"operation": "internal_transfer.create"
|
|
1308
|
-
}
|
|
1309
|
-
],
|
|
1310
|
-
"steps": [],
|
|
1311
|
-
"summary": "Complete a hotel stay"
|
|
1312
|
-
},
|
|
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.",
|
|
1315
|
-
"deadline": {
|
|
1316
|
-
"field": "holdExpiresAt"
|
|
1317
|
-
},
|
|
1318
|
-
"decision": {
|
|
1319
|
-
"capability": "lodging_supplier",
|
|
1320
|
-
"deadlineMs": 15000,
|
|
1321
|
-
"onTimeout": "decline"
|
|
1322
|
-
},
|
|
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
|
-
},
|
|
1344
|
-
"moves": [
|
|
1345
|
-
{
|
|
1346
|
-
"bind": {
|
|
1347
|
-
"amount": {
|
|
1348
|
-
"from": "instance",
|
|
1349
|
-
"path": "fields.rateAmount"
|
|
1350
|
-
},
|
|
1351
|
-
"currency": {
|
|
1352
|
-
"from": "instance",
|
|
1353
|
-
"path": "fields.currency"
|
|
1354
|
-
},
|
|
1355
|
-
"destinationAccountId": {
|
|
1356
|
-
"from": "instance",
|
|
1357
|
-
"path": "refs.rateReserveAccountId"
|
|
1358
|
-
},
|
|
1359
|
-
"productId": {
|
|
1360
|
-
"from": "instance",
|
|
1361
|
-
"path": "productId"
|
|
1362
|
-
},
|
|
1363
|
-
"sourceAccountId": {
|
|
1364
|
-
"from": "instance",
|
|
1365
|
-
"path": "fields.guestAccountId"
|
|
1366
|
-
}
|
|
1367
|
-
},
|
|
1368
|
-
"capture": {
|
|
1369
|
-
"rateTransferId": "transferId"
|
|
1370
|
-
},
|
|
1371
|
-
"key": "transfer",
|
|
1372
|
-
"operation": "internal_transfer.create"
|
|
1373
|
-
}
|
|
1374
|
-
],
|
|
1375
|
-
"steps": [],
|
|
1376
|
-
"summary": "Confirm a hotel stay"
|
|
1377
|
-
},
|
|
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.",
|
|
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
|
-
},
|
|
1389
|
-
"moves": [],
|
|
1390
|
-
"requiresRefs": [
|
|
1391
|
-
{
|
|
1392
|
-
"field": "travelPackageId",
|
|
1393
|
-
"optional": true,
|
|
1394
|
-
"statuses": [
|
|
1395
|
-
"draft",
|
|
1396
|
-
"booked"
|
|
1397
|
-
]
|
|
1398
|
-
}
|
|
1399
|
-
],
|
|
1400
|
-
"steps": [
|
|
1401
|
-
{
|
|
1402
|
-
"bind": {
|
|
1403
|
-
"currency": {
|
|
1404
|
-
"from": "instance",
|
|
1405
|
-
"path": "fields.currency"
|
|
1406
|
-
},
|
|
1407
|
-
"owner.id": {
|
|
1408
|
-
"from": "instance",
|
|
1409
|
-
"path": "productId"
|
|
1410
|
-
},
|
|
1411
|
-
"owner.type": {
|
|
1412
|
-
"from": "const",
|
|
1413
|
-
"value": "product"
|
|
1414
|
-
},
|
|
1415
|
-
"productId": {
|
|
1416
|
-
"from": "instance",
|
|
1417
|
-
"path": "productId"
|
|
1418
|
-
},
|
|
1419
|
-
"role": {
|
|
1420
|
-
"from": "const",
|
|
1421
|
-
"value": "product_escrow"
|
|
1422
|
-
}
|
|
1423
|
-
},
|
|
1424
|
-
"capture": {
|
|
1425
|
-
"rateReserveAccountId": "accountId"
|
|
1426
|
-
},
|
|
1427
|
-
"operation": "account.escrow.provision"
|
|
1428
|
-
}
|
|
1429
|
-
],
|
|
1430
|
-
"summary": "Hold a hotel stay"
|
|
1431
|
-
},
|
|
1432
|
-
"expire": {
|
|
1433
|
-
"description": "Ends an unconfirmed hold at its deadline. No money has moved, so this is a pure lifecycle transition fired by the maintenance loop under the hold-expiry due-condition.",
|
|
1434
|
-
"due": {
|
|
1435
|
-
"field": "holdExpiresAt"
|
|
1436
|
-
},
|
|
1437
|
-
"effects": {
|
|
1438
|
-
"schedules": [
|
|
1439
|
-
{
|
|
1440
|
-
"signature": "schedules.due",
|
|
1441
|
-
"source": "due"
|
|
1442
|
-
}
|
|
1443
|
-
]
|
|
1444
|
-
},
|
|
1445
|
-
"moves": [],
|
|
1446
|
-
"requiresDrainedAccount": {
|
|
1447
|
-
"path": "refs.rateReserveAccountId"
|
|
1448
|
-
},
|
|
1449
|
-
"steps": [],
|
|
1450
|
-
"summary": "Expire a held hotel stay"
|
|
1451
|
-
},
|
|
1452
|
-
"package_cancel": {
|
|
1453
|
-
"description": "Fires under the machine principal for a leg of a cancelled travel package: refunds the full reserved rate to the guest, penalty-free, because the cancellation is the package's, not the guest's. Selectable once the hold window has passed (a confirmed leg is past it in practice); a held leg simply expires on its own deadline, and a completed stay is never cascade-cancelled.",
|
|
1454
|
-
"due": {
|
|
1455
|
-
"field": "holdExpiresAt",
|
|
1456
|
-
"whenParentStatus": {
|
|
1457
|
-
"instrumentId": "travel_package",
|
|
1458
|
-
"refField": "travelPackageId",
|
|
1459
|
-
"statuses": [
|
|
1460
|
-
"cancelled"
|
|
1461
|
-
]
|
|
1462
|
-
}
|
|
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
|
-
},
|
|
1478
|
-
"moves": [
|
|
1479
|
-
{
|
|
1480
|
-
"bind": {
|
|
1481
|
-
"amount": {
|
|
1482
|
-
"from": "instance",
|
|
1483
|
-
"path": "fields.rateAmount"
|
|
1484
|
-
},
|
|
1485
|
-
"currency": {
|
|
1486
|
-
"from": "instance",
|
|
1487
|
-
"path": "fields.currency"
|
|
1488
|
-
},
|
|
1489
|
-
"destinationAccountId": {
|
|
1490
|
-
"from": "instance",
|
|
1491
|
-
"path": "fields.guestAccountId"
|
|
1492
|
-
},
|
|
1493
|
-
"productId": {
|
|
1494
|
-
"from": "instance",
|
|
1495
|
-
"path": "productId"
|
|
1496
|
-
},
|
|
1497
|
-
"sourceAccountId": {
|
|
1498
|
-
"from": "instance",
|
|
1499
|
-
"path": "refs.rateReserveAccountId"
|
|
1500
|
-
}
|
|
1501
|
-
},
|
|
1502
|
-
"capture": {
|
|
1503
|
-
"packageRefundTransferId": "transferId"
|
|
1504
|
-
},
|
|
1505
|
-
"key": "transfer",
|
|
1506
|
-
"operation": "internal_transfer.create"
|
|
1507
|
-
}
|
|
1508
|
-
],
|
|
1509
|
-
"steps": [],
|
|
1510
|
-
"summary": "Cancel a hotel stay with its cancelled package"
|
|
1511
|
-
},
|
|
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.",
|
|
1514
|
-
"description": "Closes a hold the guest abandoned before confirmation. No money has moved, so this is a pure lifecycle transition.",
|
|
1515
|
-
"moves": [],
|
|
1516
|
-
"requiresDrainedAccount": {
|
|
1517
|
-
"path": "refs.rateReserveAccountId"
|
|
1518
|
-
},
|
|
1519
|
-
"steps": [],
|
|
1520
|
-
"summary": "Release a held hotel stay"
|
|
1521
|
-
}
|
|
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
|
-
],
|
|
1552
|
-
"fields": {
|
|
1553
|
-
"checkInAt": {
|
|
1554
|
-
"format": "hyperscale-date-time",
|
|
1555
|
-
"type": "string"
|
|
1556
|
-
},
|
|
1557
|
-
"checkOutAt": {
|
|
1558
|
-
"format": "hyperscale-date-time",
|
|
1559
|
-
"type": "string"
|
|
1560
|
-
},
|
|
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": {
|
|
1584
|
-
"description": "Hyperscale account ID",
|
|
1585
|
-
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
1586
|
-
"type": "string",
|
|
1587
|
-
"x-hyperscale-reference-filter": {
|
|
1588
|
-
"column": "role",
|
|
1589
|
-
"values": [
|
|
1590
|
-
"customer_balance"
|
|
1591
|
-
]
|
|
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"
|
|
1608
|
-
}
|
|
1609
|
-
},
|
|
1610
|
-
"id": "hotel_stay",
|
|
1611
|
-
"idPrefix": "hstay",
|
|
1612
|
-
"lifecycle": {
|
|
1613
|
-
"initial": "held",
|
|
1614
|
-
"states": [
|
|
1615
|
-
"held",
|
|
1616
|
-
"released",
|
|
1617
|
-
"confirmed",
|
|
1618
|
-
"cancel_quoted",
|
|
1619
|
-
"completed",
|
|
1620
|
-
"canceled",
|
|
1621
|
-
"penalty_collected",
|
|
1622
|
-
"package_canceled",
|
|
1623
|
-
"expired"
|
|
1624
|
-
],
|
|
1625
|
-
"transitions": {
|
|
1626
|
-
"amend_collect": {
|
|
1627
|
-
"from": [
|
|
1628
|
-
"confirmed"
|
|
1629
|
-
],
|
|
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"
|
|
1661
|
-
},
|
|
1662
|
-
"complete": {
|
|
1663
|
-
"from": [
|
|
1664
|
-
"confirmed",
|
|
1665
|
-
"cancel_quoted"
|
|
1666
|
-
],
|
|
1667
|
-
"to": "completed"
|
|
1668
|
-
},
|
|
1669
|
-
"confirm": {
|
|
1670
|
-
"from": [
|
|
1671
|
-
"held"
|
|
1672
|
-
],
|
|
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"
|
|
1693
|
-
}
|
|
1694
|
-
}
|
|
1695
|
-
},
|
|
1696
|
-
"nav": [
|
|
1697
|
-
"Blueprints",
|
|
1698
|
-
"Hotel Stays"
|
|
1699
|
-
],
|
|
1700
|
-
"parties": {
|
|
1701
|
-
"beneficiary": "propertyAccountId",
|
|
1702
|
-
"payer": "guestAccountId"
|
|
1703
|
-
},
|
|
1704
|
-
"required": [
|
|
1705
|
-
"guestAccountId",
|
|
1706
|
-
"propertyAccountId",
|
|
1707
|
-
"rateAmount",
|
|
1708
|
-
"currency",
|
|
1709
|
-
"holdExpiresAt",
|
|
1710
|
-
"checkInAt",
|
|
1711
|
-
"checkOutAt"
|
|
1712
|
-
],
|
|
1713
|
-
"subject": {
|
|
1714
|
-
"kinds": [
|
|
1715
|
-
"lodging_stay"
|
|
1716
|
-
]
|
|
1717
|
-
},
|
|
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": {
|
|
1741
|
-
"cancel": {
|
|
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
|
-
],
|
|
1753
|
-
"moves": [],
|
|
1754
|
-
"steps": [],
|
|
1755
|
-
"summary": "Cancel a booked travel package"
|
|
1756
|
-
},
|
|
1757
|
-
"complete": {
|
|
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
|
-
],
|
|
1769
|
-
"moves": [],
|
|
1770
|
-
"steps": [],
|
|
1771
|
-
"summary": "Complete a delivered travel package"
|
|
1772
|
-
},
|
|
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.",
|
|
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
|
-
],
|
|
1793
|
-
"moves": [],
|
|
1794
|
-
"requiresAggregate": [
|
|
1795
|
-
{
|
|
1796
|
-
"check": {
|
|
1797
|
-
"kind": "all_in"
|
|
1798
|
-
},
|
|
1799
|
-
"instrumentId": "flight_booking",
|
|
1800
|
-
"over": "children",
|
|
1801
|
-
"refField": "travelPackageId",
|
|
1802
|
-
"statuses": [
|
|
1803
|
-
"confirmed"
|
|
1804
|
-
]
|
|
1805
|
-
},
|
|
1806
|
-
{
|
|
1807
|
-
"check": {
|
|
1808
|
-
"kind": "all_in"
|
|
1809
|
-
},
|
|
1810
|
-
"instrumentId": "hotel_stay",
|
|
1811
|
-
"over": "children",
|
|
1812
|
-
"refField": "travelPackageId",
|
|
1813
|
-
"statuses": [
|
|
1814
|
-
"confirmed"
|
|
1815
|
-
]
|
|
1816
|
-
}
|
|
1817
|
-
],
|
|
1818
|
-
"steps": [],
|
|
1819
|
-
"summary": "Confirm a travel package"
|
|
1820
|
-
},
|
|
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.",
|
|
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.",
|
|
1824
|
-
"examples": [
|
|
1825
|
-
{
|
|
1826
|
-
"input": {
|
|
1827
|
-
"departAt": "2026-09-01T21:00:00.000Z",
|
|
1828
|
-
"memo": "Jeddah corniche long weekend.",
|
|
1829
|
-
"payerAccountId": "acct_sandbox_traveler0001",
|
|
1830
|
-
"productId": "prd_sandbox_travel000001",
|
|
1831
|
-
"subject": "sbj_sandbox_travelparty01",
|
|
1832
|
-
"tenantId": "ten_sandbox_travel000001"
|
|
1833
|
-
},
|
|
1834
|
-
"name": "draft_jeddah_getaway"
|
|
1835
|
-
}
|
|
1836
|
-
],
|
|
1837
|
-
"moves": [],
|
|
1838
|
-
"steps": [],
|
|
1839
|
-
"summary": "Draft a travel package"
|
|
1840
|
-
}
|
|
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.",
|
|
1848
|
-
"fields": {
|
|
1849
|
-
"departAt": {
|
|
1850
|
-
"format": "hyperscale-date-time",
|
|
1851
|
-
"type": "string"
|
|
1852
|
-
},
|
|
1853
|
-
"memo": {
|
|
1854
|
-
"maxLength": 180,
|
|
1855
|
-
"minLength": 1,
|
|
1856
|
-
"type": "string"
|
|
1857
|
-
},
|
|
1858
|
-
"payerAccountId": {
|
|
1859
|
-
"description": "Hyperscale account ID",
|
|
1860
|
-
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
1861
|
-
"type": "string",
|
|
1862
|
-
"x-hyperscale-reference-filter": {
|
|
1863
|
-
"column": "role",
|
|
1864
|
-
"values": [
|
|
1865
|
-
"customer_balance"
|
|
1866
|
-
]
|
|
1867
|
-
}
|
|
1868
|
-
}
|
|
1869
|
-
},
|
|
1870
|
-
"id": "travel_package",
|
|
1871
|
-
"idPrefix": "tpkg",
|
|
1872
|
-
"lifecycle": {
|
|
1873
|
-
"initial": "draft",
|
|
1874
|
-
"states": [
|
|
1875
|
-
"draft",
|
|
1876
|
-
"booked",
|
|
1877
|
-
"completed",
|
|
1878
|
-
"cancelled"
|
|
1879
|
-
],
|
|
1880
|
-
"transitions": {
|
|
1881
|
-
"cancel": {
|
|
1882
|
-
"from": [
|
|
1883
|
-
"booked"
|
|
1884
|
-
],
|
|
1885
|
-
"to": "cancelled"
|
|
1886
|
-
},
|
|
1887
|
-
"complete": {
|
|
1888
|
-
"from": [
|
|
1889
|
-
"booked"
|
|
1890
|
-
],
|
|
1891
|
-
"to": "completed"
|
|
1892
|
-
},
|
|
1893
|
-
"confirm": {
|
|
1894
|
-
"from": [
|
|
1895
|
-
"draft"
|
|
1896
|
-
],
|
|
1897
|
-
"to": "booked"
|
|
1898
|
-
}
|
|
1899
|
-
}
|
|
1900
|
-
},
|
|
1901
|
-
"nav": [
|
|
1902
|
-
"Blueprints",
|
|
1903
|
-
"Travel Packages"
|
|
1904
|
-
],
|
|
1905
|
-
"parties": {
|
|
1906
|
-
"payer": "payerAccountId"
|
|
1907
|
-
},
|
|
1908
|
-
"required": [
|
|
1909
|
-
"payerAccountId",
|
|
1910
|
-
"departAt"
|
|
1911
|
-
],
|
|
1912
|
-
"subject": {
|
|
1913
|
-
"kinds": [
|
|
1914
|
-
"traveler_party"
|
|
1915
|
-
]
|
|
1916
|
-
},
|
|
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": {
|
|
1933
|
-
"activate": {
|
|
1934
|
-
"description": "Starts cover at the declared time and pays the held premium to the insurer under the machine principal.",
|
|
1935
|
-
"due": {
|
|
1936
|
-
"field": "startsAt"
|
|
1937
|
-
},
|
|
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
|
-
],
|
|
1962
|
-
"moves": [
|
|
1963
|
-
{
|
|
1964
|
-
"bind": {
|
|
1965
|
-
"amount": {
|
|
1966
|
-
"from": "instance",
|
|
1967
|
-
"path": "fields.premiumAmount"
|
|
1968
|
-
},
|
|
1969
|
-
"currency": {
|
|
1970
|
-
"from": "instance",
|
|
1971
|
-
"path": "fields.currency"
|
|
1972
|
-
},
|
|
1973
|
-
"destinationAccountId": {
|
|
1974
|
-
"from": "instance",
|
|
1975
|
-
"path": "fields.insurerAccountId"
|
|
1976
|
-
},
|
|
1977
|
-
"productId": {
|
|
1978
|
-
"from": "instance",
|
|
1979
|
-
"path": "productId"
|
|
1980
|
-
},
|
|
1981
|
-
"sourceAccountId": {
|
|
1982
|
-
"from": "instance",
|
|
1983
|
-
"path": "refs.premiumReserveAccountId"
|
|
1984
|
-
}
|
|
1985
|
-
},
|
|
1986
|
-
"capture": {
|
|
1987
|
-
"premiumTransferId": "transferId"
|
|
1988
|
-
},
|
|
1989
|
-
"key": "transfer",
|
|
1990
|
-
"operation": "internal_transfer.create"
|
|
1991
|
-
}
|
|
1992
|
-
],
|
|
1993
|
-
"steps": [],
|
|
1994
|
-
"summary": "Activate a policy"
|
|
1995
|
-
},
|
|
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.",
|
|
1998
|
-
"decision": {
|
|
1999
|
-
"capability": "insurance_carrier",
|
|
2000
|
-
"deadlineMs": 15000,
|
|
2001
|
-
"onTimeout": "decline"
|
|
2002
|
-
},
|
|
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
|
-
},
|
|
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
|
-
],
|
|
2028
|
-
"moves": [
|
|
2029
|
-
{
|
|
2030
|
-
"bind": {
|
|
2031
|
-
"amount": {
|
|
2032
|
-
"from": "instance",
|
|
2033
|
-
"path": "fields.premiumAmount"
|
|
2034
|
-
},
|
|
2035
|
-
"currency": {
|
|
2036
|
-
"from": "instance",
|
|
2037
|
-
"path": "fields.currency"
|
|
2038
|
-
},
|
|
2039
|
-
"destinationAccountId": {
|
|
2040
|
-
"from": "instance",
|
|
2041
|
-
"path": "refs.premiumReserveAccountId"
|
|
2042
|
-
},
|
|
2043
|
-
"productId": {
|
|
2044
|
-
"from": "instance",
|
|
2045
|
-
"path": "productId"
|
|
2046
|
-
},
|
|
2047
|
-
"sourceAccountId": {
|
|
2048
|
-
"from": "instance",
|
|
2049
|
-
"path": "fields.policyholderAccountId"
|
|
2050
|
-
}
|
|
2051
|
-
},
|
|
2052
|
-
"capture": {
|
|
2053
|
-
"premiumFundingTransferId": "transferId"
|
|
2054
|
-
},
|
|
2055
|
-
"key": "transfer",
|
|
2056
|
-
"operation": "internal_transfer.create"
|
|
2057
|
-
}
|
|
2058
|
-
],
|
|
2059
|
-
"steps": [],
|
|
2060
|
-
"summary": "Bind a policy"
|
|
2061
|
-
},
|
|
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",
|
|
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
|
-
],
|
|
2083
|
-
"moves": [
|
|
2084
|
-
{
|
|
2085
|
-
"bind": {
|
|
2086
|
-
"amount": {
|
|
2087
|
-
"from": "instance",
|
|
2088
|
-
"path": "refs.unwindRefund"
|
|
2089
|
-
},
|
|
2090
|
-
"currency": {
|
|
2091
|
-
"from": "instance",
|
|
2092
|
-
"path": "fields.currency"
|
|
2093
|
-
},
|
|
2094
|
-
"destinationAccountId": {
|
|
2095
|
-
"from": "instance",
|
|
2096
|
-
"path": "fields.policyholderAccountId"
|
|
2097
|
-
},
|
|
2098
|
-
"productId": {
|
|
2099
|
-
"from": "instance",
|
|
2100
|
-
"path": "productId"
|
|
2101
|
-
},
|
|
2102
|
-
"sourceAccountId": {
|
|
2103
|
-
"from": "instance",
|
|
2104
|
-
"path": "refs.premiumReserveAccountId"
|
|
2105
|
-
}
|
|
2106
|
-
},
|
|
2107
|
-
"capture": {
|
|
2108
|
-
"premiumRefundTransferId": "transferId"
|
|
2109
|
-
},
|
|
2110
|
-
"key": "transfer",
|
|
2111
|
-
"operation": "internal_transfer.create"
|
|
2112
|
-
}
|
|
2113
|
-
],
|
|
2114
|
-
"steps": [],
|
|
2115
|
-
"summary": "Cancel a policy"
|
|
2116
|
-
},
|
|
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.",
|
|
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
|
-
},
|
|
2128
|
-
"eventName": "policy.quoted",
|
|
2129
|
-
"examples": [
|
|
2130
|
-
{
|
|
2131
|
-
"input": {
|
|
2132
|
-
"coverageLimit": "200000",
|
|
2133
|
-
"currency": "SAR",
|
|
2134
|
-
"expiresAt": "2027-08-01T00:00:00.000Z",
|
|
2135
|
-
"insurerAccountId": "acct_sandbox_insurer0001",
|
|
2136
|
-
"perilSchedule": [
|
|
2137
|
-
{
|
|
2138
|
-
"deductibleBps": 500,
|
|
2139
|
-
"limitAmount": "200000",
|
|
2140
|
-
"peril": "accidental_damage",
|
|
2141
|
-
"waitingPeriodDays": 0
|
|
2142
|
-
},
|
|
2143
|
-
{
|
|
2144
|
-
"deductibleBps": 250,
|
|
2145
|
-
"limitAmount": "200000",
|
|
2146
|
-
"peril": "theft",
|
|
2147
|
-
"waitingPeriodDays": 7
|
|
2148
|
-
}
|
|
2149
|
-
],
|
|
2150
|
-
"policyholderAccountId": "acct_sandbox_holder00001",
|
|
2151
|
-
"premiumAmount": "12500",
|
|
2152
|
-
"productId": "prd_sandbox_protection01",
|
|
2153
|
-
"startsAt": "2026-08-01T00:00:00.000Z",
|
|
2154
|
-
"subject": "sbj_sandbox_protection001",
|
|
2155
|
-
"tenantId": "ten_sandbox_protection01",
|
|
2156
|
-
"termsSummary": "Annual cover for accidental damage and theft."
|
|
2157
|
-
},
|
|
2158
|
-
"name": "quote_asset_protection"
|
|
2159
|
-
}
|
|
2160
|
-
],
|
|
2161
|
-
"moves": [],
|
|
2162
|
-
"requiresRefs": [
|
|
2163
|
-
{
|
|
2164
|
-
"field": "renewalOfPolicyId",
|
|
2165
|
-
"optional": true,
|
|
2166
|
-
"statuses": [
|
|
2167
|
-
"active",
|
|
2168
|
-
"expired"
|
|
2169
|
-
]
|
|
2170
|
-
}
|
|
2171
|
-
],
|
|
2172
|
-
"steps": [
|
|
2173
|
-
{
|
|
2174
|
-
"bind": {
|
|
2175
|
-
"currency": {
|
|
2176
|
-
"from": "instance",
|
|
2177
|
-
"path": "fields.currency"
|
|
2178
|
-
},
|
|
2179
|
-
"owner.id": {
|
|
2180
|
-
"from": "instance",
|
|
2181
|
-
"path": "productId"
|
|
2182
|
-
},
|
|
2183
|
-
"owner.type": {
|
|
2184
|
-
"from": "const",
|
|
2185
|
-
"value": "product"
|
|
2186
|
-
},
|
|
2187
|
-
"productId": {
|
|
2188
|
-
"from": "instance",
|
|
2189
|
-
"path": "productId"
|
|
2190
|
-
},
|
|
2191
|
-
"role": {
|
|
2192
|
-
"from": "const",
|
|
2193
|
-
"value": "product_escrow"
|
|
2194
|
-
}
|
|
2195
|
-
},
|
|
2196
|
-
"capture": {
|
|
2197
|
-
"premiumReserveAccountId": "accountId"
|
|
2198
|
-
},
|
|
2199
|
-
"operation": "account.escrow.provision"
|
|
2200
|
-
}
|
|
2201
|
-
],
|
|
2202
|
-
"summary": "Quote a policy"
|
|
2203
|
-
},
|
|
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.",
|
|
2206
|
-
"decision": {
|
|
2207
|
-
"capability": "insurance_carrier",
|
|
2208
|
-
"deadlineMs": 15000,
|
|
2209
|
-
"onTimeout": "decline"
|
|
2210
|
-
},
|
|
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
|
-
},
|
|
2220
|
-
"examples": [
|
|
2221
|
-
{
|
|
2222
|
-
"input": {
|
|
2223
|
-
"expiresAt": "2027-11-01T00:00:00.000Z",
|
|
2224
|
-
"policyId": "pol_sandbox_protection001",
|
|
2225
|
-
"tenantId": "ten_sandbox_protection01",
|
|
2226
|
-
"termsSummary": "Extended cover incl. water damage."
|
|
2227
|
-
},
|
|
2228
|
-
"name": "endorse_extend_active_cover"
|
|
2229
|
-
}
|
|
2230
|
-
],
|
|
2231
|
-
"input": {
|
|
2232
|
-
"additionalProperties": false,
|
|
2233
|
-
"properties": {
|
|
2234
|
-
"expiresAt": {
|
|
2235
|
-
"format": "hyperscale-date-time",
|
|
2236
|
-
"type": "string"
|
|
2237
|
-
},
|
|
2238
|
-
"perilSchedule": {
|
|
2239
|
-
"items": {
|
|
2240
|
-
"additionalProperties": false,
|
|
2241
|
-
"properties": {
|
|
2242
|
-
"deductibleBps": {
|
|
2243
|
-
"maximum": 10000,
|
|
2244
|
-
"minimum": 0,
|
|
2245
|
-
"type": "integer"
|
|
2246
|
-
},
|
|
2247
|
-
"limitAmount": {
|
|
2248
|
-
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
2249
|
-
"pattern": "^[1-9][0-9]{0,17}$",
|
|
2250
|
-
"type": "string"
|
|
2251
|
-
},
|
|
2252
|
-
"peril": {
|
|
2253
|
-
"pattern": "^[a-z][a-z0-9_]{1,79}$",
|
|
2254
|
-
"type": "string"
|
|
2255
|
-
},
|
|
2256
|
-
"waitingPeriodDays": {
|
|
2257
|
-
"maximum": 3650,
|
|
2258
|
-
"minimum": 0,
|
|
2259
|
-
"type": "integer"
|
|
2260
|
-
}
|
|
2261
|
-
},
|
|
2262
|
-
"required": [
|
|
2263
|
-
"peril",
|
|
2264
|
-
"limitAmount",
|
|
2265
|
-
"deductibleBps",
|
|
2266
|
-
"waitingPeriodDays"
|
|
2267
|
-
],
|
|
2268
|
-
"type": "object"
|
|
2269
|
-
},
|
|
2270
|
-
"maxItems": 24,
|
|
2271
|
-
"minItems": 1,
|
|
2272
|
-
"type": "array"
|
|
2273
|
-
},
|
|
2274
|
-
"termsSummary": {
|
|
2275
|
-
"maxLength": 1000,
|
|
2276
|
-
"minLength": 1,
|
|
2277
|
-
"type": "string"
|
|
2278
|
-
}
|
|
2279
|
-
},
|
|
2280
|
-
"type": "object"
|
|
2281
|
-
},
|
|
2282
|
-
"moves": [],
|
|
2283
|
-
"steps": [],
|
|
2284
|
-
"summary": "Endorse a policy",
|
|
2285
|
-
"updates": [
|
|
2286
|
-
"perilSchedule",
|
|
2287
|
-
"termsSummary",
|
|
2288
|
-
"expiresAt"
|
|
2289
|
-
]
|
|
2290
|
-
},
|
|
2291
|
-
"expire": {
|
|
2292
|
-
"description": "Ends active cover at term under the machine principal. Earned premium remains with the insurer.",
|
|
2293
|
-
"due": {
|
|
2294
|
-
"field": "expiresAt"
|
|
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
|
-
],
|
|
2313
|
-
"moves": [],
|
|
2314
|
-
"requiresDrainedAccount": {
|
|
2315
|
-
"path": "refs.premiumReserveAccountId"
|
|
2316
|
-
},
|
|
2317
|
-
"steps": [],
|
|
2318
|
-
"summary": "Expire a policy"
|
|
2319
|
-
},
|
|
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.",
|
|
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
|
-
],
|
|
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
|
-
},
|
|
2365
|
-
"steps": [],
|
|
2366
|
-
"summary": "Preview policy cancellation"
|
|
2367
|
-
},
|
|
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.",
|
|
2370
|
-
"description": "Closes an unbound quote. No premium moved, so no cancellation preview is required.",
|
|
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
|
-
],
|
|
2381
|
-
"moves": [],
|
|
2382
|
-
"requiresDrainedAccount": {
|
|
2383
|
-
"path": "refs.premiumReserveAccountId"
|
|
2384
|
-
},
|
|
2385
|
-
"steps": [],
|
|
2386
|
-
"summary": "Withdraw a policy quote"
|
|
2387
|
-
}
|
|
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.",
|
|
2409
|
-
"fields": {
|
|
2410
|
-
"coverageLimit": {
|
|
2411
|
-
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
2412
|
-
"pattern": "^[1-9][0-9]{0,17}$",
|
|
2413
|
-
"type": "string"
|
|
2414
|
-
},
|
|
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": {
|
|
2427
|
-
"description": "Hyperscale account ID",
|
|
2428
|
-
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
2429
|
-
"type": "string",
|
|
2430
|
-
"x-hyperscale-reference-filter": {
|
|
2431
|
-
"column": "role",
|
|
2432
|
-
"values": [
|
|
2433
|
-
"customer_balance"
|
|
2434
|
-
]
|
|
2435
|
-
}
|
|
2436
|
-
},
|
|
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"
|
|
2472
|
-
},
|
|
2473
|
-
"policyholderAccountId": {
|
|
2474
|
-
"description": "Hyperscale account ID",
|
|
2475
|
-
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
2476
|
-
"type": "string",
|
|
2477
|
-
"x-hyperscale-reference-filter": {
|
|
2478
|
-
"column": "role",
|
|
2479
|
-
"values": [
|
|
2480
|
-
"customer_balance"
|
|
2481
|
-
]
|
|
2482
|
-
}
|
|
2483
|
-
},
|
|
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}$",
|
|
2487
|
-
"type": "string"
|
|
2488
|
-
},
|
|
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}$",
|
|
2492
|
-
"type": "string"
|
|
2493
|
-
},
|
|
2494
|
-
"startsAt": {
|
|
2495
|
-
"format": "hyperscale-date-time",
|
|
2496
|
-
"type": "string"
|
|
2497
|
-
},
|
|
2498
|
-
"termsSummary": {
|
|
2499
|
-
"maxLength": 1000,
|
|
2500
|
-
"minLength": 1,
|
|
2501
|
-
"type": "string"
|
|
2502
|
-
}
|
|
2503
|
-
},
|
|
2504
|
-
"id": "policy",
|
|
2505
|
-
"idPrefix": "pol",
|
|
2506
|
-
"lifecycle": {
|
|
2507
|
-
"initial": "quoted",
|
|
2508
|
-
"states": [
|
|
2509
|
-
"quoted",
|
|
2510
|
-
"bound",
|
|
2511
|
-
"active",
|
|
2512
|
-
"cancel_quoted",
|
|
2513
|
-
"canceled",
|
|
2514
|
-
"expired"
|
|
2515
|
-
],
|
|
2516
|
-
"transitions": {
|
|
2517
|
-
"activate": {
|
|
2518
|
-
"from": [
|
|
2519
|
-
"bound"
|
|
2520
|
-
],
|
|
2521
|
-
"to": "active"
|
|
2522
|
-
},
|
|
2523
|
-
"bind": {
|
|
2524
|
-
"from": [
|
|
2525
|
-
"quoted"
|
|
2526
|
-
],
|
|
2527
|
-
"to": "bound"
|
|
2528
|
-
},
|
|
2529
|
-
"cancel": {
|
|
2530
|
-
"from": [
|
|
2531
|
-
"cancel_quoted"
|
|
2532
|
-
],
|
|
2533
|
-
"to": "canceled"
|
|
2534
|
-
},
|
|
2535
|
-
"endorse": {
|
|
2536
|
-
"from": [
|
|
2537
|
-
"active"
|
|
2538
|
-
],
|
|
2539
|
-
"to": "active"
|
|
2540
|
-
},
|
|
2541
|
-
"expire": {
|
|
2542
|
-
"from": [
|
|
2543
|
-
"active"
|
|
2544
|
-
],
|
|
2545
|
-
"to": "expired"
|
|
2546
|
-
},
|
|
2547
|
-
"preview": {
|
|
2548
|
-
"from": [
|
|
2549
|
-
"bound"
|
|
2550
|
-
],
|
|
2551
|
-
"to": "cancel_quoted"
|
|
2552
|
-
},
|
|
2553
|
-
"withdraw": {
|
|
2554
|
-
"from": [
|
|
2555
|
-
"quoted"
|
|
2556
|
-
],
|
|
2557
|
-
"to": "canceled"
|
|
2558
|
-
}
|
|
2559
|
-
}
|
|
2560
|
-
},
|
|
2561
|
-
"nav": [
|
|
2562
|
-
"Blueprints",
|
|
2563
|
-
"Policies"
|
|
2564
|
-
],
|
|
2565
|
-
"parties": {
|
|
2566
|
-
"beneficiary": "insurerAccountId",
|
|
2567
|
-
"payer": "policyholderAccountId"
|
|
2568
|
-
},
|
|
2569
|
-
"required": [
|
|
2570
|
-
"policyholderAccountId",
|
|
2571
|
-
"insurerAccountId",
|
|
2572
|
-
"premiumAmount",
|
|
2573
|
-
"coverageLimit",
|
|
2574
|
-
"currency",
|
|
2575
|
-
"startsAt",
|
|
2576
|
-
"expiresAt",
|
|
2577
|
-
"perilSchedule"
|
|
2578
|
-
],
|
|
2579
|
-
"subject": {
|
|
2580
|
-
"kinds": [
|
|
2581
|
-
"policy_risk",
|
|
2582
|
-
"flight_itinerary",
|
|
2583
|
-
"lodging_stay",
|
|
2584
|
-
"vehicle",
|
|
2585
|
-
"merchandise",
|
|
2586
|
-
"pet",
|
|
2587
|
-
"traveler_party",
|
|
2588
|
-
"employee_census"
|
|
2589
|
-
]
|
|
2590
|
-
},
|
|
2591
|
-
"summary": "Carrier-backed protection over one declared-value subject.",
|
|
2592
|
-
"templateId": "insurance",
|
|
2593
|
-
"title": "Policy",
|
|
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
|
-
],
|
|
2619
|
-
"fields": [
|
|
2620
|
-
"startsAt",
|
|
2621
|
-
"expiresAt",
|
|
2622
|
-
"perilSchedule",
|
|
2623
|
-
"termsSummary"
|
|
2624
|
-
],
|
|
2625
|
-
"states": [
|
|
2626
|
-
"quoted"
|
|
2627
|
-
]
|
|
2628
|
-
}
|
|
2629
|
-
},
|
|
2630
|
-
{
|
|
2631
|
-
"actionOrder": [
|
|
2632
|
-
"create",
|
|
2633
|
-
"assess",
|
|
2634
|
-
"approve",
|
|
2635
|
-
"attest",
|
|
2636
|
-
"pay",
|
|
2637
|
-
"deny",
|
|
2638
|
-
"reverse"
|
|
2639
|
-
],
|
|
2640
|
-
"actions": {
|
|
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.",
|
|
2643
|
-
"decision": {
|
|
2644
|
-
"capability": "insurance_claims_adjuster",
|
|
2645
|
-
"deadlineMs": 15000,
|
|
2646
|
-
"onTimeout": "decline"
|
|
2647
|
-
},
|
|
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
|
-
],
|
|
2678
|
-
"moves": [
|
|
2679
|
-
{
|
|
2680
|
-
"bind": {
|
|
2681
|
-
"amount": {
|
|
2682
|
-
"from": "instance",
|
|
2683
|
-
"path": "fields.claimAmount"
|
|
2684
|
-
},
|
|
2685
|
-
"currency": {
|
|
2686
|
-
"from": "instance",
|
|
2687
|
-
"path": "fields.currency"
|
|
2688
|
-
},
|
|
2689
|
-
"destinationAccountId": {
|
|
2690
|
-
"from": "instance",
|
|
2691
|
-
"path": "fields.claimantAccountId"
|
|
2692
|
-
},
|
|
2693
|
-
"sourceAccountId": {
|
|
2694
|
-
"from": "instance",
|
|
2695
|
-
"path": "fields.insurerAccountId"
|
|
2696
|
-
}
|
|
2697
|
-
},
|
|
2698
|
-
"capture": {
|
|
2699
|
-
"claimTransferId": "transferId"
|
|
2700
|
-
},
|
|
2701
|
-
"key": "transfer",
|
|
2702
|
-
"operation": "internal_transfer.reserve"
|
|
2703
|
-
}
|
|
2704
|
-
],
|
|
2705
|
-
"steps": [],
|
|
2706
|
-
"summary": "Approve a claim"
|
|
2707
|
-
},
|
|
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.",
|
|
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
|
-
],
|
|
2720
|
-
"moves": [],
|
|
2721
|
-
"steps": [],
|
|
2722
|
-
"summary": "Assess a claim"
|
|
2723
|
-
},
|
|
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.",
|
|
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
|
-
],
|
|
2757
|
-
"moves": [
|
|
2758
|
-
{
|
|
2759
|
-
"bind": {
|
|
2760
|
-
"amount": {
|
|
2761
|
-
"from": "instance",
|
|
2762
|
-
"path": "fields.claimAmount"
|
|
2763
|
-
},
|
|
2764
|
-
"currency": {
|
|
2765
|
-
"from": "instance",
|
|
2766
|
-
"path": "fields.currency"
|
|
2767
|
-
},
|
|
2768
|
-
"destinationAccountId": {
|
|
2769
|
-
"from": "instance",
|
|
2770
|
-
"path": "fields.claimantAccountId"
|
|
2771
|
-
},
|
|
2772
|
-
"sourceAccountId": {
|
|
2773
|
-
"from": "instance",
|
|
2774
|
-
"path": "fields.insurerAccountId"
|
|
2775
|
-
}
|
|
2776
|
-
},
|
|
2777
|
-
"capture": {
|
|
2778
|
-
"claimTransferId": "transferId"
|
|
2779
|
-
},
|
|
2780
|
-
"key": "transfer",
|
|
2781
|
-
"operation": "internal_transfer.reserve"
|
|
2782
|
-
}
|
|
2783
|
-
],
|
|
2784
|
-
"port": {
|
|
2785
|
-
"allowedParties": [
|
|
2786
|
-
"payer"
|
|
2787
|
-
]
|
|
2788
|
-
},
|
|
2789
|
-
"steps": [],
|
|
2790
|
-
"summary": "Attest an out-of-band claim approval"
|
|
2791
|
-
},
|
|
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.",
|
|
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
|
-
},
|
|
2803
|
-
"eventName": "claim.filed",
|
|
2804
|
-
"examples": [
|
|
2805
|
-
{
|
|
2806
|
-
"input": {
|
|
2807
|
-
"claimAmount": "75000",
|
|
2808
|
-
"claimantAccountId": "acct_sandbox_holder00001",
|
|
2809
|
-
"currency": "SAR",
|
|
2810
|
-
"evidenceSummary": "Covered equipment was damaged in an accidental fall.",
|
|
2811
|
-
"insurerAccountId": "acct_sandbox_insurer0001",
|
|
2812
|
-
"occurredAt": "2026-10-14T11:30:00.000Z",
|
|
2813
|
-
"peril": "accidental_damage",
|
|
2814
|
-
"policyId": "pol_sandbox_protection001",
|
|
2815
|
-
"productId": "prd_sandbox_protection01",
|
|
2816
|
-
"subject": "sbj_sandbox_protection001",
|
|
2817
|
-
"tenantId": "ten_sandbox_protection01"
|
|
2818
|
-
},
|
|
2819
|
-
"name": "file_accidental_damage_claim"
|
|
2820
|
-
}
|
|
2821
|
-
],
|
|
2822
|
-
"moves": [],
|
|
2823
|
-
"requiresRefs": [
|
|
2824
|
-
{
|
|
2825
|
-
"field": "policyId",
|
|
2826
|
-
"statuses": [
|
|
2827
|
-
"active"
|
|
2828
|
-
]
|
|
2829
|
-
}
|
|
2830
|
-
],
|
|
2831
|
-
"steps": [],
|
|
2832
|
-
"summary": "File a claim"
|
|
2833
|
-
},
|
|
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.",
|
|
2836
|
-
"description": "Closes a filed or assessed demand before any payout hold exists.",
|
|
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
|
-
],
|
|
2847
|
-
"moves": [],
|
|
2848
|
-
"steps": [],
|
|
2849
|
-
"summary": "Deny a claim"
|
|
2850
|
-
},
|
|
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.",
|
|
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
|
-
},
|
|
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
|
-
],
|
|
2872
|
-
"moves": [
|
|
2873
|
-
{
|
|
2874
|
-
"bind": {
|
|
2875
|
-
"transferId": {
|
|
2876
|
-
"from": "instance",
|
|
2877
|
-
"path": "refs.claimTransferId"
|
|
2878
|
-
}
|
|
2879
|
-
},
|
|
2880
|
-
"key": "transfer",
|
|
2881
|
-
"operation": "internal_transfer.post"
|
|
2882
|
-
}
|
|
2883
|
-
],
|
|
2884
|
-
"steps": [],
|
|
2885
|
-
"summary": "Pay a claim"
|
|
2886
|
-
},
|
|
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.",
|
|
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
|
-
],
|
|
2907
|
-
"moves": [
|
|
2908
|
-
{
|
|
2909
|
-
"bind": {
|
|
2910
|
-
"reason": {
|
|
2911
|
-
"from": "const",
|
|
2912
|
-
"value": "Claim approval reversed"
|
|
2913
|
-
},
|
|
2914
|
-
"transferId": {
|
|
2915
|
-
"from": "instance",
|
|
2916
|
-
"path": "refs.claimTransferId"
|
|
2917
|
-
}
|
|
2918
|
-
},
|
|
2919
|
-
"key": "transfer",
|
|
2920
|
-
"operation": "internal_transfer.void"
|
|
2921
|
-
}
|
|
2922
|
-
],
|
|
2923
|
-
"steps": [],
|
|
2924
|
-
"summary": "Reverse claim approval"
|
|
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
|
-
]
|
|
3099
|
-
}
|
|
3100
|
-
}
|
|
3101
|
-
],
|
|
3102
|
-
"product": "insured_travel",
|
|
3103
|
-
"subjects": [
|
|
3104
|
-
{
|
|
3105
|
-
"declaredValue": "required",
|
|
3106
|
-
"kind": "vehicle",
|
|
3107
|
-
"schema": {
|
|
3108
|
-
"additionalProperties": false,
|
|
3109
|
-
"properties": {
|
|
3110
|
-
"make": {
|
|
3111
|
-
"maxLength": 60,
|
|
3112
|
-
"minLength": 1,
|
|
3113
|
-
"type": "string"
|
|
3114
|
-
},
|
|
3115
|
-
"mileageKm": {
|
|
3116
|
-
"maximum": 9007199254740991,
|
|
3117
|
-
"minimum": 0,
|
|
3118
|
-
"type": "integer"
|
|
3119
|
-
},
|
|
3120
|
-
"model": {
|
|
3121
|
-
"maxLength": 60,
|
|
3122
|
-
"minLength": 1,
|
|
3123
|
-
"type": "string"
|
|
3124
|
-
},
|
|
3125
|
-
"vin": {
|
|
3126
|
-
"maxLength": 17,
|
|
3127
|
-
"minLength": 11,
|
|
3128
|
-
"type": "string"
|
|
3129
|
-
},
|
|
3130
|
-
"year": {
|
|
3131
|
-
"pattern": "^\\d{4}$",
|
|
3132
|
-
"type": "string"
|
|
3133
|
-
}
|
|
3134
|
-
},
|
|
3135
|
-
"required": [
|
|
3136
|
-
"vin",
|
|
3137
|
-
"make",
|
|
3138
|
-
"model",
|
|
3139
|
-
"year",
|
|
3140
|
-
"mileageKm"
|
|
3141
|
-
],
|
|
3142
|
-
"type": "object"
|
|
3143
|
-
},
|
|
3144
|
-
"title": "Vehicle",
|
|
3145
|
-
"version": 1
|
|
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
|
-
},
|
|
3197
|
-
{
|
|
3198
|
-
"declaredValue": "required",
|
|
3199
|
-
"kind": "policy_risk",
|
|
3200
|
-
"schema": {
|
|
3201
|
-
"additionalProperties": false,
|
|
3202
|
-
"properties": {
|
|
3203
|
-
"category": {
|
|
3204
|
-
"pattern": "^[a-z][a-z0-9_]{1,79}$",
|
|
3205
|
-
"type": "string"
|
|
3206
|
-
},
|
|
3207
|
-
"description": {
|
|
3208
|
-
"maxLength": 500,
|
|
3209
|
-
"minLength": 1,
|
|
3210
|
-
"type": "string"
|
|
3211
|
-
},
|
|
3212
|
-
"jurisdiction": {
|
|
3213
|
-
"maxLength": 80,
|
|
3214
|
-
"minLength": 2,
|
|
3215
|
-
"type": "string"
|
|
3216
|
-
},
|
|
3217
|
-
"reference": {
|
|
3218
|
-
"maxLength": 120,
|
|
3219
|
-
"minLength": 1,
|
|
3220
|
-
"type": "string"
|
|
3221
|
-
}
|
|
3222
|
-
},
|
|
3223
|
-
"required": [
|
|
3224
|
-
"category",
|
|
3225
|
-
"description",
|
|
3226
|
-
"jurisdiction"
|
|
3227
|
-
],
|
|
3228
|
-
"type": "object"
|
|
3229
|
-
},
|
|
3230
|
-
"title": "Policy risk",
|
|
3231
|
-
"version": 1
|
|
3232
|
-
},
|
|
3233
|
-
{
|
|
3234
|
-
"declaredValue": "required",
|
|
3235
|
-
"kind": "flight_itinerary",
|
|
3236
|
-
"schema": {
|
|
3237
|
-
"additionalProperties": false,
|
|
3238
|
-
"properties": {
|
|
3239
|
-
"cabin": {
|
|
3240
|
-
"enum": [
|
|
3241
|
-
"economy",
|
|
3242
|
-
"premium_economy",
|
|
3243
|
-
"business",
|
|
3244
|
-
"first"
|
|
3245
|
-
],
|
|
3246
|
-
"type": "string"
|
|
3247
|
-
},
|
|
3248
|
-
"carrierName": {
|
|
3249
|
-
"maxLength": 80,
|
|
3250
|
-
"minLength": 1,
|
|
3251
|
-
"type": "string"
|
|
3252
|
-
},
|
|
3253
|
-
"destination": {
|
|
3254
|
-
"pattern": "^[A-Z]{3}$",
|
|
3255
|
-
"type": "string"
|
|
3256
|
-
},
|
|
3257
|
-
"flightNumber": {
|
|
3258
|
-
"maxLength": 8,
|
|
3259
|
-
"minLength": 2,
|
|
3260
|
-
"type": "string"
|
|
3261
|
-
},
|
|
3262
|
-
"origin": {
|
|
3263
|
-
"pattern": "^[A-Z]{3}$",
|
|
3264
|
-
"type": "string"
|
|
3265
|
-
}
|
|
3266
|
-
},
|
|
3267
|
-
"required": [
|
|
3268
|
-
"carrierName",
|
|
3269
|
-
"flightNumber",
|
|
3270
|
-
"origin",
|
|
3271
|
-
"destination",
|
|
3272
|
-
"cabin"
|
|
3273
|
-
],
|
|
3274
|
-
"type": "object"
|
|
3275
|
-
},
|
|
3276
|
-
"title": "Flight itinerary",
|
|
3277
|
-
"version": 1
|
|
3278
|
-
},
|
|
3279
|
-
{
|
|
3280
|
-
"declaredValue": "required",
|
|
3281
|
-
"kind": "lodging_stay",
|
|
3282
|
-
"schema": {
|
|
3283
|
-
"additionalProperties": false,
|
|
3284
|
-
"properties": {
|
|
3285
|
-
"city": {
|
|
3286
|
-
"maxLength": 80,
|
|
3287
|
-
"minLength": 1,
|
|
3288
|
-
"type": "string"
|
|
3289
|
-
},
|
|
3290
|
-
"propertyName": {
|
|
3291
|
-
"maxLength": 120,
|
|
3292
|
-
"minLength": 1,
|
|
3293
|
-
"type": "string"
|
|
3294
|
-
},
|
|
3295
|
-
"roomType": {
|
|
3296
|
-
"maxLength": 60,
|
|
3297
|
-
"minLength": 1,
|
|
3298
|
-
"type": "string"
|
|
3299
|
-
}
|
|
3300
|
-
},
|
|
3301
|
-
"required": [
|
|
3302
|
-
"propertyName",
|
|
3303
|
-
"city",
|
|
3304
|
-
"roomType"
|
|
3305
|
-
],
|
|
3306
|
-
"type": "object"
|
|
3307
|
-
},
|
|
3308
|
-
"title": "Lodging stay",
|
|
3309
|
-
"version": 1
|
|
3310
|
-
},
|
|
3311
|
-
{
|
|
3312
|
-
"declaredValue": "required",
|
|
3313
|
-
"kind": "pet",
|
|
3314
|
-
"schema": {
|
|
3315
|
-
"additionalProperties": false,
|
|
3316
|
-
"properties": {
|
|
3317
|
-
"ageYears": {
|
|
3318
|
-
"maximum": 30,
|
|
3319
|
-
"minimum": 0,
|
|
3320
|
-
"type": "integer"
|
|
3321
|
-
},
|
|
3322
|
-
"breed": {
|
|
3323
|
-
"maxLength": 80,
|
|
3324
|
-
"minLength": 1,
|
|
3325
|
-
"type": "string"
|
|
3326
|
-
},
|
|
3327
|
-
"gender": {
|
|
3328
|
-
"enum": [
|
|
3329
|
-
"female",
|
|
3330
|
-
"male"
|
|
3331
|
-
],
|
|
3332
|
-
"type": "string"
|
|
3333
|
-
},
|
|
3334
|
-
"lastCheckupAt": {
|
|
3335
|
-
"format": "hyperscale-date",
|
|
3336
|
-
"type": "string"
|
|
3337
|
-
},
|
|
3338
|
-
"microchipNumber": {
|
|
3339
|
-
"maxLength": 40,
|
|
3340
|
-
"minLength": 1,
|
|
3341
|
-
"type": "string"
|
|
3342
|
-
},
|
|
3343
|
-
"name": {
|
|
3344
|
-
"maxLength": 80,
|
|
3345
|
-
"minLength": 1,
|
|
3346
|
-
"type": "string"
|
|
3347
|
-
},
|
|
3348
|
-
"neutered": {
|
|
3349
|
-
"type": "boolean"
|
|
3350
|
-
},
|
|
3351
|
-
"species": {
|
|
3352
|
-
"enum": [
|
|
3353
|
-
"cat",
|
|
3354
|
-
"dog"
|
|
3355
|
-
],
|
|
3356
|
-
"type": "string"
|
|
3357
|
-
}
|
|
3358
|
-
},
|
|
3359
|
-
"required": [
|
|
3360
|
-
"species",
|
|
3361
|
-
"breed",
|
|
3362
|
-
"ageYears",
|
|
3363
|
-
"gender"
|
|
3364
|
-
],
|
|
3365
|
-
"type": "object"
|
|
3366
|
-
},
|
|
3367
|
-
"title": "Pet",
|
|
3368
|
-
"version": 1
|
|
3369
|
-
},
|
|
3370
|
-
{
|
|
3371
|
-
"declaredValue": "required",
|
|
3372
|
-
"kind": "traveler_party",
|
|
3373
|
-
"schema": {
|
|
3374
|
-
"additionalProperties": false,
|
|
3375
|
-
"properties": {
|
|
3376
|
-
"destinationRegion": {
|
|
3377
|
-
"maxLength": 80,
|
|
3378
|
-
"minLength": 2,
|
|
3379
|
-
"type": "string"
|
|
3380
|
-
},
|
|
3381
|
-
"originCountry": {
|
|
3382
|
-
"pattern": "^[A-Z]{2}$",
|
|
3383
|
-
"type": "string"
|
|
3384
|
-
},
|
|
3385
|
-
"travelers": {
|
|
3386
|
-
"items": {
|
|
3387
|
-
"additionalProperties": false,
|
|
3388
|
-
"properties": {
|
|
3389
|
-
"role": {
|
|
3390
|
-
"enum": [
|
|
3391
|
-
"self",
|
|
3392
|
-
"spouse",
|
|
3393
|
-
"child"
|
|
3394
|
-
],
|
|
3395
|
-
"type": "string"
|
|
3396
|
-
},
|
|
3397
|
-
"yearOfBirth": {
|
|
3398
|
-
"maximum": 2030,
|
|
3399
|
-
"minimum": 1900,
|
|
3400
|
-
"type": "integer"
|
|
3401
|
-
}
|
|
3402
|
-
},
|
|
3403
|
-
"required": [
|
|
3404
|
-
"role",
|
|
3405
|
-
"yearOfBirth"
|
|
3406
|
-
],
|
|
3407
|
-
"type": "object"
|
|
3408
|
-
},
|
|
3409
|
-
"maxItems": 20,
|
|
3410
|
-
"minItems": 1,
|
|
3411
|
-
"type": "array"
|
|
3412
|
-
}
|
|
3413
|
-
},
|
|
3414
|
-
"required": [
|
|
3415
|
-
"travelers",
|
|
3416
|
-
"destinationRegion"
|
|
3417
|
-
],
|
|
3418
|
-
"type": "object"
|
|
3419
|
-
},
|
|
3420
|
-
"title": "Traveler party",
|
|
3421
|
-
"version": 1
|
|
3422
|
-
},
|
|
3423
|
-
{
|
|
3424
|
-
"declaredValue": "required",
|
|
3425
|
-
"kind": "employee_census",
|
|
3426
|
-
"schema": {
|
|
3427
|
-
"additionalProperties": false,
|
|
3428
|
-
"properties": {
|
|
3429
|
-
"dependentCount": {
|
|
3430
|
-
"maximum": 50000,
|
|
3431
|
-
"minimum": 0,
|
|
3432
|
-
"type": "integer"
|
|
3433
|
-
},
|
|
3434
|
-
"entityReference": {
|
|
3435
|
-
"maxLength": 120,
|
|
3436
|
-
"minLength": 1,
|
|
3437
|
-
"type": "string"
|
|
3438
|
-
},
|
|
3439
|
-
"insuranceClasses": {
|
|
3440
|
-
"items": {
|
|
3441
|
-
"maxLength": 60,
|
|
3442
|
-
"minLength": 1,
|
|
3443
|
-
"type": "string"
|
|
3444
|
-
},
|
|
3445
|
-
"maxItems": 12,
|
|
3446
|
-
"minItems": 1,
|
|
3447
|
-
"type": "array"
|
|
3448
|
-
},
|
|
3449
|
-
"primaryCount": {
|
|
3450
|
-
"maximum": 10000,
|
|
3451
|
-
"minimum": 1,
|
|
3452
|
-
"type": "integer"
|
|
3453
|
-
}
|
|
3454
|
-
},
|
|
3455
|
-
"required": [
|
|
3456
|
-
"entityReference",
|
|
3457
|
-
"primaryCount",
|
|
3458
|
-
"dependentCount"
|
|
3459
|
-
],
|
|
3460
|
-
"type": "object"
|
|
3461
|
-
},
|
|
3462
|
-
"title": "Employee census",
|
|
3463
|
-
"version": 1
|
|
3464
|
-
}
|
|
3465
|
-
],
|
|
3466
|
-
"title": "Insured travel",
|
|
3467
|
-
"udl": 1,
|
|
3468
|
-
"version": 1
|
|
3469
|
-
}
|